diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 845b8ab35..a7b624a29 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -4,7 +4,6 @@ about: Create a report to help us improve title: '' labels: bug assignees: '' - --- **Describe the bug** @@ -12,6 +11,7 @@ A clear and concise description of what the bug is. **To Reproduce** Steps to reproduce the behavior: + 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' @@ -23,10 +23,15 @@ A clear and concise description of what you expected to happen. **Screenshots** If applicable, add screenshots to help explain your problem. -**Desktop (please complete the following information):** - - OS: [e.g. Windows] - - Lazygit Version [e.g. v0.1.45] - - The last commit id if you built project from sources (run : ```git rev-parse HEAD```) +**Version info:** +_Run `lazygit --version` and paste the result here_ +_Run `git --version` and paste the result here_ **Additional context** Add any other context about the problem here. + +**Note:** please try updating to the latest version or [manually building](https://github.com/jesseduffield/lazygit/#manual) the latest `master` to see if the issue still occurs. + + diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 11fc491ef..96c9b7068 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -4,7 +4,6 @@ about: Suggest an idea for this project title: '' labels: enhancement assignees: '' - --- **Is your feature request related to a problem? Please describe.** @@ -18,3 +17,13 @@ A clear and concise description of any alternative solutions or features you've **Additional context** Add any other context or screenshots about the feature request here. + + diff --git a/.github/workflows/automerge.yml b/.github/workflows/automerge.yml deleted file mode 100644 index 4eaff9686..000000000 --- a/.github/workflows/automerge.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: automerge -on: - pull_request: - types: - - labeled - - unlabeled - - synchronize - - opened - - edited - - ready_for_review - - reopened - - unlocked - pull_request_review: - types: - - submitted - check_suite: - types: - - completed - status: {} -jobs: - automerge: - runs-on: ubuntu-latest - steps: - - name: automerge - uses: "pascalgn/automerge-action@135f0bdb927d9807b5446f7ca9ecc2c51de03c4a" - env: - GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" - MERGE_METHOD: rebase \ No newline at end of file diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index a07cf1154..49fad7731 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -16,13 +16,13 @@ jobs: - name: Setup Go uses: actions/setup-go@v1 with: - go-version: 1.16.x + go-version: 1.18.x - name: Run goreleaser uses: goreleaser/goreleaser-action@v1 env: GITHUB_TOKEN: ${{secrets.GITHUB_API_TOKEN}} homebrew: - runs-on: macos-latest + runs-on: ubuntu-latest steps: - name: Bump Homebrew formula uses: dawidd6/action-homebrew-bump-formula@v3 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2176fef97..b175b02f2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,5 +1,8 @@ name: Continuous Integration +env: + GO_VERSION: 1.18 + on: push: branches: @@ -7,13 +10,18 @@ on: pull_request: jobs: - ci: + unit-tests: strategy: fail-fast: false matrix: os: - ubuntu-latest - windows-latest + include: + - os: ubuntu-latest + cache_path: ~/.cache/go-build + - os: windows-latest + cache_path: ~\AppData\Local\go-build name: ci - ${{matrix.os}} runs-on: ${{matrix.os}} env: @@ -24,17 +32,73 @@ jobs: - name: Setup Go uses: actions/setup-go@v1 with: - go-version: 1.16.x + go-version: 1.18.x + - name: Cache build + uses: actions/cache@v3 + with: + path: | + ${{matrix.cache_path}} + ~/go/pkg/mod + key: ${{runner.os}}-go-${{hashFiles('**/go.sum')}}-test + restore-keys: | + ${{runner.os}}-go- + - name: Test code + # we're passing -short so that we skip the integration tests, which will be run in parallel below + run: | + go test ./... -short + integration-tests-old: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + parallelism: [5] + index: [0,1,2,3,4] + name: "Integration Tests (Old pattern) (${{ matrix.index }}/${{ matrix.parallelism }})" + env: + GOFLAGS: -mod=vendor + steps: + - name: Checkout code + uses: actions/checkout@v2 + - name: Setup Go + uses: actions/setup-go@v1 + with: + go-version: 1.18.x - name: Cache build uses: actions/cache@v1 with: - path: ~/.cache/go-build + path: | + ~/.cache/go-build + ~/go/pkg/mod key: ${{runner.os}}-go-${{hashFiles('**/go.sum')}}-test restore-keys: | ${{runner.os}}-go- - name: Test code run: | - bash ./test.sh + PARALLEL_TOTAL=${{ matrix.parallelism }} PARALLEL_INDEX=${{ matrix.index }} go test pkg/integration/deprecated/*.go + integration-tests: + runs-on: ubuntu-latest + name: "Integration Tests" + env: + GOFLAGS: -mod=vendor + steps: + - name: Checkout code + uses: actions/checkout@v2 + - name: Setup Go + uses: actions/setup-go@v1 + with: + go-version: 1.18.x + - name: Cache build + uses: actions/cache@v1 + with: + path: | + ~/.cache/go-build + ~/go/pkg/mod + key: ${{runner.os}}-go-${{hashFiles('**/go.sum')}}-test + restore-keys: | + ${{runner.os}}-go- + - name: Test code + run: | + go test pkg/integration/clients/*.go build: runs-on: ubuntu-latest env: @@ -46,11 +110,13 @@ jobs: - name: Setup Go uses: actions/setup-go@v1 with: - go-version: 1.16.x + go-version: 1.18.x - name: Cache build uses: actions/cache@v1 with: - path: ~/.cache/go-build + path: | + ~/.cache/go-build + ~/go/pkg/mod key: ${{runner.os}}-go-${{hashFiles('**/go.sum')}}-build restore-keys: | ${{runner.os}}-go- @@ -63,6 +129,12 @@ jobs: - name: Build darwin binary run: | GOOS=darwin go build + - name: Build integration test binary + run: | + GOOS=linux go build cmd/integration_test/main.go + - name: Build integration test injector + run: | + GOOS=linux go build pkg/integration/clients/injector/main.go check-cheatsheet: runs-on: ubuntu-latest env: @@ -74,11 +146,13 @@ jobs: - name: Setup Go uses: actions/setup-go@v1 with: - go-version: 1.16.x + go-version: 1.18.x - name: Cache build uses: actions/cache@v1 with: - path: ~/.cache/go-build + path: | + ~/.cache/go-build + ~/go/pkg/mod key: ${{runner.os}}-go-${{hashFiles('**/go.sum')}}-build restore-keys: | ${{runner.os}}-go- @@ -87,11 +161,26 @@ jobs: go run scripts/cheatsheet/main.go check lint: runs-on: ubuntu-latest + env: + GOFLAGS: -mod=vendor steps: - - name: Checkout + - name: Checkout code uses: actions/checkout@v2 + - name: Setup Go + uses: actions/setup-go@v1 + with: + go-version: 1.18.x + - name: Cache build + uses: actions/cache@v1 + with: + path: | + ~/.cache/go-build + ~/go/pkg/mod + key: ${{runner.os}}-go-${{hashFiles('**/go.sum')}}-test + restore-keys: | + ${{runner.os}}-go- - name: Lint - uses: golangci/golangci-lint-action@v2 + uses: golangci/golangci-lint-action@v3.1.0 with: version: latest - name: Format code diff --git a/.github/workflows/sponsors.yml b/.github/workflows/sponsors.yml new file mode 100644 index 000000000..e4c780445 --- /dev/null +++ b/.github/workflows/sponsors.yml @@ -0,0 +1,28 @@ +# see https://github.com/JamesIves/github-sponsors-readme-action +name: Generate Sponsors README +on: + push: + branches: + - master +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - name: Checkout 🛎️ + uses: actions/checkout@v2 + + - name: Generate Sponsors 💖 + uses: JamesIves/github-sponsors-readme-action@v1.0.8 + with: + token: ${{ secrets.SPONSORS_TOKEN }} + file: 'README.md' + if: ${{ github.repository == 'jesseduffield/lazygit' }} + + - name: Commit and push if changed + run: |- + git diff + git config --global user.email "actions@users.noreply.github.com" + git config --global user.name "README-bot" + git add README.md + git commit -m "Updated README.md" || exit 0 + git push diff --git a/.gitignore b/.gitignore index 84258eeee..e9ed453a2 100644 --- a/.gitignore +++ b/.gitignore @@ -23,16 +23,29 @@ lazygit.exe # Exceptions !.gitignore !.goreleaser.yml +!.golangci.yml !.circleci/ !.github/ +!.vscode/ + # these are for our integration tests !.git_keep !.gitmodules_keep test/git_server/data + +# we'll scrap these lines once we've fully moved over to the new integration test approach test/integration/*/actual/ -test/integration/*/actual_remote/ test/integration/*/used_config/ # these sample hooks waste too much space test/integration/*/expected/**/hooks/ test/integration/*/expected_remote/**/hooks/ + +test/integration_new/**/actual/ +test/integration_new/**/used_config/ +# these sample hooks waste too much space +test/integration_new/**/expected/**/hooks/ +test/integration_new/**/expected_remote/**/hooks/ + +oryxBuildBinary +__debug_bin diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 000000000..de90dc516 --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,29 @@ +linters: + disable: + - structcheck # gives false positives + enable: + - gofumpt + - thelper + - goimports + - tparallel + - wastedassign + - exportloopref + - unparam + - prealloc + - unconvert + - exhaustive + - makezero + - nakedret + # - goconst # TODO: enable and fix issues + fast: false + +linters-settings: + exhaustive: + default-signifies-exhaustive: true + + nakedret: + # the gods will judge me but I just don't like naked returns at all + max-func-lines: 0 + +run: + go: 1.18 diff --git a/.vscode/debugger_config.yml b/.vscode/debugger_config.yml new file mode 100644 index 000000000..dc8bd1faa --- /dev/null +++ b/.vscode/debugger_config.yml @@ -0,0 +1 @@ +disableStartupPopups: true diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 000000000..a39309429 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,36 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Debug Lazygit", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "main.go", + "args": ["--debug", "--use-config-file=.vscode/debugger_config.yml"], + "console": "integratedTerminal", + "presentation": { + "hidden": true + } + }, + { + "name": "Tail Lazygit logs", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "main.go", + "args": ["--logs", "--use-config-file=.vscode/debugger_config.yml"], + "console": "integratedTerminal", + "presentation": { + "hidden": true + } + } + ], + "compounds": [ + { + "name": "Run with logs", + "configurations": ["Tail Lazygit logs", "Debug Lazygit"], + "stopAll": true + } + ] +} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 71c43a3bf..c6a68feae 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,6 +6,10 @@ When contributing to this repository, please first discuss the change you wish to make via issue, email, or any other method with the owners of this repository before making a change. +## PR walkthrough + +[This video](https://www.youtube.com/watch?v=kNavnhzZHtk) walks through the process of adding a small feature to lazygit. If you have no idea where to start, watching that video is a good first step. + ## All code changes happen through Pull Requests Pull requests are the best way to propose changes to the codebase. We actively @@ -50,6 +54,21 @@ var _ MyInterface = &MyStruct{} This makes the intent clearer and means that if we fail to satisfy the interface we'll get an error in the file that needs fixing. +### Code Formatting + +To check code formatting [gofumpt](https://pkg.go.dev/mvdan.cc/gofumpt#section-readme) (which is a bit stricter than [gofmt](https://pkg.go.dev/cmd/gofmt)) is used. +VSCode will format the code correctly if you tell the Go extension to use `gofumpt` via your [`settings.json`](https://code.visualstudio.com/docs/getstarted/settings#_settingsjson) +by setting [`formatting.gofumpt`](https://github.com/golang/tools/blob/master/gopls/doc/settings.md#gofumpt-bool) to `true`: + +```jsonc +// .vscode/settings.json +{ + "gopls": { + "formatting.gofumpt": true + } +} +``` + ## Internationalisation Boy that's a hard word to spell. Anyway, lazygit is translated into several languages within the pkg/i18n package. If you need to render text to the user, you should add a new field to the TranslationSet struct in `pkg/i18n/english.go` and add the actual content within the `EnglishTranslationSet()` method in the same file. Although it is appreciated if you translate the text into other languages, it's not expected of you (google translate will likely do a bad job anyway!). @@ -58,13 +77,36 @@ Boy that's a hard word to spell. Anyway, lazygit is translated into several lang The easiest way to debug lazygit is to have two terminal tabs open at once: one for running lazygit (via `go run main.go -debug` in the project root) and one for viewing lazygit's logs (which can be done via `go run main.go --logs` or just `lazygit --logs`). -From most places in the codebase you have access to a logger e.g. `gui.Log.Warn("blah")` +From most places in the codebase you have access to a logger e.g. `gui.Log.Warn("blah")`. If you find that the existing logs are too noisy, you can set the log level with e.g. `LOG_LEVEL=warn go run main.go -debug` and then only use `Warn` logs yourself. +If you need to log from code in the vendor directory (e.g. the `gocui` package), you won't have access to the logger, but you can easily add logging support by adding the following: + +```go +func newLogger() *logrus.Entry { + // REPLACE THE BELOW PATH WITH YOUR ACTUAL LOG PATH (YOU'LL SEE THIS PRINTED WHEN YOU RUN `lazygit --logs` + logPath := "/Users/jesseduffield/Library/Application Support/jesseduffield/lazygit/development.log" + file, err := os.OpenFile(logPath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) + if err != nil { + panic("unable to log to file") + } + logger := logrus.New() + logger.SetLevel(logrus.WarnLevel) + logger.SetOutput(file) + return logger.WithFields(logrus.Fields{}) +} + +var Log = newLogger() +... +Log.Warn("blah") +``` + If you keep having to do some setup steps to reproduce an issue, read the Testing section below to see how to create an integration test by recording a lazygit session. It's pretty easy! -If you want to trigger a debug session from VSCode, you can use the following snippet. Note that the 'console' key is not, at the time of writing, in a stable release. +### VSCode debugger + +If you want to trigger a debug session from VSCode, you can use the following snippet. Note that the `console` key is, at the time of writing, still an experimental feature. ```jsonc // .vscode/launch.json @@ -77,6 +119,7 @@ If you want to trigger a debug session from VSCode, you can use the following sn "request": "launch", "mode": "auto", "program": "main.go", + "args": ["--debug"], "console": "externalTerminal" // <-- you need this to actually see the lazygit UI in a window while debugging } ] @@ -85,7 +128,7 @@ If you want to trigger a debug session from VSCode, you can use the following sn ## Testing -Lazygit has two kinds of tests: unit tests and integration tests. Unit tests go in files that end in `_test.go`, and are written in Go. Lazygit has its own integration test system where you can build a sandbox repo with a shell script, record yourself doing something, and commit the resulting repo snapshot. It's pretty damn cool! To learn more see [here](https://github.com/jesseduffield/lazygit/blob/master/docs/Integration_Tests.md) +Lazygit has two kinds of tests: unit tests and integration tests. Unit tests go in files that end in `_test.go`, and are written in Go. For integration tests, see [here](https://github.com/jesseduffield/lazygit/blob/master/pkg/integration/README.md) ## Updating Gocui diff --git a/Dockerfile b/Dockerfile index aec4ff2a0..4271aca48 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,16 +2,18 @@ # docker build -t lazygit . # docker run -it lazygit:latest /bin/sh -FROM golang:1.14-alpine3.11 +FROM golang:1.18 as build WORKDIR /go/src/github.com/jesseduffield/lazygit/ -COPY ./ . +COPY go.mod go.sum ./ +RUN go mod download +COPY . . RUN CGO_ENABLED=0 GOOS=linux go build -FROM alpine:3.11 -RUN apk add -U git xdg-utils +FROM alpine:3.15 +RUN apk add --no-cache -U git xdg-utils WORKDIR /go/src/github.com/jesseduffield/lazygit/ -COPY --from=0 /go/src/github.com/jesseduffield/lazygit /go/src/github.com/jesseduffield/lazygit -COPY --from=0 /go/src/github.com/jesseduffield/lazygit/lazygit /bin/ +COPY --from=build /go/src/github.com/jesseduffield/lazygit ./ +COPY --from=build /go/src/github.com/jesseduffield/lazygit/lazygit /bin/ RUN echo "alias gg=lazygit" >> ~/.profile ENTRYPOINT [ "lazygit" ] diff --git a/README.md b/README.md index 218218130..6c437bb7c 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,46 @@

- +

-![CI](https://github.com/jesseduffield/lazygit/workflows/Continuous%20Integration/badge.svg) [![Go Report Card](https://goreportcard.com/badge/github.com/jesseduffield/lazygit)](https://goreportcard.com/report/github.com/jesseduffield/lazygit) [![GolangCI](https://golangci.com/badges/github.com/jesseduffield/lazygit.svg)](https://golangci.com) [![GoDoc](https://godoc.org/github.com/jesseduffield/lazygit?status.svg)](http://godoc.org/github.com/jesseduffield/lazygit) [![GitHub tag](https://img.shields.io/github/tag/jesseduffield/lazygit.svg)]() [![TODOs](https://badgen.net/https/api.tickgit.com/badgen/github.com/jesseduffield/lazygit)](https://www.tickgit.com/browse?repo=github.com/jesseduffield/lazygit) - - +![CI](https://github.com/jesseduffield/lazygit/workflows/Continuous%20Integration/badge.svg) +[![Go Report Card](https://goreportcard.com/badge/github.com/jesseduffield/lazygit)](https://goreportcard.com/report/github.com/jesseduffield/lazygit) +[![GolangCI](https://golangci.com/badges/github.com/jesseduffield/lazygit.svg)](https://golangci.com) +[![GoDoc](https://godoc.org/github.com/jesseduffield/lazygit?status.svg)](http://godoc.org/github.com/jesseduffield/lazygit) +[![GitHub Releases](https://img.shields.io/github/downloads/jesseduffield/lazygit/total)](https://github.com/jesseduffield/lazygit/releases) +[![GitHub tag](https://img.shields.io/github/tag/jesseduffield/lazygit.svg)](https://github.com/jesseduffield/lazygit/releases/latest) +[![homebrew](https://img.shields.io/homebrew/v/lazygit)](https://github.com/Homebrew/homebrew-core/blob/master/Formula/lazygit.rb) A simple terminal UI for git commands, written in Go with the [gocui](https://github.com/jroimartin/gocui "gocui") library. -Rant time: You've heard it before, git is _powerful_, but what good is that power when everything is so damn hard to do? Interactive rebasing requires you to edit a goddamn TODO file in your editor? *Are you kidding me?* To stage part of a file you need to use a command line program to step through each hunk and if a hunk can't be split down any further but contains code you don't want to stage, you have to edit an arcane patch file _by hand_? *Are you KIDDING me?!* Sometimes you get asked to stash your changes when switching branches only to realise that after you switch and unstash that there weren't even any conflicts and it would have been fine to just checkout the branch directly? *YOU HAVE GOT TO BE KIDDING ME!* +![Gif](../assets/staging.gif) + +## Sponsors + +

+ Maintenance of this project is made possible by all the contributors and sponsors. If you'd like to sponsor this project and have your avatar or company logo appear below click here. đź’™ +

+ +

+ +

+ +## Elevator Pitch + +Rant time: You've heard it before, git is _powerful_, but what good is that power when everything is so damn hard to do? Interactive rebasing requires you to edit a goddamn TODO file in your editor? _Are you kidding me?_ To stage part of a file you need to use a command line program to step through each hunk and if a hunk can't be split down any further but contains code you don't want to stage, you have to edit an arcane patch file _by hand_? _Are you KIDDING me?!_ Sometimes you get asked to stash your changes when switching branches only to realise that after you switch and unstash that there weren't even any conflicts and it would have been fine to just checkout the branch directly? _YOU HAVE GOT TO BE KIDDING ME!_ If you're a mere mortal like me and you're tired of hearing how powerful git is when in your daily life it's a powerful pain in your ass, lazygit might be for you. -![Gif](../assets/staging.gif) - ## Table of contents - [Installation](#installation) - [Binary releases](#binary-releases) - [Homebrew](#homebrew) - [MacPorts](#macports) - - [Ubuntu](#ubuntu) - [Void Linux](#void-linux) - [Scoop (Windows)](#scoop-windows) - [Arch Linux](#arch-linux) - - [Fedora and CentOS 7](#fedora-and-centos-7) + - [Fedora and RHEL](#fedora-and-rhel) - [Solus Linux](#solus-linux) - [Funtoo Linux](#funtoo-linux) - [FreeBSD](#freebsd) @@ -81,18 +96,6 @@ Tap: sudo port install lazygit ``` -### Ubuntu - -**Deprecated**: will no longer receive updates. - -Packages for Ubuntu are available via [Launchpad PPA](https://launchpad.net/~lazygit-team). - -```sh -sudo add-apt-repository ppa:lazygit-team/release -sudo apt-get update -sudo apt-get install lazygit -``` - ### Void Linux Packages for Void Linux are available in the distro repo @@ -128,9 +131,9 @@ and the git version which builds from the most recent commit. Instruction of how to install AUR content can be found here: -### Fedora and CentOS 7 +### Fedora and RHEL -Packages for Fedora and CentOS 7 are available via [Copr](https://copr.fedorainfracloud.org/coprs/atim/lazygit/) (Cool Other Package Repo). +Packages for Fedora/RHEL and CentOS Stream are available via [Copr](https://copr.fedorainfracloud.org/coprs/atim/lazygit/) (Cool Other Package Repo). ```sh sudo dnf copr enable atim/lazygit -y @@ -157,7 +160,6 @@ sudo emerge dev-vcs/lazygit pkg install lazygit ``` - ### Conda Released versions are available for different platforms, see @@ -174,9 +176,9 @@ go install github.com/jesseduffield/lazygit@latest Please note: If you get an error claiming that lazygit cannot be found or is not defined, you -may need to add `~/go/bin` to your \$PATH (MacOS/Linux), or `%HOME%\go\bin` -(Windows). Not to be mistaked for `C:\Go\bin` (which is for Go's own binaries, -not apps like Lazygit). +may need to add `~/go/bin` to your $PATH (MacOS/Linux), or `%HOME%\go\bin` +(Windows). Not to be mistaken for `C:\Go\bin` (which is for Go's own binaries, +not apps like lazygit). ### Chocolatey (Windows) @@ -232,7 +234,7 @@ lg() } ``` -Then `source ~/.zshrc` and from now on when you call `lg` and exit you'll switch directories to whatever you were in inside lazyigt. To override this behaviour you can exit using `shift+Q` rather than just `q`. +Then `source ~/.zshrc` and from now on when you call `lg` and exit you'll switch directories to whatever you were in inside lazygit. To override this behaviour you can exit using `shift+Q` rather than just `q`. ### Undo/Redo @@ -258,7 +260,6 @@ See the [docs](docs/Custom_Command_Keybindings.md) - [Rebase Magic Video Tutorial](https://youtu.be/4XaToVut_hs) - [Twitch Stream](https://www.twitch.tv/jesseduffield) - ## Cool features - Adding files easily @@ -283,7 +284,10 @@ For contributor discussion about things not better discussed here in the repo, j [![Slack](../assets/slack_rgb.png)](https://join.slack.com/t/lazygit/shared_invite/zt-5bo2clzo-hB8ZTVN5dWUCqj5QFiQVLA) +Check out this [video](https://www.youtube.com/watch?v=kNavnhzZHtk) walking through the creation of a small feature in lazygit if you want an idea of where to get started. + ### Debugging Locally + Run `lazygit --debug` in one terminal tab and `lazygit --logs` in another to view the program and its log output side by side ## Donate @@ -292,14 +296,16 @@ If you would like to support the development of lazygit, consider [sponsoring me ## FAQ -### I'm struggling to see the selected line -see [here](https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md#struggling-to-see-selected-line) +### What do the commit colors represent? -## Social +- Green: the commit is included in the master branch +- Yellow: the commit is not included in the master branch +- Red: the commit has not been pushed to the upstream branch + +## Shameless Plug If you want to see what I (Jesse) am up to in terms of development, follow me on -[twitter](https://twitter.com/DuffieldJesse) or watch me program on -[twitch](https://www.twitch.tv/jesseduffield). +[twitter](https://twitter.com/DuffieldJesse) or check out my [blog](https://jesseduffield.com/) ## Alternatives diff --git a/cmd/integration_test/main.go b/cmd/integration_test/main.go new file mode 100644 index 000000000..492e5e19f --- /dev/null +++ b/cmd/integration_test/main.go @@ -0,0 +1,49 @@ +package main + +import ( + "fmt" + "log" + "os" + + "github.com/jesseduffield/lazygit/pkg/integration/clients" +) + +var usage = ` +Usage: + See https://github.com/jesseduffield/lazygit/tree/master/pkg/integration/README.md + + CLI mode: + > go run cmd/integration_test/main.go cli ... + If you pass no test names, it runs all tests + Accepted environment variables: + KEY_PRESS_DELAY (e.g. 200): the number of milliseconds to wait between keypresses + MODE: + * ask (default): if a snapshot test fails, asks if you want to update the snapshot + * check: if a snapshot test fails, exits with an error + * update: if a snapshot test fails, updates the snapshot + * sandbox: uses the test's setup step to run the test in a sandbox where you can do whatever you want + + TUI mode: + > go run cmd/integration_test/main.go tui + This will open up a terminal UI where you can run tests + + Help: + > go run cmd/integration_test/main.go help +` + +func main() { + if len(os.Args) < 2 { + log.Fatal(usage) + } + + switch os.Args[1] { + case "help": + fmt.Println(usage) + case "cli": + clients.RunCLI(os.Args[2:]) + case "tui": + clients.RunTUI() + default: + log.Fatal(usage) + } +} diff --git a/docs/Config.md b/docs/Config.md index 89c0b7d63..7c0ecd6ac 100644 --- a/docs/Config.md +++ b/docs/Config.md @@ -22,24 +22,27 @@ gui: sidePanelWidth: 0.3333 # number from 0 to 1 expandFocusedSidePanel: false mainPanelSplitMode: 'flexible' # one of 'horizontal' | 'flexible' | 'vertical' - language: 'auto' # one of 'auto' | 'en' | 'zh' | 'pl' | 'nl' + language: 'auto' # one of 'auto' | 'en' | 'zh' | 'pl' | 'nl' | 'ja' | 'ko' + timeFormat: '02 Jan 06 15:04 MST' # https://pkg.go.dev/time#Time.Format theme: lightTheme: false # For terminals with a light background activeBorderColor: - - white + - green - bold inactiveBorderColor: - - green + - white optionsTextColor: - blue selectedLineBgColor: - - default + - blue # set to `default` to have no background colour selectedRangeBgColor: - blue cherryPickedCommitBgColor: - - blue - cherryPickedCommitFgColor: - cyan + cherryPickedCommitFgColor: + - blue + unstagedChangesColor: + - red commitLength: show: true mouseEvents: true @@ -48,8 +51,11 @@ gui: showFileTree: true # for rendering changes files in a tree format showListFooter: true # for seeing the '5 of 20' message in list panels showRandomTip: true + showBottomLine: true # for hiding the bottom information line (unless it has important information to tell you) showCommandLog: true + showIcons: false commandLogSize: 8 + splitDiff: 'auto' # one of 'auto' | 'always' git: paging: colorArg: always @@ -69,8 +75,11 @@ git: # one of always, never, when-maximised # this determines whether the git graph is rendered in the commits panel showGraph: 'when-maximised' + # displays the whole git graph by default in the commits panel (equivalent to passing the `--all` argument to `git log`) + showWholeGraph: false skipHookPrefix: WIP autoFetch: true + autoRefresh: true branchLogCmd: 'git log --graph --color=always --abbrev-commit --decorate --date=relative --pretty=medium {{branchName}} --' allBranchesLogCmd: 'git log --graph --all --color=always --abbrev-commit --decorate --date=relative --pretty=medium' overrideGpg: false # prevents lazygit from spawning a separate process when using GPG @@ -80,11 +89,11 @@ git: diffContextSize: 3 # how many lines of context are shown around a change in diffs os: editCommand: '' # see 'Configuring File Editing' section - editCommandTemplate: '{{editor}} {{filename}}' + editCommandTemplate: '' openCommand: '' refresher: - refreshInterval: 10 # file/submodule refresh interval in seconds - fetchInterval: 60 # re-fetch interval in seconds + refreshInterval: 10 # File/submodule refresh interval in seconds. Auto-refresh can be disabled via option 'git.autoRefresh'. + fetchInterval: 60 # Re-fetch interval in seconds. Auto-fetch can be disabled via option 'git.autoFetch'. update: method: prompt # can be: prompt | background | never days: 14 # how often an update is checked for @@ -93,7 +102,8 @@ confirmOnQuit: false # determines whether hitting 'esc' will quit the application when there is nothing to cancel/close quitOnTopLevelReturn: false disableStartupPopups: false -notARepository: 'prompt' # one of: 'prompt' | 'create' | 'skip' +notARepository: 'prompt' # one of: 'prompt' | 'create' | 'skip' | 'quit' +promptToReturnFromSubprocess: true # display confirmation when subprocess terminates keybinding: universal: quit: 'q' @@ -179,6 +189,7 @@ keybinding: checkoutBranchByName: 'c' forceCheckoutBranch: 'F' rebaseBranch: 'r' + renameBranch: 'R' mergeIntoCurrentBranch: 'M' viewGitFlowOptions: 'i' fastForward: 'f' # fast-forward this branch from its upstream @@ -264,12 +275,12 @@ os: Lazygit will log an error if none of these options are set. -You can specify a line number you are currently at when in the line-by-line mode. +You can specify the current line number when you're in the patch explorer. ```yaml os: editCommand: 'vim' - editCommandTemplate: '{{editor}} +{{line}} {{filename}}' + editCommandTemplate: '{{editor}} +{{line}} -- {{filename}}' ``` or @@ -277,23 +288,23 @@ or ```yaml os: editCommand: 'code' - editCommandTemplate: '{{editor}} --goto {{filename}}:{{line}}' + editCommandTemplate: '{{editor}} --goto -- {{filename}}:{{line}}' ``` `{{editor}}` in `editCommandTemplate` is replaced with the value of `editCommand`. ### Overriding default config file location -To override the default config directory, use `$CONFIG_DIR="~/.config/lazygit"`. This directory contains the config file in addition to some other files lazygit uses to keep track of state across sessions. +To override the default config directory, use `CONFIG_DIR="$HOME/.config/lazygit"`. This directory contains the config file in addition to some other files lazygit uses to keep track of state across sessions. To override the individual config file used, use the `--use-config-file` arg or the `LG_CONFIG_FILE` env var. If you want to merge a specific config file into a more general config file, perhaps for the sake of setting some theme-specific options, you can supply a list of comma-separated config file paths, like so: ```sh -lazygit --use-config-file=~/.base_lg_conf,~/.light_theme_lg_conf +lazygit --use-config-file="$HOME/.base_lg_conf,$HOME/.light_theme_lg_conf" or -LG_CONFIG_FILE="~/.base_lg_conf,~/.light_theme_lg_conf" lazygit +LG_CONFIG_FILE="$HOME/.base_lg_conf,$HOME/.light_theme_lg_conf" lazygit ``` ### Recommended Config Values @@ -346,9 +357,20 @@ gui: - default ``` -## Struggling to see selected line +## Highlighting the selected line -If you struggle to see the selected line I recommend using the reverse attribute on selected lines like so: +If you don't like the default behaviour of highlighting the selected line with a blue background, you can use the `selectedLineBgColor` and `selectedRangeBgColor` keys to customise the behaviour. If you just want to embolden the selected line (this was the original default), you can do the following: + +```yaml +gui: + theme: + selectedLineBgColor: + - default + selectedRangeBgColor: + - default +``` + +You can also use the reverse attribute like so: ```yaml gui: @@ -359,25 +381,6 @@ gui: - reverse ``` -The following has also worked for a couple of people: - -```yaml -gui: - theme: - activeBorderColor: - - white - - bold - inactiveBorderColor: - - white - selectedLineBgColor: - - reverse - - blue -``` - -Alternatively you may have bold fonts disabled in your terminal, in which case enabling bold fonts should solve the problem. - -If you're still having trouble please raise an issue. - ## Custom Author Color Lazygit will assign a random color for every commit author in the commits pane by default. @@ -387,7 +390,8 @@ You can customize the color in case you're not happy with the randomly assigned ```yaml gui: authorColors: - 'John Smith': '#ff0000' # use red for John Smith + 'John Smith': 'red' # use red for John Smith + 'Alan Smithee': '#00ff00' # use green for Alan Smithee ``` You can use wildcard to set a unified color in case your are lazy to customize the color for every author or you just want a single color for all/other authors: @@ -396,7 +400,7 @@ You can use wildcard to set a unified color in case your are lazy to customize t gui: authorColors: # use red for John Smith - 'John Smith': '#ff0000' + 'John Smith': 'red' # use blue for other authors '*': '#0000ff' ``` @@ -415,6 +419,15 @@ gui: ![border example](../../assets/colored-border-example.png) +## Display Nerd Fonts Icons + +If you are using [Nerd Fonts](https://www.nerdfonts.com), you can display icons. + +```yaml +gui: + showIcons: true +``` + ## Keybindings For all possible keybinding options, check [Custom_Keybindings.md](https://github.com/jesseduffield/lazygit/blob/master/docs/keybindings/Custom_Keybindings.md) @@ -465,7 +478,7 @@ services: Where: - `gitDomain` stands for the domain used by git itself (i.e. the one present on clone URLs), e.g. `git.work.com` -- `provider` is one of `github`, `bitbucket` or `gitlab` +- `provider` is one of `github`, `bitbucket`, `bitbucketServer`, `azuredevops` or `gitlab` - `webDomain` is the URL where your git service exposes a web interface and APIs, e.g. `gitservice.work.com` ## Predefined commit message prefix @@ -519,3 +532,8 @@ notARepository: 'create' # to skip without creating a new repo notARepository: 'skip' ``` + +```yaml +# to exit immediately if run outside of the Git repository +notARepository: 'quit' +``` diff --git a/docs/Custom_Command_Keybindings.md b/docs/Custom_Command_Keybindings.md index 1dd27fef3..ca966799e 100644 --- a/docs/Custom_Command_Keybindings.md +++ b/docs/Custom_Command_Keybindings.md @@ -49,6 +49,13 @@ customCommands: filter: '.*{{index .PromptResponses 0}}/(?P.*)' valueFormat: '{{ .branch }}' labelFormat: '{{ .branch | green }}' + - key: '' + command: 'git reset --soft {{.CheckedOutBranch.UpstreamRemote}}' + context: 'files' + prompts: + - type: 'confirm' + title: "Confirm:" + body: "Are you sure you want to reset HEAD to {{.CheckedOutBranch.UpstreamRemote}}?" ``` Looking at the command assigned to the 'n' key, here's what the result looks like: @@ -70,6 +77,7 @@ For a given custom command, here are the allowed fields: | loadingText | text to display while waiting for command to finish | no | | description | text to display in the keybindings menu that appears when you press 'x' | no | | stream | whether you want to stream the command's output to the Command Log panel | no | +| showOutput | whether you want to show the command's output in a gui prompt | no | ### Contexts @@ -94,28 +102,18 @@ The permitted contexts are: The permitted prompt fields are: -| _field_ | _description_ | _required_ | -| ------------ | -------------------------------------------------------------------------------- | ---------- | -| type | one of 'input' or 'menu' | yes | -| title | the title to display in the popup panel | no | -| initialValue | (only applicable to 'input' prompts) the initial value to appear in the text box | no | -| options | (only applicable to 'menu' prompts) the options to display in the menu | no | -| command | (only applicable to 'menuFromCommand' prompts) the command to run to generate | yes | -| | menu options | | -| filter | (only applicable to 'menuFromCommand' prompts) the regexp to run specifying | yes | -| | groups which are going to be kept from the command's output | | -| valueFormat | (only applicable to 'menuFromCommand' prompts) how to format matched groups from | yes | -| | the filter to construct a menu item's value (What gets appended to prompt | | -| | responses when the item is selected). You can use named groups, | | -| | or `{{ .group_GROUPID }}`. | | -| | PS: named groups keep first match only | | -| labelFormat | (only applicable to 'menuFromCommand' prompts) how to format matched groups from | no | -| | the filter to construct the item's label (What's shown on screen). You can use | | -| | named groups, or `{{ .group_GROUPID }}`. You can also color each match with | | -| | `{{ .group_GROUPID | colorname }}` (Color names from | | -| | [here](https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md)) | | -| | If `labelFormat` is not specified, `valueFormat` is shown instead. | | -| | PS: named groups keep first match only | | +| _field_ | _description_ | _required_ | +| ------------ | -----------------------------------------------------------------------------------------------| ---------- | +| type | one of 'input', 'menu', or 'confirm' | yes | +| title | the title to display in the popup panel | no | +| initialValue | (only applicable to 'input' prompts) the initial value to appear in the text box | no | +| body | (only applicable to 'confirm' prompts) the immutable body text to appear in the text box | no | +| options | (only applicable to 'menu' prompts) the options to display in the menu | no | +| command | (only applicable to 'menuFromCommand' prompts) the command to run to generate | yes | +| | menu options | | +| filter | (only applicable to 'menuFromCommand' prompts) the regexp to run specifying groups which are going to be kept from the command's output | yes | +| valueFormat | (only applicable to 'menuFromCommand' prompts) how to format matched groups from the filter to construct a menu item's value (What gets appended to prompt responses when the item is selected). You can use named groups, or `{{ .group_GROUPID }}`. PS: named groups keep first match only | yes | +| labelFormat | (only applicable to 'menuFromCommand' prompts) how to format matched groups from the filter to construct the item's label (What's shown on screen). You can use named groups, or `{{ .group_GROUPID }}`. You can also color each match with `{{ .group_GROUPID \| colorname }}` (Color names from [here](https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md)). If `labelFormat` is not specified, `valueFormat` is shown instead. PS: named groups keep first match only | no | The permitted option fields are: | _field_ | _description_ | _required_ | @@ -138,13 +136,14 @@ If an option has no name the value will be displayed to the user in place of the ### Placeholder values -Your commands can contain placeholder strings using Go's [template syntax](https://jan.newmarch.name/go/template/chapter-template.html). The template syntax is pretty powerful, letting you do things like conditionals if you want, but for the most part you'll simply want to be accessing the fields on the following objects: +Your commands can contain placeholder strings using Go's [template syntax](https://jan.newmarch.name/golang/template/chapter-template.html). The template syntax is pretty powerful, letting you do things like conditionals if you want, but for the most part you'll simply want to be accessing the fields on the following objects: ``` SelectedLocalCommit SelectedReflogCommit SelectedSubCommit SelectedFile +SelectedPath SelectedLocalBranch SelectedRemoteBranch SelectedRemote @@ -154,7 +153,7 @@ SelectedCommitFile CheckedOutBranch ``` -To see what fields are available on e.g. the `SelectedFile`, see [here](https://github.com/jesseduffield/lazygit/blob/master/pkg/commands/models/file.go) (all the modelling lives in the same directory). Note that the custom commands feature does not guarantee backwards compatibility (until we hit lazygit version 1.0 of course) which means a field you're accessing on an object may no longer be available from one release to the next. Typically however, all you'll need is `{{.SelectedFile.Name}}`, `{{.SelectedLocalCommit.Sha}}` and `{{.SelectedBranch.Name}}`. In the future we will likely introduce a tighter interface that exposes a limited set of fields for each model. +To see what fields are available on e.g. the `SelectedFile`, see [here](https://github.com/jesseduffield/lazygit/blob/master/pkg/commands/models/file.go) (all the modelling lives in the same directory). Note that the custom commands feature does not guarantee backwards compatibility (until we hit lazygit version 1.0 of course) which means a field you're accessing on an object may no longer be available from one release to the next. Typically however, all you'll need is `{{.SelectedFile.Name}}`, `{{.SelectedLocalCommit.Sha}}` and `{{.SelectedLocalBranch.Name}}`. In the future we will likely introduce a tighter interface that exposes a limited set of fields for each model. ### Keybinding collisions @@ -162,7 +161,7 @@ If your custom keybinding collides with an inbuilt keybinding that is defined fo ### Debugging -If you want to verify that your command actually does what you expect, you can wrap it in an 'echo' call and set `subprocess: true` so that it doesn't actually execute the command but you can see how the placeholders were resolved. Alternatively you can run lazygit in debug mode with `lazygit --debug` and in another terminal window run `lazygit --logs` to see which commands are actually run +If you want to verify that your command actually does what you expect, you can wrap it in an 'echo' call and set `showOutput: true` so that it doesn't actually execute the command but you can see how the placeholders were resolved. Alternatively you can run lazygit in debug mode with `lazygit --debug` and in another terminal window run `lazygit --logs` to see which commands are actually run ### More Examples diff --git a/docs/Integration_Tests.md b/docs/Integration_Tests.md index 1bb797b3a..fab7bb984 100644 --- a/docs/Integration_Tests.md +++ b/docs/Integration_Tests.md @@ -1,119 +1 @@ -# How To Make And Run Integration Tests For lazygit - -Integration tests are located in `test/integration`. Each test will run a bash script to prepare a test repo, then replay a recorded lazygit session from within that repo, and then the resultant repo will be compared to an expected repo that was created upon the initial recording. Each integration test lives in its own directory, and the name of the directory becomes the name of the test. Within the directory must be the following files: - -### `test.json` - -An example of a `test.json` is: - -``` -{ "description": "stage a file and commit the change", "speed": 20 } -``` - -The `speed` key refers to the playback speed as a multiple of the original recording speed. So 20 means the test will run 20 times faster than the original recording speed. If a test fails for a given speed, it will drop the speed and re-test, until finally attempting the test at the original speed. If you omit the speed, it will default to 10. - -### `setup.sh` - -This is a bash script containing the instructions for creating the test repo from scratch. For example: - -``` -#!/bin/sh - -cd $1 - -git init - -git config user.email "CI@example.com" -git config user.name "CI" - -echo test1 > myfile1 -git add . -git commit -am "myfile1" -``` - -## Running tests - -### From a TUI - -You can run/record/sandbox tests via a TUI with the following command: - -``` -go run test/lazyintegration/main.go -``` - -This TUI makes much of the following documentation redundant, but feel free to read through anyway! - -### From command line - -To run all tests - assuming you're at the project root: - -``` -go test ./pkg/gui/ -``` - -To run them in parallel - -``` -PARALLEL=true go test ./pkg/gui -``` - -To run a single test - -``` -go test ./pkg/gui -run / -# For example, to run the `tags` test: -go test ./pkg/gui -run /tags -``` - -To run a test at a certain speed - -``` -SPEED=2 go test ./pkg/gui -run / -``` - -To update a snapshot - -``` -MODE=updateSnapshot go test ./pkg/gui -run / -``` - -## Creating a new test - -To create a new test: - -1. Copy and paste an existing test directory and rename the new directory to whatever you want the test name to be. Update the test.json file's description to describe your test. -2. Update the `setup.sh` any way you like -3. If you want to have a config folder for just that test, create a `config` directory to contain a `config.yml` and optionally a `state.yml` file. Otherwise, the `test/default_test_config` directory will be used. -4. From the lazygit root directory, run: - -``` -MODE=record go test ./pkg/gui -run / -``` - -5. Feel free to re-attempt recording as many times as you like. In the absence of a proper testing framework, the more deliberate your keypresses, the better! -6. Once satisfied with the recording, stage all the newly created files: `test.json`, `setup.sh`, `recording.json` and the `expected` directory that contains a copy of the repo you created. - -The resulting directory will look like: - -``` -actual/ (the resulting repo after running the test, ignored by git) -expected/ (the 'snapshot' repo) -config/ (need not be present) -test.json -setup.sh -recording.json -``` - -Feel free to create a hierarchy of directories in the `test/integration` directory to group tests by feature. - -## Sandboxing - -The integration tests serve a secondary purpose of providing a setup for easy sandboxing. If you want to run a test in sandbox mode (meaning the session won't be recorded and we won't create/update snapshots), go: - -``` -MODE=sandbox go test ./pkg/gui -run / -``` - -## Feedback - -If you think this process can be improved, let me know! It shouldn't be too hard to change things. +see new docs [here](https://github.com/jesseduffield/lazygit/blob/master/pkg/integration/README.md) diff --git a/docs/keybindings/Keybindings_en.md b/docs/keybindings/Keybindings_en.md index e855bb056..d9884256b 100644 --- a/docs/keybindings/Keybindings_en.md +++ b/docs/keybindings/Keybindings_en.md @@ -5,36 +5,38 @@ _This file is auto-generated. To update, make the changes in the pkg/i18n direct ## Global Keybindings
-  ctrl+r: switch to a recent repo ()
-  pgup: scroll up main panel (fn+up)
-  pgdown: scroll down main panel (fn+down)
+  ctrl+r: switch to a recent repo
+  pgup: scroll up main panel (fn+up/shift+k)
+  pgdown: scroll down main panel (fn+down/shift+j)
   m: view merge/rebase options
   ctrl+p: view custom patch options
-  P: push
-  p: pull
   R: refresh
   x: open menu
-  z: undo (via reflog) (experimental)
-  ctrl+z: redo (via reflog) (experimental)
   +: next screen mode (normal/half/fullscreen)
   _: prev screen mode
-  :: execute custom command
   ctrl+s: view filter-by-path options
   W: open diff menu
   ctrl+e: open diff menu
   @: open command log menu
   }: Increase the size of the context shown around changes in the diff view
   {: Decrease the size of the context shown around changes in the diff view
+  :: execute custom command
+  z: undo (via reflog) (experimental)
+  ctrl+z: redo (via reflog) (experimental)
+  P: push
+  p: pull
 
## List Panel Navigation
-  .: next page
   ,: previous page
+  .: next page
   <: scroll to top
-  >: scroll to bottom
   /: start search
+  >: scroll to bottom
+  H: scroll left
+  L: scroll right
   ]: next tab
   [: previous tab
 
@@ -43,8 +45,8 @@ _This file is auto-generated. To update, make the changes in the pkg/i18n direct
   space: checkout
-  o: create / open pull request
-  O: create / open pull request options
+  o: create pull request
+  O: create pull request options
   ctrl+y: copy pull request URL to clipboard
   c: checkout by name
   F: force checkout
@@ -116,93 +118,223 @@ _This file is auto-generated. To update, make the changes in the pkg/i18n direct
   o: open file
   e: edit file
   space: toggle file included in patch
+  a: toggle all files included in patch
   enter: enter file to add selected lines to the patch (or toggle directory collapsed)
   `: toggle file tree view
 
-## Commits Panel (Commits) +## Commits
-  ctrl+l: open log menu
+  ctrl+o: copy commit SHA to clipboard
+  ctrl+r: reset cherry-picked (copied) commits selection
+  b: view bisect options
   s: squash down
+  f: fixup commit
   r: reword commit
   R: reword commit with editor
-  g: reset to this commit
-  f: fixup commit
+  d: delete commit
+  e: edit commit
+  p: pick commit (when mid-rebase)
   F: create fixup commit for this commit
   S: squash all 'fixup!' commits above selected commit (autosquash)
-  d: delete commit
   ctrl+j: move commit down one
   ctrl+k: move commit up one
-  e: edit commit
-  A: amend commit with staged changes
-  p: pick commit (when mid-rebase)
-  t: revert commit
-  c: copy commit (cherry-pick)
-  ctrl+o: copy commit SHA to clipboard
-  C: copy commit range (cherry-pick)
   v: paste commits (cherry-pick)
-  enter: view commit's files
-  space: checkout commit
-  n: create new branch off of commit
+  A: amend commit with staged changes
+  a: reset commit author
+  t: revert commit
   T: tag commit
-  ctrl+r: reset cherry-picked (copied) commits selection
-  ctrl+y: copy commit message to clipboard
-  o: open commit in browser
-  b: view bisect options
-
- -## Commits Panel (Reflog Tab) - -
-  enter: view commit's files
+  ctrl+l: open log menu
   space: checkout commit
+  y: copy commit attribute
+  o: open commit in browser
+  n: create new branch off of commit
   g: view reset options
   c: copy commit (cherry-pick)
   C: copy commit range (cherry-pick)
-  ctrl+r: reset cherry-picked (copied) commits selection
-  ctrl+o: copy commit SHA to clipboard
+  enter: view selected item's files
 
-## Extras Panel - -
-  @: open command log menu
-
- -## Files Panel - -
-  ctrl+b: Filter commit files
-
- -## Files Panel (Files) +## Files
+  ctrl+o: copy the file name to the clipboard
+  ctrl+w: Toggle whether or not whitespace changes are shown in the diff view
+  d: view 'discard changes' options
+  space: toggle staged
+  ctrl+b: Filter files (staged/unstaged)
   c: commit changes
   w: commit changes without pre-commit hook
   A: amend last commit
   C: commit changes using git editor
-  space: toggle staged
-  d: view 'discard changes' options
   e: edit file
   o: open file
-  i: add to .gitignore
+  i: ignore or exclude file
   r: refresh files
-  s: stash changes
+  s: stash all changes
   S: view stash options
   a: stage/unstage all
-  D: view reset options
   enter: stage individual hunks/lines for file, or collapse/expand for directory
-  f: fetch
-  ctrl+o: copy the file name to the clipboard
   g: view upstream reset options
+  D: view reset options
   `: toggle file tree view
   M: open external merge tool (git mergetool)
-  ctrl+w: Toggle whether or not whitespace changes are shown in the diff view
+  f: fetch
 
-## Files Panel (Submodules) +## Local Branches + +
+  ctrl+o: copy branch name to clipboard
+  i: show git-flow options
+  space: checkout
+  n: new branch
+  o: create pull request
+  O: create pull request options
+  ctrl+y: copy pull request URL to clipboard
+  c: checkout by name
+  F: force checkout
+  d: delete branch
+  r: rebase checked-out branch onto this branch
+  M: merge into currently checked out branch
+  f: fast-forward this branch from its upstream
+  g: view reset options
+  R: rename branch
+  u: set/unset upstream
+  enter: view commits
+
+ +## Main Panel (Merging) + +
+  e: edit file
+  o: open file
+  â—„: select previous conflict
+  â–ş: select next conflict
+  â–˛: select previous hunk
+  â–Ľ: select next hunk
+  z: undo
+  M: open external merge tool (git mergetool)
+  space: pick hunk
+  b: pick all hunks
+  esc: return to files panel
+
+ +## Main Panel (Normal) + +
+  mouse wheel â–Ľ: scroll down (fn+up)
+  mouse wheel â–˛: scroll up (fn+down)
+
+ +## Main Panel (Patch Building) + +
+  â—„: select previous hunk
+  â–ş: select next hunk
+  v: toggle drag select
+  V: toggle drag select
+  a: toggle select hunk
+  ctrl+o: copy the selected text to the clipboard
+  o: open file
+  e: edit file
+  space: add/remove line(s) to patch
+  esc: exit custom patch builder
+
+ +## Main Panel (Staging) + +
+  â—„: select previous hunk
+  â–ş: select next hunk
+  v: toggle drag select
+  V: toggle drag select
+  a: toggle select hunk
+  ctrl+o: copy the selected text to the clipboard
+  o: open file
+  e: edit file
+  esc: return to files panel
+  tab: switch to other panel (staged/unstaged changes)
+  space: toggle line staged / unstaged
+  d: delete change (git reset)
+  E: edit hunk
+
+ +## Reflog + +
+  ctrl+o: copy commit SHA to clipboard
+  space: checkout commit
+  y: copy commit attribute
+  o: open commit in browser
+  n: create new branch off of commit
+  g: view reset options
+  c: copy commit (cherry-pick)
+  C: copy commit range (cherry-pick)
+  ctrl+r: reset cherry-picked (copied) commits selection
+  enter: view commits
+
+ +## Remote Branches + +
+  space: checkout
+  n: new branch
+  M: merge into currently checked out branch
+  r: rebase checked-out branch onto this branch
+  d: delete branch
+  u: set as upstream of checked-out branch
+  esc: Return to remotes list
+  g: view reset options
+  enter: view commits
+
+ +## Remotes + +
+  f: fetch remote
+  n: add new remote
+  d: remove remote
+  e: edit remote
+
+ +## Stash + +
+  space: apply
+  g: pop
+  d: drop
+  n: new branch
+  enter: view selected item's files
+
+ +## Status + +
+  e: edit config file
+  o: open config file
+  u: check for update
+  enter: switch to a recent repo
+  a: show all branch logs
+
+ +## Sub-commits + +
+  ctrl+o: copy commit SHA to clipboard
+  space: checkout commit
+  y: copy commit attribute
+  o: open commit in browser
+  n: create new branch off of commit
+  g: view reset options
+  c: copy commit (cherry-pick)
+  C: copy commit range (cherry-pick)
+  ctrl+r: reset cherry-picked (copied) commits selection
+  enter: view selected item's files
+
+ +## Submodules
   ctrl+o: copy submodule name to clipboard
@@ -215,94 +347,13 @@ _This file is auto-generated. To update, make the changes in the pkg/i18n direct
   b: view bulk submodule options
 
-## Main Panel (Merging) +## Tags
-  H: scroll left
-  L: scroll right
-  esc: return to files panel
-  M: open external merge tool (git mergetool)
-  space: pick hunk
-  b: pick all hunks
-  â—„: select previous conflict
-  â–ş: select next conflict
-  â–˛: select previous hunk
-  â–Ľ: select next hunk
-  z: undo
-
- -## Main Panel (Normal) - -
-  Ĺ: scroll down (fn+up)
-  Ĺ‘: scroll up (fn+down)
-
- -## Main Panel (Patch Building) - -
-  esc: exit line-by-line mode
-  o: open file
-  â–˛: select previous line
-  â–Ľ: select next line
-  â—„: select previous hunk
-  â–ş: select next hunk
-  ctrl+o: copy the selected text to the clipboard
-  space: add/remove line(s) to patch
-  v: toggle drag select
-  V: toggle drag select
-  a: toggle select hunk
-  H: scroll left
-  L: scroll right
-
- -## Main Panel (Staging) - -
-  esc: return to files panel
-  space: toggle line staged / unstaged
-  d: delete change (git reset)
-  tab: switch to other panel
-  o: open file
-  â–˛: select previous line
-  â–Ľ: select next line
-  â—„: select previous hunk
-  â–ş: select next hunk
-  ctrl+o: copy the selected text to the clipboard
-  e: edit file
-  o: open file
-  v: toggle drag select
-  V: toggle drag select
-  a: toggle select hunk
-  H: scroll left
-  L: scroll right
-  c: commit changes
-  w: commit changes without pre-commit hook
-  C: commit changes using git editor
-
- -## Menu Panel - -
-  esc: close menu
-
- -## Stash Panel - -
-  enter: view stash entry's files
-  space: apply
-  g: pop
-  d: drop
-  n: new branch
-
- -## Status Panel - -
-  e: edit config file
-  o: open config file
-  u: check for update
-  enter: switch to a recent repo
-  a: show all branch logs
+  space: checkout
+  d: delete tag
+  P: push tag
+  n: create tag
+  g: view reset options
+  enter: view commits
 
diff --git a/docs/keybindings/Keybindings_ja.md b/docs/keybindings/Keybindings_ja.md new file mode 100644 index 000000000..d22f6d150 --- /dev/null +++ b/docs/keybindings/Keybindings_ja.md @@ -0,0 +1,291 @@ +_This file is auto-generated. To update, make the changes in the pkg/i18n directory and then run `go run scripts/cheatsheet/main.go generate` from the project root._ + +# Lazygit ă‚­ăĽăイăłă‰ + +## ă‚°ă­ăĽăă«ă‚­ăĽăイăłă‰ + +
+  ctrl+r: 最近使用ă—ăźăŞăťă‚¸ăăŞă«ĺ‡ă‚Šć›żă
+  pgup: ăˇă‚¤ăłă‘ăŤă«ă‚’上ă«ă‚ąă‚Żă­ăĽă« (fn+up/shift+k)
+  pgdown: ăˇă‚¤ăłă‘ăŤă«ă‚’下ă«ă‚ąă‚Żă­ăĽă« (fn+down/shift+j)
+  m: view merge/rebase options
+  ctrl+p: view custom patch options
+  R: ăŞă•ă¬ăă‚·ăĄ
+  x: ăˇă‹ăĄăĽă‚’é–‹ăŹ
+  +: 次ă®ă‚ąă‚ŻăŞăĽăłă˘ăĽă‰ (normal/half/fullscreen)
+  _: 前ă®ă‚ąă‚ŻăŞăĽăłă˘ăĽă‰
+  ctrl+s: view filter-by-path options
+  W: ĺ·®ĺ†ăˇă‹ăĄăĽă‚’é–‹ăŹ
+  ctrl+e: ĺ·®ĺ†ăˇă‹ăĄăĽă‚’é–‹ăŹ
+  @: コăžăłă‰ă­ă‚°ăˇă‹ăĄăĽă‚’é–‹ăŹ
+  }: Increase the size of the context shown around changes in the diff view
+  {: Decrease the size of the context shown around changes in the diff view
+  :: カスタă ă‚łăžăłă‰ă‚’実行
+  z: アăłă‰ă‚Ą (via reflog) (experimental)
+  ctrl+z: ăŞă‰ă‚Ą (via reflog) (experimental)
+  P: push
+  p: pull
+
+ +## 一覧ă‘ăŤă«ă®ć“Ťä˝ś + +
+  ,: 前ă®ăšăĽă‚¸
+  .: 次ă®ăšăĽă‚¸
+  <: 最上é¨ăľă§ă‚ąă‚Żă­ăĽă«
+  /: 検索を開始
+  >: 最下é¨ăľă§ă‚ąă‚Żă­ăĽă«
+  H: 左スクă­ăĽă«
+  L: 右スクă­ăĽă«
+  ]: 次ă®ă‚żă–
+  [: 前ă®ă‚żă–
+
+ +## Stash + +
+  space: é©ç”¨
+  g: pop
+  d: drop
+  n: ć–°ă—ă„ă–ă©ăłăを作ć
+  enter: view selected item's files
+
+ +## Sub-commits + +
+  ctrl+o: コăźăăă®SHAをクăŞăă—ăśăĽă‰ă«ă‚łă”ăĽ
+  space: コăźăăă‚’ăă‚§ăクアウă
+  y: コăźăăă®ć…報をコă”ăĽ
+  o: ă–ă©ă‚¦ă‚¶ă§ă‚łăźăăă‚’é–‹ăŹ
+  n: コăźăăă«ă–ă©ăłăを作ć
+  g: view reset options
+  c: コăźăăをコă”㼠(cherry-pick)
+  C: コăźăăを範囲コă”㼠(cherry-pick)
+  ctrl+r: reset cherry-picked (copied) commits selection
+  enter: view selected item's files
+
+ +## コăźăă + +
+  ctrl+o: コăźăăă®SHAをクăŞăă—ăśăĽă‰ă«ă‚łă”ăĽ
+  ctrl+r: reset cherry-picked (copied) commits selection
+  b: view bisect options
+  s: squash down
+  f: fixup commit
+  r: コăźăăăˇăă‚»ăĽă‚¸ă‚’変更
+  R: エă‡ă‚Łă‚żă§ă‚łăźăăăˇăă‚»ăĽă‚¸ă‚’編集
+  d: コăźăăを削除
+  e: コăźăăを編集
+  p: pick commit (when mid-rebase)
+  F: ă“ă®ă‚łăźăăă«ĺŻľă™ă‚‹fixupコăźăăを作ć
+  S: squash all 'fixup!' commits above selected commit (autosquash)
+  ctrl+j: コăźăăă‚’1ă¤ä¸‹ă«ç§»ĺ‹•
+  ctrl+k: コăźăăă‚’1ă¤ä¸Šă«ç§»ĺ‹•
+  v: コăźăăを貼りä»ă‘ (cherry-pick)
+  A: スă†ăĽă‚¸ă•れăźĺ¤‰ć›´ă§amendコăźăă
+  a: reset commit author
+  t: コăźăăă‚’revert
+  T: タグを作ć
+  ctrl+l: ă­ă‚°ăˇă‹ăĄăĽă‚’é–‹ăŹ
+  space: コăźăăă‚’ăă‚§ăクアウă
+  y: コăźăăă®ć…報をコă”ăĽ
+  o: ă–ă©ă‚¦ă‚¶ă§ă‚łăźăăă‚’é–‹ăŹ
+  n: コăźăăă«ă–ă©ăłăを作ć
+  g: view reset options
+  c: コăźăăをコă”㼠(cherry-pick)
+  C: コăźăăを範囲コă”㼠(cherry-pick)
+  enter: view selected item's files
+
+ +## コăźăăă•ァイ㫠+ +
+  ctrl+o: コăźăăă•れăźă•ァイă«ĺŤă‚’クăŞăă—ăśăĽă‰ă«ă‚łă”ăĽ
+  c: checkout file
+  d: discard this commit's changes to this file
+  o: ă•ァイă«ă‚’é–‹ăŹ
+  e: ă•ァイă«ă‚’編集
+  space: toggle file included in patch
+  a: toggle all files included in patch
+  enter: enter file to add selected lines to the patch (or toggle directory collapsed)
+  `: ă•ァイă«ă„ăŞăĽă®čˇ¨ç¤şă‚’ĺ‡ă‚Šć›żă
+
+ +## サă–ă˘ă‚¸ăĄăĽă« + +
+  ctrl+o: サă–ă˘ă‚¸ăĄăĽă«ĺŤă‚’クăŞăă—ăśăĽă‰ă«ă‚łă”ăĽ
+  enter: サă–ă˘ă‚¸ăĄăĽă«ă‚’é–‹ăŹ
+  d: サă–ă˘ă‚¸ăĄăĽă«ă‚’削除
+  u: サă–ă˘ă‚¸ăĄăĽă«ă‚’ć›´ć–°
+  n: サă–ă˘ă‚¸ăĄăĽă«ă‚’新規追加
+  e: サă–ă˘ă‚¸ăĄăĽă«ă®URLă‚’ć›´ć–°
+  i: サă–ă˘ă‚¸ăĄăĽă«ă‚’ĺťćśźĺŚ–
+  b: view bulk submodule options
+
+ +## スă†ăĽă‚żă‚ą + +
+  e: 設定ă•ァイă«ă‚’編集
+  o: 設定ă•ァイă«ă‚’é–‹ăŹ
+  u: 更新を確認
+  enter: 最近使用ă—ăźăŞăťă‚¸ăăŞă«ĺ‡ă‚Šć›żă
+  a: ă™ăąă¦ă®ă–ă©ăłăă­ă‚°ă‚’表示
+
+ +## タグ + +
+  space: ăă‚§ăクアウă
+  d: タグを削除
+  P: タグをpush
+  n: タグを作ć
+  g: view reset options
+  enter: コăźăăを閲覧
+
+ +## ă•ァイ㫠+ +
+  ctrl+o: ă•ァイă«ĺŤă‚’クăŞăă—ăśăĽă‰ă«ă‚łă”ăĽ
+  ctrl+w: 空白文字ă®ĺ·®ĺ†ă®čˇ¨ç¤şćś‰ç„ˇă‚’ĺ‡ă‚Šć›żă
+  d: view 'discard changes' options
+  space: スă†ăĽă‚¸/アăłă‚ąă†ăĽă‚¸
+  ctrl+b: ă•ァイă«ă‚’ă•ィă«ă‚ż (スă†ăĽă‚¸/アăłă‚ąă†ăĽă‚¸)
+  c: 変更をコăźăă
+  w: pre-commită•ăクを実行ă›ăšă«ĺ¤‰ć›´ă‚’コăźăă
+  A: 最新ă®ă‚łăźăăă«amend
+  C: gitエă‡ă‚Łă‚żă‚’使用ă—ă¦ĺ¤‰ć›´ă‚’コăźăă
+  e: ă•ァイă«ă‚’編集
+  o: ă•ァイă«ă‚’é–‹ăŹ
+  i: ă•ァイă«ă‚’ignore
+  r: ă•ァイă«ă‚’ăŞă•ă¬ăă‚·ăĄ
+  s: 変更をstash
+  S: view stash options
+  a: ă™ăąă¦ă®ĺ¤‰ć›´ă‚’スă†ăĽă‚¸/アăłă‚ąă†ăĽă‚¸
+  enter: stage individual hunks/lines for file, or collapse/expand for directory
+  g: view upstream reset options
+  D: view reset options
+  `: ă•ァイă«ă„ăŞăĽă®čˇ¨ç¤şă‚’ĺ‡ă‚Šć›żă
+  M: git mergetoolă‚’é–‹ăŹ
+  f: fetch
+
+ +## ă–ă©ăłă + +
+  ctrl+o: ă–ă©ăłăĺŤă‚’クăŞăă—ăśăĽă‰ă«ă‚łă”ăĽ
+  i: show git-flow options
+  space: ăă‚§ăクアウă
+  n: ć–°ă—ă„ă–ă©ăłăを作ć
+  o: Pull Requestを作ć
+  O: create pull request options
+  ctrl+y: Pull Requestă®URLをクăŞăă—ăśăĽă‰ă«ă‚łă”ăĽ
+  c: checkout by name
+  F: force checkout
+  d: ă–ă©ăłăを削除
+  r: rebase checked-out branch onto this branch
+  M: 現在ă®ă–ă©ăłăă«ăžăĽă‚¸
+  f: fast-forward this branch from its upstream
+  g: view reset options
+  R: ă–ă©ăłăĺŤă‚’変更
+  u: set/unset upstream
+  enter: コăźăăを閲覧
+
+ +## ăˇă‚¤ăłă‘ăŤă« (Merging) + +
+  e: ă•ァイă«ă‚’編集
+  o: ă•ァイă«ă‚’é–‹ăŹ
+  â—„: 前ă®ă‚łăłă•ăŞă‚Żăă‚’é¸ćŠž
+  â–ş: 次ă®ă‚łăłă•ăŞă‚Żăă‚’é¸ćŠž
+  â–˛: 前ă®hunkă‚’é¸ćŠž
+  â–Ľ: 次ă®hunkă‚’é¸ćŠž
+  z: アăłă‰ă‚Ą
+  M: git mergetoolă‚’é–‹ăŹ
+  space: pick hunk
+  b: pick all hunks
+  esc: ă•ァイă«ä¸€č¦§ă«ć»ă‚‹
+
+ +## ăˇă‚¤ăłă‘ăŤă« (Normal) + +
+  mouse wheel â–Ľ: 下ă«ă‚ąă‚Żă­ăĽă« (fn+up)
+  mouse wheel â–˛: 上ă«ă‚ąă‚Żă­ăĽă« (fn+down)
+
+ +## ăˇă‚¤ăłă‘ăŤă« (Patch Building) + +
+  â—„: 前ă®hunkă‚’é¸ćŠž
+  â–ş: 次ă®hunkă‚’é¸ćŠž
+  v: 範囲é¸ćŠžă‚’ĺ‡ă‚Šć›żă
+  V: 範囲é¸ćŠžă‚’ĺ‡ă‚Šć›żă
+  a: hunké¸ćŠžă‚’ĺ‡ă‚Šć›żă
+  ctrl+o: é¸ćŠžă•れăźă†ă‚­ă‚ąăをクăŞăă—ăśăĽă‰ă«ă‚łă”ăĽ
+  o: ă•ァイă«ă‚’é–‹ăŹ
+  e: ă•ァイă«ă‚’編集
+  space: 行をă‘ăăă«čż˝ĺŠ /削除
+  esc: exit custom patch builder
+
+ +## ăˇă‚¤ăłă‘ăŤă« (Staging) + +
+  â—„: 前ă®hunkă‚’é¸ćŠž
+  â–ş: 次ă®hunkă‚’é¸ćŠž
+  v: 範囲é¸ćŠžă‚’ĺ‡ă‚Šć›żă
+  V: 範囲é¸ćŠžă‚’ĺ‡ă‚Šć›żă
+  a: hunké¸ćŠžă‚’ĺ‡ă‚Šć›żă
+  ctrl+o: é¸ćŠžă•れăźă†ă‚­ă‚ąăをクăŞăă—ăśăĽă‰ă«ă‚łă”ăĽ
+  o: ă•ァイă«ă‚’é–‹ăŹ
+  e: ă•ァイă«ă‚’編集
+  esc: ă•ァイă«ä¸€č¦§ă«ć»ă‚‹
+  tab: ă‘ăŤă«ă‚’ĺ‡ă‚Šć›żă
+  space: é¸ćŠžčˇŚă‚’ă‚ąă†ăĽă‚¸/アăłă‚ąă†ăĽă‚¸
+  d: 変更を削除 (git reset)
+  E: edit hunk
+
+ +## ăŞă˘ăĽă + +
+  f: ăŞă˘ăĽăă‚’fetch
+  n: ăŞă˘ăĽăを新規追加
+  d: ăŞă˘ăĽăを削除
+  e: ăŞă˘ăĽăを編集
+
+ +## ăŞă˘ăĽăă–ă©ăłă + +
+  space: ăă‚§ăクアウă
+  n: ć–°ă—ă„ă–ă©ăłăを作ć
+  M: 現在ă®ă–ă©ăłăă«ăžăĽă‚¸
+  r: rebase checked-out branch onto this branch
+  d: ă–ă©ăłăを削除
+  u: set as upstream of checked-out branch
+  esc: ăŞă˘ăĽă一覧ă«ć»ă‚‹
+  g: view reset options
+  enter: コăźăăを閲覧
+
+ +## 参照ă­ă‚° + +
+  ctrl+o: コăźăăă®SHAをクăŞăă—ăśăĽă‰ă«ă‚łă”ăĽ
+  space: コăźăăă‚’ăă‚§ăクアウă
+  y: コăźăăă®ć…報をコă”ăĽ
+  o: ă–ă©ă‚¦ă‚¶ă§ă‚łăźăăă‚’é–‹ăŹ
+  n: コăźăăă«ă–ă©ăłăを作ć
+  g: view reset options
+  c: コăźăăをコă”㼠(cherry-pick)
+  C: コăźăăを範囲コă”㼠(cherry-pick)
+  ctrl+r: reset cherry-picked (copied) commits selection
+  enter: コăźăăを閲覧
+
diff --git a/docs/keybindings/Keybindings_ko.md b/docs/keybindings/Keybindings_ko.md new file mode 100644 index 000000000..690cd5790 --- /dev/null +++ b/docs/keybindings/Keybindings_ko.md @@ -0,0 +1,291 @@ +_This file is auto-generated. To update, make the changes in the pkg/i18n directory and then run `go run scripts/cheatsheet/main.go generate` from the project root._ + +# Lazygit 키 바인딩 + +## 글로벌 키 바인딩 + +
+  ctrl+r: ěµśę·Ľě— ě‚¬ěš©í•ś 저장소로 ě „í™
+  pgup: 메인 패ë„ěť„ 위로 스í¬ëˇ¤ (fn+up/shift+k)
+  pgdown: 메인 패ë„ěť„ ě•„ëžëˇśëˇś 스í¬ëˇ¤ (fn+down/shift+j)
+  m: view merge/rebase options
+  ctrl+p: 커스텀 Patch ěµě… 보기
+  R: ě로고침
+  x: 매뉴 열기
+  +: 다음 스í¬ë¦° 모드 (normal/half/fullscreen)
+  _: ěť´ě „ 스í¬ë¦° 모드
+  ctrl+s: view filter-by-path options
+  W: Diff 메뉴 열기
+  ctrl+e: Diff 메뉴 열기
+  @: 명령어 로그 메뉴 열기
+  }: diff ëł´ę¸°ěť ëł€ę˛˝ 사항 ěŁĽěś„ě— í‘śě‹śë는 ě»¨í…ŤěŠ¤íŠ¸ěť í¬ę¸°ëĄĽ ëŠë¦¬ę¸°
+  {: diff ëł´ę¸°ěť ëł€ę˛˝ 사항 ěŁĽěś„ě— í‘śě‹śë는 컨텍스트 í¬ę¸° 줄이기
+  :: execute custom command
+  z: ë돌리기 (reflog) (실í—ě )
+  ctrl+z: 다시 실행 (reflog) (실í—ě )
+  P: 푸시
+  p: 업데이트
+
+ +## List Panel Navigation + +
+  ,: ěť´ě „ íŽěť´ě§€
+  .: 다음 íŽěť´ě§€
+  <: 맨 위로 스í¬ëˇ¤ 
+  /: ę˛€ě‰ ě‹śěž‘
+  >: 맨 ě•„ëžëˇś 스í¬ëˇ¤ 
+  H: ěš° 스í¬ëˇ¤
+  L: 좌 스í¬ëˇ¤
+  ]: ěť´ě „ í­
+  [: 다음 í­
+
+ +## Reflog + +
+  ctrl+o: 커밋 SHA를 í´ë¦˝ëł´ë“śě— 복사
+  space: 커밋을 체í¬ě•„ě›
+  y: 커밋 attribute 복사
+  o: 브라우저ě—서 커밋 열기
+  n: 커밋ě—서 ě 브랜ěąëĄĽ ë§Śë“­ë‹ë‹¤.
+  g: view reset options
+  c: 커밋을 복사 (cherry-pick)
+  C: 커밋을 범위로 복사 (cherry-pick)
+  ctrl+r: reset cherry-picked (copied) commits selection
+  enter: 커밋 보기
+
+ +## Stash + +
+  space: ě ěš©
+  g: pop
+  d: drop
+  n: ě ë¸Śëžśěą ěťě„±
+  enter: view selected item's files
+
+ +## Sub-commits + +
+  ctrl+o: 커밋 SHA를 í´ë¦˝ëł´ë“śě— 복사
+  space: 커밋을 체í¬ě•„ě›
+  y: 커밋 attribute 복사
+  o: 브라우저ě—서 커밋 열기
+  n: 커밋ě—서 ě 브랜ěąëĄĽ ë§Śë“­ë‹ë‹¤.
+  g: view reset options
+  c: 커밋을 복사 (cherry-pick)
+  C: 커밋을 범위로 복사 (cherry-pick)
+  ctrl+r: reset cherry-picked (copied) commits selection
+  enter: view selected item's files
+
+ +## 메인 íŚ¨ë„ (Merging) + +
+  e: 파일 편집
+  o: 파일 닫기
+  â—„: ěť´ě „ 충돌을 ě„ íť
+  â–ş: 다음 충돌을 ě„ íť
+  â–˛: ěť´ě „ hunk를 ě„ íť
+  â–Ľ: 다음 hunk를 ě„ íť
+  z: ë돌리기
+  M: git mergetool를 열기
+  space: pick hunk
+  b: pick all hunks
+  esc: 파일 목록으로 돌아가기
+
+ +## 메인 íŚ¨ë„ (Normal) + +
+  mouse wheel â–Ľ: ě•„ëžëˇś 스í¬ëˇ¤ (fn+up)
+  mouse wheel â–˛: 위로 스í¬ëˇ¤ (fn+down)
+
+ +## 메인 íŚ¨ë„ (Patch Building) + +
+  â—„: ěť´ě „ hunk를 ě„ íť
+  â–ş: 다음 hunk를 ě„ íť
+  v: 드ëžę·¸ ě„ íť ě „í™
+  V: 드ëžę·¸ ě„ íť ě „í™
+  a: toggle select hunk
+  ctrl+o: ě„ íťí•ś 텍스트를 í´ë¦˝ëł´ë“śě— 복사
+  o: 파일 닫기
+  e: 파일 편집
+  space: line(s)ěť„ 패ěąě— 추가/ě‚­ě ś
+  esc: exit custom patch builder
+
+ +## 메인 íŚ¨ë„ (Staging) + +
+  â—„: ěť´ě „ hunk를 ě„ íť
+  â–ş: 다음 hunk를 ě„ íť
+  v: 드ëžę·¸ ě„ íť ě „í™
+  V: 드ëžę·¸ ě„ íť ě „í™
+  a: toggle select hunk
+  ctrl+o: ě„ íťí•ś 텍스트를 í´ë¦˝ëł´ë“śě— 복사
+  o: 파일 닫기
+  e: 파일 편집
+  esc: 파일 목록으로 돌아가기
+  tab: íŚ¨ë„ ě „í™
+  space: ě„ íťí•ś 행을 staged / unstaged
+  d: 변경을 삭제 (git reset)
+  E: edit hunk
+
+ +## ë¸Śëžśěą + +
+  ctrl+o: 브랜ěąëŞ…ěť„ í´ë¦˝ëł´ë“śě— 복사
+  i: git-flow ěµě… 보기
+  space: 체í¬ě•„ě›
+  n: ě ë¸Śëžśěą ěťě„±
+  o: í’€ 리í€ěŠ¤íŠ¸ ěťě„±
+  O: í’€ 리í€ěŠ¤íŠ¸ ěťě„± ěµě…
+  ctrl+y: í’€ 리í€ěŠ¤íŠ¸ URLěť„ í´ë¦˝ëł´ë“śě— 복사
+  c: 이름으로 체í¬ě•„ě›
+  F: ę°•ě ś 체í¬ě•„ě›
+  d: ë¸Śëžśěą ě‚­ě ś
+  r: 체í¬ě•„ě›ëś 브랜ěąëĄĽ ěť´ 브랜ěąě— 리베이스
+  M: í„재 브랜ěąě— 병합
+  f: fast-forward this branch from its upstream
+  g: view reset options
+  R: ë¸Śëžśěą ěť´ë¦„ 변경
+  u: set/unset upstream
+  enter: 커밋 보기
+
+ +## ěíś + +
+  e: 설정 파일 ěě •
+  o: 설정 파일 열기
+  u: 업데이트 확인
+  enter: ěµśę·Ľě— ě‚¬ěš©í•ś 저장소로 ě „í™
+  a: 모든 ë¸Śëžśěą ëˇśę·¸ 표시
+
+ +## ě„śë¸ŚëŞ¨ë“ + +
+  ctrl+o: ě„śë¸ŚëŞ¨ë“ ěť´ë¦„ěť„ í´ë¦˝ëł´ë“śě— 복사
+  enter: ě„śë¸ŚëŞ¨ë“ ě—´ę¸°
+  d: ě„śë¸ŚëŞ¨ë“ ě‚­ě ś
+  u: ě„śë¸ŚëŞ¨ë“ ě—…ëŤ°ěť´íŠ¸
+  n: ě로운 ě„śë¸ŚëŞ¨ë“ ě¶”ę°€
+  e: 서브모ë“ěť URLěť„ ěě •
+  i: ě„śë¸ŚëŞ¨ë“ ě´ę¸°í™”
+  b: view bulk submodule options
+
+ +## ě›ę˛© + +
+  f: ě›ę˛©ěť„ 업데이트
+  n: ě로운 Remote 추가
+  d: Remote를 삭제
+  e: Remote를 ěě •
+
+ +## ě›ę˛© ë¸Śëžśěą + +
+  space: 체í¬ě•„ě›
+  n: ě ë¸Śëžśěą ěťě„±
+  M: í„재 브랜ěąě— 병합
+  r: 체í¬ě•„ě›ëś 브랜ěąëĄĽ ěť´ 브랜ěąě— 리베이스
+  d: ë¸Śëžśěą ě‚­ě ś
+  u: set as upstream of checked-out branch
+  esc: ě›ę˛©ëŞ©ëˇťěśĽëˇś 돌아가기
+  g: view reset options
+  enter: 커밋 보기
+
+ +## 커밋 + +
+  ctrl+o: 커밋 SHA를 í´ë¦˝ëł´ë“śě— 복사
+  ctrl+r: reset cherry-picked (copied) commits selection
+  b: bisect ěµě… 보기
+  s: squash down
+  f: fixup commit
+  r: 커밋메시지 변경
+  R: ě—디터ě—서 커밋메시지 ěě •
+  d: 커밋 삭제
+  e: 커밋을 편집
+  p: pick commit (when mid-rebase)
+  F: create fixup commit for this commit
+  S: squash all 'fixup!' commits above selected commit (autosquash)
+  ctrl+j: 커밋을 1ę°ś ě•„ëžëˇś 이동
+  ctrl+k: 커밋을 1개 위로 이동
+  v: 커밋을 붙여넣기 (cherry-pick)
+  A: amend commit with staged changes
+  a: reset commit author
+  t: 커밋 ë돌리기
+  T: tag commit
+  ctrl+l: 로그 메뉴 열기
+  space: 커밋을 체í¬ě•„ě›
+  y: 커밋 attribute 복사
+  o: 브라우저ě—서 커밋 열기
+  n: 커밋ě—서 ě 브랜ěąëĄĽ ë§Śë“­ë‹ë‹¤.
+  g: view reset options
+  c: 커밋을 복사 (cherry-pick)
+  C: 커밋을 범위로 복사 (cherry-pick)
+  enter: view selected item's files
+
+ +## 커밋 파일 + +
+  ctrl+o: 커밋한 파일명을 í´ë¦˝ëł´ë“śě— 복사
+  c: checkout file
+  d: discard this commit's changes to this file
+  o: 파일 닫기
+  e: 파일 편집
+  space: toggle file included in patch
+  a: toggle all files included in patch
+  enter: enter file to add selected lines to the patch (or toggle directory collapsed)
+  `: 파일 트리뷰로 ě „í™
+
+ +## íśę·¸ + +
+  space: 체í¬ě•„ě›
+  d: íśę·¸ ě‚­ě ś
+  P: íśę·¸ëĄĽ push
+  n: íśę·¸ëĄĽ ěťě„±
+  g: view reset options
+  enter: 커밋 보기
+
+ +## 파일 + +
+  ctrl+o: 파일명을 í´ë¦˝ëł´ë“śě— 복사
+  ctrl+w: 공백문ěžëĄĽ Diff ë·°ě—서 표시 여부 ě „í™
+  d: view 'discard changes' options
+  space: Staged ě „í™
+  ctrl+b: 파일을 í•„í„°í•기 (Staged/unstaged)
+  c: 커밋 변경내용
+  w: commit changes without pre-commit hook
+  A: ë§ě§€ë§› 커밋 ěě •
+  C: Git 편집기를 사용í•ě—¬ 변경 내용을 커밋합ë‹ë‹¤.
+  e: 파일 편집
+  o: 파일 닫기
+  i: ignore file
+  r: 파일 ě로고침
+  s: 변경사항을 Stash
+  S: Stash ěµě… 보기
+  a: 모든 변경을 Staged/unstaged으로 ě „í™
+  enter: stage individual hunks/lines for file, or collapse/expand for directory
+  g: view upstream reset options
+  D: view reset options
+  `: 파일 트리뷰로 ě „í™
+  M: git mergetool를 열기
+  f: fetch
+
diff --git a/docs/keybindings/Keybindings_nl.md b/docs/keybindings/Keybindings_nl.md index 6f05b66b3..15484be73 100644 --- a/docs/keybindings/Keybindings_nl.md +++ b/docs/keybindings/Keybindings_nl.md @@ -5,109 +5,92 @@ _This file is auto-generated. To update, make the changes in the pkg/i18n direct ## Globale Sneltoetsen
-  ctrl+r: wissel naar een recente repo ()
-  pgup: scroll naar beneden vanaf hoofdpaneel (fn+up)
-  pgdown: scroll naar beneden vanaf hoofdpaneel (fn+down)
+  ctrl+r: wissel naar een recente repo
+  pgup: scroll naar beneden vanaf hoofdpaneel (fn+up/shift+k)
+  pgdown: scroll naar beneden vanaf hoofdpaneel (fn+down/shift+j)
   m: bekijk merge/rebase opties
   ctrl+p: bekijk aangepaste patch opties
-  P: push
-  p: pull
   R: verversen
   x: open menu
-  z: ongedaan maken (via reflog) (experimenteel)
-  ctrl+z: redo (via reflog) (experimenteel)
   +: volgende scherm modus (normaal/half/groot)
   _: vorige scherm modus
-  :: voor aangepaste commando uit
   ctrl+s: bekijk scoping opties
   W: open diff menu
   ctrl+e: open diff menu
   @: open command log menu
   }: Increase the size of the context shown around changes in the diff view
   {: Decrease the size of the context shown around changes in the diff view
+  :: voer aangepaste commando uit
+  z: ongedaan maken (via reflog) (experimenteel)
+  ctrl+z: redo (via reflog) (experimenteel)
+  P: push
+  p: pull
 
## Lijstpaneel Navigatie
-  .: volgende pagina
   ,: vorige pagina
+  .: volgende pagina
   <: scroll naar boven
-  >: scroll naar beneden
   /: start met zoeken
+  >: scroll naar beneden
+  H: scroll left
+  L: scroll right
   ]: volgende tabblad
   [: vorige tabblad
 
-## Branches Paneel (Branches Tabblad) +## Bestanden
+  ctrl+o: kopieer de bestandsnaam naar het klembord
+  ctrl+w: Toggle whether or not whitespace changes are shown in the diff view
+  d: bekijk 'veranderingen ongedaan maken' opties
+  space: toggle staged
+  ctrl+b: Filter files (staged/unstaged)
+  c: commit veranderingen
+  w: commit veranderingen zonder pre-commit hook
+  A: wijzig laatste commit
+  C: commit veranderingen met de git editor
+  e: verander bestand
+  o: open bestand
+  i: ignore or exclude file
+  r: refresh bestanden
+  s: stash-bestanden
+  S: bekijk stash opties
+  a: toggle staged alle
+  enter: stage individuele hunks/lijnen
+  g: bekijk upstream reset opties
+  D: bekijk reset opties
+  `: toggle bestandsboom weergave
+  M: open external merge tool (git mergetool)
+  f: fetch
+
+ +## Branches + +
+  ctrl+o: kopieer branch name naar klembord
+  i: laat git-flow opties zien
   space: uitchecken
-  o: maak of laat een pull-request zien
+  n: nieuwe branch
+  o: maak een pull-request
   O: bekijk opties voor pull-aanvraag
   ctrl+y: kopieer de URL van het pull-verzoek naar het klembord
   c: uitchecken bij naam
   F: forceer checkout
-  n: nieuwe branch
   d: verwijder branch
   r: rebase branch
   M: merge in met huidige checked out branch
-  i: laat git-flow opties zien
   f: fast-forward deze branch vanaf zijn upstream
   g: bekijk reset opties
   R: hernoem branch
-  ctrl+o: kopieer branch name naar klembord
+  u: set/unset upstream
   enter: bekijk commits
 
-## Branches Paneel (Remote Branches (in Remotes tabblad)) - -
-  esc: Ga terug naar remotes lijst
-  g: bekijk reset opties
-  enter: bekijk commits
-  space: uitchecken
-  n: nieuwe branch
-  M: merge in met huidige checked out branch
-  d: verwijder branch
-  r: rebase branch
-  u: stel in als upstream van uitgecheckte branch
-
- -## Branches Paneel (Remotes Tabblad) - -
-  f: fetch remote
-  n: voeg een nieuwe remote toe
-  d: verwijder remote
-  e: wijzig remote
-
- -## Branches Paneel (Sub-commits) - -
-  enter: bekijk gecommite bestanden
-  space: checkout commit
-  g: bekijk reset opties
-  n: nieuwe branch
-  c: kopieer commit (cherry-pick)
-  C: kopieer commit reeks (cherry-pick)
-  ctrl+r: reset cherry-picked (gekopieerde) commits selectie
-  ctrl+o: kopieer commit SHA naar klembord
-
- -## Branches Paneel (Tags Tabblad) - -
-  space: uitchecken
-  d: verwijder tag
-  P: push tag
-  n: creëer tag
-  g: bekijk reset opties
-  enter: bekijk commits
-
- -## Commit bestanden Paneel +## Commit bestanden
   ctrl+o: kopieer de vastgelegde bestandsnaam naar het klembord
@@ -116,93 +99,174 @@ _This file is auto-generated. To update, make the changes in the pkg/i18n direct
   o: open bestand
   e: verander bestand
   space: toggle bestand inbegrepen in patch
+  a: toggle all files included in patch
   enter: enter bestand om geselecteerde regels toe te voegen aan de patch
   `: toggle bestandsboom weergave
 
-## Commits Paneel (Commits) +## Commits
-  ctrl+l: open log menu
+  ctrl+o: kopieer commit SHA naar klembord
+  ctrl+r: reset cherry-picked (gekopieerde) commits selectie
+  b: view bisect options
   s: squash beneden
+  f: Fixup commit
   r: hernoem commit
   R: hernoem commit met editor
-  g: reset naar deze commit
-  f: Fixup commit
+  d: verwijder commit
+  e: wijzig commit
+  p: kies commit (wanneer midden in rebase)
   F: creëer fixup commit voor deze commit
   S: squash bovenstaande commits
-  d: verwijder commit
   ctrl+j: verplaats commit 1 naar beneden
   ctrl+k: verplaats commit 1 naar boven
-  e: wijzig commit
-  A: wijzig commit met staged veranderingen
-  p: kies commit (wanneer midden in rebase)
-  t: commit ongedaan maken
-  c: kopieer commit (cherry-pick)
-  ctrl+o: kopieer commit SHA naar klembord
-  C: kopieer commit reeks (cherry-pick)
   v: plak commits (cherry-pick)
-  enter: bekijk gecommite bestanden
-  space: checkout commit
-  n: creëer nieuwe branch van commit
+  A: wijzig commit met staged veranderingen
+  a: reset commit author
+  t: commit ongedaan maken
   T: tag commit
-  ctrl+r: reset cherry-picked (gekopieerde) commits selectie
-  ctrl+y: kopieer commit bericht naar klembord
+  ctrl+l: open log menu
+  space: checkout commit
+  y: copy commit attribute
   o: open commit in browser
-  b: view bisect options
+  n: creëer nieuwe branch van commit
+  g: bekijk reset opties
+  c: kopieer commit (cherry-pick)
+  C: kopieer commit reeks (cherry-pick)
+  enter: bekijk gecommite bestanden
 
-## Commits Paneel (Reflog Tabblad) +## Mergen
-  enter: bekijk gecommite bestanden
+  e: verander bestand
+  o: open bestand
+  â—„: selecteer voorgaand conflict
+  â–ş: selecteer volgende conflict
+  â–˛: selecteer bovenste hunk
+  â–Ľ: selecteer onderste hunk
+  z: ongedaan maken
+  M: open external merge tool (git mergetool)
+  space: kies hunk
+  b: kies bijde hunks
+  esc: ga terug naar het bestanden paneel
+
+ +## Normaal + +
+  mouse wheel â–Ľ: scroll omlaag (fn+up)
+  mouse wheel â–˛: scroll omhoog (fn+down)
+
+ +## Patch Bouwen + +
+  â—„: selecteer de vorige hunk
+  â–ş: selecteer de volgende hunk
+  v: toggle drag selecteer
+  V: toggle drag selecteer
+  a: toggle selecteer hunk
+  ctrl+o: copy the selected text to the clipboard
+  o: open bestand
+  e: verander bestand
+  space: voeg toe/verwijder lijn(en) in patch
+  esc: sluit lijn-bij-lijn modus
+
+ +## Reflog + +
+  ctrl+o: kopieer commit SHA naar klembord
   space: checkout commit
+  y: copy commit attribute
+  o: open commit in browser
+  n: creëer nieuwe branch van commit
   g: bekijk reset opties
   c: kopieer commit (cherry-pick)
   C: kopieer commit reeks (cherry-pick)
   ctrl+r: reset cherry-picked (gekopieerde) commits selectie
-  ctrl+o: kopieer commit SHA naar klembord
+  enter: bekijk commits
 
-## Extras Paneel +## Remote Branches
-  @: open command log menu
+  space: uitchecken
+  n: nieuwe branch
+  M: merge in met huidige checked out branch
+  r: rebase branch
+  d: verwijder branch
+  u: stel in als upstream van uitgecheckte branch
+  esc: ga terug naar remotes lijst
+  g: bekijk reset opties
+  enter: bekijk commits
 
-## Bestanden Paneel +## Remotes
-  ctrl+b: Commit dossiers filteren
+  f: fetch remote
+  n: voeg een nieuwe remote toe
+  d: verwijder remote
+  e: wijzig remote
 
-## Bestanden Paneel (Bestanden) +## Staging
-  c: Commit veranderingen
-  w: commit veranderingen zonder pre-commit hook
-  A: wijzig laatste commit
-  C: commit veranderingen met de git editor
-  space: toggle staged
-  d: bekijk 'veranderingen ongedaan maken' opties
-  e: verander bestand
+  â—„: selecteer de vorige hunk
+  â–ş: selecteer de volgende hunk
+  v: toggle drag selecteer
+  V: toggle drag selecteer
+  a: toggle selecteer hunk
+  ctrl+o: copy the selected text to the clipboard
   o: open bestand
-  i: voeg toe aan .gitignore
-  r: refresh bestanden
-  s: stash-bestanden
-  S: bekijk stash opties
-  a: toggle staged alle
-  D: bekijk reset opties
-  enter: stage individuele hunks/lijnen
-  f: fetch
-  ctrl+o: kopieer de bestandsnaam naar het klembord
-  g: bekijk upstream reset opties
-  `: toggle bestandsboom weergave
-  M: open external merge tool (git mergetool)
-  ctrl+w: Toggle whether or not whitespace changes are shown in the diff view
+  e: verander bestand
+  esc: ga terug naar het bestanden paneel
+  tab: ga naar een ander paneel
+  space: toggle lijnen staged / unstaged
+  d: verwijdert change (git reset)
+  E: edit hunk
 
-## Bestanden Paneel (Submodules) +## Stash + +
+  space: toepassen
+  g: pop
+  d: laten vallen
+  n: nieuwe branch
+  enter: bekijk gecommite bestanden
+
+ +## Status + +
+  e: verander config bestand
+  o: open config bestand
+  u: check voor updates
+  enter: wissel naar een recente repo
+  a: alle logs van de branch laten zien
+
+ +## Sub-commits + +
+  ctrl+o: kopieer commit SHA naar klembord
+  space: checkout commit
+  y: copy commit attribute
+  o: open commit in browser
+  n: creëer nieuwe branch van commit
+  g: bekijk reset opties
+  c: kopieer commit (cherry-pick)
+  C: kopieer commit reeks (cherry-pick)
+  ctrl+r: reset cherry-picked (gekopieerde) commits selectie
+  enter: bekijk gecommite bestanden
+
+ +## Submodules
   ctrl+o: kopieer submodule naam naar klembord
@@ -215,94 +279,13 @@ _This file is auto-generated. To update, make the changes in the pkg/i18n direct
   b: bekijk bulk submodule opties
 
-## Hoofd Paneel (Mergen) +## Tags
-  H: scroll left
-  L: scroll right
-  esc: ga terug naar het bestanden paneel
-  M: open external merge tool (git mergetool)
-  space: kies hunk
-  b: kies bijde hunks
-  â—„: selecteer voorgaand conflict
-  â–ş: selecteer volgende conflict
-  â–˛: selecteer bovenste hunk
-  â–Ľ: selecteer onderste hunk
-  z: ongedaan maken
-
- -## Hoofd Paneel (Normaal) - -
-  Ĺ: scroll omlaag (fn+up)
-  Ĺ‘: scroll omhoog (fn+down)
-
- -## Hoofd Paneel (Patch Bouwen) - -
-  esc: sluit lijn-bij-lijn modus
-  o: open bestand
-  â–˛: selecteer de vorige lijn
-  â–Ľ: selecteer de volgende lijn
-  â—„: selecteer de vorige hunk
-  â–ş: selecteer de volgende hunk
-  ctrl+o: copy the selected text to the clipboard
-  space: voeg toe/verwijder lijn(en) in patch
-  v: toggle drag selecteer
-  V: toggle drag selecteer
-  a: toggle selecteer hunk
-  H: scroll left
-  L: scroll right
-
- -## Hoofd Paneel (Staging) - -
-  esc: ga terug naar het bestanden paneel
-  space: toggle lijnen staged / unstaged
-  d: verwijdert change (git reset)
-  tab: ga naar een ander paneel
-  o: open bestand
-  â–˛: selecteer de vorige lijn
-  â–Ľ: selecteer de volgende lijn
-  â—„: selecteer de vorige hunk
-  â–ş: selecteer de volgende hunk
-  ctrl+o: copy the selected text to the clipboard
-  e: verander bestand
-  o: open bestand
-  v: toggle drag selecteer
-  V: toggle drag selecteer
-  a: toggle selecteer hunk
-  H: scroll left
-  L: scroll right
-  c: Commit veranderingen
-  w: commit veranderingen zonder pre-commit hook
-  C: commit veranderingen met de git editor
-
- -## Menu Paneel - -
-  esc: sluit menu
-
- -## Stash Paneel - -
-  enter: bekijk bestanden van stash entry
-  space: toepassen
-  g: pop
-  d: laten vallen
-  n: nieuwe branch
-
- -## Status Paneel - -
-  e: verander config bestand
-  o: open config bestand
-  u: check voor updates
-  enter: wissel naar een recente repo
-  a: alle logs van de branch laten zien
+  space: uitchecken
+  d: verwijder tag
+  P: push tag
+  n: creëer tag
+  g: bekijk reset opties
+  enter: bekijk commits
 
diff --git a/docs/keybindings/Keybindings_pl.md b/docs/keybindings/Keybindings_pl.md index e97e1dd88..9cfc64294 100644 --- a/docs/keybindings/Keybindings_pl.md +++ b/docs/keybindings/Keybindings_pl.md @@ -5,109 +5,140 @@ _This file is auto-generated. To update, make the changes in the pkg/i18n direct ## Globalne
-  ctrl+r: switch to a recent repo ()
-  pgup: scroll up main panel (fn+up)
-  pgdown: scroll down main panel (fn+down)
+  ctrl+r: switch to a recent repo
+  pgup: scroll up main panel (fn+up/shift+k)
+  pgdown: scroll down main panel (fn+down/shift+j)
   m: widok scalenia/opcje zmiany bazy
   ctrl+p: view custom patch options
-  P: push
-  p: pull
   R: odśwież
   x: open menu
-  z: undo (via reflog) (experimental)
-  ctrl+z: redo (via reflog) (experimental)
   +: next screen mode (normal/half/fullscreen)
   _: prev screen mode
-  :: wykonaj własną komendę
   ctrl+s: view filter-by-path options
   W: open diff menu
   ctrl+e: open diff menu
   @: open command log menu
   }: Increase the size of the context shown around changes in the diff view
   {: Decrease the size of the context shown around changes in the diff view
+  :: wykonaj własną komendę
+  z: undo (via reflog) (experimental)
+  ctrl+z: redo (via reflog) (experimental)
+  P: push
+  p: pull
 
## List Panel Navigation
-  .: next page
   ,: previous page
+  .: next page
   <: scroll to top
-  >: scroll to bottom
   /: start search
+  >: scroll to bottom
+  H: scroll left
+  L: scroll right
   ]: next tab
   [: previous tab
 
-## Gałęzie Panel (Branches Tab) +## Commity
+  ctrl+o: copy commit SHA to clipboard
+  ctrl+r: reset cherry-picked (copied) commits selection
+  b: view bisect options
+  s: ściśnij
+  f: napraw commit
+  r: zmień nazwę commita
+  R: zmień nazwę commita w edytorze
+  d: usuń commit
+  e: edytuj commit
+  p: wybierz commit (podczas zmiany bazy)
+  F: utwĂłrz commit naprawczy dla tego commita
+  S: spłaszcz wszystkie commity naprawcze powyżej zaznaczonych commitów (autosquash)
+  ctrl+j: przenieś commit 1 w dół
+  ctrl+k: przenieĹ› commit 1 w gĂłrÄ™
+  v: wklej commity (przebieranie)
+  A: popraw commit zmianami z poczekalni
+  a: reset commit author
+  t: odwróć commit
+  T: tag commit
+  ctrl+l: open log menu
+  space: checkout commit
+  y: copy commit attribute
+  o: open commit in browser
+  n: create new branch off of commit
+  g: wyświetl opcje resetu
+  c: kopiuj commit (przebieranie)
+  C: kopiuj zakres commitĂłw (przebieranie)
+  enter: przeglÄ…daj pliki commita
+
+ +## Local Branches + +
+  ctrl+o: copy branch name to clipboard
+  i: show git-flow options
   space: przełącz
-  o: maak of laat een pull-request zien
-  O: utwĂłrz opcje ĹĽÄ…dania
+  n: nowa gałąź
+  o: utwĂłrz ĹĽÄ…danie pobrania
+  O: utwórz opcje żądania ściągnięcia
   ctrl+y: skopiuj adres URL ĹĽÄ…dania pobrania do schowka
   c: przełącz używając nazwy
   F: wymuś przełączenie
-  n: nowa gałąź
   d: usuń gałąź
   r: zmiana bazy gałęzi
   M: scal do obecnej gałęzi
-  i: show git-flow options
   f: fast-forward this branch from its upstream
   g: wyświetl opcje resetu
   R: rename branch
-  ctrl+o: copy branch name to clipboard
+  u: set/unset upstream
   enter: view commits
 
-## Gałęzie Panel (Remote Branches (in Remotes tab)) +## Main Panel (Patch Building)
-  esc: wróć do listy repozytoriów zdalnych
-  g: wyświetl opcje resetu
-  enter: view commits
-  space: przełącz
-  n: nowa gałąź
-  M: scal do obecnej gałęzi
-  d: usuń gałąź
-  r: zmiana bazy gałęzi
-  u: set as upstream of checked-out branch
+  ◄: poprzedni kawałek
+  ►: następny kawałek
+  v: toggle drag select
+  V: toggle drag select
+  a: toggle select hunk
+  ctrl+o: copy the selected text to the clipboard
+  o: otwĂłrz plik
+  e: edytuj plik
+  space: add/remove line(s) to patch
+  esc: wyście z trybu "linia po linii"
 
-## Gałęzie Panel (Remotes Tab) +## Pliki
-  f: fetch remote
-  n: add new remote
-  d: remove remote
-  e: edit remote
+  ctrl+o: copy the file name to the clipboard
+  ctrl+w: Toggle whether or not whitespace changes are shown in the diff view
+  d: pokaĹĽ opcje porzucania zmian
+  space: przełącz stan poczekalni
+  ctrl+b: Filter files (staged/unstaged)
+  c: ZatwierdĹş zmiany
+  w: zatwierdĹş zmiany bez skryptu pre-commit
+  A: Zmień ostatni commit
+  C: ZatwierdĹş zmiany uĹĽywajÄ…c edytora
+  e: edytuj plik
+  o: otwĂłrz plik
+  i: ignore or exclude file
+  r: odśwież pliki
+  s: przechowaj zmiany
+  S: wyświetl opcje schowka
+  a: przełącz stan poczekalni wszystkich
+  enter: zatwierdĹş pojedyncze linie
+  g: view upstream reset options
+  D: wyświetl opcje resetu
+  `: toggle file tree view
+  M: open external merge tool (git mergetool)
+  f: pobierz
 
-## Gałęzie Panel (Sub-commits) - -
-  enter: przeglÄ…daj pliki commita
-  space: checkout commit
-  g: wyświetl opcje resetu
-  n: nowa gałąź
-  c: kopiuj commit (przebieranie)
-  C: kopiuj zakres commitĂłw (przebieranie)
-  ctrl+r: reset cherry-picked (copied) commits selection
-  ctrl+o: copy commit SHA to clipboard
-
- -## Gałęzie Panel (Tags Tab) - -
-  space: przełącz
-  d: delete tag
-  P: push tag
-  n: create tag
-  g: wyświetl opcje resetu
-  enter: view commits
-
- -## Pliki commita Panel +## Pliki commita
   ctrl+o: copy the committed file name to the clipboard
@@ -116,93 +147,119 @@ _This file is auto-generated. To update, make the changes in the pkg/i18n direct
   o: otwĂłrz plik
   e: edytuj plik
   space: toggle file included in patch
+  a: toggle all files included in patch
   enter: enter file to add selected lines to the patch (or toggle directory collapsed)
   `: toggle file tree view
 
-## Commity Panel (Commity) +## Poczekalnia
-  ctrl+l: open log menu
-  s: ściśnij
-  r: zmień nazwę commita
-  R: zmień nazwę commita w edytorze
-  g: zresetuj do tego commita
-  f: napraw commit
-  F: utwĂłrz commit naprawczy dla tego commita
-  S: spłaszcz wszystkie commity naprawcze powyżej zaznaczonych commitów (autosquash)
-  d: usuń commit
-  ctrl+j: przenieś commit 1 w dół
-  ctrl+k: przenieĹ› commit 1 w gĂłrÄ™
-  e: edytuj commit
-  A: popraw commit zmianami z poczekalni
-  p: wybierz commit (podczas zmiany bazy)
-  t: odwróć commit
-  c: kopiuj commit (przebieranie)
-  ctrl+o: copy commit SHA to clipboard
-  C: kopiuj zakres commitĂłw (przebieranie)
-  v: wklej commity (przebieranie)
-  enter: przeglÄ…daj pliki commita
-  space: checkout commit
-  n: create new branch off of commit
-  T: tag commit
-  ctrl+r: reset cherry-picked (copied) commits selection
-  ctrl+y: copy commit message to clipboard
-  o: open commit in browser
-  b: view bisect options
+  ◄: poprzedni kawałek
+  ►: następny kawałek
+  v: toggle drag select
+  V: toggle drag select
+  a: toggle select hunk
+  ctrl+o: copy the selected text to the clipboard
+  o: otwĂłrz plik
+  e: edytuj plik
+  esc: wróć do panelu plików
+  tab: switch to other panel (staged/unstaged changes)
+  space: toggle line staged / unstaged
+  d: delete change (git reset)
+  E: edit hunk
 
-## Commity Panel (Reflog Tab) +## Reflog
-  enter: przeglÄ…daj pliki commita
+  ctrl+o: copy commit SHA to clipboard
   space: checkout commit
+  y: copy commit attribute
+  o: open commit in browser
+  n: create new branch off of commit
   g: wyświetl opcje resetu
   c: kopiuj commit (przebieranie)
   C: kopiuj zakres commitĂłw (przebieranie)
   ctrl+r: reset cherry-picked (copied) commits selection
-  ctrl+o: copy commit SHA to clipboard
+  enter: view commits
 
-## Extras Panel +## Remote Branches
-  @: open command log menu
+  space: przełącz
+  n: nowa gałąź
+  M: scal do obecnej gałęzi
+  r: zmiana bazy gałęzi
+  d: usuń gałąź
+  u: set as upstream of checked-out branch
+  esc: wróć do listy repozytoriów zdalnych
+  g: wyświetl opcje resetu
+  enter: view commits
 
-## Pliki Panel +## Remotes
-  ctrl+b: Filtrowanie commitĂłw
+  f: fetch remote
+  n: add new remote
+  d: remove remote
+  e: edit remote
 
-## Pliki Panel (Pliki) +## Scalanie
-  c: ZatwierdĹş zmiany
-  w: zatwierdĹş zmiany bez skryptu pre-commit
-  A: Zmień ostatni commit
-  C: ZatwierdĹş zmiany uĹĽywajÄ…c edytora
-  space: przełącz stan poczekalni
-  d: pokaĹĽ opcje porzucania zmian
   e: edytuj plik
   o: otwĂłrz plik
-  i: dodaj do .gitignore
-  r: odśwież pliki
-  s: przechowaj zmiany
-  S: wyświetl opcje schowka
-  a: przełącz stan poczekalni wszystkich
-  D: wyświetl opcje resetu
-  enter: zatwierdĹş pojedyncze linie
-  f: pobierz
-  ctrl+o: copy the file name to the clipboard
-  g: view upstream reset options
-  `: toggle file tree view
+  â—„: poprzedni konflikt
+  ►: następny konflikt
+  ▲: wybierz poprzedni kawałek
+  ▼: wybierz następny kawałek
+  z: cofnij
   M: open external merge tool (git mergetool)
-  ctrl+w: Toggle whether or not whitespace changes are shown in the diff view
+  space: wybierz kawałek
+  b: wybierz wszystkie kawałki
+  esc: wróć do panelu plików
 
-## Pliki Panel (Submodules) +## Schowek + +
+  space: zastosuj
+  g: wyciÄ…gnij
+  d: porzuć
+  n: nowa gałąź
+  enter: przeglÄ…daj pliki commita
+
+ +## Status + +
+  e: edytuj konfiguracjÄ™
+  o: otwĂłrz konfiguracjÄ™
+  u: sprawdĹş aktualizacje
+  enter: switch to a recent repo
+  a: pokaż wszystkie logi gałęzi
+
+ +## Sub-commits + +
+  ctrl+o: copy commit SHA to clipboard
+  space: checkout commit
+  y: copy commit attribute
+  o: open commit in browser
+  n: create new branch off of commit
+  g: wyświetl opcje resetu
+  c: kopiuj commit (przebieranie)
+  C: kopiuj zakres commitĂłw (przebieranie)
+  ctrl+r: reset cherry-picked (copied) commits selection
+  enter: przeglÄ…daj pliki commita
+
+ +## Submodules
   ctrl+o: copy submodule name to clipboard
@@ -215,94 +272,20 @@ _This file is auto-generated. To update, make the changes in the pkg/i18n direct
   b: view bulk submodule options
 
-## Główne Panel (Scalanie) +## Tags
-  H: scroll left
-  L: scroll right
-  esc: wróć do panelu plików
-  M: open external merge tool (git mergetool)
-  space: wybierz kawałek
-  b: wybierz wszystkie kawałki
-  â—„: poprzedni konflikt
-  ►: następny konflikt
-  ▲: wybierz poprzedni kawałek
-  ▼: wybierz następny kawałek
-  z: cofnij
+  space: przełącz
+  d: delete tag
+  P: push tag
+  n: create tag
+  g: wyświetl opcje resetu
+  enter: view commits
 
-## Główne Panel (Zwykłe) +## Zwykłe
-  Ĺ: przewiĹ„ w dół (fn+up)
-  ő: przewiń w górę (fn+down)
-
- -## Główne Panel (Patch Building) - -
-  esc: wyście z trybu "linia po linii"
-  o: otwĂłrz plik
-  â–˛: poprzednia linia
-  ▼: następna linia
-  ◄: poprzedni kawałek
-  ►: następny kawałek
-  ctrl+o: copy the selected text to the clipboard
-  space: add/remove line(s) to patch
-  v: toggle drag select
-  V: toggle drag select
-  a: toggle select hunk
-  H: scroll left
-  L: scroll right
-
- -## Główne Panel (Poczekalnia) - -
-  esc: wróć do panelu plików
-  space: toggle line staged / unstaged
-  d: delete change (git reset)
-  tab: switch to other panel
-  o: otwĂłrz plik
-  â–˛: poprzednia linia
-  ▼: następna linia
-  ◄: poprzedni kawałek
-  ►: następny kawałek
-  ctrl+o: copy the selected text to the clipboard
-  e: edytuj plik
-  o: otwĂłrz plik
-  v: toggle drag select
-  V: toggle drag select
-  a: toggle select hunk
-  H: scroll left
-  L: scroll right
-  c: ZatwierdĹş zmiany
-  w: zatwierdĹş zmiany bez skryptu pre-commit
-  C: ZatwierdĹş zmiany uĹĽywajÄ…c edytora
-
- -## Menu Panel - -
-  esc: close menu
-
- -## Schowek Panel - -
-  enter: view stash entry's files
-  space: zastosuj
-  g: wyciÄ…gnij
-  d: porzuć
-  n: nowa gałąź
-
- -## Status Panel - -
-  e: edytuj konfiguracjÄ™
-  o: otwĂłrz konfiguracjÄ™
-  u: sprawdĹş aktualizacje
-  enter: switch to a recent repo
-  a: pokaż wszystkie logi gałęzi
+  mouse wheel ▼: przewiń w dół (fn+up)
+  mouse wheel ▲: przewiń w górę (fn+down)
 
diff --git a/docs/keybindings/Keybindings_zh.md b/docs/keybindings/Keybindings_zh.md index 6c8a35c5b..7ffaf2292 100644 --- a/docs/keybindings/Keybindings_zh.md +++ b/docs/keybindings/Keybindings_zh.md @@ -5,204 +5,95 @@ _This file is auto-generated. To update, make the changes in the pkg/i18n direct ## 全局键绑定
-  ctrl+r: ĺ‡ćŤ˘ĺ°ćś€čż‘的仓库 ()
-  pgup: ĺ‘上滚动主面板 (fn+up)
-  pgdown: ĺ‘下滚动主面板 (fn+down)
+  ctrl+r: ĺ‡ćŤ˘ĺ°ćś€čż‘的仓库
+  pgup: ĺ‘上滚动主面板 (fn+up/shift+k)
+  pgdown: ĺ‘下滚动主面板 (fn+down/shift+j)
   m: 查看 ĺĺą¶/ĺŹĺźş é€‰éˇą
   ctrl+p: 查看自定义补ä¸é€‰éˇą
-  P: 推é€
-  p: 拉取
   R: ĺ·ć–°
   x: 打开菜单
-  z: ďĽé€ščż‡ reflog)撤销「实验功č˝ă€Ť
-  ctrl+z: ďĽé€ščż‡ reflog)重ĺšă€Śĺ®žéŞŚĺŠźč˝ă€Ť
   +: 下一屏模式ďĽć­Łĺ¸¸/半屏/全屏)
   _: 上一屏模式
-  :: 执行自定义命令
   ctrl+s: 查看按路径过滤选项
   W: 打开 diff 菜单
   ctrl+e: 打开 diff 菜单
   @: 打开命令日志菜单
-  }: Increase the size of the context shown around changes in the diff view
-  {: Decrease the size of the context shown around changes in the diff view
+  }: 扩大差异视图中ćľç¤şçš„上下文čŚĺ›´
+  {: 缩小差异视图中ćľç¤şçš„上下文čŚĺ›´
+  :: 执行自定义命令
+  z: ďĽé€ščż‡ reflog)撤销「实验功č˝ă€Ť
+  ctrl+z: ďĽé€ščż‡ reflog)重ĺšă€Śĺ®žéŞŚĺŠźč˝ă€Ť
+  P: 推é€
+  p: 拉取
 
## ĺ—表面板导čŞ
-  .: 下一页
   ,: 上一页
+  .: 下一页
   <: 滚动ĺ°éˇ¶é¨
-  >: 滚动ĺ°ĺş•é¨
   /: 开始ćśç´˘
+  >: 滚动ĺ°ĺş•é¨
+  H: ĺ‘左滚动
+  L: ĺ‘右滚动
   ]: 下一个标签
   [: 上一个标签
 
-## ĺ†ć”Ż éť˘ćťż (ĺ†ć”Żć ‡ç­ľ) +## Reflog 页面
+  ctrl+o: ĺ°†ćŹäş¤çš„ SHA 复ĺ¶ĺ°ĺ‰Şč´´ćťż
+  space: 检出ćŹäş¤
+  y: copy commit attribute
+  o: 在浏č§ĺ™¨ä¸­ć‰“开ćŹäş¤
+  n: 从ćŹäş¤ĺ›ĺ»şć–°ĺ†ć”Ż
+  g: 查看重置选项
+  c: 复ĺ¶ćŹäş¤ďĽć‹Łé€‰ďĽ‰
+  C: 复ĺ¶ćŹäş¤čŚĺ›´ďĽć‹Łé€‰ďĽ‰
+  ctrl+r: 重置已拣选ďĽĺ¤Ťĺ¶ďĽ‰çš„ćŹäş¤
+  enter: 查看ćŹäş¤
+
+ +## ĺ†ć”Żéˇµéť˘ + +
+  ctrl+o: ĺ°†ĺ†ć”ŻĺŤç§°ĺ¤Ťĺ¶ĺ°ĺ‰Şč´´ćťż
+  i: ćľç¤ş git-flow 选项
   space: 检出
+  n: ć–°ĺ†ć”Ż
   o: ĺ›ĺ»şćŠ“ĺŹ–čŻ·ć±‚
   O: ĺ›ĺ»şćŠ“ĺŹ–čŻ·ć±‚
   ctrl+y: 将抓取请求 URL 复ĺ¶ĺ°ĺ‰Şč´´ćťż
   c: 按ĺŤç§°ćŁ€ĺ‡ş
   F: 强ĺ¶ćŁ€ĺ‡ş
-  n: ć–°ĺ†ć”Ż
   d: ĺ é™¤ĺ†ć”Ż
   r: 将已检出的ĺ†ć”ŻĺŹĺźşĺ°čŻĄĺ†ć”Ż
   M: ĺĺą¶ĺ°ĺ˝“前检出的ĺ†ć”Ż
-  i: ćľç¤ş git-flow 选项
   f: 从上游快进此ĺ†ć”Ż
   g: 查看重置选项
   R: 重命ĺŤĺ†ć”Ż
-  ctrl+o: ĺ°†ĺ†ć”ŻĺŤç§°ĺ¤Ťĺ¶ĺ°ĺ‰Şč´´ćťż
+  u: set/unset upstream
   enter: 查看ćŹäş¤
 
-## ĺ†ć”Ż éť˘ćťż (远程ĺ†ć”ŻďĽĺś¨čżśç¨‹éˇµéť˘ä¸­ďĽ‰) +## ĺ­ćŹäş¤
-  esc: 返回远程仓库ĺ—表
-  g: 查看重置选项
-  enter: 查看ćŹäş¤
-  space: 检出
-  n: ć–°ĺ†ć”Ż
-  M: ĺĺą¶ĺ°ĺ˝“前检出的ĺ†ć”Ż
-  d: ĺ é™¤ĺ†ć”Ż
-  r: 将已检出的ĺ†ć”ŻĺŹĺźşĺ°čŻĄĺ†ć”Ż
-  u: 设置为检出ĺ†ć”Żçš„上游
-
- -## ĺ†ć”Ż éť˘ćťż (远程页面) - -
-  f: 抓取远程仓库
-  n: 添加新的远程仓库
-  d: ĺ é™¤čżśç¨‹
-  e: 编辑远程仓库
-
- -## ĺ†ć”Ż éť˘ćťż (ĺ­ćŹäş¤) - -
-  enter: 查看ćŹäş¤çš„文件
-  space: 检出ćŹäş¤
-  g: 查看重置选项
-  n: ć–°ĺ†ć”Ż
-  c: 复ĺ¶ćŹäş¤ďĽć‹Łé€‰ďĽ‰
-  C: 复ĺ¶ćŹäş¤čŚĺ›´ďĽć‹Łé€‰ďĽ‰
-  ctrl+r: 重置已拣选ďĽĺ¤Ťĺ¶ďĽ‰çš„ćŹäş¤
   ctrl+o: ĺ°†ćŹäş¤çš„ SHA 复ĺ¶ĺ°ĺ‰Şč´´ćťż
-
- -## ĺ†ć”Ż éť˘ćťż (标签页面) - -
-  space: 检出
-  d: ĺ é™¤ć ‡ç­ľ
-  P: 推é€ć ‡ç­ľ
-  n: ĺ›ĺ»şć ‡ç­ľ
-  g: 查看重置选项
-  enter: 查看ćŹäş¤
-
- -## ćŹäş¤ć–‡ä»¶ 面板 - -
-  ctrl+o: ĺ°†ćŹäş¤çš„文件ĺŤĺ¤Ťĺ¶ĺ°ĺ‰Şč´´ćťż
-  c: 检出文件
-  d: 放ĺĽĺŻąć­¤ć–‡ä»¶çš„ćŹäş¤ć›´ć”ą
-  o: 打开文件
-  e: 编辑文件
-  space: 补ä¸ä¸­ĺŚ…ĺ«çš„ĺ‡ćŤ˘ć–‡ä»¶
-  enter: 输入文件以将所选行添加ĺ°čˇĄä¸ä¸­ďĽć–ĺ‡ćŤ˘ç›®ĺ˝•ćŠĺŹ ďĽ‰
-  `: ĺ‡ćŤ˘ć–‡ä»¶ć ‘视图
-
- -## ćŹäş¤ 面板 (ćŹäş¤) - -
-  ctrl+l: open log menu
-  s: ĺ‘下压缩
-  r: 改写ćŹäş¤
-  R: 使用编辑器重命ĺŤćŹäş¤
-  g: 重置为此ćŹäş¤
-  f: 修正ćŹäş¤ďĽfixup)
-  F: 为此ćŹäş¤ĺ›ĺ»şäż®ć­Ł
-  S: 压缩在所选ćŹäş¤äą‹ä¸Šçš„所有“fixup!”ćŹäş¤ďĽč‡ŞĺŠ¨ĺŽ‹çĽ©ďĽ‰
-  d: ĺ é™¤ćŹäş¤
-  ctrl+j: 下移ćŹäş¤
-  ctrl+k: 上移ćŹäş¤
-  e: 编辑ćŹäş¤
-  A: 用已暂ĺ­çš„更改来修补ćŹäş¤
-  p: 选择ćŹäş¤ďĽĺŹĺźşčż‡ç¨‹ä¸­ďĽ‰
-  t: čżĺŽźćŹäş¤
-  c: 复ĺ¶ćŹäş¤ďĽć‹Łé€‰ďĽ‰
-  ctrl+o: ĺ°†ćŹäş¤çš„ SHA 复ĺ¶ĺ°ĺ‰Şč´´ćťż
-  C: 复ĺ¶ćŹäş¤čŚĺ›´ďĽć‹Łé€‰ďĽ‰
-  v: ç˛č´´ćŹäş¤ďĽć‹Łé€‰ďĽ‰
-  enter: 查看ćŹäş¤çš„文件
   space: 检出ćŹäş¤
+  y: copy commit attribute
+  o: 在浏č§ĺ™¨ä¸­ć‰“开ćŹäş¤
   n: 从ćŹäş¤ĺ›ĺ»şć–°ĺ†ć”Ż
-  T: 标签ćŹäş¤
-  ctrl+r: 重置已拣选ďĽĺ¤Ťĺ¶ďĽ‰çš„ćŹäş¤
-  ctrl+y: ĺ°†ćŹäş¤ć¶ćŻĺ¤Ťĺ¶ĺ°ĺ‰Şč´´ćťż
-  o: open commit in browser
-  b: view bisect options
-
- -## ćŹäş¤ 面板 (Reflog) - -
-  enter: 查看ćŹäş¤çš„文件
-  space: 检出ćŹäş¤
   g: 查看重置选项
   c: 复ĺ¶ćŹäş¤ďĽć‹Łé€‰ďĽ‰
   C: 复ĺ¶ćŹäş¤čŚĺ›´ďĽć‹Łé€‰ďĽ‰
   ctrl+r: 重置已拣选ďĽĺ¤Ťĺ¶ďĽ‰çš„ćŹäş¤
-  ctrl+o: ĺ°†ćŹäş¤çš„ SHA 复ĺ¶ĺ°ĺ‰Şč´´ćťż
+  enter: 查看ćŹäş¤çš„文件
 
-## Extras 面板 - -
-  @: 打开命令日志菜单
-
- -## 文件 面板 - -
-  ctrl+b: 过滤ćŹäş¤ć–‡ä»¶
-
- -## 文件 面板 (文件) - -
-  c: ćŹäş¤ć›´ć”ą
-  w: ćŹäş¤ć›´ć”ąč€Ść— éś€é˘„ĺ…ćŹäş¤é’©ĺ­
-  A: 修补最ĺŽä¸€ć¬ˇćŹäş¤
-  C: ćŹäş¤ć›´ć”ąďĽä˝żç”¨çĽ–辑器编辑ćŹäş¤äżˇćŻďĽ‰
-  space: ĺ‡ćŤ˘ćš‚ĺ­çжć€
-  d: 查看'放ĺĽć›´ć”ąâ€é€‰éˇą
-  e: 编辑文件
-  o: 打开文件
-  i: ć·»ĺŠ ĺ° .gitignore
-  r: ĺ·ć–°ć–‡ä»¶
-  s: 将所有更改加入贮藏
-  S: 查看éšč—Źé€‰éˇą
-  a: ĺ‡ćŤ˘ć‰€ćś‰ć–‡ä»¶çš„ćš‚ĺ­çжć€
-  D: 查看重置选项
-  enter: ćš‚ĺ­ĺŤ•个 ĺť—/行 用于文件, ć– ćŠĺŹ /展开 目录
-  f: 抓取
-  ctrl+o: 将文件ĺŤĺ¤Ťĺ¶ĺ°ĺ‰Şč´´ćťż
-  g: 查看上游重置选项
-  `: ĺ‡ćŤ˘ć–‡ä»¶ć ‘视图
-  M: 打开ĺĺą¶ĺ·Ąĺ…·
-  ctrl+w: ĺ‡ćŤ˘ćŻĺ¦ĺś¨ĺ·®ĺĽ‚视图中ćľç¤şç©şç™˝ć›´ć”ą
-
- -## 文件 面板 (ĺ­ć¨ˇĺť—) +## ĺ­ć¨ˇĺť—
   ctrl+o: ĺ°†ĺ­ć¨ˇĺť—ĺŤç§°ĺ¤Ťĺ¶ĺ°ĺ‰Şč´´ćťż
@@ -215,89 +106,148 @@ _This file is auto-generated. To update, make the changes in the pkg/i18n direct
   b: 查看批量ĺ­ć¨ˇĺť—选项
 
-## ä¸»č¦ éť˘ćťż (ĺ并中) +## ćŹäş¤
-  H: scroll left
-  L: scroll right
-  esc: 返回文件面板
-  M: 打开ĺĺą¶ĺ·Ąĺ…·
-  space: 选中区块
-  b: 选中所有区块
+  ctrl+o: ĺ°†ćŹäş¤çš„ SHA 复ĺ¶ĺ°ĺ‰Şč´´ćťż
+  ctrl+r: 重置已拣选ďĽĺ¤Ťĺ¶ďĽ‰çš„ćŹäş¤
+  b: 查看二ĺ†ćźĄć‰ľé€‰éˇą
+  s: ĺ‘下压缩
+  f: 修正ćŹäş¤ďĽfixup)
+  r: 改写ćŹäş¤
+  R: 使用编辑器重命ĺŤćŹäş¤
+  d: ĺ é™¤ćŹäş¤
+  e: 编辑ćŹäş¤
+  p: 选择ćŹäş¤ďĽĺŹĺźşčż‡ç¨‹ä¸­ďĽ‰
+  F: 为此ćŹäş¤ĺ›ĺ»şäż®ć­Ł
+  S: 压缩在所选ćŹäş¤äą‹ä¸Šçš„所有“fixup!”ćŹäş¤ďĽč‡ŞĺŠ¨ĺŽ‹çĽ©ďĽ‰
+  ctrl+j: 下移ćŹäş¤
+  ctrl+k: 上移ćŹäş¤
+  v: ç˛č´´ćŹäş¤ďĽć‹Łé€‰ďĽ‰
+  A: 用已暂ĺ­çš„更改来修补ćŹäş¤
+  a: reset commit author
+  t: čżĺŽźćŹäş¤
+  T: 标签ćŹäş¤
+  ctrl+l: 打开日志菜单
+  space: 检出ćŹäş¤
+  y: copy commit attribute
+  o: 在浏č§ĺ™¨ä¸­ć‰“开ćŹäş¤
+  n: 从ćŹäş¤ĺ›ĺ»şć–°ĺ†ć”Ż
+  g: 查看重置选项
+  c: 复ĺ¶ćŹäş¤ďĽć‹Łé€‰ďĽ‰
+  C: 复ĺ¶ćŹäş¤čŚĺ›´ďĽć‹Łé€‰ďĽ‰
+  enter: 查看ćŹäş¤çš„文件
+
+ +## ćŹäş¤ć–‡ä»¶ + +
+  ctrl+o: ĺ°†ćŹäş¤çš„文件ĺŤĺ¤Ťĺ¶ĺ°ĺ‰Şč´´ćťż
+  c: 检出文件
+  d: 放ĺĽĺŻąć­¤ć–‡ä»¶çš„ćŹäş¤ć›´ć”ą
+  o: 打开文件
+  e: 编辑文件
+  space: 补ä¸ä¸­ĺŚ…ĺ«çš„ĺ‡ćŤ˘ć–‡ä»¶
+  a: toggle all files included in patch
+  enter: 输入文件以将所选行添加ĺ°čˇĄä¸ä¸­ďĽć–ĺ‡ćŤ˘ç›®ĺ˝•ćŠĺŹ ďĽ‰
+  `: ĺ‡ćŤ˘ć–‡ä»¶ć ‘视图
+
+ +## 文件 + +
+  ctrl+o: 将文件ĺŤĺ¤Ťĺ¶ĺ°ĺ‰Şč´´ćťż
+  ctrl+w: ĺ‡ćŤ˘ćŻĺ¦ĺś¨ĺ·®ĺĽ‚视图中ćľç¤şç©şç™˝ĺ­—符差异
+  d: 查看'放ĺĽć›´ć”ą'选项
+  space: ĺ‡ćŤ˘ćš‚ĺ­çжć€
+  ctrl+b: Filter files (staged/unstaged)
+  c: ćŹäş¤ć›´ć”ą
+  w: ćŹäş¤ć›´ć”ąč€Ść— éś€é˘„ĺ…ćŹäş¤é’©ĺ­
+  A: 修补最ĺŽä¸€ć¬ˇćŹäş¤
+  C: ćŹäş¤ć›´ć”ąďĽä˝żç”¨çĽ–辑器编辑ćŹäş¤äżˇćŻďĽ‰
+  e: 编辑文件
+  o: 打开文件
+  i: 忽略文件
+  r: ĺ·ć–°ć–‡ä»¶
+  s: 将所有更改加入贮藏
+  S: 查看贮藏选项
+  a: ĺ‡ćŤ˘ć‰€ćś‰ć–‡ä»¶çš„ćš‚ĺ­çжć€
+  enter: ćš‚ĺ­ĺŤ•个 ĺť—/行 用于文件, ć– ćŠĺŹ /展开 目录
+  g: 查看上游重置选项
+  D: 查看重置选项
+  `: ĺ‡ćŤ˘ć–‡ä»¶ć ‘视图
+  M: 打开外é¨ĺĺą¶ĺ·Ąĺ…· (git mergetool)
+  f: 抓取
+
+ +## 构建补ä¸ä¸­ + +
+  ◄: 选择上一个区块
+  ►: 选择下一个区块
+  v: ĺ‡ćŤ˘ć‹–动选择
+  V: ĺ‡ćŤ˘ć‹–动选择
+  a: ĺ‡ćŤ˘é€‰ć‹©ĺŚşĺť—
+  ctrl+o: 将选中文本复ĺ¶ĺ°ĺ‰Şč´´ćťż
+  o: 打开文件
+  e: 编辑文件
+  space: 添加/移除 行ĺ°čˇĄä¸
+  esc: 退出é€čˇŚć¨ˇĺĽŹ
+
+ +## 标签页面 + +
+  space: 检出
+  d: ĺ é™¤ć ‡ç­ľ
+  P: 推é€ć ‡ç­ľ
+  n: ĺ›ĺ»şć ‡ç­ľ
+  g: 查看重置选项
+  enter: 查看ćŹäş¤
+
+ +## 正在ĺĺą¶ + +
+  e: 编辑文件
+  o: 打开文件
   â—„: 选择上一个冲çŞ
   â–ş: 选择下一个冲çŞ
   â–˛: 选择顶é¨ĺť—
   â–Ľ: 选择底é¨ĺť—
   z: 撤销
+  M: 打开外é¨ĺĺą¶ĺ·Ąĺ…· (git mergetool)
+  space: 选中区块
+  b: 选中所有区块
+  esc: 返回文件面板
 
-## ä¸»č¦ éť˘ćťż (正常) +## 正在暂ĺ­
-  Ĺ: ĺ‘下滚动 (fn+up)
-  Ĺ‘: ĺ‘上滚动 (fn+down)
-
- -## ä¸»č¦ éť˘ćťż (构建补ä¸ä¸­) - -
-  esc: 退出é€čˇŚć¨ˇĺĽŹ
-  o: 打开文件
-  ▲: 选择上一行
-  ▼: 选择下一行
   ◄: 选择上一个区块
   ►: 选择下一个区块
-  ctrl+o: copy the selected text to the clipboard
-  space: 添加/移除 行ĺ°čˇĄä¸
   v: ĺ‡ćŤ˘ć‹–动选择
   V: ĺ‡ćŤ˘ć‹–动选择
   a: ĺ‡ćŤ˘é€‰ć‹©ĺŚşĺť—
-  H: scroll left
-  L: scroll right
-
- -## ä¸»č¦ éť˘ćťż (正在暂ĺ­) - -
+  ctrl+o: 将选中文本复ĺ¶ĺ°ĺ‰Şč´´ćťż
+  o: 打开文件
+  e: 编辑文件
   esc: 返回文件面板
+  tab: ĺ‡ćŤ˘ĺ°ĺ…¶ä»–面板
   space: ĺ‡ćŤ˘čˇŚćš‚ĺ­çжć€
   d: 取ć¶ĺŹć›´ (git reset)
-  tab: ĺ‡ćŤ˘ĺ°ĺ…¶ä»–面板
-  o: 打开文件
-  ▲: 选择上一行
-  ▼: 选择下一行
-  ◄: 选择上一个区块
-  ►: 选择下一个区块
-  ctrl+o: copy the selected text to the clipboard
-  e: 编辑文件
-  o: 打开文件
-  v: ĺ‡ćŤ˘ć‹–动选择
-  V: ĺ‡ćŤ˘ć‹–动选择
-  a: ĺ‡ćŤ˘é€‰ć‹©ĺŚşĺť—
-  H: scroll left
-  L: scroll right
-  c: ćŹäş¤ć›´ć”ą
-  w: ćŹäş¤ć›´ć”ąč€Ść— éś€é˘„ĺ…ćŹäş¤é’©ĺ­
-  C: ćŹäş¤ć›´ć”ąďĽä˝żç”¨çĽ–辑器编辑ćŹäş¤äżˇćŻďĽ‰
+  E: edit hunk
 
-## 菜单 面板 +## 正常
-  esc: 关闭菜单
+  mouse wheel â–Ľ: ĺ‘下滚动 (fn+up)
+  mouse wheel â–˛: ĺ‘上滚动 (fn+down)
 
-## 贮藏 面板 - -
-  enter: 查看贮藏条目中的文件
-  space: 应用
-  g: 应用并ĺ é™¤
-  d: ĺ é™¤
-  n: ć–°ĺ†ć”Ż
-
- -## çŠ¶ć€ éť˘ćťż +## 状ć€
   e: 编辑配置文件
@@ -306,3 +256,36 @@ _This file is auto-generated. To update, make the changes in the pkg/i18n direct
   enter: ĺ‡ćŤ˘ĺ°ćś€čż‘的仓库
   a: ćľç¤şć‰€ćś‰ĺ†ć”Żçš„ć—Ąĺż—
 
+ +## 贮藏 + +
+  space: 应用
+  g: 应用并ĺ é™¤
+  d: ĺ é™¤
+  n: ć–°ĺ†ć”Ż
+  enter: 查看ćŹäş¤çš„文件
+
+ +## 远程ĺ†ć”Ż + +
+  space: 检出
+  n: ć–°ĺ†ć”Ż
+  M: ĺĺą¶ĺ°ĺ˝“前检出的ĺ†ć”Ż
+  r: 将已检出的ĺ†ć”ŻĺŹĺźşĺ°čŻĄĺ†ć”Ż
+  d: ĺ é™¤ĺ†ć”Ż
+  u: 设置为检出ĺ†ć”Żçš„上游
+  esc: 返回远程仓库ĺ—表
+  g: 查看重置选项
+  enter: 查看ćŹäş¤
+
+ +## 远程页面 + +
+  f: 抓取远程仓库
+  n: 添加新的远程仓库
+  d: ĺ é™¤čżśç¨‹
+  e: 编辑远程仓库
+
diff --git a/go.mod b/go.mod index 860b7e6db..eb31e4713 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/jesseduffield/lazygit -go 1.14 +go 1.18 require ( github.com/OpenPeeDeeP/xdg v1.0.0 @@ -9,42 +9,66 @@ require ( github.com/cli/safeexec v1.0.0 github.com/cloudfoundry/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21 github.com/creack/pty v1.1.11 - github.com/fatih/color v1.9.0 // indirect + github.com/fsmiamoto/git-todo-parser v0.0.2 github.com/fsnotify/fsnotify v1.4.7 - github.com/gdamore/tcell/v2 v2.4.1-0.20210926162909-66f061b1fc9b // indirect - github.com/go-errors/errors v1.4.1 - github.com/go-logfmt/logfmt v0.5.0 // indirect - github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 - github.com/golang/protobuf v1.3.2 // indirect - github.com/google/go-cmp v0.5.6 // indirect + github.com/gdamore/tcell/v2 v2.5.2 + github.com/go-errors/errors v1.4.2 github.com/gookit/color v1.4.2 github.com/imdario/mergo v0.3.11 github.com/integrii/flaggy v1.4.0 + github.com/jesseduffield/generics v0.0.0-20220320043834-727e535cbe68 github.com/jesseduffield/go-git/v5 v5.1.2-0.20201006095850-341962be15a4 - github.com/jesseduffield/gocui v0.3.1-0.20220108045521-1945d7b9ed8b + github.com/jesseduffield/gocui v0.3.1-0.20220813101052-3a3ab26faa15 + github.com/jesseduffield/kill v0.0.0-20220618033138-bfbe04675d10 github.com/jesseduffield/minimal/gitignore v0.3.3-0.20211018110810-9cde264e6b1e github.com/jesseduffield/yaml v2.1.0+incompatible github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 - github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect - github.com/kylelemons/godebug v1.1.0 // indirect github.com/kyokomi/emoji/v2 v2.2.8 github.com/lucasb-eyer/go-colorful v1.2.0 - github.com/mattn/go-colorable v0.1.11 // indirect github.com/mattn/go-runewidth v0.0.13 github.com/mgutz/str v1.2.0 - github.com/onsi/ginkgo v1.10.3 // indirect - github.com/onsi/gomega v1.7.1 // indirect github.com/pmezard/go-difflib v1.0.0 github.com/sahilm/fuzzy v0.1.0 + github.com/samber/lo v1.10.1 github.com/sanity-io/litter v1.5.2 + github.com/sasha-s/go-deadlock v0.3.1 github.com/sirupsen/logrus v1.4.2 github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad github.com/stretchr/testify v1.7.0 github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 - golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 // indirect - golang.org/x/net v0.0.0-20201002202402-0a1ea396d57c // indirect - golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e // indirect - golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect - golang.org/x/text v0.3.7 // indirect gopkg.in/ozeidan/fuzzy-patricia.v3 v3.0.0 + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b +) + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/emirpasic/gods v1.12.0 // indirect + github.com/fatih/color v1.9.0 // indirect + github.com/gdamore/encoding v1.0.0 // indirect + github.com/go-git/gcfg v1.5.0 // indirect + github.com/go-git/go-billy/v5 v5.0.0 // indirect + github.com/go-logfmt/logfmt v0.5.0 // indirect + github.com/gobwas/glob v0.2.3 // indirect + github.com/google/go-cmp v0.5.6 // indirect + github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect + github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd // indirect + github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect + github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 // indirect + github.com/kylelemons/godebug v1.1.0 // indirect + github.com/mattn/go-colorable v0.1.11 // indirect + github.com/mattn/go-isatty v0.0.14 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/onsi/ginkgo v1.10.3 // indirect + github.com/onsi/gomega v1.7.1 // indirect + github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 // indirect + github.com/rivo/uniseg v0.3.4 // indirect + github.com/sergi/go-diff v1.1.0 // indirect + github.com/xanzy/ssh-agent v0.2.1 // indirect + golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 // indirect + golang.org/x/exp v0.0.0-20220318154914-8dddf5d87bd8 // indirect + golang.org/x/net v0.0.0-20201002202402-0a1ea396d57c // indirect + golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab // indirect + golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 // indirect + golang.org/x/text v0.3.7 // indirect + gopkg.in/warnings.v0 v0.1.2 // indirect ) diff --git a/go.sum b/go.sum index 69871e0ab..31b69c743 100644 --- a/go.sum +++ b/go.sum @@ -27,21 +27,21 @@ github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3 github.com/fatih/color v1.7.1-0.20180516100307-2d684516a886/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/fsmiamoto/git-todo-parser v0.0.2 h1:l6Y+9q7jbM+yK/w6kASpHO7ejL9ARCErm3tCEqOT278= +github.com/fsmiamoto/git-todo-parser v0.0.2/go.mod h1:B+AgTbNE2BARvJqzXygThzqxLIaEWvwr2sxKYYb0Fas= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= -github.com/gdamore/tcell/v2 v2.4.0 h1:W6dxJEmaxYvhICFoTY3WrLLEXsQ11SaFnKGVEXW57KM= github.com/gdamore/tcell/v2 v2.4.0/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6oBpwHp4fU= -github.com/gdamore/tcell/v2 v2.4.1-0.20210926162909-66f061b1fc9b h1:eoaSI4eEwM5eTx/HvmRSwmicxuMhL73AyoEfM1oCJLc= -github.com/gdamore/tcell/v2 v2.4.1-0.20210926162909-66f061b1fc9b/go.mod h1:ZPwXnysybtQqdqKcWMWXux9aGdtMHe+kr+cwEZEe+A4= +github.com/gdamore/tcell/v2 v2.5.2 h1:tKzG29kO9p2V++3oBY2W9zUjYu7IK1MENFeY/BzJSVY= +github.com/gdamore/tcell/v2 v2.5.2/go.mod h1:wSkrPaXoiIWZqW/g7Px4xc79di6FTcpB8tvaKJ6uGBo= github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-errors/errors v1.0.2/go.mod h1:psDX2osz5VnTOnFWbDeWwS7yejl+uV3FEWEp4lssFEs= -github.com/go-errors/errors v1.4.1 h1:IvVlgbzSsaUNudsw5dcXSzF3EWyXTi5XrAdngnuhRyg= -github.com/go-errors/errors v1.4.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= github.com/go-git/go-billy/v5 v5.0.0 h1:7NQHvd9FVid8VL4qVUMm8XifBK+2xCoZ2lSk0agRrHM= @@ -53,11 +53,7 @@ github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 h1:zN2lZNZRflqFyxVaTIU61KNKQ9C0055u9CAfpmqUvo4= -github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3/go.mod h1:nPpo7qLxd6XL3hWJG/O60sR8ZKfMCiIoNap5GvD12KU= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -72,10 +68,14 @@ github.com/integrii/flaggy v1.4.0 h1:A1x7SYx4jqu5NSrY14z8Z+0UyX2S5ygfJJrfolWR3zM github.com/integrii/flaggy v1.4.0/go.mod h1:tnTxHeTJbah0gQ6/K0RW0J7fMUBk9MCF5blhm43LNpI= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jesseduffield/generics v0.0.0-20220320043834-727e535cbe68 h1:EQP2Tv8TIcC6Y4RI+1ZbJDOHfGJ570tPeYVCqo7/tws= +github.com/jesseduffield/generics v0.0.0-20220320043834-727e535cbe68/go.mod h1:+LLj9/WUPAP8LqCchs7P+7X0R98HiFujVFANdNaxhGk= github.com/jesseduffield/go-git/v5 v5.1.2-0.20201006095850-341962be15a4 h1:GOQrmaE8i+KEdB8NzAegKYd4tPn/inM0I1uo0NXFerg= github.com/jesseduffield/go-git/v5 v5.1.2-0.20201006095850-341962be15a4/go.mod h1:nGNEErzf+NRznT+N2SWqmHnDnF9aLgANB1CUNEan09o= -github.com/jesseduffield/gocui v0.3.1-0.20220108045521-1945d7b9ed8b h1:AUK5nDiPiaahBtGIsf8rITgZ9SC+uddvnNKs0/mrYA8= -github.com/jesseduffield/gocui v0.3.1-0.20220108045521-1945d7b9ed8b/go.mod h1:znJuCDnF2Ph40YZSlBwdX/4GEofnIoWLGdT4mK5zRAU= +github.com/jesseduffield/gocui v0.3.1-0.20220813101052-3a3ab26faa15 h1:DTVj8aCmINqLj5AXBEGmpWwfN1HJ3EWtUiYfcyIaSxs= +github.com/jesseduffield/gocui v0.3.1-0.20220813101052-3a3ab26faa15/go.mod h1:znJuCDnF2Ph40YZSlBwdX/4GEofnIoWLGdT4mK5zRAU= +github.com/jesseduffield/kill v0.0.0-20220618033138-bfbe04675d10 h1:jmpr7KpX2+2GRiE91zTgfq49QvgiqB0nbmlwZ8UnOx0= +github.com/jesseduffield/kill v0.0.0-20220618033138-bfbe04675d10/go.mod h1:aA97kHeNA+sj2Hbki0pvLslmE4CbDyhBeSSTUUnOuVo= github.com/jesseduffield/minimal/gitignore v0.3.3-0.20211018110810-9cde264e6b1e h1:uw/oo+kg7t/oeMs6sqlAwr85ND/9cpO3up3VxphxY0U= github.com/jesseduffield/minimal/gitignore v0.3.3-0.20211018110810-9cde264e6b1e/go.mod h1:u60qdFGXRd36jyEXxetz0vQceQIxzI13lIo3EFUDf4I= github.com/jesseduffield/yaml v2.1.0+incompatible h1:HWQJ1gIv2zHKbDYNp0Jwjlj24K8aqpFHnMCynY1EpmE= @@ -125,18 +125,25 @@ github.com/onsi/ginkgo v1.10.3 h1:OoxbjfXVZyod1fmWYhI7SEyaD8B00ynP3T+D5GiyHOY= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.7.1 h1:K0jcRCwNQM3vFGh1ppMtDh/+7ApJrjldlX8fA0jDTLQ= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 h1:q2e307iGHPdTGp0hoxKjt1H5pDo6utceo3dQVK3I5XQ= +github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.3.4 h1:3Z3Eu6FGHZWSfNKJTOUiPatWwfc7DzJRU04jFUqJODw= +github.com/rivo/uniseg v0.3.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/sahilm/fuzzy v0.1.0 h1:FzWGaw2Opqyu+794ZQ9SYifWv2EIXpwP4q8dY1kDAwI= github.com/sahilm/fuzzy v0.1.0/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y= +github.com/samber/lo v1.10.1 h1:0D3h7i0U3hRAbaCeQ82DLe67n0A7Bbl0/cEoWqFGp+U= +github.com/samber/lo v1.10.1/go.mod h1:2I7tgIv8Q1SG2xEIkRq0F2i2zgxVpnyPOP0d3Gj2r+A= github.com/sanity-io/litter v1.5.2 h1:AnC8s9BMORWH5a4atZ4D6FPVvKGzHcnc5/IVTa87myw= github.com/sanity-io/litter v1.5.2/go.mod h1:5Z71SvaYy5kcGtyglXOC9rrUi3c1E8CamFWjQsazTh0= +github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0= +github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= @@ -152,6 +159,7 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/thoas/go-funk v0.9.1 h1:O549iLZqPpTUQ10ykd26sZhzD+rmR5pWhuElrhbC20M= github.com/urfave/cli v1.20.1-0.20180226030253-8e01ec4cd3e2/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70= github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= @@ -163,6 +171,8 @@ golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 h1:hb9wdF1z5waM+dSIICn1l0DkLVDT3hqhhQsDNUmHPRE= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20220318154914-8dddf5d87bd8 h1:s/+U+w0teGzcoH2mdIlFQ6KfVKGaYpgyGdUefZrn9TU= +golang.org/x/exp v0.0.0-20220318154914-8dddf5d87bd8/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -181,20 +191,19 @@ golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220318055525-2edf467146b5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab h1:2QkjZIsXupsJbJIdSjjUOgWK3aEtzyuh2mPt3l/CkeU= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 h1:Q5284mrmYTpACcm+eAKjKJH48BBwSyfJqmmGDTtT8Vc= +golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -212,5 +221,6 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/main.go b/main.go index c6c097146..d7ce1db14 100644 --- a/main.go +++ b/main.go @@ -1,151 +1,24 @@ package main import ( - "bytes" - "fmt" - "log" - "os" - "path/filepath" - "runtime" - - "github.com/go-errors/errors" - "github.com/integrii/flaggy" "github.com/jesseduffield/lazygit/pkg/app" - "github.com/jesseduffield/lazygit/pkg/config" - "github.com/jesseduffield/lazygit/pkg/constants" - "github.com/jesseduffield/lazygit/pkg/env" - yaml "github.com/jesseduffield/yaml" ) +// These values may be set by the build script via the LDFLAGS argument var ( commit string - version = "unversioned" date string + version string buildSource = "unknown" ) func main() { - flaggy.DefaultParser.ShowVersionWithVersionFlag = false - - repoPath := "" - flaggy.String(&repoPath, "p", "path", "Path of git repo. (equivalent to --work-tree= --git-dir=/.git/)") - - filterPath := "" - flaggy.String(&filterPath, "f", "filter", "Path to filter on in `git log -- `. When in filter mode, the commits, reflog, and stash are filtered based on the given path, and some operations are restricted") - - dump := "" - flaggy.AddPositionalValue(&dump, "gitargs", 1, false, "Todo file") - flaggy.DefaultParser.PositionalFlags[0].Hidden = true - - versionFlag := false - flaggy.Bool(&versionFlag, "v", "version", "Print the current version") - - debuggingFlag := false - flaggy.Bool(&debuggingFlag, "d", "debug", "Run in debug mode with logging (see --logs flag below). Use the LOG_LEVEL env var to set the log level (debug/info/warn/error)") - - logFlag := false - flaggy.Bool(&logFlag, "l", "logs", "Tail lazygit logs (intended to be used when `lazygit --debug` is called in a separate terminal tab)") - - configFlag := false - flaggy.Bool(&configFlag, "c", "config", "Print the default config") - - configDirFlag := false - flaggy.Bool(&configDirFlag, "cd", "print-config-dir", "Print the config directory") - - useConfigDir := "" - flaggy.String(&useConfigDir, "ucd", "use-config-dir", "override default config directory with provided directory") - - workTree := "" - flaggy.String(&workTree, "w", "work-tree", "equivalent of the --work-tree git argument") - - gitDir := "" - flaggy.String(&gitDir, "g", "git-dir", "equivalent of the --git-dir git argument") - - customConfig := "" - flaggy.String(&customConfig, "ucf", "use-config-file", "Comma seperated list to custom config file(s)") - - flaggy.Parse() - - if repoPath != "" { - if workTree != "" || gitDir != "" { - log.Fatal("--path option is incompatible with the --work-tree and --git-dir options") - } - - absRepoPath, err := filepath.Abs(repoPath) - if err != nil { - log.Fatal(err) - } - workTree = absRepoPath - gitDir = filepath.Join(absRepoPath, ".git") + ldFlagsBuildInfo := &app.BuildInfo{ + Commit: commit, + Date: date, + Version: version, + BuildSource: buildSource, } - if customConfig != "" { - os.Setenv("LG_CONFIG_FILE", customConfig) - } - - if useConfigDir != "" { - os.Setenv("CONFIG_DIR", useConfigDir) - } - - if workTree != "" { - env.SetGitWorkTreeEnv(workTree) - } - - if gitDir != "" { - env.SetGitDirEnv(gitDir) - } - - if versionFlag { - fmt.Printf("commit=%s, build date=%s, build source=%s, version=%s, os=%s, arch=%s\n", commit, date, buildSource, version, runtime.GOOS, runtime.GOARCH) - os.Exit(0) - } - - if configFlag { - var buf bytes.Buffer - encoder := yaml.NewEncoder(&buf) - err := encoder.Encode(config.GetDefaultConfig()) - if err != nil { - log.Fatal(err.Error()) - } - fmt.Printf("%s\n", buf.String()) - os.Exit(0) - } - - if configDirFlag { - fmt.Printf("%s\n", config.ConfigDir()) - os.Exit(0) - } - - if logFlag { - app.TailLogs() - os.Exit(0) - } - - if workTree != "" { - if err := os.Chdir(workTree); err != nil { - log.Fatal(err.Error()) - } - } - - appConfig, err := config.NewAppConfig("lazygit", version, commit, date, buildSource, debuggingFlag) - if err != nil { - log.Fatal(err.Error()) - } - - app, err := app.NewApp(appConfig, filterPath) - - if err == nil { - err = app.Run() - } - - if err != nil { - if errorMessage, known := app.KnownError(err); known { - log.Fatal(errorMessage) - } - newErr := errors.Wrap(err, 0) - stackTrace := newErr.ErrorStack() - app.Log.Error(stackTrace) - - log.Fatal(fmt.Sprintf("%s: %s\n\n%s", app.Tr.ErrorOccurred, constants.Links.Issues, stackTrace)) - } + app.Start(ldFlagsBuildInfo, nil) } diff --git a/pkg/app/app.go b/pkg/app/app.go index 680a62049..a1b53d96c 100644 --- a/pkg/app/app.go +++ b/pkg/app/app.go @@ -2,10 +2,8 @@ package app import ( "bufio" - "errors" "fmt" "io" - "io/ioutil" "log" "os" "path/filepath" @@ -13,117 +11,91 @@ import ( "strconv" "strings" - "github.com/aybabtme/humanlog" + "github.com/go-errors/errors" + + "github.com/jesseduffield/generics/slices" + appTypes "github.com/jesseduffield/lazygit/pkg/app/types" "github.com/jesseduffield/lazygit/pkg/commands" "github.com/jesseduffield/lazygit/pkg/commands/git_config" "github.com/jesseduffield/lazygit/pkg/commands/oscommands" "github.com/jesseduffield/lazygit/pkg/common" "github.com/jesseduffield/lazygit/pkg/config" + "github.com/jesseduffield/lazygit/pkg/constants" "github.com/jesseduffield/lazygit/pkg/env" "github.com/jesseduffield/lazygit/pkg/gui" "github.com/jesseduffield/lazygit/pkg/i18n" "github.com/jesseduffield/lazygit/pkg/updates" - "github.com/sirupsen/logrus" ) -// App struct +// App is the struct that's instantiated from within main.go and it manages +// bootstrapping and running the application. type App struct { *common.Common - closers []io.Closer - Config config.AppConfigurer - OSCommand *oscommands.OSCommand - Gui *gui.Gui - Updater *updates.Updater // may only need this on the Gui - ClientContext string + closers []io.Closer + Config config.AppConfigurer + OSCommand *oscommands.OSCommand + Gui *gui.Gui + Updater *updates.Updater // may only need this on the Gui } -type errorMapping struct { - originalError string - newError string -} +func Run( + config config.AppConfigurer, + common *common.Common, + startArgs appTypes.StartArgs, +) { + app, err := NewApp(config, common) -func newProductionLogger() *logrus.Logger { - log := logrus.New() - log.Out = ioutil.Discard - log.SetLevel(logrus.ErrorLevel) - return log -} + if err == nil { + err = app.Run(startArgs) + } -func getLogLevel() logrus.Level { - strLevel := os.Getenv("LOG_LEVEL") - level, err := logrus.ParseLevel(strLevel) if err != nil { - return logrus.DebugLevel + if errorMessage, known := knownError(common.Tr, err); known { + log.Fatal(errorMessage) + } + newErr := errors.Wrap(err, 0) + stackTrace := newErr.ErrorStack() + app.Log.Error(stackTrace) + + log.Fatalf("%s: %s\n\n%s", common.Tr.ErrorOccurred, constants.Links.Issues, stackTrace) } - return level } -func newDevelopmentLogger() *logrus.Logger { - logger := logrus.New() - logger.SetLevel(getLogLevel()) - logPath, err := config.LogPath() - if err != nil { - log.Fatal(err) - } - file, err := os.OpenFile(logPath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) - if err != nil { - log.Fatalf("Unable to log to log file: %v", err) - } - logger.SetOutput(file) - return logger -} - -func newLogger(config config.AppConfigurer) *logrus.Entry { - var log *logrus.Logger - if config.GetDebug() || os.Getenv("DEBUG") == "TRUE" { - log = newDevelopmentLogger() - } else { - log = newProductionLogger() - } - - // highly recommended: tail -f development.log | humanlog - // https://github.com/aybabtme/humanlog - log.Formatter = &logrus.JSONFormatter{} - - return log.WithFields(logrus.Fields{ - "debug": config.GetDebug(), - "version": config.GetVersion(), - "commit": config.GetCommit(), - "buildDate": config.GetBuildDate(), - }) -} - -// NewApp bootstrap a new application -func NewApp(config config.AppConfigurer, filterPath string) (*App, error) { +func NewCommon(config config.AppConfigurer) (*common.Common, error) { userConfig := config.GetUserConfig() - app := &App{ - closers: []io.Closer{}, - Config: config, - } var err error log := newLogger(config) tr, err := i18n.NewTranslationSetFromConfig(log, userConfig.Gui.Language) if err != nil { - return app, err + return nil, err } - app.Common = &common.Common{ + return &common.Common{ Log: log, Tr: tr, UserConfig: userConfig, Debug: config.GetDebug(), + }, nil +} + +// NewApp bootstrap a new application +func NewApp(config config.AppConfigurer, common *common.Common) (*App, error) { + app := &App{ + closers: []io.Closer{}, + Config: config, + Common: common, } - // if we are being called in 'demon' mode, we can just return here - app.ClientContext = os.Getenv("LAZYGIT_CLIENT_COMMAND") - if app.ClientContext != "" { - return app, nil + app.OSCommand = oscommands.NewOSCommand(common, config, oscommands.GetPlatform(), oscommands.NewNullGuiIO(app.Log)) + + var err error + app.Updater, err = updates.NewUpdater(common, config, app.OSCommand) + if err != nil { + return app, err } - app.OSCommand = oscommands.NewOSCommand(app.Common, oscommands.GetPlatform(), oscommands.NewNullGuiIO(log)) - - app.Updater, err = updates.NewUpdater(app.Common, config, app.OSCommand) + dirName, err := os.Getwd() if err != nil { return app, err } @@ -135,7 +107,7 @@ func NewApp(config config.AppConfigurer, filterPath string) (*App, error) { gitConfig := git_config.NewStdCachedGitConfig(app.Log) - app.Gui, err = gui.NewGui(app.Common, config, gitConfig, app.Updater, filterPath, showRecentRepos) + app.Gui, err = gui.NewGui(common, config, gitConfig, app.Updater, showRecentRepos, dirName) if err != nil { return app, err } @@ -200,27 +172,9 @@ func isGitVersionValid(versionStr string) bool { return true } -func isGhVersionValid(versionStr string) bool { - // output should be something like: - // gh version 2.0.0 (2021-08-23) - // https://github.com/cli/cli/releases/tag/v2.0.0 - re := regexp.MustCompile(`[^\d]+([\d\.]+)`) - matches := re.FindStringSubmatch(versionStr) - - if len(matches) == 0 { - return false - } - - ghVersion := matches[1] - majorVersion, err := strconv.Atoi(ghVersion[0:1]) - if err != nil { - return false - } - if majorVersion < 2 { - return false - } - - return true +func isDirectoryAGitRepository(dir string) (bool, error) { + info, err := os.Stat(filepath.Join(dir, ".git")) + return info != nil, err } func (app *App) setupRepo() (bool, error) { @@ -239,146 +193,69 @@ func (app *App) setupRepo() (bool, error) { if err != nil { return false, err } - info, _ := os.Stat(filepath.Join(cwd, ".git")) - if info != nil && info.IsDir() { - return false, err // Current directory appears to be a git repository. + if isRepo, err := isDirectoryAGitRepository(cwd); isRepo { + return false, err } - shouldInitRepo := true - notARepository := app.UserConfig.NotARepository - if notARepository == "prompt" { + var shouldInitRepo bool + initialBranchArg := "" + switch app.UserConfig.NotARepository { + case "prompt": // Offer to initialize a new repository in current directory. fmt.Print(app.Tr.CreateRepo) response, _ := bufio.NewReader(os.Stdin).ReadString('\n') - if strings.Trim(response, " \n") != "y" { - shouldInitRepo = false - } - } else if notARepository == "skip" { - shouldInitRepo = false - } - - if !shouldInitRepo { - // check if we have a recent repo we can open - recentRepos := app.Config.GetAppState().RecentRepos - if len(recentRepos) > 0 { - var err error - // try opening each repo in turn, in case any have been deleted - for _, repoDir := range recentRepos { - if err = os.Chdir(repoDir); err == nil { - return true, nil - } + shouldInitRepo = (strings.Trim(response, " \r\n") == "y") + if shouldInitRepo { + // Ask for the initial branch name + fmt.Print(app.Tr.InitialBranch) + response, _ := bufio.NewReader(os.Stdin).ReadString('\n') + if trimmedResponse := strings.Trim(response, " \r\n"); len(trimmedResponse) > 0 { + initialBranchArg += "--initial-branch=" + app.OSCommand.Quote(trimmedResponse) } - return false, err } - + case "create": + shouldInitRepo = true + case "skip": + shouldInitRepo = false + case "quit": + fmt.Fprintln(os.Stderr, app.Tr.NotARepository) + os.Exit(1) + default: + fmt.Fprintln(os.Stderr, app.Tr.IncorrectNotARepository) os.Exit(1) } - if err := app.OSCommand.Cmd.New("git init").Run(); err != nil { - return false, err + + if shouldInitRepo { + if err := app.OSCommand.Cmd.New("git init " + initialBranchArg).Run(); err != nil { + return false, err + } + return false, nil } + + // check if we have a recent repo we can open + for _, repoDir := range app.Config.GetAppState().RecentRepos { + if isRepo, _ := isDirectoryAGitRepository(repoDir); isRepo { + if err := os.Chdir(repoDir); err == nil { + return true, nil + } + } + } + + fmt.Fprintln(os.Stderr, app.Tr.NoRecentRepositories) + os.Exit(1) } return false, nil } -func (app *App) Run() error { - if app.ClientContext == "INTERACTIVE_REBASE" { - return app.Rebase() - } - - if app.ClientContext == "EXIT_IMMEDIATELY" { - os.Exit(0) - } - - err := app.Gui.RunAndHandleError() +func (app *App) Run(startArgs appTypes.StartArgs) error { + err := app.Gui.RunAndHandleError(startArgs) return err } -func gitDir() string { - dir := env.GetGitDirEnv() - if dir == "" { - return ".git" - } - return dir -} - -// Rebase contains logic for when we've been run in demon mode, meaning we've -// given lazygit as a command for git to call e.g. to edit a file -func (app *App) Rebase() error { - app.Log.Info("Lazygit invoked as interactive rebase demon") - app.Log.Info("args: ", os.Args) - - if strings.HasSuffix(os.Args[1], "git-rebase-todo") { - if err := ioutil.WriteFile(os.Args[1], []byte(os.Getenv("LAZYGIT_REBASE_TODO")), 0644); err != nil { - return err - } - - } else if strings.HasSuffix(os.Args[1], filepath.Join(gitDir(), "COMMIT_EDITMSG")) { // TODO: test - // if we are rebasing and squashing, we'll see a COMMIT_EDITMSG - // but in this case we don't need to edit it, so we'll just return - } else { - app.Log.Info("Lazygit demon did not match on any use cases") - } - - return nil -} - // Close closes any resources func (app *App) Close() error { - for _, closer := range app.closers { - err := closer.Close() - if err != nil { - return err - } - } - return nil -} - -// KnownError takes an error and tells us whether it's an error that we know about where we can print a nicely formatted version of it rather than panicking with a stack trace -func (app *App) KnownError(err error) (string, bool) { - errorMessage := err.Error() - - knownErrorMessages := []string{app.Tr.MinGitVersionError} - - for _, message := range knownErrorMessages { - if errorMessage == message { - return message, true - } - } - - mappings := []errorMapping{ - { - originalError: "fatal: not a git repository", - newError: app.Tr.NotARepository, - }, - } - - for _, mapping := range mappings { - if strings.Contains(errorMessage, mapping.originalError) { - return mapping.newError, true - } - } - return "", false -} - -func TailLogs() { - logFilePath, err := config.LogPath() - if err != nil { - log.Fatal(err) - } - - fmt.Printf("Tailing log file %s\n\n", logFilePath) - - opts := humanlog.DefaultOptions - opts.Truncates = false - - _, err = os.Stat(logFilePath) - if err != nil { - if os.IsNotExist(err) { - log.Fatal("Log file does not exist. Run `lazygit --debug` first to create the log file") - } - log.Fatal(err) - } - - TailLogsForPlatform(logFilePath, opts) + return slices.TryForEach(app.closers, func(closer io.Closer) error { + return closer.Close() + }) } diff --git a/pkg/app/daemon/daemon.go b/pkg/app/daemon/daemon.go new file mode 100644 index 000000000..ea71bb956 --- /dev/null +++ b/pkg/app/daemon/daemon.go @@ -0,0 +1,107 @@ +package daemon + +import ( + "io/ioutil" + "log" + "os" + "path/filepath" + "strings" + + "github.com/jesseduffield/lazygit/pkg/common" + "github.com/jesseduffield/lazygit/pkg/env" +) + +// Sometimes lazygit will be invoked in daemon mode from a parent lazygit process. +// We do this when git lets us supply a program to run within a git command. +// For example, if we want to ensure that a git command doesn't hang due to +// waiting for an editor to save a commit message, we can tell git to invoke lazygit +// as the editor via 'GIT_EDITOR=lazygit', and use the env var +// 'LAZYGIT_DAEMON_KIND=EXIT_IMMEDIATELY' to specify that we want to run lazygit +// as a daemon which simply exits immediately. Any additional arguments we want +// to pass to a daemon can be done via other env vars. + +type DaemonKind string + +const ( + InteractiveRebase DaemonKind = "INTERACTIVE_REBASE" + ExitImmediately DaemonKind = "EXIT_IMMEDIATELY" +) + +const ( + DaemonKindEnvKey string = "LAZYGIT_DAEMON_KIND" + RebaseTODOEnvKey string = "LAZYGIT_REBASE_TODO" +) + +type Daemon interface { + Run() error +} + +func Handle(common *common.Common) { + d := getDaemon(common) + if d == nil { + return + } + + if err := d.Run(); err != nil { + log.Fatal(err) + } + + os.Exit(0) +} + +func InDaemonMode() bool { + return getDaemonKind() != "" +} + +func getDaemon(common *common.Common) Daemon { + switch getDaemonKind() { + case InteractiveRebase: + return &rebaseDaemon{c: common} + case ExitImmediately: + return &exitImmediatelyDaemon{c: common} + } + + return nil +} + +func getDaemonKind() DaemonKind { + return DaemonKind(os.Getenv(DaemonKindEnvKey)) +} + +type rebaseDaemon struct { + c *common.Common +} + +func (self *rebaseDaemon) Run() error { + self.c.Log.Info("Lazygit invoked as interactive rebase demon") + self.c.Log.Info("args: ", os.Args) + + if strings.HasSuffix(os.Args[1], "git-rebase-todo") { + if err := ioutil.WriteFile(os.Args[1], []byte(os.Getenv(RebaseTODOEnvKey)), 0o644); err != nil { + return err + } + } else if strings.HasSuffix(os.Args[1], filepath.Join(gitDir(), "COMMIT_EDITMSG")) { // TODO: test + // if we are rebasing and squashing, we'll see a COMMIT_EDITMSG + // but in this case we don't need to edit it, so we'll just return + } else { + self.c.Log.Info("Lazygit demon did not match on any use cases") + } + + return nil +} + +func gitDir() string { + dir := env.GetGitDirEnv() + if dir == "" { + return ".git" + } + return dir +} + +type exitImmediatelyDaemon struct { + c *common.Common +} + +func (self *exitImmediatelyDaemon) Run() error { + return nil +} diff --git a/pkg/app/entry_point.go b/pkg/app/entry_point.go new file mode 100644 index 000000000..5a767bb94 --- /dev/null +++ b/pkg/app/entry_point.go @@ -0,0 +1,265 @@ +package app + +import ( + "bytes" + "fmt" + "log" + "os" + "path/filepath" + "runtime" + "runtime/debug" + "strings" + + "github.com/integrii/flaggy" + "github.com/jesseduffield/lazygit/pkg/app/daemon" + appTypes "github.com/jesseduffield/lazygit/pkg/app/types" + "github.com/jesseduffield/lazygit/pkg/config" + "github.com/jesseduffield/lazygit/pkg/env" + integrationTypes "github.com/jesseduffield/lazygit/pkg/integration/types" + "github.com/jesseduffield/lazygit/pkg/logs" + "github.com/jesseduffield/lazygit/pkg/utils" + "github.com/samber/lo" + "gopkg.in/yaml.v3" +) + +type cliArgs struct { + RepoPath string + FilterPath string + GitArg string + PrintVersionInfo bool + Debug bool + TailLogs bool + PrintDefaultConfig bool + PrintConfigDir bool + UseConfigDir string + WorkTree string + GitDir string + CustomConfigFile string +} + +type BuildInfo struct { + Commit string + Date string + Version string + BuildSource string +} + +func Start(buildInfo *BuildInfo, integrationTest integrationTypes.IntegrationTest) { + cliArgs := parseCliArgsAndEnvVars() + mergeBuildInfo(buildInfo) + + if cliArgs.RepoPath != "" { + if cliArgs.WorkTree != "" || cliArgs.GitDir != "" { + log.Fatal("--path option is incompatible with the --work-tree and --git-dir options") + } + + absRepoPath, err := filepath.Abs(cliArgs.RepoPath) + if err != nil { + log.Fatal(err) + } + cliArgs.WorkTree = absRepoPath + cliArgs.GitDir = filepath.Join(absRepoPath, ".git") + } + + if cliArgs.CustomConfigFile != "" { + os.Setenv("LG_CONFIG_FILE", cliArgs.CustomConfigFile) + } + + if cliArgs.UseConfigDir != "" { + os.Setenv("CONFIG_DIR", cliArgs.UseConfigDir) + } + + if cliArgs.WorkTree != "" { + env.SetGitWorkTreeEnv(cliArgs.WorkTree) + } + + if cliArgs.GitDir != "" { + env.SetGitDirEnv(cliArgs.GitDir) + } + + if cliArgs.PrintVersionInfo { + fmt.Printf("commit=%s, build date=%s, build source=%s, version=%s, os=%s, arch=%s\n", buildInfo.Commit, buildInfo.Date, buildInfo.BuildSource, buildInfo.Version, runtime.GOOS, runtime.GOARCH) + os.Exit(0) + } + + if cliArgs.PrintDefaultConfig { + var buf bytes.Buffer + encoder := yaml.NewEncoder(&buf) + err := encoder.Encode(config.GetDefaultConfig()) + if err != nil { + log.Fatal(err.Error()) + } + fmt.Printf("%s\n", buf.String()) + os.Exit(0) + } + + if cliArgs.PrintConfigDir { + fmt.Printf("%s\n", config.ConfigDir()) + os.Exit(0) + } + + if cliArgs.TailLogs { + logs.TailLogs() + os.Exit(0) + } + + if cliArgs.WorkTree != "" { + if err := os.Chdir(cliArgs.WorkTree); err != nil { + log.Fatal(err.Error()) + } + } + + tempDir, err := os.MkdirTemp("", "lazygit-*") + if err != nil { + log.Fatal(err.Error()) + } + defer os.RemoveAll(tempDir) + + appConfig, err := config.NewAppConfig("lazygit", buildInfo.Version, buildInfo.Commit, buildInfo.Date, buildInfo.BuildSource, cliArgs.Debug, tempDir) + if err != nil { + log.Fatal(err.Error()) + } + + if integrationTest != nil { + integrationTest.SetupConfig(appConfig) + } + + common, err := NewCommon(appConfig) + if err != nil { + log.Fatal(err) + } + + if daemon.InDaemonMode() { + daemon.Handle(common) + return + } + + parsedGitArg := parseGitArg(cliArgs.GitArg) + + Run(appConfig, common, appTypes.NewStartArgs(cliArgs.FilterPath, parsedGitArg, integrationTest)) +} + +func parseCliArgsAndEnvVars() *cliArgs { + flaggy.DefaultParser.ShowVersionWithVersionFlag = false + + repoPath := "" + flaggy.String(&repoPath, "p", "path", "Path of git repo. (equivalent to --work-tree= --git-dir=/.git/)") + + filterPath := "" + flaggy.String(&filterPath, "f", "filter", "Path to filter on in `git log -- `. When in filter mode, the commits, reflog, and stash are filtered based on the given path, and some operations are restricted") + + gitArg := "" + flaggy.AddPositionalValue(&gitArg, "git-arg", 1, false, "Panel to focus upon opening lazygit. Accepted values (based on git terminology): status, branch, log, stash. Ignored if --filter arg is passed.") + + printVersionInfo := false + flaggy.Bool(&printVersionInfo, "v", "version", "Print the current version") + + debug := false + flaggy.Bool(&debug, "d", "debug", "Run in debug mode with logging (see --logs flag below). Use the LOG_LEVEL env var to set the log level (debug/info/warn/error)") + + tailLogs := false + flaggy.Bool(&tailLogs, "l", "logs", "Tail lazygit logs (intended to be used when `lazygit --debug` is called in a separate terminal tab)") + + printDefaultConfig := false + flaggy.Bool(&printDefaultConfig, "c", "config", "Print the default config") + + printConfigDir := false + flaggy.Bool(&printConfigDir, "cd", "print-config-dir", "Print the config directory") + + useConfigDir := "" + flaggy.String(&useConfigDir, "ucd", "use-config-dir", "override default config directory with provided directory") + + workTree := "" + flaggy.String(&workTree, "w", "work-tree", "equivalent of the --work-tree git argument") + + gitDir := "" + flaggy.String(&gitDir, "g", "git-dir", "equivalent of the --git-dir git argument") + + customConfigFile := "" + flaggy.String(&customConfigFile, "ucf", "use-config-file", "Comma separated list to custom config file(s)") + + flaggy.Parse() + + if os.Getenv("DEBUG") == "TRUE" { + debug = true + } + + return &cliArgs{ + RepoPath: repoPath, + FilterPath: filterPath, + GitArg: gitArg, + PrintVersionInfo: printVersionInfo, + Debug: debug, + TailLogs: tailLogs, + PrintDefaultConfig: printDefaultConfig, + PrintConfigDir: printConfigDir, + UseConfigDir: useConfigDir, + WorkTree: workTree, + GitDir: gitDir, + CustomConfigFile: customConfigFile, + } +} + +func parseGitArg(gitArg string) appTypes.GitArg { + typedArg := appTypes.GitArg(gitArg) + + // using switch so that linter catches when a new git arg value is defined but not handled here + switch typedArg { + case appTypes.GitArgNone, appTypes.GitArgStatus, appTypes.GitArgBranch, appTypes.GitArgLog, appTypes.GitArgStash: + return typedArg + } + + permittedValues := []string{ + string(appTypes.GitArgStatus), + string(appTypes.GitArgBranch), + string(appTypes.GitArgLog), + string(appTypes.GitArgStash), + } + + log.Fatalf("Invalid git arg value: '%s'. Must be one of the following values: %s. e.g. 'lazygit status'. See 'lazygit --help'.", + gitArg, + strings.Join(permittedValues, ", "), + ) + + panic("unreachable") +} + +// the buildInfo struct we get passed in is based on what's baked into the lazygit +// binary via the LDFLAGS argument. Some lazygit distributions will make use of these +// arguments and some will not. Go recently started baking in build info +// into the binary by default e.g. the git commit hash. So in this function +// we merge the two together, giving priority to the stuff set by LDFLAGS. +// Note: this mutates the argument passed in +func mergeBuildInfo(buildInfo *BuildInfo) { + // if the version has already been set by build flags then we'll honour that. + // chances are it's something like v0.31.0 which is more informative than a + // commit hash. + if buildInfo.Version != "" { + return + } + + buildInfo.Version = "unversioned" + + goBuildInfo, ok := debug.ReadBuildInfo() + if !ok { + return + } + + revision, ok := lo.Find(goBuildInfo.Settings, func(setting debug.BuildSetting) bool { + return setting.Key == "vcs.revision" + }) + if ok { + buildInfo.Commit = revision.Value + // if lazygit was built from source we'll show the version as the + // abbreviated commit hash + buildInfo.Version = utils.ShortSha(revision.Value) + } + + // if version hasn't been set we assume that neither has the date + time, ok := lo.Find(goBuildInfo.Settings, func(setting debug.BuildSetting) bool { + return setting.Key == "vcs.time" + }) + if ok { + buildInfo.Date = time.Value + } +} diff --git a/pkg/app/errors.go b/pkg/app/errors.go new file mode 100644 index 000000000..1556e58fe --- /dev/null +++ b/pkg/app/errors.go @@ -0,0 +1,39 @@ +package app + +import ( + "strings" + + "github.com/jesseduffield/generics/slices" + "github.com/jesseduffield/lazygit/pkg/i18n" +) + +type errorMapping struct { + originalError string + newError string +} + +// knownError takes an error and tells us whether it's an error that we know about where we can print a nicely formatted version of it rather than panicking with a stack trace +func knownError(tr *i18n.TranslationSet, err error) (string, bool) { + errorMessage := err.Error() + + knownErrorMessages := []string{tr.MinGitVersionError} + + if slices.Contains(knownErrorMessages, errorMessage) { + return errorMessage, true + } + + mappings := []errorMapping{ + { + originalError: "fatal: not a git repository", + newError: tr.NotARepository, + }, + } + + if mapping, ok := slices.Find(mappings, func(mapping errorMapping) bool { + return strings.Contains(errorMessage, mapping.originalError) + }); ok { + return mapping.newError, true + } + + return "", false +} diff --git a/pkg/app/logging.go b/pkg/app/logging.go index 7df0bb0c2..7a5eef74e 100644 --- a/pkg/app/logging.go +++ b/pkg/app/logging.go @@ -1,31 +1,56 @@ -//go:build !windows -// +build !windows - package app import ( + "io/ioutil" "log" "os" - "github.com/aybabtme/humanlog" - "github.com/jesseduffield/lazygit/pkg/secureexec" + "github.com/jesseduffield/lazygit/pkg/config" + "github.com/sirupsen/logrus" ) -func TailLogsForPlatform(logFilePath string, opts *humanlog.HandlerOptions) { - cmd := secureexec.Command("tail", "-f", logFilePath) - - stdout, _ := cmd.StdoutPipe() - if err := cmd.Start(); err != nil { - log.Fatal(err) +func newLogger(config config.AppConfigurer) *logrus.Entry { + var log *logrus.Logger + if config.GetDebug() { + log = newDevelopmentLogger() + } else { + log = newProductionLogger() } - if err := humanlog.Scanner(stdout, os.Stdout, opts); err != nil { - log.Fatal(err) - } + // highly recommended: tail -f development.log | humanlog + // https://github.com/aybabtme/humanlog + log.Formatter = &logrus.JSONFormatter{} - if err := cmd.Wait(); err != nil { - log.Fatal(err) - } - - os.Exit(0) + return log.WithFields(logrus.Fields{}) +} + +func newProductionLogger() *logrus.Logger { + log := logrus.New() + log.Out = ioutil.Discard + log.SetLevel(logrus.ErrorLevel) + return log +} + +func newDevelopmentLogger() *logrus.Logger { + logger := logrus.New() + logger.SetLevel(getLogLevel()) + logPath, err := config.LogPath() + if err != nil { + log.Fatal(err) + } + file, err := os.OpenFile(logPath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0o666) + if err != nil { + log.Fatalf("Unable to log to log file: %v", err) + } + logger.SetOutput(file) + return logger +} + +func getLogLevel() logrus.Level { + strLevel := os.Getenv("LOG_LEVEL") + level, err := logrus.ParseLevel(strLevel) + if err != nil { + return logrus.DebugLevel + } + return level } diff --git a/pkg/app/logging_windows.go b/pkg/app/logging_windows.go deleted file mode 100644 index f8b3d4990..000000000 --- a/pkg/app/logging_windows.go +++ /dev/null @@ -1,72 +0,0 @@ -//go:build windows -// +build windows - -package app - -import ( - "bufio" - "github.com/aybabtme/humanlog" - "log" - "os" - "strings" - "time" -) - -func TailLogsForPlatform(logFilePath string, opts *humanlog.HandlerOptions) { - var lastModified int64 = 0 - var lastOffset int64 = 0 - for { - stat, err := os.Stat(logFilePath) - if err != nil { - log.Fatal(err) - } - if stat.ModTime().Unix() > lastModified { - err = TailFrom(lastOffset, logFilePath, opts) - if err != nil { - log.Fatal(err) - } - } - lastOffset = stat.Size() - time.Sleep(1 * time.Second) - } -} - -func OpenAndSeek(filepath string, offset int64) (*os.File, error) { - file, err := os.Open(filepath) - if err != nil { - return nil, err - } - - _, err = file.Seek(offset, 0) - if err != nil { - _ = file.Close() - return nil, err - } - return file, nil -} - -func TailFrom(lastOffset int64, logFilePath string, opts *humanlog.HandlerOptions) error { - file, err := OpenAndSeek(logFilePath, lastOffset) - if err != nil { - return err - } - - fileScanner := bufio.NewScanner(file) - var lines []string - for fileScanner.Scan() { - lines = append(lines, fileScanner.Text()) - } - file.Close() - lineCount := len(lines) - lastTen := lines - if lineCount > 10 { - lastTen = lines[lineCount-10:] - } - for _, line := range lastTen { - reader := strings.NewReader(line) - if err := humanlog.Scanner(reader, os.Stdout, opts); err != nil { - log.Fatal(err) - } - } - return nil -} diff --git a/pkg/app/types/types.go b/pkg/app/types/types.go new file mode 100644 index 000000000..002111087 --- /dev/null +++ b/pkg/app/types/types.go @@ -0,0 +1,33 @@ +package app + +import ( + integrationTypes "github.com/jesseduffield/lazygit/pkg/integration/types" +) + +// StartArgs is the struct that represents some things we want to do on program start +type StartArgs struct { + // FilterPath determines which path we're going to filter on so that we only see commits from that file. + FilterPath string + // GitArg determines what context we open in + GitArg GitArg + // integration test (only relevant when invoking lazygit in the context of an integration test) + IntegrationTest integrationTypes.IntegrationTest +} + +type GitArg string + +const ( + GitArgNone GitArg = "" + GitArgStatus GitArg = "status" + GitArgBranch GitArg = "branch" + GitArgLog GitArg = "log" + GitArgStash GitArg = "stash" +) + +func NewStartArgs(filterPath string, gitArg GitArg, test integrationTypes.IntegrationTest) StartArgs { + return StartArgs{ + FilterPath: filterPath, + GitArg: gitArg, + IntegrationTest: test, + } +} diff --git a/pkg/cheatsheet/check.go b/pkg/cheatsheet/check.go index 03f65d910..a0c40e775 100644 --- a/pkg/cheatsheet/check.go +++ b/pkg/cheatsheet/check.go @@ -17,11 +17,11 @@ func Check() { tmpDir := filepath.Join(os.TempDir(), "lazygit_cheatsheet") err := os.RemoveAll(tmpDir) if err != nil { - log.Fatalf("Error occured while checking if cheatsheets are up to date: %v", err) + log.Fatalf("Error occurred while checking if cheatsheets are up to date: %v", err) } - err = os.Mkdir(tmpDir, 0700) + err = os.Mkdir(tmpDir, 0o700) if err != nil { - log.Fatalf("Error occured while checking if cheatsheets are up to date: %v", err) + log.Fatalf("Error occurred while checking if cheatsheets are up to date: %v", err) } generateAtDir(tmpDir) @@ -45,9 +45,9 @@ func Check() { Context: 1, }) if err != nil { - log.Fatalf("Error occured while checking if cheatsheets are up to date: %v", err) + log.Fatalf("Error occurred while checking if cheatsheets are up to date: %v", err) } - fmt.Printf("\nCheatsheets are out of date. Please run `%s` at the project root and commit the changes\n", CommandToRun()) + fmt.Printf("\nCheatsheets are out of date. Please run `%s` at the project root and commit the changes. If you run the script and no keybindings files are updated as a result, try rebasing onto master and trying again.\n", CommandToRun()) os.Exit(1) } @@ -62,7 +62,7 @@ func obtainContent(dir string) string { if re.MatchString(path) { bytes, err := ioutil.ReadFile(path) if err != nil { - log.Fatalf("Error occured while checking if cheatsheets are up to date: %v", err) + log.Fatalf("Error occurred while checking if cheatsheets are up to date: %v", err) } content += fmt.Sprintf("\n%s\n\n", filepath.Base(path)) content += string(bytes) @@ -70,9 +70,8 @@ func obtainContent(dir string) string { return nil }) - if err != nil { - log.Fatalf("Error occured while checking if cheatsheets are up to date: %v", err) + log.Fatalf("Error occurred while checking if cheatsheets are up to date: %v", err) } return content diff --git a/pkg/cheatsheet/generate.go b/pkg/cheatsheet/generate.go index 94eea0687..3b9d9c2d1 100644 --- a/pkg/cheatsheet/generate.go +++ b/pkg/cheatsheet/generate.go @@ -12,18 +12,32 @@ import ( "fmt" "log" "os" - "sort" + "github.com/jesseduffield/generics/maps" + "github.com/jesseduffield/generics/slices" "github.com/jesseduffield/lazygit/pkg/app" "github.com/jesseduffield/lazygit/pkg/config" - "github.com/jesseduffield/lazygit/pkg/gui" + "github.com/jesseduffield/lazygit/pkg/gui/keybindings" + "github.com/jesseduffield/lazygit/pkg/gui/types" "github.com/jesseduffield/lazygit/pkg/i18n" - "github.com/jesseduffield/lazygit/pkg/integration" + "github.com/jesseduffield/lazygit/pkg/utils" + "github.com/samber/lo" ) type bindingSection struct { title string - bindings []*gui.Binding + bindings []*types.Binding +} + +type header struct { + // priority decides the order of the headers in the cheatsheet (lower means higher) + priority int + title string +} + +type headerWithBindings struct { + header header + bindings []*types.Binding } func CommandToRun() string { @@ -31,25 +45,28 @@ func CommandToRun() string { } func GetDir() string { - return integration.GetRootDirectory() + "/docs/keybindings" + return utils.GetLazygitRootDirectory() + "/docs/keybindings" } func generateAtDir(cheatsheetDir string) { - os.Setenv("LANG", "en") - translationSetsByLang := i18n.GetTranslationSets() mConfig := config.NewDummyAppConfig() for lang := range translationSetsByLang { - os.Setenv("LC_ALL", lang) - mApp, _ := app.NewApp(mConfig, "") + mConfig.GetUserConfig().Gui.Language = lang + common, err := app.NewCommon(mConfig) + if err != nil { + log.Fatal(err) + } + mApp, _ := app.NewApp(mConfig, common) path := cheatsheetDir + "/Keybindings_" + lang + ".md" file, err := os.Create(path) if err != nil { panic(err) } - bindingSections := getBindingSections(mApp) + bindings := mApp.Gui.GetCheatsheetKeybindings() + bindingSections := getBindingSections(bindings, mApp.Tr) content := formatSections(mApp.Tr, bindingSections) content = fmt.Sprintf("_This file is auto-generated. To update, make the changes in the "+ "pkg/i18n directory and then run `%s` from the project root._\n\n%s", CommandToRun(), content) @@ -68,9 +85,7 @@ func writeString(file *os.File, str string) { } } -func localisedTitle(mApp *app.App, str string) string { - tr := mApp.Tr - +func localisedTitle(tr *i18n.TranslationSet, str string) string { contextTitleMap := map[string]string{ "global": tr.GlobalTitle, "navigation": tr.NavigationTitle, @@ -88,12 +103,10 @@ func localisedTitle(mApp *app.App, str string) string { "commitMessage": tr.CommitMessageTitle, "commits": tr.CommitsTitle, "confirmation": tr.ConfirmationTitle, - "credentials": tr.CredentialsTitle, "information": tr.InformationTitle, - "main": tr.MainTitle, + "main": tr.NormalTitle, "patchBuilding": tr.PatchBuildingTitle, - "merging": tr.MergingTitle, - "normal": tr.NormalTitle, + "mergeConflicts": tr.MergingTitle, "staging": tr.StagingTitle, "menu": tr.MenuTitle, "search": tr.SearchTitle, @@ -111,142 +124,59 @@ func localisedTitle(mApp *app.App, str string) string { return title } -func formatTitle(title string) string { - return fmt.Sprintf("\n## %s\n\n", title) -} - -func formatBinding(binding *gui.Binding) string { - if binding.Alternative != "" { - return fmt.Sprintf(" %s: %s (%s)\n", gui.GetKeyDisplay(binding.Key), binding.Description, binding.Alternative) - } - return fmt.Sprintf(" %s: %s\n", gui.GetKeyDisplay(binding.Key), binding.Description) -} - -func getBindingSections(mApp *app.App) []*bindingSection { - bindingSections := []*bindingSection{} - - bindings := mApp.Gui.GetInitialKeybindings() - - type contextAndViewType struct { - subtitle string - title string - } - - contextAndViewBindingMap := map[contextAndViewType][]*gui.Binding{} - -outer: - for _, binding := range bindings { - if binding.Tag == "navigation" { - key := contextAndViewType{subtitle: "", title: "navigation"} - existing := contextAndViewBindingMap[key] - if existing == nil { - contextAndViewBindingMap[key] = []*gui.Binding{binding} - } else { - for _, navBinding := range contextAndViewBindingMap[key] { - if navBinding.Description == binding.Description { - continue outer - } - } - contextAndViewBindingMap[key] = append(contextAndViewBindingMap[key], binding) - } - - continue outer - } - - contexts := []string{} - if len(binding.Contexts) == 0 { - contexts = append(contexts, "") - } else { - contexts = append(contexts, binding.Contexts...) - } - - for _, context := range contexts { - key := contextAndViewType{subtitle: context, title: binding.ViewName} - existing := contextAndViewBindingMap[key] - if existing == nil { - contextAndViewBindingMap[key] = []*gui.Binding{binding} - } else { - contextAndViewBindingMap[key] = append(contextAndViewBindingMap[key], binding) - } - } - } - - type groupedBindingsType struct { - contextAndView contextAndViewType - bindings []*gui.Binding - } - - groupedBindings := make([]groupedBindingsType, len(contextAndViewBindingMap)) - - for contextAndView, contextBindings := range contextAndViewBindingMap { - groupedBindings = append(groupedBindings, groupedBindingsType{contextAndView: contextAndView, bindings: contextBindings}) - } - - sort.Slice(groupedBindings, func(i, j int) bool { - first := groupedBindings[i].contextAndView - second := groupedBindings[j].contextAndView - if first.title == "" { - return true - } - if second.title == "" { +func getBindingSections(bindings []*types.Binding, tr *i18n.TranslationSet) []*bindingSection { + excludedViews := []string{"stagingSecondary", "patchBuildingSecondary"} + bindingsToDisplay := slices.Filter(bindings, func(binding *types.Binding) bool { + if lo.Contains(excludedViews, binding.ViewName) { return false } - if first.title == "navigation" { - return true - } - if second.title == "navigation" { - return false - } - return first.title < second.title || (first.title == second.title && first.subtitle < second.subtitle) + + return (binding.Description != "" || binding.Alternative != "") }) - for _, group := range groupedBindings { - contextAndView := group.contextAndView - contextBindings := group.bindings - mApp.Log.Info("viewname: " + contextAndView.title + ", context: " + contextAndView.subtitle) - viewName := contextAndView.title - if viewName == "" { - viewName = "global" - } - translatedView := localisedTitle(mApp, viewName) - var title string - if contextAndView.subtitle == "" { - addendum := " " + mApp.Tr.Panel - if viewName == "global" || viewName == "navigation" { - addendum = "" + bindingsByHeader := lo.GroupBy(bindingsToDisplay, func(binding *types.Binding) header { + return getHeader(binding, tr) + }) + + bindingGroups := maps.MapToSlice( + bindingsByHeader, + func(header header, hBindings []*types.Binding) headerWithBindings { + uniqBindings := lo.UniqBy(hBindings, func(binding *types.Binding) string { + return binding.Description + keybindings.LabelFromKey(binding.Key) + }) + + return headerWithBindings{ + header: header, + bindings: uniqBindings, } - title = fmt.Sprintf("%s%s", translatedView, addendum) - } else { - translatedContextName := localisedTitle(mApp, contextAndView.subtitle) - title = fmt.Sprintf("%s %s (%s)", translatedView, mApp.Tr.Panel, translatedContextName) - } + }, + ) - for _, binding := range contextBindings { - bindingSections = addBinding(title, bindingSections, binding) + slices.SortFunc(bindingGroups, func(a, b headerWithBindings) bool { + if a.header.priority != b.header.priority { + return a.header.priority > b.header.priority } - } + return a.header.title < b.header.title + }) - return bindingSections + return slices.Map(bindingGroups, func(hb headerWithBindings) *bindingSection { + return &bindingSection{ + title: hb.header.title, + bindings: hb.bindings, + } + }) } -func addBinding(title string, bindingSections []*bindingSection, binding *gui.Binding) []*bindingSection { - if binding.Description == "" && binding.Alternative == "" { - return bindingSections +func getHeader(binding *types.Binding, tr *i18n.TranslationSet) header { + if binding.Tag == "navigation" { + return header{priority: 2, title: localisedTitle(tr, "navigation")} } - for _, section := range bindingSections { - if title == section.title { - section.bindings = append(section.bindings, binding) - return bindingSections - } + if binding.ViewName == "" { + return header{priority: 3, title: localisedTitle(tr, "global")} } - section := &bindingSection{ - title: title, - bindings: []*gui.Binding{binding}, - } - - return append(bindingSections, section) + return header{priority: 1, title: localisedTitle(tr, binding.ViewName)} } func formatSections(tr *i18n.TranslationSet, bindingSections []*bindingSection) string { @@ -263,3 +193,19 @@ func formatSections(tr *i18n.TranslationSet, bindingSections []*bindingSection) return content } + +func formatTitle(title string) string { + return fmt.Sprintf("\n## %s\n\n", title) +} + +func formatBinding(binding *types.Binding) string { + if binding.Alternative != "" { + return fmt.Sprintf( + " %s: %s (%s)\n", + keybindings.LabelFromKey(binding.Key), + binding.Description, + binding.Alternative, + ) + } + return fmt.Sprintf(" %s: %s\n", keybindings.LabelFromKey(binding.Key), binding.Description) +} diff --git a/pkg/cheatsheet/generate_test.go b/pkg/cheatsheet/generate_test.go new file mode 100644 index 000000000..44c49a461 --- /dev/null +++ b/pkg/cheatsheet/generate_test.go @@ -0,0 +1,240 @@ +package cheatsheet + +import ( + "testing" + + "github.com/jesseduffield/lazygit/pkg/gui/types" + "github.com/jesseduffield/lazygit/pkg/i18n" + "github.com/stretchr/testify/assert" +) + +func TestGetBindingSections(t *testing.T) { + tr := i18n.EnglishTranslationSet() + + tests := []struct { + testName string + bindings []*types.Binding + expected []*bindingSection + }{ + { + testName: "no bindings", + bindings: []*types.Binding{}, + expected: []*bindingSection{}, + }, + { + testName: "one binding", + bindings: []*types.Binding{ + { + ViewName: "files", + Description: "stage file", + }, + }, + expected: []*bindingSection{ + { + title: "Files", + bindings: []*types.Binding{ + { + ViewName: "files", + Description: "stage file", + }, + }, + }, + }, + }, + { + testName: "global binding", + bindings: []*types.Binding{ + { + ViewName: "", + Description: "quit", + }, + }, + expected: []*bindingSection{ + { + title: "Global Keybindings", + bindings: []*types.Binding{ + { + ViewName: "", + Description: "quit", + }, + }, + }, + }, + }, + { + testName: "grouped bindings", + bindings: []*types.Binding{ + { + ViewName: "files", + Description: "stage file", + }, + { + ViewName: "files", + Description: "unstage file", + }, + { + ViewName: "submodules", + Description: "drop submodule", + }, + }, + expected: []*bindingSection{ + { + title: "Files", + bindings: []*types.Binding{ + { + ViewName: "files", + Description: "stage file", + }, + { + ViewName: "files", + Description: "unstage file", + }, + }, + }, + { + title: "Submodules", + bindings: []*types.Binding{ + { + ViewName: "submodules", + Description: "drop submodule", + }, + }, + }, + }, + }, + { + testName: "with navigation bindings", + bindings: []*types.Binding{ + { + ViewName: "files", + Description: "stage file", + }, + { + ViewName: "files", + Description: "unstage file", + }, + { + ViewName: "files", + Description: "scroll", + Tag: "navigation", + }, + { + ViewName: "commits", + Description: "revert commit", + }, + }, + expected: []*bindingSection{ + { + title: "List Panel Navigation", + bindings: []*types.Binding{ + { + ViewName: "files", + Description: "scroll", + Tag: "navigation", + }, + }, + }, + { + title: "Commits", + bindings: []*types.Binding{ + { + ViewName: "commits", + Description: "revert commit", + }, + }, + }, + { + title: "Files", + bindings: []*types.Binding{ + { + ViewName: "files", + Description: "stage file", + }, + { + ViewName: "files", + Description: "unstage file", + }, + }, + }, + }, + }, + { + testName: "with duplicate navigation bindings", + bindings: []*types.Binding{ + { + ViewName: "files", + Description: "stage file", + }, + { + ViewName: "files", + Description: "unstage file", + }, + { + ViewName: "files", + Description: "scroll", + Tag: "navigation", + }, + { + ViewName: "commits", + Description: "revert commit", + }, + { + ViewName: "commits", + Description: "scroll", + Tag: "navigation", + }, + { + ViewName: "commits", + Description: "page up", + Tag: "navigation", + }, + }, + expected: []*bindingSection{ + { + title: "List Panel Navigation", + bindings: []*types.Binding{ + { + ViewName: "files", + Description: "scroll", + Tag: "navigation", + }, + { + ViewName: "commits", + Description: "page up", + Tag: "navigation", + }, + }, + }, + { + title: "Commits", + bindings: []*types.Binding{ + { + ViewName: "commits", + Description: "revert commit", + }, + }, + }, + { + title: "Files", + bindings: []*types.Binding{ + { + ViewName: "files", + Description: "stage file", + }, + { + ViewName: "files", + Description: "unstage file", + }, + }, + }, + }, + }, + } + + for _, test := range tests { + t.Run(test.testName, func(t *testing.T) { + actual := getBindingSections(test.bindings, &tr) + assert.EqualValues(t, test.expected, actual) + }) + } +} diff --git a/pkg/commands/git.go b/pkg/commands/git.go index 31ba2f42a..0e1c27219 100644 --- a/pkg/commands/git.go +++ b/pkg/commands/git.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/go-errors/errors" + "github.com/sasha-s/go-deadlock" gogit "github.com/jesseduffield/go-git/v5" "github.com/jesseduffield/lazygit/pkg/commands/git_commands" @@ -57,12 +58,13 @@ func NewGitCommand( cmn *common.Common, osCommand *oscommands.OSCommand, gitConfig git_config.IGitConfig, + syncMutex *deadlock.Mutex, ) (*GitCommand, error) { if err := navigateToRepoRootDirectory(os.Stat, os.Chdir); err != nil { return nil, err } - repo, err := setupRepository(gogit.PlainOpen, cmn.Tr.GitconfigParseErr) + repo, err := setupRepository(gogit.PlainOpenWithOptions, gogit.PlainOpenOptions{DetectDotGit: false, EnableDotGitCommonDir: true}, cmn.Tr.GitconfigParseErr) if err != nil { return nil, err } @@ -78,6 +80,7 @@ func NewGitCommand( gitConfig, dotGitDir, repo, + syncMutex, ), nil } @@ -87,6 +90,7 @@ func NewGitCommandAux( gitConfig git_config.IGitConfig, dotGitDir string, repo *gogit.Repository, + syncMutex *deadlock.Mutex, ) *GitCommand { cmd := NewGitCmdObjBuilder(cmn.Log, osCommand.Cmd) @@ -96,7 +100,7 @@ func NewGitCommandAux( // on the one struct. // common ones are: cmn, osCommand, dotGitDir, configCommands configCommands := git_commands.NewConfigCommands(cmn, gitConfig, repo) - gitCommon := git_commands.NewGitCommon(cmn, cmd, osCommand, dotGitDir, repo, configCommands) + gitCommon := git_commands.NewGitCommon(cmn, cmd, osCommand, dotGitDir, repo, configCommands, syncMutex) statusCommands := git_commands.NewStatusCommands(gitCommon) fileLoader := loaders.NewFileLoader(cmn, cmd, configCommands) @@ -206,7 +210,7 @@ func resolvePath(path string) (string, error) { return filepath.EvalSymlinks(path) } -func setupRepository(openGitRepository func(string) (*gogit.Repository, error), gitConfigParseErrorStr string) (*gogit.Repository, error) { +func setupRepository(openGitRepository func(string, *gogit.PlainOpenOptions) (*gogit.Repository, error), options gogit.PlainOpenOptions, gitConfigParseErrorStr string) (*gogit.Repository, error) { unresolvedPath := env.GetGitDirEnv() if unresolvedPath == "" { var err error @@ -221,8 +225,7 @@ func setupRepository(openGitRepository func(string) (*gogit.Repository, error), return nil, err } - repository, err := openGitRepository(path) - + repository, err := openGitRepository(path, &options) if err != nil { if strings.Contains(err.Error(), `unquoted '\' must be followed by new line`) { return nil, errors.New(gitConfigParseErrorStr) @@ -254,7 +257,7 @@ func findDotGitDir(stat func(string) (os.FileInfo, error), readFile func(filenam } fileContent := string(fileBytes) if !strings.HasPrefix(fileContent, "gitdir: ") { - return "", errors.New(".git is a file which suggests we are in a submodule but the file's contents do not contain a gitdir pointing to the actual .git directory") + return "", errors.New(".git is a file which suggests we are in a submodule or a worktree but the file's contents do not contain a gitdir pointing to the actual .git directory") } return strings.TrimSpace(strings.TrimPrefix(fileContent, "gitdir: ")), nil } diff --git a/pkg/commands/git_commands/bisect_info.go b/pkg/commands/git_commands/bisect_info.go index 5b3b1f028..ea20d0d38 100644 --- a/pkg/commands/git_commands/bisect_info.go +++ b/pkg/commands/git_commands/bisect_info.go @@ -1,6 +1,10 @@ package git_commands -import "github.com/sirupsen/logrus" +import ( + "github.com/jesseduffield/generics/maps" + "github.com/jesseduffield/generics/slices" + "github.com/sirupsen/logrus" +) // although the typical terms in a git bisect are 'bad' and 'good', they're more // generally known as 'new' and 'old'. Semi-recently git allowed the user to define @@ -93,11 +97,5 @@ func (self *BisectInfo) Bisecting() bool { return false } - for _, status := range self.statusMap { - if status == BisectStatusOld { - return true - } - } - - return false + return slices.Contains(maps.Values(self.statusMap), BisectStatusOld) } diff --git a/pkg/commands/git_commands/branch.go b/pkg/commands/git_commands/branch.go index f6b084c9f..d8be71deb 100644 --- a/pkg/commands/git_commands/branch.go +++ b/pkg/commands/git_commands/branch.go @@ -11,7 +11,7 @@ import ( // this takes something like: // * (HEAD detached at 264fc6f5) -// remotes +// remotes // and returns '264fc6f5' as the second match const CurrentBranchNameRegex = `(?m)^\*.*?([^ ]*?)\)?$` @@ -109,6 +109,10 @@ func (self *BranchCommands) SetUpstream(remoteName string, remoteBranchName stri return self.cmd.New(fmt.Sprintf("git branch --set-upstream-to=%s/%s %s", self.cmd.Quote(remoteName), self.cmd.Quote(remoteBranchName), self.cmd.Quote(branchName))).Run() } +func (self *BranchCommands) UnsetUpstream(branchName string) error { + return self.cmd.New(fmt.Sprintf("git branch --unset-upstream %s", self.cmd.Quote(branchName))).Run() +} + func (self *BranchCommands) GetCurrentBranchUpstreamDifferenceCount() (string, string) { return self.GetCommitDifferences("HEAD", "HEAD@{u}") } @@ -142,7 +146,7 @@ func (self *BranchCommands) Rename(oldName string, newName string) error { } func (self *BranchCommands) GetRawBranches() (string, error) { - return self.cmd.New(`git for-each-ref --sort=-committerdate --format="%(HEAD)|%(refname:short)|%(upstream:short)|%(upstream:track)" refs/heads`).DontLog().RunWithOutput() + return self.cmd.New(`git for-each-ref --sort=-committerdate --format="%(HEAD)%00%(refname:short)%00%(upstream:short)%00%(upstream:track)" refs/heads`).DontLog().RunWithOutput() } type MergeOpts struct { diff --git a/pkg/commands/git_commands/commit.go b/pkg/commands/git_commands/commit.go index 38f50bdda..444ec17ac 100644 --- a/pkg/commands/git_commands/commit.go +++ b/pkg/commands/git_commands/commit.go @@ -4,6 +4,7 @@ import ( "fmt" "strings" + "github.com/go-errors/errors" "github.com/jesseduffield/lazygit/pkg/commands/oscommands" ) @@ -22,6 +23,17 @@ func (self *CommitCommands) RewordLastCommit(message string) error { return self.cmd.New("git commit --allow-empty --amend --only -m " + self.cmd.Quote(message)).Run() } +// ResetAuthor resets the author of the topmost commit +func (self *CommitCommands) ResetAuthor() error { + return self.cmd.New("git commit --allow-empty --only --no-edit --amend --reset-author").Run() +} + +// Sets the commit's author to the supplied value. Value is expected to be of the form 'Name ' +func (self *CommitCommands) SetAuthor(value string) error { + commandStr := fmt.Sprintf("git commit --allow-empty --only --no-edit --amend --author=%s", self.cmd.Quote(value)) + return self.cmd.New(commandStr).Run() +} + // ResetToCommit reset to commit func (self *CommitCommands) ResetToCommit(sha string, strength string, envVars []string) error { return self.cmd.New(fmt.Sprintf("git reset --%s %s", strength, sha)). @@ -70,10 +82,37 @@ func (self *CommitCommands) GetHeadCommitMessage() (string, error) { func (self *CommitCommands) GetCommitMessage(commitSha string) (string, error) { cmdStr := "git rev-list --format=%B --max-count=1 " + commitSha messageWithHeader, err := self.cmd.New(cmdStr).DontLog().RunWithOutput() - message := strings.Join(strings.SplitAfter(messageWithHeader, "\n")[1:], "\n") + message := strings.Join(strings.SplitAfter(messageWithHeader, "\n")[1:], "") return strings.TrimSpace(message), err } +func (self *CommitCommands) GetCommitDiff(commitSha string) (string, error) { + cmdStr := "git show --no-color " + commitSha + diff, err := self.cmd.New(cmdStr).DontLog().RunWithOutput() + return diff, err +} + +type Author struct { + Name string + Email string +} + +func (self *CommitCommands) GetCommitAuthor(commitSha string) (Author, error) { + cmdStr := "git show --no-patch --pretty=format:'%an%x00%ae' " + commitSha + output, err := self.cmd.New(cmdStr).DontLog().RunWithOutput() + if err != nil { + return Author{}, err + } + + split := strings.SplitN(strings.TrimSpace(output), "\x00", 2) + if len(split) < 2 { + return Author{}, errors.New("unexpected git output") + } + + author := Author{Name: split[0], Email: split[1]} + return author, err +} + func (self *CommitCommands) GetCommitMessageFirstLine(sha string) (string, error) { return self.GetCommitMessagesFirstLine([]string{sha}) } diff --git a/pkg/commands/git_commands/commit_test.go b/pkg/commands/git_commands/commit_test.go index 08ee7e5cc..96a46ecf4 100644 --- a/pkg/commands/git_commands/commit_test.go +++ b/pkg/commands/git_commands/commit_test.go @@ -161,3 +161,49 @@ func TestCommitShowCmdObj(t *testing.T) { }) } } + +func TestGetCommitMsg(t *testing.T) { + type scenario struct { + testName string + input string + expectedOutput string + } + scenarios := []scenario{ + { + "empty", + ` commit deadbeef`, + ``, + }, + { + "no line breaks (single line)", + `commit deadbeef +use generics to DRY up context code`, + `use generics to DRY up context code`, + }, + { + "with line breaks", + `commit deadbeef +Merge pull request #1750 from mark2185/fix-issue-template + +'git-rev parse' should be 'git rev-parse'`, + `Merge pull request #1750 from mark2185/fix-issue-template + +'git-rev parse' should be 'git rev-parse'`, + }, + } + + for _, s := range scenarios { + s := s + t.Run(s.testName, func(t *testing.T) { + instance := buildCommitCommands(commonDeps{ + runner: oscommands.NewFakeRunner(t).Expect("git rev-list --format=%B --max-count=1 deadbeef", s.input, nil), + }) + + output, err := instance.GetCommitMessage("deadbeef") + + assert.NoError(t, err) + + assert.Equal(t, s.expectedOutput, output) + }) + } +} diff --git a/pkg/commands/git_commands/common.go b/pkg/commands/git_commands/common.go index a045be75a..09694110d 100644 --- a/pkg/commands/git_commands/common.go +++ b/pkg/commands/git_commands/common.go @@ -4,6 +4,7 @@ import ( gogit "github.com/jesseduffield/go-git/v5" "github.com/jesseduffield/lazygit/pkg/commands/oscommands" "github.com/jesseduffield/lazygit/pkg/common" + "github.com/sasha-s/go-deadlock" ) type GitCommon struct { @@ -13,6 +14,8 @@ type GitCommon struct { dotGitDir string repo *gogit.Repository config *ConfigCommands + // mutex for doing things like push/pull/fetch + syncMutex *deadlock.Mutex } func NewGitCommon( @@ -22,6 +25,7 @@ func NewGitCommon( dotGitDir string, repo *gogit.Repository, config *ConfigCommands, + syncMutex *deadlock.Mutex, ) *GitCommon { return &GitCommon{ Common: cmn, @@ -30,5 +34,6 @@ func NewGitCommon( dotGitDir: dotGitDir, repo: repo, config: config, + syncMutex: syncMutex, } } diff --git a/pkg/commands/git_commands/file.go b/pkg/commands/git_commands/file.go index 026d79cb0..898c26e33 100644 --- a/pkg/commands/git_commands/file.go +++ b/pkg/commands/git_commands/file.go @@ -58,5 +58,17 @@ func (self *FileCommands) GetEditCmdStr(filename string, lineNumber int) (string } editCmdTemplate := self.UserConfig.OS.EditCommandTemplate + if len(editCmdTemplate) == 0 { + switch editor { + case "emacs", "nano", "vi", "vim", "nvim": + editCmdTemplate = "{{editor}} +{{line}} -- {{filename}}" + case "subl": + editCmdTemplate = "{{editor}} -- {{filename}}:{{line}}" + case "code": + editCmdTemplate = "{{editor}} -r --goto -- {{filename}}:{{line}}" + default: + editCmdTemplate = "{{editor}} -- {{filename}}" + } + } return utils.ResolvePlaceholderString(editCmdTemplate, templateValues), nil } diff --git a/pkg/commands/git_commands/file_test.go b/pkg/commands/git_commands/file_test.go index a26699b3e..4b9128dfe 100644 --- a/pkg/commands/git_commands/file_test.go +++ b/pkg/commands/git_commands/file_test.go @@ -79,6 +79,7 @@ func TestEditFileCmdStr(t *testing.T) { gitConfigMockResponses: nil, test: func(cmdStr string, err error) { assert.NoError(t, err) + assert.Equal(t, `nano "test"`, cmdStr) }, }, { @@ -143,6 +144,20 @@ func TestEditFileCmdStr(t *testing.T) { assert.Equal(t, `vim +1 "open file/at line"`, cmdStr) }, }, + { + filename: "default edit command template", + configEditCommand: "vim", + configEditCommandTemplate: "", + runner: oscommands.NewFakeRunner(t), + getenv: func(env string) string { + return "" + }, + gitConfigMockResponses: nil, + test: func(cmdStr string, err error) { + assert.NoError(t, err) + assert.Equal(t, `vim +1 -- "default edit command template"`, cmdStr) + }, + }, } for _, s := range scenarios { diff --git a/pkg/commands/git_commands/patch.go b/pkg/commands/git_commands/patch.go index 8f9ce5784..a805c7f21 100644 --- a/pkg/commands/git_commands/patch.go +++ b/pkg/commands/git_commands/patch.go @@ -105,16 +105,16 @@ func (self *PatchCommands) MovePatchToSelectedCommit(commits []*models.Commit, s } baseIndex := sourceCommitIdx + 1 - todo := "" - for i, commit := range commits[0:baseIndex] { - a := "pick" - if i == sourceCommitIdx || i == destinationCommitIdx { - a = "edit" - } - todo = a + " " + commit.Sha + " " + commit.Name + "\n" + todo - } - err := self.rebase.PrepareInteractiveRebaseCommand(commits[baseIndex].Sha, todo, true).Run() + todoLines := self.rebase.BuildTodoLines(commits[0:baseIndex], func(commit *models.Commit, i int) string { + if i == sourceCommitIdx || i == destinationCommitIdx { + return "edit" + } else { + return "pick" + } + }) + + err := self.rebase.PrepareInteractiveRebaseCommand(commits[baseIndex].Sha, todoLines, true).Run() if err != nil { return err } diff --git a/pkg/commands/git_commands/rebase.go b/pkg/commands/git_commands/rebase.go index c726cad7e..48a613e41 100644 --- a/pkg/commands/git_commands/rebase.go +++ b/pkg/commands/git_commands/rebase.go @@ -7,6 +7,8 @@ import ( "strings" "github.com/go-errors/errors" + "github.com/jesseduffield/generics/slices" + "github.com/jesseduffield/lazygit/pkg/app/daemon" "github.com/jesseduffield/lazygit/pkg/commands/models" "github.com/jesseduffield/lazygit/pkg/commands/oscommands" ) @@ -52,7 +54,7 @@ func (self *RebaseCommands) RewordCommit(commits []*models.Commit, index int, me } func (self *RebaseCommands) RewordCommitInEditor(commits []*models.Commit, index int) (oscommands.ICmdObj, error) { - todo, sha, err := self.GenerateGenericRebaseTodo(commits, index, "reword") + todo, sha, err := self.BuildSingleActionTodo(commits, index, "reword") if err != nil { return nil, err } @@ -60,6 +62,38 @@ func (self *RebaseCommands) RewordCommitInEditor(commits []*models.Commit, index return self.PrepareInteractiveRebaseCommand(sha, todo, false), nil } +func (self *RebaseCommands) ResetCommitAuthor(commits []*models.Commit, index int) error { + return self.GenericAmend(commits, index, func() error { + return self.commit.ResetAuthor() + }) +} + +func (self *RebaseCommands) SetCommitAuthor(commits []*models.Commit, index int, value string) error { + return self.GenericAmend(commits, index, func() error { + return self.commit.SetAuthor(value) + }) +} + +func (self *RebaseCommands) GenericAmend(commits []*models.Commit, index int, f func() error) error { + if index == 0 { + // we've selected the top commit so no rebase is required + return f() + } + + err := self.BeginInteractiveRebaseForCommit(commits, index) + if err != nil { + return err + } + + // now the selected commit should be our head so we'll amend it + err = f() + if err != nil { + return err + } + + return self.ContinueRebase() +} + func (self *RebaseCommands) MoveCommitDown(commits []*models.Commit, index int) error { // we must ensure that we have at least two commits after the selected one if len(commits) <= index+2 { @@ -67,17 +101,15 @@ func (self *RebaseCommands) MoveCommitDown(commits []*models.Commit, index int) return errors.New(self.Tr.NoRoom) } - todo := "" orderedCommits := append(commits[0:index], commits[index+1], commits[index]) - for _, commit := range orderedCommits { - todo = "pick " + commit.Sha + " " + commit.Name + "\n" + todo - } - return self.PrepareInteractiveRebaseCommand(commits[index+2].Sha, todo, true).Run() + todoLines := self.BuildTodoLinesSingleAction(orderedCommits, "pick") + + return self.PrepareInteractiveRebaseCommand(commits[index+2].Sha, todoLines, true).Run() } func (self *RebaseCommands) InteractiveRebase(commits []*models.Commit, index int, action string) error { - todo, sha, err := self.GenerateGenericRebaseTodo(commits, index, action) + todo, sha, err := self.BuildSingleActionTodo(commits, index, action) if err != nil { return err } @@ -88,7 +120,8 @@ func (self *RebaseCommands) InteractiveRebase(commits []*models.Commit, index in // PrepareInteractiveRebaseCommand returns the cmd for an interactive rebase // we tell git to run lazygit to edit the todo list, and we pass the client // lazygit a todo string to write to the todo file -func (self *RebaseCommands) PrepareInteractiveRebaseCommand(baseSha string, todo string, overrideEditor bool) oscommands.ICmdObj { +func (self *RebaseCommands) PrepareInteractiveRebaseCommand(baseSha string, todoLines []TodoLine, overrideEditor bool) oscommands.ICmdObj { + todo := self.buildTodo(todoLines) ex := oscommands.GetLazygitPath() debug := "FALSE" @@ -97,7 +130,7 @@ func (self *RebaseCommands) PrepareInteractiveRebaseCommand(baseSha string, todo } cmdStr := fmt.Sprintf("git rebase --interactive --autostash --keep-empty %s", baseSha) - self.Log.WithField("command", cmdStr).Info("RunCommand") + self.Log.WithField("command", cmdStr).Debug("RunCommand") cmdObj := self.cmd.New(cmdStr) @@ -109,8 +142,8 @@ func (self *RebaseCommands) PrepareInteractiveRebaseCommand(baseSha string, todo } cmdObj.AddEnvVars( - "LAZYGIT_CLIENT_COMMAND=INTERACTIVE_REBASE", - "LAZYGIT_REBASE_TODO="+todo, + daemon.DaemonKindEnvKey+"="+string(daemon.InteractiveRebase), + daemon.RebaseTODOEnvKey+"="+todo, "DEBUG="+debug, "LANG=en_US.UTF-8", // Force using EN as language "LC_ALL=en_US.UTF-8", // Force using EN as language @@ -124,38 +157,37 @@ func (self *RebaseCommands) PrepareInteractiveRebaseCommand(baseSha string, todo return cmdObj } -func (self *RebaseCommands) GenerateGenericRebaseTodo(commits []*models.Commit, actionIndex int, action string) (string, string, error) { +// produces TodoLines where every commit is picked (or dropped for merge commits) except for the commit at the given index, which +// will have the given action applied to it. +func (self *RebaseCommands) BuildSingleActionTodo(commits []*models.Commit, actionIndex int, action string) ([]TodoLine, string, error) { baseIndex := actionIndex + 1 if len(commits) <= baseIndex { - return "", "", errors.New(self.Tr.CannotRebaseOntoFirstCommit) + return nil, "", errors.New(self.Tr.CannotRebaseOntoFirstCommit) } if action == "squash" || action == "fixup" { baseIndex++ if len(commits) <= baseIndex { - return "", "", errors.New(self.Tr.CannotSquashOntoSecondCommit) + return nil, "", errors.New(self.Tr.CannotSquashOntoSecondCommit) } } - todo := "" - for i, commit := range commits[0:baseIndex] { - var commitAction string + todoLines := self.BuildTodoLines(commits[0:baseIndex], func(commit *models.Commit, i int) string { if i == actionIndex { - commitAction = action + return action } else if commit.IsMerge() { // your typical interactive rebase will actually drop merge commits by default. Damn git CLI, you scary! // doing this means we don't need to worry about rebasing over merges which always causes problems. // you typically shouldn't be doing rebases that pass over merge commits anyway. - commitAction = "drop" + return "drop" } else { - commitAction = "pick" + return "pick" } - todo = commitAction + " " + commit.Sha + " " + commit.Name + "\n" + todo - } + }) - return todo, commits[baseIndex].Sha, nil + return todoLines, commits[baseIndex].Sha, nil } // AmendTo amends the given commit with whatever files are staged @@ -185,7 +217,7 @@ func (self *RebaseCommands) EditRebaseTodo(index int, action string) error { content[contentIndex] = action + " " + strings.Join(splitLine[1:], " ") result := strings.Join(content, "\n") - return ioutil.WriteFile(fileName, []byte(result), 0644) + return ioutil.WriteFile(fileName, []byte(result), 0o644) } func (self *RebaseCommands) getTodoCommitCount(content []string) int { @@ -215,7 +247,7 @@ func (self *RebaseCommands) MoveTodoDown(index int) error { rearrangedContent = append(rearrangedContent, content[contentIndex+1:]...) result := strings.Join(rearrangedContent, "\n") - return ioutil.WriteFile(fileName, []byte(result), 0644) + return ioutil.WriteFile(fileName, []byte(result), 0o644) } // SquashAllAboveFixupCommits squashes all fixup! commits above the given one @@ -244,7 +276,7 @@ func (self *RebaseCommands) BeginInteractiveRebaseForCommit(commits []*models.Co return errors.New(self.Tr.DisabledForGPG) } - todo, sha, err := self.GenerateGenericRebaseTodo(commits, commitIndex, "edit") + todo, sha, err := self.BuildSingleActionTodo(commits, commitIndex, "edit") if err != nil { return err } @@ -254,7 +286,7 @@ func (self *RebaseCommands) BeginInteractiveRebaseForCommit(commits []*models.Co // RebaseBranch interactive rebases onto a branch func (self *RebaseCommands) RebaseBranch(branchName string) error { - return self.PrepareInteractiveRebaseCommand(branchName, "", false).Run() + return self.PrepareInteractiveRebaseCommand(branchName, nil, false).Run() } func (self *RebaseCommands) GenericMergeOrRebaseActionCmdObj(commandType string, command string) oscommands.ICmdObj { @@ -298,7 +330,7 @@ func (self *RebaseCommands) runSkipEditorCommand(cmdObj oscommands.ICmdObj) erro lazyGitPath := oscommands.GetLazygitPath() return cmdObj. AddEnvVars( - "LAZYGIT_CLIENT_COMMAND=EXIT_IMMEDIATELY", + daemon.DaemonKindEnvKey+"="+string(daemon.ExitImmediately), "GIT_EDITOR="+lazyGitPath, "EDITOR="+lazyGitPath, "VISUAL="+lazyGitPath, @@ -336,10 +368,36 @@ func (self *RebaseCommands) DiscardOldFileChanges(commits []*models.Commit, comm // CherryPickCommits begins an interactive rebase with the given shas being cherry picked onto HEAD func (self *RebaseCommands) CherryPickCommits(commits []*models.Commit) error { - todo := "" - for _, commit := range commits { - todo = "pick " + commit.Sha + " " + commit.Name + "\n" + todo - } + todoLines := self.BuildTodoLinesSingleAction(commits, "pick") - return self.PrepareInteractiveRebaseCommand("HEAD", todo, false).Run() + return self.PrepareInteractiveRebaseCommand("HEAD", todoLines, false).Run() +} + +func (self *RebaseCommands) buildTodo(todoLines []TodoLine) string { + lines := slices.Map(todoLines, func(todoLine TodoLine) string { + return todoLine.ToString() + }) + + return strings.Join(slices.Reverse(lines), "") +} + +func (self *RebaseCommands) BuildTodoLines(commits []*models.Commit, f func(*models.Commit, int) string) []TodoLine { + return slices.MapWithIndex(commits, func(commit *models.Commit, i int) TodoLine { + return TodoLine{Action: f(commit, i), Commit: commit} + }) +} + +func (self *RebaseCommands) BuildTodoLinesSingleAction(commits []*models.Commit, action string) []TodoLine { + return self.BuildTodoLines(commits, func(commit *models.Commit, i int) string { + return action + }) +} + +type TodoLine struct { + Action string + Commit *models.Commit +} + +func (self *TodoLine) ToString() string { + return self.Action + " " + self.Commit.Sha + " " + self.Commit.Name + "\n" } diff --git a/pkg/commands/git_commands/rebase_test.go b/pkg/commands/git_commands/rebase_test.go index 56df77a86..c4d18000f 100644 --- a/pkg/commands/git_commands/rebase_test.go +++ b/pkg/commands/git_commands/rebase_test.go @@ -5,10 +5,11 @@ import ( "testing" "github.com/go-errors/errors" + "github.com/jesseduffield/lazygit/pkg/app/daemon" "github.com/jesseduffield/lazygit/pkg/commands/git_config" "github.com/jesseduffield/lazygit/pkg/commands/models" "github.com/jesseduffield/lazygit/pkg/commands/oscommands" - "github.com/jesseduffield/lazygit/pkg/utils" + "github.com/samber/lo" "github.com/stretchr/testify/assert" ) @@ -61,10 +62,10 @@ func TestRebaseSkipEditorCommand(t *testing.T) { `^VISUAL=.*$`, `^EDITOR=.*$`, `^GIT_EDITOR=.*$`, - "^LAZYGIT_CLIENT_COMMAND=EXIT_IMMEDIATELY$", + "^" + daemon.DaemonKindEnvKey + "=" + string(daemon.ExitImmediately) + "$", } { regexStr := regexStr - foundMatch := utils.IncludesStringFunc(envVars, func(envVar string) bool { + foundMatch := lo.ContainsBy(envVars, func(envVar string) bool { return regexp.MustCompile(regexStr).MatchString(envVar) }) if !foundMatch { diff --git a/pkg/commands/git_commands/remote.go b/pkg/commands/git_commands/remote.go index 3116c764a..1245a8cf0 100644 --- a/pkg/commands/git_commands/remote.go +++ b/pkg/commands/git_commands/remote.go @@ -40,7 +40,7 @@ func (self *RemoteCommands) UpdateRemoteUrl(remoteName string, updatedUrl string func (self *RemoteCommands) DeleteRemoteBranch(remoteName string, branchName string) error { command := fmt.Sprintf("git push %s --delete %s", self.cmd.Quote(remoteName), self.cmd.Quote(branchName)) - return self.cmd.New(command).PromptOnCredentialRequest().Run() + return self.cmd.New(command).PromptOnCredentialRequest().WithMutex(self.syncMutex).Run() } // CheckRemoteBranchExists Returns remote branch diff --git a/pkg/commands/git_commands/stash.go b/pkg/commands/git_commands/stash.go index d20024aa9..c0d187a13 100644 --- a/pkg/commands/git_commands/stash.go +++ b/pkg/commands/git_commands/stash.go @@ -25,6 +25,10 @@ func NewStashCommands( } } +func (self *StashCommands) DropNewest() error { + return self.cmd.New("git stash drop").Run() +} + func (self *StashCommands) Drop(index int) error { return self.cmd.New(fmt.Sprintf("git stash drop stash@{%d}", index)).Run() } @@ -38,7 +42,6 @@ func (self *StashCommands) Apply(index int) error { } // Save save stash -// TODO: before calling this, check if there is anything to save func (self *StashCommands) Save(message string) error { return self.cmd.New("git stash save " + self.cmd.Quote(message)).Run() } @@ -49,6 +52,23 @@ func (self *StashCommands) ShowStashEntryCmdObj(index int) oscommands.ICmdObj { return self.cmd.New(cmdStr).DontLog() } +func (self *StashCommands) StashAndKeepIndex(message string) error { + return self.cmd.New(fmt.Sprintf("git stash save %s --keep-index", self.cmd.Quote(message))).Run() +} + +func (self *StashCommands) StashUnstagedChanges(message string) error { + if err := self.cmd.New("git commit --no-verify -m \"[lazygit] stashing unstaged changes\"").Run(); err != nil { + return err + } + if err := self.Save(message); err != nil { + return err + } + if err := self.cmd.New("git reset --soft HEAD^").Run(); err != nil { + return err + } + return nil +} + // SaveStagedChanges stashes only the currently staged changes. This takes a few steps // shoutouts to Joe on https://stackoverflow.com/questions/14759748/stashing-only-staged-changes-in-git-is-it-possible func (self *StashCommands) SaveStagedChanges(message string) error { diff --git a/pkg/commands/git_commands/sync.go b/pkg/commands/git_commands/sync.go index 8a6933522..fb1aa9648 100644 --- a/pkg/commands/git_commands/sync.go +++ b/pkg/commands/git_commands/sync.go @@ -47,7 +47,7 @@ func (self *SyncCommands) PushCmdObj(opts PushOpts) (oscommands.ICmdObj, error) cmdStr += " " + self.cmd.Quote(opts.UpstreamBranch) } - cmdObj := self.cmd.New(cmdStr).PromptOnCredentialRequest() + cmdObj := self.cmd.New(cmdStr).PromptOnCredentialRequest().WithMutex(self.syncMutex) return cmdObj, nil } @@ -83,7 +83,7 @@ func (self *SyncCommands) Fetch(opts FetchOptions) error { } else { cmdObj.PromptOnCredentialRequest() } - return cmdObj.Run() + return cmdObj.WithMutex(self.syncMutex).Run() } type PullOptions struct { @@ -108,15 +108,15 @@ func (self *SyncCommands) Pull(opts PullOptions) error { // setting GIT_SEQUENCE_EDITOR to ':' as a way of skipping it, in case the user // has 'pull.rebase = interactive' configured. - return self.cmd.New(cmdStr).AddEnvVars("GIT_SEQUENCE_EDITOR=:").PromptOnCredentialRequest().Run() + return self.cmd.New(cmdStr).AddEnvVars("GIT_SEQUENCE_EDITOR=:").PromptOnCredentialRequest().WithMutex(self.syncMutex).Run() } func (self *SyncCommands) FastForward(branchName string, remoteName string, remoteBranchName string) error { cmdStr := fmt.Sprintf("git fetch %s %s:%s", self.cmd.Quote(remoteName), self.cmd.Quote(remoteBranchName), self.cmd.Quote(branchName)) - return self.cmd.New(cmdStr).PromptOnCredentialRequest().Run() + return self.cmd.New(cmdStr).PromptOnCredentialRequest().WithMutex(self.syncMutex).Run() } func (self *SyncCommands) FetchRemote(remoteName string) error { cmdStr := fmt.Sprintf("git fetch %s", self.cmd.Quote(remoteName)) - return self.cmd.New(cmdStr).PromptOnCredentialRequest().Run() + return self.cmd.New(cmdStr).PromptOnCredentialRequest().WithMutex(self.syncMutex).Run() } diff --git a/pkg/commands/git_commands/tag.go b/pkg/commands/git_commands/tag.go index 94b0d8ac1..5abad0dc5 100644 --- a/pkg/commands/git_commands/tag.go +++ b/pkg/commands/git_commands/tag.go @@ -27,5 +27,5 @@ func (self *TagCommands) Delete(tagName string) error { } func (self *TagCommands) Push(remoteName string, tagName string) error { - return self.cmd.New(fmt.Sprintf("git push %s %s", self.cmd.Quote(remoteName), self.cmd.Quote(tagName))).PromptOnCredentialRequest().Run() + return self.cmd.New(fmt.Sprintf("git push %s %s", self.cmd.Quote(remoteName), self.cmd.Quote(tagName))).PromptOnCredentialRequest().WithMutex(self.syncMutex).Run() } diff --git a/pkg/commands/git_commands/working_tree.go b/pkg/commands/git_commands/working_tree.go index f594a639b..8fd1fb177 100644 --- a/pkg/commands/git_commands/working_tree.go +++ b/pkg/commands/git_commands/working_tree.go @@ -8,6 +8,7 @@ import ( "time" "github.com/go-errors/errors" + "github.com/jesseduffield/generics/slices" "github.com/jesseduffield/lazygit/pkg/commands/loaders" "github.com/jesseduffield/lazygit/pkg/commands/models" "github.com/jesseduffield/lazygit/pkg/commands/oscommands" @@ -46,10 +47,9 @@ func (self *WorkingTreeCommands) StageFile(path string) error { } func (self *WorkingTreeCommands) StageFiles(paths []string) error { - quotedPaths := make([]string, len(paths)) - for i, path := range paths { - quotedPaths[i] = self.cmd.Quote(path) - } + quotedPaths := slices.Map(paths, func(path string) string { + return self.cmd.Quote(path) + }) return self.cmd.New(fmt.Sprintf("git add -- %s", strings.Join(quotedPaths, " "))).Run() } @@ -218,6 +218,11 @@ func (self *WorkingTreeCommands) Ignore(filename string) error { return self.os.AppendLineToFile(".gitignore", filename) } +// Exclude adds a file to the .git/info/exclude for the repo +func (self *WorkingTreeCommands) Exclude(filename string) error { + return self.os.AppendLineToFile(".git/info/exclude", filename) +} + // WorktreeFileDiff returns the diff of a file func (self *WorkingTreeCommands) WorktreeFileDiff(file *models.File, plain bool, cached bool, ignoreWhitespace bool) string { // for now we assume an error means the file was deleted @@ -230,6 +235,7 @@ func (self *WorkingTreeCommands) WorktreeFileDiffCmdObj(node models.IFile, plain trackedArg := "--" colorArg := self.UserConfig.Git.Paging.ColorArg quotedPath := self.cmd.Quote(node.GetPath()) + quotedPrevPath := "" ignoreWhitespaceArg := "" contextSize := self.UserConfig.Git.DiffContextSize if cached { @@ -244,19 +250,25 @@ func (self *WorkingTreeCommands) WorktreeFileDiffCmdObj(node models.IFile, plain if ignoreWhitespace { ignoreWhitespaceArg = " --ignore-all-space" } + if prevPath := node.GetPreviousPath(); prevPath != "" { + quotedPrevPath = " " + self.cmd.Quote(prevPath) + } - cmdStr := fmt.Sprintf("git diff --submodule --no-ext-diff --unified=%d --color=%s%s%s %s %s", contextSize, colorArg, ignoreWhitespaceArg, cachedArg, trackedArg, quotedPath) + cmdStr := fmt.Sprintf("git diff --submodule --no-ext-diff --unified=%d --color=%s%s%s %s %s%s", contextSize, colorArg, ignoreWhitespaceArg, cachedArg, trackedArg, quotedPath, quotedPrevPath) return self.cmd.New(cmdStr).DontLog() } func (self *WorkingTreeCommands) ApplyPatch(patch string, flags ...string) error { - filepath := filepath.Join(oscommands.GetTempDir(), utils.GetCurrentRepoName(), time.Now().Format("Jan _2 15.04.05.000000000")+".patch") - self.Log.Infof("saving temporary patch to %s", filepath) - if err := self.os.CreateFileWithContent(filepath, patch); err != nil { + filepath, err := self.SaveTemporaryPatch(patch) + if err != nil { return err } + return self.ApplyPatchFile(filepath, flags...) +} + +func (self *WorkingTreeCommands) ApplyPatchFile(filepath string, flags ...string) error { flagStr := "" for _, flag := range flags { flagStr += " --" + flag @@ -265,6 +277,15 @@ func (self *WorkingTreeCommands) ApplyPatch(patch string, flags ...string) error return self.cmd.New(fmt.Sprintf("git apply%s %s", flagStr, self.cmd.Quote(filepath))).Run() } +func (self *WorkingTreeCommands) SaveTemporaryPatch(patch string) (string, error) { + filepath := filepath.Join(self.os.GetTempDir(), utils.GetCurrentRepoName(), time.Now().Format("Jan _2 15.04.05.000000000")+".patch") + self.Log.Infof("saving temporary patch to %s", filepath) + if err := self.os.CreateFileWithContent(filepath, patch); err != nil { + return "", err + } + return filepath, nil +} + // ShowFileDiff get the diff of specified from and to. Typically this will be used for a single commit so it'll be 123abc^..123abc // but when we're in diff mode it could be any 'from' to any 'to'. The reverse flag is also here thanks to diff mode. func (self *WorkingTreeCommands) ShowFileDiff(from string, to string, reverse bool, fileName string, plain bool) (string, error) { diff --git a/pkg/commands/git_test.go b/pkg/commands/git_test.go index 684696a8c..3531f14ca 100644 --- a/pkg/commands/git_test.go +++ b/pkg/commands/git_test.go @@ -11,6 +11,7 @@ import ( "github.com/jesseduffield/lazygit/pkg/commands/git_config" "github.com/jesseduffield/lazygit/pkg/commands/oscommands" "github.com/jesseduffield/lazygit/pkg/utils" + "github.com/sasha-s/go-deadlock" "github.com/stretchr/testify/assert" ) @@ -76,7 +77,7 @@ func TestNavigateToRepoRootDirectory(t *testing.T) { }, }, { - "An error occurred when getting path informations", + "An error occurred when getting path information", func(string) (os.FileInfo, error) { return nil, fmt.Errorf("An error occurred") }, @@ -115,18 +116,20 @@ func TestNavigateToRepoRootDirectory(t *testing.T) { func TestSetupRepository(t *testing.T) { type scenario struct { testName string - openGitRepository func(string) (*gogit.Repository, error) + openGitRepository func(string, *gogit.PlainOpenOptions) (*gogit.Repository, error) errorStr string + options gogit.PlainOpenOptions test func(*gogit.Repository, error) } scenarios := []scenario{ { "A gitconfig parsing error occurred", - func(string) (*gogit.Repository, error) { + func(string, *gogit.PlainOpenOptions) (*gogit.Repository, error) { return nil, fmt.Errorf(`unquoted '\' must be followed by new line`) }, "error translated", + gogit.PlainOpenOptions{}, func(r *gogit.Repository, err error) { assert.Error(t, err) assert.EqualError(t, err, "error translated") @@ -134,10 +137,11 @@ func TestSetupRepository(t *testing.T) { }, { "A gogit error occurred", - func(string) (*gogit.Repository, error) { + func(string, *gogit.PlainOpenOptions) (*gogit.Repository, error) { return nil, fmt.Errorf("Error from inside gogit") }, "", + gogit.PlainOpenOptions{}, func(r *gogit.Repository, err error) { assert.Error(t, err) assert.EqualError(t, err, "Error from inside gogit") @@ -145,13 +149,14 @@ func TestSetupRepository(t *testing.T) { }, { "Setup done properly", - func(string) (*gogit.Repository, error) { + func(string, *gogit.PlainOpenOptions) (*gogit.Repository, error) { assert.NoError(t, os.RemoveAll("/tmp/lazygit-test")) r, err := gogit.PlainInit("/tmp/lazygit-test", false) assert.NoError(t, err) return r, nil }, "", + gogit.PlainOpenOptions{}, func(r *gogit.Repository, err error) { assert.NoError(t, err) assert.NotNil(t, r) @@ -162,7 +167,7 @@ func TestSetupRepository(t *testing.T) { for _, s := range scenarios { s := s t.Run(s.testName, func(t *testing.T) { - s.test(setupRepository(s.openGitRepository, s.errorStr)) + s.test(setupRepository(s.openGitRepository, s.options, s.errorStr)) }) } } @@ -211,7 +216,12 @@ func TestNewGitCommand(t *testing.T) { s := s t.Run(s.testName, func(t *testing.T) { s.setup() - s.test(NewGitCommand(utils.NewDummyCommon(), oscommands.NewDummyOSCommand(), git_config.NewFakeGitConfig(nil))) + s.test( + NewGitCommand(utils.NewDummyCommon(), + oscommands.NewDummyOSCommand(), + git_config.NewFakeGitConfig(nil), + &deadlock.Mutex{}, + )) }) } } diff --git a/pkg/commands/hosting_service/definitions.go b/pkg/commands/hosting_service/definitions.go index c70062a67..c53ee0507 100644 --- a/pkg/commands/hosting_service/definitions.go +++ b/pkg/commands/hosting_service/definitions.go @@ -6,6 +6,7 @@ var defaultUrlRegexStrings = []string{ `^(?:https?|ssh)://.*/(?P.*)/(?P.*?)(?:\.git)?$`, `^git@.*:(?P.*)/(?P.*?)(?:\.git)?$`, } +var defaultRepoURLTemplate = "https://{{.webDomain}}/{{.owner}}/{{.repo}}" // we've got less type safety using go templates but this lends itself better to // users adding custom service definitions in their config @@ -15,6 +16,7 @@ var githubServiceDef = ServiceDefinition{ pullRequestURLIntoTargetBranch: "/compare/{{.To}}...{{.From}}?expand=1", commitURL: "/commit/{{.CommitSha}}", regexStrings: defaultUrlRegexStrings, + repoURLTemplate: defaultRepoURLTemplate, } var bitbucketServiceDef = ServiceDefinition{ @@ -22,7 +24,11 @@ var bitbucketServiceDef = ServiceDefinition{ pullRequestURLIntoDefaultBranch: "/pull-requests/new?source={{.From}}&t=1", pullRequestURLIntoTargetBranch: "/pull-requests/new?source={{.From}}&dest={{.To}}&t=1", commitURL: "/commits/{{.CommitSha}}", - regexStrings: defaultUrlRegexStrings, + regexStrings: []string{ + `^(?:https?|ssh)://.*/(?P.*)/(?P.*?)(?:\.git)?$`, + `^.*@.*:(?P.*)/(?P.*?)(?:\.git)?$`, + }, + repoURLTemplate: defaultRepoURLTemplate, } var gitLabServiceDef = ServiceDefinition{ @@ -31,9 +37,40 @@ var gitLabServiceDef = ServiceDefinition{ pullRequestURLIntoTargetBranch: "/merge_requests/new?merge_request[source_branch]={{.From}}&merge_request[target_branch]={{.To}}", commitURL: "/commit/{{.CommitSha}}", regexStrings: defaultUrlRegexStrings, + repoURLTemplate: defaultRepoURLTemplate, } -var serviceDefinitions = []ServiceDefinition{githubServiceDef, bitbucketServiceDef, gitLabServiceDef} +var azdoServiceDef = ServiceDefinition{ + provider: "azuredevops", + pullRequestURLIntoDefaultBranch: "/pullrequestcreate?sourceRef={{.From}}", + pullRequestURLIntoTargetBranch: "/pullrequestcreate?sourceRef={{.From}}&targetRef={{.To}}", + commitURL: "/commit/{{.CommitSha}}", + regexStrings: []string{ + `^git@ssh.dev.azure.com.*/(?P.*)/(?P.*)/(?P.*?)(?:\.git)?$`, + `^https://.*@dev.azure.com/(?P.*?)/(?P.*?)/_git/(?P.*?)(?:\.git)?$`, + }, + repoURLTemplate: "https://{{.webDomain}}/{{.org}}/{{.project}}/_git/{{.repo}}", +} + +var bitbucketServerServiceDef = ServiceDefinition{ + provider: "bitbucketServer", + pullRequestURLIntoDefaultBranch: "/pull-requests?create&sourceBranch={{.From}}", + pullRequestURLIntoTargetBranch: "/pull-requests?create&targetBranch={{.To}}&sourceBranch={{.From}}", + commitURL: "/commits/{{.CommitSha}}", + regexStrings: []string{ + `^ssh://git@.*/(?P.*)/(?P.*?)(?:\.git)?$`, + `^https://.*/scm/(?P.*)/(?P.*?)(?:\.git)?$`, + }, + repoURLTemplate: "https://{{.webDomain}}/projects/{{.project}}/repos/{{.repo}}", +} + +var serviceDefinitions = []ServiceDefinition{ + githubServiceDef, + bitbucketServiceDef, + gitLabServiceDef, + azdoServiceDef, + bitbucketServerServiceDef, +} var defaultServiceDomains = []ServiceDomain{ { @@ -51,4 +88,9 @@ var defaultServiceDomains = []ServiceDomain{ gitDomain: "gitlab.com", webDomain: "gitlab.com", }, + { + serviceDefinition: azdoServiceDef, + gitDomain: "dev.azure.com", + webDomain: "dev.azure.com", + }, } diff --git a/pkg/commands/hosting_service/hosting_service.go b/pkg/commands/hosting_service/hosting_service.go index 01e07e9eb..091da3ebb 100644 --- a/pkg/commands/hosting_service/hosting_service.go +++ b/pkg/commands/hosting_service/hosting_service.go @@ -1,7 +1,6 @@ package hosting_service import ( - "fmt" "net/url" "regexp" "strings" @@ -10,6 +9,8 @@ import ( "github.com/jesseduffield/lazygit/pkg/i18n" "github.com/jesseduffield/lazygit/pkg/utils" "github.com/sirupsen/logrus" + + "github.com/jesseduffield/generics/slices" ) // This package is for handling logic specific to a git hosting service like github, gitlab, bitbucket, etc. @@ -66,13 +67,13 @@ func (self *HostingServiceMgr) getService() (*Service, error) { return nil, err } - root, err := serviceDomain.getRootFromRemoteURL(self.remoteURL) + repoURL, err := serviceDomain.serviceDefinition.getRepoURLFromRemoteURL(self.remoteURL, serviceDomain.webDomain) if err != nil { return nil, err } return &Service{ - root: root, + repoURL: repoURL, ServiceDefinition: serviceDomain.serviceDefinition, }, nil } @@ -95,8 +96,7 @@ func (self *HostingServiceMgr) getCandidateServiceDomains() []ServiceDomain { serviceDefinitionByProvider[serviceDefinition.provider] = serviceDefinition } - var serviceDomains = make([]ServiceDomain, len(defaultServiceDomains)) - copy(serviceDomains, defaultServiceDomains) + serviceDomains := slices.Clone(defaultServiceDomains) if len(self.configServiceDomains) > 0 { for gitDomain, typeAndDomain := range self.configServiceDomains { @@ -111,10 +111,10 @@ func (self *HostingServiceMgr) getCandidateServiceDomains() []ServiceDomain { serviceDefinition, ok := serviceDefinitionByProvider[provider] if !ok { - providerNames := []string{} - for _, serviceDefinition := range serviceDefinitions { - providerNames = append(providerNames, serviceDefinition.provider) - } + providerNames := slices.Map(serviceDefinitions, func(serviceDefinition ServiceDefinition) string { + return serviceDefinition.provider + }) + self.log.Errorf("Unknown git service type: '%s'. Expected one of %s", provider, strings.Join(providerNames, ", ")) continue } @@ -139,47 +139,32 @@ type ServiceDomain struct { serviceDefinition ServiceDefinition } -func (self ServiceDomain) getRootFromRemoteURL(repoURL string) (string, error) { - // we may want to make this more specific to the service in future e.g. if - // some new service comes along which has a different root url structure. - repoInfo, err := self.serviceDefinition.getRepoInfoFromURL(repoURL) - if err != nil { - return "", err - } - return fmt.Sprintf("https://%s/%s/%s", self.webDomain, repoInfo.Owner, repoInfo.Repository), nil -} - -// RepoInformation holds some basic information about the repo -type RepoInformation struct { - Owner string - Repository string -} - type ServiceDefinition struct { provider string pullRequestURLIntoDefaultBranch string pullRequestURLIntoTargetBranch string commitURL string regexStrings []string + + // can expect 'webdomain' to be passed in. Otherwise, you get to pick what we match in the regex + repoURLTemplate string } -func (self ServiceDefinition) getRepoInfoFromURL(url string) (*RepoInformation, error) { +func (self ServiceDefinition) getRepoURLFromRemoteURL(url string, webDomain string) (string, error) { for _, regexStr := range self.regexStrings { re := regexp.MustCompile(regexStr) - matches := utils.FindNamedMatches(re, url) - if matches != nil { - return &RepoInformation{ - Owner: matches["owner"], - Repository: matches["repo"], - }, nil + input := utils.FindNamedMatches(re, url) + if input != nil { + input["webDomain"] = webDomain + return utils.ResolvePlaceholderString(self.repoURLTemplate, input), nil } } - return nil, errors.New("Failed to parse repo information from url") + return "", errors.New("Failed to parse repo information from url") } type Service struct { - root string + repoURL string ServiceDefinition } @@ -196,5 +181,5 @@ func (self *Service) getCommitURL(commitSha string) string { } func (self *Service) resolveUrl(templateString string, args map[string]string) string { - return self.root + utils.ResolvePlaceholderString(templateString, args) + return self.repoURL + utils.ResolvePlaceholderString(templateString, args) } diff --git a/pkg/commands/hosting_service/hosting_service_test.go b/pkg/commands/hosting_service/hosting_service_test.go index 98c097a33..b92daa98d 100644 --- a/pkg/commands/hosting_service/hosting_service_test.go +++ b/pkg/commands/hosting_service/hosting_service_test.go @@ -8,63 +8,6 @@ import ( "github.com/stretchr/testify/assert" ) -func TestGetRepoInfoFromURL(t *testing.T) { - type scenario struct { - serviceDefinition ServiceDefinition - testName string - repoURL string - test func(*RepoInformation) - } - - scenarios := []scenario{ - { - githubServiceDef, - "Returns repository information for git remote url", - "git@github.com:petersmith/super_calculator", - func(repoInfo *RepoInformation) { - assert.EqualValues(t, repoInfo.Owner, "petersmith") - assert.EqualValues(t, repoInfo.Repository, "super_calculator") - }, - }, - { - githubServiceDef, - "Returns repository information for git remote url, trimming trailing '.git'", - "git@github.com:petersmith/super_calculator.git", - func(repoInfo *RepoInformation) { - assert.EqualValues(t, repoInfo.Owner, "petersmith") - assert.EqualValues(t, repoInfo.Repository, "super_calculator") - }, - }, - { - githubServiceDef, - "Returns repository information for ssh remote url", - "ssh://git@github.com/petersmith/super_calculator", - func(repoInfo *RepoInformation) { - assert.EqualValues(t, repoInfo.Owner, "petersmith") - assert.EqualValues(t, repoInfo.Repository, "super_calculator") - }, - }, - { - githubServiceDef, - "Returns repository information for http remote url", - "https://my_username@bitbucket.org/johndoe/social_network.git", - func(repoInfo *RepoInformation) { - assert.EqualValues(t, repoInfo.Owner, "johndoe") - assert.EqualValues(t, repoInfo.Repository, "social_network") - }, - }, - } - - for _, s := range scenarios { - s := s - t.Run(s.testName, func(t *testing.T) { - result, err := s.serviceDefinition.getRepoInfoFromURL(s.repoURL) - assert.NoError(t, err) - s.test(result) - }) - } -} - func TestGetPullRequestURL(t *testing.T) { type scenario struct { testName string @@ -172,6 +115,107 @@ func TestGetPullRequestURL(t *testing.T) { assert.Equal(t, "https://gitlab.com/peter/public/calculator/merge_requests/new?merge_request[source_branch]=feature%2Fcommit-ui&merge_request[target_branch]=epic%2Fui", url) }, }, + { + testName: "Opens a link to new pull request on bitbucket with a custom SSH username", + from: "feature/profile-page", + remoteUrl: "john@bitbucket.org:johndoe/social_network.git", + test: func(url string, err error) { + assert.NoError(t, err) + assert.Equal(t, "https://bitbucket.org/johndoe/social_network/pull-requests/new?source=feature%2Fprofile-page&t=1", url) + }, + }, + { + testName: "Opens a link to new pull request on Azure DevOps (SSH)", + from: "feature/new", + remoteUrl: "git@ssh.dev.azure.com:v3/myorg/myproject/myrepo", + test: func(url string, err error) { + assert.NoError(t, err) + assert.Equal(t, "https://dev.azure.com/myorg/myproject/_git/myrepo/pullrequestcreate?sourceRef=feature%2Fnew", url) + }, + }, + { + testName: "Opens a link to new pull request on Azure DevOps (SSH) with specific target", + from: "feature/new", + to: "dev", + remoteUrl: "git@ssh.dev.azure.com:v3/myorg/myproject/myrepo", + test: func(url string, err error) { + assert.NoError(t, err) + assert.Equal(t, "https://dev.azure.com/myorg/myproject/_git/myrepo/pullrequestcreate?sourceRef=feature%2Fnew&targetRef=dev", url) + }, + }, + { + testName: "Opens a link to new pull request on Azure DevOps (HTTP)", + from: "feature/new", + remoteUrl: "https://myorg@dev.azure.com/myorg/myproject/_git/myrepo", + test: func(url string, err error) { + assert.NoError(t, err) + assert.Equal(t, "https://dev.azure.com/myorg/myproject/_git/myrepo/pullrequestcreate?sourceRef=feature%2Fnew", url) + }, + }, + { + testName: "Opens a link to new pull request on Azure DevOps (HTTP) with specific target", + from: "feature/new", + to: "dev", + remoteUrl: "https://myorg@dev.azure.com/myorg/myproject/_git/myrepo", + test: func(url string, err error) { + assert.NoError(t, err) + assert.Equal(t, "https://dev.azure.com/myorg/myproject/_git/myrepo/pullrequestcreate?sourceRef=feature%2Fnew&targetRef=dev", url) + }, + }, + { + testName: "Opens a link to new pull request on Bitbucket Server (SSH)", + from: "feature/new", + remoteUrl: "ssh://git@mycompany.bitbucket.com/myproject/myrepo.git", + configServiceDomains: map[string]string{ + // valid configuration for a bitbucket server URL + "mycompany.bitbucket.com": "bitbucketServer:mycompany.bitbucket.com", + }, + test: func(url string, err error) { + assert.NoError(t, err) + assert.Equal(t, "https://mycompany.bitbucket.com/projects/myproject/repos/myrepo/pull-requests?create&sourceBranch=feature%2Fnew", url) + }, + }, + { + testName: "Opens a link to new pull request on Bitbucket Server (SSH) with specific target", + from: "feature/new", + to: "dev", + remoteUrl: "ssh://git@mycompany.bitbucket.com/myproject/myrepo.git", + configServiceDomains: map[string]string{ + // valid configuration for a bitbucket server URL + "mycompany.bitbucket.com": "bitbucketServer:mycompany.bitbucket.com", + }, + test: func(url string, err error) { + assert.NoError(t, err) + assert.Equal(t, "https://mycompany.bitbucket.com/projects/myproject/repos/myrepo/pull-requests?create&targetBranch=dev&sourceBranch=feature%2Fnew", url) + }, + }, + { + testName: "Opens a link to new pull request on Bitbucket Server (HTTP)", + from: "feature/new", + remoteUrl: "https://mycompany.bitbucket.com/scm/myproject/myrepo.git", + configServiceDomains: map[string]string{ + // valid configuration for a bitbucket server URL + "mycompany.bitbucket.com": "bitbucketServer:mycompany.bitbucket.com", + }, + test: func(url string, err error) { + assert.NoError(t, err) + assert.Equal(t, "https://mycompany.bitbucket.com/projects/myproject/repos/myrepo/pull-requests?create&sourceBranch=feature%2Fnew", url) + }, + }, + { + testName: "Opens a link to new pull request on Bitbucket Server (HTTP) with specific target", + from: "feature/new", + to: "dev", + remoteUrl: "https://mycompany.bitbucket.com/scm/myproject/myrepo.git", + configServiceDomains: map[string]string{ + // valid configuration for a bitbucket server URL + "mycompany.bitbucket.com": "bitbucketServer:mycompany.bitbucket.com", + }, + test: func(url string, err error) { + assert.NoError(t, err) + assert.Equal(t, "https://mycompany.bitbucket.com/projects/myproject/repos/myrepo/pull-requests?create&targetBranch=dev&sourceBranch=feature%2Fnew", url) + }, + }, { testName: "Throws an error if git service is unsupported", from: "feature/divide-operation", @@ -218,7 +262,7 @@ func TestGetPullRequestURL(t *testing.T) { assert.NoError(t, err) assert.Equal(t, "https://bitbucket.org/johndoe/social_network/pull-requests/new?source=feature%2Fprofile-page&t=1", url) }, - expectedLoggedErrors: []string{"Unknown git service type: 'noservice'. Expected one of github, bitbucket, gitlab"}, + expectedLoggedErrors: []string{"Unknown git service type: 'noservice'. Expected one of github, bitbucket, gitlab, azuredevops, bitbucketServer"}, }, { testName: "Escapes reserved URL characters in from branch name", diff --git a/pkg/commands/loaders/branches.go b/pkg/commands/loaders/branches.go index c54e65ee9..5a4502085 100644 --- a/pkg/commands/loaders/branches.go +++ b/pkg/commands/loaders/branches.go @@ -4,6 +4,8 @@ import ( "regexp" "strings" + "github.com/jesseduffield/generics/set" + "github.com/jesseduffield/generics/slices" "github.com/jesseduffield/go-git/v5/config" "github.com/jesseduffield/lazygit/pkg/commands/models" "github.com/jesseduffield/lazygit/pkg/common" @@ -64,21 +66,20 @@ outer: if strings.EqualFold(reflogBranch.Name, branch.Name) { branch.Recency = reflogBranch.Recency branchesWithRecency = append(branchesWithRecency, branch) - branches = append(branches[0:j], branches[j+1:]...) + branches = slices.Remove(branches, j) continue outer } } } - branches = append(branchesWithRecency, branches...) + branches = slices.Prepend(branches, branchesWithRecency...) foundHead := false for i, branch := range branches { if branch.Head { foundHead = true branch.Recency = " *" - branches = append(branches[0:i], branches[i+1:]...) - branches = append([]*models.Branch{branch}, branches...) + branches = slices.Move(branches, i, 0) break } } @@ -87,7 +88,7 @@ outer: if err != nil { return nil, err } - branches = append([]*models.Branch{{Name: currentBranchName, DisplayName: currentBranchDisplayName, Head: true, Recency: " *"}}, branches...) + branches = slices.Prepend(branches, &models.Branch{Name: currentBranchName, DisplayName: currentBranchDisplayName, Head: true, Recency: " *"}) } configBranches, err := self.config.Branches() @@ -114,38 +115,47 @@ func (self *BranchLoader) obtainBranches() []*models.Branch { trimmedOutput := strings.TrimSpace(output) outputLines := strings.Split(trimmedOutput, "\n") - branches := make([]*models.Branch, 0, len(outputLines)) - for _, line := range outputLines { + + return slices.FilterMap(outputLines, func(line string) (*models.Branch, bool) { if line == "" { - continue + return nil, false } - split := strings.Split(line, SEPARATION_CHAR) + split := strings.Split(line, "\x00") if len(split) != 4 { // Ignore line if it isn't separated into 4 parts // This is probably a warning message, for more info see: // https://github.com/jesseduffield/lazygit/issues/1385#issuecomment-885580439 - continue + return nil, false } - name := strings.TrimPrefix(split[1], "heads/") - branch := &models.Branch{ - Name: name, - Pullables: "?", - Pushables: "?", - Head: split[0] == "*", - } + return obtainBranch(split), true + }) +} - upstreamName := split[2] - if upstreamName == "" { - // if we're here then it means we do not have a local version of the remote. - // The branch might still be tracking a remote though, we just don't know - // how many commits ahead/behind it is - branches = append(branches, branch) - continue - } +// Obtain branch information from parsed line output of getRawBranches() +// split contains the '|' separated tokens in the line of output +func obtainBranch(split []string) *models.Branch { + name := strings.TrimPrefix(split[1], "heads/") + branch := &models.Branch{ + Name: name, + Pullables: "?", + Pushables: "?", + Head: split[0] == "*", + } - track := split[3] + upstreamName := split[2] + if upstreamName == "" { + // if we're here then it means we do not have a local version of the remote. + // The branch might still be tracking a remote though, we just don't know + // how many commits ahead/behind it is + return branch + } + + track := split[3] + if track == "[gone]" { + branch.UpstreamGone = true + } else { re := regexp.MustCompile(`ahead (\d+)`) match := re.FindStringSubmatch(track) if len(match) > 1 { @@ -161,30 +171,32 @@ func (self *BranchLoader) obtainBranches() []*models.Branch { } else { branch.Pullables = "0" } - - branches = append(branches, branch) } - return branches + return branch } // TODO: only look at the new reflog commits, and otherwise store the recencies in // int form against the branch to recalculate the time ago func (self *BranchLoader) obtainReflogBranches(reflogCommits []*models.Commit) []*models.Branch { - foundBranchesMap := map[string]bool{} + foundBranches := set.New[string]() re := regexp.MustCompile(`checkout: moving from ([\S]+) to ([\S]+)`) reflogBranches := make([]*models.Branch, 0, len(reflogCommits)) + for _, commit := range reflogCommits { - if match := re.FindStringSubmatch(commit.Name); len(match) == 3 { - recency := utils.UnixToTimeAgo(commit.UnixTimestamp) - for _, branchName := range match[1:] { - if !foundBranchesMap[branchName] { - foundBranchesMap[branchName] = true - reflogBranches = append(reflogBranches, &models.Branch{ - Recency: recency, - Name: branchName, - }) - } + match := re.FindStringSubmatch(commit.Name) + if len(match) != 3 { + continue + } + + recency := utils.UnixToTimeAgo(commit.UnixTimestamp) + for _, branchName := range match[1:] { + if !foundBranches.Includes(branchName) { + foundBranches.Add(branchName) + reflogBranches = append(reflogBranches, &models.Branch{ + Recency: recency, + Name: branchName, + }) } } } diff --git a/pkg/commands/loaders/branches_test.go b/pkg/commands/loaders/branches_test.go new file mode 100644 index 000000000..70f02dcf7 --- /dev/null +++ b/pkg/commands/loaders/branches_test.go @@ -0,0 +1,52 @@ +package loaders + +// "*|feat/detect-purge|origin/feat/detect-purge|[ahead 1]" +import ( + "testing" + + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/stretchr/testify/assert" +) + +func TestObtainBanch(t *testing.T) { + type scenario struct { + testName string + input []string + expectedBranch *models.Branch + } + + scenarios := []scenario{ + { + testName: "TrimHeads", + input: []string{"", "heads/a_branch", "", ""}, + expectedBranch: &models.Branch{Name: "a_branch", Pushables: "?", Pullables: "?", Head: false}, + }, + { + testName: "NoUpstream", + input: []string{"", "a_branch", "", ""}, + expectedBranch: &models.Branch{Name: "a_branch", Pushables: "?", Pullables: "?", Head: false}, + }, + { + testName: "IsHead", + input: []string{"*", "a_branch", "", ""}, + expectedBranch: &models.Branch{Name: "a_branch", Pushables: "?", Pullables: "?", Head: true}, + }, + { + testName: "IsBehindAndAhead", + input: []string{"", "a_branch", "a_remote/a_branch", "[behind 2, ahead 3]"}, + expectedBranch: &models.Branch{Name: "a_branch", Pushables: "3", Pullables: "2", Head: false}, + }, + { + testName: "RemoteBranchIsGone", + input: []string{"", "a_branch", "a_remote/a_branch", "[gone]"}, + expectedBranch: &models.Branch{Name: "a_branch", UpstreamGone: true, Pushables: "?", Pullables: "?", Head: false}, + }, + } + + for _, s := range scenarios { + t.Run(s.testName, func(t *testing.T) { + branch := obtainBranch(s.input) + assert.EqualValues(t, s.expectedBranch, branch) + }) + } +} diff --git a/pkg/commands/loaders/commit_files.go b/pkg/commands/loaders/commit_files.go index 755db768d..d68571edb 100644 --- a/pkg/commands/loaders/commit_files.go +++ b/pkg/commands/loaders/commit_files.go @@ -4,9 +4,11 @@ import ( "fmt" "strings" + "github.com/jesseduffield/generics/slices" "github.com/jesseduffield/lazygit/pkg/commands/models" "github.com/jesseduffield/lazygit/pkg/commands/oscommands" "github.com/jesseduffield/lazygit/pkg/common" + "github.com/samber/lo" ) type CommitFileLoader struct { @@ -33,25 +35,22 @@ func (self *CommitFileLoader) GetFilesInDiff(from string, to string, reverse boo return nil, err } - return self.getCommitFilesFromFilenames(filenames), nil + return getCommitFilesFromFilenames(filenames), nil } -// filenames string is something like "file1\nfile2\nfile3" -func (self *CommitFileLoader) getCommitFilesFromFilenames(filenames string) []*models.CommitFile { - commitFiles := make([]*models.CommitFile, 0) - +// filenames string is something like "MM\x00file1\x00MU\x00file2\x00AA\x00file3\x00" +// so we need to split it by the null character and then map each status-name pair to a commit file +func getCommitFilesFromFilenames(filenames string) []*models.CommitFile { lines := strings.Split(strings.TrimRight(filenames, "\x00"), "\x00") - n := len(lines) - for i := 0; i < n-1; i += 2 { - // typical result looks like 'A my_file' meaning my_file was added - changeStatus := lines[i] - name := lines[i+1] - - commitFiles = append(commitFiles, &models.CommitFile{ - Name: name, - ChangeStatus: changeStatus, - }) + if len(lines) == 1 { + return []*models.CommitFile{} } - return commitFiles + // typical result looks like 'A my_file' meaning my_file was added + return slices.Map(lo.Chunk(lines, 2), func(chunk []string) *models.CommitFile { + return &models.CommitFile{ + ChangeStatus: chunk[0], + Name: chunk[1], + } + }) } diff --git a/pkg/commands/loaders/commit_files_test.go b/pkg/commands/loaders/commit_files_test.go new file mode 100644 index 000000000..a07390052 --- /dev/null +++ b/pkg/commands/loaders/commit_files_test.go @@ -0,0 +1,71 @@ +package loaders + +import ( + "testing" + + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/stretchr/testify/assert" +) + +func TestGetCommitFilesFromFilenames(t *testing.T) { + tests := []struct { + testName string + input string + output []*models.CommitFile + }{ + { + testName: "no files", + input: "", + output: []*models.CommitFile{}, + }, + { + testName: "one file", + input: "MM\x00Myfile\x00", + output: []*models.CommitFile{ + { + Name: "Myfile", + ChangeStatus: "MM", + }, + }, + }, + { + testName: "two files", + input: "MM\x00Myfile\x00M \x00MyOtherFile\x00", + output: []*models.CommitFile{ + { + Name: "Myfile", + ChangeStatus: "MM", + }, + { + Name: "MyOtherFile", + ChangeStatus: "M ", + }, + }, + }, + { + testName: "three files", + input: "MM\x00Myfile\x00M \x00MyOtherFile\x00 M\x00YetAnother\x00", + output: []*models.CommitFile{ + { + Name: "Myfile", + ChangeStatus: "MM", + }, + { + Name: "MyOtherFile", + ChangeStatus: "M ", + }, + { + Name: "YetAnother", + ChangeStatus: " M", + }, + }, + }, + } + + for _, test := range tests { + t.Run(test.testName, func(t *testing.T) { + result := getCommitFilesFromFilenames(test.input) + assert.Equal(t, test.output, result) + }) + } +} diff --git a/pkg/commands/loaders/commits.go b/pkg/commands/loaders/commits.go index ea54a4e76..69c88ccf5 100644 --- a/pkg/commands/loaders/commits.go +++ b/pkg/commands/loaders/commits.go @@ -1,6 +1,7 @@ package loaders import ( + "bytes" "fmt" "io/ioutil" "os" @@ -9,6 +10,8 @@ import ( "strconv" "strings" + "github.com/fsmiamoto/git-todo-parser/todo" + "github.com/jesseduffield/generics/slices" "github.com/jesseduffield/lazygit/pkg/commands/models" "github.com/jesseduffield/lazygit/pkg/commands/oscommands" "github.com/jesseduffield/lazygit/pkg/commands/types/enums" @@ -22,8 +25,6 @@ import ( // be processed as part of a rebase (these won't appear in git log but we // grab them from the rebase-related files in the .git directory to show them -const SEPARATION_CHAR = "|" - // CommitLoader returns a list of Commit objects for the current repo type CommitLoader struct { *common.Common @@ -90,14 +91,12 @@ func (self *CommitLoader) GetCommits(opts GetCommitsOptions) ([]*models.Commit, } err = self.getLogCmd(opts).RunAndProcessLines(func(line string) (bool, error) { - if canExtractCommit(line) { - commit := self.extractCommitFromLine(line) - if commit.Sha == firstPushedCommit { - passedFirstPushedCommit = true - } - commit.Status = map[bool]string{true: "unpushed", false: "pushed"}[!passedFirstPushedCommit] - commits = append(commits, commit) + commit := self.extractCommitFromLine(line) + if commit.Sha == firstPushedCommit { + passedFirstPushedCommit = true } + commit.Status = map[bool]string{true: "unpushed", false: "pushed"}[!passedFirstPushedCommit] + commits = append(commits, commit) return false, nil }) if err != nil { @@ -158,15 +157,16 @@ func (self *CommitLoader) MergeRebasingCommits(commits []*models.Commit) ([]*mod // example input: // 8ad01fe32fcc20f07bc6693f87aa4977c327f1e1|10 hours ago|Jesse Duffield| (HEAD -> master, tag: v0.15.2)|refresh commits when adding a tag func (self *CommitLoader) extractCommitFromLine(line string) *models.Commit { - split := strings.Split(line, SEPARATION_CHAR) + split := strings.SplitN(line, "\x00", 7) sha := split[0] unixTimestamp := split[1] - author := split[2] - extraInfo := strings.TrimSpace(split[3]) - parentHashes := split[4] + authorName := split[2] + authorEmail := split[3] + extraInfo := strings.TrimSpace(split[4]) + parentHashes := split[5] + message := split[6] - message := strings.Join(split[5:], SEPARATION_CHAR) tags := []string{} if extraInfo != "" { @@ -179,14 +179,20 @@ func (self *CommitLoader) extractCommitFromLine(line string) *models.Commit { unitTimestampInt, _ := strconv.Atoi(unixTimestamp) + parents := []string{} + if len(parentHashes) > 0 { + parents = strings.Split(parentHashes, " ") + } + return &models.Commit{ Sha: sha, Name: message, Tags: tags, ExtraInfo: extraInfo, UnixTimestamp: int64(unitTimestampInt), - Author: author, - Parents: strings.Split(parentHashes, " "), + AuthorName: authorName, + AuthorEmail: authorEmail, + Parents: parents, } } @@ -200,16 +206,15 @@ func (self *CommitLoader) getHydratedRebasingCommits(rebaseMode enums.RebaseMode return nil, nil } - commitShas := make([]string, len(commits)) - for i, commit := range commits { - commitShas[i] = commit.Sha - } + commitShas := slices.Map(commits, func(commit *models.Commit) string { + return commit.Sha + }) // note that we're not filtering these as we do non-rebasing commits just because // I suspect that will cause some damage cmdObj := self.cmd.New( fmt.Sprintf( - "git show %s --no-patch --oneline %s --abbrev=%d", + "git -c log.showSignature=false show %s --no-patch --oneline %s --abbrev=%d", strings.Join(commitShas, " "), prettyFormat, 20, @@ -219,14 +224,12 @@ func (self *CommitLoader) getHydratedRebasingCommits(rebaseMode enums.RebaseMode hydratedCommits := make([]*models.Commit, 0, len(commits)) i := 0 err = cmdObj.RunAndProcessLines(func(line string) (bool, error) { - if canExtractCommit(line) { - commit := self.extractCommitFromLine(line) - matchingCommit := commits[i] - commit.Action = matchingCommit.Action - commit.Status = matchingCommit.Status - hydratedCommits = append(hydratedCommits, commit) - i++ - } + commit := self.extractCommitFromLine(line) + matchingCommit := commits[i] + commit.Action = matchingCommit.Action + commit.Status = matchingCommit.Status + hydratedCommits = append(hydratedCommits, commit) + i++ return false, nil }) if err != nil { @@ -306,21 +309,24 @@ func (self *CommitLoader) getInteractiveRebasingCommits() ([]*models.Commit, err } commits := []*models.Commit{} - lines := strings.Split(string(bytesContent), "\n") - for _, line := range lines { - if line == "" || line == "noop" { - return commits, nil - } - if strings.HasPrefix(line, "#") { + + todos, err := todo.Parse(bytes.NewBuffer(bytesContent)) + if err != nil { + self.Log.Error(fmt.Sprintf("error occurred while parsing git-rebase-todo file: %s", err.Error())) + return nil, nil + } + + for _, t := range todos { + if t.Commit == "" { + // Command does not have a commit associated, skip continue } - splitLine := strings.Split(line, " ") - commits = append([]*models.Commit{{ - Sha: splitLine[1], - Name: strings.Join(splitLine[2:], " "), + commits = slices.Prepend(commits, &models.Commit{ + Sha: t.Commit, + Name: t.Msg, Status: "rebasing", - Action: splitLine[0], - }}, commits...) + Action: t.Command.String(), + }) } return commits, nil @@ -429,27 +435,26 @@ func (self *CommitLoader) getLogCmd(opts GetCommitsOptions) oscommands.ICmdObj { return self.cmd.New( fmt.Sprintf( - "git log %s %s %s --oneline %s%s --abbrev=%d%s", + "git -c log.showSignature=false log %s %s %s --oneline %s%s --abbrev=%d%s", self.cmd.Quote(opts.RefName), orderFlag, allFlag, prettyFormat, limitFlag, - 20, + 40, filterFlag, ), ).DontLog() } var prettyFormat = fmt.Sprintf( - "--pretty=format:\"%%H%s%%at%s%%aN%s%%d%s%%p%s%%s\"", - SEPARATION_CHAR, - SEPARATION_CHAR, - SEPARATION_CHAR, - SEPARATION_CHAR, - SEPARATION_CHAR, + "--pretty=format:\"%%H%s%%at%s%%aN%s%%ae%s%%d%s%%p%s%%s\"", + NULL_CODE, + NULL_CODE, + NULL_CODE, + NULL_CODE, + NULL_CODE, + NULL_CODE, ) -func canExtractCommit(line string) bool { - return line != "" && strings.Split(line, " ")[0] != "gpg:" -} +const NULL_CODE = "%x00" diff --git a/pkg/commands/loaders/commits_test.go b/pkg/commands/loaders/commits_test.go index 23406abcc..a2a68fccc 100644 --- a/pkg/commands/loaders/commits_test.go +++ b/pkg/commands/loaders/commits_test.go @@ -2,6 +2,7 @@ package loaders import ( "path/filepath" + "strings" "testing" "github.com/jesseduffield/lazygit/pkg/commands/models" @@ -11,32 +12,14 @@ import ( "github.com/stretchr/testify/assert" ) -func NewDummyCommitLoader() *CommitLoader { - cmn := utils.NewDummyCommon() - - return &CommitLoader{ - Common: cmn, - cmd: nil, - getCurrentBranchName: func() (string, string, error) { return "master", "master", nil }, - getRebaseMode: func() (enums.RebaseMode, error) { return enums.REBASE_MODE_NONE, nil }, - dotGitDir: ".git", - readFile: func(filename string) ([]byte, error) { - return []byte(""), nil - }, - walkFiles: func(root string, fn filepath.WalkFunc) error { - return nil - }, - } -} - -const commitsOutput = `0eea75e8c631fba6b58135697835d58ba4c18dbc|1640826609|Jesse Duffield| (HEAD -> better-tests)|b21997d6b4cbdf84b149|better typing for rebase mode -b21997d6b4cbdf84b149d8e6a2c4d06a8e9ec164|1640824515|Jesse Duffield| (origin/better-tests)|e94e8fc5b6fab4cb755f|fix logging -e94e8fc5b6fab4cb755f29f1bdb3ee5e001df35c|1640823749|Jesse Duffield||d8084cd558925eb7c9c3|refactor -d8084cd558925eb7c9c38afeed5725c21653ab90|1640821426|Jesse Duffield||65f910ebd85283b5cce9|WIP -65f910ebd85283b5cce9bf67d03d3f1a9ea3813a|1640821275|Jesse Duffield||26c07b1ab33860a1a759|WIP -26c07b1ab33860a1a7591a0638f9925ccf497ffa|1640750752|Jesse Duffield||3d4470a6c072208722e5|WIP -3d4470a6c072208722e5ae9a54bcb9634959a1c5|1640748818|Jesse Duffield||053a66a7be3da43aacdc|WIP -053a66a7be3da43aacdc7aa78e1fe757b82c4dd2|1640739815|Jesse Duffield||985fe482e806b172aea4|refactoring the config struct` +var commitsOutput = strings.Replace(`0eea75e8c631fba6b58135697835d58ba4c18dbc|1640826609|Jesse Duffield|jessedduffield@gmail.com| (HEAD -> better-tests)|b21997d6b4cbdf84b149|better typing for rebase mode +b21997d6b4cbdf84b149d8e6a2c4d06a8e9ec164|1640824515|Jesse Duffield|jessedduffield@gmail.com| (origin/better-tests)|e94e8fc5b6fab4cb755f|fix logging +e94e8fc5b6fab4cb755f29f1bdb3ee5e001df35c|1640823749|Jesse Duffield|jessedduffield@gmail.com||d8084cd558925eb7c9c3|refactor +d8084cd558925eb7c9c38afeed5725c21653ab90|1640821426|Jesse Duffield|jessedduffield@gmail.com||65f910ebd85283b5cce9|WIP +65f910ebd85283b5cce9bf67d03d3f1a9ea3813a|1640821275|Jesse Duffield|jessedduffield@gmail.com||26c07b1ab33860a1a759|WIP +26c07b1ab33860a1a7591a0638f9925ccf497ffa|1640750752|Jesse Duffield|jessedduffield@gmail.com||3d4470a6c072208722e5|WIP +3d4470a6c072208722e5ae9a54bcb9634959a1c5|1640748818|Jesse Duffield|jessedduffield@gmail.com||053a66a7be3da43aacdc|WIP +053a66a7be3da43aacdc7aa78e1fe757b82c4dd2|1640739815|Jesse Duffield|jessedduffield@gmail.com||985fe482e806b172aea4|refactoring the config struct`, "|", "\x00", -1) func TestGetCommits(t *testing.T) { type scenario struct { @@ -57,7 +40,7 @@ func TestGetCommits(t *testing.T) { opts: GetCommitsOptions{RefName: "HEAD", IncludeRebaseCommits: false}, runner: oscommands.NewFakeRunner(t). Expect(`git merge-base "HEAD" "HEAD"@{u}`, "b21997d6b4cbdf84b149d8e6a2c4d06a8e9ec164", nil). - Expect(`git log "HEAD" --topo-order --oneline --pretty=format:"%H|%at|%aN|%d|%p|%s" --abbrev=20`, "", nil), + Expect(`git -c log.showSignature=false log "HEAD" --topo-order --oneline --pretty=format:"%H%x00%at%x00%aN%x00%ae%x00%d%x00%p%x00%s" --abbrev=40`, "", nil), expectedCommits: []*models.Commit{}, expectedError: nil, @@ -71,7 +54,7 @@ func TestGetCommits(t *testing.T) { // here it's seeing which commits are yet to be pushed Expect(`git merge-base "HEAD" "HEAD"@{u}`, "b21997d6b4cbdf84b149d8e6a2c4d06a8e9ec164", nil). // here it's actually getting all the commits in a formatted form, one per line - Expect(`git log "HEAD" --topo-order --oneline --pretty=format:"%H|%at|%aN|%d|%p|%s" --abbrev=20`, commitsOutput, nil). + Expect(`git -c log.showSignature=false log "HEAD" --topo-order --oneline --pretty=format:"%H%x00%at%x00%aN%x00%ae%x00%d%x00%p%x00%s" --abbrev=40`, commitsOutput, nil). // here it's seeing where our branch diverged from the master branch so that we can mark that commit and parent commits as 'merged' Expect(`git merge-base "HEAD" "master"`, "26c07b1ab33860a1a7591a0638f9925ccf497ffa", nil), @@ -83,7 +66,8 @@ func TestGetCommits(t *testing.T) { Action: "", Tags: []string{}, ExtraInfo: "(HEAD -> better-tests)", - Author: "Jesse Duffield", + AuthorName: "Jesse Duffield", + AuthorEmail: "jessedduffield@gmail.com", UnixTimestamp: 1640826609, Parents: []string{ "b21997d6b4cbdf84b149", @@ -96,7 +80,8 @@ func TestGetCommits(t *testing.T) { Action: "", Tags: []string{}, ExtraInfo: "(origin/better-tests)", - Author: "Jesse Duffield", + AuthorName: "Jesse Duffield", + AuthorEmail: "jessedduffield@gmail.com", UnixTimestamp: 1640824515, Parents: []string{ "e94e8fc5b6fab4cb755f", @@ -109,7 +94,8 @@ func TestGetCommits(t *testing.T) { Action: "", Tags: []string{}, ExtraInfo: "", - Author: "Jesse Duffield", + AuthorName: "Jesse Duffield", + AuthorEmail: "jessedduffield@gmail.com", UnixTimestamp: 1640823749, Parents: []string{ "d8084cd558925eb7c9c3", @@ -122,7 +108,8 @@ func TestGetCommits(t *testing.T) { Action: "", Tags: []string{}, ExtraInfo: "", - Author: "Jesse Duffield", + AuthorName: "Jesse Duffield", + AuthorEmail: "jessedduffield@gmail.com", UnixTimestamp: 1640821426, Parents: []string{ "65f910ebd85283b5cce9", @@ -135,7 +122,8 @@ func TestGetCommits(t *testing.T) { Action: "", Tags: []string{}, ExtraInfo: "", - Author: "Jesse Duffield", + AuthorName: "Jesse Duffield", + AuthorEmail: "jessedduffield@gmail.com", UnixTimestamp: 1640821275, Parents: []string{ "26c07b1ab33860a1a759", @@ -148,7 +136,8 @@ func TestGetCommits(t *testing.T) { Action: "", Tags: []string{}, ExtraInfo: "", - Author: "Jesse Duffield", + AuthorName: "Jesse Duffield", + AuthorEmail: "jessedduffield@gmail.com", UnixTimestamp: 1640750752, Parents: []string{ "3d4470a6c072208722e5", @@ -161,7 +150,8 @@ func TestGetCommits(t *testing.T) { Action: "", Tags: []string{}, ExtraInfo: "", - Author: "Jesse Duffield", + AuthorName: "Jesse Duffield", + AuthorEmail: "jessedduffield@gmail.com", UnixTimestamp: 1640748818, Parents: []string{ "053a66a7be3da43aacdc", @@ -174,7 +164,8 @@ func TestGetCommits(t *testing.T) { Action: "", Tags: []string{}, ExtraInfo: "", - Author: "Jesse Duffield", + AuthorName: "Jesse Duffield", + AuthorEmail: "jessedduffield@gmail.com", UnixTimestamp: 1640739815, Parents: []string{ "985fe482e806b172aea4", diff --git a/pkg/commands/loaders/files.go b/pkg/commands/loaders/files.go index f5becdb92..db37da935 100644 --- a/pkg/commands/loaders/files.go +++ b/pkg/commands/loaders/files.go @@ -7,7 +7,6 @@ import ( "github.com/jesseduffield/lazygit/pkg/commands/models" "github.com/jesseduffield/lazygit/pkg/commands/oscommands" "github.com/jesseduffield/lazygit/pkg/common" - "github.com/jesseduffield/lazygit/pkg/utils" ) type FileLoaderConfig interface { @@ -54,28 +53,15 @@ func (self *FileLoader) GetStatusFiles(opts GetStatusFileOptions) []*models.File self.Log.Warningf("warning when calling git status: %s", status.StatusString) continue } - change := status.Change - stagedChange := change[0:1] - unstagedChange := change[1:2] - untracked := utils.IncludesString([]string{"??", "A ", "AM"}, change) - hasNoStagedChanges := utils.IncludesString([]string{" ", "U", "?"}, stagedChange) - hasInlineMergeConflicts := utils.IncludesString([]string{"UU", "AA"}, change) - hasMergeConflicts := hasInlineMergeConflicts || utils.IncludesString([]string{"DD", "AU", "UA", "UD", "DU"}, change) file := &models.File{ - Name: status.Name, - PreviousName: status.PreviousName, - DisplayString: status.StatusString, - HasStagedChanges: !hasNoStagedChanges, - HasUnstagedChanges: unstagedChange != " ", - Tracked: !untracked, - Deleted: unstagedChange == "D" || stagedChange == "D", - Added: unstagedChange == "A" || untracked, - HasMergeConflicts: hasMergeConflicts, - HasInlineMergeConflicts: hasInlineMergeConflicts, - Type: self.getFileType(status.Name), - ShortStatus: change, + Name: status.Name, + PreviousName: status.PreviousName, + DisplayString: status.StatusString, + Type: self.getFileType(status.Name), } + + models.SetStatusFields(file, status.Change) files = append(files, file) } @@ -125,7 +111,7 @@ func (c *FileLoader) GitStatus(opts GitStatusOptions) ([]FileStatus, error) { if strings.HasPrefix(status.Change, "R") { // if a line starts with 'R' then the next line is the original file. - status.PreviousName = strings.TrimSpace(splitLines[i+1]) + status.PreviousName = splitLines[i+1] status.StatusString = fmt.Sprintf("%s %s -> %s", status.Change, status.PreviousName, status.Name) i++ } diff --git a/pkg/commands/loaders/reflog_commits.go b/pkg/commands/loaders/reflog_commits.go index dc1a4ac15..fe4e5e956 100644 --- a/pkg/commands/loaders/reflog_commits.go +++ b/pkg/commands/loaders/reflog_commits.go @@ -32,25 +32,32 @@ func (self *ReflogCommitLoader) GetReflogCommits(lastReflogCommit *models.Commit filterPathArg = fmt.Sprintf(" --follow -- %s", self.cmd.Quote(filterPath)) } - cmdObj := self.cmd.New(fmt.Sprintf(`git log -g --abbrev=20 --format="%%h %%ct %%gs"%s`, filterPathArg)).DontLog() + cmdObj := self.cmd.New(fmt.Sprintf(`git -c log.showSignature=false log -g --abbrev=40 --format="%s"%s`, "%h%x00%ct%x00%gs%x00%p", filterPathArg)).DontLog() onlyObtainedNewReflogCommits := false err := cmdObj.RunAndProcessLines(func(line string) (bool, error) { - fields := strings.SplitN(line, " ", 3) - if len(fields) <= 2 { + fields := strings.SplitN(line, "\x00", 4) + if len(fields) <= 3 { return false, nil } unixTimestamp, _ := strconv.Atoi(fields[1]) + parentHashes := fields[3] + parents := []string{} + if len(parentHashes) > 0 { + parents = strings.Split(parentHashes, " ") + } + commit := &models.Commit{ Sha: fields[0], Name: fields[2], UnixTimestamp: int64(unixTimestamp), Status: "reflog", + Parents: parents, } // note that the unix timestamp here is the timestamp of the COMMIT, not the reflog entry itself, - // so two consequetive reflog entries may have both the same SHA and therefore same timestamp. + // so two consecutive reflog entries may have both the same SHA and therefore same timestamp. // We use the reflog message to disambiguate, and fingers crossed that we never see the same of those // twice in a row. Reason being that it would mean we'd be erroneously exiting early. if lastReflogCommit != nil && commit.Sha == lastReflogCommit.Sha && commit.UnixTimestamp == lastReflogCommit.UnixTimestamp && commit.Name == lastReflogCommit.Name { diff --git a/pkg/commands/loaders/reflog_commits_test.go b/pkg/commands/loaders/reflog_commits_test.go index 0e00ca3e5..8a82d27ac 100644 --- a/pkg/commands/loaders/reflog_commits_test.go +++ b/pkg/commands/loaders/reflog_commits_test.go @@ -2,6 +2,7 @@ package loaders import ( "errors" + "strings" "testing" "github.com/jesseduffield/lazygit/pkg/commands/models" @@ -11,12 +12,12 @@ import ( "github.com/stretchr/testify/assert" ) -const reflogOutput = `c3c4b66b64c97ffeecde 1643150483 checkout: moving from A to B -c3c4b66b64c97ffeecde 1643150483 checkout: moving from B to A -c3c4b66b64c97ffeecde 1643150483 checkout: moving from A to B -c3c4b66b64c97ffeecde 1643150483 checkout: moving from master to A -f4ddf2f0d4be4ccc7efa 1643149435 checkout: moving from A to master -` +var reflogOutput = strings.Replace(`c3c4b66b64c97ffeecde|1643150483|checkout: moving from A to B|51baa8c1 +c3c4b66b64c97ffeecde|1643150483|checkout: moving from B to A|51baa8c1 +c3c4b66b64c97ffeecde|1643150483|checkout: moving from A to B|51baa8c1 +c3c4b66b64c97ffeecde|1643150483|checkout: moving from master to A|51baa8c1 +f4ddf2f0d4be4ccc7efa|1643149435|checkout: moving from A to master|51baa8c1 +`, "|", "\x00", -1) func TestGetReflogCommits(t *testing.T) { type scenario struct { @@ -33,7 +34,7 @@ func TestGetReflogCommits(t *testing.T) { { testName: "no reflog entries", runner: oscommands.NewFakeRunner(t). - Expect(`git log -g --abbrev=20 --format="%h %ct %gs"`, "", nil), + Expect(`git -c log.showSignature=false log -g --abbrev=40 --format="%h%x00%ct%x00%gs%x00%p"`, "", nil), lastReflogCommit: nil, expectedCommits: []*models.Commit{}, @@ -43,7 +44,7 @@ func TestGetReflogCommits(t *testing.T) { { testName: "some reflog entries", runner: oscommands.NewFakeRunner(t). - Expect(`git log -g --abbrev=20 --format="%h %ct %gs"`, reflogOutput, nil), + Expect(`git -c log.showSignature=false log -g --abbrev=40 --format="%h%x00%ct%x00%gs%x00%p"`, reflogOutput, nil), lastReflogCommit: nil, expectedCommits: []*models.Commit{ @@ -52,30 +53,35 @@ func TestGetReflogCommits(t *testing.T) { Name: "checkout: moving from A to B", Status: "reflog", UnixTimestamp: 1643150483, + Parents: []string{"51baa8c1"}, }, { Sha: "c3c4b66b64c97ffeecde", Name: "checkout: moving from B to A", Status: "reflog", UnixTimestamp: 1643150483, + Parents: []string{"51baa8c1"}, }, { Sha: "c3c4b66b64c97ffeecde", Name: "checkout: moving from A to B", Status: "reflog", UnixTimestamp: 1643150483, + Parents: []string{"51baa8c1"}, }, { Sha: "c3c4b66b64c97ffeecde", Name: "checkout: moving from master to A", Status: "reflog", UnixTimestamp: 1643150483, + Parents: []string{"51baa8c1"}, }, { Sha: "f4ddf2f0d4be4ccc7efa", Name: "checkout: moving from A to master", Status: "reflog", UnixTimestamp: 1643149435, + Parents: []string{"51baa8c1"}, }, }, expectedOnlyObtainedNew: false, @@ -84,13 +90,14 @@ func TestGetReflogCommits(t *testing.T) { { testName: "some reflog entries where last commit is given", runner: oscommands.NewFakeRunner(t). - Expect(`git log -g --abbrev=20 --format="%h %ct %gs"`, reflogOutput, nil), + Expect(`git -c log.showSignature=false log -g --abbrev=40 --format="%h%x00%ct%x00%gs%x00%p"`, reflogOutput, nil), lastReflogCommit: &models.Commit{ Sha: "c3c4b66b64c97ffeecde", Name: "checkout: moving from B to A", Status: "reflog", UnixTimestamp: 1643150483, + Parents: []string{"51baa8c1"}, }, expectedCommits: []*models.Commit{ { @@ -98,6 +105,7 @@ func TestGetReflogCommits(t *testing.T) { Name: "checkout: moving from A to B", Status: "reflog", UnixTimestamp: 1643150483, + Parents: []string{"51baa8c1"}, }, }, expectedOnlyObtainedNew: true, @@ -106,13 +114,14 @@ func TestGetReflogCommits(t *testing.T) { { testName: "when passing filterPath", runner: oscommands.NewFakeRunner(t). - Expect(`git log -g --abbrev=20 --format="%h %ct %gs" --follow -- "path"`, reflogOutput, nil), + Expect(`git -c log.showSignature=false log -g --abbrev=40 --format="%h%x00%ct%x00%gs%x00%p" --follow -- "path"`, reflogOutput, nil), lastReflogCommit: &models.Commit{ Sha: "c3c4b66b64c97ffeecde", Name: "checkout: moving from B to A", Status: "reflog", UnixTimestamp: 1643150483, + Parents: []string{"51baa8c1"}, }, filterPath: "path", expectedCommits: []*models.Commit{ @@ -121,6 +130,7 @@ func TestGetReflogCommits(t *testing.T) { Name: "checkout: moving from A to B", Status: "reflog", UnixTimestamp: 1643150483, + Parents: []string{"51baa8c1"}, }, }, expectedOnlyObtainedNew: true, @@ -129,7 +139,7 @@ func TestGetReflogCommits(t *testing.T) { { testName: "when command returns error", runner: oscommands.NewFakeRunner(t). - Expect(`git log -g --abbrev=20 --format="%h %ct %gs"`, "", errors.New("haha")), + Expect(`git -c log.showSignature=false log -g --abbrev=40 --format="%h%x00%ct%x00%gs%x00%p"`, "", errors.New("haha")), lastReflogCommit: nil, filterPath: "", diff --git a/pkg/commands/loaders/remotes.go b/pkg/commands/loaders/remotes.go index bd1fe0b6a..1323560f5 100644 --- a/pkg/commands/loaders/remotes.go +++ b/pkg/commands/loaders/remotes.go @@ -3,9 +3,9 @@ package loaders import ( "fmt" "regexp" - "sort" "strings" + "github.com/jesseduffield/generics/slices" gogit "github.com/jesseduffield/go-git/v5" "github.com/jesseduffield/lazygit/pkg/commands/models" "github.com/jesseduffield/lazygit/pkg/commands/oscommands" @@ -42,37 +42,35 @@ func (self *RemoteLoader) GetRemotes() ([]*models.Remote, error) { } // first step is to get our remotes from go-git - remotes := make([]*models.Remote, len(goGitRemotes)) - for i, goGitRemote := range goGitRemotes { + remotes := slices.Map(goGitRemotes, func(goGitRemote *gogit.Remote) *models.Remote { remoteName := goGitRemote.Config().Name re := regexp.MustCompile(fmt.Sprintf(`(?m)^\s*%s\/([\S]+)`, remoteName)) matches := re.FindAllStringSubmatch(remoteBranchesStr, -1) - branches := make([]*models.RemoteBranch, len(matches)) - for j, match := range matches { - branches[j] = &models.RemoteBranch{ + branches := slices.Map(matches, func(match []string) *models.RemoteBranch { + return &models.RemoteBranch{ Name: match[1], RemoteName: remoteName, } - } + }) - remotes[i] = &models.Remote{ + return &models.Remote{ Name: goGitRemote.Config().Name, Urls: goGitRemote.Config().URLs, Branches: branches, } - } + }) // now lets sort our remotes by name alphabetically - sort.Slice(remotes, func(i, j int) bool { + slices.SortFunc(remotes, func(a, b *models.Remote) bool { // we want origin at the top because we'll be most likely to want it - if remotes[i].Name == "origin" { + if a.Name == "origin" { return true } - if remotes[j].Name == "origin" { + if b.Name == "origin" { return false } - return strings.ToLower(remotes[i].Name) < strings.ToLower(remotes[j].Name) + return strings.ToLower(a.Name) < strings.ToLower(b.Name) }) return remotes, nil diff --git a/pkg/commands/loaders/stash.go b/pkg/commands/loaders/stash.go index 689bf30ce..66cfeaa3e 100644 --- a/pkg/commands/loaders/stash.go +++ b/pkg/commands/loaders/stash.go @@ -5,6 +5,7 @@ import ( "strconv" "strings" + "github.com/jesseduffield/generics/slices" "github.com/jesseduffield/lazygit/pkg/commands/models" "github.com/jesseduffield/lazygit/pkg/commands/oscommands" "github.com/jesseduffield/lazygit/pkg/common" @@ -65,11 +66,9 @@ outer: func (self *StashLoader) getUnfilteredStashEntries() []*models.StashEntry { rawString, _ := self.cmd.New("git stash list --pretty='%gs'").DontLog().RunWithOutput() - stashEntries := []*models.StashEntry{} - for i, line := range utils.SplitLines(rawString) { - stashEntries = append(stashEntries, self.stashEntryFromLine(line, i)) - } - return stashEntries + return slices.MapWithIndex(utils.SplitLines(rawString), func(line string, index int) *models.StashEntry { + return self.stashEntryFromLine(line, index) + }) } func (c *StashLoader) stashEntryFromLine(line string, index int) *models.StashEntry { diff --git a/pkg/commands/loaders/tags.go b/pkg/commands/loaders/tags.go index 45b08a002..8e5063c34 100644 --- a/pkg/commands/loaders/tags.go +++ b/pkg/commands/loaders/tags.go @@ -1,8 +1,7 @@ package loaders import ( - "strings" - + "github.com/jesseduffield/generics/slices" "github.com/jesseduffield/lazygit/pkg/commands/models" "github.com/jesseduffield/lazygit/pkg/commands/oscommands" "github.com/jesseduffield/lazygit/pkg/common" @@ -27,25 +26,18 @@ func NewTagLoader( func (self *TagLoader) GetTags() ([]*models.Tag, error) { // get remote branches, sorted by creation date (descending) // see: https://git-scm.com/docs/git-tag#Documentation/git-tag.txt---sortltkeygt - remoteBranchesStr, err := self.cmd.New(`git tag --list --sort=-creatordate`).DontLog().RunWithOutput() + tagsOutput, err := self.cmd.New(`git tag --list --sort=-creatordate`).DontLog().RunWithOutput() if err != nil { return nil, err } - content := utils.TrimTrailingNewline(remoteBranchesStr) - if content == "" { - return nil, nil - } + split := utils.SplitLines(tagsOutput) - split := strings.Split(content, "\n") - - // first step is to get our remotes from go-git - tags := make([]*models.Tag, len(split)) - for i, tagName := range split { - tags[i] = &models.Tag{ + tags := slices.Map(split, func(tagName string) *models.Tag { + return &models.Tag{ Name: tagName, } - } + }) return tags, nil } diff --git a/pkg/commands/loaders/tags_test.go b/pkg/commands/loaders/tags_test.go new file mode 100644 index 000000000..5394fa3a8 --- /dev/null +++ b/pkg/commands/loaders/tags_test.go @@ -0,0 +1,68 @@ +package loaders + +import ( + "testing" + + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/commands/oscommands" + "github.com/jesseduffield/lazygit/pkg/utils" + "github.com/stretchr/testify/assert" +) + +const tagsOutput = `v0.34 +v0.33 +v0.32.2 +v0.32.1 +v0.32 +testtag +` + +func TestGetTags(t *testing.T) { + type scenario struct { + testName string + runner *oscommands.FakeCmdObjRunner + expectedTags []*models.Tag + expectedError error + } + + scenarios := []scenario{ + { + testName: "should return no tags if there are none", + runner: oscommands.NewFakeRunner(t). + Expect(`git tag --list --sort=-creatordate`, "", nil), + expectedTags: []*models.Tag{}, + expectedError: nil, + }, + { + testName: "should return tags if present", + runner: oscommands.NewFakeRunner(t). + Expect(`git tag --list --sort=-creatordate`, tagsOutput, nil), + expectedTags: []*models.Tag{ + {Name: "v0.34"}, + {Name: "v0.33"}, + {Name: "v0.32.2"}, + {Name: "v0.32.1"}, + {Name: "v0.32"}, + {Name: "testtag"}, + }, + expectedError: nil, + }, + } + + for _, scenario := range scenarios { + scenario := scenario + t.Run(scenario.testName, func(t *testing.T) { + loader := &TagLoader{ + Common: utils.NewDummyCommon(), + cmd: oscommands.NewDummyCmdObjBuilder(scenario.runner), + } + + tags, err := loader.GetTags() + + assert.Equal(t, scenario.expectedTags, tags) + assert.Equal(t, scenario.expectedError, err) + + scenario.runner.CheckForMissingCalls() + }) + } +} diff --git a/pkg/commands/models/branch.go b/pkg/commands/models/branch.go index 3cdf5ad6d..49bb801fa 100644 --- a/pkg/commands/models/branch.go +++ b/pkg/commands/models/branch.go @@ -5,11 +5,12 @@ package models type Branch struct { Name string // the displayname is something like '(HEAD detached at 123asdf)', whereas in that case the name would be '123asdf' - DisplayName string - Recency string - Pushables string - Pullables string - Head bool + DisplayName string + Recency string + Pushables string + Pullables string + UpstreamGone bool + Head bool // if we have a named remote locally this will be the name of that remote e.g. // 'origin' or 'tiwood'. If we don't have the remote locally it'll look like // 'git@github.com:tiwood/lazygit.git' @@ -17,10 +18,18 @@ type Branch struct { UpstreamBranch string } +func (b *Branch) FullRefName() string { + return "refs/heads/" + b.Name +} + func (b *Branch) RefName() string { return b.Name } +func (b *Branch) ParentRefName() string { + return b.RefName() + "^" +} + func (b *Branch) ID() string { return b.RefName() } @@ -39,6 +48,10 @@ func (b *Branch) RemoteBranchStoredLocally() bool { return b.IsTrackingRemote() && b.Pushables != "?" && b.Pullables != "?" } +func (b *Branch) RemoteBranchNotStoredLocally() bool { + return b.IsTrackingRemote() && b.Pushables == "?" && b.Pullables == "?" +} + func (b *Branch) MatchesUpstream() bool { return b.RemoteBranchStoredLocally() && b.Pushables == "0" && b.Pullables == "0" } diff --git a/pkg/commands/models/commit.go b/pkg/commands/models/commit.go index 9f9184f2e..3502fab4f 100644 --- a/pkg/commands/models/commit.go +++ b/pkg/commands/models/commit.go @@ -6,6 +6,9 @@ import ( "github.com/jesseduffield/lazygit/pkg/utils" ) +// Special commit hash for empty tree object +const EmptyTreeCommitHash = "4b825dc642cb6eb9a060e54bf8d69288fbee4904" + // Commit : A git commit type Commit struct { Sha string @@ -14,7 +17,8 @@ type Commit struct { Action string // one of "", "pick", "edit", "squash", "reword", "drop", "fixup" Tags []string ExtraInfo string // something like 'HEAD -> master, tag: v0.15.2' - Author string + AuthorName string // something like 'Jesse Duffield' + AuthorEmail string // something like 'jessedduffield@gmail.com' UnixTimestamp int64 // SHAs of parent commits (will be multiple if it's a merge commit) @@ -25,10 +29,25 @@ func (c *Commit) ShortSha() string { return utils.ShortSha(c.Sha) } +func (c *Commit) FullRefName() string { + return c.Sha +} + func (c *Commit) RefName() string { return c.Sha } +func (c *Commit) ParentRefName() string { + if c.IsFirstCommit() { + return EmptyTreeCommitHash + } + return c.RefName() + "^" +} + +func (c *Commit) IsFirstCommit() bool { + return len(c.Parents) == 0 +} + func (c *Commit) ID() string { return c.RefName() } diff --git a/pkg/commands/models/file.go b/pkg/commands/models/file.go index c5e76949a..4589f91fa 100644 --- a/pkg/commands/models/file.go +++ b/pkg/commands/models/file.go @@ -2,6 +2,7 @@ package models import ( "github.com/jesseduffield/lazygit/pkg/utils" + "github.com/samber/lo" ) // File : A file from git status @@ -27,6 +28,7 @@ type IFile interface { GetHasStagedChanges() bool GetIsTracked() bool GetPath() string + GetPreviousPath() string } func (f *File) IsRename() bool { @@ -85,3 +87,52 @@ func (f *File) GetPath() string { // TODO: remove concept of name; just use path return f.Name } + +func (f *File) GetPreviousPath() string { + return f.PreviousName +} + +type StatusFields struct { + HasStagedChanges bool + HasUnstagedChanges bool + Tracked bool + Deleted bool + Added bool + HasMergeConflicts bool + HasInlineMergeConflicts bool + ShortStatus string +} + +func SetStatusFields(file *File, shortStatus string) { + derived := deriveStatusFields(shortStatus) + + file.HasStagedChanges = derived.HasStagedChanges + file.HasUnstagedChanges = derived.HasUnstagedChanges + file.Tracked = derived.Tracked + file.Deleted = derived.Deleted + file.Added = derived.Added + file.HasMergeConflicts = derived.HasMergeConflicts + file.HasInlineMergeConflicts = derived.HasInlineMergeConflicts + file.ShortStatus = derived.ShortStatus +} + +// shortStatus is something like '??' or 'A ' +func deriveStatusFields(shortStatus string) StatusFields { + stagedChange := shortStatus[0:1] + unstagedChange := shortStatus[1:2] + tracked := !lo.Contains([]string{"??", "A ", "AM"}, shortStatus) + hasStagedChanges := !lo.Contains([]string{" ", "U", "?"}, stagedChange) + hasInlineMergeConflicts := lo.Contains([]string{"UU", "AA"}, shortStatus) + hasMergeConflicts := hasInlineMergeConflicts || lo.Contains([]string{"DD", "AU", "UA", "UD", "DU"}, shortStatus) + + return StatusFields{ + HasStagedChanges: hasStagedChanges, + HasUnstagedChanges: unstagedChange != " ", + Tracked: tracked, + Deleted: unstagedChange == "D" || stagedChange == "D", + Added: unstagedChange == "A" || !tracked, + HasMergeConflicts: hasMergeConflicts, + HasInlineMergeConflicts: hasInlineMergeConflicts, + ShortStatus: shortStatus, + } +} diff --git a/pkg/commands/models/remote_branch.go b/pkg/commands/models/remote_branch.go index bee004fdb..6a26f05f9 100644 --- a/pkg/commands/models/remote_branch.go +++ b/pkg/commands/models/remote_branch.go @@ -10,10 +10,18 @@ func (r *RemoteBranch) FullName() string { return r.RemoteName + "/" + r.Name } +func (r *RemoteBranch) FullRefName() string { + return "refs/remotes/" + r.FullName() +} + func (r *RemoteBranch) RefName() string { return r.FullName() } +func (r *RemoteBranch) ParentRefName() string { + return r.RefName() + "^" +} + func (r *RemoteBranch) ID() string { return r.RefName() } diff --git a/pkg/commands/models/stash_entry.go b/pkg/commands/models/stash_entry.go index efda6bc77..e70dfbf09 100644 --- a/pkg/commands/models/stash_entry.go +++ b/pkg/commands/models/stash_entry.go @@ -8,10 +8,18 @@ type StashEntry struct { Name string } +func (s *StashEntry) FullRefName() string { + return s.RefName() +} + func (s *StashEntry) RefName() string { return fmt.Sprintf("stash@{%d}", s.Index) } +func (s *StashEntry) ParentRefName() string { + return s.RefName() + "^" +} + func (s *StashEntry) ID() string { return s.RefName() } diff --git a/pkg/commands/models/tag.go b/pkg/commands/models/tag.go index 2fb024e66..25d8754f5 100644 --- a/pkg/commands/models/tag.go +++ b/pkg/commands/models/tag.go @@ -5,10 +5,18 @@ type Tag struct { Name string } +func (t *Tag) FullRefName() string { + return "refs/tags/" + t.RefName() +} + func (t *Tag) RefName() string { return t.Name } +func (t *Tag) ParentRefName() string { + return t.RefName() + "^" +} + func (t *Tag) ID() string { return t.RefName() } diff --git a/pkg/commands/oscommands/cmd_obj.go b/pkg/commands/oscommands/cmd_obj.go index 3e55359de..1a801c6fe 100644 --- a/pkg/commands/oscommands/cmd_obj.go +++ b/pkg/commands/oscommands/cmd_obj.go @@ -2,6 +2,8 @@ package oscommands import ( "os/exec" + + "github.com/sasha-s/go-deadlock" ) // A command object is a general way to represent a command to be run on the @@ -50,6 +52,9 @@ type ICmdObj interface { PromptOnCredentialRequest() ICmdObj FailOnCredentialRequest() ICmdObj + WithMutex(mutex *deadlock.Mutex) ICmdObj + Mutex() *deadlock.Mutex + GetCredentialStrategy() CredentialStrategy } @@ -70,6 +75,9 @@ type CmdObj struct { // if set to true, it means we might be asked to enter a username/password by this command. credentialStrategy CredentialStrategy + + // can be set so that we don't run certain commands simultaneously + mutex *deadlock.Mutex } type CredentialStrategy int @@ -132,6 +140,16 @@ func (self *CmdObj) IgnoreEmptyError() ICmdObj { return self } +func (self *CmdObj) Mutex() *deadlock.Mutex { + return self.mutex +} + +func (self *CmdObj) WithMutex(mutex *deadlock.Mutex) ICmdObj { + self.mutex = mutex + + return self +} + func (self *CmdObj) ShouldIgnoreEmptyError() bool { return self.ignoreEmptyError } diff --git a/pkg/commands/oscommands/cmd_obj_runner.go b/pkg/commands/oscommands/cmd_obj_runner.go index e1a38d80f..8311f9eb7 100644 --- a/pkg/commands/oscommands/cmd_obj_runner.go +++ b/pkg/commands/oscommands/cmd_obj_runner.go @@ -34,6 +34,11 @@ type cmdObjRunner struct { var _ ICmdObjRunner = &cmdObjRunner{} func (self *cmdObjRunner) Run(cmdObj ICmdObj) error { + if cmdObj.Mutex() != nil { + cmdObj.Mutex().Lock() + defer cmdObj.Mutex().Unlock() + } + if cmdObj.GetCredentialStrategy() != NONE { return self.runWithCredentialHandling(cmdObj) } @@ -42,17 +47,14 @@ func (self *cmdObjRunner) Run(cmdObj ICmdObj) error { return self.runAndStream(cmdObj) } - _, err := self.RunWithOutput(cmdObj) + _, err := self.RunWithOutputAux(cmdObj) return err } func (self *cmdObjRunner) RunWithOutput(cmdObj ICmdObj) (string, error) { - if cmdObj.ShouldStreamOutput() { - err := self.runAndStream(cmdObj) - // for now we're not capturing output, just because it would take a little more - // effort and there's currently no use case for it. Some commands call RunWithOutput - // but ignore the output, hence why we've got this check here. - return "", err + if cmdObj.Mutex() != nil { + cmdObj.Mutex().Lock() + defer cmdObj.Mutex().Unlock() } if cmdObj.GetCredentialStrategy() != NONE { @@ -63,6 +65,18 @@ func (self *cmdObjRunner) RunWithOutput(cmdObj ICmdObj) (string, error) { return "", err } + if cmdObj.ShouldStreamOutput() { + err := self.runAndStream(cmdObj) + // for now we're not capturing output, just because it would take a little more + // effort and there's currently no use case for it. Some commands call RunWithOutput + // but ignore the output, hence why we've got this check here. + return "", err + } + + return self.RunWithOutputAux(cmdObj) +} + +func (self *cmdObjRunner) RunWithOutputAux(cmdObj ICmdObj) (string, error) { self.log.WithField("command", cmdObj.ToString()).Debug("RunCommand") if cmdObj.ShouldLog() { @@ -77,6 +91,11 @@ func (self *cmdObjRunner) RunWithOutput(cmdObj ICmdObj) (string, error) { } func (self *cmdObjRunner) RunAndProcessLines(cmdObj ICmdObj, onLine func(line string) (bool, error)) error { + if cmdObj.Mutex() != nil { + cmdObj.Mutex().Lock() + defer cmdObj.Mutex().Unlock() + } + if cmdObj.GetCredentialStrategy() != NONE { return errors.New("cannot call RunAndProcessLines with credential strategy. If you're seeing this then a contributor to Lazygit has accidentally called this method! Please raise an issue") } @@ -104,7 +123,7 @@ func (self *cmdObjRunner) RunAndProcessLines(cmdObj ICmdObj, onLine func(line st return err } if stop { - _ = cmd.Process.Kill() + _ = Kill(cmd) break } } @@ -188,12 +207,15 @@ func (self *cmdObjRunner) runAndStreamAux( cmdObj ICmdObj, onRun func(*cmdHandler, io.Writer), ) error { + // if we're streaming this we don't want any fancy terminal stuff + cmdObj.AddEnvVars("TERM=dumb") + cmdWriter := self.guiIO.newCmdWriterFn() if cmdObj.ShouldLog() { self.logCmdObj(cmdObj) } - self.log.WithField("command", cmdObj.ToString()).Info("RunCommand") + self.log.WithField("command", cmdObj.ToString()).Debug("RunCommand") cmd := cmdObj.GetCmd() var stderr bytes.Buffer @@ -204,6 +226,9 @@ func (self *cmdObjRunner) runAndStreamAux( return err } + var stdout bytes.Buffer + handler.stdoutPipe = io.TeeReader(handler.stdoutPipe, &stdout) + defer func() { if closeErr := handler.close(); closeErr != nil { self.log.Error(closeErr) @@ -215,10 +240,14 @@ func (self *cmdObjRunner) runAndStreamAux( err = cmd.Wait() if err != nil { errStr := stderr.String() - if cmdObj.ShouldIgnoreEmptyError() && errStr == "" { + if errStr != "" { + return errors.New(errStr) + } + + if cmdObj.ShouldIgnoreEmptyError() { return nil } - return errors.New(stderr.String()) + return errors.New(stdout.String()) } return nil diff --git a/pkg/commands/oscommands/cmd_obj_runner_win.go b/pkg/commands/oscommands/cmd_obj_runner_win.go index 9e3d1fd02..6893a2535 100644 --- a/pkg/commands/oscommands/cmd_obj_runner_win.go +++ b/pkg/commands/oscommands/cmd_obj_runner_win.go @@ -7,12 +7,13 @@ import ( "bytes" "io" "os/exec" - "sync" + + "github.com/sasha-s/go-deadlock" ) type Buffer struct { b bytes.Buffer - m sync.Mutex + m deadlock.Mutex } func (b *Buffer) Read(p []byte) (n int, err error) { @@ -20,6 +21,7 @@ func (b *Buffer) Read(p []byte) (n int, err error) { defer b.m.Unlock() return b.b.Read(p) } + func (b *Buffer) Write(p []byte) (n int, err error) { b.m.Lock() defer b.m.Unlock() diff --git a/pkg/commands/oscommands/copy.go b/pkg/commands/oscommands/copy.go index 131e9bc6b..f68590280 100644 --- a/pkg/commands/oscommands/copy.go +++ b/pkg/commands/oscommands/copy.go @@ -72,7 +72,7 @@ func CopyFile(src, dst string) (err error) { return } - return + return //nolint: nakedret } // CopyDir recursively copies a directory tree, attempting to preserve permissions. @@ -133,5 +133,5 @@ func CopyDir(src string, dst string) (err error) { } } - return + return //nolint: nakedret } diff --git a/pkg/commands/oscommands/dummies.go b/pkg/commands/oscommands/dummies.go index 158e9a9c1..b5978e4b5 100644 --- a/pkg/commands/oscommands/dummies.go +++ b/pkg/commands/oscommands/dummies.go @@ -2,12 +2,13 @@ package oscommands import ( "github.com/jesseduffield/lazygit/pkg/common" + "github.com/jesseduffield/lazygit/pkg/config" "github.com/jesseduffield/lazygit/pkg/utils" ) // NewDummyOSCommand creates a new dummy OSCommand for testing func NewDummyOSCommand() *OSCommand { - osCmd := NewOSCommand(utils.NewDummyCommon(), dummyPlatform, NewNullGuiIO(utils.NewDummyLog())) + osCmd := NewOSCommand(utils.NewDummyCommon(), config.NewDummyAppConfig(), dummyPlatform, NewNullGuiIO(utils.NewDummyLog())) return osCmd } @@ -56,7 +57,7 @@ var dummyPlatform = &Platform{ } func NewDummyOSCommandWithRunner(runner *FakeCmdObjRunner) *OSCommand { - osCommand := NewOSCommand(utils.NewDummyCommon(), dummyPlatform, NewNullGuiIO(utils.NewDummyLog())) + osCommand := NewOSCommand(utils.NewDummyCommon(), config.NewDummyAppConfig(), dummyPlatform, NewNullGuiIO(utils.NewDummyLog())) osCommand.Cmd = NewDummyCmdObjBuilder(runner) return osCommand diff --git a/pkg/commands/oscommands/fake_cmd_obj_runner.go b/pkg/commands/oscommands/fake_cmd_obj_runner.go index b542bfee3..d06861251 100644 --- a/pkg/commands/oscommands/fake_cmd_obj_runner.go +++ b/pkg/commands/oscommands/fake_cmd_obj_runner.go @@ -21,7 +21,7 @@ type FakeCmdObjRunner struct { var _ ICmdObjRunner = &FakeCmdObjRunner{} -func NewFakeRunner(t *testing.T) *FakeCmdObjRunner { +func NewFakeRunner(t *testing.T) *FakeCmdObjRunner { //nolint:thelper return &FakeCmdObjRunner{t: t} } diff --git a/pkg/commands/oscommands/os.go b/pkg/commands/oscommands/os.go index 53f5bd6f6..2a7cc1328 100644 --- a/pkg/commands/oscommands/os.go +++ b/pkg/commands/oscommands/os.go @@ -12,7 +12,10 @@ import ( "github.com/go-errors/errors" "github.com/atotto/clipboard" + "github.com/jesseduffield/generics/slices" + "github.com/jesseduffield/kill" "github.com/jesseduffield/lazygit/pkg/common" + "github.com/jesseduffield/lazygit/pkg/config" "github.com/jesseduffield/lazygit/pkg/utils" ) @@ -26,6 +29,8 @@ type OSCommand struct { removeFileFn func(string) error Cmd *CmdObjBuilder + + tempDir string } // Platform stores the os state @@ -38,13 +43,14 @@ type Platform struct { } // NewOSCommand os command runner -func NewOSCommand(common *common.Common, platform *Platform, guiIO *guiIO) *OSCommand { +func NewOSCommand(common *common.Common, config config.AppConfigurer, platform *Platform, guiIO *guiIO) *OSCommand { c := &OSCommand{ Common: common, Platform: platform, getenvFn: os.Getenv, removeFileFn: os.RemoveAll, guiIO: guiIO, + tempDir: config.GetTempDir(), } runner := &cmdObjRunner{log: common.Log, guiIO: guiIO} @@ -72,9 +78,14 @@ func FileType(path string) string { } func (c *OSCommand) OpenFile(filename string) error { + return c.OpenFileAtLine(filename, 1) +} + +func (c *OSCommand) OpenFileAtLine(filename string, lineNumber int) error { commandTemplate := c.UserConfig.OS.OpenCommand templateValues := map[string]string{ "filename": c.Quote(filename), + "line": fmt.Sprintf("%d", lineNumber), } command := utils.ResolvePlaceholderString(commandTemplate, templateValues) return c.Cmd.NewShell(command).Run() @@ -98,40 +109,40 @@ func (c *OSCommand) Quote(message string) string { // AppendLineToFile adds a new line in file func (c *OSCommand) AppendLineToFile(filename, line string) error { c.LogCommand(fmt.Sprintf("Appending '%s' to file '%s'", line, filename), false) - f, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600) + f, err := os.OpenFile(filename, os.O_APPEND|os.O_RDWR|os.O_CREATE, 0o600) if err != nil { return utils.WrapError(err) } defer f.Close() - _, err = f.WriteString("\n" + line) + info, err := os.Stat(filename) + if err != nil { + return utils.WrapError(err) + } + + if info.Size() > 0 { + // read last char + buf := make([]byte, 1) + if _, err := f.ReadAt(buf, info.Size()-1); err != nil { + return utils.WrapError(err) + } + + // if the last byte of the file is not a newline, add it + if []byte("\n")[0] != buf[0] { + _, err = f.WriteString("\n") + } + } + + if err == nil { + _, err = f.WriteString(line + "\n") + } + if err != nil { return utils.WrapError(err) } return nil } -// CreateTempFile writes a string to a new temp file and returns the file's name -func (c *OSCommand) CreateTempFile(filename, content string) (string, error) { - tmpfile, err := ioutil.TempFile("", filename) - if err != nil { - c.Log.Error(err) - return "", utils.WrapError(err) - } - c.LogCommand(fmt.Sprintf("Creating temp file '%s'", tmpfile.Name()), false) - - if _, err := tmpfile.WriteString(content); err != nil { - c.Log.Error(err) - return "", utils.WrapError(err) - } - if err := tmpfile.Close(); err != nil { - c.Log.Error(err) - return "", utils.WrapError(err) - } - - return tmpfile.Name(), nil -} - // CreateFileWithContent creates a file with the given content func (c *OSCommand) CreateFileWithContent(path string, content string) error { c.LogCommand(fmt.Sprintf("Creating file '%s'", path), false) @@ -140,7 +151,7 @@ func (c *OSCommand) CreateFileWithContent(path string, content string) error { return err } - if err := ioutil.WriteFile(path, []byte(content), 0644); err != nil { + if err := ioutil.WriteFile(path, []byte(content), 0o644); err != nil { c.Log.Error(err) return utils.WrapError(err) } @@ -168,15 +179,11 @@ func (c *OSCommand) FileExists(path string) (bool, error) { // PipeCommands runs a heap of commands and pipes their inputs/outputs together like A | B | C func (c *OSCommand) PipeCommands(commandStrings ...string) error { - cmds := make([]*exec.Cmd, len(commandStrings)) - logCmdStr := "" - for i, str := range commandStrings { - if i > 0 { - logCmdStr += " | " - } - logCmdStr += str - cmds[i] = c.Cmd.New(str).GetCmd() - } + cmds := slices.Map(commandStrings, func(cmdString string) *exec.Cmd { + return c.Cmd.New(cmdString).GetCmd() + }) + + logCmdStr := strings.Join(commandStrings, " | ") c.LogCommand(logCmdStr, true) for i := 0; i < len(cmds)-1; i++ { @@ -230,12 +237,14 @@ func (c *OSCommand) PipeCommands(commandStrings ...string) error { return nil } +// Kill kills a process. If the process has Setpgid == true, then we have anticipated that it might spawn its own child processes, so we've given it a process group ID (PGID) equal to its process id (PID) and given its child processes will inherit the PGID, we can kill that group, rather than killing the process itself. func Kill(cmd *exec.Cmd) error { - if cmd.Process == nil { - // somebody got to it before we were able to, poor bastard - return nil - } - return cmd.Process.Kill() + return kill.Kill(cmd) +} + +// PrepareForChildren sets Setpgid to true on the cmd, so that when we run it as a subprocess, we can kill its group rather than the process itself. This is because some commands, like `docker-compose logs` spawn multiple children processes, and killing the parent process isn't sufficient for killing those child processes. We set the group id here, and then in subprocess.go we check if the group id is set and if so, we kill the whole group rather than just the one process. +func PrepareForChildren(cmd *exec.Cmd) { + kill.PrepareForChildren(cmd) } func (c *OSCommand) CopyToClipboard(str string) error { @@ -255,8 +264,8 @@ func (c *OSCommand) Getenv(key string) string { return c.getenvFn(key) } -func GetTempDir() string { - return filepath.Join(os.TempDir(), "lazygit") +func (c *OSCommand) GetTempDir() string { + return c.tempDir } // GetLazygitPath returns the path of the currently executed file diff --git a/pkg/commands/oscommands/os_test.go b/pkg/commands/oscommands/os_test.go index efda5a3a1..969224405 100644 --- a/pkg/commands/oscommands/os_test.go +++ b/pkg/commands/oscommands/os_test.go @@ -3,39 +3,12 @@ package oscommands import ( "io/ioutil" "os" + "path/filepath" "testing" "github.com/stretchr/testify/assert" ) -func TestOSCommandRunWithOutput(t *testing.T) { - type scenario struct { - command string - test func(string, error) - } - - scenarios := []scenario{ - { - "echo -n '123'", - func(output string, err error) { - assert.NoError(t, err) - assert.EqualValues(t, "123", output) - }, - }, - { - "rmdir unexisting-folder", - func(output string, err error) { - assert.Regexp(t, "rmdir.*unexisting-folder.*", err.Error()) - }, - }, - } - - for _, s := range scenarios { - c := NewDummyOSCommand() - s.test(c.Cmd.New(s.command).RunWithOutput()) - } -} - func TestOSCommandRun(t *testing.T) { type scenario struct { command string @@ -141,7 +114,7 @@ func TestOSCommandFileType(t *testing.T) { { "testDirectory", func() { - if err := os.Mkdir("testDirectory", 0644); err != nil { + if err := os.Mkdir("testDirectory", 0o644); err != nil { panic(err) } }, @@ -165,34 +138,60 @@ func TestOSCommandFileType(t *testing.T) { } } -func TestOSCommandCreateTempFile(t *testing.T) { +func TestOSCommandAppendLineToFile(t *testing.T) { type scenario struct { - testName string - filename string - content string - test func(string, error) + path string + setup func(string) + test func(string) } scenarios := []scenario{ { - "valid case", - "filename", - "content", - func(path string, err error) { - assert.NoError(t, err) - - content, err := ioutil.ReadFile(path) - assert.NoError(t, err) - - assert.Equal(t, "content", string(content)) + filepath.Join(os.TempDir(), "testFile"), + func(path string) { + if err := ioutil.WriteFile(path, []byte("hello"), 0o600); err != nil { + panic(err) + } + }, + func(output string) { + assert.EqualValues(t, "hello\nworld\n", output) + }, + }, + { + filepath.Join(os.TempDir(), "emptyTestFile"), + func(path string) { + if err := ioutil.WriteFile(path, []byte(""), 0o600); err != nil { + panic(err) + } + }, + func(output string) { + assert.EqualValues(t, "world\n", output) + }, + }, + { + filepath.Join(os.TempDir(), "testFileWithNewline"), + func(path string) { + if err := ioutil.WriteFile(path, []byte("hello\n"), 0o600); err != nil { + panic(err) + } + }, + func(output string) { + assert.EqualValues(t, "hello\nworld\n", output) }, }, } for _, s := range scenarios { - s := s - t.Run(s.testName, func(t *testing.T) { - s.test(NewDummyOSCommand().CreateTempFile(s.filename, s.content)) - }) + s.setup(s.path) + osCommand := NewDummyOSCommand() + if err := osCommand.AppendLineToFile(s.path, "world"); err != nil { + panic(err) + } + f, err := ioutil.ReadFile(s.path) + if err != nil { + panic(err) + } + s.test(string(f)) + _ = os.RemoveAll(s.path) } } diff --git a/pkg/commands/oscommands/os_test_default.go b/pkg/commands/oscommands/os_test_default.go index f4c1221ed..39a1226d2 100644 --- a/pkg/commands/oscommands/os_test_default.go +++ b/pkg/commands/oscommands/os_test_default.go @@ -10,6 +10,34 @@ import ( "github.com/stretchr/testify/assert" ) +func TestOSCommandRunWithOutput(t *testing.T) { + type scenario struct { + command string + test func(string, error) + } + + scenarios := []scenario{ + { + "echo -n '123'", + func(output string, err error) { + assert.NoError(t, err) + assert.EqualValues(t, "123", output) + }, + }, + { + "rmdir unexisting-folder", + func(output string, err error) { + assert.Regexp(t, "rmdir.*unexisting-folder.*", err.Error()) + }, + }, + } + + for _, s := range scenarios { + c := NewDummyOSCommand() + s.test(c.Cmd.New(s.command).RunWithOutput()) + } +} + func TestOSCommandOpenFileDarwin(t *testing.T) { type scenario struct { filename string diff --git a/pkg/commands/patch/hunk.go b/pkg/commands/patch/hunk.go index bbb2d54ff..98d932126 100644 --- a/pkg/commands/patch/hunk.go +++ b/pkg/commands/patch/hunk.go @@ -5,6 +5,7 @@ import ( "strings" "github.com/jesseduffield/lazygit/pkg/utils" + "github.com/samber/lo" ) type PatchHunk struct { @@ -54,7 +55,7 @@ func (hunk *PatchHunk) updatedLines(lineIndices []int, reverse bool) []string { if line == "" { break } - isLineSelected := utils.IncludesInt(lineIndices, lineIdx) + isLineSelected := lo.Contains(lineIndices, lineIdx) firstChar, content := line[:1], line[1:] transformedFirstChar := transformedFirstChar(firstChar, reverse, isLineSelected) diff --git a/pkg/commands/patch/patch_manager.go b/pkg/commands/patch/patch_manager.go index c8e16a7fd..91adfecb4 100644 --- a/pkg/commands/patch/patch_manager.go +++ b/pkg/commands/patch/patch_manager.go @@ -4,7 +4,9 @@ import ( "sort" "strings" - "github.com/jesseduffield/lazygit/pkg/utils" + "github.com/jesseduffield/generics/maps" + "github.com/jesseduffield/generics/slices" + "github.com/samber/lo" "github.com/sirupsen/logrus" ) @@ -26,8 +28,10 @@ type fileInfo struct { diff string } -type applyPatchFunc func(patch string, flags ...string) error -type loadFileDiffFunc func(from string, to string, reverse bool, filename string, plain bool) (string, error) +type ( + applyPatchFunc func(patch string, flags ...string) error + loadFileDiffFunc func(from string, to string, reverse bool, filename string, plain bool) (string, error) +) // PatchManager manages the building of a patch for a commit to be applied to another commit (or the working tree, or removed from the current commit). We also support building patches from things like stashes, for which there is less flexibility type PatchManager struct { @@ -70,8 +74,9 @@ func (p *PatchManager) Start(from, to string, reverse bool, canRebase bool) { func (p *PatchManager) addFileWhole(info *fileInfo) { info.mode = WHOLE lineCount := len(strings.Split(info.diff, "\n")) - info.includedLineIndices = make([]int, lineCount) // add every line index + // TODO: add tests and then use lo.Range to simplify + info.includedLineIndices = make([]int, lineCount) for i := 0; i < lineCount; i++ { info.includedLineIndices[i] = i } @@ -138,7 +143,7 @@ func (p *PatchManager) AddFileLineRange(filename string, firstLineIdx, lastLineI return err } info.mode = PART - info.includedLineIndices = utils.UnionInt(info.includedLineIndices, getIndicesForRange(firstLineIdx, lastLineIdx)) + info.includedLineIndices = lo.Union(info.includedLineIndices, getIndicesForRange(firstLineIdx, lastLineIdx)) return nil } @@ -149,7 +154,7 @@ func (p *PatchManager) RemoveFileLineRange(filename string, firstLineIdx, lastLi return err } info.mode = PART - info.includedLineIndices = utils.DifferenceInt(info.includedLineIndices, getIndicesForRange(firstLineIdx, lastLineIdx)) + info.includedLineIndices, _ = lo.Difference(info.includedLineIndices, getIndicesForRange(firstLineIdx, lastLineIdx)) if len(info.includedLineIndices) == 0 { p.removeFile(info) } @@ -185,26 +190,20 @@ func (p *PatchManager) RenderPatchForFile(filename string, plain bool, reverse b parser := NewPatchParser(p.Log, patch) // not passing included lines because we don't want to see them in the secondary panel - return parser.Render(-1, -1, nil) + return parser.Render(false, -1, -1, nil) } func (p *PatchManager) renderEachFilePatch(plain bool) []string { // sort files by name then iterate through and render each patch - filenames := make([]string, len(p.fileInfoMap)) - index := 0 - for filename := range p.fileInfoMap { - filenames[index] = filename - index++ - } + filenames := maps.Keys(p.fileInfoMap) sort.Strings(filenames) - output := []string{} - for _, filename := range filenames { - patch := p.RenderPatchForFile(filename, plain, false, true) - if patch != "" { - output = append(output, patch) - } - } + patches := slices.Map(filenames, func(filename string) string { + return p.RenderPatchForFile(filename, plain, false, true) + }) + output := slices.Filter(patches, func(patch string) bool { + return patch != "" + }) return output } diff --git a/pkg/commands/patch/patch_modifier.go b/pkg/commands/patch/patch_modifier.go index 2109ad1f0..2d060ec18 100644 --- a/pkg/commands/patch/patch_modifier.go +++ b/pkg/commands/patch/patch_modifier.go @@ -8,8 +8,10 @@ import ( "github.com/sirupsen/logrus" ) -var hunkHeaderRegexp = regexp.MustCompile(`(?m)^@@ -(\d+)[^\+]+\+(\d+)[^@]+@@(.*)$`) -var patchHeaderRegexp = regexp.MustCompile(`(?ms)(^diff.*?)^@@`) +var ( + hunkHeaderRegexp = regexp.MustCompile(`(?m)^@@ -(\d+)[^\+]+\+(\d+)[^@]+@@(.*)$`) + patchHeaderRegexp = regexp.MustCompile(`(?ms)(^diff.*?)^@@`) +) func GetHeaderFromDiff(diff string) string { match := patchHeaderRegexp.FindStringSubmatch(diff) diff --git a/pkg/commands/patch/patch_parser.go b/pkg/commands/patch/patch_parser.go index c2be120c9..90b2ea13e 100644 --- a/pkg/commands/patch/patch_parser.go +++ b/pkg/commands/patch/patch_parser.go @@ -4,9 +4,10 @@ import ( "regexp" "strings" + "github.com/jesseduffield/generics/slices" "github.com/jesseduffield/lazygit/pkg/gui/style" "github.com/jesseduffield/lazygit/pkg/theme" - "github.com/jesseduffield/lazygit/pkg/utils" + "github.com/samber/lo" "github.com/sirupsen/logrus" ) @@ -182,29 +183,39 @@ func parsePatch(patch string) ([]int, []int, []*PatchLine) { } // Render returns the coloured string of the diff with any selected lines highlighted -func (p *PatchParser) Render(firstLineIndex int, lastLineIndex int, incLineIndices []int) string { - renderedLines := make([]string, len(p.PatchLines)) - for index, patchLine := range p.PatchLines { - selected := index >= firstLineIndex && index <= lastLineIndex - included := utils.IncludesInt(incLineIndices, index) - renderedLines[index] = patchLine.render(selected, included) - } - result := strings.Join(renderedLines, "\n") - if strings.TrimSpace(utils.Decolorise(result)) == "" { +func (p *PatchParser) Render(isFocused bool, firstLineIndex int, lastLineIndex int, incLineIndices []int) string { + contentToDisplay := slices.Some(p.PatchLines, func(line *PatchLine) bool { + return line.Content != "" + }) + if !contentToDisplay { return "" } + + renderedLines := slices.MapWithIndex(p.PatchLines, func(patchLine *PatchLine, index int) string { + selected := isFocused && index >= firstLineIndex && index <= lastLineIndex + included := lo.Contains(incLineIndices, index) + return patchLine.render(selected, included) + }) + + result := strings.Join(renderedLines, "\n") + return result } -// PlainRenderLines returns the non-coloured string of diff part from firstLineIndex to -// lastLineIndex -func (p *PatchParser) PlainRenderLines(firstLineIndex, lastLineIndex int) string { - linesToCopy := p.PatchLines[firstLineIndex : lastLineIndex+1] +func (p *PatchParser) RenderPlain() string { + return renderLinesPlain(p.PatchLines) +} - renderedLines := make([]string, len(linesToCopy)) - for index, line := range linesToCopy { - renderedLines[index] = line.Content - } +// RenderLinesPlain returns the non-coloured string of diff part from firstLineIndex to +// lastLineIndex +func (p *PatchParser) RenderLinesPlain(firstLineIndex, lastLineIndex int) string { + return renderLinesPlain(p.PatchLines[firstLineIndex : lastLineIndex+1]) +} + +func renderLinesPlain(lines []*PatchLine) string { + renderedLines := slices.Map(lines, func(line *PatchLine) string { + return line.Content + }) return strings.Join(renderedLines, "\n") } diff --git a/pkg/config/app_config.go b/pkg/config/app_config.go index 98620ad43..9806bcf58 100644 --- a/pkg/config/app_config.go +++ b/pkg/config/app_config.go @@ -1,6 +1,7 @@ package config import ( + "fmt" "io/ioutil" "os" "path/filepath" @@ -14,7 +15,6 @@ import ( type AppConfig struct { Debug bool `long:"debug" env:"DEBUG" default:"false"` Version string `long:"version" env:"VERSION" default:"unversioned"` - Commit string `long:"commit" env:"COMMIT"` BuildDate string `long:"build-date" env:"BUILD_DATE"` Name string `long:"name" env:"NAME" default:"lazygit"` BuildSource string `long:"build-source" env:"BUILD_SOURCE" default:""` @@ -27,15 +27,11 @@ type AppConfig struct { IsNewRepo bool } -// AppConfigurer interface allows individual app config structs to inherit Fields -// from AppConfig and still be used by lazygit. type AppConfigurer interface { GetDebug() bool // build info GetVersion() string - GetCommit() string - GetBuildDate() string GetName() string GetBuildSource() string @@ -43,13 +39,22 @@ type AppConfigurer interface { GetUserConfigPaths() []string GetUserConfigDir() string ReloadUserConfig() error + GetTempDir() string GetAppState() *AppState SaveAppState() error } // NewAppConfig makes a new app config -func NewAppConfig(name, version, commit, date string, buildSource string, debuggingFlag bool) (*AppConfig, error) { +func NewAppConfig( + name string, + version, + commit, + date string, + buildSource string, + debuggingFlag bool, + tempDir string, +) (*AppConfig, error) { configDir, err := findOrCreateConfigDir() if err != nil && !os.IsPermission(err) { return nil, err @@ -70,21 +75,14 @@ func NewAppConfig(name, version, commit, date string, buildSource string, debugg return nil, err } - if os.Getenv("DEBUG") == "TRUE" { - debuggingFlag = true - } - - tempDir := filepath.Join(os.TempDir(), "lazygit") - appState, err := loadAppState() if err != nil { return nil, err } appConfig := &AppConfig{ - Name: "lazygit", + Name: name, Version: version, - Commit: commit, BuildDate: date, Debug: debuggingFlag, BuildSource: buildSource, @@ -123,7 +121,7 @@ func configDirForVendor(vendor string) string { func findOrCreateConfigDir() (string, error) { folder := ConfigDir() - return folder, os.MkdirAll(folder, 0755) + return folder, os.MkdirAll(folder, 0o755) } func loadUserConfigWithDefaults(configFiles []string) (*UserConfig, error) { @@ -160,7 +158,7 @@ func loadUserConfig(configFiles []string, base *UserConfig) (*UserConfig, error) } if err := yaml.Unmarshal(content, base); err != nil { - return nil, err + return nil, fmt.Errorf("The config at `%s` couldn't be parsed, please inspect it before opening up an issue.\n%w", path, err) } } @@ -175,14 +173,6 @@ func (c *AppConfig) GetVersion() string { return c.Version } -func (c *AppConfig) GetCommit() string { - return c.Commit -} - -func (c *AppConfig) GetBuildDate() string { - return c.BuildDate -} - func (c *AppConfig) GetName() string { return c.Name } @@ -221,6 +211,10 @@ func (c *AppConfig) ReloadUserConfig() error { return nil } +func (c *AppConfig) GetTempDir() string { + return c.TempDir +} + func configFilePath(filename string) (string, error) { folder, err := findOrCreateConfigDir() if err != nil { @@ -232,7 +226,7 @@ func configFilePath(filename string) (string, error) { var ConfigFilename = "config.yml" -// ConfigFilename returns the filename of the deafult config file +// ConfigFilename returns the filename of the default config file func (c *AppConfig) ConfigFilename() string { return filepath.Join(c.UserConfigDir, ConfigFilename) } @@ -249,7 +243,7 @@ func (c *AppConfig) SaveAppState() error { return err } - err = ioutil.WriteFile(filepath, marshalledAppState, 0644) + err = ioutil.WriteFile(filepath, marshalledAppState, 0o644) if err != nil && os.IsPermission(err) { // apparently when people have read-only permissions they prefer us to fail silently return nil diff --git a/pkg/config/config_default_platform.go b/pkg/config/config_default_platform.go index 32b1df473..6784f0ce2 100644 --- a/pkg/config/config_default_platform.go +++ b/pkg/config/config_default_platform.go @@ -7,8 +7,8 @@ package config func GetPlatformDefaultConfig() OSConfig { return OSConfig{ EditCommand: ``, - EditCommandTemplate: `{{editor}} {{filename}}`, - OpenCommand: "open {{filename}}", + EditCommandTemplate: "", + OpenCommand: "open -- {{filename}}", OpenLinkCommand: "open {{link}}", } } diff --git a/pkg/config/config_linux.go b/pkg/config/config_linux.go index dd5708a53..8fdc0c473 100644 --- a/pkg/config/config_linux.go +++ b/pkg/config/config_linux.go @@ -1,10 +1,29 @@ package config +import ( + "io/ioutil" + "strings" +) + +func isWSL() bool { + data, err := ioutil.ReadFile("/proc/sys/kernel/osrelease") + return err == nil && strings.Contains(string(data), "microsoft") +} + // GetPlatformDefaultConfig gets the defaults for the platform func GetPlatformDefaultConfig() OSConfig { + if isWSL() { + return OSConfig{ + EditCommand: ``, + EditCommandTemplate: "", + OpenCommand: `powershell.exe start explorer.exe {{filename}} >/dev/null`, + OpenLinkCommand: `powershell.exe start {{link}} >/dev/null`, + } + } + return OSConfig{ EditCommand: ``, - EditCommandTemplate: `{{editor}} {{filename}}`, + EditCommandTemplate: "", OpenCommand: `xdg-open {{filename}} >/dev/null`, OpenLinkCommand: `xdg-open {{link}} >/dev/null`, } diff --git a/pkg/config/config_windows.go b/pkg/config/config_windows.go index 301eecec1..12ecb8dff 100644 --- a/pkg/config/config_windows.go +++ b/pkg/config/config_windows.go @@ -4,7 +4,7 @@ package config func GetPlatformDefaultConfig() OSConfig { return OSConfig{ EditCommand: ``, - EditCommandTemplate: `{{editor}} {{filename}}`, + EditCommandTemplate: "", OpenCommand: `start "" {{filename}}`, OpenLinkCommand: `start "" {{link}}`, } diff --git a/pkg/config/dummies.go b/pkg/config/dummies.go index bd973909a..08150c765 100644 --- a/pkg/config/dummies.go +++ b/pkg/config/dummies.go @@ -7,14 +7,11 @@ import ( // NewDummyAppConfig creates a new dummy AppConfig for testing func NewDummyAppConfig() *AppConfig { appConfig := &AppConfig{ - Name: "lazygit", - Version: "unversioned", - Commit: "", - BuildDate: "", - Debug: false, - BuildSource: "", - UserConfig: GetDefaultConfig(), - AppState: &AppState{}, + Name: "lazygit", + Version: "unversioned", + Debug: false, + UserConfig: GetDefaultConfig(), + AppState: &AppState{}, } _ = yaml.Unmarshal([]byte{}, appConfig.AppState) return appConfig diff --git a/pkg/config/user_config.go b/pkg/config/user_config.go index 9efc73d90..05020a3fa 100644 --- a/pkg/config/user_config.go +++ b/pkg/config/user_config.go @@ -1,5 +1,9 @@ package config +import ( + "time" +) + type UserConfig struct { Gui GuiConfig `yaml:"gui"` Git GitConfig `yaml:"git"` @@ -11,11 +15,12 @@ type UserConfig struct { QuitOnTopLevelReturn bool `yaml:"quitOnTopLevelReturn"` Keybinding KeybindingConfig `yaml:"keybinding"` // OS determines what defaults are set for opening files and links - OS OSConfig `yaml:"os,omitempty"` - DisableStartupPopups bool `yaml:"disableStartupPopups"` - CustomCommands []CustomCommand `yaml:"customCommands"` - Services map[string]string `yaml:"services"` - NotARepository string `yaml:"notARepository"` + OS OSConfig `yaml:"os,omitempty"` + DisableStartupPopups bool `yaml:"disableStartupPopups"` + CustomCommands []CustomCommand `yaml:"customCommands"` + Services map[string]string `yaml:"services"` + NotARepository string `yaml:"notARepository"` + PromptToReturnFromSubprocess bool `yaml:"promptToReturnFromSubprocess"` } type RefresherConfig struct { @@ -35,6 +40,7 @@ type GuiConfig struct { ExpandFocusedSidePanel bool `yaml:"expandFocusedSidePanel"` MainPanelSplitMode string `yaml:"mainPanelSplitMode"` Language string `yaml:"language"` + TimeFormat string `yaml:"timeFormat"` Theme ThemeConfig `yaml:"theme"` CommitLength CommitLengthConfig `yaml:"commitLength"` SkipNoStagedFilesWarning bool `yaml:"skipNoStagedFilesWarning"` @@ -42,7 +48,10 @@ type GuiConfig struct { ShowFileTree bool `yaml:"showFileTree"` ShowRandomTip bool `yaml:"showRandomTip"` ShowCommandLog bool `yaml:"showCommandLog"` + ShowBottomLine bool `yaml:"showBottomLine"` + ShowIcons bool `yaml:"showIcons"` CommandLogSize int `yaml:"commandLogSize"` + SplitDiff string `yaml:"splitDiff"` } type ThemeConfig struct { @@ -54,6 +63,7 @@ type ThemeConfig struct { SelectedRangeBgColor []string `yaml:"selectedRangeBgColor"` CherryPickedCommitBgColor []string `yaml:"cherryPickedCommitBgColor"` CherryPickedCommitFgColor []string `yaml:"cherryPickedCommitFgColor"` + UnstagedChangesColor []string `yaml:"unstagedChangesColor"` } type CommitLengthConfig struct { @@ -66,6 +76,7 @@ type GitConfig struct { Merging MergingConfig `yaml:"merging"` SkipHookPrefix string `yaml:"skipHookPrefix"` AutoFetch bool `yaml:"autoFetch"` + AutoRefresh bool `yaml:"autoRefresh"` BranchLogCmd string `yaml:"branchLogCmd"` AllBranchesLogCmd string `yaml:"allBranchesLogCmd"` OverrideGpg bool `yaml:"overrideGpg"` @@ -94,8 +105,9 @@ type MergingConfig struct { } type LogConfig struct { - Order string `yaml:"order"` // one of date-order, author-date-order, topo-order - ShowGraph string `yaml:"showGraph"` // one of always, never, when-maximised + Order string `yaml:"order"` // one of date-order, author-date-order, topo-order + ShowGraph string `yaml:"showGraph"` // one of always, never, when-maximised + ShowWholeGraph bool `yaml:"showWholeGraph"` } type CommitPrefixConfig struct { @@ -199,7 +211,7 @@ type KeybindingFilesConfig struct { CommitChangesWithoutHook string `yaml:"commitChangesWithoutHook"` AmendLastCommit string `yaml:"amendLastCommit"` CommitChangesWithEditor string `yaml:"commitChangesWithEditor"` - IgnoreFile string `yaml:"ignoreFile"` + IgnoreOrExcludeFile string `yaml:"IgnoreOrExcludeFile"` RefreshFiles string `yaml:"refreshFiles"` StashAllChanges string `yaml:"stashAllChanges"` ViewStashOptions string `yaml:"viewStashOptions"` @@ -228,28 +240,29 @@ type KeybindingBranchesConfig struct { } type KeybindingCommitsConfig struct { - SquashDown string `yaml:"squashDown"` - RenameCommit string `yaml:"renameCommit"` - RenameCommitWithEditor string `yaml:"renameCommitWithEditor"` - ViewResetOptions string `yaml:"viewResetOptions"` - MarkCommitAsFixup string `yaml:"markCommitAsFixup"` - CreateFixupCommit string `yaml:"createFixupCommit"` - SquashAboveCommits string `yaml:"squashAboveCommits"` - MoveDownCommit string `yaml:"moveDownCommit"` - MoveUpCommit string `yaml:"moveUpCommit"` - AmendToCommit string `yaml:"amendToCommit"` - PickCommit string `yaml:"pickCommit"` - RevertCommit string `yaml:"revertCommit"` - CherryPickCopy string `yaml:"cherryPickCopy"` - CherryPickCopyRange string `yaml:"cherryPickCopyRange"` - PasteCommits string `yaml:"pasteCommits"` - TagCommit string `yaml:"tagCommit"` - CheckoutCommit string `yaml:"checkoutCommit"` - ResetCherryPick string `yaml:"resetCherryPick"` - CopyCommitMessageToClipboard string `yaml:"copyCommitMessageToClipboard"` - OpenLogMenu string `yaml:"openLogMenu"` - OpenInBrowser string `yaml:"openInBrowser"` - ViewBisectOptions string `yaml:"viewBisectOptions"` + SquashDown string `yaml:"squashDown"` + RenameCommit string `yaml:"renameCommit"` + RenameCommitWithEditor string `yaml:"renameCommitWithEditor"` + ViewResetOptions string `yaml:"viewResetOptions"` + MarkCommitAsFixup string `yaml:"markCommitAsFixup"` + CreateFixupCommit string `yaml:"createFixupCommit"` + SquashAboveCommits string `yaml:"squashAboveCommits"` + MoveDownCommit string `yaml:"moveDownCommit"` + MoveUpCommit string `yaml:"moveUpCommit"` + AmendToCommit string `yaml:"amendToCommit"` + ResetCommitAuthor string `yaml:"resetCommitAuthor"` + PickCommit string `yaml:"pickCommit"` + RevertCommit string `yaml:"revertCommit"` + CherryPickCopy string `yaml:"cherryPickCopy"` + CherryPickCopyRange string `yaml:"cherryPickCopyRange"` + PasteCommits string `yaml:"pasteCommits"` + TagCommit string `yaml:"tagCommit"` + CheckoutCommit string `yaml:"checkoutCommit"` + ResetCherryPick string `yaml:"resetCherryPick"` + CopyCommitAttributeToClipboard string `yaml:"copyCommitAttributeToClipboard"` + OpenLogMenu string `yaml:"openLogMenu"` + OpenInBrowser string `yaml:"openInBrowser"` + ViewBisectOptions string `yaml:"viewBisectOptions"` } type KeybindingStashConfig struct { @@ -265,6 +278,7 @@ type KeybindingMainConfig struct { ToggleDragSelectAlt string `yaml:"toggleDragSelect-alt"` ToggleSelectHunk string `yaml:"toggleSelectHunk"` PickBothHunks string `yaml:"pickBothHunks"` + EditSelectHunk string `yaml:"editSelectHunk"` } type KeybindingSubmodulesConfig struct { @@ -297,15 +311,19 @@ type CustomCommand struct { LoadingText string `yaml:"loadingText"` Description string `yaml:"description"` Stream bool `yaml:"stream"` + ShowOutput bool `yaml:"showOutput"` } type CustomCommandPrompt struct { - Type string `yaml:"type"` // one of 'input' and 'menu' + Type string `yaml:"type"` // one of 'input', 'menu', or 'confirm' Title string `yaml:"title"` - // this only apply to prompts + // this only apply to input prompts InitialValue string `yaml:"initialValue"` + // this only applies to confirm prompts + Body string `yaml:"body"` + // this only applies to menus Options []CustomCommandMenuOption @@ -334,29 +352,35 @@ func GetDefaultConfig() *UserConfig { ExpandFocusedSidePanel: false, MainPanelSplitMode: "flexible", Language: "auto", + TimeFormat: time.RFC822, Theme: ThemeConfig{ LightTheme: false, ActiveBorderColor: []string{"green", "bold"}, InactiveBorderColor: []string{"white"}, OptionsTextColor: []string{"blue"}, - SelectedLineBgColor: []string{"default"}, + SelectedLineBgColor: []string{"blue"}, SelectedRangeBgColor: []string{"blue"}, - CherryPickedCommitBgColor: []string{"blue"}, - CherryPickedCommitFgColor: []string{"cyan"}, + CherryPickedCommitBgColor: []string{"cyan"}, + CherryPickedCommitFgColor: []string{"blue"}, + UnstagedChangesColor: []string{"red"}, }, CommitLength: CommitLengthConfig{Show: true}, SkipNoStagedFilesWarning: false, ShowListFooter: true, ShowCommandLog: true, + ShowBottomLine: true, ShowFileTree: true, ShowRandomTip: true, + ShowIcons: false, CommandLogSize: 8, + SplitDiff: "auto", }, Git: GitConfig{ Paging: PagingConfig{ ColorArg: "always", Pager: "", - UseConfig: false}, + UseConfig: false, + }, Commit: CommitConfig{ SignOff: false, }, @@ -365,11 +389,13 @@ func GetDefaultConfig() *UserConfig { Args: "", }, Log: LogConfig{ - Order: "topo-order", - ShowGraph: "when-maximised", + Order: "topo-order", + ShowGraph: "when-maximised", + ShowWholeGraph: false, }, SkipHookPrefix: "WIP", AutoFetch: true, + AutoRefresh: true, BranchLogCmd: "git log --graph --color=always --abbrev-commit --decorate --date=relative --pretty=medium {{branchName}} --", AllBranchesLogCmd: "git log --graph --all --color=always --abbrev-commit --decorate --date=relative --pretty=medium", DisableForcePushing: false, @@ -467,7 +493,7 @@ func GetDefaultConfig() *UserConfig { CommitChangesWithoutHook: "w", AmendLastCommit: "A", CommitChangesWithEditor: "C", - IgnoreFile: "i", + IgnoreOrExcludeFile: "i", RefreshFiles: "r", StashAllChanges: "s", ViewStashOptions: "S", @@ -494,28 +520,29 @@ func GetDefaultConfig() *UserConfig { FetchRemote: "f", }, Commits: KeybindingCommitsConfig{ - SquashDown: "s", - RenameCommit: "r", - RenameCommitWithEditor: "R", - ViewResetOptions: "g", - MarkCommitAsFixup: "f", - CreateFixupCommit: "F", - SquashAboveCommits: "S", - MoveDownCommit: "", - MoveUpCommit: "", - AmendToCommit: "A", - PickCommit: "p", - RevertCommit: "t", - CherryPickCopy: "c", - CherryPickCopyRange: "C", - PasteCommits: "v", - TagCommit: "T", - CheckoutCommit: "", - ResetCherryPick: "", - CopyCommitMessageToClipboard: "", - OpenLogMenu: "", - OpenInBrowser: "o", - ViewBisectOptions: "b", + SquashDown: "s", + RenameCommit: "r", + RenameCommitWithEditor: "R", + ViewResetOptions: "g", + MarkCommitAsFixup: "f", + CreateFixupCommit: "F", + SquashAboveCommits: "S", + MoveDownCommit: "", + MoveUpCommit: "", + AmendToCommit: "A", + ResetCommitAuthor: "a", + PickCommit: "p", + RevertCommit: "t", + CherryPickCopy: "c", + CherryPickCopyRange: "C", + PasteCommits: "v", + TagCommit: "T", + CheckoutCommit: "", + ResetCherryPick: "", + CopyCommitAttributeToClipboard: "y", + OpenLogMenu: "", + OpenInBrowser: "o", + ViewBisectOptions: "b", }, Stash: KeybindingStashConfig{ PopStash: "g", @@ -528,6 +555,7 @@ func GetDefaultConfig() *UserConfig { ToggleDragSelectAlt: "V", ToggleSelectHunk: "a", PickBothHunks: "b", + EditSelectHunk: "E", }, Submodules: KeybindingSubmodulesConfig{ Init: "i", @@ -535,10 +563,11 @@ func GetDefaultConfig() *UserConfig { BulkMenu: "b", }, }, - OS: GetPlatformDefaultConfig(), - DisableStartupPopups: false, - CustomCommands: []CustomCommand(nil), - Services: map[string]string(nil), - NotARepository: "prompt", + OS: GetPlatformDefaultConfig(), + DisableStartupPopups: false, + CustomCommands: []CustomCommand(nil), + Services: map[string]string(nil), + NotARepository: "prompt", + PromptToReturnFromSubprocess: true, } } diff --git a/pkg/env/env.go b/pkg/env/env.go index 9c0f4816f..8d7993a9a 100644 --- a/pkg/env/env.go +++ b/pkg/env/env.go @@ -1,6 +1,10 @@ package env -import "os" +import ( + "os" +) + +// This package encapsulates accessing/mutating the ENV of the program. func GetGitDirEnv() string { return os.Getenv("GIT_DIR") diff --git a/pkg/gui/app_status_manager.go b/pkg/gui/app_status_manager.go index e625fcad2..c2d72c5ac 100644 --- a/pkg/gui/app_status_manager.go +++ b/pkg/gui/app_status_manager.go @@ -1,35 +1,34 @@ package gui import ( - "sync" "time" + "github.com/jesseduffield/generics/slices" "github.com/jesseduffield/lazygit/pkg/utils" + "github.com/sasha-s/go-deadlock" ) +// statusManager's job is to handle rendering of loading states and toast notifications +// that you see at the bottom left of the screen. +type statusManager struct { + statuses []appStatus + nextId int + mutex deadlock.Mutex +} + type appStatus struct { message string statusType string id int } -type statusManager struct { - statuses []appStatus - nextId int - mutex sync.Mutex -} - func (m *statusManager) removeStatus(id int) { m.mutex.Lock() defer m.mutex.Unlock() - newStatuses := []appStatus{} - for _, status := range m.statuses { - if status.id != id { - newStatuses = append(newStatuses, status) - } - } - m.statuses = newStatuses + m.statuses = slices.Filter(m.statuses, func(status appStatus) bool { + return status.id != id + }) } func (m *statusManager) addWaitingStatus(message string) int { @@ -83,7 +82,7 @@ func (m *statusManager) getStatusString() string { return topStatus.message } -func (gui *Gui) raiseToast(message string) { +func (gui *Gui) toast(message string) { gui.statusManager.addToastStatus(message) gui.renderAppStatus() @@ -95,7 +94,7 @@ func (gui *Gui) renderAppStatus() { defer ticker.Stop() for range ticker.C { appStatus := gui.statusManager.getStatusString() - gui.OnUIThread(func() error { + gui.c.OnUIThread(func() error { return gui.renderString(gui.Views.AppStatus, appStatus) }) @@ -106,8 +105,8 @@ func (gui *Gui) renderAppStatus() { }) } -// WithWaitingStatus wraps a function and shows a waiting status while the function is still executing -func (gui *Gui) WithWaitingStatus(message string, f func() error) error { +// withWaitingStatus wraps a function and shows a waiting status while the function is still executing +func (gui *Gui) withWaitingStatus(message string, f func() error) error { go utils.Safe(func() { id := gui.statusManager.addWaitingStatus(message) @@ -118,8 +117,8 @@ func (gui *Gui) WithWaitingStatus(message string, f func() error) error { gui.renderAppStatus() if err := f(); err != nil { - gui.OnUIThread(func() error { - return gui.surfaceError(err) + gui.c.OnUIThread(func() error { + return gui.c.Error(err) }) } }) diff --git a/pkg/gui/arrangement.go b/pkg/gui/arrangement.go index fa2e7f29d..89236ae5c 100644 --- a/pkg/gui/arrangement.go +++ b/pkg/gui/arrangement.go @@ -2,154 +2,17 @@ package gui import ( "github.com/jesseduffield/lazygit/pkg/gui/boxlayout" + "github.com/jesseduffield/lazygit/pkg/gui/context" + "github.com/jesseduffield/lazygit/pkg/gui/types" "github.com/jesseduffield/lazygit/pkg/utils" + "github.com/mattn/go-runewidth" ) +// In this file we use the boxlayout package, along with knowledge about the app's state, +// to arrange the windows (i.e. panels) on the screen. + const INFO_SECTION_PADDING = " " -func (gui *Gui) mainSectionChildren() []*boxlayout.Box { - currentWindow := gui.currentWindow() - - // if we're not in split mode we can just show the one main panel. Likewise if - // the main panel is focused and we're in full-screen mode - if !gui.isMainPanelSplit() || (gui.State.ScreenMode == SCREEN_FULL && currentWindow == "main") { - return []*boxlayout.Box{ - { - Window: "main", - Weight: 1, - }, - } - } - - main := "main" - secondary := "secondary" - if gui.secondaryViewFocused() { - // when you think you've focused the secondary view, we've actually just swapped them around in the layout - main, secondary = secondary, main - } - - return []*boxlayout.Box{ - { - Window: main, - Weight: 1, - }, - { - Window: secondary, - Weight: 1, - }, - } -} - -func (gui *Gui) getMidSectionWeights() (int, int) { - currentWindow := gui.currentWindow() - - // we originally specified this as a ratio i.e. .20 would correspond to a weight of 1 against 4 - sidePanelWidthRatio := gui.UserConfig.Gui.SidePanelWidth - // we could make this better by creating ratios like 2:3 rather than always 1:something - mainSectionWeight := int(1/sidePanelWidthRatio) - 1 - sideSectionWeight := 1 - - if gui.splitMainPanelSideBySide() { - mainSectionWeight = 5 // need to shrink side panel to make way for main panels if side-by-side - } - - if currentWindow == "main" { - if gui.State.ScreenMode == SCREEN_HALF || gui.State.ScreenMode == SCREEN_FULL { - sideSectionWeight = 0 - } - } else { - if gui.State.ScreenMode == SCREEN_HALF { - mainSectionWeight = 1 - } else if gui.State.ScreenMode == SCREEN_FULL { - mainSectionWeight = 0 - } - } - - return sideSectionWeight, mainSectionWeight -} - -func (gui *Gui) infoSectionChildren(informationStr string, appStatus string) []*boxlayout.Box { - if gui.State.Searching.isSearching { - return []*boxlayout.Box{ - { - Window: "searchPrefix", - Size: len(SEARCH_PREFIX), - }, - { - Window: "search", - Weight: 1, - }, - } - } - - result := []*boxlayout.Box{} - - if len(appStatus) > 0 { - result = append(result, - &boxlayout.Box{ - Window: "appStatus", - Size: len(appStatus) + len(INFO_SECTION_PADDING), - }, - ) - } - - result = append(result, - []*boxlayout.Box{ - { - Window: "options", - Weight: 1, - }, - { - Window: "information", - // unlike appStatus, informationStr has various colors so we need to decolorise before taking the length - Size: len(INFO_SECTION_PADDING) + len(utils.Decolorise(informationStr)), - }, - }..., - ) - - return result -} - -func (gui *Gui) splitMainPanelSideBySide() bool { - if !gui.isMainPanelSplit() { - return false - } - - mainPanelSplitMode := gui.UserConfig.Gui.MainPanelSplitMode - width, height := gui.g.Size() - - switch mainPanelSplitMode { - case "vertical": - return false - case "horizontal": - return true - default: - if width < 200 && height > 30 { // 2 80 character width panels + 40 width for side panel - return false - } else { - return true - } - } -} - -func (gui *Gui) getExtrasWindowSize(screenHeight int) int { - if !gui.ShowExtrasWindow { - return 0 - } - - var baseSize int - if gui.currentStaticContext().GetKey() == COMMAND_LOG_CONTEXT_KEY { - baseSize = 1000 // my way of saying 'fill the available space' - } else if screenHeight < 40 { - baseSize = 1 - } else { - baseSize = gui.UserConfig.Gui.CommandLogSize - } - - frameSize := 2 - return baseSize + frameSize -} - func (gui *Gui) getWindowDimensions(informationStr string, appStatus string) map[string]boxlayout.Dimensions { width, height := gui.g.Size() @@ -168,6 +31,12 @@ func (gui *Gui) getWindowDimensions(informationStr string, appStatus string) map extrasWindowSize := gui.getExtrasWindowSize(height) + showInfoSection := gui.c.UserConfig.Gui.ShowBottomLine || (gui.State.Searching.isSearching || gui.isAnyModeActive()) + infoSectionSize := 0 + if showInfoSection { + infoSectionSize = 1 + } + root := &boxlayout.Box{ Direction: boxlayout.ROW, Children: []*boxlayout.Box{ @@ -199,13 +68,163 @@ func (gui *Gui) getWindowDimensions(informationStr string, appStatus string) map }, { Direction: boxlayout.COLUMN, - Size: 1, + Size: infoSectionSize, Children: gui.infoSectionChildren(informationStr, appStatus), }, }, } - return boxlayout.ArrangeWindows(root, 0, 0, width, height) + layerOneWindows := boxlayout.ArrangeWindows(root, 0, 0, width, height) + limitWindows := boxlayout.ArrangeWindows(&boxlayout.Box{Window: "limit"}, 0, 0, width, height) + + return MergeMaps(layerOneWindows, limitWindows) +} + +func MergeMaps[K comparable, V any](maps ...map[K]V) map[K]V { + result := map[K]V{} + for _, currMap := range maps { + for key, value := range currMap { + result[key] = value + } + } + + return result +} + +func (gui *Gui) mainSectionChildren() []*boxlayout.Box { + currentWindow := gui.currentWindow() + + // if we're not in split mode we can just show the one main panel. Likewise if + // the main panel is focused and we're in full-screen mode + if !gui.isMainPanelSplit() || (gui.State.ScreenMode == SCREEN_FULL && currentWindow == "main") { + return []*boxlayout.Box{ + { + Window: "main", + Weight: 1, + }, + } + } + + return []*boxlayout.Box{ + { + Window: "main", + Weight: 1, + }, + { + Window: "secondary", + Weight: 1, + }, + } +} + +func (gui *Gui) getMidSectionWeights() (int, int) { + currentWindow := gui.currentWindow() + + // we originally specified this as a ratio i.e. .20 would correspond to a weight of 1 against 4 + sidePanelWidthRatio := gui.c.UserConfig.Gui.SidePanelWidth + // we could make this better by creating ratios like 2:3 rather than always 1:something + mainSectionWeight := int(1/sidePanelWidthRatio) - 1 + sideSectionWeight := 1 + + if gui.splitMainPanelSideBySide() { + mainSectionWeight = 5 // need to shrink side panel to make way for main panels if side-by-side + } + + if currentWindow == "main" { + if gui.State.ScreenMode == SCREEN_HALF || gui.State.ScreenMode == SCREEN_FULL { + sideSectionWeight = 0 + } + } else { + if gui.State.ScreenMode == SCREEN_HALF { + mainSectionWeight = 1 + } else if gui.State.ScreenMode == SCREEN_FULL { + mainSectionWeight = 0 + } + } + + return sideSectionWeight, mainSectionWeight +} + +func (gui *Gui) infoSectionChildren(informationStr string, appStatus string) []*boxlayout.Box { + if gui.State.Searching.isSearching { + return []*boxlayout.Box{ + { + Window: "searchPrefix", + Size: runewidth.StringWidth(SEARCH_PREFIX), + }, + { + Window: "search", + Weight: 1, + }, + } + } + + result := []*boxlayout.Box{} + + if len(appStatus) > 0 { + result = append(result, + &boxlayout.Box{ + Window: "appStatus", + Size: runewidth.StringWidth(appStatus) + runewidth.StringWidth(INFO_SECTION_PADDING), + }, + ) + } + + result = append(result, + []*boxlayout.Box{ + { + Window: "options", + Weight: 1, + }, + { + Window: "information", + // unlike appStatus, informationStr has various colors so we need to decolorise before taking the length + Size: runewidth.StringWidth(INFO_SECTION_PADDING) + runewidth.StringWidth(utils.Decolorise(informationStr)), + }, + }..., + ) + + return result +} + +func (gui *Gui) splitMainPanelSideBySide() bool { + if !gui.isMainPanelSplit() { + return false + } + + mainPanelSplitMode := gui.c.UserConfig.Gui.MainPanelSplitMode + width, height := gui.g.Size() + + switch mainPanelSplitMode { + case "vertical": + return false + case "horizontal": + return true + default: + if width < 200 && height > 30 { // 2 80 character width panels + 40 width for side panel + return false + } else { + return true + } + } +} + +func (gui *Gui) getExtrasWindowSize(screenHeight int) int { + if !gui.ShowExtrasWindow { + return 0 + } + + var baseSize int + if gui.currentStaticContext().GetKey() == context.COMMAND_LOG_CONTEXT_KEY { + baseSize = 1000 // my way of saying 'fill the available space' + } else if screenHeight < 40 { + baseSize = 1 + } else { + baseSize = gui.c.UserConfig.Gui.CommandLogSize + } + + frameSize := 2 + return baseSize + frameSize } // The stash window by default only contains one line so that it's not hogging @@ -259,7 +278,7 @@ func (gui *Gui) sidePanelChildren(width int, height int) []*boxlayout.Box { fullHeightBox("stash"), } } else if height >= 28 { - accordionMode := gui.UserConfig.Gui.ExpandFocusedSidePanel + accordionMode := gui.c.UserConfig.Gui.ExpandFocusedSidePanel accordionBox := func(defaultBox *boxlayout.Box) *boxlayout.Box { if accordionMode && defaultBox.Window == currentWindow { return &boxlayout.Box{ @@ -311,6 +330,10 @@ func (gui *Gui) sidePanelChildren(width int, height int) []*boxlayout.Box { } } +func (gui *Gui) getCyclableWindows() []string { + return []string{"status", "files", "branches", "commits", "stash"} +} + func (gui *Gui) currentSideWindowName() string { // there is always one and only one cyclable context in the context stack. We'll look from top to bottom gui.State.ContextManager.RLock() @@ -320,7 +343,7 @@ func (gui *Gui) currentSideWindowName() string { reversedIdx := len(gui.State.ContextManager.ContextStack) - 1 - idx context := gui.State.ContextManager.ContextStack[reversedIdx] - if context.GetKind() == SIDE_CONTEXT { + if context.GetKind() == types.SIDE_CONTEXT { return context.GetWindowName() } } diff --git a/pkg/gui/basic_context.go b/pkg/gui/basic_context.go deleted file mode 100644 index 1db80ee4a..000000000 --- a/pkg/gui/basic_context.go +++ /dev/null @@ -1,99 +0,0 @@ -package gui - -type BasicContext struct { - OnFocus func(opts ...OnFocusOpts) error - OnFocusLost func() error - OnRender func() error - // this is for pushing some content to the main view - OnRenderToMain func(opts ...OnFocusOpts) error - Kind ContextKind - Key ContextKey - ViewName string - WindowName string - OnGetOptionsMap func() map[string]string - - ParentContext Context - // we can't know on the calling end whether a Context is actually a nil value without reflection, so we're storing this flag here to tell us. There has got to be a better way around this - hasParent bool -} - -func (self *BasicContext) GetOptionsMap() map[string]string { - if self.OnGetOptionsMap != nil { - return self.OnGetOptionsMap() - } - return nil -} - -func (self *BasicContext) SetParentContext(context Context) { - self.ParentContext = context - self.hasParent = true -} - -func (self *BasicContext) GetParentContext() (Context, bool) { - return self.ParentContext, self.hasParent -} - -func (self *BasicContext) SetWindowName(windowName string) { - self.WindowName = windowName -} - -func (self *BasicContext) GetWindowName() string { - windowName := self.WindowName - - if windowName != "" { - return windowName - } - - // TODO: actually set this for everything so we don't default to the view name - return self.ViewName -} - -func (self *BasicContext) HandleRender() error { - if self.OnRender != nil { - return self.OnRender() - } - return nil -} - -func (self *BasicContext) GetViewName() string { - return self.ViewName -} - -func (self *BasicContext) HandleFocus(opts ...OnFocusOpts) error { - if self.OnFocus != nil { - if err := self.OnFocus(opts...); err != nil { - return err - } - } - - if self.OnRenderToMain != nil { - if err := self.OnRenderToMain(opts...); err != nil { - return err - } - } - - return nil -} - -func (self *BasicContext) HandleFocusLost() error { - if self.OnFocusLost != nil { - return self.OnFocusLost() - } - return nil -} - -func (self *BasicContext) HandleRenderToMain() error { - if self.OnRenderToMain != nil { - return self.OnRenderToMain() - } - - return nil -} - -func (self *BasicContext) GetKind() ContextKind { - return self.Kind -} - -func (self *BasicContext) GetKey() ContextKey { - return self.Key -} diff --git a/pkg/gui/bisect.go b/pkg/gui/bisect.go deleted file mode 100644 index 5c46460ac..000000000 --- a/pkg/gui/bisect.go +++ /dev/null @@ -1,219 +0,0 @@ -package gui - -import ( - "fmt" - "strings" - - "github.com/jesseduffield/lazygit/pkg/commands/git_commands" - "github.com/jesseduffield/lazygit/pkg/commands/models" -) - -func (gui *Gui) handleOpenBisectMenu() error { - if ok, err := gui.validateNotInFilterMode(); err != nil || !ok { - return err - } - - // no shame in getting this directly rather than using the cached value - // given how cheap it is to obtain - info := gui.Git.Bisect.GetInfo() - commit := gui.getSelectedLocalCommit() - if info.Started() { - return gui.openMidBisectMenu(info, commit) - } else { - return gui.openStartBisectMenu(info, commit) - } -} - -func (gui *Gui) openMidBisectMenu(info *git_commands.BisectInfo, commit *models.Commit) error { - // if there is not yet a 'current' bisect commit, or if we have - // selected the current commit, we need to jump to the next 'current' commit - // after we perform a bisect action. The reason we don't unconditionally jump - // is that sometimes the user will want to go and mark a few commits as skipped - // in a row and they wouldn't want to be jumped back to the current bisect - // commit each time. - // Originally we were allowing the user to, from the bisect menu, select whether - // they were talking about the selected commit or the current bisect commit, - // and that was a bit confusing (and required extra keypresses). - selectCurrentAfter := info.GetCurrentSha() == "" || info.GetCurrentSha() == commit.Sha - // we need to wait to reselect if our bisect commits aren't ancestors of our 'start' - // ref, because we'll be reloading our commits in that case. - waitToReselect := selectCurrentAfter && !gui.Git.Bisect.ReachableFromStart(info) - - menuItems := []*menuItem{ - { - displayString: fmt.Sprintf(gui.Tr.Bisect.Mark, commit.ShortSha(), info.NewTerm()), - onPress: func() error { - gui.logAction(gui.Tr.Actions.BisectMark) - if err := gui.Git.Bisect.Mark(commit.Sha, info.NewTerm()); err != nil { - return gui.surfaceError(err) - } - - return gui.afterMark(selectCurrentAfter, waitToReselect) - }, - }, - { - displayString: fmt.Sprintf(gui.Tr.Bisect.Mark, commit.ShortSha(), info.OldTerm()), - onPress: func() error { - gui.logAction(gui.Tr.Actions.BisectMark) - if err := gui.Git.Bisect.Mark(commit.Sha, info.OldTerm()); err != nil { - return gui.surfaceError(err) - } - - return gui.afterMark(selectCurrentAfter, waitToReselect) - }, - }, - { - displayString: fmt.Sprintf(gui.Tr.Bisect.Skip, commit.ShortSha()), - onPress: func() error { - gui.logAction(gui.Tr.Actions.BisectSkip) - if err := gui.Git.Bisect.Skip(commit.Sha); err != nil { - return gui.surfaceError(err) - } - - return gui.afterMark(selectCurrentAfter, waitToReselect) - }, - }, - { - displayString: gui.Tr.Bisect.ResetOption, - onPress: func() error { - return gui.resetBisect() - }, - }, - } - - return gui.createMenu( - gui.Tr.Bisect.BisectMenuTitle, - menuItems, - createMenuOptions{showCancel: true}, - ) -} - -func (gui *Gui) openStartBisectMenu(info *git_commands.BisectInfo, commit *models.Commit) error { - return gui.createMenu( - gui.Tr.Bisect.BisectMenuTitle, - []*menuItem{ - { - displayString: fmt.Sprintf(gui.Tr.Bisect.MarkStart, commit.ShortSha(), info.NewTerm()), - onPress: func() error { - gui.logAction(gui.Tr.Actions.StartBisect) - if err := gui.Git.Bisect.Start(); err != nil { - return gui.surfaceError(err) - } - - if err := gui.Git.Bisect.Mark(commit.Sha, info.NewTerm()); err != nil { - return gui.surfaceError(err) - } - - return gui.postBisectCommandRefresh() - }, - }, - { - displayString: fmt.Sprintf(gui.Tr.Bisect.MarkStart, commit.ShortSha(), info.OldTerm()), - onPress: func() error { - gui.logAction(gui.Tr.Actions.StartBisect) - if err := gui.Git.Bisect.Start(); err != nil { - return gui.surfaceError(err) - } - - if err := gui.Git.Bisect.Mark(commit.Sha, info.OldTerm()); err != nil { - return gui.surfaceError(err) - } - - return gui.postBisectCommandRefresh() - }, - }, - }, - createMenuOptions{showCancel: true}, - ) -} - -func (gui *Gui) resetBisect() error { - return gui.ask(askOpts{ - title: gui.Tr.Bisect.ResetTitle, - prompt: gui.Tr.Bisect.ResetPrompt, - handleConfirm: func() error { - gui.logAction(gui.Tr.Actions.ResetBisect) - if err := gui.Git.Bisect.Reset(); err != nil { - return gui.surfaceError(err) - } - - return gui.postBisectCommandRefresh() - }, - }) -} - -func (gui *Gui) showBisectCompleteMessage(candidateShas []string) error { - prompt := gui.Tr.Bisect.CompletePrompt - if len(candidateShas) > 1 { - prompt = gui.Tr.Bisect.CompletePromptIndeterminate - } - - formattedCommits, err := gui.Git.Commit.GetCommitsOneline(candidateShas) - if err != nil { - return gui.surfaceError(err) - } - - return gui.ask(askOpts{ - title: gui.Tr.Bisect.CompleteTitle, - prompt: fmt.Sprintf(prompt, strings.TrimSpace(formattedCommits)), - handleConfirm: func() error { - gui.logAction(gui.Tr.Actions.ResetBisect) - if err := gui.Git.Bisect.Reset(); err != nil { - return gui.surfaceError(err) - } - - return gui.postBisectCommandRefresh() - }, - }) -} - -func (gui *Gui) afterMark(selectCurrent bool, waitToReselect bool) error { - done, candidateShas, err := gui.Git.Bisect.IsDone() - if err != nil { - return gui.surfaceError(err) - } - - if err := gui.afterBisectMarkRefresh(selectCurrent, waitToReselect); err != nil { - return gui.surfaceError(err) - } - - if done { - return gui.showBisectCompleteMessage(candidateShas) - } - - return nil -} - -func (gui *Gui) postBisectCommandRefresh() error { - return gui.refreshSidePanels(refreshOptions{mode: ASYNC, scope: []RefreshableView{}}) -} - -func (gui *Gui) afterBisectMarkRefresh(selectCurrent bool, waitToReselect bool) error { - selectFn := func() { - if selectCurrent { - gui.selectCurrentBisectCommit() - } - } - - if waitToReselect { - return gui.refreshSidePanels(refreshOptions{mode: SYNC, scope: []RefreshableView{}, then: selectFn}) - } else { - selectFn() - - return gui.postBisectCommandRefresh() - } -} - -func (gui *Gui) selectCurrentBisectCommit() { - info := gui.Git.Bisect.GetInfo() - if info.GetCurrentSha() != "" { - // find index of commit with that sha, move cursor to that. - for i, commit := range gui.State.Commits { - if commit.Sha == info.GetCurrentSha() { - gui.State.Contexts.BranchCommits.GetPanelState().SetSelectedLineIdx(i) - _ = gui.State.Contexts.BranchCommits.HandleFocus() - break - } - } - } -} diff --git a/pkg/gui/boxlayout/boxlayout.go b/pkg/gui/boxlayout/boxlayout.go index 36af2b2ab..4eb6f15e6 100644 --- a/pkg/gui/boxlayout/boxlayout.go +++ b/pkg/gui/boxlayout/boxlayout.go @@ -1,6 +1,10 @@ package boxlayout -import "math" +import ( + "github.com/jesseduffield/generics/slices" + "github.com/jesseduffield/lazygit/pkg/utils" + "github.com/samber/lo" +) type Dimensions struct { X0 int @@ -69,45 +73,12 @@ func ArrangeWindows(root *Box, x0, y0, width, height int) map[string]Dimensions availableSize = height } - // work out size taken up by children - reservedSize := 0 - totalWeight := 0 - for _, child := range children { - // assuming either size or weight are non-zero - reservedSize += child.Size - totalWeight += child.Weight - } - - remainingSize := availableSize - reservedSize - if remainingSize < 0 { - remainingSize = 0 - } - - unitSize := 0 - extraSize := 0 - if totalWeight > 0 { - unitSize = remainingSize / totalWeight - extraSize = remainingSize % totalWeight - } + sizes := calcSizes(children, availableSize) result := map[string]Dimensions{} offset := 0 - for _, child := range children { - var boxSize int - if child.isStatic() { - boxSize = child.Size - // assuming that only one static child can have a size greater than the - // available space. In that case we just crop the size to what's available - if boxSize > availableSize { - boxSize = availableSize - } - } else { - // TODO: consider more evenly distributing the remainder - boxSize = unitSize * child.Weight - boxExtraSize := int(math.Min(float64(extraSize), float64(child.Weight))) - boxSize += boxExtraSize - extraSize -= boxExtraSize - } + for i, child := range children { + boxSize := sizes[i] var resultForChild map[string]Dimensions if direction == COLUMN { @@ -123,6 +94,95 @@ func ArrangeWindows(root *Box, x0, y0, width, height int) map[string]Dimensions return result } +func calcSizes(boxes []*Box, availableSpace int) []int { + normalizedWeights := normalizeWeights(slices.Map(boxes, func(box *Box) int { return box.Weight })) + + totalWeight := 0 + reservedSpace := 0 + for i, box := range boxes { + if box.isStatic() { + reservedSpace += box.Size + } else { + totalWeight += normalizedWeights[i] + } + } + + dynamicSpace := utils.Max(0, availableSpace-reservedSpace) + + unitSize := 0 + extraSpace := 0 + if totalWeight > 0 { + unitSize = dynamicSpace / totalWeight + extraSpace = dynamicSpace % totalWeight + } + + result := make([]int, len(boxes)) + for i, box := range boxes { + if box.isStatic() { + // assuming that only one static child can have a size greater than the + // available space. In that case we just crop the size to what's available + result[i] = utils.Min(availableSpace, box.Size) + } else { + result[i] = unitSize * normalizedWeights[i] + } + } + + // distribute the remainder across dynamic boxes. + for extraSpace > 0 { + for i, weight := range normalizedWeights { + if weight > 0 { + result[i]++ + extraSpace-- + normalizedWeights[i]-- + + if extraSpace == 0 { + break + } + } + } + } + + return result +} + +// removes common multiple from weights e.g. if we get 2, 4, 4 we return 1, 2, 2. +func normalizeWeights(weights []int) []int { + if len(weights) == 0 { + return []int{} + } + + // to spare us some computation we'll exit early if any of our weights is 1 + if slices.Some(weights, func(weight int) bool { return weight == 1 }) { + return weights + } + + // map weights to factorSlices and find the lowest common factor + positiveWeights := slices.Filter(weights, func(weight int) bool { return weight > 0 }) + factorSlices := slices.Map(positiveWeights, func(weight int) []int { return calcFactors(weight) }) + commonFactors := factorSlices[0] + for _, factors := range factorSlices { + commonFactors = lo.Intersect(commonFactors, factors) + } + + if len(commonFactors) == 0 { + return weights + } + + newWeights := slices.Map(weights, func(weight int) int { return weight / commonFactors[0] }) + + return normalizeWeights(newWeights) +} + +func calcFactors(n int) []int { + factors := []int{} + for i := 2; i <= n; i++ { + if n%i == 0 { + factors = append(factors, i) + } + } + return factors +} + func (b *Box) isStatic() bool { return b.Size > 0 } diff --git a/pkg/gui/boxlayout/boxlayout_test.go b/pkg/gui/boxlayout/boxlayout_test.go index 65e6101f7..c2c0bc9e4 100644 --- a/pkg/gui/boxlayout/boxlayout_test.go +++ b/pkg/gui/boxlayout/boxlayout_test.go @@ -19,24 +19,24 @@ func TestArrangeWindows(t *testing.T) { scenarios := []scenario{ { - "Empty box", - &Box{}, - 0, - 0, - 10, - 10, - func(result map[string]Dimensions) { + testName: "Empty box", + root: &Box{}, + x0: 0, + y0: 0, + width: 10, + height: 10, + test: func(result map[string]Dimensions) { assert.EqualValues(t, result, map[string]Dimensions{}) }, }, { - "Box with static and dynamic panel", - &Box{Children: []*Box{{Size: 1, Window: "static"}, {Weight: 1, Window: "dynamic"}}}, - 0, - 0, - 10, - 10, - func(result map[string]Dimensions) { + testName: "Box with static and dynamic panel", + root: &Box{Children: []*Box{{Size: 1, Window: "static"}, {Weight: 1, Window: "dynamic"}}}, + x0: 0, + y0: 0, + width: 10, + height: 10, + test: func(result map[string]Dimensions) { assert.EqualValues( t, result, @@ -48,13 +48,13 @@ func TestArrangeWindows(t *testing.T) { }, }, { - "Box with static and two dynamic panels", - &Box{Children: []*Box{{Size: 1, Window: "static"}, {Weight: 1, Window: "dynamic1"}, {Weight: 2, Window: "dynamic2"}}}, - 0, - 0, - 10, - 10, - func(result map[string]Dimensions) { + testName: "Box with static and two dynamic panels", + root: &Box{Children: []*Box{{Size: 1, Window: "static"}, {Weight: 1, Window: "dynamic1"}, {Weight: 2, Window: "dynamic2"}}}, + x0: 0, + y0: 0, + width: 10, + height: 10, + test: func(result map[string]Dimensions) { assert.EqualValues( t, result, @@ -67,13 +67,13 @@ func TestArrangeWindows(t *testing.T) { }, }, { - "Box with COLUMN direction", - &Box{Direction: COLUMN, Children: []*Box{{Size: 1, Window: "static"}, {Weight: 1, Window: "dynamic1"}, {Weight: 2, Window: "dynamic2"}}}, - 0, - 0, - 10, - 10, - func(result map[string]Dimensions) { + testName: "Box with COLUMN direction", + root: &Box{Direction: COLUMN, Children: []*Box{{Size: 1, Window: "static"}, {Weight: 1, Window: "dynamic1"}, {Weight: 2, Window: "dynamic2"}}}, + x0: 0, + y0: 0, + width: 10, + height: 10, + test: func(result map[string]Dimensions) { assert.EqualValues( t, result, @@ -86,19 +86,19 @@ func TestArrangeWindows(t *testing.T) { }, }, { - "Box with COLUMN direction only on wide boxes with narrow box", - &Box{ConditionalDirection: func(width int, height int) Direction { + testName: "Box with COLUMN direction only on wide boxes with narrow box", + root: &Box{ConditionalDirection: func(width int, height int) Direction { if width > 4 { return COLUMN } else { return ROW } }, Children: []*Box{{Weight: 1, Window: "dynamic1"}, {Weight: 1, Window: "dynamic2"}}}, - 0, - 0, - 4, - 4, - func(result map[string]Dimensions) { + x0: 0, + y0: 0, + width: 4, + height: 4, + test: func(result map[string]Dimensions) { assert.EqualValues( t, result, @@ -110,19 +110,20 @@ func TestArrangeWindows(t *testing.T) { }, }, { - "Box with COLUMN direction only on wide boxes with wide box", - &Box{ConditionalDirection: func(width int, height int) Direction { + testName: "Box with COLUMN direction only on wide boxes with wide box", + root: &Box{ConditionalDirection: func(width int, height int) Direction { if width > 4 { return COLUMN } else { return ROW } }, Children: []*Box{{Weight: 1, Window: "dynamic1"}, {Weight: 1, Window: "dynamic2"}}}, - 0, - 0, - 5, - 5, - func(result map[string]Dimensions) { + // 5 / 2 = 2 remainder 1. That remainder goes to the first box. + x0: 0, + y0: 0, + width: 5, + height: 5, + test: func(result map[string]Dimensions) { assert.EqualValues( t, result, @@ -134,19 +135,19 @@ func TestArrangeWindows(t *testing.T) { }, }, { - "Box with conditional children where box is wide", - &Box{ConditionalChildren: func(width int, height int) []*Box { + testName: "Box with conditional children where box is wide", + root: &Box{ConditionalChildren: func(width int, height int) []*Box { if width > 4 { return []*Box{{Window: "wide", Weight: 1}} } else { return []*Box{{Window: "narrow", Weight: 1}} } }}, - 0, - 0, - 5, - 5, - func(result map[string]Dimensions) { + x0: 0, + y0: 0, + width: 5, + height: 5, + test: func(result map[string]Dimensions) { assert.EqualValues( t, result, @@ -157,19 +158,19 @@ func TestArrangeWindows(t *testing.T) { }, }, { - "Box with conditional children where box is narrow", - &Box{ConditionalChildren: func(width int, height int) []*Box { + testName: "Box with conditional children where box is narrow", + root: &Box{ConditionalChildren: func(width int, height int) []*Box { if width > 4 { return []*Box{{Window: "wide", Weight: 1}} } else { return []*Box{{Window: "narrow", Weight: 1}} } }}, - 0, - 0, - 4, - 4, - func(result map[string]Dimensions) { + x0: 0, + y0: 0, + width: 4, + height: 4, + test: func(result map[string]Dimensions) { assert.EqualValues( t, result, @@ -180,13 +181,13 @@ func TestArrangeWindows(t *testing.T) { }, }, { - "Box with static child with size too large", - &Box{Direction: COLUMN, Children: []*Box{{Size: 11, Window: "static"}, {Weight: 1, Window: "dynamic1"}, {Weight: 2, Window: "dynamic2"}}}, - 0, - 0, - 10, - 10, - func(result map[string]Dimensions) { + testName: "Box with static child with size too large", + root: &Box{Direction: COLUMN, Children: []*Box{{Size: 11, Window: "static"}, {Weight: 1, Window: "dynamic1"}, {Weight: 2, Window: "dynamic2"}}}, + x0: 0, + y0: 0, + width: 10, + height: 10, + test: func(result map[string]Dimensions) { assert.EqualValues( t, result, @@ -200,6 +201,118 @@ func TestArrangeWindows(t *testing.T) { ) }, }, + { + // 10 total space minus 2 from the status box leaves us with 8. + // Total weight is 3, 8 / 3 = 2 with 2 remainder. + // We want to end up with 2, 3, 5 (one unit from remainder to each dynamic box) + testName: "Distributing remainder across weighted boxes", + root: &Box{Direction: COLUMN, Children: []*Box{{Size: 2, Window: "static"}, {Weight: 1, Window: "dynamic1"}, {Weight: 2, Window: "dynamic2"}}}, + x0: 0, + y0: 0, + width: 10, + height: 10, + test: func(result map[string]Dimensions) { + assert.EqualValues( + t, + result, + map[string]Dimensions{ + "static": {X0: 0, X1: 1, Y0: 0, Y1: 9}, // 2 + "dynamic1": {X0: 2, X1: 4, Y0: 0, Y1: 9}, // 3 + "dynamic2": {X0: 5, X1: 9, Y0: 0, Y1: 9}, // 5 + }, + ) + }, + }, + { + // 9 total space. + // total weight is 5, 9 / 5 = 1 with 4 remainder + // we want to give 2 of that remainder to the first, 1 to the second, and 1 to the last. + // Reason being that we just give units to each box evenly and consider weight in subsequent passes. + testName: "Distributing remainder across weighted boxes 2", + root: &Box{Direction: COLUMN, Children: []*Box{{Weight: 2, Window: "dynamic1"}, {Weight: 2, Window: "dynamic2"}, {Weight: 1, Window: "dynamic3"}}}, + x0: 0, + y0: 0, + width: 9, + height: 10, + test: func(result map[string]Dimensions) { + assert.EqualValues( + t, + result, + map[string]Dimensions{ + "dynamic1": {X0: 0, X1: 3, Y0: 0, Y1: 9}, // 4 + "dynamic2": {X0: 4, X1: 6, Y0: 0, Y1: 9}, // 3 + "dynamic3": {X0: 7, X1: 8, Y0: 0, Y1: 9}, // 2 + }, + ) + }, + }, + { + // 9 total space. + // total weight is 5, 9 / 5 = 1 with 4 remainder + // we want to give 2 of that remainder to the first, 1 to the second, and 1 to the last. + // Reason being that we just give units to each box evenly and consider weight in subsequent passes. + testName: "Distributing remainder across weighted boxes with unnormalized weights", + root: &Box{Direction: COLUMN, Children: []*Box{{Weight: 4, Window: "dynamic1"}, {Weight: 4, Window: "dynamic2"}, {Weight: 2, Window: "dynamic3"}}}, + x0: 0, + y0: 0, + width: 9, + height: 10, + test: func(result map[string]Dimensions) { + assert.EqualValues( + t, + result, + map[string]Dimensions{ + "dynamic1": {X0: 0, X1: 3, Y0: 0, Y1: 9}, // 4 + "dynamic2": {X0: 4, X1: 6, Y0: 0, Y1: 9}, // 3 + "dynamic3": {X0: 7, X1: 8, Y0: 0, Y1: 9}, // 2 + }, + ) + }, + }, + { + testName: "Another distribution test", + root: &Box{Direction: COLUMN, Children: []*Box{ + {Weight: 3, Window: "dynamic1"}, + {Weight: 1, Window: "dynamic2"}, + {Weight: 1, Window: "dynamic3"}, + }}, + x0: 0, + y0: 0, + width: 9, + height: 10, + test: func(result map[string]Dimensions) { + assert.EqualValues( + t, + result, + map[string]Dimensions{ + "dynamic1": {X0: 0, X1: 4, Y0: 0, Y1: 9}, // 5 + "dynamic2": {X0: 5, X1: 6, Y0: 0, Y1: 9}, // 2 + "dynamic3": {X0: 7, X1: 8, Y0: 0, Y1: 9}, // 2 + }, + ) + }, + }, + { + testName: "Box with zero weight", + root: &Box{Direction: COLUMN, Children: []*Box{ + {Weight: 1, Window: "dynamic1"}, + {Weight: 0, Window: "dynamic2"}, + }}, + x0: 0, + y0: 0, + width: 10, + height: 10, + test: func(result map[string]Dimensions) { + assert.EqualValues( + t, + result, + map[string]Dimensions{ + "dynamic1": {X0: 0, X1: 9, Y0: 0, Y1: 9}, + "dynamic2": {X0: 10, X1: 9, Y0: 0, Y1: 9}, // when X0 > X1, we will hide the window + }, + ) + }, + }, } for _, s := range scenarios { @@ -209,3 +322,59 @@ func TestArrangeWindows(t *testing.T) { }) } } + +func TestNormalizeWeights(t *testing.T) { + scenarios := []struct { + testName string + input []int + expected []int + }{ + { + testName: "empty", + input: []int{}, + expected: []int{}, + }, + { + testName: "one item of value 1", + input: []int{1}, + expected: []int{1}, + }, + { + testName: "one item of value greater than 1", + input: []int{2}, + expected: []int{1}, + }, + { + testName: "slice contains 1", + input: []int{2, 1}, + expected: []int{2, 1}, + }, + { + testName: "slice contains 2 and 2", + input: []int{2, 2}, + expected: []int{1, 1}, + }, + { + testName: "no common multiple", + input: []int{2, 3}, + expected: []int{2, 3}, + }, + { + testName: "complex case", + input: []int{10, 10, 20}, + expected: []int{1, 1, 2}, + }, + { + testName: "when a zero weight is included it is ignored", + input: []int{10, 10, 20, 0}, + expected: []int{1, 1, 2, 0}, + }, + } + + for _, s := range scenarios { + s := s + t.Run(s.testName, func(t *testing.T) { + assert.EqualValues(t, s.expected, normalizeWeights(s.input)) + }) + } +} diff --git a/pkg/gui/branches_panel.go b/pkg/gui/branches_panel.go index 7e68fdb17..b9a25ea67 100644 --- a/pkg/gui/branches_panel.go +++ b/pkg/gui/branches_panel.go @@ -1,597 +1,23 @@ package gui -import ( - "errors" - "fmt" - "strings" - - "github.com/jesseduffield/lazygit/pkg/commands/git_commands" - "github.com/jesseduffield/lazygit/pkg/commands/models" - "github.com/jesseduffield/lazygit/pkg/utils" -) - -// list panel functions - -func (gui *Gui) getSelectedBranch() *models.Branch { - if len(gui.State.Branches) == 0 { - return nil - } - - selectedLine := gui.State.Panels.Branches.SelectedLineIdx - if selectedLine == -1 { - return nil - } - - return gui.State.Branches[selectedLine] -} +import "github.com/jesseduffield/lazygit/pkg/gui/types" func (gui *Gui) branchesRenderToMain() error { - var task updateTask - branch := gui.getSelectedBranch() + var task types.UpdateTask + branch := gui.State.Contexts.Branches.GetSelected() if branch == nil { - task = NewRenderStringTask(gui.Tr.NoBranchesThisRepo) + task = types.NewRenderStringTask(gui.c.Tr.NoBranchesThisRepo) } else { - cmdObj := gui.Git.Branch.GetGraphCmdObj(branch.Name) + cmdObj := gui.git.Branch.GetGraphCmdObj(branch.FullRefName()) - task = NewRunPtyTask(cmdObj.GetCmd()) + task = types.NewRunPtyTask(cmdObj.GetCmd()) } - return gui.refreshMainViews(refreshMainOpts{ - main: &viewUpdateOpts{ - title: "Log", - task: task, + return gui.c.RenderToMainViews(types.RefreshMainOpts{ + Pair: gui.c.MainViewPairs().Normal, + Main: &types.ViewUpdateOpts{ + Title: gui.c.Tr.LogTitle, + Task: task, }, }) } - -// gui.refreshStatus is called at the end of this because that's when we can -// be sure there is a state.Branches array to pick the current branch from -func (gui *Gui) refreshBranches() { - reflogCommits := gui.State.FilteredReflogCommits - if gui.State.Modes.Filtering.Active() { - // in filter mode we filter our reflog commits to just those containing the path - // however we need all the reflog entries to populate the recencies of our branches - // which allows us to order them correctly. So if we're filtering we'll just - // manually load all the reflog commits here - var err error - reflogCommits, _, err = gui.Git.Loaders.ReflogCommits.GetReflogCommits(nil, "") - if err != nil { - gui.Log.Error(err) - } - } - - branches, err := gui.Git.Loaders.Branches.Load(reflogCommits) - if err != nil { - _ = gui.surfaceError(err) - } - - gui.State.Branches = branches - - if err := gui.postRefreshUpdate(gui.State.Contexts.Branches); err != nil { - gui.Log.Error(err) - } - - gui.refreshStatus() -} - -func (gui *Gui) refreshGithubPullRequests() { - err := gui.Git.Gh.BaseRepo() - if err == nil { - _ = gui.setGithubPullRequests() - return - } - - // when config not exits - _ = gui.refreshRemotes() - _ = gui.prompt(promptOpts{ - title: gui.Tr.SelectRemoteRepository, - initialContent: "", - findSuggestionsFunc: gui.getRemoteRepoSuggestionsFunc(), - handleConfirm: func(repository string) error { - return gui.WithWaitingStatus(gui.Tr.LcSelectingRemote, func() error { - _, err := gui.Git.Gh.SetBaseRepo(repository) - if err != nil { - return err - } - - err = gui.setGithubPullRequests() - if err != nil { - return err - } - _ = gui.postRefreshUpdate(gui.State.Contexts.Branches) - return nil - }) - }, - }) -} - -func (gui *Gui) setGithubPullRequests() error { - prs, err := gui.Git.Gh.GithubMostRecentPRs() - - if err != nil { - return gui.surfaceError(err) - } - gui.State.GithubState.RecentPRs = prs - return nil -} - -// specific functions - -func (gui *Gui) handleBranchPress() error { - if gui.State.Panels.Branches.SelectedLineIdx == -1 { - return nil - } - if gui.State.Panels.Branches.SelectedLineIdx == 0 { - return gui.createErrorPanel(gui.Tr.AlreadyCheckedOutBranch) - } - branch := gui.getSelectedBranch() - gui.logAction(gui.Tr.Actions.CheckoutBranch) - return gui.handleCheckoutRef(branch.Name, handleCheckoutRefOptions{}) -} - -func (gui *Gui) handleCreateOrShowPullRequestPress() error { - branch := gui.getSelectedBranch() - pr, hasPr, err := gui.GetPr(branch) - if err != nil { - return err - } - - if hasPr { - return gui.OSCommand.OpenLink(pr.Url) - } - return gui.createPullRequest(branch.Name, "") -} - -func (gui *Gui) handleCreateOrOpenPullRequestMenu() error { - selectedBranch := gui.getSelectedBranch() - if selectedBranch == nil { - return nil - } - checkedOutBranch := gui.getCheckedOutBranch() - - return gui.createOrOpenPullRequestMenu(selectedBranch, checkedOutBranch) -} - -func (gui *Gui) handleCopyPullRequestURLPress() error { - hostingServiceMgr := gui.getHostingServiceMgr() - - branch := gui.getSelectedBranch() - - branchExistsOnRemote := gui.Git.Remote.CheckRemoteBranchExists(branch.Name) - - if !branchExistsOnRemote { - return gui.surfaceError(errors.New(gui.Tr.NoBranchOnRemote)) - } - - url, err := hostingServiceMgr.GetPullRequestURL(branch.Name, "") - if err != nil { - return gui.surfaceError(err) - } - gui.logAction(gui.Tr.Actions.CopyPullRequestURL) - if err := gui.OSCommand.CopyToClipboard(url); err != nil { - return gui.surfaceError(err) - } - - gui.raiseToast(gui.Tr.PullRequestURLCopiedToClipboard) - - return nil -} - -func (gui *Gui) handleGitFetch() error { - if err := gui.createLoaderPanel(gui.Tr.FetchWait); err != nil { - return err - } - - go utils.Safe(func() { - err := gui.fetch() - gui.handleCredentialsPopup(err) - _ = gui.refreshSidePanels(refreshOptions{mode: ASYNC}) - }) - return nil -} - -func (gui *Gui) handleForceCheckout() error { - branch := gui.getSelectedBranch() - message := gui.Tr.SureForceCheckout - title := gui.Tr.ForceCheckoutBranch - - return gui.ask(askOpts{ - title: title, - prompt: message, - handleConfirm: func() error { - gui.logAction(gui.Tr.Actions.ForceCheckoutBranch) - if err := gui.Git.Branch.Checkout(branch.Name, git_commands.CheckoutOptions{Force: true}); err != nil { - _ = gui.surfaceError(err) - } - return gui.refreshSidePanels(refreshOptions{mode: ASYNC}) - }, - }) -} - -type handleCheckoutRefOptions struct { - WaitingStatus string - EnvVars []string - onRefNotFound func(ref string) error -} - -func (gui *Gui) handleCheckoutRef(ref string, options handleCheckoutRefOptions) error { - waitingStatus := options.WaitingStatus - if waitingStatus == "" { - waitingStatus = gui.Tr.CheckingOutStatus - } - - cmdOptions := git_commands.CheckoutOptions{Force: false, EnvVars: options.EnvVars} - - onSuccess := func() { - gui.State.Panels.Branches.SelectedLineIdx = 0 - gui.State.Panels.Commits.SelectedLineIdx = 0 - // loading a heap of commits is slow so we limit them whenever doing a reset - gui.State.Panels.Commits.LimitCommits = true - } - - return gui.WithWaitingStatus(waitingStatus, func() error { - if err := gui.Git.Branch.Checkout(ref, cmdOptions); err != nil { - // note, this will only work for english-language git commands. If we force git to use english, and the error isn't this one, then the user will receive an english command they may not understand. I'm not sure what the best solution to this is. Running the command once in english and a second time in the native language is one option - - if options.onRefNotFound != nil && strings.Contains(err.Error(), "did not match any file(s) known to git") { - return options.onRefNotFound(ref) - } - - if strings.Contains(err.Error(), "Please commit your changes or stash them before you switch branch") { - // offer to autostash changes - return gui.ask(askOpts{ - - title: gui.Tr.AutoStashTitle, - prompt: gui.Tr.AutoStashPrompt, - handleConfirm: func() error { - if err := gui.Git.Stash.Save(gui.Tr.StashPrefix + ref); err != nil { - return gui.surfaceError(err) - } - if err := gui.Git.Branch.Checkout(ref, cmdOptions); err != nil { - return gui.surfaceError(err) - } - - onSuccess() - if err := gui.Git.Stash.Pop(0); err != nil { - if err := gui.refreshSidePanels(refreshOptions{mode: BLOCK_UI}); err != nil { - return err - } - return gui.surfaceError(err) - } - return gui.refreshSidePanels(refreshOptions{mode: BLOCK_UI}) - }, - }) - } - - if err := gui.surfaceError(err); err != nil { - return err - } - } - onSuccess() - - return gui.refreshSidePanels(refreshOptions{mode: BLOCK_UI}) - }) -} - -func (gui *Gui) handleCheckoutByName() error { - return gui.prompt(promptOpts{ - title: gui.Tr.BranchName + ":", - findSuggestionsFunc: gui.getRefsSuggestionsFunc(), - handleConfirm: func(response string) error { - gui.logAction("Checkout branch") - return gui.handleCheckoutRef(response, handleCheckoutRefOptions{ - onRefNotFound: func(ref string) error { - return gui.ask(askOpts{ - title: gui.Tr.BranchNotFoundTitle, - prompt: fmt.Sprintf("%s %s%s", gui.Tr.BranchNotFoundPrompt, ref, "?"), - handleConfirm: func() error { - return gui.createNewBranchWithName(ref) - }, - }) - }, - }) - }}, - ) -} - -func (gui *Gui) getCheckedOutBranch() *models.Branch { - if len(gui.State.Branches) == 0 { - return nil - } - - return gui.State.Branches[0] -} - -func (gui *Gui) createNewBranchWithName(newBranchName string) error { - branch := gui.getSelectedBranch() - if branch == nil { - return nil - } - - if err := gui.Git.Branch.New(newBranchName, branch.Name); err != nil { - return gui.surfaceError(err) - } - - gui.State.Panels.Branches.SelectedLineIdx = 0 - return gui.refreshSidePanels(refreshOptions{mode: ASYNC}) -} - -func (gui *Gui) handleDeleteBranch() error { - return gui.deleteBranch(false) -} - -func (gui *Gui) deleteBranch(force bool) error { - selectedBranch := gui.getSelectedBranch() - if selectedBranch == nil { - return nil - } - checkedOutBranch := gui.getCheckedOutBranch() - if checkedOutBranch.Name == selectedBranch.Name { - return gui.createErrorPanel(gui.Tr.CantDeleteCheckOutBranch) - } - return gui.deleteNamedBranch(selectedBranch, force) -} - -func (gui *Gui) deleteNamedBranch(selectedBranch *models.Branch, force bool) error { - title := gui.Tr.DeleteBranch - var templateStr string - if force { - templateStr = gui.Tr.ForceDeleteBranchMessage - } else { - templateStr = gui.Tr.DeleteBranchMessage - } - message := utils.ResolvePlaceholderString( - templateStr, - map[string]string{ - "selectedBranchName": selectedBranch.Name, - }, - ) - - return gui.ask(askOpts{ - title: title, - prompt: message, - handleConfirm: func() error { - gui.logAction(gui.Tr.Actions.DeleteBranch) - if err := gui.Git.Branch.Delete(selectedBranch.Name, force); err != nil { - errMessage := err.Error() - if !force && strings.Contains(errMessage, "git branch -D ") { - return gui.deleteNamedBranch(selectedBranch, true) - } - return gui.createErrorPanel(errMessage) - } - return gui.refreshSidePanels(refreshOptions{mode: ASYNC, scope: []RefreshableView{BRANCHES}}) - }, - }) -} - -func (gui *Gui) mergeBranchIntoCheckedOutBranch(branchName string) error { - if ok, err := gui.validateNotInFilterMode(); err != nil || !ok { - return err - } - - if gui.Git.Branch.IsHeadDetached() { - return gui.createErrorPanel("Cannot merge branch in detached head state. You might have checked out a commit directly or a remote branch, in which case you should checkout the local branch you want to be on") - } - checkedOutBranchName := gui.getCheckedOutBranch().Name - if checkedOutBranchName == branchName { - return gui.createErrorPanel(gui.Tr.CantMergeBranchIntoItself) - } - prompt := utils.ResolvePlaceholderString( - gui.Tr.ConfirmMerge, - map[string]string{ - "checkedOutBranch": checkedOutBranchName, - "selectedBranch": branchName, - }, - ) - - return gui.ask(askOpts{ - title: gui.Tr.MergingTitle, - prompt: prompt, - handleConfirm: func() error { - gui.logAction(gui.Tr.Actions.Merge) - err := gui.Git.Branch.Merge(branchName, git_commands.MergeOpts{}) - return gui.handleGenericMergeCommandResult(err) - }, - }) -} - -func (gui *Gui) handleMerge() error { - if ok, err := gui.validateNotInFilterMode(); err != nil || !ok { - return err - } - - selectedBranchName := gui.getSelectedBranch().Name - return gui.mergeBranchIntoCheckedOutBranch(selectedBranchName) -} - -func (gui *Gui) handleRebaseOntoLocalBranch() error { - selectedBranchName := gui.getSelectedBranch().Name - return gui.handleRebaseOntoBranch(selectedBranchName) -} - -func (gui *Gui) handleRebaseOntoBranch(selectedBranchName string) error { - if ok, err := gui.validateNotInFilterMode(); err != nil || !ok { - return err - } - - checkedOutBranch := gui.getCheckedOutBranch().Name - if selectedBranchName == checkedOutBranch { - return gui.createErrorPanel(gui.Tr.CantRebaseOntoSelf) - } - prompt := utils.ResolvePlaceholderString( - gui.Tr.ConfirmRebase, - map[string]string{ - "checkedOutBranch": checkedOutBranch, - "selectedBranch": selectedBranchName, - }, - ) - - return gui.ask(askOpts{ - title: gui.Tr.RebasingTitle, - prompt: prompt, - handleConfirm: func() error { - gui.logAction(gui.Tr.Actions.RebaseBranch) - err := gui.Git.Rebase.RebaseBranch(selectedBranchName) - return gui.handleGenericMergeCommandResult(err) - }, - }) -} - -func (gui *Gui) handleFastForward() error { - branch := gui.getSelectedBranch() - if branch == nil || !branch.IsRealBranch() { - return nil - } - - if !branch.IsTrackingRemote() { - return gui.createErrorPanel(gui.Tr.FwdNoUpstream) - } - if !branch.RemoteBranchStoredLocally() { - return gui.createErrorPanel(gui.Tr.FwdNoLocalUpstream) - } - if branch.HasCommitsToPush() { - return gui.createErrorPanel(gui.Tr.FwdCommitsToPush) - } - - action := gui.Tr.Actions.FastForwardBranch - - message := utils.ResolvePlaceholderString( - gui.Tr.Fetching, - map[string]string{ - "from": fmt.Sprintf("%s/%s", branch.UpstreamRemote, branch.UpstreamBranch), - "to": branch.Name, - }, - ) - go utils.Safe(func() { - _ = gui.createLoaderPanel(message) - - if gui.State.Panels.Branches.SelectedLineIdx == 0 { - _ = gui.pullWithLock(PullFilesOptions{action: action, FastForwardOnly: true}) - } else { - gui.logAction(action) - err := gui.Git.Sync.FastForward(branch.Name, branch.UpstreamRemote, branch.UpstreamBranch) - gui.handleCredentialsPopup(err) - _ = gui.refreshSidePanels(refreshOptions{mode: ASYNC, scope: []RefreshableView{BRANCHES}}) - } - }) - return nil -} - -func (gui *Gui) handleCreateResetToBranchMenu() error { - branch := gui.getSelectedBranch() - if branch == nil { - return nil - } - - return gui.createResetMenu(branch.Name) -} - -func (gui *Gui) handleRenameBranch() error { - branch := gui.getSelectedBranch() - if branch == nil || !branch.IsRealBranch() { - return nil - } - - promptForNewName := func() error { - return gui.prompt(promptOpts{ - title: gui.Tr.NewBranchNamePrompt + " " + branch.Name + ":", - initialContent: branch.Name, - handleConfirm: func(newBranchName string) error { - gui.logAction(gui.Tr.Actions.RenameBranch) - if err := gui.Git.Branch.Rename(branch.Name, newBranchName); err != nil { - return gui.surfaceError(err) - } - - // need to find where the branch is now so that we can re-select it. That means we need to refetch the branches synchronously and then find our branch - gui.refreshBranches() - - // now that we've got our stuff again we need to find that branch and reselect it. - for i, newBranch := range gui.State.Branches { - if newBranch.Name == newBranchName { - gui.State.Panels.Branches.SetSelectedLineIdx(i) - if err := gui.State.Contexts.Branches.HandleRender(); err != nil { - return err - } - } - } - - return nil - }, - }) - } - - // I could do an explicit check here for whether the branch is tracking a remote branch - // but if we've selected it we'll already know that via Pullables and Pullables. - // Bit of a hack but I'm lazy. - if !branch.IsTrackingRemote() { - return promptForNewName() - } - - return gui.ask(askOpts{ - title: gui.Tr.LcRenameBranch, - prompt: gui.Tr.RenameBranchWarning, - handleConfirm: promptForNewName, - }) -} - -func (gui *Gui) currentBranch() *models.Branch { - if len(gui.State.Branches) == 0 { - return nil - } - return gui.State.Branches[0] -} - -func (gui *Gui) handleNewBranchOffCurrentItem() error { - context := gui.currentSideListContext() - - item, ok := context.GetSelectedItem() - if !ok { - return nil - } - - message := utils.ResolvePlaceholderString( - gui.Tr.NewBranchNameBranchOff, - map[string]string{ - "branchName": item.Description(), - }, - ) - - prefilledName := "" - if context.GetKey() == REMOTE_BRANCHES_CONTEXT_KEY { - // will set to the remote's branch name without the remote name - prefilledName = strings.SplitAfterN(item.ID(), "/", 2)[1] - } - - return gui.prompt(promptOpts{ - title: message, - initialContent: prefilledName, - handleConfirm: func(response string) error { - gui.logAction(gui.Tr.Actions.CreateBranch) - if err := gui.Git.Branch.New(sanitizedBranchName(response), item.ID()); err != nil { - return err - } - - // if we're currently in the branch commits context then the selected commit - // is about to go to the top of the list - if context.GetKey() == BRANCH_COMMITS_CONTEXT_KEY { - context.GetPanelState().SetSelectedLineIdx(0) - } - - if context.GetKey() != gui.State.Contexts.Branches.GetKey() { - if err := gui.pushContext(gui.State.Contexts.Branches); err != nil { - return err - } - } - - gui.State.Panels.Branches.SelectedLineIdx = 0 - - return gui.refreshSidePanels(refreshOptions{mode: ASYNC}) - }, - }) -} - -// sanitizedBranchName will remove all spaces in favor of a dash "-" to meet -// git's branch naming requirement. -func sanitizedBranchName(input string) string { - return strings.Replace(input, " ", "-", -1) -} diff --git a/pkg/gui/cherry_picking.go b/pkg/gui/cherry_picking.go deleted file mode 100644 index b4b9439cd..000000000 --- a/pkg/gui/cherry_picking.go +++ /dev/null @@ -1,195 +0,0 @@ -package gui - -import "github.com/jesseduffield/lazygit/pkg/commands/models" - -// you can only copy from one context at a time, because the order and position of commits matter - -func (gui *Gui) resetCherryPickingIfNecessary(context Context) error { - oldContextKey := ContextKey(gui.State.Modes.CherryPicking.ContextKey) - - if oldContextKey != context.GetKey() { - // need to reset the cherry picking mode - gui.State.Modes.CherryPicking.ContextKey = string(context.GetKey()) - gui.State.Modes.CherryPicking.CherryPickedCommits = make([]*models.Commit, 0) - - return gui.rerenderContextViewIfPresent(oldContextKey) - } - - return nil -} - -func (gui *Gui) handleCopyCommit() error { - if ok, err := gui.validateNotInFilterMode(); err != nil || !ok { - return err - } - - // get currently selected commit, add the sha to state. - context := gui.currentSideListContext() - if context == nil { - return nil - } - - if err := gui.resetCherryPickingIfNecessary(context); err != nil { - return err - } - - item, ok := context.GetSelectedItem() - if !ok { - return nil - } - commit, ok := item.(*models.Commit) - if !ok { - return nil - } - - // we will un-copy it if it's already copied - for index, cherryPickedCommit := range gui.State.Modes.CherryPicking.CherryPickedCommits { - if commit.Sha == cherryPickedCommit.Sha { - gui.State.Modes.CherryPicking.CherryPickedCommits = append(gui.State.Modes.CherryPicking.CherryPickedCommits[0:index], gui.State.Modes.CherryPicking.CherryPickedCommits[index+1:]...) - return context.HandleRender() - } - } - - gui.addCommitToCherryPickedCommits(context.GetPanelState().GetSelectedLineIdx()) - return context.HandleRender() -} - -func (gui *Gui) cherryPickedCommitShaMap() map[string]bool { - commitShaMap := map[string]bool{} - for _, commit := range gui.State.Modes.CherryPicking.CherryPickedCommits { - commitShaMap[commit.Sha] = true - } - return commitShaMap -} - -func (gui *Gui) commitsListForContext() []*models.Commit { - context := gui.currentSideListContext() - if context == nil { - return nil - } - - // using a switch statement, but we should use polymorphism - switch context.GetKey() { - case BRANCH_COMMITS_CONTEXT_KEY: - return gui.State.Commits - case REFLOG_COMMITS_CONTEXT_KEY: - return gui.State.FilteredReflogCommits - case SUB_COMMITS_CONTEXT_KEY: - return gui.State.SubCommits - default: - gui.Log.Errorf("no commit list for context %s", context.GetKey()) - return nil - } -} - -func (gui *Gui) addCommitToCherryPickedCommits(index int) { - commitShaMap := gui.cherryPickedCommitShaMap() - commitsList := gui.commitsListForContext() - commitShaMap[commitsList[index].Sha] = true - - newCommits := []*models.Commit{} - for _, commit := range commitsList { - if commitShaMap[commit.Sha] { - // duplicating just the things we need to put in the rebase TODO list - newCommits = append(newCommits, &models.Commit{Name: commit.Name, Sha: commit.Sha}) - } - } - - gui.State.Modes.CherryPicking.CherryPickedCommits = newCommits -} - -func (gui *Gui) handleCopyCommitRange() error { - if ok, err := gui.validateNotInFilterMode(); err != nil || !ok { - return err - } - - // get currently selected commit, add the sha to state. - context := gui.currentSideListContext() - if context == nil { - return nil - } - - if err := gui.resetCherryPickingIfNecessary(context); err != nil { - return err - } - - commitShaMap := gui.cherryPickedCommitShaMap() - commitsList := gui.commitsListForContext() - selectedLineIdx := context.GetPanelState().GetSelectedLineIdx() - - if selectedLineIdx > len(commitsList)-1 { - return nil - } - - // find the last commit that is copied that's above our position - // if there are none, startIndex = 0 - startIndex := 0 - for index, commit := range commitsList[0:selectedLineIdx] { - if commitShaMap[commit.Sha] { - startIndex = index - } - } - - for index := startIndex; index <= selectedLineIdx; index++ { - gui.addCommitToCherryPickedCommits(index) - } - - return context.HandleRender() -} - -// HandlePasteCommits begins a cherry-pick rebase with the commits the user has copied -func (gui *Gui) HandlePasteCommits() error { - if ok, err := gui.validateNotInFilterMode(); err != nil || !ok { - return err - } - - return gui.ask(askOpts{ - title: gui.Tr.CherryPick, - prompt: gui.Tr.SureCherryPick, - handleConfirm: func() error { - return gui.WithWaitingStatus(gui.Tr.CherryPickingStatus, func() error { - gui.logAction(gui.Tr.Actions.CherryPick) - err := gui.Git.Rebase.CherryPickCommits(gui.State.Modes.CherryPicking.CherryPickedCommits) - return gui.handleGenericMergeCommandResult(err) - }) - }, - }) -} - -func (gui *Gui) exitCherryPickingMode() error { - contextKey := ContextKey(gui.State.Modes.CherryPicking.ContextKey) - - gui.State.Modes.CherryPicking.ContextKey = "" - gui.State.Modes.CherryPicking.CherryPickedCommits = nil - - if contextKey == "" { - gui.Log.Warn("context key blank when trying to exit cherry picking mode") - return nil - } - - return gui.rerenderContextViewIfPresent(contextKey) -} - -func (gui *Gui) rerenderContextViewIfPresent(contextKey ContextKey) error { - if contextKey == "" { - return nil - } - - context := gui.mustContextForContextKey(contextKey) - - viewName := context.GetViewName() - - view, err := gui.g.View(viewName) - if err != nil { - gui.Log.Error(err) - return nil - } - - if ContextKey(view.Context) == contextKey { - if err := context.HandleRender(); err != nil { - return err - } - } - - return nil -} diff --git a/pkg/gui/command_log_panel.go b/pkg/gui/command_log_panel.go index aa46a4d18..dbee7febb 100644 --- a/pkg/gui/command_log_panel.go +++ b/pkg/gui/command_log_panel.go @@ -7,22 +7,23 @@ import ( "time" "github.com/jesseduffield/lazygit/pkg/constants" + "github.com/jesseduffield/lazygit/pkg/gui/keybindings" "github.com/jesseduffield/lazygit/pkg/gui/style" "github.com/jesseduffield/lazygit/pkg/theme" ) // our UI command log looks like this: -// Stage File -// git add -- 'filename' -// Unstage File -// git reset HEAD 'filename' +// Stage File: +// git add -- 'filename' +// Unstage File: +// git reset HEAD 'filename' // // The 'Stage File' and 'Unstage File' lines are actions i.e they group up a set // of command logs (typically there's only one command under an action but there may be more). // So we call logAction to log the 'Stage File' part and then we call logCommand to log the command itself. // We pass logCommand to our OSCommand struct so that it can handle logging commands // for us. -func (gui *Gui) logAction(action string) { +func (gui *Gui) LogAction(action string) { if gui.Views.Extras == nil { return } @@ -32,7 +33,7 @@ func (gui *Gui) logAction(action string) { fmt.Fprint(gui.Views.Extras, "\n"+style.FgYellow.Sprint(action)) } -func (gui *Gui) logCommand(cmdStr string, commandLine bool) { +func (gui *Gui) LogCommand(cmdStr string, commandLine bool) { if gui.Views.Extras == nil { return } @@ -52,26 +53,26 @@ func (gui *Gui) logCommand(cmdStr string, commandLine bool) { func (gui *Gui) printCommandLogHeader() { introStr := fmt.Sprintf( - gui.Tr.CommandLogHeader, - gui.getKeyDisplay(gui.UserConfig.Keybinding.Universal.ExtrasMenu), + gui.c.Tr.CommandLogHeader, + keybindings.Label(gui.c.UserConfig.Keybinding.Universal.ExtrasMenu), ) fmt.Fprintln(gui.Views.Extras, style.FgCyan.Sprint(introStr)) - if gui.UserConfig.Gui.ShowRandomTip { + if gui.c.UserConfig.Gui.ShowRandomTip { fmt.Fprintf( gui.Views.Extras, "%s: %s", - style.FgYellow.Sprint(gui.Tr.RandomTip), + style.FgYellow.Sprint(gui.c.Tr.RandomTip), style.FgGreen.Sprint(gui.getRandomTip()), ) } } func (gui *Gui) getRandomTip() string { - config := gui.UserConfig.Keybinding + config := gui.c.UserConfig.Keybinding formattedKey := func(key string) string { - return gui.getKeyDisplay(key) + return keybindings.Label(key) } tips := []string{ diff --git a/pkg/gui/commit_files_panel.go b/pkg/gui/commit_files_panel.go index 61f3b72b8..0849ab310 100644 --- a/pkg/gui/commit_files_panel.go +++ b/pkg/gui/commit_files_panel.go @@ -1,298 +1,51 @@ package gui import ( - "github.com/jesseduffield/lazygit/pkg/commands/models" - "github.com/jesseduffield/lazygit/pkg/commands/patch" - "github.com/jesseduffield/lazygit/pkg/gui/filetree" + "github.com/jesseduffield/lazygit/pkg/gui/controllers" + "github.com/jesseduffield/lazygit/pkg/gui/types" ) -func (gui *Gui) getSelectedCommitFileNode() *filetree.CommitFileNode { - selectedLine := gui.State.Panels.CommitFiles.SelectedLineIdx - if selectedLine == -1 || selectedLine > gui.State.CommitFileTreeViewModel.GetItemsLength()-1 { - return nil - } - - return gui.State.CommitFileTreeViewModel.GetItemAtIndex(selectedLine) -} - -func (gui *Gui) getSelectedCommitFile() *models.CommitFile { - node := gui.getSelectedCommitFileNode() - if node == nil { - return nil - } - return node.File -} - -func (gui *Gui) getSelectedCommitFilePath() string { - node := gui.getSelectedCommitFileNode() - if node == nil { - return "" - } - return node.GetPath() -} - -func (gui *Gui) onCommitFileFocus() error { - gui.escapeLineByLinePanel() - return nil -} - func (gui *Gui) commitFilesRenderToMain() error { - node := gui.getSelectedCommitFileNode() + node := gui.State.Contexts.CommitFiles.GetSelected() if node == nil { return nil } - to := gui.State.CommitFileTreeViewModel.GetParent() - from, reverse := gui.getFromAndReverseArgsForDiff(to) + ref := gui.State.Contexts.CommitFiles.GetRef() + to := ref.RefName() + from, reverse := gui.State.Modes.Diffing.GetFromAndReverseArgsForDiff(ref.ParentRefName()) - cmdObj := gui.Git.WorkingTree.ShowFileDiffCmdObj(from, to, reverse, node.GetPath(), false) - task := NewRunPtyTask(cmdObj.GetCmd()) + cmdObj := gui.git.WorkingTree.ShowFileDiffCmdObj(from, to, reverse, node.GetPath(), false) + task := types.NewRunPtyTask(cmdObj.GetCmd()) - return gui.refreshMainViews(refreshMainOpts{ - main: &viewUpdateOpts{ - title: "Patch", - task: task, + pair := gui.c.MainViewPairs().Normal + if node.File != nil { + pair = gui.c.MainViewPairs().PatchBuilding + } + + return gui.c.RenderToMainViews(types.RefreshMainOpts{ + Pair: pair, + Main: &types.ViewUpdateOpts{ + Title: gui.Tr.Patch, + Task: task, }, - secondary: gui.secondaryPatchPanelUpdateOpts(), + Secondary: gui.secondaryPatchPanelUpdateOpts(), }) } -func (gui *Gui) handleCheckoutCommitFile() error { - node := gui.getSelectedCommitFileNode() - if node == nil { - return nil - } +func (gui *Gui) SwitchToCommitFilesContext(opts controllers.SwitchToCommitFilesContextOpts) error { + gui.State.Contexts.CommitFiles.SetSelectedLineIdx(0) + gui.State.Contexts.CommitFiles.SetRef(opts.Ref) + gui.State.Contexts.CommitFiles.SetTitleRef(opts.Ref.Description()) + gui.State.Contexts.CommitFiles.SetCanRebase(opts.CanRebase) + gui.State.Contexts.CommitFiles.SetParentContext(opts.Context) + gui.State.Contexts.CommitFiles.SetWindowName(opts.Context.GetWindowName()) - gui.logAction(gui.Tr.Actions.CheckoutFile) - if err := gui.Git.WorkingTree.CheckoutFile(gui.State.CommitFileTreeViewModel.GetParent(), node.GetPath()); err != nil { - return gui.surfaceError(err) - } - - return gui.refreshSidePanels(refreshOptions{mode: ASYNC}) -} - -func (gui *Gui) handleDiscardOldFileChange() error { - if ok, err := gui.validateNormalWorkingTreeState(); !ok { + if err := gui.c.Refresh(types.RefreshOptions{ + Scope: []types.RefreshableView{types.COMMIT_FILES}, + }); err != nil { return err } - fileName := gui.getSelectedCommitFileName() - - return gui.ask(askOpts{ - title: gui.Tr.DiscardFileChangesTitle, - prompt: gui.Tr.DiscardFileChangesPrompt, - handleConfirm: func() error { - return gui.WithWaitingStatus(gui.Tr.RebasingStatus, func() error { - gui.logAction(gui.Tr.Actions.DiscardOldFileChange) - if err := gui.Git.Rebase.DiscardOldFileChanges(gui.State.Commits, gui.State.Panels.Commits.SelectedLineIdx, fileName); err != nil { - if err := gui.handleGenericMergeCommandResult(err); err != nil { - return err - } - } - - return gui.refreshSidePanels(refreshOptions{mode: BLOCK_UI}) - }) - }, - }) -} - -func (gui *Gui) refreshCommitFilesView() error { - currentSideContext := gui.currentSideContext() - if currentSideContext.GetKey() == COMMIT_FILES_CONTEXT_KEY || currentSideContext.GetKey() == BRANCH_COMMITS_CONTEXT_KEY { - if err := gui.handleRefreshPatchBuildingPanel(-1); err != nil { - return err - } - } - - to := gui.State.Panels.CommitFiles.refName - from, reverse := gui.getFromAndReverseArgsForDiff(to) - - files, err := gui.Git.Loaders.CommitFiles.GetFilesInDiff(from, to, reverse) - if err != nil { - return gui.surfaceError(err) - } - gui.State.CommitFileTreeViewModel.SetParent(to) - gui.State.CommitFileTreeViewModel.SetFiles(files) - - return gui.postRefreshUpdate(gui.State.Contexts.CommitFiles) -} - -func (gui *Gui) handleOpenOldCommitFile() error { - node := gui.getSelectedCommitFileNode() - if node == nil { - return nil - } - - return gui.openFile(node.GetPath()) -} - -func (gui *Gui) handleEditCommitFile() error { - node := gui.getSelectedCommitFileNode() - if node == nil { - return nil - } - - if node.File == nil { - return gui.createErrorPanel(gui.Tr.ErrCannotEditDirectory) - } - - return gui.editFile(node.GetPath()) -} - -func (gui *Gui) handleToggleFileForPatch() error { - node := gui.getSelectedCommitFileNode() - if node == nil { - return nil - } - - toggleTheFile := func() error { - if !gui.Git.Patch.PatchManager.Active() { - if err := gui.startPatchManager(); err != nil { - return err - } - } - - // if there is any file that hasn't been fully added we'll fully add everything, - // otherwise we'll remove everything - adding := node.AnyFile(func(file *models.CommitFile) bool { - return gui.Git.Patch.PatchManager.GetFileStatus(file.Name, gui.State.CommitFileTreeViewModel.GetParent()) != patch.WHOLE - }) - - err := node.ForEachFile(func(file *models.CommitFile) error { - if adding { - return gui.Git.Patch.PatchManager.AddFileWhole(file.Name) - } else { - return gui.Git.Patch.PatchManager.RemoveFile(file.Name) - } - }) - - if err != nil { - return gui.surfaceError(err) - } - - if gui.Git.Patch.PatchManager.IsEmpty() { - gui.Git.Patch.PatchManager.Reset() - } - - return gui.postRefreshUpdate(gui.State.Contexts.CommitFiles) - } - - if gui.Git.Patch.PatchManager.Active() && gui.Git.Patch.PatchManager.To != gui.State.CommitFileTreeViewModel.GetParent() { - return gui.ask(askOpts{ - title: gui.Tr.DiscardPatch, - prompt: gui.Tr.DiscardPatchConfirm, - handleConfirm: func() error { - gui.Git.Patch.PatchManager.Reset() - return toggleTheFile() - }, - }) - } - - return toggleTheFile() -} - -func (gui *Gui) startPatchManager() error { - canRebase := gui.State.Panels.CommitFiles.canRebase - - to := gui.State.Panels.CommitFiles.refName - from, reverse := gui.getFromAndReverseArgsForDiff(to) - - gui.Git.Patch.PatchManager.Start(from, to, reverse, canRebase) - return nil -} - -func (gui *Gui) handleEnterCommitFile() error { - return gui.enterCommitFile(OnFocusOpts{ClickedViewName: "", ClickedViewLineIdx: -1}) -} - -func (gui *Gui) enterCommitFile(opts OnFocusOpts) error { - node := gui.getSelectedCommitFileNode() - if node == nil { - return nil - } - - if node.File == nil { - return gui.handleToggleCommitFileDirCollapsed() - } - - enterTheFile := func() error { - if !gui.Git.Patch.PatchManager.Active() { - if err := gui.startPatchManager(); err != nil { - return err - } - } - - return gui.pushContext(gui.State.Contexts.PatchBuilding, opts) - } - - if gui.Git.Patch.PatchManager.Active() && gui.Git.Patch.PatchManager.To != gui.State.CommitFileTreeViewModel.GetParent() { - return gui.ask(askOpts{ - title: gui.Tr.DiscardPatch, - prompt: gui.Tr.DiscardPatchConfirm, - handleConfirm: func() error { - gui.Git.Patch.PatchManager.Reset() - return enterTheFile() - }, - }) - } - - return enterTheFile() -} - -func (gui *Gui) handleToggleCommitFileDirCollapsed() error { - node := gui.getSelectedCommitFileNode() - if node == nil { - return nil - } - - gui.State.CommitFileTreeViewModel.ToggleCollapsed(node.GetPath()) - - if err := gui.postRefreshUpdate(gui.State.Contexts.CommitFiles); err != nil { - gui.Log.Error(err) - } - - return nil -} - -func (gui *Gui) switchToCommitFilesContext(refName string, canRebase bool, context Context, windowName string) error { - // sometimes the commitFiles view is already shown in another window, so we need to ensure that window - // no longer considers the commitFiles view as its main view. - gui.resetWindowForView(gui.Views.CommitFiles) - - gui.State.Panels.CommitFiles.SelectedLineIdx = 0 - gui.State.Panels.CommitFiles.refName = refName - gui.State.Panels.CommitFiles.canRebase = canRebase - gui.State.Contexts.CommitFiles.SetParentContext(context) - gui.State.Contexts.CommitFiles.SetWindowName(windowName) - - if err := gui.refreshCommitFilesView(); err != nil { - return err - } - - return gui.pushContext(gui.State.Contexts.CommitFiles) -} - -// NOTE: this is very similar to handleToggleFileTreeView, could be DRY'd with generics -func (gui *Gui) handleToggleCommitFileTreeView() error { - path := gui.getSelectedCommitFilePath() - - gui.State.CommitFileTreeViewModel.ToggleShowTree() - - // find that same node in the new format and move the cursor to it - if path != "" { - gui.State.CommitFileTreeViewModel.ExpandToPath(path) - index, found := gui.State.CommitFileTreeViewModel.GetIndexForPath(path) - if found { - gui.State.Contexts.CommitFiles.GetPanelState().SetSelectedLineIdx(index) - } - } - - if err := gui.State.Contexts.CommitFiles.HandleRender(); err != nil { - return err - } - if err := gui.State.Contexts.CommitFiles.HandleFocus(); err != nil { - return err - } - - return nil + return gui.c.PushContext(gui.State.Contexts.CommitFiles) } diff --git a/pkg/gui/commit_message_panel.go b/pkg/gui/commit_message_panel.go index 5f5a8741f..4c8ddae2b 100644 --- a/pkg/gui/commit_message_panel.go +++ b/pkg/gui/commit_message_panel.go @@ -5,53 +5,33 @@ import ( "strings" "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/gui/keybindings" "github.com/jesseduffield/lazygit/pkg/utils" ) -func (gui *Gui) handleCommitConfirm() error { - message := strings.TrimSpace(gui.Views.CommitMessage.TextArea.GetContent()) - gui.State.failedCommitMessage = message - if message == "" { - return gui.createErrorPanel(gui.Tr.CommitWithoutMessageErr) - } - - cmdObj := gui.Git.Commit.CommitCmdObj(message) - gui.logAction(gui.Tr.Actions.Commit) - - _ = gui.returnFromContext() - return gui.withGpgHandling(cmdObj, gui.Tr.CommittingStatus, func() error { - gui.Views.CommitMessage.ClearTextArea() - gui.State.failedCommitMessage = "" - return nil - }) -} - -func (gui *Gui) handleCommitClose() error { - return gui.returnFromContext() -} - func (gui *Gui) handleCommitMessageFocused() error { message := utils.ResolvePlaceholderString( - gui.Tr.CommitMessageConfirm, + gui.c.Tr.CommitMessageConfirm, map[string]string{ - "keyBindClose": gui.getKeyDisplay(gui.UserConfig.Keybinding.Universal.Return), - "keyBindConfirm": gui.getKeyDisplay(gui.UserConfig.Keybinding.Universal.Confirm), - "keyBindNewLine": gui.getKeyDisplay(gui.UserConfig.Keybinding.Universal.AppendNewline), + "keyBindClose": keybindings.Label(gui.c.UserConfig.Keybinding.Universal.Return), + "keyBindConfirm": keybindings.Label(gui.c.UserConfig.Keybinding.Universal.Confirm), + "keyBindNewLine": keybindings.Label(gui.c.UserConfig.Keybinding.Universal.AppendNewline), }, ) + gui.RenderCommitLength() + return gui.renderString(gui.Views.Options, message) } -func (gui *Gui) getBufferLength(view *gocui.View) string { - return " " + strconv.Itoa(strings.Count(view.TextArea.GetContent(), "")-1) + " " -} - -// RenderCommitLength is a function. func (gui *Gui) RenderCommitLength() { - if !gui.UserConfig.Gui.CommitLength.Show { + if !gui.c.UserConfig.Gui.CommitLength.Show { return } - gui.Views.CommitMessage.Subtitle = gui.getBufferLength(gui.Views.CommitMessage) + gui.Views.CommitMessage.Subtitle = getBufferLength(gui.Views.CommitMessage) +} + +func getBufferLength(view *gocui.View) string { + return " " + strconv.Itoa(strings.Count(view.TextArea.GetContent(), "")-1) + " " } diff --git a/pkg/gui/commits_panel.go b/pkg/gui/commits_panel.go index 40848f97e..19434b9fb 100644 --- a/pkg/gui/commits_panel.go +++ b/pkg/gui/commits_panel.go @@ -1,11 +1,8 @@ package gui import ( - "fmt" - "sync" - - "github.com/jesseduffield/lazygit/pkg/commands/loaders" "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/types" "github.com/jesseduffield/lazygit/pkg/utils" ) @@ -15,840 +12,68 @@ const COMMIT_THRESHOLD = 200 // list panel functions func (gui *Gui) getSelectedLocalCommit() *models.Commit { - selectedLine := gui.State.Panels.Commits.SelectedLineIdx - if selectedLine == -1 || selectedLine > len(gui.State.Commits)-1 { - return nil - } - - return gui.State.Commits[selectedLine] + return gui.State.Contexts.LocalCommits.GetSelected() } func (gui *Gui) onCommitFocus() error { - state := gui.State.Panels.Commits - if state.SelectedLineIdx > COMMIT_THRESHOLD && state.LimitCommits { - state.LimitCommits = false + context := gui.State.Contexts.LocalCommits + if context.GetSelectedLineIdx() > COMMIT_THRESHOLD && context.GetLimitCommits() { + context.SetLimitCommits(false) go utils.Safe(func() { if err := gui.refreshCommitsWithLimit(); err != nil { - _ = gui.surfaceError(err) + _ = gui.c.Error(err) } }) } - gui.escapeLineByLinePanel() - return nil } func (gui *Gui) branchCommitsRenderToMain() error { - var task updateTask - commit := gui.getSelectedLocalCommit() + var task types.UpdateTask + commit := gui.State.Contexts.LocalCommits.GetSelected() if commit == nil { - task = NewRenderStringTask(gui.Tr.NoCommitsThisBranch) + task = types.NewRenderStringTask(gui.c.Tr.NoCommitsThisBranch) } else { - cmdObj := gui.Git.Commit.ShowCmdObj(commit.Sha, gui.State.Modes.Filtering.GetPath()) - task = NewRunPtyTask(cmdObj.GetCmd()) + cmdObj := gui.git.Commit.ShowCmdObj(commit.Sha, gui.State.Modes.Filtering.GetPath()) + task = types.NewRunPtyTask(cmdObj.GetCmd()) } - return gui.refreshMainViews(refreshMainOpts{ - main: &viewUpdateOpts{ - title: "Patch", - task: task, + return gui.c.RenderToMainViews(types.RefreshMainOpts{ + Pair: gui.c.MainViewPairs().Normal, + Main: &types.ViewUpdateOpts{ + Title: "Patch", + Task: task, }, - secondary: gui.secondaryPatchPanelUpdateOpts(), + Secondary: gui.secondaryPatchPanelUpdateOpts(), }) } -// during startup, the bottleneck is fetching the reflog entries. We need these -// on startup to sort the branches by recency. So we have two phases: INITIAL, and COMPLETE. -// In the initial phase we don't get any reflog commits, but we asynchronously get them -// and refresh the branches after that -func (gui *Gui) refreshReflogCommitsConsideringStartup() { - switch gui.State.StartupStage { - case INITIAL: - var wg sync.WaitGroup - wg.Add(1) +func (gui *Gui) secondaryPatchPanelUpdateOpts() *types.ViewUpdateOpts { + if gui.git.Patch.PatchManager.Active() { + patch := gui.git.Patch.PatchManager.RenderAggregatedPatchColored(false) - go utils.Safe(func() { - _ = gui.refreshReflogCommits() - gui.refreshBranches() - gui.State.StartupStage = COMPLETE - wg.Done() - }) - go utils.Safe(func() { - // The github cli can be quite slow so we load the github PRs sparately - if gui.Config.GetUserConfig().Git.EnableGhCommand { - gui.refreshGithubPullRequests() - } - - wg.Wait() - _ = gui.postRefreshUpdate(gui.State.Contexts.Branches) - }) - case COMPLETE: - _ = gui.refreshReflogCommits() - } -} - -// whenever we change commits, we should update branches because the upstream/downstream -// counts can change. Whenever we change branches we should probably also change commits -// e.g. in the case of switching branches. -func (gui *Gui) refreshCommits() { - wg := sync.WaitGroup{} - wg.Add(2) - - go utils.Safe(func() { - gui.refreshReflogCommitsConsideringStartup() - - gui.refreshBranches() - wg.Done() - }) - - go utils.Safe(func() { - _ = gui.refreshCommitsWithLimit() - context, ok := gui.State.Contexts.CommitFiles.GetParentContext() - if ok && context.GetKey() == BRANCH_COMMITS_CONTEXT_KEY { - // This makes sense when we've e.g. just amended a commit, meaning we get a new commit SHA at the same position. - // However if we've just added a brand new commit, it pushes the list down by one and so we would end up - // showing the contents of a different commit than the one we initially entered. - // Ideally we would know when to refresh the commit files context and when not to, - // or perhaps we could just pop that context off the stack whenever cycling windows. - // For now the awkwardness remains. - commit := gui.getSelectedLocalCommit() - if commit != nil { - gui.State.Panels.CommitFiles.refName = commit.RefName() - _ = gui.refreshCommitFilesView() - } + return &types.ViewUpdateOpts{ + Task: types.NewRenderStringWithoutScrollTask(patch), + Title: gui.Tr.CustomPatch, } - wg.Done() - }) - - wg.Wait() -} - -func (gui *Gui) refreshCommitsWithLimit() error { - gui.Mutexes.BranchCommitsMutex.Lock() - defer gui.Mutexes.BranchCommitsMutex.Unlock() - - commits, err := gui.Git.Loaders.Commits.GetCommits( - loaders.GetCommitsOptions{ - Limit: gui.State.Panels.Commits.LimitCommits, - FilterPath: gui.State.Modes.Filtering.GetPath(), - IncludeRebaseCommits: true, - RefName: gui.refForLog(), - All: gui.State.ShowWholeGitGraph, - }, - ) - if err != nil { - return err } - gui.State.Commits = commits - return gui.postRefreshUpdate(gui.State.Contexts.BranchCommits) + return nil } func (gui *Gui) refForLog() string { - bisectInfo := gui.Git.Bisect.GetInfo() - gui.State.BisectInfo = bisectInfo + bisectInfo := gui.git.Bisect.GetInfo() + gui.State.Model.BisectInfo = bisectInfo if !bisectInfo.Started() { return "HEAD" } // need to see if our bisect's current commit is reachable from our 'new' ref. - if bisectInfo.Bisecting() && !gui.Git.Bisect.ReachableFromStart(bisectInfo) { + if bisectInfo.Bisecting() && !gui.git.Bisect.ReachableFromStart(bisectInfo) { return bisectInfo.GetNewSha() } return bisectInfo.GetStartSha() } - -func (gui *Gui) refreshRebaseCommits() error { - gui.Mutexes.BranchCommitsMutex.Lock() - defer gui.Mutexes.BranchCommitsMutex.Unlock() - - updatedCommits, err := gui.Git.Loaders.Commits.MergeRebasingCommits(gui.State.Commits) - if err != nil { - return err - } - gui.State.Commits = updatedCommits - - return gui.postRefreshUpdate(gui.State.Contexts.BranchCommits) -} - -// specific functions - -func (gui *Gui) handleCommitSquashDown() error { - if ok, err := gui.validateNotInFilterMode(); err != nil || !ok { - return err - } - - if len(gui.State.Commits) <= 1 { - return gui.createErrorPanel(gui.Tr.YouNoCommitsToSquash) - } - - applied, err := gui.handleMidRebaseCommand("squash") - if err != nil { - return err - } - if applied { - return nil - } - - return gui.ask(askOpts{ - title: gui.Tr.Squash, - prompt: gui.Tr.SureSquashThisCommit, - handleConfirm: func() error { - return gui.WithWaitingStatus(gui.Tr.SquashingStatus, func() error { - gui.logAction(gui.Tr.Actions.SquashCommitDown) - err := gui.Git.Rebase.InteractiveRebase(gui.State.Commits, gui.State.Panels.Commits.SelectedLineIdx, "squash") - return gui.handleGenericMergeCommandResult(err) - }) - }, - }) -} - -func (gui *Gui) handleCommitFixup() error { - if ok, err := gui.validateNotInFilterMode(); err != nil || !ok { - return err - } - - if len(gui.State.Commits) <= 1 { - return gui.createErrorPanel(gui.Tr.YouNoCommitsToSquash) - } - - applied, err := gui.handleMidRebaseCommand("fixup") - if err != nil { - return err - } - if applied { - return nil - } - - return gui.ask(askOpts{ - title: gui.Tr.Fixup, - prompt: gui.Tr.SureFixupThisCommit, - handleConfirm: func() error { - return gui.WithWaitingStatus(gui.Tr.FixingStatus, func() error { - gui.logAction(gui.Tr.Actions.FixupCommit) - err := gui.Git.Rebase.InteractiveRebase(gui.State.Commits, gui.State.Panels.Commits.SelectedLineIdx, "fixup") - return gui.handleGenericMergeCommandResult(err) - }) - }, - }) -} - -func (gui *Gui) handleRewordCommit() error { - if ok, err := gui.validateNotInFilterMode(); err != nil || !ok { - return err - } - - applied, err := gui.handleMidRebaseCommand("reword") - if err != nil { - return err - } - if applied { - return nil - } - - commit := gui.getSelectedLocalCommit() - if commit == nil { - return nil - } - - message, err := gui.Git.Commit.GetCommitMessage(commit.Sha) - if err != nil { - return gui.surfaceError(err) - } - - // TODO: use the commit message panel here - return gui.prompt(promptOpts{ - title: gui.Tr.LcRewordCommit, - initialContent: message, - handleConfirm: func(response string) error { - gui.logAction(gui.Tr.Actions.RewordCommit) - if err := gui.Git.Rebase.RewordCommit(gui.State.Commits, gui.State.Panels.Commits.SelectedLineIdx, response); err != nil { - return gui.surfaceError(err) - } - - return gui.refreshSidePanels(refreshOptions{mode: ASYNC}) - }, - }) -} - -func (gui *Gui) handleRewordCommitEditor() error { - if ok, err := gui.validateNotInFilterMode(); err != nil || !ok { - return err - } - - applied, err := gui.handleMidRebaseCommand("reword") - if err != nil { - return err - } - if applied { - return nil - } - - gui.logAction(gui.Tr.Actions.RewordCommit) - subProcess, err := gui.Git.Rebase.RewordCommitInEditor(gui.State.Commits, gui.State.Panels.Commits.SelectedLineIdx) - if err != nil { - return gui.surfaceError(err) - } - if subProcess != nil { - return gui.runSubprocessWithSuspenseAndRefresh(subProcess) - } - - return nil -} - -// handleMidRebaseCommand sees if the selected commit is in fact a rebasing -// commit meaning you are trying to edit the todo file rather than actually -// begin a rebase. It then updates the todo file with that action -func (gui *Gui) handleMidRebaseCommand(action string) (bool, error) { - selectedCommit := gui.State.Commits[gui.State.Panels.Commits.SelectedLineIdx] - if selectedCommit.Status != "rebasing" { - return false, nil - } - - // for now we do not support setting 'reword' because it requires an editor - // and that means we either unconditionally wait around for the subprocess to ask for - // our input or we set a lazygit client as the EDITOR env variable and have it - // request us to edit the commit message when prompted. - if action == "reword" { - return true, gui.createErrorPanel(gui.Tr.LcRewordNotSupported) - } - - gui.logAction("Update rebase TODO") - gui.logCommand( - fmt.Sprintf("Updating rebase action of commit %s to '%s'", selectedCommit.ShortSha(), action), - false, - ) - - if err := gui.Git.Rebase.EditRebaseTodo(gui.State.Panels.Commits.SelectedLineIdx, action); err != nil { - return false, gui.surfaceError(err) - } - - return true, gui.refreshRebaseCommits() -} - -func (gui *Gui) handleCommitDelete() error { - if ok, err := gui.validateNotInFilterMode(); err != nil || !ok { - return err - } - - applied, err := gui.handleMidRebaseCommand("drop") - if err != nil { - return err - } - if applied { - return nil - } - - return gui.ask(askOpts{ - title: gui.Tr.DeleteCommitTitle, - prompt: gui.Tr.DeleteCommitPrompt, - handleConfirm: func() error { - return gui.WithWaitingStatus(gui.Tr.DeletingStatus, func() error { - gui.logAction(gui.Tr.Actions.DropCommit) - err := gui.Git.Rebase.InteractiveRebase(gui.State.Commits, gui.State.Panels.Commits.SelectedLineIdx, "drop") - return gui.handleGenericMergeCommandResult(err) - }) - }, - }) -} - -func (gui *Gui) handleCommitMoveDown() error { - if ok, err := gui.validateNotInFilterMode(); err != nil || !ok { - return err - } - - index := gui.State.Panels.Commits.SelectedLineIdx - selectedCommit := gui.State.Commits[index] - if selectedCommit.Status == "rebasing" { - if gui.State.Commits[index+1].Status != "rebasing" { - return nil - } - - // logging directly here because MoveTodoDown doesn't have enough information - // to provide a useful log - gui.logAction(gui.Tr.Actions.MoveCommitDown) - gui.logCommand(fmt.Sprintf("Moving commit %s down", selectedCommit.ShortSha()), false) - - if err := gui.Git.Rebase.MoveTodoDown(index); err != nil { - return gui.surfaceError(err) - } - gui.State.Panels.Commits.SelectedLineIdx++ - return gui.refreshRebaseCommits() - } - - return gui.WithWaitingStatus(gui.Tr.MovingStatus, func() error { - gui.logAction(gui.Tr.Actions.MoveCommitDown) - err := gui.Git.Rebase.MoveCommitDown(gui.State.Commits, index) - if err == nil { - gui.State.Panels.Commits.SelectedLineIdx++ - } - return gui.handleGenericMergeCommandResult(err) - }) -} - -func (gui *Gui) handleCommitMoveUp() error { - if ok, err := gui.validateNotInFilterMode(); err != nil || !ok { - return err - } - - index := gui.State.Panels.Commits.SelectedLineIdx - if index == 0 { - return nil - } - - selectedCommit := gui.State.Commits[index] - if selectedCommit.Status == "rebasing" { - // logging directly here because MoveTodoDown doesn't have enough information - // to provide a useful log - gui.logAction(gui.Tr.Actions.MoveCommitUp) - gui.logCommand( - fmt.Sprintf("Moving commit %s up", selectedCommit.ShortSha()), - false, - ) - - if err := gui.Git.Rebase.MoveTodoDown(index - 1); err != nil { - return gui.surfaceError(err) - } - gui.State.Panels.Commits.SelectedLineIdx-- - return gui.refreshRebaseCommits() - } - - return gui.WithWaitingStatus(gui.Tr.MovingStatus, func() error { - gui.logAction(gui.Tr.Actions.MoveCommitUp) - err := gui.Git.Rebase.MoveCommitDown(gui.State.Commits, index-1) - if err == nil { - gui.State.Panels.Commits.SelectedLineIdx-- - } - return gui.handleGenericMergeCommandResult(err) - }) -} - -func (gui *Gui) handleCommitEdit() error { - if ok, err := gui.validateNotInFilterMode(); err != nil || !ok { - return err - } - - applied, err := gui.handleMidRebaseCommand("edit") - if err != nil { - return err - } - if applied { - return nil - } - - return gui.WithWaitingStatus(gui.Tr.RebasingStatus, func() error { - gui.logAction(gui.Tr.Actions.EditCommit) - err = gui.Git.Rebase.InteractiveRebase(gui.State.Commits, gui.State.Panels.Commits.SelectedLineIdx, "edit") - return gui.handleGenericMergeCommandResult(err) - }) -} - -func (gui *Gui) handleCommitAmendTo() error { - if ok, err := gui.validateNotInFilterMode(); err != nil || !ok { - return err - } - - return gui.ask(askOpts{ - title: gui.Tr.AmendCommitTitle, - prompt: gui.Tr.AmendCommitPrompt, - handleConfirm: func() error { - return gui.WithWaitingStatus(gui.Tr.AmendingStatus, func() error { - gui.logAction(gui.Tr.Actions.AmendCommit) - err := gui.Git.Rebase.AmendTo(gui.State.Commits[gui.State.Panels.Commits.SelectedLineIdx].Sha) - return gui.handleGenericMergeCommandResult(err) - }) - }, - }) -} - -func (gui *Gui) handleCommitPick() error { - if ok, err := gui.validateNotInFilterMode(); err != nil || !ok { - return err - } - - applied, err := gui.handleMidRebaseCommand("pick") - if err != nil { - return err - } - if applied { - return nil - } - - // at this point we aren't actually rebasing so we will interpret this as an - // attempt to pull. We might revoke this later after enabling configurable keybindings - return gui.handlePullFiles() -} - -func (gui *Gui) handleCommitRevert() error { - if ok, err := gui.validateNotInFilterMode(); err != nil || !ok { - return err - } - commit := gui.getSelectedLocalCommit() - if commit.IsMerge() { - return gui.createRevertMergeCommitMenu(commit) - } else { - return gui.ask(askOpts{ - title: gui.Tr.Actions.RevertCommit, - prompt: utils.ResolvePlaceholderString( - gui.Tr.ConfirmRevertCommit, - map[string]string{ - "selectedCommit": commit.ShortSha(), - }), - handleConfirm: func() error { - gui.logAction(gui.Tr.Actions.RevertCommit) - if err := gui.Git.Commit.Revert(commit.Sha); err != nil { - return gui.surfaceError(err) - } - return gui.afterRevertCommit() - }, - }) - } -} - -func (gui *Gui) createRevertMergeCommitMenu(commit *models.Commit) error { - menuItems := make([]*menuItem, len(commit.Parents)) - for i, parentSha := range commit.Parents { - i := i - message, err := gui.Git.Commit.GetCommitMessageFirstLine(parentSha) - if err != nil { - return gui.surfaceError(err) - } - - menuItems[i] = &menuItem{ - displayString: fmt.Sprintf("%s: %s", utils.SafeTruncate(parentSha, 8), message), - onPress: func() error { - parentNumber := i + 1 - gui.logAction(gui.Tr.Actions.RevertCommit) - if err := gui.Git.Commit.RevertMerge(commit.Sha, parentNumber); err != nil { - return gui.surfaceError(err) - } - return gui.afterRevertCommit() - }, - } - } - - return gui.createMenu(gui.Tr.SelectParentCommitForMerge, menuItems, createMenuOptions{showCancel: true}) -} - -func (gui *Gui) afterRevertCommit() error { - gui.State.Panels.Commits.SelectedLineIdx++ - return gui.refreshSidePanels(refreshOptions{mode: BLOCK_UI, scope: []RefreshableView{COMMITS, BRANCHES}}) -} - -func (gui *Gui) handleViewCommitFiles() error { - commit := gui.getSelectedLocalCommit() - if commit == nil { - return nil - } - - return gui.switchToCommitFilesContext(commit.Sha, true, gui.State.Contexts.BranchCommits, "commits") -} - -func (gui *Gui) handleCreateFixupCommit() error { - if ok, err := gui.validateNotInFilterMode(); err != nil || !ok { - return err - } - - commit := gui.getSelectedLocalCommit() - if commit == nil { - return nil - } - - prompt := utils.ResolvePlaceholderString( - gui.Tr.SureCreateFixupCommit, - map[string]string{ - "commit": commit.Sha, - }, - ) - - return gui.ask(askOpts{ - title: gui.Tr.CreateFixupCommit, - prompt: prompt, - handleConfirm: func() error { - gui.logAction(gui.Tr.Actions.CreateFixupCommit) - if err := gui.Git.Commit.CreateFixupCommit(commit.Sha); err != nil { - return gui.surfaceError(err) - } - - return gui.refreshSidePanels(refreshOptions{mode: ASYNC}) - }, - }) -} - -func (gui *Gui) handleSquashAllAboveFixupCommits() error { - if ok, err := gui.validateNotInFilterMode(); err != nil || !ok { - return err - } - - commit := gui.getSelectedLocalCommit() - if commit == nil { - return nil - } - - prompt := utils.ResolvePlaceholderString( - gui.Tr.SureSquashAboveCommits, - map[string]string{ - "commit": commit.Sha, - }, - ) - - return gui.ask(askOpts{ - title: gui.Tr.SquashAboveCommits, - prompt: prompt, - handleConfirm: func() error { - return gui.WithWaitingStatus(gui.Tr.SquashingStatus, func() error { - gui.logAction(gui.Tr.Actions.SquashAllAboveFixupCommits) - err := gui.Git.Rebase.SquashAllAboveFixupCommits(commit.Sha) - return gui.handleGenericMergeCommandResult(err) - }) - }, - }) -} - -func (gui *Gui) handleTagCommit() error { - commit := gui.getSelectedLocalCommit() - if commit == nil { - return nil - } - - return gui.createTagMenu(commit.Sha) -} - -func (gui *Gui) createTagMenu(commitSha string) error { - items := []*menuItem{ - { - displayString: gui.Tr.LcLightweightTag, - onPress: func() error { - return gui.handleCreateLightweightTag(commitSha) - }, - }, - { - displayString: gui.Tr.LcAnnotatedTag, - onPress: func() error { - return gui.handleCreateAnnotatedTag(commitSha) - }, - }, - } - - return gui.createMenu(gui.Tr.TagMenuTitle, items, createMenuOptions{showCancel: true}) -} - -func (gui *Gui) afterTagCreate() error { - gui.State.Panels.Tags.SelectedLineIdx = 0 // Set to the top - return gui.refreshSidePanels(refreshOptions{mode: ASYNC, scope: []RefreshableView{COMMITS, TAGS}}) -} - -func (gui *Gui) handleCreateAnnotatedTag(commitSha string) error { - return gui.prompt(promptOpts{ - title: gui.Tr.TagNameTitle, - handleConfirm: func(tagName string) error { - return gui.prompt(promptOpts{ - title: gui.Tr.TagMessageTitle, - handleConfirm: func(msg string) error { - gui.logAction(gui.Tr.Actions.CreateAnnotatedTag) - if err := gui.Git.Tag.CreateAnnotated(tagName, commitSha, msg); err != nil { - return gui.surfaceError(err) - } - return gui.afterTagCreate() - }, - }) - }, - }) -} - -func (gui *Gui) handleCreateLightweightTag(commitSha string) error { - return gui.prompt(promptOpts{ - title: gui.Tr.TagNameTitle, - handleConfirm: func(tagName string) error { - gui.logAction(gui.Tr.Actions.CreateLightweightTag) - if err := gui.Git.Tag.CreateLightweight(tagName, commitSha); err != nil { - return gui.surfaceError(err) - } - return gui.afterTagCreate() - }, - }) -} - -func (gui *Gui) handleCheckoutCommit() error { - commit := gui.getSelectedLocalCommit() - if commit == nil { - return nil - } - - return gui.ask(askOpts{ - title: gui.Tr.LcCheckoutCommit, - prompt: gui.Tr.SureCheckoutThisCommit, - handleConfirm: func() error { - gui.logAction(gui.Tr.Actions.CheckoutCommit) - return gui.handleCheckoutRef(commit.Sha, handleCheckoutRefOptions{}) - }, - }) -} - -func (gui *Gui) handleCreateCommitResetMenu() error { - commit := gui.getSelectedLocalCommit() - if commit == nil { - return gui.createErrorPanel(gui.Tr.NoCommitsThisBranch) - } - - return gui.createResetMenu(commit.Sha) -} - -func (gui *Gui) handleOpenSearchForCommitsPanel(string) error { - // we usually lazyload these commits but now that we're searching we need to load them now - if gui.State.Panels.Commits.LimitCommits { - gui.State.Panels.Commits.LimitCommits = false - if err := gui.refreshSidePanels(refreshOptions{mode: ASYNC, scope: []RefreshableView{COMMITS}}); err != nil { - return err - } - } - - return gui.handleOpenSearch("commits") -} - -func (gui *Gui) handleGotoBottomForCommitsPanel() error { - // we usually lazyload these commits but now that we're searching we need to load them now - if gui.State.Panels.Commits.LimitCommits { - gui.State.Panels.Commits.LimitCommits = false - if err := gui.refreshSidePanels(refreshOptions{mode: SYNC, scope: []RefreshableView{COMMITS}}); err != nil { - return err - } - } - - for _, context := range gui.getListContexts() { - if context.GetViewName() == "commits" { - return context.handleGotoBottom() - } - } - - return nil -} - -func (gui *Gui) handleCopySelectedCommitMessageToClipboard() error { - commit := gui.getSelectedLocalCommit() - if commit == nil { - return nil - } - - message, err := gui.Git.Commit.GetCommitMessage(commit.Sha) - if err != nil { - return gui.surfaceError(err) - } - - gui.logAction(gui.Tr.Actions.CopyCommitMessageToClipboard) - if err := gui.OSCommand.CopyToClipboard(message); err != nil { - return gui.surfaceError(err) - } - - gui.raiseToast(gui.Tr.CommitMessageCopiedToClipboard) - - return nil -} - -func (gui *Gui) handleOpenLogMenu() error { - return gui.createMenu(gui.Tr.LogMenuTitle, []*menuItem{ - { - displayString: gui.Tr.ToggleShowGitGraphAll, - onPress: func() error { - gui.State.ShowWholeGitGraph = !gui.State.ShowWholeGitGraph - - if gui.State.ShowWholeGitGraph { - gui.State.Panels.Commits.LimitCommits = false - } - - return gui.WithWaitingStatus(gui.Tr.LcLoadingCommits, func() error { - return gui.refreshSidePanels(refreshOptions{mode: SYNC, scope: []RefreshableView{COMMITS}}) - }) - }, - }, - { - displayString: gui.Tr.ShowGitGraph, - opensMenu: true, - onPress: func() error { - onSelect := func(value string) { - gui.UserConfig.Git.Log.ShowGraph = value - gui.render() - } - return gui.createMenu(gui.Tr.LogMenuTitle, []*menuItem{ - { - displayString: "always", - onPress: func() error { - onSelect("always") - return nil - }, - }, - { - displayString: "never", - onPress: func() error { - onSelect("never") - return nil - }, - }, - { - displayString: "when maximised", - onPress: func() error { - onSelect("when-maximised") - return nil - }, - }, - }, createMenuOptions{showCancel: true}) - }, - }, - { - displayString: gui.Tr.SortCommits, - opensMenu: true, - onPress: func() error { - onSelect := func(value string) error { - gui.UserConfig.Git.Log.Order = value - return gui.WithWaitingStatus(gui.Tr.LcLoadingCommits, func() error { - return gui.refreshSidePanels(refreshOptions{mode: SYNC, scope: []RefreshableView{COMMITS}}) - }) - } - return gui.createMenu(gui.Tr.LogMenuTitle, []*menuItem{ - { - displayString: "topological (topo-order)", - onPress: func() error { - return onSelect("topo-order") - }, - }, - { - displayString: "date-order", - onPress: func() error { - return onSelect("date-order") - }, - }, - { - displayString: "author-date-order", - onPress: func() error { - return onSelect("author-date-order") - }, - }, - }, createMenuOptions{showCancel: true}) - }, - }, - }, createMenuOptions{showCancel: true}) -} - -func (gui *Gui) handleOpenCommitInBrowser() error { - commit := gui.getSelectedLocalCommit() - if commit == nil { - return nil - } - - hostingServiceMgr := gui.getHostingServiceMgr() - - url, err := hostingServiceMgr.GetCommitURL(commit.Sha) - if err != nil { - return gui.surfaceError(err) - } - - gui.logAction(gui.Tr.Actions.OpenCommitInBrowser) - if err := gui.OSCommand.OpenLink(url); err != nil { - return gui.surfaceError(err) - } - - return nil -} diff --git a/pkg/gui/confirmation_panel.go b/pkg/gui/confirmation_panel.go index b092b1d10..1ad724ad5 100644 --- a/pkg/gui/confirmation_panel.go +++ b/pkg/gui/confirmation_panel.go @@ -5,62 +5,26 @@ import ( "strings" "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/gui/keybindings" + "github.com/jesseduffield/lazygit/pkg/gui/style" "github.com/jesseduffield/lazygit/pkg/gui/types" "github.com/jesseduffield/lazygit/pkg/theme" "github.com/jesseduffield/lazygit/pkg/utils" + "github.com/mattn/go-runewidth" ) -type createPopupPanelOpts struct { - hasLoader bool - editable bool - title string - prompt string - handleConfirm func() error - handleConfirmPrompt func(string) error - handleClose func() error +// This file is for the rendering of confirmation panels along with setting and handling associated +// keybindings. - // when handlersManageFocus is true, do not return from the confirmation context automatically. It's expected that the handlers will manage focus, whether that means switching to another context, or manually returning the context. - handlersManageFocus bool - - findSuggestionsFunc func(string) []*types.Suggestion -} - -type askOpts struct { - title string - prompt string - handleConfirm func() error - handleClose func() error - handlersManageFocus bool -} - -type promptOpts struct { - title string - initialContent string - findSuggestionsFunc func(string) []*types.Suggestion - handleConfirm func(string) error -} - -func (gui *Gui) ask(opts askOpts) error { - return gui.PopupHandler.Ask(opts) -} - -func (gui *Gui) prompt(opts promptOpts) error { - return gui.PopupHandler.Prompt(opts) -} - -func (gui *Gui) createLoaderPanel(prompt string) error { - return gui.PopupHandler.Loader(prompt) -} - -func (gui *Gui) wrappedConfirmationFunction(handlersManageFocus bool, function func() error) func() error { +func (gui *Gui) wrappedConfirmationFunction(function func() error) func() error { return func() error { - if err := gui.closeConfirmationPrompt(handlersManageFocus); err != nil { + if err := gui.c.PopContext(); err != nil { return err } if function != nil { if err := function(); err != nil { - return gui.surfaceError(err) + return gui.c.Error(err) } } @@ -68,15 +32,15 @@ func (gui *Gui) wrappedConfirmationFunction(handlersManageFocus bool, function f } } -func (gui *Gui) wrappedPromptConfirmationFunction(handlersManageFocus bool, function func(string) error, getResponse func() string) func() error { +func (gui *Gui) wrappedPromptConfirmationFunction(function func(string) error, getResponse func() string) func() error { return func() error { - if err := gui.closeConfirmationPrompt(handlersManageFocus); err != nil { + if err := gui.c.PopContext(); err != nil { return err } if function != nil { if err := function(getResponse()); err != nil { - return gui.surfaceError(err) + return gui.c.Error(err) } } @@ -84,23 +48,15 @@ func (gui *Gui) wrappedPromptConfirmationFunction(handlersManageFocus bool, func } } -func (gui *Gui) closeConfirmationPrompt(handlersManageFocus bool) error { - // we've already closed it so we can just return - if !gui.Views.Confirmation.Visible { - return nil - } +func (gui *Gui) deactivateConfirmationPrompt() { + gui.Mutexes.PopupMutex.Lock() + gui.State.CurrentPopupOpts = nil + gui.Mutexes.PopupMutex.Unlock() - if !handlersManageFocus { - if err := gui.returnFromContext(); err != nil { - return err - } - } - - gui.clearConfirmationViewKeyBindings() gui.Views.Confirmation.Visible = false gui.Views.Suggestions.Visible = false - return nil + gui.clearConfirmationViewKeyBindings() } func (gui *Gui) getMessageHeight(wrap bool, message string, width int) int { @@ -109,7 +65,7 @@ func (gui *Gui) getMessageHeight(wrap bool, message string, width int) int { // if we need to wrap, calculate height to fit content within view's width if wrap { for _, line := range lines { - lineCount += len(line)/width + 1 + lineCount += runewidth.StringWidth(line)/width + 1 } } else { lineCount = len(lines) @@ -118,7 +74,28 @@ func (gui *Gui) getMessageHeight(wrap bool, message string, width int) int { } func (gui *Gui) getConfirmationPanelDimensions(wrap bool, prompt string) (int, int, int, int) { + panelWidth := gui.getConfirmationPanelWidth() + panelHeight := gui.getMessageHeight(wrap, prompt, panelWidth) + return gui.getConfirmationPanelDimensionsAux(panelWidth, panelHeight) +} + +func (gui *Gui) getConfirmationPanelDimensionsForContentHeight(panelWidth, contentHeight int) (int, int, int, int) { + return gui.getConfirmationPanelDimensionsAux(panelWidth, contentHeight) +} + +func (gui *Gui) getConfirmationPanelDimensionsAux(panelWidth int, panelHeight int) (int, int, int, int) { width, height := gui.g.Size() + if panelHeight > height*3/4 { + panelHeight = height * 3 / 4 + } + return width/2 - panelWidth/2, + height/2 - panelHeight/2 - panelHeight%2 - 1, + width/2 + panelWidth/2, + height/2 + panelHeight/2 +} + +func (gui *Gui) getConfirmationPanelWidth() int { + width, _ := gui.g.Size() // we want a minimum width up to a point, then we do it based on ratio. panelWidth := 4 * width / 7 minWidth := 80 @@ -129,81 +106,82 @@ func (gui *Gui) getConfirmationPanelDimensions(wrap bool, prompt string) (int, i panelWidth = minWidth } } - panelHeight := gui.getMessageHeight(wrap, prompt, panelWidth) - if panelHeight > height*3/4 { - panelHeight = height * 3 / 4 - } - return width/2 - panelWidth/2, - height/2 - panelHeight/2 - panelHeight%2 - 1, - width/2 + panelWidth/2, - height/2 + panelHeight/2 + + return panelWidth } func (gui *Gui) prepareConfirmationPanel( - title, - prompt string, - hasLoader bool, - findSuggestionsFunc func(string) []*types.Suggestion, - editable bool, + opts types.ConfirmOpts, ) error { - x0, y0, x1, y1 := gui.getConfirmationPanelDimensions(true, prompt) - // calling SetView on an existing view returns the same view, so I'm not bothering - // to reassign to gui.Views.Confirmation - _, err := gui.g.SetView("confirmation", x0, y0, x1, y1, 0) - if err != nil { - return err - } - gui.Views.Confirmation.HasLoader = hasLoader - if hasLoader { + gui.Views.Confirmation.HasLoader = opts.HasLoader + if opts.HasLoader { gui.g.StartTicking() } - gui.Views.Confirmation.Title = title + gui.Views.Confirmation.Title = opts.Title // for now we do not support wrapping in our editor - gui.Views.Confirmation.Wrap = !editable + gui.Views.Confirmation.Wrap = !opts.Editable gui.Views.Confirmation.FgColor = theme.GocuiDefaultTextColor + gui.Views.Confirmation.Mask = runeForMask(opts.Mask) - gui.findSuggestions = findSuggestionsFunc - if findSuggestionsFunc != nil { - suggestionsViewHeight := 11 - suggestionsView, err := gui.g.SetView("suggestions", x0, y1+1, x1, y1+suggestionsViewHeight, 0) - if err != nil { - return err - } + gui.findSuggestions = opts.FindSuggestionsFunc + if opts.FindSuggestionsFunc != nil { + suggestionsView := gui.Views.Suggestions suggestionsView.Wrap = false suggestionsView.FgColor = theme.GocuiDefaultTextColor - gui.setSuggestions(findSuggestionsFunc("")) + gui.setSuggestions(opts.FindSuggestionsFunc("")) suggestionsView.Visible = true - suggestionsView.Title = fmt.Sprintf(gui.Tr.SuggestionsTitle, gui.UserConfig.Keybinding.Universal.TogglePanel) + suggestionsView.Title = fmt.Sprintf(gui.c.Tr.SuggestionsTitle, gui.c.UserConfig.Keybinding.Universal.TogglePanel) } return nil } -func (gui *Gui) createPopupPanel(opts createPopupPanelOpts) error { +func runeForMask(mask bool) rune { + if mask { + return '*' + } + return 0 +} + +func (gui *Gui) createPopupPanel(opts types.CreatePopupPanelOpts) error { + gui.Mutexes.PopupMutex.Lock() + defer gui.Mutexes.PopupMutex.Unlock() + + // we don't allow interruptions of non-loader popups in case we get stuck somehow + // e.g. a credentials popup never gets its required user input so a process hangs + // forever. + // The proper solution is to have a queue of popup options + if gui.State.CurrentPopupOpts != nil && !gui.State.CurrentPopupOpts.HasLoader { + gui.Log.Error("ignoring create popup panel because a popup panel is already open") + return nil + } + // remove any previous keybindings gui.clearConfirmationViewKeyBindings() err := gui.prepareConfirmationPanel( - opts.title, - opts.prompt, - opts.hasLoader, - opts.findSuggestionsFunc, - opts.editable, - ) + types.ConfirmOpts{ + Title: opts.Title, + Prompt: opts.Prompt, + HasLoader: opts.HasLoader, + FindSuggestionsFunc: opts.FindSuggestionsFunc, + Editable: opts.Editable, + Mask: opts.Mask, + }) if err != nil { return err } confirmationView := gui.Views.Confirmation - confirmationView.Editable = opts.editable + confirmationView.Editable = opts.Editable confirmationView.Editor = gocui.EditorFunc(gui.defaultEditor) - if opts.editable { + if opts.Editable { textArea := confirmationView.TextArea textArea.Clear() - textArea.TypeString(opts.prompt) + textArea.TypeString(opts.Prompt) confirmationView.RenderTextArea() } else { - if err := gui.renderString(confirmationView, opts.prompt); err != nil { + if err := gui.renderString(confirmationView, style.AttrBold.Sprint(opts.Prompt)); err != nil { return err } } @@ -212,12 +190,14 @@ func (gui *Gui) createPopupPanel(opts createPopupPanelOpts) error { return err } - return gui.pushContext(gui.State.Contexts.Confirmation) + gui.State.CurrentPopupOpts = &opts + + return gui.c.PushContext(gui.State.Contexts.Confirmation) } -func (gui *Gui) setKeyBindings(opts createPopupPanelOpts) error { +func (gui *Gui) setKeyBindings(opts types.CreatePopupPanelOpts) error { actions := utils.ResolvePlaceholderString( - gui.Tr.CloseConfirm, + gui.c.Tr.CloseConfirm, map[string]string{ "keyBindClose": "esc", "keyBindConfirm": "enter", @@ -226,45 +206,38 @@ func (gui *Gui) setKeyBindings(opts createPopupPanelOpts) error { _ = gui.renderString(gui.Views.Options, actions) var onConfirm func() error - if opts.handleConfirmPrompt != nil { - onConfirm = gui.wrappedPromptConfirmationFunction(opts.handlersManageFocus, opts.handleConfirmPrompt, func() string { return gui.Views.Confirmation.TextArea.GetContent() }) + if opts.HandleConfirmPrompt != nil { + onConfirm = gui.wrappedPromptConfirmationFunction(opts.HandleConfirmPrompt, func() string { return gui.Views.Confirmation.TextArea.GetContent() }) } else { - onConfirm = gui.wrappedConfirmationFunction(opts.handlersManageFocus, opts.handleConfirm) + onConfirm = gui.wrappedConfirmationFunction(opts.HandleConfirm) } - type confirmationKeybinding struct { - viewName string - key interface{} - handler func() error - } - - keybindingConfig := gui.UserConfig.Keybinding + keybindingConfig := gui.c.UserConfig.Keybinding onSuggestionConfirm := gui.wrappedPromptConfirmationFunction( - opts.handlersManageFocus, - opts.handleConfirmPrompt, + opts.HandleConfirmPrompt, gui.getSelectedSuggestionValue, ) - confirmationKeybindings := []confirmationKeybinding{ + bindings := []*types.Binding{ { - viewName: "confirmation", - key: gui.getKey(keybindingConfig.Universal.Confirm), - handler: onConfirm, + ViewName: "confirmation", + Key: keybindings.GetKey(keybindingConfig.Universal.Confirm), + Handler: onConfirm, }, { - viewName: "confirmation", - key: gui.getKey(keybindingConfig.Universal.ConfirmAlt1), - handler: onConfirm, + ViewName: "confirmation", + Key: keybindings.GetKey(keybindingConfig.Universal.ConfirmAlt1), + Handler: onConfirm, }, { - viewName: "confirmation", - key: gui.getKey(keybindingConfig.Universal.Return), - handler: gui.wrappedConfirmationFunction(opts.handlersManageFocus, opts.handleClose), + ViewName: "confirmation", + Key: keybindings.GetKey(keybindingConfig.Universal.Return), + Handler: gui.wrappedConfirmationFunction(opts.HandleClose), }, { - viewName: "confirmation", - key: gui.getKey(keybindingConfig.Universal.TogglePanel), - handler: func() error { + ViewName: "confirmation", + Key: keybindings.GetKey(keybindingConfig.Universal.TogglePanel), + Handler: func() error { if len(gui.State.Suggestions) > 0 { return gui.replaceContext(gui.State.Contexts.Suggestions) } @@ -272,29 +245,29 @@ func (gui *Gui) setKeyBindings(opts createPopupPanelOpts) error { }, }, { - viewName: "suggestions", - key: gui.getKey(keybindingConfig.Universal.Confirm), - handler: onSuggestionConfirm, + ViewName: "suggestions", + Key: keybindings.GetKey(keybindingConfig.Universal.Confirm), + Handler: onSuggestionConfirm, }, { - viewName: "suggestions", - key: gui.getKey(keybindingConfig.Universal.ConfirmAlt1), - handler: onSuggestionConfirm, + ViewName: "suggestions", + Key: keybindings.GetKey(keybindingConfig.Universal.ConfirmAlt1), + Handler: onSuggestionConfirm, }, { - viewName: "suggestions", - key: gui.getKey(keybindingConfig.Universal.Return), - handler: gui.wrappedConfirmationFunction(opts.handlersManageFocus, opts.handleClose), + ViewName: "suggestions", + Key: keybindings.GetKey(keybindingConfig.Universal.Return), + Handler: gui.wrappedConfirmationFunction(opts.HandleClose), }, { - viewName: "suggestions", - key: gui.getKey(keybindingConfig.Universal.TogglePanel), - handler: func() error { return gui.replaceContext(gui.State.Contexts.Confirmation) }, + ViewName: "suggestions", + Key: keybindings.GetKey(keybindingConfig.Universal.TogglePanel), + Handler: func() error { return gui.replaceContext(gui.State.Contexts.Confirmation) }, }, } - for _, binding := range confirmationKeybindings { - if err := gui.g.SetKeybinding(binding.viewName, nil, binding.key, gocui.ModNone, gui.wrappedHandler(binding.handler)); err != nil { + for _, binding := range bindings { + if err := gui.SetKeybinding(binding); err != nil { return err } } @@ -303,33 +276,32 @@ func (gui *Gui) setKeyBindings(opts createPopupPanelOpts) error { } func (gui *Gui) clearConfirmationViewKeyBindings() { - keybindingConfig := gui.UserConfig.Keybinding - _ = gui.g.DeleteKeybinding("confirmation", gui.getKey(keybindingConfig.Universal.Confirm), gocui.ModNone) - _ = gui.g.DeleteKeybinding("confirmation", gui.getKey(keybindingConfig.Universal.ConfirmAlt1), gocui.ModNone) - _ = gui.g.DeleteKeybinding("confirmation", gui.getKey(keybindingConfig.Universal.Return), gocui.ModNone) - _ = gui.g.DeleteKeybinding("suggestions", gui.getKey(keybindingConfig.Universal.Confirm), gocui.ModNone) - _ = gui.g.DeleteKeybinding("suggestions", gui.getKey(keybindingConfig.Universal.ConfirmAlt1), gocui.ModNone) - _ = gui.g.DeleteKeybinding("suggestions", gui.getKey(keybindingConfig.Universal.Return), gocui.ModNone) + keybindingConfig := gui.c.UserConfig.Keybinding + _ = gui.g.DeleteKeybinding("confirmation", keybindings.GetKey(keybindingConfig.Universal.Confirm), gocui.ModNone) + _ = gui.g.DeleteKeybinding("confirmation", keybindings.GetKey(keybindingConfig.Universal.ConfirmAlt1), gocui.ModNone) + _ = gui.g.DeleteKeybinding("confirmation", keybindings.GetKey(keybindingConfig.Universal.Return), gocui.ModNone) + _ = gui.g.DeleteKeybinding("suggestions", keybindings.GetKey(keybindingConfig.Universal.Confirm), gocui.ModNone) + _ = gui.g.DeleteKeybinding("suggestions", keybindings.GetKey(keybindingConfig.Universal.ConfirmAlt1), gocui.ModNone) + _ = gui.g.DeleteKeybinding("suggestions", keybindings.GetKey(keybindingConfig.Universal.Return), gocui.ModNone) } -func (gui *Gui) wrappedHandler(f func() error) func(g *gocui.Gui, v *gocui.View) error { - return func(g *gocui.Gui, v *gocui.View) error { - return f() - } +func (gui *Gui) refreshSuggestions() { + gui.suggestionsAsyncHandler.Do(func() func() { + suggestions := gui.findSuggestions(gui.c.GetPromptInput()) + return func() { gui.setSuggestions(suggestions) } + }) } -func (gui *Gui) createErrorPanel(message string) error { - return gui.PopupHandler.Error(message) -} - -func (gui *Gui) surfaceError(err error) error { - if err == nil { - return nil - } - - if err == gocui.ErrQuit { - return err - } - - return gui.createErrorPanel(err.Error()) +func (gui *Gui) handleAskFocused() error { + keybindingConfig := gui.c.UserConfig.Keybinding + + message := utils.ResolvePlaceholderString( + gui.c.Tr.CloseConfirm, + map[string]string{ + "keyBindClose": keybindings.Label(keybindingConfig.Universal.Return), + "keyBindConfirm": keybindings.Label(keybindingConfig.Universal.Confirm), + }, + ) + + return gui.renderString(gui.Views.Options, message) } diff --git a/pkg/gui/context.go b/pkg/gui/context.go index 7aa9a1046..e4719ab13 100644 --- a/pkg/gui/context.go +++ b/pkg/gui/context.go @@ -1,132 +1,114 @@ package gui import ( - "errors" - "fmt" + "sort" + "strings" + "github.com/jesseduffield/generics/maps" + "github.com/jesseduffield/generics/slices" "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/gui/context" + "github.com/jesseduffield/lazygit/pkg/gui/types" ) -type ContextKind int - -const ( - SIDE_CONTEXT ContextKind = iota - MAIN_CONTEXT - TEMPORARY_POPUP - PERSISTENT_POPUP - EXTRAS_CONTEXT -) - -type OnFocusOpts struct { - ClickedViewName string - ClickedViewLineIdx int -} - -type Context interface { - HandleFocus(opts ...OnFocusOpts) error - HandleFocusLost() error - HandleRender() error - HandleRenderToMain() error - GetKind() ContextKind - GetViewName() string - GetWindowName() string - SetWindowName(string) - GetKey() ContextKey - SetParentContext(Context) - - // we return a bool here to tell us whether or not the returned value just wraps a nil - GetParentContext() (Context, bool) - GetOptionsMap() map[string]string -} +// This file is for the management of contexts. There is a context stack such that +// for example you might start off in the commits context and then open a menu, putting +// you in the menu context. When contexts are activated/deactivated certain things need +// to happen like showing/hiding views and rendering content. func (gui *Gui) popupViewNames() []string { - result := []string{} - for _, context := range gui.allContexts() { - if context.GetKind() == PERSISTENT_POPUP || context.GetKind() == TEMPORARY_POPUP { - result = append(result, context.GetViewName()) - } - } + popups := slices.Filter(gui.State.Contexts.Flatten(), func(c types.Context) bool { + return c.GetKind() == types.PERSISTENT_POPUP || c.GetKind() == types.TEMPORARY_POPUP + }) - return result -} - -func (gui *Gui) currentContextKeyIgnoringPopups() ContextKey { - gui.State.ContextManager.RLock() - defer gui.State.ContextManager.RUnlock() - - stack := gui.State.ContextManager.ContextStack - - for i := range stack { - reversedIndex := len(stack) - 1 - i - context := stack[reversedIndex] - kind := stack[reversedIndex].GetKind() - if kind != TEMPORARY_POPUP && kind != PERSISTENT_POPUP { - return context.GetKey() - } - } - - return "" + return slices.Map(popups, func(c types.Context) string { + return c.GetViewName() + }) } // use replaceContext when you don't want to return to the original context upon // hitting escape: you want to go that context's parent instead. -func (gui *Gui) replaceContext(c Context) error { +func (gui *Gui) replaceContext(c types.Context) error { + if !c.IsFocusable() { + return nil + } + gui.State.ContextManager.Lock() - defer gui.State.ContextManager.Unlock() if len(gui.State.ContextManager.ContextStack) == 0 { - gui.State.ContextManager.ContextStack = []Context{c} + gui.State.ContextManager.ContextStack = []types.Context{c} } else { // replace the last item with the given item gui.State.ContextManager.ContextStack = append(gui.State.ContextManager.ContextStack[0:len(gui.State.ContextManager.ContextStack)-1], c) } - return gui.activateContext(c) + defer gui.State.ContextManager.Unlock() + + return gui.activateContext(c, types.OnFocusOpts{}) } -func (gui *Gui) pushContext(c Context, opts ...OnFocusOpts) error { - // using triple dot but you should only ever pass one of these opt structs - if len(opts) > 1 { - return errors.New("cannot pass multiple opts to pushContext") +func (gui *Gui) pushContext(c types.Context, opts types.OnFocusOpts) error { + if !c.IsFocusable() { + return nil } + contextsToDeactivate := gui.pushToContextStack(c) + + for _, contextToDeactivate := range contextsToDeactivate { + if err := gui.deactivateContext(contextToDeactivate, types.OnFocusLostOpts{NewContextKey: c.GetKey()}); err != nil { + return err + } + } + + return gui.activateContext(c, opts) +} + +// Adjusts the context stack based on the context that's being pushed and returns contexts to deactivate +func (gui *Gui) pushToContextStack(c types.Context) []types.Context { + contextsToDeactivate := []types.Context{} + gui.State.ContextManager.Lock() + defer gui.State.ContextManager.Unlock() - // push onto stack - // if we are switching to a side context, remove all other contexts in the stack - if c.GetKind() == SIDE_CONTEXT { + if len(gui.State.ContextManager.ContextStack) == 0 { + gui.State.ContextManager.ContextStack = append(gui.State.ContextManager.ContextStack, c) + } else if c.GetKind() == types.SIDE_CONTEXT { + // if we are switching to a side context, remove all other contexts in the stack + contextsToDeactivate = gui.State.ContextManager.ContextStack + gui.State.ContextManager.ContextStack = []types.Context{c} + } else if c.GetKind() == types.MAIN_CONTEXT { + // if we're switching to a main context, remove all other main contexts in the stack for _, stackContext := range gui.State.ContextManager.ContextStack { - if stackContext.GetKey() != c.GetKey() { - if err := gui.deactivateContext(stackContext); err != nil { - gui.State.ContextManager.Unlock() - return err - } + if stackContext.GetKind() == types.MAIN_CONTEXT { + contextsToDeactivate = append(contextsToDeactivate, stackContext) } } - gui.State.ContextManager.ContextStack = []Context{c} - } else if len(gui.State.ContextManager.ContextStack) == 0 || gui.currentContextWithoutLock().GetKey() != c.GetKey() { - // Do not append if the one at the end is the same context (e.g. opening a menu from a menu) - // In that case we'll just close the menu entirely when the user hits escape. + gui.State.ContextManager.ContextStack = []types.Context{c} + } else { + topContext := gui.currentContextWithoutLock() - // TODO: think about other exceptional cases - gui.State.ContextManager.ContextStack = append(gui.State.ContextManager.ContextStack, c) + // if we're pushing the same context on, we do nothing. + if topContext.GetKey() != c.GetKey() { + // if top one is a temporary popup, we remove it. Ideally you'd be able to + // escape back to previous temporary popups, but because we're currently reusing + // views for this, you might not be able to get back to where you previously were. + // The exception is when going to the search context e.g. for searching a menu. + if (topContext.GetKind() == types.TEMPORARY_POPUP && c.GetKey() != context.SEARCH_CONTEXT_KEY) || + // we only ever want one main context on the stack at a time. + (topContext.GetKind() == types.MAIN_CONTEXT && c.GetKind() == types.MAIN_CONTEXT) { + + contextsToDeactivate = append(contextsToDeactivate, topContext) + _, gui.State.ContextManager.ContextStack = slices.Pop(gui.State.ContextManager.ContextStack) + } + + gui.State.ContextManager.ContextStack = append(gui.State.ContextManager.ContextStack, c) + } } - gui.State.ContextManager.Unlock() - - return gui.activateContext(c, opts...) + return contextsToDeactivate } -// asynchronous code idea: functions return an error via a channel, when done - -// pushContextWithView is to be used when you don't know which context you -// want to switch to: you only know the view that you want to switch to. It will -// look up the context currently active for that view and switch to that context -func (gui *Gui) pushContextWithView(viewName string) error { - return gui.pushContext(gui.State.ViewContextMap[viewName]) -} - -func (gui *Gui) returnFromContext() error { +func (gui *Gui) popContext() error { gui.State.ContextManager.Lock() if len(gui.State.ContextManager.ContextStack) == 1 { @@ -135,23 +117,21 @@ func (gui *Gui) returnFromContext() error { return nil } - n := len(gui.State.ContextManager.ContextStack) - 1 + var currentContext types.Context + currentContext, gui.State.ContextManager.ContextStack = slices.Pop(gui.State.ContextManager.ContextStack) - currentContext := gui.State.ContextManager.ContextStack[n] - newContext := gui.State.ContextManager.ContextStack[n-1] - - gui.State.ContextManager.ContextStack = gui.State.ContextManager.ContextStack[:n] + newContext := gui.State.ContextManager.ContextStack[len(gui.State.ContextManager.ContextStack)-1] gui.State.ContextManager.Unlock() - if err := gui.deactivateContext(currentContext); err != nil { + if err := gui.deactivateContext(currentContext, types.OnFocusLostOpts{NewContextKey: newContext.GetKey()}); err != nil { return err } - return gui.activateContext(newContext) + return gui.activateContext(newContext, types.OnFocusOpts{}) } -func (gui *Gui) deactivateContext(c Context) error { +func (gui *Gui) deactivateContext(c types.Context, opts types.OnFocusLostOpts) error { view, _ := gui.g.View(c.GetViewName()) if view != nil && view.IsSearching() { @@ -161,11 +141,13 @@ func (gui *Gui) deactivateContext(c Context) error { } // if we are the kind of context that is sent to back upon deactivation, we should do that - if view != nil && (c.GetKind() == TEMPORARY_POPUP || c.GetKind() == PERSISTENT_POPUP || c.GetKey() == COMMIT_FILES_CONTEXT_KEY) { + if view != nil && + (c.GetKind() == types.TEMPORARY_POPUP || + c.GetKind() == types.PERSISTENT_POPUP) { view.Visible = false } - if err := c.HandleFocusLost(); err != nil { + if err := c.HandleFocusLost(opts); err != nil { return err } @@ -175,22 +157,13 @@ func (gui *Gui) deactivateContext(c Context) error { // postRefreshUpdate is to be called on a context after the state that it depends on has been refreshed // if the context's view is set to another context we do nothing. // if the context's view is the current view we trigger a focus; re-selecting the current item. -func (gui *Gui) postRefreshUpdate(c Context) error { - v, err := gui.g.View(c.GetViewName()) - if err != nil { - return nil - } - - if ContextKey(v.Context) != c.GetKey() { - return nil - } - +func (gui *Gui) postRefreshUpdate(c types.Context) error { if err := c.HandleRender(); err != nil { return err } if gui.currentViewName() == c.GetViewName() { - if err := c.HandleFocus(); err != nil { + if err := c.HandleFocus(types.OnFocusOpts{}); err != nil { return err } } @@ -198,39 +171,26 @@ func (gui *Gui) postRefreshUpdate(c Context) error { return nil } -func (gui *Gui) activateContext(c Context, opts ...OnFocusOpts) error { +func (gui *Gui) activateContext(c types.Context, opts types.OnFocusOpts) error { viewName := c.GetViewName() v, err := gui.g.View(viewName) if err != nil { return err } - originalViewContextKey := ContextKey(v.Context) - // ensure that any other window for which this view was active is now set to the default for that window. - gui.setViewAsActiveForWindow(v) - - if viewName == "main" { - gui.changeMainViewsContext(c.GetKey()) - } else { - gui.changeMainViewsContext(MAIN_NORMAL_CONTEXT_KEY) - } - - gui.setViewTabForContext(c) + gui.setWindowContext(c) + gui.moveToTopOfWindow(c) if _, err := gui.g.SetCurrentView(viewName); err != nil { return err } - v.Visible = true - - // if the new context's view was previously displaying another context, render the new context - if originalViewContextKey != c.GetKey() { - if err := c.HandleRender(); err != nil { - return err - } + desiredTitle := c.Title() + if desiredTitle != "" { + v.Title = desiredTitle } - v.Context = string(c.GetKey()) + v.Visible = true gui.g.Cursor = v.Editable @@ -241,16 +201,25 @@ func (gui *Gui) activateContext(c Context, opts ...OnFocusOpts) error { } gui.renderOptionsMap(optionsMap) - if err := c.HandleFocus(opts...); err != nil { + if err := c.HandleFocus(opts); err != nil { return err } - // TODO: consider removing this and instead depending on the .Context field of views - gui.State.ViewContextMap[c.GetViewName()] = c - return nil } +func (gui *Gui) optionsMapToString(optionsMap map[string]string) string { + options := maps.MapToSlice(optionsMap, func(key string, description string) string { + return key + ": " + description + }) + sort.Strings(options) + return strings.Join(options, ", ") +} + +func (gui *Gui) renderOptionsMap(optionsMap map[string]string) { + _ = gui.renderString(gui.Views.Options, gui.optionsMapToString(optionsMap)) +} + // // currently unused // func (gui *Gui) renderContextStack() string { // result := "" @@ -260,14 +229,14 @@ func (gui *Gui) activateContext(c Context, opts ...OnFocusOpts) error { // return result // } -func (gui *Gui) currentContext() Context { +func (gui *Gui) currentContext() types.Context { gui.State.ContextManager.RLock() defer gui.State.ContextManager.RUnlock() return gui.currentContextWithoutLock() } -func (gui *Gui) currentContextWithoutLock() Context { +func (gui *Gui) currentContextWithoutLock() types.Context { if len(gui.State.ContextManager.ContextStack) == 0 { return gui.defaultSideContext() } @@ -277,16 +246,16 @@ func (gui *Gui) currentContextWithoutLock() Context { // the status panel is not yet a list context (and may never be), so this method is not // quite the same as currentSideContext() -func (gui *Gui) currentSideListContext() IListContext { +func (gui *Gui) currentSideListContext() types.IListContext { context := gui.currentSideContext() - listContext, ok := context.(IListContext) + listContext, ok := context.(types.IListContext) if !ok { return nil } return listContext } -func (gui *Gui) currentSideContext() Context { +func (gui *Gui) currentSideContext() types.Context { gui.State.ContextManager.RLock() defer gui.State.ContextManager.RUnlock() @@ -297,11 +266,11 @@ func (gui *Gui) currentSideContext() Context { return gui.defaultSideContext() } - // find the first context in the stack with the type of SIDE_CONTEXT + // find the first context in the stack with the type of types.SIDE_CONTEXT for i := range stack { context := stack[len(stack)-1-i] - if context.GetKind() == SIDE_CONTEXT { + if context.GetKind() == types.SIDE_CONTEXT { return context } } @@ -310,10 +279,14 @@ func (gui *Gui) currentSideContext() Context { } // static as opposed to popup -func (gui *Gui) currentStaticContext() Context { +func (gui *Gui) currentStaticContext() types.Context { gui.State.ContextManager.RLock() defer gui.State.ContextManager.RUnlock() + return gui.currentStaticContextWithoutLock() +} + +func (gui *Gui) currentStaticContextWithoutLock() types.Context { stack := gui.State.ContextManager.ContextStack if len(stack) == 0 { @@ -324,7 +297,7 @@ func (gui *Gui) currentStaticContext() Context { for i := range stack { context := stack[len(stack)-1-i] - if context.GetKind() != TEMPORARY_POPUP && context.GetKind() != PERSISTENT_POPUP { + if context.GetKind() != types.TEMPORARY_POPUP && context.GetKind() != types.PERSISTENT_POPUP { return context } } @@ -332,40 +305,22 @@ func (gui *Gui) currentStaticContext() Context { return gui.defaultSideContext() } -func (gui *Gui) defaultSideContext() Context { +func (gui *Gui) defaultSideContext() types.Context { if gui.State.Modes.Filtering.Active() { - return gui.State.Contexts.BranchCommits + return gui.State.Contexts.LocalCommits } else { return gui.State.Contexts.Files } } -// remove the need to do this: always use a mapping -func (gui *Gui) setInitialViewContexts() { - // arguably we should only have our ViewContextMap and we should do away with - // contexts on views, or vice versa - for viewName, context := range gui.State.ViewContextMap { - // see if the view exists. If it does, set the context on it - view, err := gui.g.View(viewName) - if err != nil { - continue - } - - view.Context = string(context.GetKey()) - } -} - // getFocusLayout returns a manager function for when view gain and lose focus func (gui *Gui) getFocusLayout() func(g *gocui.Gui) error { var previousView *gocui.View return func(g *gocui.Gui) error { newView := gui.g.CurrentView() - if err := gui.onViewFocusChange(); err != nil { - return err - } // for now we don't consider losing focus to a popup panel as actually losing focus if newView != previousView && !gui.isPopupPanel(newView.Name()) { - if err := gui.onViewFocusLost(previousView, newView); err != nil { + if err := gui.onViewFocusLost(previousView); err != nil { return err } @@ -375,120 +330,30 @@ func (gui *Gui) getFocusLayout() func(g *gocui.Gui) error { } } -func (gui *Gui) onViewFocusChange() error { - gui.g.Mutexes.ViewsMutex.Lock() - defer gui.g.Mutexes.ViewsMutex.Unlock() - - currentView := gui.g.CurrentView() - for _, view := range gui.g.Views() { - view.Highlight = view.Name() != "main" && view.Name() != "extras" && view == currentView - } - return nil -} - -func (gui *Gui) onViewFocusLost(oldView *gocui.View, newView *gocui.View) error { +func (gui *Gui) onViewFocusLost(oldView *gocui.View) error { if oldView == nil { return nil } - _ = oldView.SetOriginX(0) + oldView.Highlight = false - if oldView == gui.Views.CommitFiles && newView != gui.Views.Main && newView != gui.Views.Secondary && newView != gui.Views.Search { - gui.resetWindowForView(gui.Views.CommitFiles) - if err := gui.deactivateContext(gui.State.Contexts.CommitFiles); err != nil { - return err - } - } + _ = oldView.SetOriginX(0) return nil } -// changeContext is a helper function for when we want to change a 'main' context -// which currently just means a context that affects both the main and secondary views -// other views can have their context changed directly but this function helps -// keep the main and secondary views in sync -func (gui *Gui) changeMainViewsContext(contextKey ContextKey) { - if gui.State.MainContext == contextKey { - return - } - - switch contextKey { - case MAIN_NORMAL_CONTEXT_KEY, MAIN_PATCH_BUILDING_CONTEXT_KEY, MAIN_STAGING_CONTEXT_KEY, MAIN_MERGING_CONTEXT_KEY: - gui.Views.Main.Context = string(contextKey) - gui.Views.Secondary.Context = string(contextKey) - default: - panic(fmt.Sprintf("unknown context for main: %s", contextKey)) - } - - gui.State.MainContext = contextKey -} - -func (gui *Gui) viewTabNames(viewName string) []string { - tabContexts := gui.State.ViewTabContextMap[viewName] - - if len(tabContexts) == 0 { - return nil - } - - result := make([]string, len(tabContexts)) - for i, tabContext := range tabContexts { - result[i] = tabContext.tab - } - - return result -} - -func (gui *Gui) setViewTabForContext(c Context) { - // search for the context in our map and if we find it, set the tab for the corresponding view - tabContexts, ok := gui.State.ViewTabContextMap[c.GetViewName()] - if !ok { - return - } - - for tabIndex, tabContext := range tabContexts { - for _, context := range tabContext.contexts { - if context.GetKey() == c.GetKey() { - // get the view, set the tab - v, err := gui.g.View(c.GetViewName()) - if err != nil { - gui.Log.Error(err) - return - } - v.TabIndex = tabIndex - return - } - } - } -} - -type tabContext struct { - tab string - contexts []Context -} - -func (gui *Gui) mustContextForContextKey(contextKey ContextKey) Context { - context, ok := gui.contextForContextKey(contextKey) - - if !ok { - panic(fmt.Sprintf("context not found for key %s", contextKey)) - } - - return context -} - -func (gui *Gui) contextForContextKey(contextKey ContextKey) (Context, bool) { - for _, context := range gui.allContexts() { - if context.GetKey() == contextKey { - return context, true - } - } - - return nil, false +func (gui *Gui) TransientContexts() []types.Context { + return slices.Filter(gui.State.Contexts.Flatten(), func(context types.Context) bool { + return context.IsTransient() + }) } func (gui *Gui) rerenderView(view *gocui.View) error { - contextKey := ContextKey(view.Context) - context := gui.mustContextForContextKey(contextKey) + context, ok := gui.contextForView(view.Name()) + if !ok { + gui.Log.Errorf("no context found for view %s", view.Name()) + return nil + } return context.HandleRender() } @@ -499,13 +364,7 @@ func (gui *Gui) getSideContextSelectedItemId() string { return "" } - item, ok := currentSideContext.GetSelectedItem() - - if ok { - return item.ID() - } - - return "" + return currentSideContext.GetSelectedItemId() } // currently unused diff --git a/pkg/gui/context/base_context.go b/pkg/gui/context/base_context.go new file mode 100644 index 000000000..58b8d25ab --- /dev/null +++ b/pkg/gui/context/base_context.go @@ -0,0 +1,154 @@ +package context + +import ( + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type BaseContext struct { + kind types.ContextKind + key types.ContextKey + view *gocui.View + viewTrait types.IViewTrait + windowName string + onGetOptionsMap func() map[string]string + + keybindingsFns []types.KeybindingsFn + mouseKeybindingsFns []types.MouseKeybindingsFn + onClickFn func() error + + focusable bool + transient bool + hasControlledBounds bool + + *ParentContextMgr +} + +var _ types.IBaseContext = &BaseContext{} + +type NewBaseContextOpts struct { + Kind types.ContextKind + Key types.ContextKey + View *gocui.View + WindowName string + Focusable bool + Transient bool + HasUncontrolledBounds bool // negating for the sake of making false the default + + OnGetOptionsMap func() map[string]string +} + +func NewBaseContext(opts NewBaseContextOpts) *BaseContext { + viewTrait := NewViewTrait(opts.View) + + hasControlledBounds := !opts.HasUncontrolledBounds + + return &BaseContext{ + kind: opts.Kind, + key: opts.Key, + view: opts.View, + windowName: opts.WindowName, + onGetOptionsMap: opts.OnGetOptionsMap, + focusable: opts.Focusable, + transient: opts.Transient, + hasControlledBounds: hasControlledBounds, + ParentContextMgr: &ParentContextMgr{}, + viewTrait: viewTrait, + } +} + +func (self *BaseContext) GetOptionsMap() map[string]string { + if self.onGetOptionsMap != nil { + return self.onGetOptionsMap() + } + return nil +} + +func (self *BaseContext) SetWindowName(windowName string) { + self.windowName = windowName +} + +func (self *BaseContext) GetWindowName() string { + return self.windowName +} + +func (self *BaseContext) GetViewName() string { + // for the sake of the global context which has no view + if self.view == nil { + return "" + } + + return self.view.Name() +} + +func (self *BaseContext) GetView() *gocui.View { + return self.view +} + +func (self *BaseContext) GetViewTrait() types.IViewTrait { + return self.viewTrait +} + +func (self *BaseContext) GetKind() types.ContextKind { + return self.kind +} + +func (self *BaseContext) GetKey() types.ContextKey { + return self.key +} + +func (self *BaseContext) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { + bindings := []*types.Binding{} + for i := range self.keybindingsFns { + // the first binding in the bindings array takes precedence but we want the + // last keybindingsFn to take precedence to we add them in reverse + bindings = append(bindings, self.keybindingsFns[len(self.keybindingsFns)-1-i](opts)...) + } + + return bindings +} + +func (self *BaseContext) AddKeybindingsFn(fn types.KeybindingsFn) { + self.keybindingsFns = append(self.keybindingsFns, fn) +} + +func (self *BaseContext) AddMouseKeybindingsFn(fn types.MouseKeybindingsFn) { + self.mouseKeybindingsFns = append(self.mouseKeybindingsFns, fn) +} + +func (self *BaseContext) AddOnClickFn(fn func() error) { + if fn != nil { + self.onClickFn = fn + } +} + +func (self *BaseContext) GetOnClick() func() error { + return self.onClickFn +} + +func (self *BaseContext) GetMouseKeybindings(opts types.KeybindingsOpts) []*gocui.ViewMouseBinding { + bindings := []*gocui.ViewMouseBinding{} + for i := range self.mouseKeybindingsFns { + // the first binding in the bindings array takes precedence but we want the + // last keybindingsFn to take precedence to we add them in reverse + bindings = append(bindings, self.mouseKeybindingsFns[len(self.mouseKeybindingsFns)-1-i](opts)...) + } + + return bindings +} + +func (self *BaseContext) IsFocusable() bool { + return self.focusable +} + +func (self *BaseContext) IsTransient() bool { + return self.transient +} + +func (self *BaseContext) HasControlledBounds() bool { + return self.hasControlledBounds +} + +func (self *BaseContext) Title() string { + return "" +} diff --git a/pkg/gui/context/basic_view_model.go b/pkg/gui/context/basic_view_model.go new file mode 100644 index 000000000..a53be4d91 --- /dev/null +++ b/pkg/gui/context/basic_view_model.go @@ -0,0 +1,34 @@ +package context + +import "github.com/jesseduffield/lazygit/pkg/gui/context/traits" + +type BasicViewModel[T any] struct { + *traits.ListCursor + getModel func() []T +} + +func NewBasicViewModel[T any](getModel func() []T) *BasicViewModel[T] { + self := &BasicViewModel[T]{ + getModel: getModel, + } + + self.ListCursor = traits.NewListCursor(self) + + return self +} + +func (self *BasicViewModel[T]) Len() int { + return len(self.getModel()) +} + +func (self *BasicViewModel[T]) GetSelected() T { + if self.Len() == 0 { + return Zero[T]() + } + + return self.getModel()[self.GetSelectedLineIdx()] +} + +func Zero[T any]() T { + return *new(T) +} diff --git a/pkg/gui/context/branches_context.go b/pkg/gui/context/branches_context.go new file mode 100644 index 000000000..a3e404fdb --- /dev/null +++ b/pkg/gui/context/branches_context.go @@ -0,0 +1,65 @@ +package context + +import ( + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type BranchesContext struct { + *BasicViewModel[*models.Branch] + *ListContextTrait +} + +var _ types.IListContext = (*BranchesContext)(nil) + +func NewBranchesContext( + getModel func() []*models.Branch, + view *gocui.View, + getDisplayStrings func(startIdx int, length int) [][]string, + + onFocus func(types.OnFocusOpts) error, + onRenderToMain func() error, + onFocusLost func(opts types.OnFocusLostOpts) error, + + c *types.HelperCommon, +) *BranchesContext { + viewModel := NewBasicViewModel(getModel) + + return &BranchesContext{ + BasicViewModel: viewModel, + ListContextTrait: &ListContextTrait{ + Context: NewSimpleContext(NewBaseContext(NewBaseContextOpts{ + View: view, + WindowName: "branches", + Key: LOCAL_BRANCHES_CONTEXT_KEY, + Kind: types.SIDE_CONTEXT, + Focusable: true, + }), ContextCallbackOpts{ + OnFocus: onFocus, + OnFocusLost: onFocusLost, + OnRenderToMain: onRenderToMain, + }), + list: viewModel, + getDisplayStrings: getDisplayStrings, + c: c, + }, + } +} + +func (self *BranchesContext) GetSelectedItemId() string { + item := self.GetSelected() + if item == nil { + return "" + } + + return item.ID() +} + +func (self *BranchesContext) GetSelectedRef() types.Ref { + branch := self.GetSelected() + if branch == nil { + return nil + } + return branch +} diff --git a/pkg/gui/context/commit_files_context.go b/pkg/gui/context/commit_files_context.go new file mode 100644 index 000000000..4a28ac4c5 --- /dev/null +++ b/pkg/gui/context/commit_files_context.go @@ -0,0 +1,63 @@ +package context + +import ( + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/filetree" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type CommitFilesContext struct { + *filetree.CommitFileTreeViewModel + *ListContextTrait + *DynamicTitleBuilder +} + +var _ types.IListContext = (*CommitFilesContext)(nil) + +func NewCommitFilesContext( + getModel func() []*models.CommitFile, + view *gocui.View, + getDisplayStrings func(startIdx int, length int) [][]string, + + onFocus func(types.OnFocusOpts) error, + onRenderToMain func() error, + onFocusLost func(opts types.OnFocusLostOpts) error, + + c *types.HelperCommon, +) *CommitFilesContext { + viewModel := filetree.NewCommitFileTreeViewModel(getModel, c.Log, c.UserConfig.Gui.ShowFileTree) + + return &CommitFilesContext{ + CommitFileTreeViewModel: viewModel, + DynamicTitleBuilder: NewDynamicTitleBuilder(c.Tr.CommitFilesDynamicTitle), + ListContextTrait: &ListContextTrait{ + Context: NewSimpleContext( + NewBaseContext(NewBaseContextOpts{ + View: view, + WindowName: "commits", + Key: COMMIT_FILES_CONTEXT_KEY, + Kind: types.SIDE_CONTEXT, + Focusable: true, + Transient: true, + }), + ContextCallbackOpts{ + OnFocus: onFocus, + OnFocusLost: onFocusLost, + OnRenderToMain: onRenderToMain, + }), + list: viewModel, + getDisplayStrings: getDisplayStrings, + c: c, + }, + } +} + +func (self *CommitFilesContext) GetSelectedItemId() string { + item := self.GetSelected() + if item == nil { + return "" + } + + return item.ID() +} diff --git a/pkg/gui/context/context.go b/pkg/gui/context/context.go new file mode 100644 index 000000000..131eecf0a --- /dev/null +++ b/pkg/gui/context/context.go @@ -0,0 +1,152 @@ +package context + +import ( + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +const ( + GLOBAL_CONTEXT_KEY types.ContextKey = "global" + STATUS_CONTEXT_KEY types.ContextKey = "status" + FILES_CONTEXT_KEY types.ContextKey = "files" + LOCAL_BRANCHES_CONTEXT_KEY types.ContextKey = "localBranches" + REMOTES_CONTEXT_KEY types.ContextKey = "remotes" + REMOTE_BRANCHES_CONTEXT_KEY types.ContextKey = "remoteBranches" + TAGS_CONTEXT_KEY types.ContextKey = "tags" + LOCAL_COMMITS_CONTEXT_KEY types.ContextKey = "commits" + REFLOG_COMMITS_CONTEXT_KEY types.ContextKey = "reflogCommits" + SUB_COMMITS_CONTEXT_KEY types.ContextKey = "subCommits" + COMMIT_FILES_CONTEXT_KEY types.ContextKey = "commitFiles" + STASH_CONTEXT_KEY types.ContextKey = "stash" + NORMAL_MAIN_CONTEXT_KEY types.ContextKey = "normal" + NORMAL_SECONDARY_CONTEXT_KEY types.ContextKey = "normalSecondary" + STAGING_MAIN_CONTEXT_KEY types.ContextKey = "staging" + STAGING_SECONDARY_CONTEXT_KEY types.ContextKey = "stagingSecondary" + PATCH_BUILDING_MAIN_CONTEXT_KEY types.ContextKey = "patchBuilding" + PATCH_BUILDING_SECONDARY_CONTEXT_KEY types.ContextKey = "patchBuildingSecondary" + MERGE_CONFLICTS_CONTEXT_KEY types.ContextKey = "mergeConflicts" + + // these shouldn't really be needed for anything but I'm giving them unique keys nonetheless + OPTIONS_CONTEXT_KEY types.ContextKey = "options" + APP_STATUS_CONTEXT_KEY types.ContextKey = "appStatus" + SEARCH_PREFIX_CONTEXT_KEY types.ContextKey = "searchPrefix" + INFORMATION_CONTEXT_KEY types.ContextKey = "information" + LIMIT_CONTEXT_KEY types.ContextKey = "limit" + + MENU_CONTEXT_KEY types.ContextKey = "menu" + CONFIRMATION_CONTEXT_KEY types.ContextKey = "confirmation" + SEARCH_CONTEXT_KEY types.ContextKey = "search" + COMMIT_MESSAGE_CONTEXT_KEY types.ContextKey = "commitMessage" + SUBMODULES_CONTEXT_KEY types.ContextKey = "submodules" + SUGGESTIONS_CONTEXT_KEY types.ContextKey = "suggestions" + COMMAND_LOG_CONTEXT_KEY types.ContextKey = "cmdLog" +) + +var AllContextKeys = []types.ContextKey{ + GLOBAL_CONTEXT_KEY, + STATUS_CONTEXT_KEY, + FILES_CONTEXT_KEY, + LOCAL_BRANCHES_CONTEXT_KEY, + REMOTES_CONTEXT_KEY, + REMOTE_BRANCHES_CONTEXT_KEY, + TAGS_CONTEXT_KEY, + LOCAL_COMMITS_CONTEXT_KEY, + REFLOG_COMMITS_CONTEXT_KEY, + SUB_COMMITS_CONTEXT_KEY, + COMMIT_FILES_CONTEXT_KEY, + STASH_CONTEXT_KEY, + NORMAL_MAIN_CONTEXT_KEY, + NORMAL_SECONDARY_CONTEXT_KEY, + STAGING_MAIN_CONTEXT_KEY, + STAGING_SECONDARY_CONTEXT_KEY, + PATCH_BUILDING_MAIN_CONTEXT_KEY, + PATCH_BUILDING_SECONDARY_CONTEXT_KEY, + MERGE_CONFLICTS_CONTEXT_KEY, + + MENU_CONTEXT_KEY, + CONFIRMATION_CONTEXT_KEY, + SEARCH_CONTEXT_KEY, + COMMIT_MESSAGE_CONTEXT_KEY, + SUBMODULES_CONTEXT_KEY, + SUGGESTIONS_CONTEXT_KEY, + COMMAND_LOG_CONTEXT_KEY, +} + +type ContextTree struct { + Global types.Context + Status types.Context + Files *WorkingTreeContext + Menu *MenuContext + Branches *BranchesContext + Tags *TagsContext + LocalCommits *LocalCommitsContext + CommitFiles *CommitFilesContext + Remotes *RemotesContext + Submodules *SubmodulesContext + RemoteBranches *RemoteBranchesContext + ReflogCommits *ReflogCommitsContext + SubCommits *SubCommitsContext + Stash *StashContext + Suggestions *SuggestionsContext + Normal types.Context + NormalSecondary types.Context + Staging *PatchExplorerContext + StagingSecondary *PatchExplorerContext + CustomPatchBuilder *PatchExplorerContext + CustomPatchBuilderSecondary types.Context + MergeConflicts *MergeConflictsContext + Confirmation types.Context + CommitMessage types.Context + CommandLog types.Context + + // display contexts + AppStatus types.Context + Options types.Context + SearchPrefix types.Context + Search types.Context + Information types.Context + Limit types.Context +} + +// the order of this decides which context is initially at the top of its window +func (self *ContextTree) Flatten() []types.Context { + return []types.Context{ + self.Global, + self.Status, + self.Submodules, + self.Files, + self.SubCommits, + self.Remotes, + self.RemoteBranches, + self.Tags, + self.Branches, + self.CommitFiles, + self.ReflogCommits, + self.LocalCommits, + self.Stash, + self.Menu, + self.Confirmation, + self.CommitMessage, + + self.MergeConflicts, + self.StagingSecondary, + self.Staging, + self.CustomPatchBuilderSecondary, + self.CustomPatchBuilder, + self.NormalSecondary, + self.Normal, + + self.Suggestions, + self.CommandLog, + self.AppStatus, + self.Options, + self.SearchPrefix, + self.Search, + self.Information, + self.Limit, + } +} + +type TabView struct { + Tab string + ViewName string +} diff --git a/pkg/gui/context/dynamic_title_builder.go b/pkg/gui/context/dynamic_title_builder.go new file mode 100644 index 000000000..ee4facad2 --- /dev/null +++ b/pkg/gui/context/dynamic_title_builder.go @@ -0,0 +1,23 @@ +package context + +import "fmt" + +type DynamicTitleBuilder struct { + formatStr string // e.g. 'remote branches for %s' + + titleRef string // e.g. 'origin' +} + +func NewDynamicTitleBuilder(formatStr string) *DynamicTitleBuilder { + return &DynamicTitleBuilder{ + formatStr: formatStr, + } +} + +func (self *DynamicTitleBuilder) SetTitleRef(titleRef string) { + self.titleRef = titleRef +} + +func (self *DynamicTitleBuilder) Title() string { + return fmt.Sprintf(self.formatStr, self.titleRef) +} diff --git a/pkg/gui/context/list_context_trait.go b/pkg/gui/context/list_context_trait.go new file mode 100644 index 000000000..df5bbc0af --- /dev/null +++ b/pkg/gui/context/list_context_trait.go @@ -0,0 +1,64 @@ +package context + +import ( + "fmt" + + "github.com/jesseduffield/lazygit/pkg/gui/types" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +type ListContextTrait struct { + types.Context + + c *types.HelperCommon + list types.IList + getDisplayStrings func(startIdx int, length int) [][]string +} + +func (self *ListContextTrait) GetList() types.IList { + return self.list +} + +func (self *ListContextTrait) FocusLine() { + // we need a way of knowing whether we've rendered to the view yet. + self.GetViewTrait().FocusPoint(self.list.GetSelectedLineIdx()) + self.setFooter() +} + +func (self *ListContextTrait) setFooter() { + self.GetViewTrait().SetFooter(formatListFooter(self.list.GetSelectedLineIdx(), self.list.Len())) +} + +func formatListFooter(selectedLineIdx int, length int) string { + return fmt.Sprintf("%d of %d", selectedLineIdx+1, length) +} + +func (self *ListContextTrait) HandleFocus(opts types.OnFocusOpts) error { + self.FocusLine() + + self.GetViewTrait().SetHighlight(self.list.Len() > 0) + + return self.Context.HandleFocus(opts) +} + +func (self *ListContextTrait) HandleFocusLost(opts types.OnFocusLostOpts) error { + self.GetViewTrait().SetOriginX(0) + + return self.Context.HandleFocusLost(opts) +} + +// OnFocus assumes that the content of the context has already been rendered to the view. OnRender is the function which actually renders the content to the view +func (self *ListContextTrait) HandleRender() error { + self.list.RefreshSelectedIdx() + content := utils.RenderDisplayStrings(self.getDisplayStrings(0, self.list.Len())) + self.GetViewTrait().SetContent(content) + self.c.Render() + self.setFooter() + + return nil +} + +func (self *ListContextTrait) OnSearchSelect(selectedLineIdx int) error { + self.GetList().SetSelectedLineIdx(selectedLineIdx) + return self.HandleFocus(types.OnFocusOpts{}) +} diff --git a/pkg/gui/context/local_commits_context.go b/pkg/gui/context/local_commits_context.go new file mode 100644 index 000000000..462a85d59 --- /dev/null +++ b/pkg/gui/context/local_commits_context.go @@ -0,0 +1,112 @@ +package context + +import ( + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type LocalCommitsContext struct { + *LocalCommitsViewModel + *ViewportListContextTrait +} + +var _ types.IListContext = (*LocalCommitsContext)(nil) + +func NewLocalCommitsContext( + getModel func() []*models.Commit, + view *gocui.View, + getDisplayStrings func(startIdx int, length int) [][]string, + + onFocus func(types.OnFocusOpts) error, + onRenderToMain func() error, + onFocusLost func(opts types.OnFocusLostOpts) error, + + c *types.HelperCommon, +) *LocalCommitsContext { + viewModel := NewLocalCommitsViewModel(getModel, c) + + return &LocalCommitsContext{ + LocalCommitsViewModel: viewModel, + ViewportListContextTrait: &ViewportListContextTrait{ + ListContextTrait: &ListContextTrait{ + Context: NewSimpleContext(NewBaseContext(NewBaseContextOpts{ + View: view, + WindowName: "commits", + Key: LOCAL_COMMITS_CONTEXT_KEY, + Kind: types.SIDE_CONTEXT, + Focusable: true, + }), ContextCallbackOpts{ + OnFocus: onFocus, + OnFocusLost: onFocusLost, + OnRenderToMain: onRenderToMain, + }), + list: viewModel, + getDisplayStrings: getDisplayStrings, + c: c, + }, + }, + } +} + +func (self *LocalCommitsContext) GetSelectedItemId() string { + item := self.GetSelected() + if item == nil { + return "" + } + + return item.ID() +} + +type LocalCommitsViewModel struct { + *BasicViewModel[*models.Commit] + + // If this is true we limit the amount of commits we load, for the sake of keeping things fast. + // If the user attempts to scroll past the end of the list, we will load more commits. + limitCommits bool + + // If this is true we'll use git log --all when fetching the commits. + showWholeGitGraph bool +} + +func NewLocalCommitsViewModel(getModel func() []*models.Commit, c *types.HelperCommon) *LocalCommitsViewModel { + self := &LocalCommitsViewModel{ + BasicViewModel: NewBasicViewModel(getModel), + limitCommits: true, + showWholeGitGraph: c.UserConfig.Git.Log.ShowWholeGraph, + } + + return self +} + +func (self *LocalCommitsContext) CanRebase() bool { + return true +} + +func (self *LocalCommitsContext) GetSelectedRef() types.Ref { + commit := self.GetSelected() + if commit == nil { + return nil + } + return commit +} + +func (self *LocalCommitsViewModel) SetLimitCommits(value bool) { + self.limitCommits = value +} + +func (self *LocalCommitsViewModel) GetLimitCommits() bool { + return self.limitCommits +} + +func (self *LocalCommitsViewModel) SetShowWholeGitGraph(value bool) { + self.showWholeGitGraph = value +} + +func (self *LocalCommitsViewModel) GetShowWholeGitGraph() bool { + return self.showWholeGitGraph +} + +func (self *LocalCommitsViewModel) GetCommits() []*models.Commit { + return self.getModel() +} diff --git a/pkg/gui/context/menu_context.go b/pkg/gui/context/menu_context.go new file mode 100644 index 000000000..780c35660 --- /dev/null +++ b/pkg/gui/context/menu_context.go @@ -0,0 +1,128 @@ +package context + +import ( + "github.com/jesseduffield/generics/slices" + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/gui/keybindings" + "github.com/jesseduffield/lazygit/pkg/gui/style" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type MenuContext struct { + *MenuViewModel + *ListContextTrait +} + +var _ types.IListContext = (*MenuContext)(nil) + +func NewMenuContext( + view *gocui.View, + + c *types.HelperCommon, + getOptionsMap func() map[string]string, + renderToDescriptionView func(string), +) *MenuContext { + viewModel := NewMenuViewModel() + + onFocus := func(types.OnFocusOpts) error { + selectedMenuItem := viewModel.GetSelected() + renderToDescriptionView(selectedMenuItem.Tooltip) + return nil + } + + return &MenuContext{ + MenuViewModel: viewModel, + ListContextTrait: &ListContextTrait{ + Context: NewSimpleContext(NewBaseContext(NewBaseContextOpts{ + View: view, + WindowName: "menu", + Key: "menu", + Kind: types.TEMPORARY_POPUP, + OnGetOptionsMap: getOptionsMap, + Focusable: true, + HasUncontrolledBounds: true, + }), ContextCallbackOpts{ + OnFocus: onFocus, + }), + getDisplayStrings: viewModel.GetDisplayStrings, + list: viewModel, + c: c, + }, + } +} + +// TODO: remove this thing. +func (self *MenuContext) GetSelectedItemId() string { + item := self.GetSelected() + if item == nil { + return "" + } + + return item.Label +} + +type MenuViewModel struct { + menuItems []*types.MenuItem + *BasicViewModel[*types.MenuItem] +} + +func NewMenuViewModel() *MenuViewModel { + self := &MenuViewModel{ + menuItems: nil, + } + + self.BasicViewModel = NewBasicViewModel(func() []*types.MenuItem { return self.menuItems }) + + return self +} + +func (self *MenuViewModel) SetMenuItems(items []*types.MenuItem) { + self.menuItems = items +} + +// TODO: move into presentation package +func (self *MenuViewModel) GetDisplayStrings(_startIdx int, _length int) [][]string { + showKeys := slices.Some(self.menuItems, func(item *types.MenuItem) bool { + return item.Key != nil + }) + + return slices.Map(self.menuItems, func(item *types.MenuItem) []string { + displayStrings := item.LabelColumns + if showKeys { + displayStrings = slices.Prepend(displayStrings, style.FgCyan.Sprint(keybindings.LabelFromKey(item.Key))) + } + return displayStrings + }) +} + +func (self *MenuContext) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { + basicBindings := self.ListContextTrait.GetKeybindings(opts) + menuItemsWithKeys := slices.Filter(self.menuItems, func(item *types.MenuItem) bool { + return item.Key != nil + }) + + menuItemBindings := slices.Map(menuItemsWithKeys, func(item *types.MenuItem) *types.Binding { + return &types.Binding{ + Key: item.Key, + Handler: func() error { return self.OnMenuPress(item) }, + } + }) + + // appending because that means the menu item bindings have lower precedence. + // So if a basic binding is to escape from the menu, we want that to still be + // what happens when you press escape. This matters when we're showing the menu + // for all keybindings of say the files context. + return append(basicBindings, menuItemBindings...) +} + +func (self *MenuContext) OnMenuPress(selectedItem *types.MenuItem) error { + if err := self.c.PopContext(); err != nil { + return err + } + + if err := selectedItem.OnPress(); err != nil { + return err + } + + return nil +} diff --git a/pkg/gui/context/merge_conflicts_context.go b/pkg/gui/context/merge_conflicts_context.go new file mode 100644 index 000000000..4d02d452e --- /dev/null +++ b/pkg/gui/context/merge_conflicts_context.go @@ -0,0 +1,117 @@ +package context + +import ( + "math" + + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/gui/mergeconflicts" + "github.com/jesseduffield/lazygit/pkg/gui/types" + "github.com/sasha-s/go-deadlock" +) + +type MergeConflictsContext struct { + types.Context + viewModel *ConflictsViewModel + c *types.HelperCommon + mutex *deadlock.Mutex +} + +type ConflictsViewModel struct { + state *mergeconflicts.State + + // userVerticalScrolling tells us if the user has started scrolling through the file themselves + // in which case we won't auto-scroll to a conflict. + userVerticalScrolling bool +} + +func NewMergeConflictsContext( + view *gocui.View, + + opts ContextCallbackOpts, + + c *types.HelperCommon, + getOptionsMap func() map[string]string, +) *MergeConflictsContext { + viewModel := &ConflictsViewModel{ + state: mergeconflicts.NewState(), + userVerticalScrolling: false, + } + + return &MergeConflictsContext{ + viewModel: viewModel, + mutex: &deadlock.Mutex{}, + Context: NewSimpleContext( + NewBaseContext(NewBaseContextOpts{ + Kind: types.MAIN_CONTEXT, + View: view, + WindowName: "main", + Key: MERGE_CONFLICTS_CONTEXT_KEY, + OnGetOptionsMap: getOptionsMap, + Focusable: true, + }), + opts, + ), + c: c, + } +} + +func (self *MergeConflictsContext) GetState() *mergeconflicts.State { + return self.viewModel.state +} + +func (self *MergeConflictsContext) SetState(state *mergeconflicts.State) { + self.viewModel.state = state +} + +func (self *MergeConflictsContext) GetMutex() *deadlock.Mutex { + return self.mutex +} + +func (self *MergeConflictsContext) SetUserScrolling(isScrolling bool) { + self.viewModel.userVerticalScrolling = isScrolling +} + +func (self *MergeConflictsContext) IsUserScrolling() bool { + return self.viewModel.userVerticalScrolling +} + +func (self *MergeConflictsContext) RenderAndFocus(isFocused bool) error { + self.setContent(isFocused) + self.focusSelection() + + self.c.Render() + + return nil +} + +func (self *MergeConflictsContext) Render(isFocused bool) error { + self.setContent(isFocused) + + self.c.Render() + + return nil +} + +func (self *MergeConflictsContext) GetContentToRender(isFocused bool) string { + if self.GetState() == nil { + return "" + } + + return mergeconflicts.ColoredConflictFile(self.GetState(), isFocused) +} + +func (self *MergeConflictsContext) setContent(isFocused bool) { + self.GetView().SetContent(self.GetContentToRender(isFocused)) +} + +func (self *MergeConflictsContext) focusSelection() { + if !self.IsUserScrolling() { + _ = self.GetView().SetOrigin(self.GetView().OriginX(), self.GetOriginY()) + } +} + +func (self *MergeConflictsContext) GetOriginY() int { + view := self.GetView() + conflictMiddle := self.GetState().GetConflictMiddle() + return int(math.Max(0, float64(conflictMiddle-(view.Height()/2)))) +} diff --git a/pkg/gui/context/parent_context_mgr.go b/pkg/gui/context/parent_context_mgr.go new file mode 100644 index 000000000..50747a3a0 --- /dev/null +++ b/pkg/gui/context/parent_context_mgr.go @@ -0,0 +1,20 @@ +package context + +import "github.com/jesseduffield/lazygit/pkg/gui/types" + +type ParentContextMgr struct { + ParentContext types.Context + // we can't know on the calling end whether a Context is actually a nil value without reflection, so we're storing this flag here to tell us. There has got to be a better way around this + hasParent bool +} + +var _ types.ParentContexter = (*ParentContextMgr)(nil) + +func (self *ParentContextMgr) SetParentContext(context types.Context) { + self.ParentContext = context + self.hasParent = true +} + +func (self *ParentContextMgr) GetParentContext() (types.Context, bool) { + return self.ParentContext, self.hasParent +} diff --git a/pkg/gui/context/patch_explorer_context.go b/pkg/gui/context/patch_explorer_context.go new file mode 100644 index 000000000..3e13b8539 --- /dev/null +++ b/pkg/gui/context/patch_explorer_context.go @@ -0,0 +1,128 @@ +package context + +import ( + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/gui/patch_exploring" + "github.com/jesseduffield/lazygit/pkg/gui/types" + deadlock "github.com/sasha-s/go-deadlock" +) + +type PatchExplorerContext struct { + *SimpleContext + + state *patch_exploring.State + viewTrait *ViewTrait + getIncludedLineIndices func() []int + c *types.HelperCommon + mutex *deadlock.Mutex +} + +var _ types.IPatchExplorerContext = (*PatchExplorerContext)(nil) + +func NewPatchExplorerContext( + view *gocui.View, + windowName string, + key types.ContextKey, + + onFocus func(types.OnFocusOpts) error, + onFocusLost func(opts types.OnFocusLostOpts) error, + getIncludedLineIndices func() []int, + + c *types.HelperCommon, +) *PatchExplorerContext { + return &PatchExplorerContext{ + state: nil, + viewTrait: NewViewTrait(view), + c: c, + mutex: &deadlock.Mutex{}, + getIncludedLineIndices: getIncludedLineIndices, + SimpleContext: NewSimpleContext(NewBaseContext(NewBaseContextOpts{ + View: view, + WindowName: windowName, + Key: key, + Kind: types.MAIN_CONTEXT, + Focusable: true, + }), ContextCallbackOpts{ + OnFocus: onFocus, + OnFocusLost: onFocusLost, + }), + } +} + +func (self *PatchExplorerContext) GetState() *patch_exploring.State { + return self.state +} + +func (self *PatchExplorerContext) SetState(state *patch_exploring.State) { + self.state = state +} + +func (self *PatchExplorerContext) GetViewTrait() types.IViewTrait { + return self.viewTrait +} + +func (self *PatchExplorerContext) GetIncludedLineIndices() []int { + return self.getIncludedLineIndices() +} + +func (self *PatchExplorerContext) RenderAndFocus(isFocused bool) error { + self.setContent(isFocused) + + self.focusSelection() + self.c.Render() + + return nil +} + +func (self *PatchExplorerContext) Render(isFocused bool) error { + self.setContent(isFocused) + + self.c.Render() + + return nil +} + +func (self *PatchExplorerContext) Focus() error { + self.focusSelection() + self.c.Render() + + return nil +} + +func (self *PatchExplorerContext) setContent(isFocused bool) { + self.GetView().SetContent(self.GetContentToRender(isFocused)) +} + +func (self *PatchExplorerContext) focusSelection() { + view := self.GetView() + state := self.GetState() + _, viewHeight := view.Size() + bufferHeight := viewHeight - 1 + _, origin := view.Origin() + + selectedLineIdx := state.GetSelectedLineIdx() + + newOrigin := state.CalculateOrigin(origin, bufferHeight) + + _ = view.SetOriginY(newOrigin) + _ = view.SetCursor(0, selectedLineIdx-newOrigin) +} + +func (self *PatchExplorerContext) GetContentToRender(isFocused bool) string { + if self.GetState() == nil { + return "" + } + + return self.GetState().RenderForLineIndices(isFocused, self.GetIncludedLineIndices()) +} + +func (self *PatchExplorerContext) NavigateTo(isFocused bool, selectedLineIdx int) error { + self.GetState().SetLineSelectMode() + self.GetState().SelectLine(selectedLineIdx) + + return self.RenderAndFocus(isFocused) +} + +func (self *PatchExplorerContext) GetMutex() *deadlock.Mutex { + return self.mutex +} diff --git a/pkg/gui/context/reflog_commits_context.go b/pkg/gui/context/reflog_commits_context.go new file mode 100644 index 000000000..e197a50bd --- /dev/null +++ b/pkg/gui/context/reflog_commits_context.go @@ -0,0 +1,73 @@ +package context + +import ( + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type ReflogCommitsContext struct { + *BasicViewModel[*models.Commit] + *ListContextTrait +} + +var _ types.IListContext = (*ReflogCommitsContext)(nil) + +func NewReflogCommitsContext( + getModel func() []*models.Commit, + view *gocui.View, + getDisplayStrings func(startIdx int, length int) [][]string, + + onFocus func(types.OnFocusOpts) error, + onRenderToMain func() error, + onFocusLost func(opts types.OnFocusLostOpts) error, + + c *types.HelperCommon, +) *ReflogCommitsContext { + viewModel := NewBasicViewModel(getModel) + + return &ReflogCommitsContext{ + BasicViewModel: viewModel, + ListContextTrait: &ListContextTrait{ + Context: NewSimpleContext(NewBaseContext(NewBaseContextOpts{ + View: view, + WindowName: "commits", + Key: REFLOG_COMMITS_CONTEXT_KEY, + Kind: types.SIDE_CONTEXT, + Focusable: true, + }), ContextCallbackOpts{ + OnFocus: onFocus, + OnFocusLost: onFocusLost, + OnRenderToMain: onRenderToMain, + }), + list: viewModel, + getDisplayStrings: getDisplayStrings, + c: c, + }, + } +} + +func (self *ReflogCommitsContext) GetSelectedItemId() string { + item := self.GetSelected() + if item == nil { + return "" + } + + return item.ID() +} + +func (self *ReflogCommitsContext) CanRebase() bool { + return false +} + +func (self *ReflogCommitsContext) GetSelectedRef() types.Ref { + commit := self.GetSelected() + if commit == nil { + return nil + } + return commit +} + +func (self *ReflogCommitsContext) GetCommits() []*models.Commit { + return self.getModel() +} diff --git a/pkg/gui/context/remote_branches_context.go b/pkg/gui/context/remote_branches_context.go new file mode 100644 index 000000000..44dc06848 --- /dev/null +++ b/pkg/gui/context/remote_branches_context.go @@ -0,0 +1,68 @@ +package context + +import ( + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type RemoteBranchesContext struct { + *BasicViewModel[*models.RemoteBranch] + *ListContextTrait + *DynamicTitleBuilder +} + +var _ types.IListContext = (*RemoteBranchesContext)(nil) + +func NewRemoteBranchesContext( + getModel func() []*models.RemoteBranch, + view *gocui.View, + getDisplayStrings func(startIdx int, length int) [][]string, + + onFocus func(types.OnFocusOpts) error, + onRenderToMain func() error, + onFocusLost func(opts types.OnFocusLostOpts) error, + + c *types.HelperCommon, +) *RemoteBranchesContext { + viewModel := NewBasicViewModel(getModel) + + return &RemoteBranchesContext{ + BasicViewModel: viewModel, + DynamicTitleBuilder: NewDynamicTitleBuilder(c.Tr.RemoteBranchesDynamicTitle), + ListContextTrait: &ListContextTrait{ + Context: NewSimpleContext(NewBaseContext(NewBaseContextOpts{ + View: view, + WindowName: "branches", + Key: REMOTE_BRANCHES_CONTEXT_KEY, + Kind: types.SIDE_CONTEXT, + Focusable: true, + Transient: true, + }), ContextCallbackOpts{ + OnFocus: onFocus, + OnFocusLost: onFocusLost, + OnRenderToMain: onRenderToMain, + }), + list: viewModel, + getDisplayStrings: getDisplayStrings, + c: c, + }, + } +} + +func (self *RemoteBranchesContext) GetSelectedItemId() string { + item := self.GetSelected() + if item == nil { + return "" + } + + return item.ID() +} + +func (self *RemoteBranchesContext) GetSelectedRef() types.Ref { + remoteBranch := self.GetSelected() + if remoteBranch == nil { + return nil + } + return remoteBranch +} diff --git a/pkg/gui/context/remotes_context.go b/pkg/gui/context/remotes_context.go new file mode 100644 index 000000000..0f11908dd --- /dev/null +++ b/pkg/gui/context/remotes_context.go @@ -0,0 +1,57 @@ +package context + +import ( + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type RemotesContext struct { + *BasicViewModel[*models.Remote] + *ListContextTrait +} + +var _ types.IListContext = (*RemotesContext)(nil) + +func NewRemotesContext( + getModel func() []*models.Remote, + view *gocui.View, + getDisplayStrings func(startIdx int, length int) [][]string, + + onFocus func(types.OnFocusOpts) error, + onRenderToMain func() error, + onFocusLost func(opts types.OnFocusLostOpts) error, + + c *types.HelperCommon, +) *RemotesContext { + viewModel := NewBasicViewModel(getModel) + + return &RemotesContext{ + BasicViewModel: viewModel, + ListContextTrait: &ListContextTrait{ + Context: NewSimpleContext(NewBaseContext(NewBaseContextOpts{ + View: view, + WindowName: "branches", + Key: REMOTES_CONTEXT_KEY, + Kind: types.SIDE_CONTEXT, + Focusable: true, + }), ContextCallbackOpts{ + OnFocus: onFocus, + OnFocusLost: onFocusLost, + OnRenderToMain: onRenderToMain, + }), + list: viewModel, + getDisplayStrings: getDisplayStrings, + c: c, + }, + } +} + +func (self *RemotesContext) GetSelectedItemId() string { + item := self.GetSelected() + if item == nil { + return "" + } + + return item.ID() +} diff --git a/pkg/gui/context/simple_context.go b/pkg/gui/context/simple_context.go new file mode 100644 index 000000000..835576264 --- /dev/null +++ b/pkg/gui/context/simple_context.go @@ -0,0 +1,88 @@ +package context + +import ( + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type SimpleContext struct { + OnFocus func(opts types.OnFocusOpts) error + OnFocusLost func(opts types.OnFocusLostOpts) error + OnRender func() error + // this is for pushing some content to the main view + OnRenderToMain func() error + + *BaseContext +} + +type ContextCallbackOpts struct { + OnFocus func(opts types.OnFocusOpts) error + OnFocusLost func(opts types.OnFocusLostOpts) error + OnRender func() error + OnRenderToMain func() error +} + +func NewSimpleContext(baseContext *BaseContext, opts ContextCallbackOpts) *SimpleContext { + return &SimpleContext{ + OnFocus: opts.OnFocus, + OnFocusLost: opts.OnFocusLost, + OnRender: opts.OnRender, + OnRenderToMain: opts.OnRenderToMain, + BaseContext: baseContext, + } +} + +var _ types.Context = &SimpleContext{} + +// A Display context only renders a view. It has no keybindings and is not focusable. +func NewDisplayContext(key types.ContextKey, view *gocui.View, windowName string) types.Context { + return NewSimpleContext( + NewBaseContext(NewBaseContextOpts{ + Kind: types.DISPLAY_CONTEXT, + Key: key, + View: view, + WindowName: windowName, + Focusable: false, + Transient: false, + }), + ContextCallbackOpts{}, + ) +} + +func (self *SimpleContext) HandleFocus(opts types.OnFocusOpts) error { + if self.OnFocus != nil { + if err := self.OnFocus(opts); err != nil { + return err + } + } + + if self.OnRenderToMain != nil { + if err := self.OnRenderToMain(); err != nil { + return err + } + } + + return nil +} + +func (self *SimpleContext) HandleFocusLost(opts types.OnFocusLostOpts) error { + if self.OnFocusLost != nil { + return self.OnFocusLost(opts) + } + return nil +} + +func (self *SimpleContext) HandleRender() error { + if self.OnRender != nil { + return self.OnRender() + } + return nil +} + +func (self *SimpleContext) HandleRenderToMain() error { + if self.OnRenderToMain != nil { + return self.OnRenderToMain() + } + + return nil +} diff --git a/pkg/gui/context/stash_context.go b/pkg/gui/context/stash_context.go new file mode 100644 index 000000000..19eb5030a --- /dev/null +++ b/pkg/gui/context/stash_context.go @@ -0,0 +1,69 @@ +package context + +import ( + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type StashContext struct { + *BasicViewModel[*models.StashEntry] + *ListContextTrait +} + +var _ types.IListContext = (*StashContext)(nil) + +func NewStashContext( + getModel func() []*models.StashEntry, + view *gocui.View, + getDisplayStrings func(startIdx int, length int) [][]string, + + onFocus func(types.OnFocusOpts) error, + onRenderToMain func() error, + onFocusLost func(opts types.OnFocusLostOpts) error, + + c *types.HelperCommon, +) *StashContext { + viewModel := NewBasicViewModel(getModel) + + return &StashContext{ + BasicViewModel: viewModel, + ListContextTrait: &ListContextTrait{ + Context: NewSimpleContext(NewBaseContext(NewBaseContextOpts{ + View: view, + WindowName: "stash", + Key: STASH_CONTEXT_KEY, + Kind: types.SIDE_CONTEXT, + Focusable: true, + }), ContextCallbackOpts{ + OnFocus: onFocus, + OnFocusLost: onFocusLost, + OnRenderToMain: onRenderToMain, + }), + list: viewModel, + getDisplayStrings: getDisplayStrings, + c: c, + }, + } +} + +func (self *StashContext) GetSelectedItemId() string { + item := self.GetSelected() + if item == nil { + return "" + } + + return item.ID() +} + +func (self *StashContext) CanRebase() bool { + return false +} + +func (self *StashContext) GetSelectedRef() types.Ref { + stash := self.GetSelected() + if stash == nil { + return nil + } + return stash +} diff --git a/pkg/gui/context/sub_commits_context.go b/pkg/gui/context/sub_commits_context.go new file mode 100644 index 000000000..4070f0390 --- /dev/null +++ b/pkg/gui/context/sub_commits_context.go @@ -0,0 +1,98 @@ +package context + +import ( + "fmt" + + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/types" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +type SubCommitsContext struct { + *SubCommitsViewModel + *ViewportListContextTrait + *DynamicTitleBuilder +} + +var _ types.IListContext = (*SubCommitsContext)(nil) + +func NewSubCommitsContext( + getModel func() []*models.Commit, + view *gocui.View, + getDisplayStrings func(startIdx int, length int) [][]string, + + onFocus func(types.OnFocusOpts) error, + onRenderToMain func() error, + onFocusLost func(opts types.OnFocusLostOpts) error, + + c *types.HelperCommon, +) *SubCommitsContext { + viewModel := &SubCommitsViewModel{ + BasicViewModel: NewBasicViewModel(getModel), + refName: "", + } + + return &SubCommitsContext{ + SubCommitsViewModel: viewModel, + DynamicTitleBuilder: NewDynamicTitleBuilder(c.Tr.SubCommitsDynamicTitle), + ViewportListContextTrait: &ViewportListContextTrait{ + ListContextTrait: &ListContextTrait{ + Context: NewSimpleContext(NewBaseContext(NewBaseContextOpts{ + View: view, + WindowName: "branches", + Key: SUB_COMMITS_CONTEXT_KEY, + Kind: types.SIDE_CONTEXT, + Focusable: true, + Transient: true, + }), ContextCallbackOpts{ + OnFocus: onFocus, + OnFocusLost: onFocusLost, + OnRenderToMain: onRenderToMain, + }), + list: viewModel, + getDisplayStrings: getDisplayStrings, + c: c, + }, + }, + } +} + +type SubCommitsViewModel struct { + // name of the ref that the sub-commits are shown for + refName string + *BasicViewModel[*models.Commit] +} + +func (self *SubCommitsViewModel) SetRefName(refName string) { + self.refName = refName +} + +func (self *SubCommitsContext) GetSelectedItemId() string { + item := self.GetSelected() + if item == nil { + return "" + } + + return item.ID() +} + +func (self *SubCommitsContext) CanRebase() bool { + return false +} + +func (self *SubCommitsContext) GetSelectedRef() types.Ref { + commit := self.GetSelected() + if commit == nil { + return nil + } + return commit +} + +func (self *SubCommitsContext) GetCommits() []*models.Commit { + return self.getModel() +} + +func (self *SubCommitsContext) Title() string { + return fmt.Sprintf(self.c.Tr.SubCommitsDynamicTitle, utils.TruncateWithEllipsis(self.refName, 50)) +} diff --git a/pkg/gui/context/submodules_context.go b/pkg/gui/context/submodules_context.go new file mode 100644 index 000000000..5491cd137 --- /dev/null +++ b/pkg/gui/context/submodules_context.go @@ -0,0 +1,57 @@ +package context + +import ( + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type SubmodulesContext struct { + *BasicViewModel[*models.SubmoduleConfig] + *ListContextTrait +} + +var _ types.IListContext = (*SubmodulesContext)(nil) + +func NewSubmodulesContext( + getModel func() []*models.SubmoduleConfig, + view *gocui.View, + getDisplayStrings func(startIdx int, length int) [][]string, + + onFocus func(types.OnFocusOpts) error, + onRenderToMain func() error, + onFocusLost func(opts types.OnFocusLostOpts) error, + + c *types.HelperCommon, +) *SubmodulesContext { + viewModel := NewBasicViewModel(getModel) + + return &SubmodulesContext{ + BasicViewModel: viewModel, + ListContextTrait: &ListContextTrait{ + Context: NewSimpleContext(NewBaseContext(NewBaseContextOpts{ + View: view, + WindowName: "files", + Key: SUBMODULES_CONTEXT_KEY, + Kind: types.SIDE_CONTEXT, + Focusable: true, + }), ContextCallbackOpts{ + OnFocus: onFocus, + OnFocusLost: onFocusLost, + OnRenderToMain: onRenderToMain, + }), + list: viewModel, + getDisplayStrings: getDisplayStrings, + c: c, + }, + } +} + +func (self *SubmodulesContext) GetSelectedItemId() string { + item := self.GetSelected() + if item == nil { + return "" + } + + return item.ID() +} diff --git a/pkg/gui/context/suggestions_context.go b/pkg/gui/context/suggestions_context.go new file mode 100644 index 000000000..4be86244a --- /dev/null +++ b/pkg/gui/context/suggestions_context.go @@ -0,0 +1,57 @@ +package context + +import ( + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type SuggestionsContext struct { + *BasicViewModel[*types.Suggestion] + *ListContextTrait +} + +var _ types.IListContext = (*SuggestionsContext)(nil) + +func NewSuggestionsContext( + getModel func() []*types.Suggestion, + view *gocui.View, + getDisplayStrings func(startIdx int, length int) [][]string, + + onFocus func(types.OnFocusOpts) error, + onRenderToMain func() error, + onFocusLost func(opts types.OnFocusLostOpts) error, + + c *types.HelperCommon, +) *SuggestionsContext { + viewModel := NewBasicViewModel(getModel) + + return &SuggestionsContext{ + BasicViewModel: viewModel, + ListContextTrait: &ListContextTrait{ + Context: NewSimpleContext(NewBaseContext(NewBaseContextOpts{ + View: view, + WindowName: "suggestions", + Key: SUGGESTIONS_CONTEXT_KEY, + Kind: types.PERSISTENT_POPUP, + Focusable: true, + HasUncontrolledBounds: true, + }), ContextCallbackOpts{ + OnFocus: onFocus, + OnFocusLost: onFocusLost, + OnRenderToMain: onRenderToMain, + }), + list: viewModel, + getDisplayStrings: getDisplayStrings, + c: c, + }, + } +} + +func (self *SuggestionsContext) GetSelectedItemId() string { + item := self.GetSelected() + if item == nil { + return "" + } + + return item.Value +} diff --git a/pkg/gui/context/tags_context.go b/pkg/gui/context/tags_context.go new file mode 100644 index 000000000..6cb14e371 --- /dev/null +++ b/pkg/gui/context/tags_context.go @@ -0,0 +1,65 @@ +package context + +import ( + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type TagsContext struct { + *BasicViewModel[*models.Tag] + *ListContextTrait +} + +var _ types.IListContext = (*TagsContext)(nil) + +func NewTagsContext( + getModel func() []*models.Tag, + view *gocui.View, + getDisplayStrings func(startIdx int, length int) [][]string, + + onFocus func(types.OnFocusOpts) error, + onRenderToMain func() error, + onFocusLost func(opts types.OnFocusLostOpts) error, + + c *types.HelperCommon, +) *TagsContext { + viewModel := NewBasicViewModel(getModel) + + return &TagsContext{ + BasicViewModel: viewModel, + ListContextTrait: &ListContextTrait{ + Context: NewSimpleContext(NewBaseContext(NewBaseContextOpts{ + View: view, + WindowName: "branches", + Key: TAGS_CONTEXT_KEY, + Kind: types.SIDE_CONTEXT, + Focusable: true, + }), ContextCallbackOpts{ + OnFocus: onFocus, + OnFocusLost: onFocusLost, + OnRenderToMain: onRenderToMain, + }), + list: viewModel, + getDisplayStrings: getDisplayStrings, + c: c, + }, + } +} + +func (self *TagsContext) GetSelectedItemId() string { + item := self.GetSelected() + if item == nil { + return "" + } + + return item.ID() +} + +func (self *TagsContext) GetSelectedRef() types.Ref { + tag := self.GetSelected() + if tag == nil { + return nil + } + return tag +} diff --git a/pkg/gui/context/traits/list_cursor.go b/pkg/gui/context/traits/list_cursor.go new file mode 100644 index 000000000..9e86d5139 --- /dev/null +++ b/pkg/gui/context/traits/list_cursor.go @@ -0,0 +1,48 @@ +package traits + +import ( + "github.com/jesseduffield/lazygit/pkg/gui/types" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +type HasLength interface { + Len() int +} + +type ListCursor struct { + selectedIdx int + list HasLength +} + +func NewListCursor(list HasLength) *ListCursor { + return &ListCursor{selectedIdx: 0, list: list} +} + +var _ types.IListCursor = (*ListCursor)(nil) + +func (self *ListCursor) GetSelectedLineIdx() int { + return self.selectedIdx +} + +func (self *ListCursor) SetSelectedLineIdx(value int) { + clampedValue := -1 + if self.list.Len() > 0 { + clampedValue = utils.Clamp(value, 0, self.list.Len()-1) + } + + self.selectedIdx = clampedValue +} + +// moves the cursor up or down by the given amount +func (self *ListCursor) MoveSelectedLine(delta int) { + self.SetSelectedLineIdx(self.selectedIdx + delta) +} + +// to be called when the model might have shrunk so that our selection is not not out of bounds +func (self *ListCursor) RefreshSelectedIdx() { + self.SetSelectedLineIdx(self.selectedIdx) +} + +func (self *ListCursor) Len() int { + return self.list.Len() +} diff --git a/pkg/gui/context/view_trait.go b/pkg/gui/context/view_trait.go new file mode 100644 index 000000000..bf8a49e43 --- /dev/null +++ b/pkg/gui/context/view_trait.go @@ -0,0 +1,86 @@ +package context + +import ( + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +const HORIZONTAL_SCROLL_FACTOR = 3 + +type ViewTrait struct { + view *gocui.View +} + +var _ types.IViewTrait = &ViewTrait{} + +func NewViewTrait(view *gocui.View) *ViewTrait { + return &ViewTrait{view: view} +} + +func (self *ViewTrait) FocusPoint(yIdx int) { + self.view.FocusPoint(self.view.OriginX(), yIdx) +} + +func (self *ViewTrait) SetViewPortContent(content string) { + _, y := self.view.Origin() + self.view.OverwriteLines(y, content) +} + +func (self *ViewTrait) SetContent(content string) { + self.view.SetContent(content) +} + +func (self *ViewTrait) SetHighlight(highlight bool) { + self.view.Highlight = highlight +} + +func (self *ViewTrait) SetFooter(value string) { + self.view.Footer = value +} + +func (self *ViewTrait) SetOriginX(value int) { + _ = self.view.SetOriginX(value) +} + +// tells us the start of line indexes shown in the view currently as well as the capacity of lines shown in the viewport. +func (self *ViewTrait) ViewPortYBounds() (int, int) { + _, start := self.view.Origin() + length := self.view.InnerHeight() + 1 + return start, length +} + +func (self *ViewTrait) ScrollLeft() { + self.view.ScrollLeft(self.horizontalScrollAmount()) +} + +func (self *ViewTrait) ScrollRight() { + self.view.ScrollRight(self.horizontalScrollAmount()) +} + +func (self *ViewTrait) horizontalScrollAmount() int { + return self.view.InnerWidth() / HORIZONTAL_SCROLL_FACTOR +} + +func (self *ViewTrait) ScrollUp(value int) { + self.view.ScrollUp(value) +} + +func (self *ViewTrait) ScrollDown(value int) { + self.view.ScrollDown(value) +} + +// this returns the amount we'll scroll if we want to scroll by a page. +func (self *ViewTrait) PageDelta() int { + _, height := self.view.Size() + + delta := height - 1 + if delta == 0 { + return 1 + } + + return delta +} + +func (self *ViewTrait) SelectedLineIdx() int { + return self.view.SelectedLineIdx() +} diff --git a/pkg/gui/context/viewport_list_context_trait.go b/pkg/gui/context/viewport_list_context_trait.go new file mode 100644 index 000000000..b89dea832 --- /dev/null +++ b/pkg/gui/context/viewport_list_context_trait.go @@ -0,0 +1,22 @@ +package context + +import ( + "github.com/jesseduffield/lazygit/pkg/utils" +) + +// This embeds a list context trait and adds logic to re-render the viewport +// whenever a line is focused. We use this in the commits panel because different +// sections of the log graph need to be highlighted depending on the currently selected line + +type ViewportListContextTrait struct { + *ListContextTrait +} + +func (self *ViewportListContextTrait) FocusLine() { + self.ListContextTrait.FocusLine() + + startIdx, length := self.GetViewTrait().ViewPortYBounds() + displayStrings := self.ListContextTrait.getDisplayStrings(startIdx, length) + content := utils.RenderDisplayStrings(displayStrings) + self.GetViewTrait().SetViewPortContent(content) +} diff --git a/pkg/gui/context/working_tree_context.go b/pkg/gui/context/working_tree_context.go new file mode 100644 index 000000000..f8da6a068 --- /dev/null +++ b/pkg/gui/context/working_tree_context.go @@ -0,0 +1,58 @@ +package context + +import ( + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/filetree" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type WorkingTreeContext struct { + *filetree.FileTreeViewModel + *ListContextTrait +} + +var _ types.IListContext = (*WorkingTreeContext)(nil) + +func NewWorkingTreeContext( + getModel func() []*models.File, + view *gocui.View, + getDisplayStrings func(startIdx int, length int) [][]string, + + onFocus func(types.OnFocusOpts) error, + onRenderToMain func() error, + onFocusLost func(opts types.OnFocusLostOpts) error, + + c *types.HelperCommon, +) *WorkingTreeContext { + viewModel := filetree.NewFileTreeViewModel(getModel, c.Log, c.UserConfig.Gui.ShowFileTree) + + return &WorkingTreeContext{ + FileTreeViewModel: viewModel, + ListContextTrait: &ListContextTrait{ + Context: NewSimpleContext(NewBaseContext(NewBaseContextOpts{ + View: view, + WindowName: "files", + Key: FILES_CONTEXT_KEY, + Kind: types.SIDE_CONTEXT, + Focusable: true, + }), ContextCallbackOpts{ + OnFocus: onFocus, + OnFocusLost: onFocusLost, + OnRenderToMain: onRenderToMain, + }), + list: viewModel, + getDisplayStrings: getDisplayStrings, + c: c, + }, + } +} + +func (self *WorkingTreeContext) GetSelectedItemId() string { + item := self.GetSelected() + if item == nil { + return "" + } + + return item.ID() +} diff --git a/pkg/gui/context_config.go b/pkg/gui/context_config.go index f567f5a5c..7bd0ca7f8 100644 --- a/pkg/gui/context_config.go +++ b/pkg/gui/context_config.go @@ -1,282 +1,260 @@ package gui -type ContextKey string - -const ( - STATUS_CONTEXT_KEY ContextKey = "status" - FILES_CONTEXT_KEY ContextKey = "files" - LOCAL_BRANCHES_CONTEXT_KEY ContextKey = "localBranches" - REMOTES_CONTEXT_KEY ContextKey = "remotes" - REMOTE_BRANCHES_CONTEXT_KEY ContextKey = "remoteBranches" - TAGS_CONTEXT_KEY ContextKey = "tags" - BRANCH_COMMITS_CONTEXT_KEY ContextKey = "commits" - REFLOG_COMMITS_CONTEXT_KEY ContextKey = "reflogCommits" - SUB_COMMITS_CONTEXT_KEY ContextKey = "subCommits" - COMMIT_FILES_CONTEXT_KEY ContextKey = "commitFiles" - STASH_CONTEXT_KEY ContextKey = "stash" - MAIN_NORMAL_CONTEXT_KEY ContextKey = "normal" - MAIN_MERGING_CONTEXT_KEY ContextKey = "merging" - MAIN_PATCH_BUILDING_CONTEXT_KEY ContextKey = "patchBuilding" - MAIN_STAGING_CONTEXT_KEY ContextKey = "staging" - MENU_CONTEXT_KEY ContextKey = "menu" - CREDENTIALS_CONTEXT_KEY ContextKey = "credentials" - CONFIRMATION_CONTEXT_KEY ContextKey = "confirmation" - SEARCH_CONTEXT_KEY ContextKey = "search" - COMMIT_MESSAGE_CONTEXT_KEY ContextKey = "commitMessage" - SUBMODULES_CONTEXT_KEY ContextKey = "submodules" - SUGGESTIONS_CONTEXT_KEY ContextKey = "suggestions" - COMMAND_LOG_CONTEXT_KEY ContextKey = "cmdLog" +import ( + "github.com/jesseduffield/lazygit/pkg/gui/context" + "github.com/jesseduffield/lazygit/pkg/gui/types" ) -var allContextKeys = []ContextKey{ - STATUS_CONTEXT_KEY, - FILES_CONTEXT_KEY, - LOCAL_BRANCHES_CONTEXT_KEY, - REMOTES_CONTEXT_KEY, - REMOTE_BRANCHES_CONTEXT_KEY, - TAGS_CONTEXT_KEY, - BRANCH_COMMITS_CONTEXT_KEY, - REFLOG_COMMITS_CONTEXT_KEY, - SUB_COMMITS_CONTEXT_KEY, - COMMIT_FILES_CONTEXT_KEY, - STASH_CONTEXT_KEY, - MAIN_NORMAL_CONTEXT_KEY, - MAIN_MERGING_CONTEXT_KEY, - MAIN_PATCH_BUILDING_CONTEXT_KEY, - MAIN_STAGING_CONTEXT_KEY, - MENU_CONTEXT_KEY, - CREDENTIALS_CONTEXT_KEY, - CONFIRMATION_CONTEXT_KEY, - SEARCH_CONTEXT_KEY, - COMMIT_MESSAGE_CONTEXT_KEY, - SUBMODULES_CONTEXT_KEY, - SUGGESTIONS_CONTEXT_KEY, - COMMAND_LOG_CONTEXT_KEY, -} - -type ContextTree struct { - Status Context - Files IListContext - Submodules IListContext - Menu IListContext - Branches IListContext - Remotes IListContext - RemoteBranches IListContext - Tags IListContext - BranchCommits IListContext - CommitFiles IListContext - ReflogCommits IListContext - SubCommits IListContext - Stash IListContext - Suggestions IListContext - Normal Context - Staging Context - PatchBuilding Context - Merging Context - Credentials Context - Confirmation Context - CommitMessage Context - Search Context - CommandLog Context -} - -func (gui *Gui) allContexts() []Context { - return []Context{ - gui.State.Contexts.Status, - gui.State.Contexts.Files, - gui.State.Contexts.Submodules, - gui.State.Contexts.Branches, - gui.State.Contexts.Remotes, - gui.State.Contexts.RemoteBranches, - gui.State.Contexts.Tags, - gui.State.Contexts.BranchCommits, - gui.State.Contexts.CommitFiles, - gui.State.Contexts.ReflogCommits, - gui.State.Contexts.Stash, - gui.State.Contexts.Menu, - gui.State.Contexts.Confirmation, - gui.State.Contexts.Credentials, - gui.State.Contexts.CommitMessage, - gui.State.Contexts.Normal, - gui.State.Contexts.Staging, - gui.State.Contexts.Merging, - gui.State.Contexts.PatchBuilding, - gui.State.Contexts.SubCommits, - gui.State.Contexts.Suggestions, - gui.State.Contexts.CommandLog, - } -} - -func (gui *Gui) contextTree() ContextTree { - return ContextTree{ - Status: &BasicContext{ - OnRenderToMain: OnFocusWrapper(gui.statusRenderToMain), - Kind: SIDE_CONTEXT, - ViewName: "status", - Key: STATUS_CONTEXT_KEY, - }, +func (gui *Gui) contextTree() *context.ContextTree { + return &context.ContextTree{ + Global: context.NewSimpleContext( + context.NewBaseContext(context.NewBaseContextOpts{ + Kind: types.GLOBAL_CONTEXT, + View: nil, // TODO: see if this breaks anything + WindowName: "", + Key: context.GLOBAL_CONTEXT_KEY, + Focusable: false, + HasUncontrolledBounds: true, // setting to true because the global context doesn't even have a view + }), + context.ContextCallbackOpts{ + OnRenderToMain: gui.statusRenderToMain, + }, + ), + Status: context.NewSimpleContext( + context.NewBaseContext(context.NewBaseContextOpts{ + Kind: types.SIDE_CONTEXT, + View: gui.Views.Status, + WindowName: "status", + Key: context.STATUS_CONTEXT_KEY, + Focusable: true, + }), + context.ContextCallbackOpts{ + OnRenderToMain: gui.statusRenderToMain, + }, + ), Files: gui.filesListContext(), Submodules: gui.submodulesListContext(), Menu: gui.menuListContext(), Remotes: gui.remotesListContext(), RemoteBranches: gui.remoteBranchesListContext(), - BranchCommits: gui.branchCommitsListContext(), + LocalCommits: gui.branchCommitsListContext(), CommitFiles: gui.commitFilesListContext(), ReflogCommits: gui.reflogCommitsListContext(), SubCommits: gui.subCommitsListContext(), Branches: gui.branchesListContext(), Tags: gui.tagsListContext(), Stash: gui.stashListContext(), - Normal: &BasicContext{ - OnFocus: func(opts ...OnFocusOpts) error { - return nil // TODO: should we do something here? We should allow for scrolling the panel + Suggestions: gui.suggestionsListContext(), + Normal: context.NewSimpleContext( + context.NewBaseContext(context.NewBaseContextOpts{ + Kind: types.MAIN_CONTEXT, + View: gui.Views.Main, + WindowName: "main", + Key: context.NORMAL_MAIN_CONTEXT_KEY, + Focusable: false, + }), + context.ContextCallbackOpts{ + OnFocus: func(opts types.OnFocusOpts) error { + return nil // TODO: should we do something here? We should allow for scrolling the panel + }, }, - Kind: MAIN_CONTEXT, - ViewName: "main", - Key: MAIN_NORMAL_CONTEXT_KEY, - }, - Staging: &BasicContext{ - OnFocus: func(opts ...OnFocusOpts) error { - forceSecondaryFocused := false - selectedLineIdx := -1 - if len(opts) > 0 && opts[0].ClickedViewName != "" { - if opts[0].ClickedViewName == "main" || opts[0].ClickedViewName == "secondary" { - selectedLineIdx = opts[0].ClickedViewLineIdx - } - if opts[0].ClickedViewName == "secondary" { - forceSecondaryFocused = true - } - } - return gui.onStagingFocus(forceSecondaryFocused, selectedLineIdx) - }, - Kind: MAIN_CONTEXT, - ViewName: "main", - Key: MAIN_STAGING_CONTEXT_KEY, - }, - PatchBuilding: &BasicContext{ - OnFocus: func(opts ...OnFocusOpts) error { - selectedLineIdx := -1 - if len(opts) > 0 && (opts[0].ClickedViewName == "main" || opts[0].ClickedViewName == "secondary") { - selectedLineIdx = opts[0].ClickedViewLineIdx - } + ), + NormalSecondary: context.NewSimpleContext( + context.NewBaseContext(context.NewBaseContextOpts{ + Kind: types.MAIN_CONTEXT, + View: gui.Views.Secondary, + WindowName: "secondary", + Key: context.NORMAL_SECONDARY_CONTEXT_KEY, + Focusable: false, + }), + context.ContextCallbackOpts{}, + ), + Staging: context.NewPatchExplorerContext( + gui.Views.Staging, + "main", + context.STAGING_MAIN_CONTEXT_KEY, + func(opts types.OnFocusOpts) error { + gui.Views.Staging.Wrap = false + gui.Views.StagingSecondary.Wrap = false - return gui.onPatchBuildingFocus(selectedLineIdx) + return gui.refreshStagingPanel(opts) }, - Kind: MAIN_CONTEXT, - ViewName: "main", - Key: MAIN_PATCH_BUILDING_CONTEXT_KEY, - }, - Merging: &BasicContext{ - OnFocus: OnFocusWrapper(func() error { return gui.renderConflictsWithLock(true) }), - Kind: MAIN_CONTEXT, - ViewName: "main", - Key: MAIN_MERGING_CONTEXT_KEY, - OnGetOptionsMap: gui.getMergingOptions, - }, - Credentials: &BasicContext{ - OnFocus: OnFocusWrapper(gui.handleCredentialsViewFocused), - Kind: PERSISTENT_POPUP, - ViewName: "credentials", - Key: CREDENTIALS_CONTEXT_KEY, - }, - Confirmation: &BasicContext{ - Kind: TEMPORARY_POPUP, - ViewName: "confirmation", - Key: CONFIRMATION_CONTEXT_KEY, - }, - Suggestions: gui.suggestionsListContext(), - CommitMessage: &BasicContext{ - OnFocus: OnFocusWrapper(gui.handleCommitMessageFocused), - Kind: PERSISTENT_POPUP, - ViewName: "commitMessage", - Key: COMMIT_MESSAGE_CONTEXT_KEY, - }, - Search: &BasicContext{ - Kind: PERSISTENT_POPUP, - ViewName: "search", - Key: SEARCH_CONTEXT_KEY, - }, - CommandLog: &BasicContext{ - Kind: EXTRAS_CONTEXT, - ViewName: "extras", - Key: COMMAND_LOG_CONTEXT_KEY, - OnGetOptionsMap: gui.getMergingOptions, - OnFocusLost: func() error { - gui.Views.Extras.Autoscroll = true + func(opts types.OnFocusLostOpts) error { + gui.State.Contexts.Staging.SetState(nil) + + if opts.NewContextKey != context.STAGING_SECONDARY_CONTEXT_KEY { + gui.Views.Staging.Wrap = true + gui.Views.StagingSecondary.Wrap = true + _ = gui.State.Contexts.Staging.Render(false) + _ = gui.State.Contexts.StagingSecondary.Render(false) + } return nil }, - }, + func() []int { return nil }, + gui.c, + ), + StagingSecondary: context.NewPatchExplorerContext( + gui.Views.StagingSecondary, + "secondary", + context.STAGING_SECONDARY_CONTEXT_KEY, + func(opts types.OnFocusOpts) error { + gui.Views.Staging.Wrap = false + gui.Views.StagingSecondary.Wrap = false + + return gui.refreshStagingPanel(opts) + }, + func(opts types.OnFocusLostOpts) error { + gui.State.Contexts.StagingSecondary.SetState(nil) + + if opts.NewContextKey != context.STAGING_MAIN_CONTEXT_KEY { + gui.Views.Staging.Wrap = true + gui.Views.StagingSecondary.Wrap = true + _ = gui.State.Contexts.Staging.Render(false) + _ = gui.State.Contexts.StagingSecondary.Render(false) + } + return nil + }, + func() []int { return nil }, + gui.c, + ), + CustomPatchBuilder: context.NewPatchExplorerContext( + gui.Views.PatchBuilding, + "main", + context.PATCH_BUILDING_MAIN_CONTEXT_KEY, + func(opts types.OnFocusOpts) error { + // no need to change wrap on the secondary view because it can't be interacted with + gui.Views.PatchBuilding.Wrap = false + + return gui.refreshPatchBuildingPanel(opts) + }, + func(opts types.OnFocusLostOpts) error { + gui.Views.PatchBuilding.Wrap = true + + if gui.git.Patch.PatchManager.IsEmpty() { + gui.git.Patch.PatchManager.Reset() + } + + return nil + }, + func() []int { + filename := gui.State.Contexts.CommitFiles.GetSelectedPath() + includedLineIndices, err := gui.git.Patch.PatchManager.GetFileIncLineIndices(filename) + if err != nil { + gui.Log.Error(err) + return nil + } + + return includedLineIndices + }, + gui.c, + ), + CustomPatchBuilderSecondary: context.NewSimpleContext( + context.NewBaseContext(context.NewBaseContextOpts{ + Kind: types.MAIN_CONTEXT, + View: gui.Views.PatchBuildingSecondary, + WindowName: "secondary", + Key: context.PATCH_BUILDING_SECONDARY_CONTEXT_KEY, + Focusable: false, + }), + context.ContextCallbackOpts{}, + ), + MergeConflicts: context.NewMergeConflictsContext( + gui.Views.MergeConflicts, + context.ContextCallbackOpts{ + OnFocus: OnFocusWrapper(func() error { + gui.Views.MergeConflicts.Wrap = false + + return gui.refreshMergePanel(true) + }), + OnFocusLost: func(opts types.OnFocusLostOpts) error { + gui.State.Contexts.MergeConflicts.SetUserScrolling(false) + gui.State.Contexts.MergeConflicts.GetState().ResetConflictSelection() + gui.Views.MergeConflicts.Wrap = true + + return nil + }, + }, + gui.c, + func() map[string]string { + // wrapping in a function because contexts are initialized before helpers + return gui.helpers.MergeConflicts.GetMergingOptions() + }, + ), + Confirmation: context.NewSimpleContext( + context.NewBaseContext(context.NewBaseContextOpts{ + Kind: types.TEMPORARY_POPUP, + View: gui.Views.Confirmation, + WindowName: "confirmation", + Key: context.CONFIRMATION_CONTEXT_KEY, + Focusable: true, + HasUncontrolledBounds: true, + }), + context.ContextCallbackOpts{ + OnFocus: OnFocusWrapper(gui.handleAskFocused), + OnFocusLost: func(types.OnFocusLostOpts) error { + gui.deactivateConfirmationPrompt() + return nil + }, + }, + ), + CommitMessage: context.NewSimpleContext( + context.NewBaseContext(context.NewBaseContextOpts{ + Kind: types.PERSISTENT_POPUP, + View: gui.Views.CommitMessage, + WindowName: "commitMessage", + Key: context.COMMIT_MESSAGE_CONTEXT_KEY, + Focusable: true, + HasUncontrolledBounds: true, + }), + context.ContextCallbackOpts{ + OnFocus: OnFocusWrapper(gui.handleCommitMessageFocused), + }, + ), + Search: context.NewSimpleContext( + context.NewBaseContext(context.NewBaseContextOpts{ + Kind: types.PERSISTENT_POPUP, + View: gui.Views.Search, + WindowName: "search", + Key: context.SEARCH_CONTEXT_KEY, + Focusable: true, + }), + context.ContextCallbackOpts{}, + ), + CommandLog: context.NewSimpleContext( + context.NewBaseContext(context.NewBaseContextOpts{ + Kind: types.EXTRAS_CONTEXT, + View: gui.Views.Extras, + WindowName: "extras", + Key: context.COMMAND_LOG_CONTEXT_KEY, + Focusable: true, + }), + context.ContextCallbackOpts{ + OnFocusLost: func(opts types.OnFocusLostOpts) error { + gui.Views.Extras.Autoscroll = true + return nil + }, + }, + ), + Options: context.NewDisplayContext(context.OPTIONS_CONTEXT_KEY, gui.Views.Options, "options"), + AppStatus: context.NewDisplayContext(context.APP_STATUS_CONTEXT_KEY, gui.Views.AppStatus, "appStatus"), + SearchPrefix: context.NewDisplayContext(context.SEARCH_PREFIX_CONTEXT_KEY, gui.Views.SearchPrefix, "searchPrefix"), + Information: context.NewDisplayContext(context.INFORMATION_CONTEXT_KEY, gui.Views.Information, "information"), + Limit: context.NewDisplayContext(context.LIMIT_CONTEXT_KEY, gui.Views.Limit, "limit"), } } // using this wrapper for when an onFocus function doesn't care about any potential // props that could be passed -func OnFocusWrapper(f func() error) func(opts ...OnFocusOpts) error { - return func(opts ...OnFocusOpts) error { +func OnFocusWrapper(f func() error) func(opts types.OnFocusOpts) error { + return func(opts types.OnFocusOpts) error { return f() } } -func (tree ContextTree) initialViewContextMap() map[string]Context { - return map[string]Context{ - "status": tree.Status, - "files": tree.Files, - "branches": tree.Branches, - "commits": tree.BranchCommits, - "commitFiles": tree.CommitFiles, - "stash": tree.Stash, - "menu": tree.Menu, - "confirmation": tree.Confirmation, - "credentials": tree.Credentials, - "commitMessage": tree.CommitMessage, - "main": tree.Normal, - "secondary": tree.Normal, - "extras": tree.CommandLog, - } -} - -func (tree ContextTree) initialViewTabContextMap() map[string][]tabContext { - return map[string][]tabContext{ - "branches": { - { - tab: "Local Branches", - contexts: []Context{tree.Branches}, - }, - { - tab: "Remotes", - contexts: []Context{ - tree.Remotes, - tree.RemoteBranches, - }, - }, - { - tab: "Tags", - contexts: []Context{tree.Tags}, - }, - }, - "commits": { - { - tab: "Commits", - contexts: []Context{tree.BranchCommits}, - }, - { - tab: "Reflog", - contexts: []Context{ - tree.ReflogCommits, - }, - }, - }, - "files": { - { - tab: "Files", - contexts: []Context{tree.Files}, - }, - { - tab: "Submodules", - contexts: []Context{ - tree.Submodules, - }, - }, - }, +func (gui *Gui) getPatchExplorerContexts() []types.IPatchExplorerContext { + return []types.IPatchExplorerContext{ + gui.State.Contexts.Staging, + gui.State.Contexts.StagingSecondary, + gui.State.Contexts.CustomPatchBuilder, } } diff --git a/pkg/gui/context_test.go b/pkg/gui/context_test.go deleted file mode 100644 index 7f03f7484..000000000 --- a/pkg/gui/context_test.go +++ /dev/null @@ -1,40 +0,0 @@ -package gui - -import ( - "testing" - - "github.com/jesseduffield/gocui" - "github.com/stretchr/testify/assert" -) - -func TestCanDeactivatePopupContextsWithoutViews(t *testing.T) { - contexts := []func(gui *Gui) Context{ - func(gui *Gui) Context { return gui.State.Contexts.Credentials }, - func(gui *Gui) Context { return gui.State.Contexts.Confirmation }, - func(gui *Gui) Context { return gui.State.Contexts.CommitMessage }, - func(gui *Gui) Context { return gui.State.Contexts.Search }, - } - - for _, c := range contexts { - gui := NewDummyGui() - context := c(gui) - gui.g = &gocui.Gui{} - - _ = gui.deactivateContext(context) - - // This really only checks a prerequisit, not the effect of deactivateContext - view, _ := gui.g.View(context.GetViewName()) - assert.Nil(t, view, string(context.GetKey())) - } -} - -func TestCanDeactivateCommitFilesContextsWithoutViews(t *testing.T) { - gui := NewDummyGui() - gui.g = &gocui.Gui{} - - _ = gui.deactivateContext(gui.State.Contexts.CommitFiles) - - // This really only checks a prerequisite, not the effect of deactivateContext - view, _ := gui.g.View(gui.State.Contexts.CommitFiles.GetViewName()) - assert.Nil(t, view) -} diff --git a/pkg/gui/controllers.go b/pkg/gui/controllers.go new file mode 100644 index 000000000..4efb5e1ff --- /dev/null +++ b/pkg/gui/controllers.go @@ -0,0 +1,258 @@ +package gui + +import ( + "strings" + + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/controllers" + "github.com/jesseduffield/lazygit/pkg/gui/controllers/helpers" + "github.com/jesseduffield/lazygit/pkg/gui/modes/cherrypicking" + "github.com/jesseduffield/lazygit/pkg/gui/services/custom_commands" +) + +func (gui *Gui) resetControllers() { + helperCommon := gui.c + osCommand := gui.os + model := gui.State.Model + refsHelper := helpers.NewRefsHelper( + helperCommon, + gui.git, + gui.State.Contexts, + model, + ) + + rebaseHelper := helpers.NewMergeAndRebaseHelper(helperCommon, gui.State.Contexts, gui.git, refsHelper) + suggestionsHelper := helpers.NewSuggestionsHelper(helperCommon, model, gui.refreshSuggestions) + gui.helpers = &helpers.Helpers{ + Refs: refsHelper, + Host: helpers.NewHostHelper(helperCommon, gui.git), + PatchBuilding: helpers.NewPatchBuildingHelper(helperCommon, gui.git, gui.State.Contexts), + Bisect: helpers.NewBisectHelper(helperCommon, gui.git), + Suggestions: suggestionsHelper, + Files: helpers.NewFilesHelper(helperCommon, gui.git, osCommand), + WorkingTree: helpers.NewWorkingTreeHelper(helperCommon, gui.git, model), + Tags: helpers.NewTagsHelper(helperCommon, gui.git), + GPG: helpers.NewGpgHelper(helperCommon, gui.os, gui.git), + MergeAndRebase: rebaseHelper, + MergeConflicts: helpers.NewMergeConflictsHelper(helperCommon, gui.State.Contexts, gui.git), + CherryPick: helpers.NewCherryPickHelper( + helperCommon, + gui.git, + gui.State.Contexts, + func() *cherrypicking.CherryPicking { return gui.State.Modes.CherryPicking }, + rebaseHelper, + ), + Upstream: helpers.NewUpstreamHelper(helperCommon, model, suggestionsHelper.GetRemoteBranchesSuggestionsFunc), + } + + gui.CustomCommandsClient = custom_commands.NewClient( + helperCommon, + gui.os, + gui.git, + gui.State.Contexts, + gui.helpers, + ) + + common := controllers.NewControllerCommon( + helperCommon, + osCommand, + gui.git, + gui.helpers, + model, + gui.State.Contexts, + gui.State.Modes, + &gui.Mutexes, + ) + + syncController := controllers.NewSyncController( + common, + ) + + submodulesController := controllers.NewSubmodulesController( + common, + gui.enterSubmodule, + ) + + bisectController := controllers.NewBisectController(common) + + getSavedCommitMessage := func() string { + return gui.State.savedCommitMessage + } + + getCommitMessage := func() string { + return strings.TrimSpace(gui.Views.CommitMessage.TextArea.GetContent()) + } + + setCommitMessage := gui.getSetTextareaTextFn(func() *gocui.View { return gui.Views.CommitMessage }) + + onCommitAttempt := func(message string) { + gui.State.savedCommitMessage = message + gui.Views.CommitMessage.ClearTextArea() + } + + onCommitSuccess := func() { + gui.State.savedCommitMessage = "" + } + + commitMessageController := controllers.NewCommitMessageController( + common, + getCommitMessage, + onCommitAttempt, + onCommitSuccess, + ) + + remoteBranchesController := controllers.NewRemoteBranchesController(common) + + menuController := controllers.NewMenuController(common) + localCommitsController := controllers.NewLocalCommitsController(common, syncController.HandlePull) + tagsController := controllers.NewTagsController(common) + filesController := controllers.NewFilesController( + common, + gui.enterSubmodule, + setCommitMessage, + getSavedCommitMessage, + ) + mergeConflictsController := controllers.NewMergeConflictsController(common) + remotesController := controllers.NewRemotesController( + common, + func(branches []*models.RemoteBranch) { gui.State.Model.RemoteBranches = branches }, + ) + undoController := controllers.NewUndoController(common) + globalController := controllers.NewGlobalController(common) + contextLinesController := controllers.NewContextLinesController(common) + verticalScrollControllerFactory := controllers.NewVerticalScrollControllerFactory(common) + + branchesController := controllers.NewBranchesController(common) + gitFlowController := controllers.NewGitFlowController(common) + filesRemoveController := controllers.NewFilesRemoveController(common) + stashController := controllers.NewStashController(common) + commitFilesController := controllers.NewCommitFilesController(common) + patchExplorerControllerFactory := controllers.NewPatchExplorerControllerFactory(common) + stagingController := controllers.NewStagingController(common, gui.State.Contexts.Staging, gui.State.Contexts.StagingSecondary, false) + stagingSecondaryController := controllers.NewStagingController(common, gui.State.Contexts.StagingSecondary, gui.State.Contexts.Staging, true) + patchBuildingController := controllers.NewPatchBuildingController(common) + + setSubCommits := func(commits []*models.Commit) { gui.State.Model.SubCommits = commits } + + for _, context := range []controllers.CanSwitchToSubCommits{ + gui.State.Contexts.Branches, + gui.State.Contexts.RemoteBranches, + gui.State.Contexts.Tags, + gui.State.Contexts.ReflogCommits, + } { + controllers.AttachControllers(context, controllers.NewSwitchToSubCommitsController( + common, setSubCommits, context, + )) + } + + for _, context := range []controllers.CanSwitchToDiffFiles{ + gui.State.Contexts.LocalCommits, + gui.State.Contexts.SubCommits, + gui.State.Contexts.Stash, + } { + controllers.AttachControllers(context, controllers.NewSwitchToDiffFilesController( + common, gui.SwitchToCommitFilesContext, context, + )) + } + + for _, context := range []controllers.ContainsCommits{ + gui.State.Contexts.LocalCommits, + gui.State.Contexts.ReflogCommits, + gui.State.Contexts.SubCommits, + } { + controllers.AttachControllers(context, controllers.NewBasicCommitsController(common, context)) + } + + // TODO: add scroll controllers for main panels (need to bring some more functionality across for that e.g. reading more from the currently displayed git command) + controllers.AttachControllers(gui.State.Contexts.Staging, + stagingController, + patchExplorerControllerFactory.Create(gui.State.Contexts.Staging), + verticalScrollControllerFactory.Create(gui.State.Contexts.Staging), + ) + + controllers.AttachControllers(gui.State.Contexts.StagingSecondary, + stagingSecondaryController, + patchExplorerControllerFactory.Create(gui.State.Contexts.StagingSecondary), + verticalScrollControllerFactory.Create(gui.State.Contexts.StagingSecondary), + ) + + controllers.AttachControllers(gui.State.Contexts.CustomPatchBuilder, + patchBuildingController, + patchExplorerControllerFactory.Create(gui.State.Contexts.CustomPatchBuilder), + verticalScrollControllerFactory.Create(gui.State.Contexts.CustomPatchBuilder), + ) + + controllers.AttachControllers(gui.State.Contexts.CustomPatchBuilderSecondary, + verticalScrollControllerFactory.Create(gui.State.Contexts.CustomPatchBuilder), + ) + + controllers.AttachControllers(gui.State.Contexts.MergeConflicts, + mergeConflictsController, + ) + + controllers.AttachControllers(gui.State.Contexts.Files, + filesController, + filesRemoveController, + ) + + controllers.AttachControllers(gui.State.Contexts.Tags, + tagsController, + ) + + controllers.AttachControllers(gui.State.Contexts.Submodules, + submodulesController, + ) + + controllers.AttachControllers(gui.State.Contexts.LocalCommits, + localCommitsController, + bisectController, + ) + + controllers.AttachControllers(gui.State.Contexts.Branches, + branchesController, + gitFlowController, + ) + + controllers.AttachControllers(gui.State.Contexts.LocalCommits, + localCommitsController, + bisectController, + ) + + controllers.AttachControllers(gui.State.Contexts.CommitFiles, + commitFilesController, + ) + + controllers.AttachControllers(gui.State.Contexts.Remotes, + remotesController, + ) + + controllers.AttachControllers(gui.State.Contexts.Stash, + stashController, + ) + + controllers.AttachControllers(gui.State.Contexts.Menu, + menuController, + ) + + controllers.AttachControllers(gui.State.Contexts.CommitMessage, + commitMessageController, + ) + + controllers.AttachControllers(gui.State.Contexts.RemoteBranches, + remoteBranchesController, + ) + + controllers.AttachControllers(gui.State.Contexts.Global, + syncController, + undoController, + globalController, + contextLinesController, + ) + + // this must come last so that we've got our click handlers defined against the context + listControllerFactory := controllers.NewListControllerFactory(gui.c) + for _, context := range gui.getListContexts() { + controllers.AttachControllers(context, listControllerFactory.Create(context)) + } +} diff --git a/pkg/gui/controllers/attach.go b/pkg/gui/controllers/attach.go new file mode 100644 index 000000000..3e621c54c --- /dev/null +++ b/pkg/gui/controllers/attach.go @@ -0,0 +1,11 @@ +package controllers + +import "github.com/jesseduffield/lazygit/pkg/gui/types" + +func AttachControllers(context types.Context, controllers ...types.IController) { + for _, controller := range controllers { + context.AddKeybindingsFn(controller.GetKeybindings) + context.AddMouseKeybindingsFn(controller.GetMouseKeybindings) + context.AddOnClickFn(controller.GetOnClick()) + } +} diff --git a/pkg/gui/controllers/base_controller.go b/pkg/gui/controllers/base_controller.go new file mode 100644 index 000000000..db7ad7a40 --- /dev/null +++ b/pkg/gui/controllers/base_controller.go @@ -0,0 +1,20 @@ +package controllers + +import ( + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type baseController struct{} + +func (self *baseController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { + return nil +} + +func (self *baseController) GetMouseKeybindings(opts types.KeybindingsOpts) []*gocui.ViewMouseBinding { + return nil +} + +func (self *baseController) GetOnClick() func() error { + return nil +} diff --git a/pkg/gui/controllers/basic_commits_controller.go b/pkg/gui/controllers/basic_commits_controller.go new file mode 100644 index 000000000..cecba00fe --- /dev/null +++ b/pkg/gui/controllers/basic_commits_controller.go @@ -0,0 +1,253 @@ +package controllers + +import ( + "fmt" + + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +// This controller is for all contexts that contain a list of commits. + +var _ types.IController = &BasicCommitsController{} + +type ContainsCommits interface { + types.Context + GetSelected() *models.Commit + GetCommits() []*models.Commit + GetSelectedLineIdx() int +} + +type BasicCommitsController struct { + baseController + *controllerCommon + context ContainsCommits +} + +func NewBasicCommitsController(controllerCommon *controllerCommon, context ContainsCommits) *BasicCommitsController { + return &BasicCommitsController{ + baseController: baseController{}, + controllerCommon: controllerCommon, + context: context, + } +} + +func (self *BasicCommitsController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { + bindings := []*types.Binding{ + { + Key: opts.GetKey(opts.Config.Commits.CheckoutCommit), + Handler: self.checkSelected(self.checkout), + Description: self.c.Tr.LcCheckoutCommit, + }, + { + Key: opts.GetKey(opts.Config.Commits.CopyCommitAttributeToClipboard), + Handler: self.checkSelected(self.copyCommitAttribute), + Description: self.c.Tr.LcCopyCommitAttributeToClipboard, + OpensMenu: true, + }, + { + Key: opts.GetKey(opts.Config.Commits.OpenInBrowser), + Handler: self.checkSelected(self.openInBrowser), + Description: self.c.Tr.LcOpenCommitInBrowser, + }, + { + Key: opts.GetKey(opts.Config.Universal.New), + Handler: self.checkSelected(self.newBranch), + Description: self.c.Tr.LcCreateNewBranchFromCommit, + }, + { + Key: opts.GetKey(opts.Config.Commits.ViewResetOptions), + Handler: self.checkSelected(self.createResetMenu), + Description: self.c.Tr.LcViewResetOptions, + OpensMenu: true, + }, + { + Key: opts.GetKey(opts.Config.Commits.CherryPickCopy), + Handler: self.checkSelected(self.copy), + Description: self.c.Tr.LcCherryPickCopy, + }, + { + Key: opts.GetKey(opts.Config.Commits.CherryPickCopyRange), + Handler: self.checkSelected(self.copyRange), + Description: self.c.Tr.LcCherryPickCopyRange, + }, + { + Key: opts.GetKey(opts.Config.Commits.ResetCherryPick), + Handler: self.helpers.CherryPick.Reset, + Description: self.c.Tr.LcResetCherryPick, + }, + } + + return bindings +} + +func (self *BasicCommitsController) checkSelected(callback func(*models.Commit) error) func() error { + return func() error { + commit := self.context.GetSelected() + if commit == nil { + return nil + } + + return callback(commit) + } +} + +func (self *BasicCommitsController) Context() types.Context { + return self.context +} + +func (self *BasicCommitsController) copyCommitAttribute(commit *models.Commit) error { + return self.c.Menu(types.CreateMenuOptions{ + Title: self.c.Tr.Actions.CopyCommitAttributeToClipboard, + Items: []*types.MenuItem{ + { + Label: self.c.Tr.LcCommitSha, + OnPress: func() error { + return self.copyCommitSHAToClipboard(commit) + }, + Key: 's', + }, + { + Label: self.c.Tr.LcCommitURL, + OnPress: func() error { + return self.copyCommitURLToClipboard(commit) + }, + Key: 'u', + }, + { + Label: self.c.Tr.LcCommitDiff, + OnPress: func() error { + return self.copyCommitDiffToClipboard(commit) + }, + Key: 'd', + }, + { + Label: self.c.Tr.LcCommitMessage, + OnPress: func() error { + return self.copyCommitMessageToClipboard(commit) + }, + Key: 'm', + }, + { + Label: self.c.Tr.LcCommitAuthor, + OnPress: func() error { + return self.copyAuthorToClipboard(commit) + }, + Key: 'a', + }, + }, + }) +} + +func (self *BasicCommitsController) copyCommitSHAToClipboard(commit *models.Commit) error { + self.c.LogAction(self.c.Tr.Actions.CopyCommitSHAToClipboard) + if err := self.os.CopyToClipboard(commit.Sha); err != nil { + return self.c.Error(err) + } + + self.c.Toast(self.c.Tr.CommitSHACopiedToClipboard) + return nil +} + +func (self *BasicCommitsController) copyCommitURLToClipboard(commit *models.Commit) error { + url, err := self.helpers.Host.GetCommitURL(commit.Sha) + if err != nil { + return err + } + + self.c.LogAction(self.c.Tr.Actions.CopyCommitURLToClipboard) + if err := self.os.CopyToClipboard(url); err != nil { + return self.c.Error(err) + } + + self.c.Toast(self.c.Tr.CommitURLCopiedToClipboard) + return nil +} + +func (self *BasicCommitsController) copyCommitDiffToClipboard(commit *models.Commit) error { + diff, err := self.git.Commit.GetCommitDiff(commit.Sha) + if err != nil { + return self.c.Error(err) + } + + self.c.LogAction(self.c.Tr.Actions.CopyCommitDiffToClipboard) + if err := self.os.CopyToClipboard(diff); err != nil { + return self.c.Error(err) + } + + self.c.Toast(self.c.Tr.CommitDiffCopiedToClipboard) + return nil +} + +func (self *BasicCommitsController) copyAuthorToClipboard(commit *models.Commit) error { + author, err := self.git.Commit.GetCommitAuthor(commit.Sha) + if err != nil { + return self.c.Error(err) + } + + formattedAuthor := fmt.Sprintf("%s <%s>", author.Name, author.Email) + + self.c.LogAction(self.c.Tr.Actions.CopyCommitAuthorToClipboard) + if err := self.os.CopyToClipboard(formattedAuthor); err != nil { + return self.c.Error(err) + } + + self.c.Toast(self.c.Tr.CommitAuthorCopiedToClipboard) + return nil +} + +func (self *BasicCommitsController) copyCommitMessageToClipboard(commit *models.Commit) error { + message, err := self.git.Commit.GetCommitMessage(commit.Sha) + if err != nil { + return self.c.Error(err) + } + + self.c.LogAction(self.c.Tr.Actions.CopyCommitMessageToClipboard) + if err := self.os.CopyToClipboard(message); err != nil { + return self.c.Error(err) + } + + self.c.Toast(self.c.Tr.CommitMessageCopiedToClipboard) + return nil +} + +func (self *BasicCommitsController) openInBrowser(commit *models.Commit) error { + url, err := self.helpers.Host.GetCommitURL(commit.Sha) + if err != nil { + return self.c.Error(err) + } + + self.c.LogAction(self.c.Tr.Actions.OpenCommitInBrowser) + if err := self.os.OpenLink(url); err != nil { + return self.c.Error(err) + } + + return nil +} + +func (self *BasicCommitsController) newBranch(commit *models.Commit) error { + return self.helpers.Refs.NewBranch(commit.RefName(), commit.Description(), "") +} + +func (self *BasicCommitsController) createResetMenu(commit *models.Commit) error { + return self.helpers.Refs.CreateGitResetMenu(commit.Sha) +} + +func (self *BasicCommitsController) checkout(commit *models.Commit) error { + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.LcCheckoutCommit, + Prompt: self.c.Tr.SureCheckoutThisCommit, + HandleConfirm: func() error { + self.c.LogAction(self.c.Tr.Actions.CheckoutCommit) + return self.helpers.Refs.CheckoutRef(commit.Sha, types.CheckoutRefOptions{}) + }, + }) +} + +func (self *BasicCommitsController) copy(commit *models.Commit) error { + return self.helpers.CherryPick.Copy(commit, self.context.GetCommits(), self.context) +} + +func (self *BasicCommitsController) copyRange(*models.Commit) error { + return self.helpers.CherryPick.CopyRange(self.context.GetSelectedLineIdx(), self.context.GetCommits(), self.context) +} diff --git a/pkg/gui/controllers/bisect_controller.go b/pkg/gui/controllers/bisect_controller.go new file mode 100644 index 000000000..083b6dce8 --- /dev/null +++ b/pkg/gui/controllers/bisect_controller.go @@ -0,0 +1,249 @@ +package controllers + +import ( + "fmt" + "strings" + + "github.com/jesseduffield/lazygit/pkg/commands/git_commands" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/context" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type BisectController struct { + baseController + *controllerCommon +} + +var _ types.IController = &BisectController{} + +func NewBisectController( + common *controllerCommon, +) *BisectController { + return &BisectController{ + baseController: baseController{}, + controllerCommon: common, + } +} + +func (self *BisectController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { + bindings := []*types.Binding{ + { + Key: opts.GetKey(opts.Config.Commits.ViewBisectOptions), + Handler: opts.Guards.OutsideFilterMode(self.checkSelected(self.openMenu)), + Description: self.c.Tr.LcViewBisectOptions, + OpensMenu: true, + }, + } + + return bindings +} + +func (self *BisectController) openMenu(commit *models.Commit) error { + // no shame in getting this directly rather than using the cached value + // given how cheap it is to obtain + info := self.git.Bisect.GetInfo() + if info.Started() { + return self.openMidBisectMenu(info, commit) + } else { + return self.openStartBisectMenu(info, commit) + } +} + +func (self *BisectController) openMidBisectMenu(info *git_commands.BisectInfo, commit *models.Commit) error { + // if there is not yet a 'current' bisect commit, or if we have + // selected the current commit, we need to jump to the next 'current' commit + // after we perform a bisect action. The reason we don't unconditionally jump + // is that sometimes the user will want to go and mark a few commits as skipped + // in a row and they wouldn't want to be jumped back to the current bisect + // commit each time. + // Originally we were allowing the user to, from the bisect menu, select whether + // they were talking about the selected commit or the current bisect commit, + // and that was a bit confusing (and required extra keypresses). + selectCurrentAfter := info.GetCurrentSha() == "" || info.GetCurrentSha() == commit.Sha + // we need to wait to reselect if our bisect commits aren't ancestors of our 'start' + // ref, because we'll be reloading our commits in that case. + waitToReselect := selectCurrentAfter && !self.git.Bisect.ReachableFromStart(info) + + menuItems := []*types.MenuItem{ + { + Label: fmt.Sprintf(self.c.Tr.Bisect.Mark, commit.ShortSha(), info.NewTerm()), + OnPress: func() error { + self.c.LogAction(self.c.Tr.Actions.BisectMark) + if err := self.git.Bisect.Mark(commit.Sha, info.NewTerm()); err != nil { + return self.c.Error(err) + } + + return self.afterMark(selectCurrentAfter, waitToReselect) + }, + Key: 'b', + }, + { + Label: fmt.Sprintf(self.c.Tr.Bisect.Mark, commit.ShortSha(), info.OldTerm()), + OnPress: func() error { + self.c.LogAction(self.c.Tr.Actions.BisectMark) + if err := self.git.Bisect.Mark(commit.Sha, info.OldTerm()); err != nil { + return self.c.Error(err) + } + + return self.afterMark(selectCurrentAfter, waitToReselect) + }, + Key: 'g', + }, + { + Label: fmt.Sprintf(self.c.Tr.Bisect.Skip, commit.ShortSha()), + OnPress: func() error { + self.c.LogAction(self.c.Tr.Actions.BisectSkip) + if err := self.git.Bisect.Skip(commit.Sha); err != nil { + return self.c.Error(err) + } + + return self.afterMark(selectCurrentAfter, waitToReselect) + }, + Key: 's', + }, + { + Label: self.c.Tr.Bisect.ResetOption, + OnPress: func() error { + return self.helpers.Bisect.Reset() + }, + Key: 'r', + }, + } + + return self.c.Menu(types.CreateMenuOptions{ + Title: self.c.Tr.Bisect.BisectMenuTitle, + Items: menuItems, + }) +} + +func (self *BisectController) openStartBisectMenu(info *git_commands.BisectInfo, commit *models.Commit) error { + return self.c.Menu(types.CreateMenuOptions{ + Title: self.c.Tr.Bisect.BisectMenuTitle, + Items: []*types.MenuItem{ + { + Label: fmt.Sprintf(self.c.Tr.Bisect.MarkStart, commit.ShortSha(), info.NewTerm()), + OnPress: func() error { + self.c.LogAction(self.c.Tr.Actions.StartBisect) + if err := self.git.Bisect.Start(); err != nil { + return self.c.Error(err) + } + + if err := self.git.Bisect.Mark(commit.Sha, info.NewTerm()); err != nil { + return self.c.Error(err) + } + + return self.helpers.Bisect.PostBisectCommandRefresh() + }, + Key: 'b', + }, + { + Label: fmt.Sprintf(self.c.Tr.Bisect.MarkStart, commit.ShortSha(), info.OldTerm()), + OnPress: func() error { + self.c.LogAction(self.c.Tr.Actions.StartBisect) + if err := self.git.Bisect.Start(); err != nil { + return self.c.Error(err) + } + + if err := self.git.Bisect.Mark(commit.Sha, info.OldTerm()); err != nil { + return self.c.Error(err) + } + + return self.helpers.Bisect.PostBisectCommandRefresh() + }, + Key: 'g', + }, + }, + }) +} + +func (self *BisectController) showBisectCompleteMessage(candidateShas []string) error { + prompt := self.c.Tr.Bisect.CompletePrompt + if len(candidateShas) > 1 { + prompt = self.c.Tr.Bisect.CompletePromptIndeterminate + } + + formattedCommits, err := self.git.Commit.GetCommitsOneline(candidateShas) + if err != nil { + return self.c.Error(err) + } + + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.Bisect.CompleteTitle, + Prompt: fmt.Sprintf(prompt, strings.TrimSpace(formattedCommits)), + HandleConfirm: func() error { + self.c.LogAction(self.c.Tr.Actions.ResetBisect) + if err := self.git.Bisect.Reset(); err != nil { + return self.c.Error(err) + } + + return self.helpers.Bisect.PostBisectCommandRefresh() + }, + }) +} + +func (self *BisectController) afterMark(selectCurrent bool, waitToReselect bool) error { + done, candidateShas, err := self.git.Bisect.IsDone() + if err != nil { + return self.c.Error(err) + } + + if err := self.afterBisectMarkRefresh(selectCurrent, waitToReselect); err != nil { + return self.c.Error(err) + } + + if done { + return self.showBisectCompleteMessage(candidateShas) + } + + return nil +} + +func (self *BisectController) afterBisectMarkRefresh(selectCurrent bool, waitToReselect bool) error { + selectFn := func() { + if selectCurrent { + self.selectCurrentBisectCommit() + } + } + + if waitToReselect { + return self.c.Refresh(types.RefreshOptions{Mode: types.SYNC, Scope: []types.RefreshableView{}, Then: selectFn}) + } else { + selectFn() + + return self.helpers.Bisect.PostBisectCommandRefresh() + } +} + +func (self *BisectController) selectCurrentBisectCommit() { + info := self.git.Bisect.GetInfo() + if info.GetCurrentSha() != "" { + // find index of commit with that sha, move cursor to that. + for i, commit := range self.model.Commits { + if commit.Sha == info.GetCurrentSha() { + self.context().SetSelectedLineIdx(i) + _ = self.context().HandleFocus(types.OnFocusOpts{}) + break + } + } + } +} + +func (self *BisectController) checkSelected(callback func(*models.Commit) error) func() error { + return func() error { + commit := self.context().GetSelected() + if commit == nil { + return nil + } + + return callback(commit) + } +} + +func (self *BisectController) Context() types.Context { + return self.context() +} + +func (self *BisectController) context() *context.LocalCommitsContext { + return self.contexts.LocalCommits +} diff --git a/pkg/gui/controllers/branches_controller.go b/pkg/gui/controllers/branches_controller.go new file mode 100644 index 000000000..b049a0a0b --- /dev/null +++ b/pkg/gui/controllers/branches_controller.go @@ -0,0 +1,499 @@ +package controllers + +import ( + "errors" + "fmt" + "strings" + + "github.com/jesseduffield/lazygit/pkg/commands/git_commands" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/context" + "github.com/jesseduffield/lazygit/pkg/gui/types" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +type BranchesController struct { + baseController + *controllerCommon +} + +var _ types.IController = &BranchesController{} + +func NewBranchesController( + common *controllerCommon, +) *BranchesController { + return &BranchesController{ + baseController: baseController{}, + controllerCommon: common, + } +} + +func (self *BranchesController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { + return []*types.Binding{ + { + Key: opts.GetKey(opts.Config.Universal.Select), + Handler: self.checkSelected(self.press), + Description: self.c.Tr.LcCheckout, + }, + { + Key: opts.GetKey(opts.Config.Universal.New), + Handler: self.checkSelected(self.newBranch), + Description: self.c.Tr.LcNewBranch, + }, + { + Key: opts.GetKey(opts.Config.Branches.CreatePullRequest), + Handler: self.checkSelected(self.handleCreatePullRequest), + Description: self.c.Tr.LcCreatePullRequest, + }, + { + Key: opts.GetKey(opts.Config.Branches.ViewPullRequestOptions), + Handler: self.checkSelected(self.handleCreatePullRequestMenu), + Description: self.c.Tr.LcCreatePullRequestOptions, + OpensMenu: true, + }, + { + Key: opts.GetKey(opts.Config.Branches.CopyPullRequestURL), + Handler: self.copyPullRequestURL, + Description: self.c.Tr.LcCopyPullRequestURL, + }, + { + Key: opts.GetKey(opts.Config.Branches.CheckoutBranchByName), + Handler: self.checkoutByName, + Description: self.c.Tr.LcCheckoutByName, + }, + { + Key: opts.GetKey(opts.Config.Branches.ForceCheckoutBranch), + Handler: self.forceCheckout, + Description: self.c.Tr.LcForceCheckout, + }, + { + Key: opts.GetKey(opts.Config.Universal.Remove), + Handler: self.checkSelectedAndReal(self.delete), + Description: self.c.Tr.LcDeleteBranch, + }, + { + Key: opts.GetKey(opts.Config.Branches.RebaseBranch), + Handler: opts.Guards.OutsideFilterMode(self.rebase), + Description: self.c.Tr.LcRebaseBranch, + }, + { + Key: opts.GetKey(opts.Config.Branches.MergeIntoCurrentBranch), + Handler: opts.Guards.OutsideFilterMode(self.merge), + Description: self.c.Tr.LcMergeIntoCurrentBranch, + }, + { + Key: opts.GetKey(opts.Config.Branches.FastForward), + Handler: self.checkSelectedAndReal(self.fastForward), + Description: self.c.Tr.FastForward, + }, + { + Key: opts.GetKey(opts.Config.Commits.ViewResetOptions), + Handler: self.checkSelected(self.createResetMenu), + Description: self.c.Tr.LcViewResetOptions, + OpensMenu: true, + }, + { + Key: opts.GetKey(opts.Config.Branches.RenameBranch), + Handler: self.checkSelectedAndReal(self.rename), + Description: self.c.Tr.LcRenameBranch, + }, + { + Key: opts.GetKey(opts.Config.Branches.SetUpstream), + Handler: self.checkSelected(self.setUpstream), + Description: self.c.Tr.LcSetUnsetUpstream, + OpensMenu: true, + }, + } +} + +func (self *BranchesController) setUpstream(selectedBranch *models.Branch) error { + return self.c.Menu(types.CreateMenuOptions{ + Title: self.c.Tr.Actions.SetUnsetUpstream, + Items: []*types.MenuItem{ + { + LabelColumns: []string{self.c.Tr.LcUnsetUpstream}, + OnPress: func() error { + if err := self.git.Branch.UnsetUpstream(selectedBranch.Name); err != nil { + return self.c.Error(err) + } + if err := self.c.Refresh(types.RefreshOptions{ + Mode: types.SYNC, + Scope: []types.RefreshableView{ + types.BRANCHES, + types.COMMITS, + }, + }); err != nil { + return self.c.Error(err) + } + return nil + }, + Key: 'u', + }, + { + LabelColumns: []string{self.c.Tr.LcSetUpstream}, + OnPress: func() error { + return self.helpers.Upstream.PromptForUpstreamWithoutInitialContent(selectedBranch, func(upstream string) error { + upstreamRemote, upstreamBranch, err := self.helpers.Upstream.ParseUpstream(upstream) + if err != nil { + return self.c.Error(err) + } + + if err := self.git.Branch.SetUpstream(upstreamRemote, upstreamBranch, selectedBranch.Name); err != nil { + return self.c.Error(err) + } + if err := self.c.Refresh(types.RefreshOptions{ + Mode: types.SYNC, + Scope: []types.RefreshableView{ + types.BRANCHES, + types.COMMITS, + }, + }); err != nil { + return self.c.Error(err) + } + return nil + }) + }, + Key: 's', + }, + }, + }) +} + +func (self *BranchesController) Context() types.Context { + return self.context() +} + +func (self *BranchesController) context() *context.BranchesContext { + return self.contexts.Branches +} + +func (self *BranchesController) press(selectedBranch *models.Branch) error { + if selectedBranch == self.helpers.Refs.GetCheckedOutRef() { + return self.c.ErrorMsg(self.c.Tr.AlreadyCheckedOutBranch) + } + + self.c.LogAction(self.c.Tr.Actions.CheckoutBranch) + return self.helpers.Refs.CheckoutRef(selectedBranch.Name, types.CheckoutRefOptions{}) +} + +func (self *BranchesController) handleCreatePullRequest(selectedBranch *models.Branch) error { + return self.createPullRequest(selectedBranch.Name, "") +} + +func (self *BranchesController) handleCreatePullRequestMenu(selectedBranch *models.Branch) error { + checkedOutBranch := self.helpers.Refs.GetCheckedOutRef() + + return self.createPullRequestMenu(selectedBranch, checkedOutBranch) +} + +func (self *BranchesController) copyPullRequestURL() error { + branch := self.context().GetSelected() + + branchExistsOnRemote := self.git.Remote.CheckRemoteBranchExists(branch.Name) + + if !branchExistsOnRemote { + return self.c.Error(errors.New(self.c.Tr.NoBranchOnRemote)) + } + + url, err := self.helpers.Host.GetPullRequestURL(branch.Name, "") + if err != nil { + return self.c.Error(err) + } + self.c.LogAction(self.c.Tr.Actions.CopyPullRequestURL) + if err := self.os.CopyToClipboard(url); err != nil { + return self.c.Error(err) + } + + self.c.Toast(self.c.Tr.PullRequestURLCopiedToClipboard) + + return nil +} + +func (self *BranchesController) forceCheckout() error { + branch := self.context().GetSelected() + message := self.c.Tr.SureForceCheckout + title := self.c.Tr.ForceCheckoutBranch + + return self.c.Confirm(types.ConfirmOpts{ + Title: title, + Prompt: message, + HandleConfirm: func() error { + self.c.LogAction(self.c.Tr.Actions.ForceCheckoutBranch) + if err := self.git.Branch.Checkout(branch.Name, git_commands.CheckoutOptions{Force: true}); err != nil { + _ = self.c.Error(err) + } + return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}) + }, + }) +} + +func (self *BranchesController) checkoutByName() error { + return self.c.Prompt(types.PromptOpts{ + Title: self.c.Tr.BranchName + ":", + FindSuggestionsFunc: self.helpers.Suggestions.GetRefsSuggestionsFunc(), + HandleConfirm: func(response string) error { + self.c.LogAction("Checkout branch") + return self.helpers.Refs.CheckoutRef(response, types.CheckoutRefOptions{ + OnRefNotFound: func(ref string) error { + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.BranchNotFoundTitle, + Prompt: fmt.Sprintf("%s %s%s", self.c.Tr.BranchNotFoundPrompt, ref, "?"), + HandleConfirm: func() error { + return self.createNewBranchWithName(ref) + }, + }) + }, + }) + }, + }, + ) +} + +func (self *BranchesController) createNewBranchWithName(newBranchName string) error { + branch := self.context().GetSelected() + if branch == nil { + return nil + } + + if err := self.git.Branch.New(newBranchName, branch.Name); err != nil { + return self.c.Error(err) + } + + self.context().SetSelectedLineIdx(0) + return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}) +} + +func (self *BranchesController) delete(branch *models.Branch) error { + checkedOutBranch := self.helpers.Refs.GetCheckedOutRef() + if checkedOutBranch.Name == branch.Name { + return self.c.ErrorMsg(self.c.Tr.CantDeleteCheckOutBranch) + } + return self.deleteWithForce(branch, false) +} + +func (self *BranchesController) deleteWithForce(selectedBranch *models.Branch, force bool) error { + title := self.c.Tr.DeleteBranch + var templateStr string + if force { + templateStr = self.c.Tr.ForceDeleteBranchMessage + } else { + templateStr = self.c.Tr.DeleteBranchMessage + } + message := utils.ResolvePlaceholderString( + templateStr, + map[string]string{ + "selectedBranchName": selectedBranch.Name, + }, + ) + + return self.c.Confirm(types.ConfirmOpts{ + Title: title, + Prompt: message, + HandleConfirm: func() error { + self.c.LogAction(self.c.Tr.Actions.DeleteBranch) + if err := self.git.Branch.Delete(selectedBranch.Name, force); err != nil { + errMessage := err.Error() + if !force && strings.Contains(errMessage, "git branch -D ") { + return self.deleteWithForce(selectedBranch, true) + } + return self.c.ErrorMsg(errMessage) + } + return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.BRANCHES}}) + }, + }) +} + +func (self *BranchesController) merge() error { + selectedBranchName := self.context().GetSelected().Name + return self.helpers.MergeAndRebase.MergeRefIntoCheckedOutBranch(selectedBranchName) +} + +func (self *BranchesController) rebase() error { + selectedBranchName := self.context().GetSelected().Name + return self.helpers.MergeAndRebase.RebaseOntoRef(selectedBranchName) +} + +func (self *BranchesController) fastForward(branch *models.Branch) error { + if !branch.IsTrackingRemote() { + return self.c.ErrorMsg(self.c.Tr.FwdNoUpstream) + } + if !branch.RemoteBranchStoredLocally() { + return self.c.ErrorMsg(self.c.Tr.FwdNoLocalUpstream) + } + if branch.HasCommitsToPush() { + return self.c.ErrorMsg(self.c.Tr.FwdCommitsToPush) + } + + action := self.c.Tr.Actions.FastForwardBranch + + message := utils.ResolvePlaceholderString( + self.c.Tr.Fetching, + map[string]string{ + "from": fmt.Sprintf("%s/%s", branch.UpstreamRemote, branch.UpstreamBranch), + "to": branch.Name, + }, + ) + + return self.c.WithLoaderPanel(message, func() error { + if branch == self.helpers.Refs.GetCheckedOutRef() { + self.c.LogAction(action) + + err := self.git.Sync.Pull( + git_commands.PullOptions{ + RemoteName: branch.UpstreamRemote, + BranchName: branch.UpstreamBranch, + FastForwardOnly: true, + }, + ) + if err != nil { + _ = self.c.Error(err) + } + + return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}) + } else { + self.c.LogAction(action) + err := self.git.Sync.FastForward(branch.Name, branch.UpstreamRemote, branch.UpstreamBranch) + if err != nil { + _ = self.c.Error(err) + } + _ = self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.BRANCHES}}) + } + + return nil + }) +} + +func (self *BranchesController) createResetMenu(selectedBranch *models.Branch) error { + return self.helpers.Refs.CreateGitResetMenu(selectedBranch.Name) +} + +func (self *BranchesController) rename(branch *models.Branch) error { + promptForNewName := func() error { + return self.c.Prompt(types.PromptOpts{ + Title: self.c.Tr.NewBranchNamePrompt + " " + branch.Name + ":", + InitialContent: branch.Name, + HandleConfirm: func(newBranchName string) error { + self.c.LogAction(self.c.Tr.Actions.RenameBranch) + if err := self.git.Branch.Rename(branch.Name, newBranchName); err != nil { + return self.c.Error(err) + } + + // need to find where the branch is now so that we can re-select it. That means we need to refetch the branches synchronously and then find our branch + _ = self.c.Refresh(types.RefreshOptions{Mode: types.SYNC, Scope: []types.RefreshableView{types.BRANCHES}}) + + // now that we've got our stuff again we need to find that branch and reselect it. + for i, newBranch := range self.model.Branches { + if newBranch.Name == newBranchName { + self.context().SetSelectedLineIdx(i) + if err := self.context().HandleRender(); err != nil { + return err + } + } + } + + return nil + }, + }) + } + + // I could do an explicit check here for whether the branch is tracking a remote branch + // but if we've selected it we'll already know that via Pullables and Pullables. + // Bit of a hack but I'm lazy. + if !branch.IsTrackingRemote() { + return promptForNewName() + } + + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.LcRenameBranch, + Prompt: self.c.Tr.RenameBranchWarning, + HandleConfirm: promptForNewName, + }) +} + +func (self *BranchesController) newBranch(selectedBranch *models.Branch) error { + return self.helpers.Refs.NewBranch(selectedBranch.RefName(), selectedBranch.RefName(), "") +} + +func (self *BranchesController) createPullRequestMenu(selectedBranch *models.Branch, checkedOutBranch *models.Branch) error { + menuItems := make([]*types.MenuItem, 0, 4) + + fromToLabelColumns := func(from string, to string) []string { + return []string{fmt.Sprintf("%s → %s", from, to)} + } + + menuItemsForBranch := func(branch *models.Branch) []*types.MenuItem { + return []*types.MenuItem{ + { + LabelColumns: fromToLabelColumns(branch.Name, self.c.Tr.LcDefaultBranch), + OnPress: func() error { + return self.createPullRequest(branch.Name, "") + }, + }, + { + LabelColumns: fromToLabelColumns(branch.Name, self.c.Tr.LcSelectBranch), + OnPress: func() error { + return self.c.Prompt(types.PromptOpts{ + Title: branch.Name + " →", + FindSuggestionsFunc: self.helpers.Suggestions.GetBranchNameSuggestionsFunc(), + HandleConfirm: func(targetBranchName string) error { + return self.createPullRequest(branch.Name, targetBranchName) + }, + }) + }, + }, + } + } + + if selectedBranch != checkedOutBranch { + menuItems = append(menuItems, + &types.MenuItem{ + LabelColumns: fromToLabelColumns(checkedOutBranch.Name, selectedBranch.Name), + OnPress: func() error { + return self.createPullRequest(checkedOutBranch.Name, selectedBranch.Name) + }, + }, + ) + menuItems = append(menuItems, menuItemsForBranch(checkedOutBranch)...) + } + + menuItems = append(menuItems, menuItemsForBranch(selectedBranch)...) + + return self.c.Menu(types.CreateMenuOptions{Title: fmt.Sprintf(self.c.Tr.CreatePullRequestOptions), Items: menuItems}) +} + +func (self *BranchesController) createPullRequest(from string, to string) error { + url, err := self.helpers.Host.GetPullRequestURL(from, to) + if err != nil { + return self.c.Error(err) + } + + self.c.LogAction(self.c.Tr.Actions.OpenPullRequest) + + if err := self.os.OpenLink(url); err != nil { + return self.c.Error(err) + } + + return nil +} + +func (self *BranchesController) checkSelected(callback func(*models.Branch) error) func() error { + return func() error { + selectedItem := self.context().GetSelected() + if selectedItem == nil { + return nil + } + + return callback(selectedItem) + } +} + +func (self *BranchesController) checkSelectedAndReal(callback func(*models.Branch) error) func() error { + return func() error { + selectedItem := self.context().GetSelected() + if selectedItem == nil || !selectedItem.IsRealBranch() { + return nil + } + + return callback(selectedItem) + } +} diff --git a/pkg/gui/controllers/commit_message_controller.go b/pkg/gui/controllers/commit_message_controller.go new file mode 100644 index 000000000..e5cdb866d --- /dev/null +++ b/pkg/gui/controllers/commit_message_controller.go @@ -0,0 +1,79 @@ +package controllers + +import ( + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type CommitMessageController struct { + baseController + *controllerCommon + + getCommitMessage func() string + onCommitAttempt func(message string) + onCommitSuccess func() +} + +var _ types.IController = &CommitMessageController{} + +func NewCommitMessageController( + common *controllerCommon, + getCommitMessage func() string, + onCommitAttempt func(message string), + onCommitSuccess func(), +) *CommitMessageController { + return &CommitMessageController{ + baseController: baseController{}, + controllerCommon: common, + + getCommitMessage: getCommitMessage, + onCommitAttempt: onCommitAttempt, + onCommitSuccess: onCommitSuccess, + } +} + +func (self *CommitMessageController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { + bindings := []*types.Binding{ + { + Key: opts.GetKey(opts.Config.Universal.SubmitEditorText), + Handler: self.confirm, + }, + { + Key: opts.GetKey(opts.Config.Universal.Return), + Handler: self.close, + }, + } + + return bindings +} + +func (self *CommitMessageController) Context() types.Context { + return self.context() +} + +// this method is pointless in this context but I'm keeping it consistent +// with other contexts so that when generics arrive it's easier to refactor +func (self *CommitMessageController) context() types.Context { + return self.contexts.CommitMessage +} + +func (self *CommitMessageController) confirm() error { + message := self.getCommitMessage() + self.onCommitAttempt(message) + + if message == "" { + return self.c.ErrorMsg(self.c.Tr.CommitWithoutMessageErr) + } + + cmdObj := self.git.Commit.CommitCmdObj(message) + self.c.LogAction(self.c.Tr.Actions.Commit) + + _ = self.c.PopContext() + return self.helpers.GPG.WithGpgHandling(cmdObj, self.c.Tr.CommittingStatus, func() error { + self.onCommitSuccess() + return nil + }) +} + +func (self *CommitMessageController) close() error { + return self.c.PopContext() +} diff --git a/pkg/gui/controllers/commits_files_controller.go b/pkg/gui/controllers/commits_files_controller.go new file mode 100644 index 000000000..f11005cd4 --- /dev/null +++ b/pkg/gui/controllers/commits_files_controller.go @@ -0,0 +1,270 @@ +package controllers + +import ( + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/commands/patch" + "github.com/jesseduffield/lazygit/pkg/gui/context" + "github.com/jesseduffield/lazygit/pkg/gui/filetree" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type CommitFilesController struct { + baseController + *controllerCommon +} + +var _ types.IController = &CommitFilesController{} + +func NewCommitFilesController( + common *controllerCommon, +) *CommitFilesController { + return &CommitFilesController{ + baseController: baseController{}, + controllerCommon: common, + } +} + +func (self *CommitFilesController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { + bindings := []*types.Binding{ + { + Key: opts.GetKey(opts.Config.CommitFiles.CheckoutCommitFile), + Handler: self.checkSelected(self.checkout), + Description: self.c.Tr.LcCheckoutCommitFile, + }, + { + Key: opts.GetKey(opts.Config.Universal.Remove), + Handler: self.checkSelected(self.discard), + Description: self.c.Tr.LcDiscardOldFileChange, + }, + { + Key: opts.GetKey(opts.Config.Universal.OpenFile), + Handler: self.checkSelected(self.open), + Description: self.c.Tr.LcOpenFile, + }, + { + Key: opts.GetKey(opts.Config.Universal.Edit), + Handler: self.checkSelected(self.edit), + Description: self.c.Tr.LcEditFile, + }, + { + Key: opts.GetKey(opts.Config.Universal.Select), + Handler: self.checkSelected(self.toggleForPatch), + Description: self.c.Tr.LcToggleAddToPatch, + }, + { + Key: opts.GetKey(opts.Config.Files.ToggleStagedAll), + Handler: self.checkSelected(self.toggleAllForPatch), + Description: self.c.Tr.LcToggleAllInPatch, + }, + { + Key: opts.GetKey(opts.Config.Universal.GoInto), + Handler: self.checkSelected(self.enter), + Description: self.c.Tr.LcEnterFile, + }, + { + Key: opts.GetKey(opts.Config.Files.ToggleTreeView), + Handler: self.toggleTreeView, + Description: self.c.Tr.LcToggleTreeView, + }, + } + + return bindings +} + +func (self *CommitFilesController) GetMouseKeybindings(opts types.KeybindingsOpts) []*gocui.ViewMouseBinding { + return []*gocui.ViewMouseBinding{ + { + ViewName: "patchBuilding", + Key: gocui.MouseLeft, + Handler: self.onClickMain, + FocusedView: self.context().GetViewName(), + }, + } +} + +func (self *CommitFilesController) checkSelected(callback func(*filetree.CommitFileNode) error) func() error { + return func() error { + selected := self.context().GetSelected() + if selected == nil { + return nil + } + + return callback(selected) + } +} + +func (self *CommitFilesController) Context() types.Context { + return self.context() +} + +func (self *CommitFilesController) context() *context.CommitFilesContext { + return self.contexts.CommitFiles +} + +func (self *CommitFilesController) onClickMain(opts gocui.ViewMouseBindingOpts) error { + node := self.context().GetSelected() + if node == nil { + return nil + } + return self.enterCommitFile(node, types.OnFocusOpts{ClickedWindowName: "main", ClickedViewLineIdx: opts.Y}) +} + +func (self *CommitFilesController) checkout(node *filetree.CommitFileNode) error { + self.c.LogAction(self.c.Tr.Actions.CheckoutFile) + if err := self.git.WorkingTree.CheckoutFile(self.context().GetRef().RefName(), node.GetPath()); err != nil { + return self.c.Error(err) + } + + return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}) +} + +func (self *CommitFilesController) discard(node *filetree.CommitFileNode) error { + if ok, err := self.helpers.PatchBuilding.ValidateNormalWorkingTreeState(); !ok { + return err + } + + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.DiscardFileChangesTitle, + Prompt: self.c.Tr.DiscardFileChangesPrompt, + HandleConfirm: func() error { + return self.c.WithWaitingStatus(self.c.Tr.RebasingStatus, func() error { + self.c.LogAction(self.c.Tr.Actions.DiscardOldFileChange) + if err := self.git.Rebase.DiscardOldFileChanges(self.model.Commits, self.contexts.LocalCommits.GetSelectedLineIdx(), node.GetPath()); err != nil { + if err := self.helpers.MergeAndRebase.CheckMergeOrRebase(err); err != nil { + return err + } + } + + return self.c.Refresh(types.RefreshOptions{Mode: types.BLOCK_UI}) + }) + }, + }) +} + +func (self *CommitFilesController) open(node *filetree.CommitFileNode) error { + return self.helpers.Files.OpenFile(node.GetPath()) +} + +func (self *CommitFilesController) edit(node *filetree.CommitFileNode) error { + if node.File == nil { + return self.c.ErrorMsg(self.c.Tr.ErrCannotEditDirectory) + } + + return self.helpers.Files.EditFile(node.GetPath()) +} + +func (self *CommitFilesController) toggleForPatch(node *filetree.CommitFileNode) error { + toggle := func() error { + return self.c.WithWaitingStatus(self.c.Tr.LcUpdatingPatch, func() error { + if !self.git.Patch.PatchManager.Active() { + if err := self.startPatchManager(); err != nil { + return err + } + } + + // if there is any file that hasn't been fully added we'll fully add everything, + // otherwise we'll remove everything + adding := node.SomeFile(func(file *models.CommitFile) bool { + return self.git.Patch.PatchManager.GetFileStatus(file.Name, self.context().GetRef().RefName()) != patch.WHOLE + }) + + err := node.ForEachFile(func(file *models.CommitFile) error { + if adding { + return self.git.Patch.PatchManager.AddFileWhole(file.Name) + } else { + return self.git.Patch.PatchManager.RemoveFile(file.Name) + } + }) + if err != nil { + return self.c.Error(err) + } + + if self.git.Patch.PatchManager.IsEmpty() { + self.git.Patch.PatchManager.Reset() + } + + return self.c.PostRefreshUpdate(self.context()) + }) + } + + if self.git.Patch.PatchManager.Active() && self.git.Patch.PatchManager.To != self.context().GetRef().RefName() { + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.DiscardPatch, + Prompt: self.c.Tr.DiscardPatchConfirm, + HandleConfirm: func() error { + self.git.Patch.PatchManager.Reset() + return toggle() + }, + }) + } + + return toggle() +} + +func (self *CommitFilesController) toggleAllForPatch(_ *filetree.CommitFileNode) error { + root := self.context().CommitFileTreeViewModel.GetRoot() + return self.toggleForPatch(root) +} + +func (self *CommitFilesController) startPatchManager() error { + commitFilesContext := self.context() + + canRebase := commitFilesContext.GetCanRebase() + ref := commitFilesContext.GetRef() + to := ref.RefName() + from, reverse := self.modes.Diffing.GetFromAndReverseArgsForDiff(ref.ParentRefName()) + + self.git.Patch.PatchManager.Start(from, to, reverse, canRebase) + return nil +} + +func (self *CommitFilesController) enter(node *filetree.CommitFileNode) error { + return self.enterCommitFile(node, types.OnFocusOpts{ClickedWindowName: "", ClickedViewLineIdx: -1}) +} + +func (self *CommitFilesController) enterCommitFile(node *filetree.CommitFileNode, opts types.OnFocusOpts) error { + if node.File == nil { + return self.handleToggleCommitFileDirCollapsed(node) + } + + enterTheFile := func() error { + if !self.git.Patch.PatchManager.Active() { + if err := self.startPatchManager(); err != nil { + return err + } + } + + return self.c.PushContext(self.contexts.CustomPatchBuilder, opts) + } + + if self.git.Patch.PatchManager.Active() && self.git.Patch.PatchManager.To != self.context().GetRef().RefName() { + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.DiscardPatch, + Prompt: self.c.Tr.DiscardPatchConfirm, + HandleConfirm: func() error { + self.git.Patch.PatchManager.Reset() + return enterTheFile() + }, + }) + } + + return enterTheFile() +} + +func (self *CommitFilesController) handleToggleCommitFileDirCollapsed(node *filetree.CommitFileNode) error { + self.context().CommitFileTreeViewModel.ToggleCollapsed(node.GetPath()) + + if err := self.c.PostRefreshUpdate(self.context()); err != nil { + self.c.Log.Error(err) + } + + return nil +} + +// NOTE: this is very similar to handleToggleFileTreeView, could be DRY'd with generics +func (self *CommitFilesController) toggleTreeView() error { + self.context().CommitFileTreeViewModel.ToggleShowTree() + + return self.c.PostRefreshUpdate(self.context()) +} diff --git a/pkg/gui/controllers/common.go b/pkg/gui/controllers/common.go new file mode 100644 index 000000000..12a3788fd --- /dev/null +++ b/pkg/gui/controllers/common.go @@ -0,0 +1,42 @@ +package controllers + +import ( + "github.com/jesseduffield/lazygit/pkg/commands" + "github.com/jesseduffield/lazygit/pkg/commands/oscommands" + "github.com/jesseduffield/lazygit/pkg/gui/context" + "github.com/jesseduffield/lazygit/pkg/gui/controllers/helpers" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type controllerCommon struct { + c *types.HelperCommon + os *oscommands.OSCommand + git *commands.GitCommand + helpers *helpers.Helpers + model *types.Model + contexts *context.ContextTree + modes *types.Modes + mutexes *types.Mutexes +} + +func NewControllerCommon( + c *types.HelperCommon, + os *oscommands.OSCommand, + git *commands.GitCommand, + helpers *helpers.Helpers, + model *types.Model, + contexts *context.ContextTree, + modes *types.Modes, + mutexes *types.Mutexes, +) *controllerCommon { + return &controllerCommon{ + c: c, + os: os, + git: git, + helpers: helpers, + model: model, + contexts: contexts, + modes: modes, + mutexes: mutexes, + } +} diff --git a/pkg/gui/controllers/context_lines_controller.go b/pkg/gui/controllers/context_lines_controller.go new file mode 100644 index 000000000..c90bd9c9f --- /dev/null +++ b/pkg/gui/controllers/context_lines_controller.go @@ -0,0 +1,116 @@ +package controllers + +import ( + "errors" + + "github.com/jesseduffield/lazygit/pkg/gui/context" + "github.com/jesseduffield/lazygit/pkg/gui/types" + "github.com/samber/lo" +) + +// This controller lets you change the context size for diffs. The 'context' in 'context size' refers to the conventional meaning of the word 'context' in a diff, as opposed to lazygit's own idea of a 'context'. + +var CONTEXT_KEYS_SHOWING_DIFFS = []types.ContextKey{ + context.FILES_CONTEXT_KEY, + context.COMMIT_FILES_CONTEXT_KEY, + context.STASH_CONTEXT_KEY, + context.LOCAL_COMMITS_CONTEXT_KEY, + context.SUB_COMMITS_CONTEXT_KEY, + context.STAGING_MAIN_CONTEXT_KEY, + context.STAGING_SECONDARY_CONTEXT_KEY, + context.PATCH_BUILDING_MAIN_CONTEXT_KEY, + context.PATCH_BUILDING_SECONDARY_CONTEXT_KEY, +} + +type ContextLinesController struct { + baseController + *controllerCommon +} + +var _ types.IController = &ContextLinesController{} + +func NewContextLinesController( + common *controllerCommon, +) *ContextLinesController { + return &ContextLinesController{ + baseController: baseController{}, + controllerCommon: common, + } +} + +func (self *ContextLinesController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { + bindings := []*types.Binding{ + { + Key: opts.GetKey(opts.Config.Universal.IncreaseContextInDiffView), + Handler: self.Increase, + Description: self.c.Tr.IncreaseContextInDiffView, + }, + { + Key: opts.GetKey(opts.Config.Universal.DecreaseContextInDiffView), + Handler: self.Decrease, + Description: self.c.Tr.DecreaseContextInDiffView, + }, + } + + return bindings +} + +func (self *ContextLinesController) Context() types.Context { + return nil +} + +func (self *ContextLinesController) Increase() error { + if self.isShowingDiff() { + if err := self.checkCanChangeContext(); err != nil { + return self.c.Error(err) + } + + self.c.UserConfig.Git.DiffContextSize = self.c.UserConfig.Git.DiffContextSize + 1 + return self.applyChange() + } + + return nil +} + +func (self *ContextLinesController) Decrease() error { + old_size := self.c.UserConfig.Git.DiffContextSize + + if self.isShowingDiff() && old_size > 1 { + if err := self.checkCanChangeContext(); err != nil { + return self.c.Error(err) + } + + self.c.UserConfig.Git.DiffContextSize = old_size - 1 + return self.applyChange() + } + + return nil +} + +func (self *ContextLinesController) applyChange() error { + currentContext := self.c.CurrentStaticContext() + switch currentContext.GetKey() { + // we make an exception for our staging and patch building contexts because they actually need to refresh their state afterwards. + case context.PATCH_BUILDING_MAIN_CONTEXT_KEY: + return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.PATCH_BUILDING}}) + case context.STAGING_MAIN_CONTEXT_KEY, context.STAGING_SECONDARY_CONTEXT_KEY: + return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.STAGING}}) + default: + return currentContext.HandleRenderToMain() + } +} + +func (self *ContextLinesController) checkCanChangeContext() error { + if self.git.Patch.PatchManager.Active() { + return errors.New(self.c.Tr.CantChangeContextSizeError) + } + + return nil +} + +func (self *ContextLinesController) isShowingDiff() bool { + return lo.Contains( + CONTEXT_KEYS_SHOWING_DIFFS, + self.c.CurrentStaticContext().GetKey(), + ) +} diff --git a/pkg/gui/controllers/files_controller.go b/pkg/gui/controllers/files_controller.go new file mode 100644 index 000000000..8f0b8333f --- /dev/null +++ b/pkg/gui/controllers/files_controller.go @@ -0,0 +1,874 @@ +package controllers + +import ( + "fmt" + "regexp" + "strings" + + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/commands/git_commands" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/config" + "github.com/jesseduffield/lazygit/pkg/gui/context" + "github.com/jesseduffield/lazygit/pkg/gui/filetree" + "github.com/jesseduffield/lazygit/pkg/gui/types" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +type FilesController struct { + baseController + *controllerCommon + + enterSubmodule func(submodule *models.SubmoduleConfig) error + setCommitMessage func(message string) + getSavedCommitMessage func() string +} + +var _ types.IController = &FilesController{} + +func NewFilesController( + common *controllerCommon, + enterSubmodule func(submodule *models.SubmoduleConfig) error, + setCommitMessage func(message string), + getSavedCommitMessage func() string, +) *FilesController { + return &FilesController{ + controllerCommon: common, + enterSubmodule: enterSubmodule, + setCommitMessage: setCommitMessage, + getSavedCommitMessage: getSavedCommitMessage, + } +} + +func (self *FilesController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { + return []*types.Binding{ + { + Key: opts.GetKey(opts.Config.Universal.Select), + Handler: self.checkSelectedFileNode(self.press), + Description: self.c.Tr.LcToggleStaged, + }, + { + Key: opts.GetKey(opts.Config.Files.OpenStatusFilter), + Handler: self.handleStatusFilterPressed, + Description: self.c.Tr.LcFileFilter, + }, + { + Key: opts.GetKey(opts.Config.Files.CommitChanges), + Handler: self.HandleCommitPress, + Description: self.c.Tr.CommitChanges, + }, + { + Key: opts.GetKey(opts.Config.Files.CommitChangesWithoutHook), + Handler: self.HandleWIPCommitPress, + Description: self.c.Tr.LcCommitChangesWithoutHook, + }, + { + Key: opts.GetKey(opts.Config.Files.AmendLastCommit), + Handler: self.handleAmendCommitPress, + Description: self.c.Tr.AmendLastCommit, + }, + { + Key: opts.GetKey(opts.Config.Files.CommitChangesWithEditor), + Handler: self.HandleCommitEditorPress, + Description: self.c.Tr.CommitChangesWithEditor, + }, + { + Key: opts.GetKey(opts.Config.Universal.Edit), + Handler: self.checkSelectedFileNode(self.edit), + Description: self.c.Tr.LcEditFile, + }, + { + Key: opts.GetKey(opts.Config.Universal.OpenFile), + Handler: self.Open, + Description: self.c.Tr.LcOpenFile, + }, + { + Key: opts.GetKey(opts.Config.Files.IgnoreOrExcludeFile), + Handler: self.checkSelectedFileNode(self.ignoreOrExcludeMenu), + Description: self.c.Tr.Actions.LcIgnoreExcludeFile, + OpensMenu: true, + }, + { + Key: opts.GetKey(opts.Config.Files.RefreshFiles), + Handler: self.refresh, + Description: self.c.Tr.LcRefreshFiles, + }, + { + Key: opts.GetKey(opts.Config.Files.StashAllChanges), + Handler: self.stash, + Description: self.c.Tr.LcStashAllChanges, + }, + { + Key: opts.GetKey(opts.Config.Files.ViewStashOptions), + Handler: self.createStashMenu, + Description: self.c.Tr.LcViewStashOptions, + OpensMenu: true, + }, + { + Key: opts.GetKey(opts.Config.Files.ToggleStagedAll), + Handler: self.toggleStagedAll, + Description: self.c.Tr.LcToggleStagedAll, + }, + { + Key: opts.GetKey(opts.Config.Universal.GoInto), + Handler: self.enter, + Description: self.c.Tr.FileEnter, + }, + { + Key: opts.GetKey(opts.Config.Commits.ViewResetOptions), + Handler: self.createResetToUpstreamMenu, + Description: self.c.Tr.LcViewResetToUpstreamOptions, + OpensMenu: true, + }, + { + Key: opts.GetKey(opts.Config.Files.ViewResetOptions), + Handler: self.createResetMenu, + Description: self.c.Tr.LcViewResetOptions, + OpensMenu: true, + }, + { + Key: opts.GetKey(opts.Config.Files.ToggleTreeView), + Handler: self.toggleTreeView, + Description: self.c.Tr.LcToggleTreeView, + }, + { + Key: opts.GetKey(opts.Config.Files.OpenMergeTool), + Handler: self.helpers.WorkingTree.OpenMergeTool, + Description: self.c.Tr.LcOpenMergeTool, + }, + { + Key: opts.GetKey(opts.Config.Files.Fetch), + Handler: self.fetch, + Description: self.c.Tr.LcFetch, + }, + } +} + +func (self *FilesController) GetMouseKeybindings(opts types.KeybindingsOpts) []*gocui.ViewMouseBinding { + return []*gocui.ViewMouseBinding{ + { + ViewName: "main", + Key: gocui.MouseLeft, + Handler: self.onClickMain, + FocusedView: self.context().GetViewName(), + }, + { + ViewName: "patchBuilding", + Key: gocui.MouseLeft, + Handler: self.onClickMain, + FocusedView: self.context().GetViewName(), + }, + { + ViewName: "mergeConflicts", + Key: gocui.MouseLeft, + Handler: self.onClickMain, + FocusedView: self.context().GetViewName(), + }, + { + ViewName: "secondary", + Key: gocui.MouseLeft, + Handler: self.onClickSecondary, + FocusedView: self.context().GetViewName(), + }, + { + ViewName: "patchBuildingSecondary", + Key: gocui.MouseLeft, + Handler: self.onClickSecondary, + FocusedView: self.context().GetViewName(), + }, + } +} + +func (self *FilesController) GetOnClick() func() error { + return self.checkSelectedFileNode(self.press) +} + +// if we are dealing with a status for which there is no key in this map, +// then we won't optimistically render: we'll just let `git status` tell +// us what the new status is. +// There are no doubt more entries that could be added to these two maps. +var stageStatusMap = map[string]string{ + "??": "A ", + " M": "M ", + "MM": "M ", + " D": "D ", + " A": "A ", + "AM": "A ", + "MD": "D ", +} + +var unstageStatusMap = map[string]string{ + "A ": "??", + "M ": " M", + "D ": " D", +} + +func (self *FilesController) optimisticStage(file *models.File) bool { + newShortStatus, ok := stageStatusMap[file.ShortStatus] + if !ok { + return false + } + + models.SetStatusFields(file, newShortStatus) + return true +} + +func (self *FilesController) optimisticUnstage(file *models.File) bool { + newShortStatus, ok := unstageStatusMap[file.ShortStatus] + if !ok { + return false + } + + models.SetStatusFields(file, newShortStatus) + return true +} + +// Running a git add command followed by a git status command can take some time (e.g. 200ms). +// Given how often users stage/unstage files in Lazygit, we're adding some +// optimistic rendering to make things feel faster. When we go to stage +// a file, we'll first update that file's status in-memory, then re-render +// the files panel. Then we'll immediately do a proper git status call +// so that if the optimistic rendering got something wrong, it's quickly +// corrected. +func (self *FilesController) optimisticChange(node *filetree.FileNode, optimisticChangeFn func(*models.File) bool) error { + rerender := false + err := node.ForEachFile(func(f *models.File) error { + // can't act on the file itself: we need to update the original model file + for _, modelFile := range self.model.Files { + if modelFile.Name == f.Name { + if optimisticChangeFn(modelFile) { + rerender = true + } + break + } + } + + return nil + }) + if err != nil { + return err + } + if rerender { + if err := self.c.PostRefreshUpdate(self.contexts.Files); err != nil { + return err + } + } + + return nil +} + +func (self *FilesController) pressWithLock(node *filetree.FileNode) error { + // Obtaining this lock because optimistic rendering requires us to mutate + // the files in our model. + self.mutexes.RefreshingFilesMutex.Lock() + defer self.mutexes.RefreshingFilesMutex.Unlock() + + if node.IsFile() { + file := node.File + + if file.HasUnstagedChanges { + self.c.LogAction(self.c.Tr.Actions.StageFile) + + if err := self.optimisticChange(node, self.optimisticStage); err != nil { + return err + } + + if err := self.git.WorkingTree.StageFile(file.Name); err != nil { + return self.c.Error(err) + } + } else { + self.c.LogAction(self.c.Tr.Actions.UnstageFile) + + if err := self.optimisticChange(node, self.optimisticUnstage); err != nil { + return err + } + + if err := self.git.WorkingTree.UnStageFile(file.Names(), file.Tracked); err != nil { + return self.c.Error(err) + } + } + } else { + // if any files within have inline merge conflicts we can't stage or unstage, + // or it'll end up with those >>>>>> lines actually staged + if node.GetHasInlineMergeConflicts() { + return self.c.ErrorMsg(self.c.Tr.ErrStageDirWithInlineMergeConflicts) + } + + if node.GetHasUnstagedChanges() { + self.c.LogAction(self.c.Tr.Actions.StageFile) + + if err := self.optimisticChange(node, self.optimisticStage); err != nil { + return err + } + + if err := self.git.WorkingTree.StageFile(node.Path); err != nil { + return self.c.Error(err) + } + } else { + self.c.LogAction(self.c.Tr.Actions.UnstageFile) + + if err := self.optimisticChange(node, self.optimisticUnstage); err != nil { + return err + } + + // pretty sure it doesn't matter that we're always passing true here + if err := self.git.WorkingTree.UnStageFile([]string{node.Path}, true); err != nil { + return self.c.Error(err) + } + } + } + + return nil +} + +func (self *FilesController) press(node *filetree.FileNode) error { + if node.IsFile() && node.File.HasInlineMergeConflicts { + return self.switchToMerge() + } + + if err := self.pressWithLock(node); err != nil { + return err + } + + if err := self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.FILES}, Mode: types.ASYNC}); err != nil { + return err + } + + return self.context().HandleFocus(types.OnFocusOpts{}) +} + +func (self *FilesController) checkSelectedFileNode(callback func(*filetree.FileNode) error) func() error { + return func() error { + node := self.context().GetSelected() + if node == nil { + return nil + } + + return callback(node) + } +} + +func (self *FilesController) Context() types.Context { + return self.context() +} + +func (self *FilesController) context() *context.WorkingTreeContext { + return self.contexts.Files +} + +func (self *FilesController) getSelectedFile() *models.File { + node := self.context().GetSelected() + if node == nil { + return nil + } + return node.File +} + +func (self *FilesController) enter() error { + return self.EnterFile(types.OnFocusOpts{ClickedWindowName: "", ClickedViewLineIdx: -1}) +} + +func (self *FilesController) EnterFile(opts types.OnFocusOpts) error { + node := self.context().GetSelected() + if node == nil { + return nil + } + + if node.File == nil { + return self.handleToggleDirCollapsed() + } + + file := node.File + + submoduleConfigs := self.model.Submodules + if file.IsSubmodule(submoduleConfigs) { + submoduleConfig := file.SubmoduleConfig(submoduleConfigs) + return self.enterSubmodule(submoduleConfig) + } + + if file.HasInlineMergeConflicts { + return self.switchToMerge() + } + if file.HasMergeConflicts { + return self.c.ErrorMsg(self.c.Tr.FileStagingRequirements) + } + + return self.c.PushContext(self.contexts.Staging, opts) +} + +func (self *FilesController) toggleStagedAll() error { + if err := self.toggleStagedAllWithLock(); err != nil { + return err + } + + if err := self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.FILES}, Mode: types.ASYNC}); err != nil { + return err + } + + return self.context().HandleFocus(types.OnFocusOpts{}) +} + +func (self *FilesController) toggleStagedAllWithLock() error { + self.mutexes.RefreshingFilesMutex.Lock() + defer self.mutexes.RefreshingFilesMutex.Unlock() + + root := self.context().FileTreeViewModel.GetRoot() + + // if any files within have inline merge conflicts we can't stage or unstage, + // or it'll end up with those >>>>>> lines actually staged + if root.GetHasInlineMergeConflicts() { + return self.c.ErrorMsg(self.c.Tr.ErrStageDirWithInlineMergeConflicts) + } + + if root.GetHasUnstagedChanges() { + self.c.LogAction(self.c.Tr.Actions.StageAllFiles) + + if err := self.optimisticChange(root, self.optimisticStage); err != nil { + return err + } + + if err := self.git.WorkingTree.StageAll(); err != nil { + return self.c.Error(err) + } + } else { + self.c.LogAction(self.c.Tr.Actions.UnstageAllFiles) + + if err := self.optimisticChange(root, self.optimisticUnstage); err != nil { + return err + } + + if err := self.git.WorkingTree.UnstageAll(); err != nil { + return self.c.Error(err) + } + } + + return nil +} + +func (self *FilesController) unstageFiles(node *filetree.FileNode) error { + return node.ForEachFile(func(file *models.File) error { + if file.HasStagedChanges { + if err := self.git.WorkingTree.UnStageFile(file.Names(), file.Tracked); err != nil { + return err + } + } + + return nil + }) +} + +func (self *FilesController) ignoreOrExcludeTracked(node *filetree.FileNode, trAction string, f func(string) error) error { + self.c.LogAction(trAction) + // not 100% sure if this is necessary but I'll assume it is + if err := self.unstageFiles(node); err != nil { + return err + } + + if err := self.git.WorkingTree.RemoveTrackedFiles(node.GetPath()); err != nil { + return err + } + + if err := f(node.GetPath()); err != nil { + return err + } + + return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.FILES}}) +} + +func (self *FilesController) ignoreOrExcludeUntracked(node *filetree.FileNode, trAction string, f func(string) error) error { + self.c.LogAction(trAction) + + if err := f(node.GetPath()); err != nil { + return err + } + + return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.FILES}}) +} + +func (self *FilesController) ignoreOrExcludeFile(node *filetree.FileNode, trText string, trPrompt string, trAction string, f func(string) error) error { + if node.GetIsTracked() { + return self.c.Confirm(types.ConfirmOpts{ + Title: trText, + Prompt: trPrompt, + HandleConfirm: func() error { + return self.ignoreOrExcludeTracked(node, trAction, f) + }, + }) + } + return self.ignoreOrExcludeUntracked(node, trAction, f) +} + +func (self *FilesController) ignore(node *filetree.FileNode) error { + if node.GetPath() == ".gitignore" { + return self.c.ErrorMsg(self.c.Tr.Actions.IgnoreFileErr) + } + err := self.ignoreOrExcludeFile(node, self.c.Tr.IgnoreTracked, self.c.Tr.IgnoreTrackedPrompt, self.c.Tr.Actions.LcIgnoreExcludeFile, self.git.WorkingTree.Ignore) + if err != nil { + return err + } + + return nil +} + +func (self *FilesController) exclude(node *filetree.FileNode) error { + if node.GetPath() == ".git/info/exclude" { + return self.c.ErrorMsg(self.c.Tr.Actions.ExcludeFileErr) + } + + if node.GetPath() == ".gitignore" { + return self.c.ErrorMsg(self.c.Tr.Actions.ExcludeGitIgnoreErr) + } + + err := self.ignoreOrExcludeFile(node, self.c.Tr.ExcludeTracked, self.c.Tr.ExcludeTrackedPrompt, self.c.Tr.Actions.ExcludeFile, self.git.WorkingTree.Exclude) + if err != nil { + return err + } + return nil +} + +func (self *FilesController) ignoreOrExcludeMenu(node *filetree.FileNode) error { + return self.c.Menu(types.CreateMenuOptions{ + Title: self.c.Tr.Actions.LcIgnoreExcludeFile, + Items: []*types.MenuItem{ + { + LabelColumns: []string{self.c.Tr.LcIgnoreFile}, + OnPress: func() error { + if err := self.ignore(node); err != nil { + return self.c.Error(err) + } + return nil + }, + Key: 'i', + }, + { + LabelColumns: []string{self.c.Tr.LcExcludeFile}, + OnPress: func() error { + if err := self.exclude(node); err != nil { + return self.c.Error(err) + } + return nil + }, + Key: 'e', + }, + }, + }) +} + +func (self *FilesController) HandleWIPCommitPress() error { + skipHookPrefix := self.c.UserConfig.Git.SkipHookPrefix + if skipHookPrefix == "" { + return self.c.ErrorMsg(self.c.Tr.SkipHookPrefixNotConfigured) + } + + self.setCommitMessage(skipHookPrefix) + + return self.HandleCommitPress() +} + +func (self *FilesController) commitPrefixConfigForRepo() *config.CommitPrefixConfig { + cfg, ok := self.c.UserConfig.Git.CommitPrefixes[utils.GetCurrentRepoName()] + if !ok { + return nil + } + + return &cfg +} + +func (self *FilesController) prepareFilesForCommit() error { + noStagedFiles := !self.helpers.WorkingTree.AnyStagedFiles() + if noStagedFiles && self.c.UserConfig.Gui.SkipNoStagedFilesWarning { + self.c.LogAction(self.c.Tr.Actions.StageAllFiles) + err := self.git.WorkingTree.StageAll() + if err != nil { + return err + } + + return self.syncRefresh() + } + + return nil +} + +// for when you need to refetch files before continuing an action. Runs synchronously. +func (self *FilesController) syncRefresh() error { + return self.c.Refresh(types.RefreshOptions{Mode: types.SYNC, Scope: []types.RefreshableView{types.FILES}}) +} + +func (self *FilesController) refresh() error { + return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.FILES}}) +} + +func (self *FilesController) HandleCommitPress() error { + if err := self.prepareFilesForCommit(); err != nil { + return self.c.Error(err) + } + + if len(self.model.Files) == 0 { + return self.c.ErrorMsg(self.c.Tr.NoFilesStagedTitle) + } + + if !self.helpers.WorkingTree.AnyStagedFiles() { + return self.promptToStageAllAndRetry(self.HandleCommitPress) + } + + savedCommitMessage := self.getSavedCommitMessage() + if len(savedCommitMessage) > 0 { + self.setCommitMessage(savedCommitMessage) + } else { + commitPrefixConfig := self.commitPrefixConfigForRepo() + if commitPrefixConfig != nil { + prefixPattern := commitPrefixConfig.Pattern + prefixReplace := commitPrefixConfig.Replace + rgx, err := regexp.Compile(prefixPattern) + if err != nil { + return self.c.ErrorMsg(fmt.Sprintf("%s: %s", self.c.Tr.LcCommitPrefixPatternError, err.Error())) + } + prefix := rgx.ReplaceAllString(self.helpers.Refs.GetCheckedOutRef().Name, prefixReplace) + self.setCommitMessage(prefix) + } + } + + if err := self.c.PushContext(self.contexts.CommitMessage); err != nil { + return err + } + + return nil +} + +func (self *FilesController) promptToStageAllAndRetry(retry func() error) error { + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.NoFilesStagedTitle, + Prompt: self.c.Tr.NoFilesStagedPrompt, + HandleConfirm: func() error { + self.c.LogAction(self.c.Tr.Actions.StageAllFiles) + if err := self.git.WorkingTree.StageAll(); err != nil { + return self.c.Error(err) + } + if err := self.syncRefresh(); err != nil { + return self.c.Error(err) + } + + return retry() + }, + }) +} + +func (self *FilesController) handleAmendCommitPress() error { + if len(self.model.Files) == 0 { + return self.c.ErrorMsg(self.c.Tr.NoFilesStagedTitle) + } + + if !self.helpers.WorkingTree.AnyStagedFiles() { + return self.promptToStageAllAndRetry(self.handleAmendCommitPress) + } + + if len(self.model.Commits) == 0 { + return self.c.ErrorMsg(self.c.Tr.NoCommitToAmend) + } + + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.AmendLastCommitTitle, + Prompt: self.c.Tr.SureToAmend, + HandleConfirm: func() error { + cmdObj := self.git.Commit.AmendHeadCmdObj() + self.c.LogAction(self.c.Tr.Actions.AmendCommit) + return self.helpers.GPG.WithGpgHandling(cmdObj, self.c.Tr.AmendingStatus, nil) + }, + }) +} + +// HandleCommitEditorPress - handle when the user wants to commit changes via +// their editor rather than via the popup panel +func (self *FilesController) HandleCommitEditorPress() error { + if len(self.model.Files) == 0 { + return self.c.ErrorMsg(self.c.Tr.NoFilesStagedTitle) + } + + if !self.helpers.WorkingTree.AnyStagedFiles() { + return self.promptToStageAllAndRetry(self.HandleCommitEditorPress) + } + + self.c.LogAction(self.c.Tr.Actions.Commit) + return self.c.RunSubprocessAndRefresh( + self.git.Commit.CommitEditorCmdObj(), + ) +} + +func (self *FilesController) handleStatusFilterPressed() error { + return self.c.Menu(types.CreateMenuOptions{ + Title: self.c.Tr.FilteringMenuTitle, + Items: []*types.MenuItem{ + { + Label: self.c.Tr.FilterStagedFiles, + OnPress: func() error { + return self.setStatusFiltering(filetree.DisplayStaged) + }, + }, + { + Label: self.c.Tr.FilterUnstagedFiles, + OnPress: func() error { + return self.setStatusFiltering(filetree.DisplayUnstaged) + }, + }, + { + Label: self.c.Tr.ResetCommitFilterState, + OnPress: func() error { + return self.setStatusFiltering(filetree.DisplayAll) + }, + }, + }, + }) +} + +func (self *FilesController) setStatusFiltering(filter filetree.FileTreeDisplayFilter) error { + self.context().FileTreeViewModel.SetFilter(filter) + return self.c.PostRefreshUpdate(self.context()) +} + +func (self *FilesController) edit(node *filetree.FileNode) error { + if node.File == nil { + return self.c.ErrorMsg(self.c.Tr.ErrCannotEditDirectory) + } + + return self.helpers.Files.EditFile(node.GetPath()) +} + +func (self *FilesController) Open() error { + node := self.context().GetSelected() + if node == nil { + return nil + } + + return self.helpers.Files.OpenFile(node.GetPath()) +} + +func (self *FilesController) switchToMerge() error { + file := self.getSelectedFile() + if file == nil { + return nil + } + + return self.helpers.MergeConflicts.SwitchToMerge(file.Name) +} + +func (self *FilesController) createStashMenu() error { + return self.c.Menu(types.CreateMenuOptions{ + Title: self.c.Tr.LcStashOptions, + Items: []*types.MenuItem{ + { + Label: self.c.Tr.LcStashAllChanges, + OnPress: func() error { + return self.handleStashSave(self.git.Stash.Save, self.c.Tr.Actions.StashAllChanges, self.c.Tr.NoFilesToStash) + }, + Key: 'a', + }, + { + Label: self.c.Tr.LcStashAllChangesKeepIndex, + OnPress: func() error { + // if there are no staged files it behaves the same as Stash.Save + return self.handleStashSave(self.git.Stash.StashAndKeepIndex, self.c.Tr.Actions.StashAllChangesKeepIndex, self.c.Tr.NoFilesToStash) + }, + Key: 'i', + }, + { + Label: self.c.Tr.LcStashStagedChanges, + OnPress: func() error { + // there must be something in staging otherwise the current implementation mucks the stash up + if !self.helpers.WorkingTree.AnyStagedFiles() { + return self.c.ErrorMsg(self.c.Tr.NoTrackedStagedFilesStash) + } + return self.handleStashSave(self.git.Stash.SaveStagedChanges, self.c.Tr.Actions.StashStagedChanges, self.c.Tr.NoTrackedStagedFilesStash) + }, + Key: 's', + }, + { + Label: self.c.Tr.LcStashUnstagedChanges, + OnPress: func() error { + if self.helpers.WorkingTree.AnyStagedFiles() { + return self.handleStashSave(self.git.Stash.StashUnstagedChanges, self.c.Tr.Actions.StashUnstagedChanges, self.c.Tr.NoFilesToStash) + } + // ordinary stash + return self.handleStashSave(self.git.Stash.Save, self.c.Tr.Actions.StashUnstagedChanges, self.c.Tr.NoFilesToStash) + }, + Key: 'u', + }, + }, + }) +} + +func (self *FilesController) stash() error { + return self.handleStashSave(self.git.Stash.Save, self.c.Tr.Actions.StashAllChanges, self.c.Tr.NoTrackedStagedFilesStash) +} + +func (self *FilesController) createResetToUpstreamMenu() error { + return self.helpers.Refs.CreateGitResetMenu("@{upstream}") +} + +func (self *FilesController) handleToggleDirCollapsed() error { + node := self.context().GetSelected() + if node == nil { + return nil + } + + self.context().FileTreeViewModel.ToggleCollapsed(node.GetPath()) + + if err := self.c.PostRefreshUpdate(self.contexts.Files); err != nil { + self.c.Log.Error(err) + } + + return nil +} + +func (self *FilesController) toggleTreeView() error { + self.context().FileTreeViewModel.ToggleShowTree() + + return self.c.PostRefreshUpdate(self.context()) +} + +func (self *FilesController) handleStashSave(stashFunc func(message string) error, action string, errorMsg string) error { + if !self.helpers.WorkingTree.IsWorkingTreeDirty() { + return self.c.ErrorMsg(errorMsg) + } + + return self.c.Prompt(types.PromptOpts{ + Title: self.c.Tr.StashChanges, + HandleConfirm: func(stashComment string) error { + self.c.LogAction(action) + + if err := stashFunc(stashComment); err != nil { + return self.c.Error(err) + } + return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.STASH, types.FILES}}) + }, + }) +} + +func (self *FilesController) onClickMain(opts gocui.ViewMouseBindingOpts) error { + return self.EnterFile(types.OnFocusOpts{ClickedWindowName: "main", ClickedViewLineIdx: opts.Y}) +} + +func (self *FilesController) onClickSecondary(opts gocui.ViewMouseBindingOpts) error { + return self.EnterFile(types.OnFocusOpts{ClickedWindowName: "secondary", ClickedViewLineIdx: opts.Y}) +} + +func (self *FilesController) fetch() error { + return self.c.WithLoaderPanel(self.c.Tr.FetchWait, func() error { + if err := self.fetchAux(); err != nil { + _ = self.c.Error(err) + } + return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}) + }) +} + +func (self *FilesController) fetchAux() (err error) { + self.c.LogAction("Fetch") + err = self.git.Sync.Fetch(git_commands.FetchOptions{}) + + if err != nil && strings.Contains(err.Error(), "exit status 128") { + _ = self.c.ErrorMsg(self.c.Tr.PassUnameWrong) + } + + _ = self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.BRANCHES, types.COMMITS, types.REMOTES, types.TAGS}, Mode: types.ASYNC}) + + return err +} diff --git a/pkg/gui/controllers/files_remove_controller.go b/pkg/gui/controllers/files_remove_controller.go new file mode 100644 index 000000000..73449f1ec --- /dev/null +++ b/pkg/gui/controllers/files_remove_controller.go @@ -0,0 +1,161 @@ +package controllers + +import ( + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/context" + "github.com/jesseduffield/lazygit/pkg/gui/filetree" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +// splitting this action out into its own file because it's self-contained + +type FilesRemoveController struct { + baseController + *controllerCommon +} + +var _ types.IController = &FilesRemoveController{} + +func NewFilesRemoveController( + common *controllerCommon, +) *FilesRemoveController { + return &FilesRemoveController{ + baseController: baseController{}, + controllerCommon: common, + } +} + +func (self *FilesRemoveController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { + bindings := []*types.Binding{ + { + Key: opts.GetKey(opts.Config.Universal.Remove), + Handler: self.checkSelectedFileNode(self.remove), + Description: self.c.Tr.LcViewDiscardOptions, + OpensMenu: true, + }, + } + + return bindings +} + +func (self *FilesRemoveController) remove(node *filetree.FileNode) error { + var menuItems []*types.MenuItem + if node.File == nil { + menuItems = []*types.MenuItem{ + { + Label: self.c.Tr.LcDiscardAllChanges, + OnPress: func() error { + self.c.LogAction(self.c.Tr.Actions.DiscardAllChangesInDirectory) + if err := self.git.WorkingTree.DiscardAllDirChanges(node); err != nil { + return self.c.Error(err) + } + return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.FILES}}) + }, + Key: 'd', + }, + } + + if node.GetHasStagedChanges() && node.GetHasUnstagedChanges() { + menuItems = append(menuItems, &types.MenuItem{ + Label: self.c.Tr.LcDiscardUnstagedChanges, + OnPress: func() error { + self.c.LogAction(self.c.Tr.Actions.DiscardUnstagedChangesInDirectory) + if err := self.git.WorkingTree.DiscardUnstagedDirChanges(node); err != nil { + return self.c.Error(err) + } + + return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.FILES}}) + }, + Key: 'u', + }) + } + } else { + file := node.File + + submodules := self.model.Submodules + if file.IsSubmodule(submodules) { + submodule := file.SubmoduleConfig(submodules) + + menuItems = []*types.MenuItem{ + { + Label: self.c.Tr.LcSubmoduleStashAndReset, + OnPress: func() error { + return self.ResetSubmodule(submodule) + }, + }, + } + } else { + menuItems = []*types.MenuItem{ + { + Label: self.c.Tr.LcDiscardAllChanges, + OnPress: func() error { + self.c.LogAction(self.c.Tr.Actions.DiscardAllChangesInFile) + if err := self.git.WorkingTree.DiscardAllFileChanges(file); err != nil { + return self.c.Error(err) + } + return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.FILES}}) + }, + Key: 'd', + }, + } + + if file.HasStagedChanges && file.HasUnstagedChanges { + menuItems = append(menuItems, &types.MenuItem{ + Label: self.c.Tr.LcDiscardUnstagedChanges, + OnPress: func() error { + self.c.LogAction(self.c.Tr.Actions.DiscardAllUnstagedChangesInFile) + if err := self.git.WorkingTree.DiscardUnstagedFileChanges(file); err != nil { + return self.c.Error(err) + } + + return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.FILES}}) + }, + Key: 'u', + }) + } + } + } + + return self.c.Menu(types.CreateMenuOptions{Title: node.GetPath(), Items: menuItems}) +} + +func (self *FilesRemoveController) ResetSubmodule(submodule *models.SubmoduleConfig) error { + return self.c.WithWaitingStatus(self.c.Tr.LcResettingSubmoduleStatus, func() error { + self.c.LogAction(self.c.Tr.Actions.ResetSubmodule) + + file := self.helpers.WorkingTree.FileForSubmodule(submodule) + if file != nil { + if err := self.git.WorkingTree.UnStageFile(file.Names(), file.Tracked); err != nil { + return self.c.Error(err) + } + } + + if err := self.git.Submodule.Stash(submodule); err != nil { + return self.c.Error(err) + } + if err := self.git.Submodule.Reset(submodule); err != nil { + return self.c.Error(err) + } + + return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.FILES, types.SUBMODULES}}) + }) +} + +func (self *FilesRemoveController) checkSelectedFileNode(callback func(*filetree.FileNode) error) func() error { + return func() error { + node := self.context().GetSelected() + if node == nil { + return nil + } + + return callback(node) + } +} + +func (self *FilesRemoveController) Context() types.Context { + return self.context() +} + +func (self *FilesRemoveController) context() *context.WorkingTreeContext { + return self.contexts.Files +} diff --git a/pkg/gui/controllers/git_flow_controller.go b/pkg/gui/controllers/git_flow_controller.go new file mode 100644 index 000000000..2504ad2dd --- /dev/null +++ b/pkg/gui/controllers/git_flow_controller.go @@ -0,0 +1,123 @@ +package controllers + +import ( + "fmt" + + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/context" + "github.com/jesseduffield/lazygit/pkg/gui/types" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +type GitFlowController struct { + baseController + *controllerCommon +} + +var _ types.IController = &GitFlowController{} + +func NewGitFlowController( + common *controllerCommon, +) *GitFlowController { + return &GitFlowController{ + baseController: baseController{}, + controllerCommon: common, + } +} + +func (self *GitFlowController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { + bindings := []*types.Binding{ + { + Key: opts.GetKey(opts.Config.Branches.ViewGitFlowOptions), + Handler: self.checkSelected(self.handleCreateGitFlowMenu), + Description: self.c.Tr.LcGitFlowOptions, + OpensMenu: true, + }, + } + + return bindings +} + +func (self *GitFlowController) handleCreateGitFlowMenu(branch *models.Branch) error { + if !self.git.Flow.GitFlowEnabled() { + return self.c.ErrorMsg("You need to install git-flow and enable it in this repo to use git-flow features") + } + + startHandler := func(branchType string) func() error { + return func() error { + title := utils.ResolvePlaceholderString(self.c.Tr.NewGitFlowBranchPrompt, map[string]string{"branchType": branchType}) + + return self.c.Prompt(types.PromptOpts{ + Title: title, + HandleConfirm: func(name string) error { + self.c.LogAction(self.c.Tr.Actions.GitFlowStart) + return self.c.RunSubprocessAndRefresh( + self.git.Flow.StartCmdObj(branchType, name), + ) + }, + }) + } + } + + return self.c.Menu(types.CreateMenuOptions{ + Title: "git flow", + Items: []*types.MenuItem{ + { + // not localising here because it's one to one with the actual git flow commands + Label: fmt.Sprintf("finish branch '%s'", branch.Name), + OnPress: func() error { + return self.gitFlowFinishBranch(branch.Name) + }, + }, + { + Label: "start feature", + OnPress: startHandler("feature"), + Key: 'f', + }, + { + Label: "start hotfix", + OnPress: startHandler("hotfix"), + Key: 'h', + }, + { + Label: "start bugfix", + OnPress: startHandler("bugfix"), + Key: 'b', + }, + { + Label: "start release", + OnPress: startHandler("release"), + Key: 'r', + }, + }, + }) +} + +func (self *GitFlowController) gitFlowFinishBranch(branchName string) error { + cmdObj, err := self.git.Flow.FinishCmdObj(branchName) + if err != nil { + return self.c.Error(err) + } + + self.c.LogAction(self.c.Tr.Actions.GitFlowFinish) + return self.c.RunSubprocessAndRefresh(cmdObj) +} + +func (self *GitFlowController) checkSelected(callback func(*models.Branch) error) func() error { + return func() error { + node := self.context().GetSelected() + if node == nil { + return nil + } + + return callback(node) + } +} + +func (self *GitFlowController) Context() types.Context { + return self.context() +} + +func (self *GitFlowController) context() *context.BranchesContext { + return self.contexts.Branches +} diff --git a/pkg/gui/controllers/global_controller.go b/pkg/gui/controllers/global_controller.go new file mode 100644 index 000000000..e59231739 --- /dev/null +++ b/pkg/gui/controllers/global_controller.go @@ -0,0 +1,67 @@ +package controllers + +import ( + "github.com/jesseduffield/generics/slices" + "github.com/jesseduffield/lazygit/pkg/gui/controllers/helpers" + "github.com/jesseduffield/lazygit/pkg/gui/types" + "github.com/jesseduffield/lazygit/pkg/utils" + "github.com/samber/lo" +) + +type GlobalController struct { + baseController + *controllerCommon +} + +func NewGlobalController( + common *controllerCommon, +) *GlobalController { + return &GlobalController{ + baseController: baseController{}, + controllerCommon: common, + } +} + +func (self *GlobalController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { + return []*types.Binding{ + { + Key: opts.GetKey(opts.Config.Universal.ExecuteCustomCommand), + Handler: self.customCommand, + Description: self.c.Tr.LcExecuteCustomCommand, + }, + } +} + +func (self *GlobalController) customCommand() error { + return self.c.Prompt(types.PromptOpts{ + Title: self.c.Tr.CustomCommand, + FindSuggestionsFunc: self.GetCustomCommandsHistorySuggestionsFunc(), + HandleConfirm: func(command string) error { + self.c.GetAppState().CustomCommandsHistory = utils.Limit( + lo.Uniq(append(self.c.GetAppState().CustomCommandsHistory, command)), + 1000, + ) + + err := self.c.SaveAppState() + if err != nil { + self.c.Log.Error(err) + } + + self.c.LogAction(self.c.Tr.Actions.CustomCommand) + return self.c.RunSubprocessAndRefresh( + self.os.Cmd.NewShell(command), + ) + }, + }) +} + +func (self *GlobalController) GetCustomCommandsHistorySuggestionsFunc() func(string) []*types.Suggestion { + // reversing so that we display the latest command first + history := slices.Reverse(self.c.GetAppState().CustomCommandsHistory) + + return helpers.FuzzySearchFunc(history) +} + +func (self *GlobalController) Context() types.Context { + return nil +} diff --git a/pkg/gui/controllers/helpers/bisect_helper.go b/pkg/gui/controllers/helpers/bisect_helper.go new file mode 100644 index 000000000..65fb781d4 --- /dev/null +++ b/pkg/gui/controllers/helpers/bisect_helper.go @@ -0,0 +1,40 @@ +package helpers + +import ( + "github.com/jesseduffield/lazygit/pkg/commands" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type BisectHelper struct { + c *types.HelperCommon + git *commands.GitCommand +} + +func NewBisectHelper( + c *types.HelperCommon, + git *commands.GitCommand, +) *BisectHelper { + return &BisectHelper{ + c: c, + git: git, + } +} + +func (self *BisectHelper) Reset() error { + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.Bisect.ResetTitle, + Prompt: self.c.Tr.Bisect.ResetPrompt, + HandleConfirm: func() error { + self.c.LogAction(self.c.Tr.Actions.ResetBisect) + if err := self.git.Bisect.Reset(); err != nil { + return self.c.Error(err) + } + + return self.PostBisectCommandRefresh() + }, + }) +} + +func (self *BisectHelper) PostBisectCommandRefresh() error { + return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{}}) +} diff --git a/pkg/gui/controllers/helpers/cherry_pick_helper.go b/pkg/gui/controllers/helpers/cherry_pick_helper.go new file mode 100644 index 000000000..a5c4427a7 --- /dev/null +++ b/pkg/gui/controllers/helpers/cherry_pick_helper.go @@ -0,0 +1,155 @@ +package helpers + +import ( + "github.com/jesseduffield/generics/set" + "github.com/jesseduffield/generics/slices" + "github.com/jesseduffield/lazygit/pkg/commands" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/context" + "github.com/jesseduffield/lazygit/pkg/gui/modes/cherrypicking" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type CherryPickHelper struct { + c *types.HelperCommon + + git *commands.GitCommand + + contexts *context.ContextTree + getData func() *cherrypicking.CherryPicking + + rebaseHelper *MergeAndRebaseHelper +} + +// I'm using the analogy of copy+paste in the terminology here because it's intuitively what's going on, +// even if in truth we're running git cherry-pick + +func NewCherryPickHelper( + c *types.HelperCommon, + git *commands.GitCommand, + contexts *context.ContextTree, + getData func() *cherrypicking.CherryPicking, + rebaseHelper *MergeAndRebaseHelper, +) *CherryPickHelper { + return &CherryPickHelper{ + c: c, + git: git, + contexts: contexts, + getData: getData, + rebaseHelper: rebaseHelper, + } +} + +func (self *CherryPickHelper) Copy(commit *models.Commit, commitsList []*models.Commit, context types.Context) error { + if err := self.resetIfNecessary(context); err != nil { + return err + } + + // we will un-copy it if it's already copied + for index, cherryPickedCommit := range self.getData().CherryPickedCommits { + if commit.Sha == cherryPickedCommit.Sha { + self.getData().CherryPickedCommits = append( + self.getData().CherryPickedCommits[0:index], + self.getData().CherryPickedCommits[index+1:]..., + ) + return self.rerender() + } + } + + self.add(commit, commitsList) + return self.rerender() +} + +func (self *CherryPickHelper) CopyRange(selectedIndex int, commitsList []*models.Commit, context types.Context) error { + if err := self.resetIfNecessary(context); err != nil { + return err + } + + commitSet := self.CherryPickedCommitShaSet() + + // find the last commit that is copied that's above our position + // if there are none, startIndex = 0 + startIndex := 0 + for index, commit := range commitsList[0:selectedIndex] { + if commitSet.Includes(commit.Sha) { + startIndex = index + } + } + + for index := startIndex; index <= selectedIndex; index++ { + commit := commitsList[index] + self.add(commit, commitsList) + } + + return self.rerender() +} + +// HandlePasteCommits begins a cherry-pick rebase with the commits the user has copied. +// Only to be called from the branch commits controller +func (self *CherryPickHelper) Paste() error { + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.CherryPick, + Prompt: self.c.Tr.SureCherryPick, + HandleConfirm: func() error { + return self.c.WithWaitingStatus(self.c.Tr.CherryPickingStatus, func() error { + self.c.LogAction(self.c.Tr.Actions.CherryPick) + err := self.git.Rebase.CherryPickCommits(self.getData().CherryPickedCommits) + return self.rebaseHelper.CheckMergeOrRebase(err) + }) + }, + }) +} + +func (self *CherryPickHelper) Reset() error { + self.getData().ContextKey = "" + self.getData().CherryPickedCommits = nil + + return self.rerender() +} + +func (self *CherryPickHelper) CherryPickedCommitShaSet() *set.Set[string] { + shas := slices.Map(self.getData().CherryPickedCommits, func(commit *models.Commit) string { + return commit.Sha + }) + return set.NewFromSlice(shas) +} + +func (self *CherryPickHelper) add(selectedCommit *models.Commit, commitsList []*models.Commit) { + commitSet := self.CherryPickedCommitShaSet() + commitSet.Add(selectedCommit.Sha) + + cherryPickedCommits := slices.Filter(commitsList, func(commit *models.Commit) bool { + return commitSet.Includes(commit.Sha) + }) + + self.getData().CherryPickedCommits = slices.Map(cherryPickedCommits, func(commit *models.Commit) *models.Commit { + return &models.Commit{Name: commit.Name, Sha: commit.Sha} + }) +} + +// you can only copy from one context at a time, because the order and position of commits matter +func (self *CherryPickHelper) resetIfNecessary(context types.Context) error { + oldContextKey := types.ContextKey(self.getData().ContextKey) + + if oldContextKey != context.GetKey() { + // need to reset the cherry picking mode + self.getData().ContextKey = string(context.GetKey()) + self.getData().CherryPickedCommits = make([]*models.Commit, 0) + } + + return nil +} + +func (self *CherryPickHelper) rerender() error { + for _, context := range []types.Context{ + self.contexts.LocalCommits, + self.contexts.ReflogCommits, + self.contexts.SubCommits, + } { + if err := self.c.PostRefreshUpdate(context); err != nil { + return err + } + } + + return nil +} diff --git a/pkg/gui/controllers/helpers/credentials_helper.go b/pkg/gui/controllers/helpers/credentials_helper.go new file mode 100644 index 000000000..9da3a46a2 --- /dev/null +++ b/pkg/gui/controllers/helpers/credentials_helper.go @@ -0,0 +1,68 @@ +package helpers + +import ( + "sync" + + "github.com/jesseduffield/lazygit/pkg/commands/oscommands" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type CredentialsHelper struct { + c *types.HelperCommon +} + +func NewCredentialsHelper( + c *types.HelperCommon, +) *CredentialsHelper { + return &CredentialsHelper{ + c: c, + } +} + +// promptUserForCredential wait for a username, password or passphrase input from the credentials popup +func (self *CredentialsHelper) PromptUserForCredential(passOrUname oscommands.CredentialType) string { + waitGroup := sync.WaitGroup{} + waitGroup.Add(1) + + userInput := "" + + self.c.OnUIThread(func() error { + title, mask := self.getTitleAndMask(passOrUname) + + return self.c.Prompt(types.PromptOpts{ + Title: title, + Mask: mask, + HandleConfirm: func(input string) error { + userInput = input + + waitGroup.Done() + + return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}) + }, + HandleClose: func() error { + waitGroup.Done() + + return nil + }, + }) + }) + + // wait for username/passwords/passphrase input + waitGroup.Wait() + + return userInput + "\n" +} + +func (self *CredentialsHelper) getTitleAndMask(passOrUname oscommands.CredentialType) (string, bool) { + switch passOrUname { + case oscommands.Username: + return self.c.Tr.CredentialsUsername, false + case oscommands.Password: + return self.c.Tr.CredentialsPassword, true + case oscommands.Passphrase: + return self.c.Tr.CredentialsPassphrase, true + } + + // should never land here + panic("unexpected credential request") +} diff --git a/pkg/gui/controllers/helpers/files_helper.go b/pkg/gui/controllers/helpers/files_helper.go new file mode 100644 index 000000000..72be6e4e5 --- /dev/null +++ b/pkg/gui/controllers/helpers/files_helper.go @@ -0,0 +1,62 @@ +package helpers + +import ( + "github.com/jesseduffield/lazygit/pkg/commands" + "github.com/jesseduffield/lazygit/pkg/commands/oscommands" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type IFilesHelper interface { + EditFile(filename string) error + EditFileAtLine(filename string, lineNumber int) error + OpenFile(filename string) error + OpenFileAtLine(filename string, lineNumber int) error +} + +type FilesHelper struct { + c *types.HelperCommon + git *commands.GitCommand + os *oscommands.OSCommand +} + +func NewFilesHelper( + c *types.HelperCommon, + git *commands.GitCommand, + os *oscommands.OSCommand, +) *FilesHelper { + return &FilesHelper{ + c: c, + git: git, + os: os, + } +} + +var _ IFilesHelper = &FilesHelper{} + +func (self *FilesHelper) EditFile(filename string) error { + return self.EditFileAtLine(filename, 1) +} + +func (self *FilesHelper) EditFileAtLine(filename string, lineNumber int) error { + cmdStr, err := self.git.File.GetEditCmdStr(filename, lineNumber) + if err != nil { + return self.c.Error(err) + } + + self.c.LogAction(self.c.Tr.Actions.EditFile) + return self.c.RunSubprocessAndRefresh( + self.os.Cmd.NewShell(cmdStr), + ) +} + +func (self *FilesHelper) OpenFile(filename string) error { + return self.OpenFileAtLine(filename, 1) +} + +func (self *FilesHelper) OpenFileAtLine(filename string, lineNumber int) error { + self.c.LogAction(self.c.Tr.Actions.OpenFile) + if err := self.os.OpenFileAtLine(filename, lineNumber); err != nil { + return self.c.Error(err) + } + return nil +} diff --git a/pkg/gui/controllers/helpers/gpg_helper.go b/pkg/gui/controllers/helpers/gpg_helper.go new file mode 100644 index 000000000..2e287c2b4 --- /dev/null +++ b/pkg/gui/controllers/helpers/gpg_helper.go @@ -0,0 +1,74 @@ +package helpers + +import ( + "fmt" + + "github.com/jesseduffield/lazygit/pkg/commands" + "github.com/jesseduffield/lazygit/pkg/commands/oscommands" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type GpgHelper struct { + c *types.HelperCommon + os *oscommands.OSCommand + git *commands.GitCommand +} + +func NewGpgHelper( + c *types.HelperCommon, + os *oscommands.OSCommand, + git *commands.GitCommand, +) *GpgHelper { + return &GpgHelper{ + c: c, + os: os, + git: git, + } +} + +// Currently there is a bug where if we switch to a subprocess from within +// WithWaitingStatus we get stuck there and can't return to lazygit. We could +// fix this bug, or just stop running subprocesses from within there, given that +// we don't need to see a loading status if we're in a subprocess. +// TODO: we shouldn't need to use a shell here, but looks like that NewShell function contains some windows specific quoting stuff. We should centralise that. +func (self *GpgHelper) WithGpgHandling(cmdObj oscommands.ICmdObj, waitingStatus string, onSuccess func() error) error { + useSubprocess := self.git.Config.UsingGpg() + if useSubprocess { + success, err := self.c.RunSubprocess(self.os.Cmd.NewShell(cmdObj.ToString())) + if success && onSuccess != nil { + if err := onSuccess(); err != nil { + return err + } + } + if err := self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}); err != nil { + return err + } + + return err + } else { + return self.runAndStream(cmdObj, waitingStatus, onSuccess) + } +} + +func (self *GpgHelper) runAndStream(cmdObj oscommands.ICmdObj, waitingStatus string, onSuccess func() error) error { + cmdObj = self.os.Cmd.NewShell(cmdObj.ToString()) + + return self.c.WithWaitingStatus(waitingStatus, func() error { + if err := cmdObj.StreamOutput().Run(); err != nil { + _ = self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}) + return self.c.Error( + fmt.Errorf( + self.c.Tr.GitCommandFailed, self.c.UserConfig.Keybinding.Universal.ExtrasMenu, + ), + ) + } + + if onSuccess != nil { + if err := onSuccess(); err != nil { + return err + } + } + + return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}) + }) +} diff --git a/pkg/gui/controllers/helpers/helpers.go b/pkg/gui/controllers/helpers/helpers.go new file mode 100644 index 000000000..b8c279fac --- /dev/null +++ b/pkg/gui/controllers/helpers/helpers.go @@ -0,0 +1,35 @@ +package helpers + +type Helpers struct { + Refs *RefsHelper + Bisect *BisectHelper + Suggestions *SuggestionsHelper + Files *FilesHelper + WorkingTree *WorkingTreeHelper + Tags *TagsHelper + MergeAndRebase *MergeAndRebaseHelper + MergeConflicts *MergeConflictsHelper + CherryPick *CherryPickHelper + Host *HostHelper + PatchBuilding *PatchBuildingHelper + GPG *GpgHelper + Upstream *UpstreamHelper +} + +func NewStubHelpers() *Helpers { + return &Helpers{ + Refs: &RefsHelper{}, + Bisect: &BisectHelper{}, + Suggestions: &SuggestionsHelper{}, + Files: &FilesHelper{}, + WorkingTree: &WorkingTreeHelper{}, + Tags: &TagsHelper{}, + MergeAndRebase: &MergeAndRebaseHelper{}, + MergeConflicts: &MergeConflictsHelper{}, + CherryPick: &CherryPickHelper{}, + Host: &HostHelper{}, + PatchBuilding: &PatchBuildingHelper{}, + GPG: &GpgHelper{}, + Upstream: &UpstreamHelper{}, + } +} diff --git a/pkg/gui/controllers/helpers/host_helper.go b/pkg/gui/controllers/helpers/host_helper.go new file mode 100644 index 000000000..edc0bc7ba --- /dev/null +++ b/pkg/gui/controllers/helpers/host_helper.go @@ -0,0 +1,46 @@ +package helpers + +import ( + "github.com/jesseduffield/lazygit/pkg/commands" + "github.com/jesseduffield/lazygit/pkg/commands/hosting_service" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +// this helper just wraps our hosting_service package + +type IHostHelper interface { + GetPullRequestURL(from string, to string) (string, error) + GetCommitURL(commitSha string) (string, error) +} + +type HostHelper struct { + c *types.HelperCommon + git *commands.GitCommand +} + +func NewHostHelper( + c *types.HelperCommon, + git *commands.GitCommand, +) *HostHelper { + return &HostHelper{ + c: c, + git: git, + } +} + +func (self *HostHelper) GetPullRequestURL(from string, to string) (string, error) { + return self.getHostingServiceMgr().GetPullRequestURL(from, to) +} + +func (self *HostHelper) GetCommitURL(commitSha string) (string, error) { + return self.getHostingServiceMgr().GetCommitURL(commitSha) +} + +// getting this on every request rather than storing it in state in case our remoteURL changes +// from one invocation to the next. Note however that we're currently caching config +// results so we might want to invalidate the cache here if it becomes a problem. +func (self *HostHelper) getHostingServiceMgr() *hosting_service.HostingServiceMgr { + remoteUrl := self.git.Config.GetRemoteURL() + configServices := self.c.UserConfig.Services + return hosting_service.NewHostingServiceMgr(self.c.Log, self.c.Tr, remoteUrl, configServices) +} diff --git a/pkg/gui/controllers/helpers/merge_and_rebase_helper.go b/pkg/gui/controllers/helpers/merge_and_rebase_helper.go new file mode 100644 index 000000000..21c02d6f4 --- /dev/null +++ b/pkg/gui/controllers/helpers/merge_and_rebase_helper.go @@ -0,0 +1,247 @@ +package helpers + +import ( + "fmt" + "strings" + + "github.com/jesseduffield/generics/slices" + "github.com/jesseduffield/lazygit/pkg/commands" + "github.com/jesseduffield/lazygit/pkg/commands/git_commands" + "github.com/jesseduffield/lazygit/pkg/commands/types/enums" + "github.com/jesseduffield/lazygit/pkg/gui/context" + "github.com/jesseduffield/lazygit/pkg/gui/types" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +type MergeAndRebaseHelper struct { + c *types.HelperCommon + contexts *context.ContextTree + git *commands.GitCommand + refsHelper *RefsHelper +} + +func NewMergeAndRebaseHelper( + c *types.HelperCommon, + contexts *context.ContextTree, + git *commands.GitCommand, + refsHelper *RefsHelper, +) *MergeAndRebaseHelper { + return &MergeAndRebaseHelper{ + c: c, + contexts: contexts, + git: git, + refsHelper: refsHelper, + } +} + +type RebaseOption string + +const ( + REBASE_OPTION_CONTINUE string = "continue" + REBASE_OPTION_ABORT string = "abort" + REBASE_OPTION_SKIP string = "skip" +) + +func (self *MergeAndRebaseHelper) CreateRebaseOptionsMenu() error { + type optionAndKey struct { + option string + key types.Key + } + + options := []optionAndKey{ + {option: REBASE_OPTION_CONTINUE, key: 'c'}, + {option: REBASE_OPTION_ABORT, key: 'a'}, + } + + if self.git.Status.WorkingTreeState() == enums.REBASE_MODE_REBASING { + options = append(options, optionAndKey{ + option: REBASE_OPTION_SKIP, key: 's', + }) + } + + menuItems := slices.Map(options, func(row optionAndKey) *types.MenuItem { + return &types.MenuItem{ + Label: row.option, + OnPress: func() error { + return self.genericMergeCommand(row.option) + }, + Key: row.key, + } + }) + + var title string + if self.git.Status.WorkingTreeState() == enums.REBASE_MODE_MERGING { + title = self.c.Tr.MergeOptionsTitle + } else { + title = self.c.Tr.RebaseOptionsTitle + } + + return self.c.Menu(types.CreateMenuOptions{Title: title, Items: menuItems}) +} + +func (self *MergeAndRebaseHelper) genericMergeCommand(command string) error { + status := self.git.Status.WorkingTreeState() + + if status != enums.REBASE_MODE_MERGING && status != enums.REBASE_MODE_REBASING { + return self.c.ErrorMsg(self.c.Tr.NotMergingOrRebasing) + } + + self.c.LogAction(fmt.Sprintf("Merge/Rebase: %s", command)) + + commandType := "" + switch status { + case enums.REBASE_MODE_MERGING: + commandType = "merge" + case enums.REBASE_MODE_REBASING: + commandType = "rebase" + default: + // shouldn't be possible to land here + } + + // we should end up with a command like 'git merge --continue' + + // it's impossible for a rebase to require a commit so we'll use a subprocess only if it's a merge + if status == enums.REBASE_MODE_MERGING && command != REBASE_OPTION_ABORT && self.c.UserConfig.Git.Merging.ManualCommit { + // TODO: see if we should be calling more of the code from self.Git.Rebase.GenericMergeOrRebaseAction + return self.c.RunSubprocessAndRefresh( + self.git.Rebase.GenericMergeOrRebaseActionCmdObj(commandType, command), + ) + } + result := self.git.Rebase.GenericMergeOrRebaseAction(commandType, command) + if err := self.CheckMergeOrRebase(result); err != nil { + return err + } + return nil +} + +var conflictStrings = []string{ + "Failed to merge in the changes", + "When you have resolved this problem", + "fix conflicts", + "Resolve all conflicts manually", +} + +func isMergeConflictErr(errStr string) bool { + for _, str := range conflictStrings { + if strings.Contains(errStr, str) { + return true + } + } + + return false +} + +func (self *MergeAndRebaseHelper) CheckMergeOrRebase(result error) error { + if err := self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}); err != nil { + return err + } + if result == nil { + return nil + } else if strings.Contains(result.Error(), "No changes - did you forget to use") { + return self.genericMergeCommand(REBASE_OPTION_SKIP) + } else if strings.Contains(result.Error(), "The previous cherry-pick is now empty") { + return self.genericMergeCommand(REBASE_OPTION_CONTINUE) + } else if strings.Contains(result.Error(), "No rebase in progress?") { + // assume in this case that we're already done + return nil + } else if isMergeConflictErr(result.Error()) { + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.FoundConflictsTitle, + Prompt: self.c.Tr.FoundConflicts, + HandleConfirm: func() error { + return self.c.PushContext(self.contexts.Files) + }, + HandleClose: func() error { + return self.genericMergeCommand(REBASE_OPTION_ABORT) + }, + }) + } else { + return self.c.ErrorMsg(result.Error()) + } +} + +func (self *MergeAndRebaseHelper) AbortMergeOrRebaseWithConfirm() error { + // prompt user to confirm that they want to abort, then do it + mode := self.workingTreeStateNoun() + return self.c.Confirm(types.ConfirmOpts{ + Title: fmt.Sprintf(self.c.Tr.AbortTitle, mode), + Prompt: fmt.Sprintf(self.c.Tr.AbortPrompt, mode), + HandleConfirm: func() error { + return self.genericMergeCommand(REBASE_OPTION_ABORT) + }, + }) +} + +func (self *MergeAndRebaseHelper) workingTreeStateNoun() string { + workingTreeState := self.git.Status.WorkingTreeState() + switch workingTreeState { + case enums.REBASE_MODE_NONE: + return "" + case enums.REBASE_MODE_MERGING: + return "merge" + default: + return "rebase" + } +} + +// PromptToContinueRebase asks the user if they want to continue the rebase/merge that's in progress +func (self *MergeAndRebaseHelper) PromptToContinueRebase() error { + return self.c.Confirm(types.ConfirmOpts{ + Title: "continue", + Prompt: self.c.Tr.ConflictsResolved, + HandleConfirm: func() error { + return self.genericMergeCommand(REBASE_OPTION_CONTINUE) + }, + }) +} + +func (self *MergeAndRebaseHelper) RebaseOntoRef(ref string) error { + checkedOutBranch := self.refsHelper.GetCheckedOutRef().Name + if ref == checkedOutBranch { + return self.c.ErrorMsg(self.c.Tr.CantRebaseOntoSelf) + } + prompt := utils.ResolvePlaceholderString( + self.c.Tr.ConfirmRebase, + map[string]string{ + "checkedOutBranch": checkedOutBranch, + "selectedBranch": ref, + }, + ) + + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.RebasingTitle, + Prompt: prompt, + HandleConfirm: func() error { + self.c.LogAction(self.c.Tr.Actions.RebaseBranch) + err := self.git.Rebase.RebaseBranch(ref) + return self.CheckMergeOrRebase(err) + }, + }) +} + +func (self *MergeAndRebaseHelper) MergeRefIntoCheckedOutBranch(refName string) error { + if self.git.Branch.IsHeadDetached() { + return self.c.ErrorMsg("Cannot merge branch in detached head state. You might have checked out a commit directly or a remote branch, in which case you should checkout the local branch you want to be on") + } + checkedOutBranchName := self.refsHelper.GetCheckedOutRef().Name + if checkedOutBranchName == refName { + return self.c.ErrorMsg(self.c.Tr.CantMergeBranchIntoItself) + } + prompt := utils.ResolvePlaceholderString( + self.c.Tr.ConfirmMerge, + map[string]string{ + "checkedOutBranch": checkedOutBranchName, + "selectedBranch": refName, + }, + ) + + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.MergeConfirmTitle, + Prompt: prompt, + HandleConfirm: func() error { + self.c.LogAction(self.c.Tr.Actions.Merge) + err := self.git.Branch.Merge(refName, git_commands.MergeOpts{}) + return self.CheckMergeOrRebase(err) + }, + }) +} diff --git a/pkg/gui/controllers/helpers/merge_conflicts_helper.go b/pkg/gui/controllers/helpers/merge_conflicts_helper.go new file mode 100644 index 000000000..d7f7aa747 --- /dev/null +++ b/pkg/gui/controllers/helpers/merge_conflicts_helper.go @@ -0,0 +1,115 @@ +package helpers + +import ( + "fmt" + + "github.com/jesseduffield/lazygit/pkg/commands" + "github.com/jesseduffield/lazygit/pkg/gui/context" + "github.com/jesseduffield/lazygit/pkg/gui/keybindings" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type MergeConflictsHelper struct { + c *types.HelperCommon + contexts *context.ContextTree + git *commands.GitCommand +} + +func NewMergeConflictsHelper( + c *types.HelperCommon, + contexts *context.ContextTree, + git *commands.GitCommand, +) *MergeConflictsHelper { + return &MergeConflictsHelper{ + c: c, + contexts: contexts, + git: git, + } +} + +func (self *MergeConflictsHelper) GetMergingOptions() map[string]string { + keybindingConfig := self.c.UserConfig.Keybinding + + return map[string]string{ + fmt.Sprintf("%s %s", keybindings.Label(keybindingConfig.Universal.PrevItem), keybindings.Label(keybindingConfig.Universal.NextItem)): self.c.Tr.LcSelectHunk, + fmt.Sprintf("%s %s", keybindings.Label(keybindingConfig.Universal.PrevBlock), keybindings.Label(keybindingConfig.Universal.NextBlock)): self.c.Tr.LcNavigateConflicts, + keybindings.Label(keybindingConfig.Universal.Select): self.c.Tr.LcPickHunk, + keybindings.Label(keybindingConfig.Main.PickBothHunks): self.c.Tr.LcPickAllHunks, + keybindings.Label(keybindingConfig.Universal.Undo): self.c.Tr.LcUndo, + } +} + +func (self *MergeConflictsHelper) SetMergeState(path string) (bool, error) { + self.context().GetMutex().Lock() + defer self.context().GetMutex().Unlock() + + return self.setMergeStateWithoutLock(path) +} + +func (self *MergeConflictsHelper) setMergeStateWithoutLock(path string) (bool, error) { + content, err := self.git.File.Cat(path) + if err != nil { + return false, err + } + + if path != self.context().GetState().GetPath() { + self.context().SetUserScrolling(false) + } + + self.context().GetState().SetContent(content, path) + + return !self.context().GetState().NoConflicts(), nil +} + +func (self *MergeConflictsHelper) ResetMergeState() { + self.context().GetMutex().Lock() + defer self.context().GetMutex().Unlock() + + self.resetMergeState() +} + +func (self *MergeConflictsHelper) resetMergeState() { + self.context().SetUserScrolling(false) + self.context().GetState().Reset() +} + +func (self *MergeConflictsHelper) EscapeMerge() error { + self.resetMergeState() + + // doing this in separate UI thread so that we're not still holding the lock by the time refresh the file + self.c.OnUIThread(func() error { + return self.c.PushContext(self.contexts.Files) + }) + return nil +} + +func (self *MergeConflictsHelper) SetConflictsAndRender(path string, isFocused bool) (bool, error) { + hasConflicts, err := self.setMergeStateWithoutLock(path) + if err != nil { + return false, err + } + + if hasConflicts { + return true, self.context().Render(isFocused) + } + + return false, nil +} + +func (self *MergeConflictsHelper) SwitchToMerge(path string) error { + if self.context().GetState().GetPath() != path { + hasConflicts, err := self.SetMergeState(path) + if err != nil { + return err + } + if !hasConflicts { + return nil + } + } + + return self.c.PushContext(self.contexts.MergeConflicts) +} + +func (self *MergeConflictsHelper) context() *context.MergeConflictsContext { + return self.contexts.MergeConflicts +} diff --git a/pkg/gui/controllers/helpers/patch_building_helper.go b/pkg/gui/controllers/helpers/patch_building_helper.go new file mode 100644 index 000000000..25ac63a08 --- /dev/null +++ b/pkg/gui/controllers/helpers/patch_building_helper.go @@ -0,0 +1,62 @@ +package helpers + +import ( + "github.com/jesseduffield/lazygit/pkg/commands" + "github.com/jesseduffield/lazygit/pkg/commands/types/enums" + "github.com/jesseduffield/lazygit/pkg/gui/context" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type IPatchBuildingHelper interface { + ValidateNormalWorkingTreeState() (bool, error) +} + +type PatchBuildingHelper struct { + c *types.HelperCommon + git *commands.GitCommand + contexts *context.ContextTree +} + +func NewPatchBuildingHelper( + c *types.HelperCommon, + git *commands.GitCommand, + contexts *context.ContextTree, +) *PatchBuildingHelper { + return &PatchBuildingHelper{ + c: c, + git: git, + contexts: contexts, + } +} + +func (self *PatchBuildingHelper) ValidateNormalWorkingTreeState() (bool, error) { + if self.git.Status.WorkingTreeState() != enums.REBASE_MODE_NONE { + return false, self.c.ErrorMsg(self.c.Tr.CantPatchWhileRebasingError) + } + return true, nil +} + +// takes us from the patch building panel back to the commit files panel +func (self *PatchBuildingHelper) Escape() error { + return self.c.PushContext(self.contexts.CommitFiles) +} + +// kills the custom patch and returns us back to the commit files panel if needed +func (self *PatchBuildingHelper) Reset() error { + self.git.Patch.PatchManager.Reset() + + if self.c.CurrentStaticContext().GetKind() != types.SIDE_CONTEXT { + if err := self.Escape(); err != nil { + return err + } + } + + if err := self.c.Refresh(types.RefreshOptions{ + Scope: []types.RefreshableView{types.COMMIT_FILES}, + }); err != nil { + return err + } + + // refreshing the current context so that the secondary panel is hidden if necessary. + return self.c.PostRefreshUpdate(self.c.CurrentContext()) +} diff --git a/pkg/gui/controllers/helpers/refs_helper.go b/pkg/gui/controllers/helpers/refs_helper.go new file mode 100644 index 000000000..7630349ec --- /dev/null +++ b/pkg/gui/controllers/helpers/refs_helper.go @@ -0,0 +1,202 @@ +package helpers + +import ( + "fmt" + "strings" + + "github.com/jesseduffield/generics/slices" + "github.com/jesseduffield/lazygit/pkg/commands" + "github.com/jesseduffield/lazygit/pkg/commands/git_commands" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/context" + "github.com/jesseduffield/lazygit/pkg/gui/style" + "github.com/jesseduffield/lazygit/pkg/gui/types" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +type IRefsHelper interface { + CheckoutRef(ref string, options types.CheckoutRefOptions) error + GetCheckedOutRef() *models.Branch + CreateGitResetMenu(ref string) error + ResetToRef(ref string, strength string, envVars []string) error + NewBranch(from string, fromDescription string, suggestedBranchname string) error +} + +type RefsHelper struct { + c *types.HelperCommon + git *commands.GitCommand + contexts *context.ContextTree + model *types.Model +} + +func NewRefsHelper( + c *types.HelperCommon, + git *commands.GitCommand, + contexts *context.ContextTree, + model *types.Model, +) *RefsHelper { + return &RefsHelper{ + c: c, + git: git, + contexts: contexts, + model: model, + } +} + +var _ IRefsHelper = &RefsHelper{} + +func (self *RefsHelper) CheckoutRef(ref string, options types.CheckoutRefOptions) error { + waitingStatus := options.WaitingStatus + if waitingStatus == "" { + waitingStatus = self.c.Tr.CheckingOutStatus + } + + cmdOptions := git_commands.CheckoutOptions{Force: false, EnvVars: options.EnvVars} + + onSuccess := func() { + self.contexts.Branches.SetSelectedLineIdx(0) + self.contexts.ReflogCommits.SetSelectedLineIdx(0) + self.contexts.LocalCommits.SetSelectedLineIdx(0) + // loading a heap of commits is slow so we limit them whenever doing a reset + self.contexts.LocalCommits.SetLimitCommits(true) + } + + return self.c.WithWaitingStatus(waitingStatus, func() error { + if err := self.git.Branch.Checkout(ref, cmdOptions); err != nil { + // note, this will only work for english-language git commands. If we force git to use english, and the error isn't this one, then the user will receive an english command they may not understand. I'm not sure what the best solution to this is. Running the command once in english and a second time in the native language is one option + + if options.OnRefNotFound != nil && strings.Contains(err.Error(), "did not match any file(s) known to git") { + return options.OnRefNotFound(ref) + } + + if strings.Contains(err.Error(), "Please commit your changes or stash them before you switch branch") { + // offer to autostash changes + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.AutoStashTitle, + Prompt: self.c.Tr.AutoStashPrompt, + HandleConfirm: func() error { + if err := self.git.Stash.Save(self.c.Tr.StashPrefix + ref); err != nil { + return self.c.Error(err) + } + if err := self.git.Branch.Checkout(ref, cmdOptions); err != nil { + return self.c.Error(err) + } + + onSuccess() + if err := self.git.Stash.Pop(0); err != nil { + if err := self.c.Refresh(types.RefreshOptions{Mode: types.BLOCK_UI}); err != nil { + return err + } + return self.c.Error(err) + } + return self.c.Refresh(types.RefreshOptions{Mode: types.BLOCK_UI}) + }, + }) + } + + if err := self.c.Error(err); err != nil { + return err + } + } + onSuccess() + + return self.c.Refresh(types.RefreshOptions{Mode: types.BLOCK_UI}) + }) +} + +func (self *RefsHelper) GetCheckedOutRef() *models.Branch { + if len(self.model.Branches) == 0 { + return nil + } + + return self.model.Branches[0] +} + +func (self *RefsHelper) ResetToRef(ref string, strength string, envVars []string) error { + if err := self.git.Commit.ResetToCommit(ref, strength, envVars); err != nil { + return self.c.Error(err) + } + + self.contexts.LocalCommits.SetSelectedLineIdx(0) + self.contexts.ReflogCommits.SetSelectedLineIdx(0) + // loading a heap of commits is slow so we limit them whenever doing a reset + self.contexts.LocalCommits.SetLimitCommits(true) + + if err := self.c.PushContext(self.contexts.LocalCommits); err != nil { + return err + } + + if err := self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.FILES, types.BRANCHES, types.REFLOG, types.COMMITS}}); err != nil { + return err + } + + return nil +} + +func (self *RefsHelper) CreateGitResetMenu(ref string) error { + type strengthWithKey struct { + strength string + key types.Key + } + strengths := []strengthWithKey{ + {strength: "soft", key: 's'}, + {strength: "mixed", key: 'm'}, + {strength: "hard", key: 'h'}, + } + + menuItems := slices.Map(strengths, func(row strengthWithKey) *types.MenuItem { + return &types.MenuItem{ + LabelColumns: []string{ + fmt.Sprintf("%s reset", row.strength), + style.FgRed.Sprintf("reset --%s %s", row.strength, ref), + }, + OnPress: func() error { + self.c.LogAction("Reset") + return self.ResetToRef(ref, row.strength, []string{}) + }, + Key: row.key, + } + }) + + return self.c.Menu(types.CreateMenuOptions{ + Title: fmt.Sprintf("%s %s", self.c.Tr.LcResetTo, ref), + Items: menuItems, + }) +} + +func (self *RefsHelper) NewBranch(from string, fromFormattedName string, suggestedBranchName string) error { + message := utils.ResolvePlaceholderString( + self.c.Tr.NewBranchNameBranchOff, + map[string]string{ + "branchName": fromFormattedName, + }, + ) + + return self.c.Prompt(types.PromptOpts{ + Title: message, + InitialContent: suggestedBranchName, + HandleConfirm: func(response string) error { + self.c.LogAction(self.c.Tr.Actions.CreateBranch) + if err := self.git.Branch.New(sanitizedBranchName(response), from); err != nil { + return err + } + + if self.c.CurrentContext() != self.contexts.Branches { + if err := self.c.PushContext(self.contexts.Branches); err != nil { + return err + } + } + + self.contexts.LocalCommits.SetSelectedLineIdx(0) + self.contexts.Branches.SetSelectedLineIdx(0) + + return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}) + }, + }) +} + +// sanitizedBranchName will remove all spaces in favor of a dash "-" to meet +// git's branch naming requirement. +func sanitizedBranchName(input string) string { + return strings.Replace(input, " ", "-", -1) +} diff --git a/pkg/gui/controllers/helpers/suggestions_helper.go b/pkg/gui/controllers/helpers/suggestions_helper.go new file mode 100644 index 000000000..0cc4a642b --- /dev/null +++ b/pkg/gui/controllers/helpers/suggestions_helper.go @@ -0,0 +1,197 @@ +package helpers + +import ( + "fmt" + "os" + + "github.com/jesseduffield/generics/slices" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/presentation" + "github.com/jesseduffield/lazygit/pkg/gui/types" + "github.com/jesseduffield/lazygit/pkg/utils" + "github.com/jesseduffield/minimal/gitignore" + "github.com/samber/lo" + "gopkg.in/ozeidan/fuzzy-patricia.v3/patricia" +) + +// Thinking out loud: I'm typically a staunch advocate of organising code by feature rather than type, +// because colocating code that relates to the same feature means far less effort +// to get all the context you need to work on any particular feature. But the one +// major benefit of grouping by type is that it makes it makes it less likely that +// somebody will re-implement the same logic twice, because they can quickly see +// if a certain method has been used for some use case, given that as a starting point +// they know about the type. In that vein, I'm including all our functions for +// finding suggestions in this file, so that it's easy to see if a function already +// exists for fetching a particular model. + +type ISuggestionsHelper interface { + GetRemoteSuggestionsFunc() func(string) []*types.Suggestion + GetBranchNameSuggestionsFunc() func(string) []*types.Suggestion + GetFilePathSuggestionsFunc() func(string) []*types.Suggestion + GetRemoteBranchesSuggestionsFunc(separator string) func(string) []*types.Suggestion + GetRefsSuggestionsFunc() func(string) []*types.Suggestion +} + +type SuggestionsHelper struct { + c *types.HelperCommon + + model *types.Model + refreshSuggestionsFn func() +} + +var _ ISuggestionsHelper = &SuggestionsHelper{} + +func NewSuggestionsHelper( + c *types.HelperCommon, + model *types.Model, + refreshSuggestionsFn func(), +) *SuggestionsHelper { + return &SuggestionsHelper{ + c: c, + model: model, + refreshSuggestionsFn: refreshSuggestionsFn, + } +} + +func (self *SuggestionsHelper) getRemoteNames() []string { + return slices.Map(self.model.Remotes, func(remote *models.Remote) string { + return remote.Name + }) +} + +func matchesToSuggestions(matches []string) []*types.Suggestion { + return slices.Map(matches, func(match string) *types.Suggestion { + return &types.Suggestion{ + Value: match, + Label: match, + } + }) +} + +func (self *SuggestionsHelper) GetRemoteSuggestionsFunc() func(string) []*types.Suggestion { + remoteNames := self.getRemoteNames() + + return FuzzySearchFunc(remoteNames) +} + +func (self *SuggestionsHelper) getBranchNames() []string { + return slices.Map(self.model.Branches, func(branch *models.Branch) string { + return branch.Name + }) +} + +func (self *SuggestionsHelper) GetBranchNameSuggestionsFunc() func(string) []*types.Suggestion { + branchNames := self.getBranchNames() + + return func(input string) []*types.Suggestion { + var matchingBranchNames []string + if input == "" { + matchingBranchNames = branchNames + } else { + matchingBranchNames = utils.FuzzySearch(input, branchNames) + } + + return slices.Map(matchingBranchNames, func(branchName string) *types.Suggestion { + return &types.Suggestion{ + Value: branchName, + Label: presentation.GetBranchTextStyle(branchName).Sprint(branchName), + } + }) + } +} + +// here we asynchronously fetch the latest set of paths in the repo and store in +// self.model.FilesTrie. On the main thread we'll be doing a fuzzy search via +// self.model.FilesTrie. So if we've looked for a file previously, we'll start with +// the old trie and eventually it'll be swapped out for the new one. +// Notably, unlike other suggestion functions we're not showing all the options +// if nothing has been typed because there'll be too much to display efficiently +func (self *SuggestionsHelper) GetFilePathSuggestionsFunc() func(string) []*types.Suggestion { + _ = self.c.WithWaitingStatus(self.c.Tr.LcLoadingFileSuggestions, func() error { + trie := patricia.NewTrie() + // load every non-gitignored file in the repo + ignore, err := gitignore.FromGit() + if err != nil { + return err + } + + err = ignore.Walk(".", + func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + trie.Insert(patricia.Prefix(path), path) + return nil + }) + + // cache the trie for future use + self.model.FilesTrie = trie + + self.refreshSuggestionsFn() + + return err + }) + + return func(input string) []*types.Suggestion { + matchingNames := []string{} + _ = self.model.FilesTrie.VisitFuzzy(patricia.Prefix(input), true, func(prefix patricia.Prefix, item patricia.Item, skipped int) error { + matchingNames = append(matchingNames, item.(string)) + return nil + }) + + // doing another fuzzy search for good measure + matchingNames = utils.FuzzySearch(input, matchingNames) + + return matchesToSuggestions(matchingNames) + } +} + +func (self *SuggestionsHelper) getRemoteBranchNames(separator string) []string { + return slices.FlatMap(self.model.Remotes, func(remote *models.Remote) []string { + return slices.Map(remote.Branches, func(branch *models.RemoteBranch) string { + return fmt.Sprintf("%s%s%s", remote.Name, separator, branch.Name) + }) + }) +} + +func (self *SuggestionsHelper) GetRemoteBranchesSuggestionsFunc(separator string) func(string) []*types.Suggestion { + return FuzzySearchFunc(self.getRemoteBranchNames(separator)) +} + +func (self *SuggestionsHelper) getTagNames() []string { + return slices.Map(self.model.Tags, func(tag *models.Tag) string { + return tag.Name + }) +} + +func (self *SuggestionsHelper) GetRefsSuggestionsFunc() func(string) []*types.Suggestion { + remoteBranchNames := self.getRemoteBranchNames("/") + localBranchNames := self.getBranchNames() + tagNames := self.getTagNames() + additionalRefNames := []string{"HEAD", "FETCH_HEAD", "MERGE_HEAD", "ORIG_HEAD"} + + refNames := append(append(append(remoteBranchNames, localBranchNames...), tagNames...), additionalRefNames...) + + return FuzzySearchFunc(refNames) +} + +func (self *SuggestionsHelper) GetAuthorsSuggestionsFunc() func(string) []*types.Suggestion { + authors := lo.Uniq(slices.Map(self.model.Commits, func(commit *models.Commit) string { + return fmt.Sprintf("%s <%s>", commit.AuthorName, commit.AuthorEmail) + })) + + return FuzzySearchFunc(authors) +} + +func FuzzySearchFunc(options []string) func(string) []*types.Suggestion { + return func(input string) []*types.Suggestion { + var matches []string + if input == "" { + matches = options + } else { + matches = utils.FuzzySearch(input, options) + } + + return matchesToSuggestions(matches) + } +} diff --git a/pkg/gui/controllers/helpers/tags_helper.go b/pkg/gui/controllers/helpers/tags_helper.go new file mode 100644 index 000000000..4683ffd0d --- /dev/null +++ b/pkg/gui/controllers/helpers/tags_helper.go @@ -0,0 +1,80 @@ +package helpers + +import ( + "github.com/jesseduffield/lazygit/pkg/commands" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +// Helper structs are for defining functionality that could be used by multiple contexts. +// For example, here we have a CreateTagMenu which is applicable to both the tags context +// and the commits context. + +type TagsHelper struct { + c *types.HelperCommon + git *commands.GitCommand +} + +func NewTagsHelper(c *types.HelperCommon, git *commands.GitCommand) *TagsHelper { + return &TagsHelper{ + c: c, + git: git, + } +} + +func (self *TagsHelper) CreateTagMenu(commitSha string, onCreate func()) error { + return self.c.Menu(types.CreateMenuOptions{ + Title: self.c.Tr.TagMenuTitle, + Items: []*types.MenuItem{ + { + Label: self.c.Tr.LcLightweightTag, + OnPress: func() error { + return self.handleCreateLightweightTag(commitSha, onCreate) + }, + }, + { + Label: self.c.Tr.LcAnnotatedTag, + OnPress: func() error { + return self.handleCreateAnnotatedTag(commitSha, onCreate) + }, + }, + }, + }) +} + +func (self *TagsHelper) afterTagCreate(onCreate func()) error { + onCreate() + return self.c.Refresh(types.RefreshOptions{ + Mode: types.ASYNC, Scope: []types.RefreshableView{types.COMMITS, types.TAGS}, + }) +} + +func (self *TagsHelper) handleCreateAnnotatedTag(commitSha string, onCreate func()) error { + return self.c.Prompt(types.PromptOpts{ + Title: self.c.Tr.TagNameTitle, + HandleConfirm: func(tagName string) error { + return self.c.Prompt(types.PromptOpts{ + Title: self.c.Tr.TagMessageTitle, + HandleConfirm: func(msg string) error { + self.c.LogAction(self.c.Tr.Actions.CreateAnnotatedTag) + if err := self.git.Tag.CreateAnnotated(tagName, commitSha, msg); err != nil { + return self.c.Error(err) + } + return self.afterTagCreate(onCreate) + }, + }) + }, + }) +} + +func (self *TagsHelper) handleCreateLightweightTag(commitSha string, onCreate func()) error { + return self.c.Prompt(types.PromptOpts{ + Title: self.c.Tr.TagNameTitle, + HandleConfirm: func(tagName string) error { + self.c.LogAction(self.c.Tr.Actions.CreateLightweightTag) + if err := self.git.Tag.CreateLightweight(tagName, commitSha); err != nil { + return self.c.Error(err) + } + return self.afterTagCreate(onCreate) + }, + }) +} diff --git a/pkg/gui/controllers/helpers/upstream_helper.go b/pkg/gui/controllers/helpers/upstream_helper.go new file mode 100644 index 000000000..a2d8e8ae2 --- /dev/null +++ b/pkg/gui/controllers/helpers/upstream_helper.go @@ -0,0 +1,88 @@ +package helpers + +import ( + "errors" + "strings" + + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type UpstreamHelper struct { + c *types.HelperCommon + model *types.Model + + getRemoteBranchesSuggestionsFunc func(string) func(string) []*types.Suggestion +} + +type IUpstreamHelper interface { + ParseUpstream(string) (string, string, error) + PromptForUpstreamWithInitialContent(*models.Branch, func(string) error) error + PromptForUpstreamWithoutInitialContent(*models.Branch, func(string) error) error + GetSuggestedRemote() string +} + +var _ IUpstreamHelper = &UpstreamHelper{} + +func NewUpstreamHelper( + c *types.HelperCommon, + model *types.Model, + getRemoteBranchesSuggestionsFunc func(string) func(string) []*types.Suggestion, +) *UpstreamHelper { + return &UpstreamHelper{ + c: c, + model: model, + getRemoteBranchesSuggestionsFunc: getRemoteBranchesSuggestionsFunc, + } +} + +func (self *UpstreamHelper) ParseUpstream(upstream string) (string, string, error) { + var upstreamBranch, upstreamRemote string + split := strings.Split(upstream, " ") + if len(split) != 2 { + return "", "", errors.New(self.c.Tr.InvalidUpstream) + } + + upstreamRemote = split[0] + upstreamBranch = split[1] + + return upstreamRemote, upstreamBranch, nil +} + +func (self *UpstreamHelper) promptForUpstream(initialContent string, onConfirm func(string) error) error { + return self.c.Prompt(types.PromptOpts{ + Title: self.c.Tr.EnterUpstream, + InitialContent: initialContent, + FindSuggestionsFunc: self.getRemoteBranchesSuggestionsFunc(" "), + HandleConfirm: onConfirm, + }) +} + +func (self *UpstreamHelper) PromptForUpstreamWithInitialContent(currentBranch *models.Branch, onConfirm func(string) error) error { + suggestedRemote := self.GetSuggestedRemote() + initialContent := suggestedRemote + " " + currentBranch.Name + + return self.promptForUpstream(initialContent, onConfirm) +} + +func (self *UpstreamHelper) PromptForUpstreamWithoutInitialContent(_ *models.Branch, onConfirm func(string) error) error { + return self.promptForUpstream("", onConfirm) +} + +func (self *UpstreamHelper) GetSuggestedRemote() string { + return getSuggestedRemote(self.model.Remotes) +} + +func getSuggestedRemote(remotes []*models.Remote) string { + if len(remotes) == 0 { + return "origin" + } + + for _, remote := range remotes { + if remote.Name == "origin" { + return remote.Name + } + } + + return remotes[0].Name +} diff --git a/pkg/gui/controllers/helpers/upstream_helper_test.go b/pkg/gui/controllers/helpers/upstream_helper_test.go new file mode 100644 index 000000000..ac7a6a8bf --- /dev/null +++ b/pkg/gui/controllers/helpers/upstream_helper_test.go @@ -0,0 +1,31 @@ +package helpers + +import ( + "testing" + + "github.com/jesseduffield/generics/slices" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/stretchr/testify/assert" +) + +func TestGetSuggestedRemote(t *testing.T) { + cases := []struct { + remotes []*models.Remote + expected string + }{ + {mkRemoteList(), "origin"}, + {mkRemoteList("upstream", "origin", "foo"), "origin"}, + {mkRemoteList("upstream", "foo", "bar"), "upstream"}, + } + + for _, c := range cases { + result := getSuggestedRemote(c.remotes) + assert.EqualValues(t, c.expected, result) + } +} + +func mkRemoteList(names ...string) []*models.Remote { + return slices.Map(names, func(name string) *models.Remote { + return &models.Remote{Name: name} + }) +} diff --git a/pkg/gui/controllers/helpers/working_tree_helper.go b/pkg/gui/controllers/helpers/working_tree_helper.go new file mode 100644 index 000000000..ab52a37c7 --- /dev/null +++ b/pkg/gui/controllers/helpers/working_tree_helper.go @@ -0,0 +1,74 @@ +package helpers + +import ( + "github.com/jesseduffield/lazygit/pkg/commands" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type IWorkingTreeHelper interface { + AnyStagedFiles() bool + AnyTrackedFiles() bool + IsWorkingTreeDirty() bool + FileForSubmodule(submodule *models.SubmoduleConfig) *models.File +} + +type WorkingTreeHelper struct { + c *types.HelperCommon + git *commands.GitCommand + + model *types.Model +} + +func NewWorkingTreeHelper(c *types.HelperCommon, git *commands.GitCommand, model *types.Model) *WorkingTreeHelper { + return &WorkingTreeHelper{ + c: c, + git: git, + model: model, + } +} + +func (self *WorkingTreeHelper) AnyStagedFiles() bool { + for _, file := range self.model.Files { + if file.HasStagedChanges { + return true + } + } + return false +} + +func (self *WorkingTreeHelper) AnyTrackedFiles() bool { + for _, file := range self.model.Files { + if file.Tracked { + return true + } + } + return false +} + +func (self *WorkingTreeHelper) IsWorkingTreeDirty() bool { + return self.AnyStagedFiles() || self.AnyTrackedFiles() +} + +func (self *WorkingTreeHelper) FileForSubmodule(submodule *models.SubmoduleConfig) *models.File { + for _, file := range self.model.Files { + if file.IsSubmodule([]*models.SubmoduleConfig{submodule}) { + return file + } + } + + return nil +} + +func (self *WorkingTreeHelper) OpenMergeTool() error { + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.MergeToolTitle, + Prompt: self.c.Tr.MergeToolPrompt, + HandleConfirm: func() error { + self.c.LogAction(self.c.Tr.Actions.OpenMergeTool) + return self.c.RunSubprocessAndRefresh( + self.git.WorkingTree.OpenMergeToolCmdObj(), + ) + }, + }) +} diff --git a/pkg/gui/controllers/list_controller.go b/pkg/gui/controllers/list_controller.go new file mode 100644 index 000000000..c74d87244 --- /dev/null +++ b/pkg/gui/controllers/list_controller.go @@ -0,0 +1,202 @@ +package controllers + +import ( + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type ListControllerFactory struct { + c *types.HelperCommon +} + +func NewListControllerFactory(c *types.HelperCommon) *ListControllerFactory { + return &ListControllerFactory{ + c: c, + } +} + +func (self *ListControllerFactory) Create(context types.IListContext) *ListController { + return &ListController{ + baseController: baseController{}, + c: self.c, + context: context, + } +} + +type ListController struct { + baseController + c *types.HelperCommon + + context types.IListContext +} + +func (self *ListController) Context() types.Context { + return self.context +} + +func (self *ListController) HandlePrevLine() error { + return self.handleLineChange(-1) +} + +func (self *ListController) HandleNextLine() error { + return self.handleLineChange(1) +} + +func (self *ListController) HandleScrollLeft() error { + return self.scrollHorizontal(self.context.GetViewTrait().ScrollLeft) +} + +func (self *ListController) HandleScrollRight() error { + return self.scrollHorizontal(self.context.GetViewTrait().ScrollRight) +} + +func (self *ListController) HandleScrollUp() error { + scrollHeight := self.c.UserConfig.Gui.ScrollHeight + self.context.GetViewTrait().ScrollUp(scrollHeight) + + // we only need to do a line change if our line has been pushed out of the viewport, because + // at the moment much logic depends on the selected line always being visible + if !self.isSelectedLineInViewPort() { + return self.handleLineChange(-scrollHeight) + } + + return nil +} + +func (self *ListController) HandleScrollDown() error { + scrollHeight := self.c.UserConfig.Gui.ScrollHeight + self.context.GetViewTrait().ScrollDown(scrollHeight) + + if !self.isSelectedLineInViewPort() { + return self.handleLineChange(scrollHeight) + } + + return nil +} + +func (self *ListController) isSelectedLineInViewPort() bool { + selectedLineIdx := self.context.GetList().GetSelectedLineIdx() + startIdx, length := self.context.GetViewTrait().ViewPortYBounds() + return selectedLineIdx >= startIdx && selectedLineIdx < startIdx+length +} + +func (self *ListController) scrollHorizontal(scrollFunc func()) error { + scrollFunc() + + return self.context.HandleFocus(types.OnFocusOpts{}) +} + +func (self *ListController) handleLineChange(change int) error { + before := self.context.GetList().GetSelectedLineIdx() + self.context.GetList().MoveSelectedLine(change) + after := self.context.GetList().GetSelectedLineIdx() + + if err := self.pushContextIfNotFocused(); err != nil { + return err + } + + // doing this check so that if we're holding the up key at the start of the list + // we're not constantly re-rendering the main view. + if before != after { + return self.context.HandleFocus(types.OnFocusOpts{}) + } + + return nil +} + +func (self *ListController) HandlePrevPage() error { + return self.handleLineChange(-self.context.GetViewTrait().PageDelta()) +} + +func (self *ListController) HandleNextPage() error { + return self.handleLineChange(self.context.GetViewTrait().PageDelta()) +} + +func (self *ListController) HandleGotoTop() error { + return self.handleLineChange(-self.context.GetList().Len()) +} + +func (self *ListController) HandleGotoBottom() error { + return self.handleLineChange(self.context.GetList().Len()) +} + +func (self *ListController) HandleClick(opts gocui.ViewMouseBindingOpts) error { + prevSelectedLineIdx := self.context.GetList().GetSelectedLineIdx() + newSelectedLineIdx := opts.Y + alreadyFocused := self.isFocused() + + if err := self.pushContextIfNotFocused(); err != nil { + return err + } + + if newSelectedLineIdx > self.context.GetList().Len()-1 { + return nil + } + + self.context.GetList().SetSelectedLineIdx(newSelectedLineIdx) + + if prevSelectedLineIdx == newSelectedLineIdx && alreadyFocused && self.context.GetOnClick() != nil { + return self.context.GetOnClick()() + } + return self.context.HandleFocus(types.OnFocusOpts{}) +} + +func (self *ListController) pushContextIfNotFocused() error { + if !self.isFocused() { + if err := self.c.PushContext(self.context); err != nil { + return err + } + } + + return nil +} + +func (self *ListController) isFocused() bool { + return self.c.CurrentContext().GetKey() == self.context.GetKey() +} + +func (self *ListController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { + return []*types.Binding{ + {Tag: "navigation", Key: opts.GetKey(opts.Config.Universal.PrevItemAlt), Handler: self.HandlePrevLine}, + {Tag: "navigation", Key: opts.GetKey(opts.Config.Universal.PrevItem), Handler: self.HandlePrevLine}, + {Tag: "navigation", Key: opts.GetKey(opts.Config.Universal.NextItemAlt), Handler: self.HandleNextLine}, + {Tag: "navigation", Key: opts.GetKey(opts.Config.Universal.NextItem), Handler: self.HandleNextLine}, + {Tag: "navigation", Key: opts.GetKey(opts.Config.Universal.PrevPage), Handler: self.HandlePrevPage, Description: self.c.Tr.LcPrevPage}, + {Tag: "navigation", Key: opts.GetKey(opts.Config.Universal.NextPage), Handler: self.HandleNextPage, Description: self.c.Tr.LcNextPage}, + {Tag: "navigation", Key: opts.GetKey(opts.Config.Universal.GotoTop), Handler: self.HandleGotoTop, Description: self.c.Tr.LcGotoTop}, + {Tag: "navigation", Key: opts.GetKey(opts.Config.Universal.ScrollLeft), Handler: self.HandleScrollLeft}, + {Tag: "navigation", Key: opts.GetKey(opts.Config.Universal.ScrollRight), Handler: self.HandleScrollRight}, + { + Key: opts.GetKey(opts.Config.Universal.StartSearch), + Handler: func() error { self.c.OpenSearch(); return nil }, + Description: self.c.Tr.LcStartSearch, + Tag: "navigation", + }, + { + Key: opts.GetKey(opts.Config.Universal.GotoBottom), + Description: self.c.Tr.LcGotoBottom, + Handler: self.HandleGotoBottom, + Tag: "navigation", + }, + } +} + +func (self *ListController) GetMouseKeybindings(opts types.KeybindingsOpts) []*gocui.ViewMouseBinding { + return []*gocui.ViewMouseBinding{ + { + ViewName: self.context.GetViewName(), + Key: gocui.MouseWheelUp, + Handler: func(gocui.ViewMouseBindingOpts) error { return self.HandleScrollUp() }, + }, + { + ViewName: self.context.GetViewName(), + Key: gocui.MouseLeft, + Handler: func(opts gocui.ViewMouseBindingOpts) error { return self.HandleClick(opts) }, + }, + { + ViewName: self.context.GetViewName(), + Key: gocui.MouseWheelDown, + Handler: func(gocui.ViewMouseBindingOpts) error { return self.HandleScrollDown() }, + }, + } +} diff --git a/pkg/gui/controllers/local_commits_controller.go b/pkg/gui/controllers/local_commits_controller.go new file mode 100644 index 000000000..6539a13af --- /dev/null +++ b/pkg/gui/controllers/local_commits_controller.go @@ -0,0 +1,717 @@ +package controllers + +import ( + "fmt" + + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/context" + "github.com/jesseduffield/lazygit/pkg/gui/types" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +type ( + PullFilesFn func() error +) + +type LocalCommitsController struct { + baseController + *controllerCommon + + pullFiles PullFilesFn +} + +var _ types.IController = &LocalCommitsController{} + +func NewLocalCommitsController( + common *controllerCommon, + pullFiles PullFilesFn, +) *LocalCommitsController { + return &LocalCommitsController{ + baseController: baseController{}, + controllerCommon: common, + pullFiles: pullFiles, + } +} + +func (self *LocalCommitsController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { + outsideFilterModeBindings := []*types.Binding{ + { + Key: opts.GetKey(opts.Config.Commits.SquashDown), + Handler: self.checkSelected(self.squashDown), + Description: self.c.Tr.LcSquashDown, + }, + { + Key: opts.GetKey(opts.Config.Commits.MarkCommitAsFixup), + Handler: self.checkSelected(self.fixup), + Description: self.c.Tr.LcFixupCommit, + }, + { + Key: opts.GetKey(opts.Config.Commits.RenameCommit), + Handler: self.checkSelected(self.reword), + Description: self.c.Tr.LcRewordCommit, + }, + { + Key: opts.GetKey(opts.Config.Commits.RenameCommitWithEditor), + Handler: self.checkSelected(self.rewordEditor), + Description: self.c.Tr.LcRenameCommitEditor, + }, + { + Key: opts.GetKey(opts.Config.Universal.Remove), + Handler: self.checkSelected(self.drop), + Description: self.c.Tr.LcDeleteCommit, + }, + { + Key: opts.GetKey(opts.Config.Universal.Edit), + Handler: self.checkSelected(self.edit), + Description: self.c.Tr.LcEditCommit, + }, + { + Key: opts.GetKey(opts.Config.Commits.PickCommit), + Handler: self.checkSelected(self.pick), + Description: self.c.Tr.LcPickCommit, + }, + { + Key: opts.GetKey(opts.Config.Commits.CreateFixupCommit), + Handler: self.checkSelected(self.createFixupCommit), + Description: self.c.Tr.LcCreateFixupCommit, + }, + { + Key: opts.GetKey(opts.Config.Commits.SquashAboveCommits), + Handler: self.checkSelected(self.squashAllAboveFixupCommits), + Description: self.c.Tr.LcSquashAboveCommits, + }, + { + Key: opts.GetKey(opts.Config.Commits.MoveDownCommit), + Handler: self.checkSelected(self.moveDown), + Description: self.c.Tr.LcMoveDownCommit, + }, + { + Key: opts.GetKey(opts.Config.Commits.MoveUpCommit), + Handler: self.checkSelected(self.moveUp), + Description: self.c.Tr.LcMoveUpCommit, + }, + { + Key: opts.GetKey(opts.Config.Commits.PasteCommits), + Handler: opts.Guards.OutsideFilterMode(self.paste), + Description: self.c.Tr.LcPasteCommits, + }, + // overriding these navigation keybindings because we might need to load + // more commits on demand + { + Key: opts.GetKey(opts.Config.Universal.StartSearch), + Handler: self.openSearch, + Description: self.c.Tr.LcStartSearch, + Tag: "navigation", + }, + { + Key: opts.GetKey(opts.Config.Universal.GotoBottom), + Handler: self.gotoBottom, + Description: self.c.Tr.LcGotoBottom, + Tag: "navigation", + }, + } + + for _, binding := range outsideFilterModeBindings { + binding.Handler = opts.Guards.OutsideFilterMode(binding.Handler) + } + + bindings := append(outsideFilterModeBindings, []*types.Binding{ + { + Key: opts.GetKey(opts.Config.Commits.AmendToCommit), + Handler: self.checkSelected(self.amendTo), + Description: self.c.Tr.LcAmendToCommit, + }, + { + Key: opts.GetKey(opts.Config.Commits.ResetCommitAuthor), + Handler: self.checkSelected(self.amendAttribute), + Description: self.c.Tr.LcResetCommitAuthor, + }, + { + Key: opts.GetKey(opts.Config.Commits.RevertCommit), + Handler: self.checkSelected(self.revert), + Description: self.c.Tr.LcRevertCommit, + }, + { + Key: opts.GetKey(opts.Config.Commits.TagCommit), + Handler: self.checkSelected(self.createTag), + Description: self.c.Tr.LcTagCommit, + }, + { + Key: opts.GetKey(opts.Config.Commits.OpenLogMenu), + Handler: self.handleOpenLogMenu, + Description: self.c.Tr.LcOpenLogMenu, + OpensMenu: true, + }, + }...) + + return bindings +} + +func (self *LocalCommitsController) squashDown(commit *models.Commit) error { + if len(self.model.Commits) <= 1 { + return self.c.ErrorMsg(self.c.Tr.YouNoCommitsToSquash) + } + + applied, err := self.handleMidRebaseCommand("squash", commit) + if err != nil { + return err + } + if applied { + return nil + } + + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.Squash, + Prompt: self.c.Tr.SureSquashThisCommit, + HandleConfirm: func() error { + return self.c.WithWaitingStatus(self.c.Tr.SquashingStatus, func() error { + self.c.LogAction(self.c.Tr.Actions.SquashCommitDown) + return self.interactiveRebase("squash") + }) + }, + }) +} + +func (self *LocalCommitsController) fixup(commit *models.Commit) error { + if len(self.model.Commits) <= 1 { + return self.c.ErrorMsg(self.c.Tr.YouNoCommitsToSquash) + } + + applied, err := self.handleMidRebaseCommand("fixup", commit) + if err != nil { + return err + } + if applied { + return nil + } + + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.Fixup, + Prompt: self.c.Tr.SureFixupThisCommit, + HandleConfirm: func() error { + return self.c.WithWaitingStatus(self.c.Tr.FixingStatus, func() error { + self.c.LogAction(self.c.Tr.Actions.FixupCommit) + return self.interactiveRebase("fixup") + }) + }, + }) +} + +func (self *LocalCommitsController) reword(commit *models.Commit) error { + applied, err := self.handleMidRebaseCommand("reword", commit) + if err != nil { + return err + } + if applied { + return nil + } + + message, err := self.git.Commit.GetCommitMessage(commit.Sha) + if err != nil { + return self.c.Error(err) + } + + // TODO: use the commit message panel here + return self.c.Prompt(types.PromptOpts{ + Title: self.c.Tr.LcRewordCommit, + InitialContent: message, + HandleConfirm: func(response string) error { + self.c.LogAction(self.c.Tr.Actions.RewordCommit) + if err := self.git.Rebase.RewordCommit(self.model.Commits, self.context().GetSelectedLineIdx(), response); err != nil { + return self.c.Error(err) + } + + return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}) + }, + }) +} + +func (self *LocalCommitsController) rewordEditor(commit *models.Commit) error { + midRebase, err := self.handleMidRebaseCommand("reword", commit) + if err != nil { + return err + } + if midRebase { + return nil + } + + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.RewordInEditorTitle, + Prompt: self.c.Tr.RewordInEditorPrompt, + HandleConfirm: func() error { + self.c.LogAction(self.c.Tr.Actions.RewordCommit) + + if self.context().GetSelectedLineIdx() == 0 { + return self.c.RunSubprocessAndRefresh(self.os.Cmd.New("git commit --allow-empty --amend --only")) + } + + subProcess, err := self.git.Rebase.RewordCommitInEditor( + self.model.Commits, self.context().GetSelectedLineIdx(), + ) + if err != nil { + return self.c.Error(err) + } + if subProcess != nil { + return self.c.RunSubprocessAndRefresh(subProcess) + } + + return nil + }, + }) +} + +func (self *LocalCommitsController) drop(commit *models.Commit) error { + applied, err := self.handleMidRebaseCommand("drop", commit) + if err != nil { + return err + } + if applied { + return nil + } + + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.DeleteCommitTitle, + Prompt: self.c.Tr.DeleteCommitPrompt, + HandleConfirm: func() error { + return self.c.WithWaitingStatus(self.c.Tr.DeletingStatus, func() error { + self.c.LogAction(self.c.Tr.Actions.DropCommit) + return self.interactiveRebase("drop") + }) + }, + }) +} + +func (self *LocalCommitsController) edit(commit *models.Commit) error { + applied, err := self.handleMidRebaseCommand("edit", commit) + if err != nil { + return err + } + if applied { + return nil + } + + return self.c.WithWaitingStatus(self.c.Tr.RebasingStatus, func() error { + self.c.LogAction(self.c.Tr.Actions.EditCommit) + return self.interactiveRebase("edit") + }) +} + +func (self *LocalCommitsController) pick(commit *models.Commit) error { + applied, err := self.handleMidRebaseCommand("pick", commit) + if err != nil { + return err + } + if applied { + return nil + } + + // at this point we aren't actually rebasing so we will interpret this as an + // attempt to pull. We might revoke this later after enabling configurable keybindings + return self.pullFiles() +} + +func (self *LocalCommitsController) interactiveRebase(action string) error { + err := self.git.Rebase.InteractiveRebase(self.model.Commits, self.context().GetSelectedLineIdx(), action) + return self.helpers.MergeAndRebase.CheckMergeOrRebase(err) +} + +// handleMidRebaseCommand sees if the selected commit is in fact a rebasing +// commit meaning you are trying to edit the todo file rather than actually +// begin a rebase. It then updates the todo file with that action +func (self *LocalCommitsController) handleMidRebaseCommand(action string, commit *models.Commit) (bool, error) { + if commit.Status != "rebasing" { + return false, nil + } + + // for now we do not support setting 'reword' because it requires an editor + // and that means we either unconditionally wait around for the subprocess to ask for + // our input or we set a lazygit client as the EDITOR env variable and have it + // request us to edit the commit message when prompted. + if action == "reword" { + return true, self.c.ErrorMsg(self.c.Tr.LcRewordNotSupported) + } + + self.c.LogAction("Update rebase TODO") + self.c.LogCommand( + fmt.Sprintf("Updating rebase action of commit %s to '%s'", commit.ShortSha(), action), + false, + ) + + if err := self.git.Rebase.EditRebaseTodo( + self.context().GetSelectedLineIdx(), action, + ); err != nil { + return false, self.c.Error(err) + } + + return true, self.c.Refresh(types.RefreshOptions{ + Mode: types.SYNC, Scope: []types.RefreshableView{types.REBASE_COMMITS}, + }) +} + +func (self *LocalCommitsController) moveDown(commit *models.Commit) error { + index := self.context().GetSelectedLineIdx() + commits := self.model.Commits + if commit.Status == "rebasing" { + if commits[index+1].Status != "rebasing" { + return nil + } + + // logging directly here because MoveTodoDown doesn't have enough information + // to provide a useful log + self.c.LogAction(self.c.Tr.Actions.MoveCommitDown) + self.c.LogCommand(fmt.Sprintf("Moving commit %s down", commit.ShortSha()), false) + + if err := self.git.Rebase.MoveTodoDown(index); err != nil { + return self.c.Error(err) + } + self.context().MoveSelectedLine(1) + return self.c.Refresh(types.RefreshOptions{ + Mode: types.SYNC, Scope: []types.RefreshableView{types.REBASE_COMMITS}, + }) + } + + return self.c.WithWaitingStatus(self.c.Tr.MovingStatus, func() error { + self.c.LogAction(self.c.Tr.Actions.MoveCommitDown) + err := self.git.Rebase.MoveCommitDown(self.model.Commits, index) + if err == nil { + self.context().MoveSelectedLine(1) + } + return self.helpers.MergeAndRebase.CheckMergeOrRebase(err) + }) +} + +func (self *LocalCommitsController) moveUp(commit *models.Commit) error { + index := self.context().GetSelectedLineIdx() + if index == 0 { + return nil + } + + if commit.Status == "rebasing" { + // logging directly here because MoveTodoDown doesn't have enough information + // to provide a useful log + self.c.LogAction(self.c.Tr.Actions.MoveCommitUp) + self.c.LogCommand( + fmt.Sprintf("Moving commit %s up", commit.ShortSha()), + false, + ) + + if err := self.git.Rebase.MoveTodoDown(index - 1); err != nil { + return self.c.Error(err) + } + self.context().MoveSelectedLine(-1) + return self.c.Refresh(types.RefreshOptions{ + Mode: types.SYNC, Scope: []types.RefreshableView{types.REBASE_COMMITS}, + }) + } + + return self.c.WithWaitingStatus(self.c.Tr.MovingStatus, func() error { + self.c.LogAction(self.c.Tr.Actions.MoveCommitUp) + err := self.git.Rebase.MoveCommitDown(self.model.Commits, index-1) + if err == nil { + self.context().MoveSelectedLine(-1) + } + return self.helpers.MergeAndRebase.CheckMergeOrRebase(err) + }) +} + +func (self *LocalCommitsController) amendTo(commit *models.Commit) error { + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.AmendCommitTitle, + Prompt: self.c.Tr.AmendCommitPrompt, + HandleConfirm: func() error { + return self.c.WithWaitingStatus(self.c.Tr.AmendingStatus, func() error { + self.c.LogAction(self.c.Tr.Actions.AmendCommit) + err := self.git.Rebase.AmendTo(commit.Sha) + return self.helpers.MergeAndRebase.CheckMergeOrRebase(err) + }) + }, + }) +} + +func (self *LocalCommitsController) amendAttribute(commit *models.Commit) error { + return self.c.Menu(types.CreateMenuOptions{ + Title: "Amend commit attribute", + Items: []*types.MenuItem{ + { + Label: "reset author", + OnPress: self.resetAuthor, + Key: 'a', + Tooltip: "Reset the commit's author to the currently configured user. This will also renew the author timestamp", + }, + { + Label: "set author", + OnPress: self.setAuthor, + Key: 'A', + Tooltip: "Set the author based on a prompt", + }, + }, + }) +} + +func (self *LocalCommitsController) resetAuthor() error { + return self.c.WithWaitingStatus(self.c.Tr.AmendingStatus, func() error { + self.c.LogAction(self.c.Tr.Actions.ResetCommitAuthor) + if err := self.git.Rebase.ResetCommitAuthor(self.model.Commits, self.context().GetSelectedLineIdx()); err != nil { + return self.c.Error(err) + } + + return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}) + }) +} + +func (self *LocalCommitsController) setAuthor() error { + return self.c.Prompt(types.PromptOpts{ + Title: self.c.Tr.SetAuthorPromptTitle, + FindSuggestionsFunc: self.helpers.Suggestions.GetAuthorsSuggestionsFunc(), + HandleConfirm: func(value string) error { + return self.c.WithWaitingStatus(self.c.Tr.AmendingStatus, func() error { + self.c.LogAction(self.c.Tr.Actions.SetCommitAuthor) + if err := self.git.Rebase.SetCommitAuthor(self.model.Commits, self.context().GetSelectedLineIdx(), value); err != nil { + return self.c.Error(err) + } + + return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}) + }) + }, + }) +} + +func (self *LocalCommitsController) revert(commit *models.Commit) error { + if commit.IsMerge() { + return self.createRevertMergeCommitMenu(commit) + } else { + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.Actions.RevertCommit, + Prompt: utils.ResolvePlaceholderString( + self.c.Tr.ConfirmRevertCommit, + map[string]string{ + "selectedCommit": commit.ShortSha(), + }), + HandleConfirm: func() error { + self.c.LogAction(self.c.Tr.Actions.RevertCommit) + if err := self.git.Commit.Revert(commit.Sha); err != nil { + return self.c.Error(err) + } + return self.afterRevertCommit() + }, + }) + } +} + +func (self *LocalCommitsController) createRevertMergeCommitMenu(commit *models.Commit) error { + menuItems := make([]*types.MenuItem, len(commit.Parents)) + for i, parentSha := range commit.Parents { + i := i + message, err := self.git.Commit.GetCommitMessageFirstLine(parentSha) + if err != nil { + return self.c.Error(err) + } + + menuItems[i] = &types.MenuItem{ + Label: fmt.Sprintf("%s: %s", utils.SafeTruncate(parentSha, 8), message), + OnPress: func() error { + parentNumber := i + 1 + self.c.LogAction(self.c.Tr.Actions.RevertCommit) + if err := self.git.Commit.RevertMerge(commit.Sha, parentNumber); err != nil { + return self.c.Error(err) + } + return self.afterRevertCommit() + }, + } + } + + return self.c.Menu(types.CreateMenuOptions{Title: self.c.Tr.SelectParentCommitForMerge, Items: menuItems}) +} + +func (self *LocalCommitsController) afterRevertCommit() error { + self.context().MoveSelectedLine(1) + return self.c.Refresh(types.RefreshOptions{ + Mode: types.BLOCK_UI, Scope: []types.RefreshableView{types.COMMITS, types.BRANCHES}, + }) +} + +func (self *LocalCommitsController) createFixupCommit(commit *models.Commit) error { + prompt := utils.ResolvePlaceholderString( + self.c.Tr.SureCreateFixupCommit, + map[string]string{ + "commit": commit.Sha, + }, + ) + + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.CreateFixupCommit, + Prompt: prompt, + HandleConfirm: func() error { + self.c.LogAction(self.c.Tr.Actions.CreateFixupCommit) + if err := self.git.Commit.CreateFixupCommit(commit.Sha); err != nil { + return self.c.Error(err) + } + + return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}) + }, + }) +} + +func (self *LocalCommitsController) squashAllAboveFixupCommits(commit *models.Commit) error { + prompt := utils.ResolvePlaceholderString( + self.c.Tr.SureSquashAboveCommits, + map[string]string{"commit": commit.Sha}, + ) + + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.SquashAboveCommits, + Prompt: prompt, + HandleConfirm: func() error { + return self.c.WithWaitingStatus(self.c.Tr.SquashingStatus, func() error { + self.c.LogAction(self.c.Tr.Actions.SquashAllAboveFixupCommits) + err := self.git.Rebase.SquashAllAboveFixupCommits(commit.Sha) + return self.helpers.MergeAndRebase.CheckMergeOrRebase(err) + }) + }, + }) +} + +func (self *LocalCommitsController) createTag(commit *models.Commit) error { + return self.helpers.Tags.CreateTagMenu(commit.Sha, func() {}) +} + +func (self *LocalCommitsController) openSearch() error { + // we usually lazyload these commits but now that we're searching we need to load them now + if self.context().GetLimitCommits() { + self.context().SetLimitCommits(false) + if err := self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.COMMITS}}); err != nil { + return err + } + } + + self.c.OpenSearch() + + return nil +} + +func (self *LocalCommitsController) gotoBottom() error { + // we usually lazyload these commits but now that we're jumping to the bottom we need to load them now + if self.context().GetLimitCommits() { + self.context().SetLimitCommits(false) + if err := self.c.Refresh(types.RefreshOptions{Mode: types.SYNC, Scope: []types.RefreshableView{types.COMMITS}}); err != nil { + return err + } + } + + self.context().SetSelectedLineIdx(self.context().Len() - 1) + + return nil +} + +func (self *LocalCommitsController) handleOpenLogMenu() error { + return self.c.Menu(types.CreateMenuOptions{ + Title: self.c.Tr.LogMenuTitle, + Items: []*types.MenuItem{ + { + Label: self.c.Tr.ToggleShowGitGraphAll, + OnPress: func() error { + self.context().SetShowWholeGitGraph(!self.context().GetShowWholeGitGraph()) + + if self.context().GetShowWholeGitGraph() { + self.context().SetLimitCommits(false) + } + + return self.c.WithWaitingStatus(self.c.Tr.LcLoadingCommits, func() error { + return self.c.Refresh( + types.RefreshOptions{Mode: types.SYNC, Scope: []types.RefreshableView{types.COMMITS}}, + ) + }) + }, + }, + { + Label: self.c.Tr.ShowGitGraph, + OpensMenu: true, + OnPress: func() error { + onPress := func(value string) func() error { + return func() error { + self.c.UserConfig.Git.Log.ShowGraph = value + return nil + } + } + return self.c.Menu(types.CreateMenuOptions{ + Title: self.c.Tr.LogMenuTitle, + Items: []*types.MenuItem{ + { + Label: "always", + OnPress: onPress("always"), + }, + { + Label: "never", + OnPress: onPress("never"), + }, + { + Label: "when maximised", + OnPress: onPress("when-maximised"), + }, + }, + }) + }, + }, + { + Label: self.c.Tr.SortCommits, + OpensMenu: true, + OnPress: func() error { + onPress := func(value string) func() error { + return func() error { + self.c.UserConfig.Git.Log.Order = value + return self.c.WithWaitingStatus(self.c.Tr.LcLoadingCommits, func() error { + return self.c.Refresh( + types.RefreshOptions{ + Mode: types.SYNC, + Scope: []types.RefreshableView{types.COMMITS}, + }, + ) + }) + } + } + + return self.c.Menu(types.CreateMenuOptions{ + Title: self.c.Tr.LogMenuTitle, + Items: []*types.MenuItem{ + { + Label: "topological (topo-order)", + OnPress: onPress("topo-order"), + }, + { + Label: "date-order", + OnPress: onPress("date-order"), + }, + { + Label: "author-date-order", + OnPress: onPress("author-date-order"), + }, + }, + }) + }, + }, + }, + }) +} + +func (self *LocalCommitsController) checkSelected(callback func(*models.Commit) error) func() error { + return func() error { + commit := self.context().GetSelected() + if commit == nil { + return nil + } + + return callback(commit) + } +} + +func (self *LocalCommitsController) Context() types.Context { + return self.context() +} + +func (self *LocalCommitsController) context() *context.LocalCommitsContext { + return self.contexts.LocalCommits +} + +func (self *LocalCommitsController) paste() error { + return self.helpers.CherryPick.Paste() +} diff --git a/pkg/gui/controllers/menu_controller.go b/pkg/gui/controllers/menu_controller.go new file mode 100644 index 000000000..9501a0bf2 --- /dev/null +++ b/pkg/gui/controllers/menu_controller.go @@ -0,0 +1,65 @@ +package controllers + +import ( + "github.com/jesseduffield/lazygit/pkg/gui/context" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type MenuController struct { + baseController + *controllerCommon +} + +var _ types.IController = &MenuController{} + +func NewMenuController( + common *controllerCommon, +) *MenuController { + return &MenuController{ + baseController: baseController{}, + controllerCommon: common, + } +} + +func (self *MenuController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { + bindings := []*types.Binding{ + { + Key: opts.GetKey(opts.Config.Universal.Select), + Handler: self.press, + }, + { + Key: opts.GetKey(opts.Config.Universal.Confirm), + Handler: self.press, + }, + { + Key: opts.GetKey(opts.Config.Universal.ConfirmAlt1), + Handler: self.press, + }, + { + Key: opts.GetKey(opts.Config.Universal.Return), + Handler: self.close, + }, + } + + return bindings +} + +func (self *MenuController) GetOnClick() func() error { + return self.press +} + +func (self *MenuController) press() error { + return self.context().OnMenuPress(self.context().GetSelected()) +} + +func (self *MenuController) close() error { + return self.c.PopContext() +} + +func (self *MenuController) Context() types.Context { + return self.context() +} + +func (self *MenuController) context() *context.MenuContext { + return self.contexts.Menu +} diff --git a/pkg/gui/controllers/merge_conflicts_controller.go b/pkg/gui/controllers/merge_conflicts_controller.go new file mode 100644 index 000000000..86d18a6a8 --- /dev/null +++ b/pkg/gui/controllers/merge_conflicts_controller.go @@ -0,0 +1,317 @@ +package controllers + +import ( + "io/ioutil" + + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/gui/context" + "github.com/jesseduffield/lazygit/pkg/gui/mergeconflicts" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type MergeConflictsController struct { + baseController + *controllerCommon +} + +var _ types.IController = &MergeConflictsController{} + +func NewMergeConflictsController( + common *controllerCommon, +) *MergeConflictsController { + return &MergeConflictsController{ + baseController: baseController{}, + controllerCommon: common, + } +} + +func (self *MergeConflictsController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { + bindings := []*types.Binding{ + { + Key: opts.GetKey(opts.Config.Universal.Edit), + Handler: self.HandleEditFile, + Description: self.c.Tr.LcEditFile, + }, + { + Key: opts.GetKey(opts.Config.Universal.OpenFile), + Handler: self.HandleOpenFile, + Description: self.c.Tr.LcOpenFile, + }, + { + Key: opts.GetKey(opts.Config.Universal.PrevBlock), + Handler: self.withRenderAndFocus(self.PrevConflict), + Description: self.c.Tr.PrevConflict, + }, + { + Key: opts.GetKey(opts.Config.Universal.NextBlock), + Handler: self.withRenderAndFocus(self.NextConflict), + Description: self.c.Tr.NextConflict, + }, + { + Key: opts.GetKey(opts.Config.Universal.PrevItem), + Handler: self.withRenderAndFocus(self.PrevConflictHunk), + Description: self.c.Tr.SelectPrevHunk, + }, + { + Key: opts.GetKey(opts.Config.Universal.NextItem), + Handler: self.withRenderAndFocus(self.NextConflictHunk), + Description: self.c.Tr.SelectNextHunk, + }, + { + Key: opts.GetKey(opts.Config.Universal.PrevBlockAlt), + Handler: self.withRenderAndFocus(self.PrevConflict), + }, + { + Key: opts.GetKey(opts.Config.Universal.NextBlockAlt), + Handler: self.withRenderAndFocus(self.NextConflict), + }, + { + Key: opts.GetKey(opts.Config.Universal.PrevItemAlt), + Handler: self.withRenderAndFocus(self.PrevConflictHunk), + }, + { + Key: opts.GetKey(opts.Config.Universal.NextItemAlt), + Handler: self.withRenderAndFocus(self.NextConflictHunk), + }, + { + Key: opts.GetKey(opts.Config.Universal.ScrollLeft), + Handler: self.withRenderAndFocus(self.HandleScrollLeft), + Description: self.c.Tr.LcScrollLeft, + Tag: "navigation", + }, + { + Key: opts.GetKey(opts.Config.Universal.ScrollRight), + Handler: self.withRenderAndFocus(self.HandleScrollRight), + Description: self.c.Tr.LcScrollRight, + Tag: "navigation", + }, + { + Key: opts.GetKey(opts.Config.Universal.Undo), + Handler: self.withRenderAndFocus(self.HandleUndo), + Description: self.c.Tr.LcUndo, + }, + { + Key: opts.GetKey(opts.Config.Files.OpenMergeTool), + Handler: self.helpers.WorkingTree.OpenMergeTool, + Description: self.c.Tr.LcOpenMergeTool, + }, + { + Key: opts.GetKey(opts.Config.Universal.Select), + Handler: self.withRenderAndFocus(self.HandlePickHunk), + Description: self.c.Tr.PickHunk, + }, + { + Key: opts.GetKey(opts.Config.Main.PickBothHunks), + Handler: self.withRenderAndFocus(self.HandlePickAllHunks), + Description: self.c.Tr.PickAllHunks, + }, + { + Key: opts.GetKey(opts.Config.Universal.Return), + Handler: self.Escape, + Description: self.c.Tr.ReturnToFilesPanel, + }, + } + + return bindings +} + +func (self *MergeConflictsController) GetMouseKeybindings(opts types.KeybindingsOpts) []*gocui.ViewMouseBinding { + return []*gocui.ViewMouseBinding{ + { + ViewName: self.context().GetViewName(), + Key: gocui.MouseWheelUp, + Handler: func(gocui.ViewMouseBindingOpts) error { + return self.HandleScrollUp() + }, + }, + { + ViewName: self.context().GetViewName(), + Key: gocui.MouseWheelDown, + Handler: func(gocui.ViewMouseBindingOpts) error { + return self.HandleScrollDown() + }, + }, + } +} + +func (self *MergeConflictsController) HandleScrollUp() error { + self.context().SetUserScrolling(true) + self.context().GetViewTrait().ScrollUp(self.c.UserConfig.Gui.ScrollHeight) + + return nil +} + +func (self *MergeConflictsController) HandleScrollDown() error { + self.context().SetUserScrolling(true) + self.context().GetViewTrait().ScrollDown(self.c.UserConfig.Gui.ScrollHeight) + + return nil +} + +func (self *MergeConflictsController) Context() types.Context { + return self.context() +} + +func (self *MergeConflictsController) context() *context.MergeConflictsContext { + return self.contexts.MergeConflicts +} + +func (self *MergeConflictsController) Escape() error { + return self.c.PushContext(self.contexts.Files) +} + +func (self *MergeConflictsController) HandleEditFile() error { + lineNumber := self.context().GetState().GetSelectedLine() + return self.helpers.Files.EditFileAtLine(self.context().GetState().GetPath(), lineNumber) +} + +func (self *MergeConflictsController) HandleOpenFile() error { + lineNumber := self.context().GetState().GetSelectedLine() + return self.helpers.Files.OpenFileAtLine(self.context().GetState().GetPath(), lineNumber) +} + +func (self *MergeConflictsController) HandleScrollLeft() error { + self.context().GetViewTrait().ScrollLeft() + + return nil +} + +func (self *MergeConflictsController) HandleScrollRight() error { + self.context().GetViewTrait().ScrollRight() + + return nil +} + +func (self *MergeConflictsController) HandleUndo() error { + state := self.context().GetState() + + ok := state.Undo() + if !ok { + return nil + } + + self.c.LogAction("Restoring file to previous state") + self.c.LogCommand("Undoing last conflict resolution", false) + if err := ioutil.WriteFile(state.GetPath(), []byte(state.GetContent()), 0o644); err != nil { + return err + } + + return nil +} + +func (self *MergeConflictsController) PrevConflictHunk() error { + self.context().SetUserScrolling(false) + self.context().GetState().SelectPrevConflictHunk() + + return nil +} + +func (self *MergeConflictsController) NextConflictHunk() error { + self.context().SetUserScrolling(false) + self.context().GetState().SelectNextConflictHunk() + + return nil +} + +func (self *MergeConflictsController) NextConflict() error { + self.context().SetUserScrolling(false) + self.context().GetState().SelectNextConflict() + + return nil +} + +func (self *MergeConflictsController) PrevConflict() error { + self.context().SetUserScrolling(false) + self.context().GetState().SelectPrevConflict() + + return nil +} + +func (self *MergeConflictsController) HandlePickHunk() error { + return self.pickSelection(self.context().GetState().Selection()) +} + +func (self *MergeConflictsController) HandlePickAllHunks() error { + return self.pickSelection(mergeconflicts.ALL) +} + +func (self *MergeConflictsController) pickSelection(selection mergeconflicts.Selection) error { + ok, err := self.resolveConflict(selection) + if err != nil { + return err + } + + if !ok { + return nil + } + + if self.context().GetState().AllConflictsResolved() { + return self.onLastConflictResolved() + } + + return nil +} + +func (self *MergeConflictsController) resolveConflict(selection mergeconflicts.Selection) (bool, error) { + self.context().SetUserScrolling(false) + + state := self.context().GetState() + + ok, content, err := state.ContentAfterConflictResolve(selection) + if err != nil { + return false, err + } + + if !ok { + return false, nil + } + + var logStr string + switch selection { + case mergeconflicts.TOP: + logStr = "Picking top hunk" + case mergeconflicts.MIDDLE: + logStr = "Picking middle hunk" + case mergeconflicts.BOTTOM: + logStr = "Picking bottom hunk" + case mergeconflicts.ALL: + logStr = "Picking all hunks" + } + self.c.LogAction("Resolve merge conflict") + self.c.LogCommand(logStr, false) + state.PushContent(content) + return true, ioutil.WriteFile(state.GetPath(), []byte(content), 0o644) +} + +func (self *MergeConflictsController) onLastConflictResolved() error { + // as part of refreshing files, we handle the situation where a file has had + // its merge conflicts resolved. + return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.FILES}}) +} + +func (self *MergeConflictsController) isFocused() bool { + return self.c.CurrentContext().GetKey() == self.context().GetKey() +} + +func (self *MergeConflictsController) withRenderAndFocus(f func() error) func() error { + return self.withLock(func() error { + if err := f(); err != nil { + return err + } + + return self.context().RenderAndFocus(self.isFocused()) + }) +} + +func (self *MergeConflictsController) withLock(f func() error) func() error { + return func() error { + self.context().GetMutex().Lock() + defer self.context().GetMutex().Unlock() + + if self.context().GetState() == nil { + return nil + } + + return f() + } +} diff --git a/pkg/gui/controllers/patch_building_controller.go b/pkg/gui/controllers/patch_building_controller.go new file mode 100644 index 000000000..798472f7f --- /dev/null +++ b/pkg/gui/controllers/patch_building_controller.go @@ -0,0 +1,138 @@ +package controllers + +import ( + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/gui/types" + "github.com/samber/lo" +) + +type PatchBuildingController struct { + baseController + *controllerCommon +} + +var _ types.IController = &PatchBuildingController{} + +func NewPatchBuildingController( + common *controllerCommon, +) *PatchBuildingController { + return &PatchBuildingController{ + baseController: baseController{}, + controllerCommon: common, + } +} + +func (self *PatchBuildingController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { + return []*types.Binding{ + { + Key: opts.GetKey(opts.Config.Universal.OpenFile), + Handler: self.OpenFile, + Description: self.c.Tr.LcOpenFile, + }, + { + Key: opts.GetKey(opts.Config.Universal.Edit), + Handler: self.EditFile, + Description: self.c.Tr.LcEditFile, + }, + { + Key: opts.GetKey(opts.Config.Universal.Select), + Handler: self.ToggleSelectionAndRefresh, + Description: self.c.Tr.ToggleSelectionForPatch, + }, + { + Key: opts.GetKey(opts.Config.Universal.Return), + Handler: self.Escape, + Description: self.c.Tr.ExitCustomPatchBuilder, + }, + } +} + +func (self *PatchBuildingController) Context() types.Context { + return self.contexts.CustomPatchBuilder +} + +func (self *PatchBuildingController) context() types.IPatchExplorerContext { + return self.contexts.CustomPatchBuilder +} + +func (self *PatchBuildingController) GetMouseKeybindings(opts types.KeybindingsOpts) []*gocui.ViewMouseBinding { + return []*gocui.ViewMouseBinding{} +} + +func (self *PatchBuildingController) OpenFile() error { + self.context().GetMutex().Lock() + defer self.context().GetMutex().Unlock() + + path := self.contexts.CommitFiles.GetSelectedPath() + + if path == "" { + return nil + } + + lineNumber := self.context().GetState().CurrentLineNumber() + return self.helpers.Files.OpenFileAtLine(path, lineNumber) +} + +func (self *PatchBuildingController) EditFile() error { + self.context().GetMutex().Lock() + defer self.context().GetMutex().Unlock() + + path := self.contexts.CommitFiles.GetSelectedPath() + + if path == "" { + return nil + } + + lineNumber := self.context().GetState().CurrentLineNumber() + return self.helpers.Files.EditFileAtLine(path, lineNumber) +} + +func (self *PatchBuildingController) ToggleSelectionAndRefresh() error { + if err := self.toggleSelection(); err != nil { + return err + } + + return self.c.Refresh(types.RefreshOptions{ + Scope: []types.RefreshableView{types.PATCH_BUILDING, types.COMMIT_FILES}, + }) +} + +func (self *PatchBuildingController) toggleSelection() error { + self.context().GetMutex().Lock() + defer self.context().GetMutex().Unlock() + + toggleFunc := self.git.Patch.PatchManager.AddFileLineRange + filename := self.contexts.CommitFiles.GetSelectedPath() + if filename == "" { + return nil + } + + state := self.context().GetState() + + includedLineIndices, err := self.git.Patch.PatchManager.GetFileIncLineIndices(filename) + if err != nil { + return err + } + currentLineIsStaged := lo.Contains(includedLineIndices, state.GetSelectedLineIdx()) + if currentLineIsStaged { + toggleFunc = self.git.Patch.PatchManager.RemoveFileLineRange + } + + // add range of lines to those set for the file + firstLineIdx, lastLineIdx := state.SelectedRange() + + if err := toggleFunc(filename, firstLineIdx, lastLineIdx); err != nil { + // might actually want to return an error here + self.c.Log.Error(err) + } + + if state.SelectingRange() { + state.SetLineSelectMode() + } + + return nil +} + +func (self *PatchBuildingController) Escape() error { + return self.helpers.PatchBuilding.Escape() +} diff --git a/pkg/gui/controllers/patch_explorer_controller.go b/pkg/gui/controllers/patch_explorer_controller.go new file mode 100644 index 000000000..dac63a7b1 --- /dev/null +++ b/pkg/gui/controllers/patch_explorer_controller.go @@ -0,0 +1,289 @@ +package controllers + +import ( + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type PatchExplorerControllerFactory struct { + *controllerCommon +} + +func NewPatchExplorerControllerFactory(c *controllerCommon) *PatchExplorerControllerFactory { + return &PatchExplorerControllerFactory{ + controllerCommon: c, + } +} + +func (self *PatchExplorerControllerFactory) Create(context types.IPatchExplorerContext) *PatchExplorerController { + return &PatchExplorerController{ + baseController: baseController{}, + controllerCommon: self.controllerCommon, + context: context, + } +} + +type PatchExplorerController struct { + baseController + *controllerCommon + + context types.IPatchExplorerContext +} + +func (self *PatchExplorerController) Context() types.Context { + return self.context +} + +func (self *PatchExplorerController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { + return []*types.Binding{ + { + Tag: "navigation", + Key: opts.GetKey(opts.Config.Universal.PrevItemAlt), + Handler: self.withRenderAndFocus(self.HandlePrevLine), + }, + { + Tag: "navigation", + Key: opts.GetKey(opts.Config.Universal.PrevItem), + Handler: self.withRenderAndFocus(self.HandlePrevLine), + }, + { + Tag: "navigation", + Key: opts.GetKey(opts.Config.Universal.NextItemAlt), + Handler: self.withRenderAndFocus(self.HandleNextLine), + }, + { + Tag: "navigation", + Key: opts.GetKey(opts.Config.Universal.NextItem), + Handler: self.withRenderAndFocus(self.HandleNextLine), + }, + { + Key: opts.GetKey(opts.Config.Universal.PrevBlock), + Handler: self.withRenderAndFocus(self.HandlePrevHunk), + Description: self.c.Tr.PrevHunk, + }, + { + Key: opts.GetKey(opts.Config.Universal.PrevBlockAlt), + Handler: self.withRenderAndFocus(self.HandlePrevHunk), + }, + { + Key: opts.GetKey(opts.Config.Universal.NextBlock), + Handler: self.withRenderAndFocus(self.HandleNextHunk), + Description: self.c.Tr.NextHunk, + }, + { + Key: opts.GetKey(opts.Config.Universal.NextBlockAlt), + Handler: self.withRenderAndFocus(self.HandleNextHunk), + }, + { + Key: opts.GetKey(opts.Config.Main.ToggleDragSelect), + Handler: self.withRenderAndFocus(self.HandleToggleSelectRange), + Description: self.c.Tr.ToggleDragSelect, + }, + { + Key: opts.GetKey(opts.Config.Main.ToggleDragSelectAlt), + Handler: self.withRenderAndFocus(self.HandleToggleSelectRange), + Description: self.c.Tr.ToggleDragSelect, + }, + { + Key: opts.GetKey(opts.Config.Main.ToggleSelectHunk), + Handler: self.withRenderAndFocus(self.HandleToggleSelectHunk), + Description: self.c.Tr.ToggleSelectHunk, + }, + { + Tag: "navigation", + Key: opts.GetKey(opts.Config.Universal.PrevPage), + Handler: self.withRenderAndFocus(self.HandlePrevPage), + Description: self.c.Tr.LcPrevPage, + }, + { + Tag: "navigation", + Key: opts.GetKey(opts.Config.Universal.NextPage), + Handler: self.withRenderAndFocus(self.HandleNextPage), + Description: self.c.Tr.LcNextPage, + }, + { + Tag: "navigation", + Key: opts.GetKey(opts.Config.Universal.GotoTop), + Handler: self.withRenderAndFocus(self.HandleGotoTop), + Description: self.c.Tr.LcGotoTop, + }, + { + Tag: "navigation", + Key: opts.GetKey(opts.Config.Universal.GotoBottom), + Description: self.c.Tr.LcGotoBottom, + Handler: self.withRenderAndFocus(self.HandleGotoBottom), + }, + { + Tag: "navigation", + Key: opts.GetKey(opts.Config.Universal.ScrollLeft), + Handler: self.withRenderAndFocus(self.HandleScrollLeft), + }, + { + Tag: "navigation", + Key: opts.GetKey(opts.Config.Universal.ScrollRight), + Handler: self.withRenderAndFocus(self.HandleScrollRight), + }, + { + Tag: "navigation", + Key: opts.GetKey(opts.Config.Universal.StartSearch), + Handler: func() error { self.c.OpenSearch(); return nil }, + Description: self.c.Tr.LcStartSearch, + }, + { + Key: opts.GetKey(opts.Config.Universal.CopyToClipboard), + Handler: self.withLock(self.CopySelectedToClipboard), + Description: self.c.Tr.LcCopySelectedTexToClipboard, + }, + } +} + +func (self *PatchExplorerController) GetMouseKeybindings(opts types.KeybindingsOpts) []*gocui.ViewMouseBinding { + return []*gocui.ViewMouseBinding{ + { + ViewName: self.context.GetViewName(), + Key: gocui.MouseLeft, + Handler: func(opts gocui.ViewMouseBindingOpts) error { + if self.isFocused() { + return self.withRenderAndFocus(self.HandleMouseDown)() + } + + return self.c.PushContext(self.context, types.OnFocusOpts{ + ClickedWindowName: self.context.GetWindowName(), + ClickedViewLineIdx: opts.Y, + }) + }, + }, + { + ViewName: self.context.GetViewName(), + Key: gocui.MouseLeft, + Modifier: gocui.ModMotion, + Handler: func(gocui.ViewMouseBindingOpts) error { + return self.withRenderAndFocus(self.HandleMouseDrag)() + }, + }, + } +} + +func (self *PatchExplorerController) HandlePrevLine() error { + self.context.GetState().CycleSelection(false) + + return nil +} + +func (self *PatchExplorerController) HandleNextLine() error { + self.context.GetState().CycleSelection(true) + + return nil +} + +func (self *PatchExplorerController) HandlePrevHunk() error { + self.context.GetState().CycleHunk(false) + + return nil +} + +func (self *PatchExplorerController) HandleNextHunk() error { + self.context.GetState().CycleHunk(true) + + return nil +} + +func (self *PatchExplorerController) HandleToggleSelectRange() error { + self.context.GetState().ToggleSelectRange() + + return nil +} + +func (self *PatchExplorerController) HandleToggleSelectHunk() error { + self.context.GetState().ToggleSelectHunk() + + return nil +} + +func (self *PatchExplorerController) HandleScrollLeft() error { + self.context.GetViewTrait().ScrollLeft() + + return nil +} + +func (self *PatchExplorerController) HandleScrollRight() error { + self.context.GetViewTrait().ScrollRight() + + return nil +} + +func (self *PatchExplorerController) HandlePrevPage() error { + self.context.GetState().SetLineSelectMode() + self.context.GetState().AdjustSelectedLineIdx(-self.context.GetViewTrait().PageDelta()) + + return nil +} + +func (self *PatchExplorerController) HandleNextPage() error { + self.context.GetState().SetLineSelectMode() + self.context.GetState().AdjustSelectedLineIdx(self.context.GetViewTrait().PageDelta()) + + return nil +} + +func (self *PatchExplorerController) HandleGotoTop() error { + self.context.GetState().SelectTop() + + return nil +} + +func (self *PatchExplorerController) HandleGotoBottom() error { + self.context.GetState().SelectBottom() + + return nil +} + +func (self *PatchExplorerController) HandleMouseDown() error { + self.context.GetState().SelectNewLineForRange(self.context.GetViewTrait().SelectedLineIdx()) + + return nil +} + +func (self *PatchExplorerController) HandleMouseDrag() error { + self.context.GetState().SelectLine(self.context.GetViewTrait().SelectedLineIdx()) + + return nil +} + +func (self *PatchExplorerController) CopySelectedToClipboard() error { + selected := self.context.GetState().PlainRenderSelected() + + self.c.LogAction(self.c.Tr.Actions.CopySelectedTextToClipboard) + if err := self.os.CopyToClipboard(selected); err != nil { + return self.c.Error(err) + } + + return nil +} + +func (self *PatchExplorerController) isFocused() bool { + return self.c.CurrentContext().GetKey() == self.context.GetKey() +} + +func (self *PatchExplorerController) withRenderAndFocus(f func() error) func() error { + return self.withLock(func() error { + if err := f(); err != nil { + return err + } + + return self.context.RenderAndFocus(self.isFocused()) + }) +} + +func (self *PatchExplorerController) withLock(f func() error) func() error { + return func() error { + self.context.GetMutex().Lock() + defer self.context.GetMutex().Unlock() + + if self.context.GetState() == nil { + return nil + } + + return f() + } +} diff --git a/pkg/gui/controllers/remote_branches_controller.go b/pkg/gui/controllers/remote_branches_controller.go new file mode 100644 index 000000000..dcedde8c0 --- /dev/null +++ b/pkg/gui/controllers/remote_branches_controller.go @@ -0,0 +1,161 @@ +package controllers + +import ( + "fmt" + "strings" + + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/context" + "github.com/jesseduffield/lazygit/pkg/gui/types" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +type RemoteBranchesController struct { + baseController + *controllerCommon +} + +var _ types.IController = &RemoteBranchesController{} + +func NewRemoteBranchesController( + common *controllerCommon, +) *RemoteBranchesController { + return &RemoteBranchesController{ + baseController: baseController{}, + controllerCommon: common, + } +} + +func (self *RemoteBranchesController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { + return []*types.Binding{ + { + Key: opts.GetKey(opts.Config.Universal.Select), + // gonna use the exact same handler as the 'n' keybinding because everybody wants this to happen when they checkout a remote branch + Handler: self.checkSelected(self.newLocalBranch), + Description: self.c.Tr.LcCheckout, + }, + { + Key: opts.GetKey(opts.Config.Universal.New), + Handler: self.checkSelected(self.newLocalBranch), + Description: self.c.Tr.LcNewBranch, + }, + { + Key: opts.GetKey(opts.Config.Branches.MergeIntoCurrentBranch), + Handler: opts.Guards.OutsideFilterMode(self.checkSelected(self.merge)), + Description: self.c.Tr.LcMergeIntoCurrentBranch, + }, + { + Key: opts.GetKey(opts.Config.Branches.RebaseBranch), + Handler: opts.Guards.OutsideFilterMode(self.checkSelected(self.rebase)), + Description: self.c.Tr.LcRebaseBranch, + }, + { + Key: opts.GetKey(opts.Config.Universal.Remove), + Handler: self.checkSelected(self.delete), + Description: self.c.Tr.LcDeleteBranch, + }, + { + Key: opts.GetKey(opts.Config.Branches.SetUpstream), + Handler: self.checkSelected(self.setAsUpstream), + Description: self.c.Tr.LcSetAsUpstream, + }, + { + Key: opts.GetKey(opts.Config.Universal.Return), + Handler: self.escape, + Description: self.c.Tr.ReturnToRemotesList, + }, + { + Key: opts.GetKey(opts.Config.Commits.ViewResetOptions), + Handler: self.checkSelected(self.createResetMenu), + Description: self.c.Tr.LcViewResetOptions, + OpensMenu: true, + }, + } +} + +func (self *RemoteBranchesController) Context() types.Context { + return self.context() +} + +func (self *RemoteBranchesController) context() *context.RemoteBranchesContext { + return self.contexts.RemoteBranches +} + +func (self *RemoteBranchesController) checkSelected(callback func(*models.RemoteBranch) error) func() error { + return func() error { + selectedItem := self.context().GetSelected() + if selectedItem == nil { + return nil + } + + return callback(selectedItem) + } +} + +func (self *RemoteBranchesController) escape() error { + return self.c.PushContext(self.contexts.Remotes) +} + +func (self *RemoteBranchesController) delete(selectedBranch *models.RemoteBranch) error { + message := fmt.Sprintf("%s '%s'?", self.c.Tr.DeleteRemoteBranchMessage, selectedBranch.FullName()) + + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.DeleteRemoteBranch, + Prompt: message, + HandleConfirm: func() error { + return self.c.WithWaitingStatus(self.c.Tr.DeletingStatus, func() error { + self.c.LogAction(self.c.Tr.Actions.DeleteRemoteBranch) + err := self.git.Remote.DeleteRemoteBranch(selectedBranch.RemoteName, selectedBranch.Name) + if err != nil { + _ = self.c.Error(err) + } + + return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.BRANCHES, types.REMOTES}}) + }) + }, + }) +} + +func (self *RemoteBranchesController) merge(selectedBranch *models.RemoteBranch) error { + return self.helpers.MergeAndRebase.MergeRefIntoCheckedOutBranch(selectedBranch.FullName()) +} + +func (self *RemoteBranchesController) rebase(selectedBranch *models.RemoteBranch) error { + return self.helpers.MergeAndRebase.RebaseOntoRef(selectedBranch.FullName()) +} + +func (self *RemoteBranchesController) createResetMenu(selectedBranch *models.RemoteBranch) error { + return self.helpers.Refs.CreateGitResetMenu(selectedBranch.FullName()) +} + +func (self *RemoteBranchesController) setAsUpstream(selectedBranch *models.RemoteBranch) error { + checkedOutBranch := self.helpers.Refs.GetCheckedOutRef() + + message := utils.ResolvePlaceholderString( + self.c.Tr.SetUpstreamMessage, + map[string]string{ + "checkedOut": checkedOutBranch.Name, + "selected": selectedBranch.FullName(), + }, + ) + + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.SetUpstreamTitle, + Prompt: message, + HandleConfirm: func() error { + self.c.LogAction(self.c.Tr.Actions.SetBranchUpstream) + if err := self.git.Branch.SetUpstream(selectedBranch.RemoteName, selectedBranch.Name, checkedOutBranch.Name); err != nil { + return self.c.Error(err) + } + + return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.BRANCHES, types.REMOTES}}) + }, + }) +} + +func (self *RemoteBranchesController) newLocalBranch(selectedBranch *models.RemoteBranch) error { + // will set to the remote's branch name without the remote name + nameSuggestion := strings.SplitAfterN(selectedBranch.RefName(), "/", 2)[1] + + return self.helpers.Refs.NewBranch(selectedBranch.RefName(), selectedBranch.RefName(), nameSuggestion) +} diff --git a/pkg/gui/controllers/remotes_controller.go b/pkg/gui/controllers/remotes_controller.go new file mode 100644 index 000000000..03427b9b7 --- /dev/null +++ b/pkg/gui/controllers/remotes_controller.go @@ -0,0 +1,189 @@ +package controllers + +import ( + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/context" + "github.com/jesseduffield/lazygit/pkg/gui/types" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +type RemotesController struct { + baseController + *controllerCommon + context *context.RemotesContext + + setRemoteBranches func([]*models.RemoteBranch) +} + +var _ types.IController = &RemotesController{} + +func NewRemotesController( + common *controllerCommon, + setRemoteBranches func([]*models.RemoteBranch), +) *RemotesController { + return &RemotesController{ + baseController: baseController{}, + controllerCommon: common, + context: common.contexts.Remotes, + setRemoteBranches: setRemoteBranches, + } +} + +func (self *RemotesController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { + bindings := []*types.Binding{ + { + Key: opts.GetKey(opts.Config.Universal.GoInto), + Handler: self.checkSelected(self.enter), + }, + { + Key: opts.GetKey(opts.Config.Branches.FetchRemote), + Handler: self.checkSelected(self.fetch), + Description: self.c.Tr.LcFetchRemote, + }, + { + Key: opts.GetKey(opts.Config.Universal.New), + Handler: self.add, + Description: self.c.Tr.LcAddNewRemote, + }, + { + Key: opts.GetKey(opts.Config.Universal.Remove), + Handler: self.checkSelected(self.remove), + Description: self.c.Tr.LcRemoveRemote, + }, + { + Key: opts.GetKey(opts.Config.Universal.Edit), + Handler: self.checkSelected(self.edit), + Description: self.c.Tr.LcEditRemote, + }, + } + + return bindings +} + +func (self *RemotesController) GetOnClick() func() error { + return self.checkSelected(self.enter) +} + +func (self *RemotesController) enter(remote *models.Remote) error { + // naive implementation: get the branches from the remote and render them to the list, change the context + self.setRemoteBranches(remote.Branches) + + newSelectedLine := 0 + if len(remote.Branches) == 0 { + newSelectedLine = -1 + } + self.contexts.RemoteBranches.SetSelectedLineIdx(newSelectedLine) + self.contexts.RemoteBranches.SetTitleRef(remote.Name) + + if err := self.c.PostRefreshUpdate(self.contexts.RemoteBranches); err != nil { + return err + } + + return self.c.PushContext(self.contexts.RemoteBranches) +} + +func (self *RemotesController) add() error { + return self.c.Prompt(types.PromptOpts{ + Title: self.c.Tr.LcNewRemoteName, + HandleConfirm: func(remoteName string) error { + return self.c.Prompt(types.PromptOpts{ + Title: self.c.Tr.LcNewRemoteUrl, + HandleConfirm: func(remoteUrl string) error { + self.c.LogAction(self.c.Tr.Actions.AddRemote) + if err := self.git.Remote.AddRemote(remoteName, remoteUrl); err != nil { + return err + } + return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.REMOTES}}) + }, + }) + }, + }) +} + +func (self *RemotesController) remove(remote *models.Remote) error { + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.LcRemoveRemote, + Prompt: self.c.Tr.LcRemoveRemotePrompt + " '" + remote.Name + "'?", + HandleConfirm: func() error { + self.c.LogAction(self.c.Tr.Actions.RemoveRemote) + if err := self.git.Remote.RemoveRemote(remote.Name); err != nil { + return self.c.Error(err) + } + + return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.BRANCHES, types.REMOTES}}) + }, + }) +} + +func (self *RemotesController) edit(remote *models.Remote) error { + editNameMessage := utils.ResolvePlaceholderString( + self.c.Tr.LcEditRemoteName, + map[string]string{ + "remoteName": remote.Name, + }, + ) + + return self.c.Prompt(types.PromptOpts{ + Title: editNameMessage, + InitialContent: remote.Name, + HandleConfirm: func(updatedRemoteName string) error { + if updatedRemoteName != remote.Name { + self.c.LogAction(self.c.Tr.Actions.UpdateRemote) + if err := self.git.Remote.RenameRemote(remote.Name, updatedRemoteName); err != nil { + return self.c.Error(err) + } + } + + editUrlMessage := utils.ResolvePlaceholderString( + self.c.Tr.LcEditRemoteUrl, + map[string]string{ + "remoteName": updatedRemoteName, + }, + ) + + urls := remote.Urls + url := "" + if len(urls) > 0 { + url = urls[0] + } + + return self.c.Prompt(types.PromptOpts{ + Title: editUrlMessage, + InitialContent: url, + HandleConfirm: func(updatedRemoteUrl string) error { + self.c.LogAction(self.c.Tr.Actions.UpdateRemote) + if err := self.git.Remote.UpdateRemoteUrl(updatedRemoteName, updatedRemoteUrl); err != nil { + return self.c.Error(err) + } + return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.BRANCHES, types.REMOTES}}) + }, + }) + }, + }) +} + +func (self *RemotesController) fetch(remote *models.Remote) error { + return self.c.WithWaitingStatus(self.c.Tr.FetchingRemoteStatus, func() error { + err := self.git.Sync.FetchRemote(remote.Name) + if err != nil { + _ = self.c.Error(err) + } + + return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.BRANCHES, types.REMOTES}}) + }) +} + +func (self *RemotesController) checkSelected(callback func(*models.Remote) error) func() error { + return func() error { + file := self.context.GetSelected() + if file == nil { + return nil + } + + return callback(file) + } +} + +func (self *RemotesController) Context() types.Context { + return self.context +} diff --git a/pkg/gui/controllers/staging_controller.go b/pkg/gui/controllers/staging_controller.go new file mode 100644 index 000000000..d41bb1ff5 --- /dev/null +++ b/pkg/gui/controllers/staging_controller.go @@ -0,0 +1,242 @@ +package controllers + +import ( + "strings" + + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/commands/patch" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type StagingController struct { + baseController + *controllerCommon + + context types.IPatchExplorerContext + otherContext types.IPatchExplorerContext + + // if true, we're dealing with the secondary context i.e. dealing with staged file changes + staged bool +} + +var _ types.IController = &StagingController{} + +func NewStagingController( + common *controllerCommon, + context types.IPatchExplorerContext, + otherContext types.IPatchExplorerContext, + staged bool, +) *StagingController { + return &StagingController{ + baseController: baseController{}, + controllerCommon: common, + context: context, + otherContext: otherContext, + staged: staged, + } +} + +func (self *StagingController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { + return []*types.Binding{ + { + Key: opts.GetKey(opts.Config.Universal.OpenFile), + Handler: self.OpenFile, + Description: self.c.Tr.LcOpenFile, + }, + { + Key: opts.GetKey(opts.Config.Universal.Edit), + Handler: self.EditFile, + Description: self.c.Tr.LcEditFile, + }, + { + Key: opts.GetKey(opts.Config.Universal.Return), + Handler: self.Escape, + Description: self.c.Tr.ReturnToFilesPanel, + }, + { + Key: opts.GetKey(opts.Config.Universal.TogglePanel), + Handler: self.TogglePanel, + Description: self.c.Tr.ToggleStagingPanel, + }, + { + Key: opts.GetKey(opts.Config.Universal.Select), + Handler: self.ToggleStaged, + Description: self.c.Tr.StageSelection, + }, + { + Key: opts.GetKey(opts.Config.Universal.Remove), + Handler: self.ResetSelection, + Description: self.c.Tr.ResetSelection, + }, + { + Key: opts.GetKey(opts.Config.Main.EditSelectHunk), + Handler: self.EditHunkAndRefresh, + Description: self.c.Tr.EditHunk, + }, + } +} + +func (self *StagingController) Context() types.Context { + return self.context +} + +func (self *StagingController) GetMouseKeybindings(opts types.KeybindingsOpts) []*gocui.ViewMouseBinding { + return []*gocui.ViewMouseBinding{} +} + +func (self *StagingController) OpenFile() error { + self.context.GetMutex().Lock() + defer self.context.GetMutex().Unlock() + + path := self.FilePath() + + if path == "" { + return nil + } + + lineNumber := self.context.GetState().CurrentLineNumber() + return self.helpers.Files.OpenFileAtLine(path, lineNumber) +} + +func (self *StagingController) EditFile() error { + self.context.GetMutex().Lock() + defer self.context.GetMutex().Unlock() + + path := self.FilePath() + + if path == "" { + return nil + } + + lineNumber := self.context.GetState().CurrentLineNumber() + return self.helpers.Files.EditFileAtLine(path, lineNumber) +} + +func (self *StagingController) Escape() error { + return self.c.PushContext(self.contexts.Files) +} + +func (self *StagingController) TogglePanel() error { + if self.otherContext.GetState() != nil { + return self.c.PushContext(self.otherContext) + } + + return nil +} + +func (self *StagingController) ToggleStaged() error { + return self.applySelectionAndRefresh(self.staged) +} + +func (self *StagingController) ResetSelection() error { + reset := func() error { return self.applySelectionAndRefresh(true) } + + if !self.staged && !self.c.UserConfig.Gui.SkipUnstageLineWarning { + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.UnstageLinesTitle, + Prompt: self.c.Tr.UnstageLinesPrompt, + HandleConfirm: reset, + }) + } + + return reset() +} + +func (self *StagingController) applySelectionAndRefresh(reverse bool) error { + if err := self.applySelection(reverse); err != nil { + return err + } + + return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.FILES, types.STAGING}}) +} + +func (self *StagingController) applySelection(reverse bool) error { + self.context.GetMutex().Lock() + defer self.context.GetMutex().Unlock() + + state := self.context.GetState() + path := self.FilePath() + if path == "" { + return nil + } + + firstLineIdx, lastLineIdx := state.SelectedRange() + patch := patch.ModifiedPatchForRange(self.c.Log, path, state.GetDiff(), firstLineIdx, lastLineIdx, reverse, false) + + if patch == "" { + return nil + } + + // apply the patch then refresh this panel + // create a new temp file with the patch, then call git apply with that patch + applyFlags := []string{} + if !reverse || self.staged { + applyFlags = append(applyFlags, "cached") + } + self.c.LogAction(self.c.Tr.Actions.ApplyPatch) + err := self.git.WorkingTree.ApplyPatch(patch, applyFlags...) + if err != nil { + return self.c.Error(err) + } + + if state.SelectingRange() { + state.SetLineSelectMode() + } + + return nil +} + +func (self *StagingController) EditHunkAndRefresh() error { + if err := self.editHunk(); err != nil { + return err + } + + return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.FILES, types.STAGING}}) +} + +func (self *StagingController) editHunk() error { + self.context.GetMutex().Lock() + defer self.context.GetMutex().Unlock() + + state := self.context.GetState() + path := self.FilePath() + if path == "" { + return nil + } + + hunk := state.CurrentHunk() + patchText := patch.ModifiedPatchForRange( + self.c.Log, path, state.GetDiff(), hunk.FirstLineIdx, hunk.LastLineIdx(), self.staged, false, + ) + patchFilepath, err := self.git.WorkingTree.SaveTemporaryPatch(patchText) + if err != nil { + return err + } + + lineOffset := 3 + lineIdxInHunk := state.GetSelectedLineIdx() - hunk.FirstLineIdx + if err := self.helpers.Files.EditFileAtLine(patchFilepath, lineIdxInHunk+lineOffset); err != nil { + return err + } + + editedPatchText, err := self.git.File.Cat(patchFilepath) + if err != nil { + return err + } + + self.c.LogAction(self.c.Tr.Actions.ApplyPatch) + + lineCount := strings.Count(editedPatchText, "\n") + 1 + newPatchText := patch.ModifiedPatchForRange( + self.c.Log, path, editedPatchText, 0, lineCount, false, false, + ) + if err := self.git.WorkingTree.ApplyPatch(newPatchText, "cached"); err != nil { + return self.c.Error(err) + } + + return nil +} + +func (self *StagingController) FilePath() string { + return self.contexts.Files.GetSelectedPath() +} diff --git a/pkg/gui/controllers/stash_controller.go b/pkg/gui/controllers/stash_controller.go new file mode 100644 index 000000000..6c8e7c349 --- /dev/null +++ b/pkg/gui/controllers/stash_controller.go @@ -0,0 +1,141 @@ +package controllers + +import ( + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/context" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type StashController struct { + baseController + *controllerCommon +} + +var _ types.IController = &StashController{} + +func NewStashController( + common *controllerCommon, +) *StashController { + return &StashController{ + baseController: baseController{}, + controllerCommon: common, + } +} + +func (self *StashController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { + bindings := []*types.Binding{ + { + Key: opts.GetKey(opts.Config.Universal.Select), + Handler: self.checkSelected(self.handleStashApply), + Description: self.c.Tr.LcApply, + }, + { + Key: opts.GetKey(opts.Config.Stash.PopStash), + Handler: self.checkSelected(self.handleStashPop), + Description: self.c.Tr.LcPop, + }, + { + Key: opts.GetKey(opts.Config.Universal.Remove), + Handler: self.checkSelected(self.handleStashDrop), + Description: self.c.Tr.LcDrop, + }, + { + Key: opts.GetKey(opts.Config.Universal.New), + Handler: self.checkSelected(self.handleNewBranchOffStashEntry), + Description: self.c.Tr.LcNewBranch, + }, + } + + return bindings +} + +func (self *StashController) checkSelected(callback func(*models.StashEntry) error) func() error { + return func() error { + item := self.context().GetSelected() + if item == nil { + return nil + } + + return callback(item) + } +} + +func (self *StashController) Context() types.Context { + return self.context() +} + +func (self *StashController) context() *context.StashContext { + return self.contexts.Stash +} + +func (self *StashController) handleStashApply(stashEntry *models.StashEntry) error { + apply := func() error { + self.c.LogAction(self.c.Tr.Actions.Stash) + err := self.git.Stash.Apply(stashEntry.Index) + _ = self.postStashRefresh() + if err != nil { + return self.c.Error(err) + } + return nil + } + + if self.c.UserConfig.Gui.SkipStashWarning { + return apply() + } + + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.StashApply, + Prompt: self.c.Tr.SureApplyStashEntry, + HandleConfirm: func() error { + return apply() + }, + }) +} + +func (self *StashController) handleStashPop(stashEntry *models.StashEntry) error { + pop := func() error { + self.c.LogAction(self.c.Tr.Actions.Stash) + err := self.git.Stash.Pop(stashEntry.Index) + _ = self.postStashRefresh() + if err != nil { + return self.c.Error(err) + } + return nil + } + + if self.c.UserConfig.Gui.SkipStashWarning { + return pop() + } + + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.StashPop, + Prompt: self.c.Tr.SurePopStashEntry, + HandleConfirm: func() error { + return pop() + }, + }) +} + +func (self *StashController) handleStashDrop(stashEntry *models.StashEntry) error { + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.StashDrop, + Prompt: self.c.Tr.SureDropStashEntry, + HandleConfirm: func() error { + self.c.LogAction(self.c.Tr.Actions.Stash) + err := self.git.Stash.Drop(stashEntry.Index) + _ = self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.STASH}}) + if err != nil { + return self.c.Error(err) + } + return nil + }, + }) +} + +func (self *StashController) postStashRefresh() error { + return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.STASH, types.FILES}}) +} + +func (self *StashController) handleNewBranchOffStashEntry(stashEntry *models.StashEntry) error { + return self.helpers.Refs.NewBranch(stashEntry.RefName(), stashEntry.Description(), "") +} diff --git a/pkg/gui/controllers/submodules_controller.go b/pkg/gui/controllers/submodules_controller.go new file mode 100644 index 000000000..5bd7ce088 --- /dev/null +++ b/pkg/gui/controllers/submodules_controller.go @@ -0,0 +1,239 @@ +package controllers + +import ( + "fmt" + "path/filepath" + "strings" + + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/context" + "github.com/jesseduffield/lazygit/pkg/gui/style" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type SubmodulesController struct { + baseController + *controllerCommon + + enterSubmodule func(submodule *models.SubmoduleConfig) error +} + +var _ types.IController = &SubmodulesController{} + +func NewSubmodulesController( + controllerCommon *controllerCommon, + enterSubmodule func(submodule *models.SubmoduleConfig) error, +) *SubmodulesController { + return &SubmodulesController{ + baseController: baseController{}, + controllerCommon: controllerCommon, + enterSubmodule: enterSubmodule, + } +} + +func (self *SubmodulesController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { + return []*types.Binding{ + { + Key: opts.GetKey(opts.Config.Universal.GoInto), + Handler: self.checkSelected(self.enter), + Description: self.c.Tr.LcEnterSubmodule, + }, + { + Key: opts.GetKey(opts.Config.Universal.Remove), + Handler: self.checkSelected(self.remove), + Description: self.c.Tr.LcRemoveSubmodule, + }, + { + Key: opts.GetKey(opts.Config.Submodules.Update), + Handler: self.checkSelected(self.update), + Description: self.c.Tr.LcSubmoduleUpdate, + }, + { + Key: opts.GetKey(opts.Config.Universal.New), + Handler: self.add, + Description: self.c.Tr.LcAddSubmodule, + }, + { + Key: opts.GetKey(opts.Config.Universal.Edit), + Handler: self.checkSelected(self.editURL), + Description: self.c.Tr.LcEditSubmoduleUrl, + }, + { + Key: opts.GetKey(opts.Config.Submodules.Init), + Handler: self.checkSelected(self.init), + Description: self.c.Tr.LcInitSubmodule, + }, + { + Key: opts.GetKey(opts.Config.Submodules.BulkMenu), + Handler: self.openBulkActionsMenu, + Description: self.c.Tr.LcViewBulkSubmoduleOptions, + OpensMenu: true, + }, + } +} + +func (self *SubmodulesController) GetOnClick() func() error { + return self.checkSelected(self.enter) +} + +func (self *SubmodulesController) enter(submodule *models.SubmoduleConfig) error { + return self.enterSubmodule(submodule) +} + +func (self *SubmodulesController) add() error { + return self.c.Prompt(types.PromptOpts{ + Title: self.c.Tr.LcNewSubmoduleUrl, + HandleConfirm: func(submoduleUrl string) error { + nameSuggestion := filepath.Base(strings.TrimSuffix(submoduleUrl, filepath.Ext(submoduleUrl))) + + return self.c.Prompt(types.PromptOpts{ + Title: self.c.Tr.LcNewSubmoduleName, + InitialContent: nameSuggestion, + HandleConfirm: func(submoduleName string) error { + return self.c.Prompt(types.PromptOpts{ + Title: self.c.Tr.LcNewSubmodulePath, + InitialContent: submoduleName, + HandleConfirm: func(submodulePath string) error { + return self.c.WithWaitingStatus(self.c.Tr.LcAddingSubmoduleStatus, func() error { + self.c.LogAction(self.c.Tr.Actions.AddSubmodule) + err := self.git.Submodule.Add(submoduleName, submodulePath, submoduleUrl) + if err != nil { + _ = self.c.Error(err) + } + + return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.SUBMODULES}}) + }) + }, + }) + }, + }) + }, + }) +} + +func (self *SubmodulesController) editURL(submodule *models.SubmoduleConfig) error { + return self.c.Prompt(types.PromptOpts{ + Title: fmt.Sprintf(self.c.Tr.LcUpdateSubmoduleUrl, submodule.Name), + InitialContent: submodule.Url, + HandleConfirm: func(newUrl string) error { + return self.c.WithWaitingStatus(self.c.Tr.LcUpdatingSubmoduleUrlStatus, func() error { + self.c.LogAction(self.c.Tr.Actions.UpdateSubmoduleUrl) + err := self.git.Submodule.UpdateUrl(submodule.Name, submodule.Path, newUrl) + if err != nil { + _ = self.c.Error(err) + } + + return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.SUBMODULES}}) + }) + }, + }) +} + +func (self *SubmodulesController) init(submodule *models.SubmoduleConfig) error { + return self.c.WithWaitingStatus(self.c.Tr.LcInitializingSubmoduleStatus, func() error { + self.c.LogAction(self.c.Tr.Actions.InitialiseSubmodule) + err := self.git.Submodule.Init(submodule.Path) + if err != nil { + _ = self.c.Error(err) + } + + return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.SUBMODULES}}) + }) +} + +func (self *SubmodulesController) openBulkActionsMenu() error { + return self.c.Menu(types.CreateMenuOptions{ + Title: self.c.Tr.LcBulkSubmoduleOptions, + Items: []*types.MenuItem{ + { + LabelColumns: []string{self.c.Tr.LcBulkInitSubmodules, style.FgGreen.Sprint(self.git.Submodule.BulkInitCmdObj().ToString())}, + OnPress: func() error { + return self.c.WithWaitingStatus(self.c.Tr.LcRunningCommand, func() error { + self.c.LogAction(self.c.Tr.Actions.BulkInitialiseSubmodules) + err := self.git.Submodule.BulkInitCmdObj().Run() + if err != nil { + return self.c.Error(err) + } + + return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.SUBMODULES}}) + }) + }, + Key: 'i', + }, + { + LabelColumns: []string{self.c.Tr.LcBulkUpdateSubmodules, style.FgYellow.Sprint(self.git.Submodule.BulkUpdateCmdObj().ToString())}, + OnPress: func() error { + return self.c.WithWaitingStatus(self.c.Tr.LcRunningCommand, func() error { + self.c.LogAction(self.c.Tr.Actions.BulkUpdateSubmodules) + if err := self.git.Submodule.BulkUpdateCmdObj().Run(); err != nil { + return self.c.Error(err) + } + + return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.SUBMODULES}}) + }) + }, + Key: 'u', + }, + { + LabelColumns: []string{self.c.Tr.LcBulkDeinitSubmodules, style.FgRed.Sprint(self.git.Submodule.BulkDeinitCmdObj().ToString())}, + OnPress: func() error { + return self.c.WithWaitingStatus(self.c.Tr.LcRunningCommand, func() error { + self.c.LogAction(self.c.Tr.Actions.BulkDeinitialiseSubmodules) + if err := self.git.Submodule.BulkDeinitCmdObj().Run(); err != nil { + return self.c.Error(err) + } + + return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.SUBMODULES}}) + }) + }, + Key: 'd', + }, + }, + }) +} + +func (self *SubmodulesController) update(submodule *models.SubmoduleConfig) error { + return self.c.WithWaitingStatus(self.c.Tr.LcUpdatingSubmoduleStatus, func() error { + self.c.LogAction(self.c.Tr.Actions.UpdateSubmodule) + err := self.git.Submodule.Update(submodule.Path) + if err != nil { + _ = self.c.Error(err) + } + + return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.SUBMODULES}}) + }) +} + +func (self *SubmodulesController) remove(submodule *models.SubmoduleConfig) error { + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.RemoveSubmodule, + Prompt: fmt.Sprintf(self.c.Tr.RemoveSubmodulePrompt, submodule.Name), + HandleConfirm: func() error { + self.c.LogAction(self.c.Tr.Actions.RemoveSubmodule) + if err := self.git.Submodule.Delete(submodule); err != nil { + return self.c.Error(err) + } + + return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.SUBMODULES, types.FILES}}) + }, + }) +} + +func (self *SubmodulesController) checkSelected(callback func(*models.SubmoduleConfig) error) func() error { + return func() error { + submodule := self.context().GetSelected() + if submodule == nil { + return nil + } + + return callback(submodule) + } +} + +func (self *SubmodulesController) Context() types.Context { + return self.context() +} + +func (self *SubmodulesController) context() *context.SubmodulesContext { + return self.contexts.Submodules +} diff --git a/pkg/gui/controllers/switch_to_diff_files_controller.go b/pkg/gui/controllers/switch_to_diff_files_controller.go new file mode 100644 index 000000000..275a5ebb2 --- /dev/null +++ b/pkg/gui/controllers/switch_to_diff_files_controller.go @@ -0,0 +1,74 @@ +package controllers + +import ( + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +// This controller is for all contexts that contain commit files. + +var _ types.IController = &SwitchToDiffFilesController{} + +type CanSwitchToDiffFiles interface { + types.Context + CanRebase() bool + GetSelectedRef() types.Ref +} + +type SwitchToDiffFilesController struct { + baseController + *controllerCommon + context CanSwitchToDiffFiles + viewFiles func(SwitchToCommitFilesContextOpts) error +} + +func NewSwitchToDiffFilesController( + controllerCommon *controllerCommon, + viewFiles func(SwitchToCommitFilesContextOpts) error, + context CanSwitchToDiffFiles, +) *SwitchToDiffFilesController { + return &SwitchToDiffFilesController{ + baseController: baseController{}, + controllerCommon: controllerCommon, + context: context, + viewFiles: viewFiles, + } +} + +func (self *SwitchToDiffFilesController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { + bindings := []*types.Binding{ + { + Key: opts.GetKey(opts.Config.Universal.GoInto), + Handler: self.checkSelected(self.enter), + Description: self.c.Tr.LcViewItemFiles, + }, + } + + return bindings +} + +func (self *SwitchToDiffFilesController) GetOnClick() func() error { + return self.checkSelected(self.enter) +} + +func (self *SwitchToDiffFilesController) checkSelected(callback func(types.Ref) error) func() error { + return func() error { + ref := self.context.GetSelectedRef() + if ref == nil { + return nil + } + + return callback(ref) + } +} + +func (self *SwitchToDiffFilesController) enter(ref types.Ref) error { + return self.viewFiles(SwitchToCommitFilesContextOpts{ + Ref: ref, + CanRebase: self.context.CanRebase(), + Context: self.context, + }) +} + +func (self *SwitchToDiffFilesController) Context() types.Context { + return self.context +} diff --git a/pkg/gui/controllers/switch_to_sub_commits_controller.go b/pkg/gui/controllers/switch_to_sub_commits_controller.go new file mode 100644 index 000000000..5d89ebad7 --- /dev/null +++ b/pkg/gui/controllers/switch_to_sub_commits_controller.go @@ -0,0 +1,90 @@ +package controllers + +import ( + "github.com/jesseduffield/lazygit/pkg/commands/loaders" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +var _ types.IController = &SwitchToSubCommitsController{} + +type CanSwitchToSubCommits interface { + types.Context + GetSelectedRef() types.Ref +} + +type SwitchToSubCommitsController struct { + baseController + *controllerCommon + context CanSwitchToSubCommits + + setSubCommits func([]*models.Commit) +} + +func NewSwitchToSubCommitsController( + controllerCommon *controllerCommon, + setSubCommits func([]*models.Commit), + context CanSwitchToSubCommits, +) *SwitchToSubCommitsController { + return &SwitchToSubCommitsController{ + baseController: baseController{}, + controllerCommon: controllerCommon, + context: context, + setSubCommits: setSubCommits, + } +} + +func (self *SwitchToSubCommitsController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { + bindings := []*types.Binding{ + { + Handler: self.viewCommits, + Key: opts.GetKey(opts.Config.Universal.GoInto), + Description: self.c.Tr.LcViewCommits, + }, + } + + return bindings +} + +func (self *SwitchToSubCommitsController) GetOnClick() func() error { + return self.viewCommits +} + +func (self *SwitchToSubCommitsController) viewCommits() error { + ref := self.context.GetSelectedRef() + if ref == nil { + return nil + } + + // need to populate my sub commits + commits, err := self.git.Loaders.Commits.GetCommits( + loaders.GetCommitsOptions{ + Limit: true, + FilterPath: self.modes.Filtering.GetPath(), + IncludeRebaseCommits: false, + RefName: ref.FullRefName(), + }, + ) + if err != nil { + return err + } + + self.setSubCommits(commits) + + self.contexts.SubCommits.SetSelectedLineIdx(0) + self.contexts.SubCommits.SetParentContext(self.context) + self.contexts.SubCommits.SetWindowName(self.context.GetWindowName()) + self.contexts.SubCommits.SetTitleRef(ref.Description()) + self.contexts.SubCommits.SetRefName(ref.RefName()) + + err = self.c.PostRefreshUpdate(self.contexts.SubCommits) + if err != nil { + return err + } + + return self.c.PushContext(self.contexts.SubCommits) +} + +func (self *SwitchToSubCommitsController) Context() types.Context { + return self.context +} diff --git a/pkg/gui/controllers/sync_controller.go b/pkg/gui/controllers/sync_controller.go new file mode 100644 index 000000000..9eb4ae16a --- /dev/null +++ b/pkg/gui/controllers/sync_controller.go @@ -0,0 +1,215 @@ +package controllers + +import ( + "fmt" + "strings" + + "github.com/jesseduffield/lazygit/pkg/commands/git_commands" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type SyncController struct { + baseController + *controllerCommon +} + +var _ types.IController = &SyncController{} + +func NewSyncController( + common *controllerCommon, +) *SyncController { + return &SyncController{ + baseController: baseController{}, + controllerCommon: common, + } +} + +func (self *SyncController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { + bindings := []*types.Binding{ + { + Key: opts.GetKey(opts.Config.Universal.PushFiles), + Handler: opts.Guards.NoPopupPanel(self.HandlePush), + Description: self.c.Tr.LcPush, + }, + { + Key: opts.GetKey(opts.Config.Universal.PullFiles), + Handler: opts.Guards.NoPopupPanel(self.HandlePull), + Description: self.c.Tr.LcPull, + }, + } + + return bindings +} + +func (self *SyncController) Context() types.Context { + return nil +} + +func (self *SyncController) HandlePush() error { + return self.branchCheckedOut(self.push)() +} + +func (self *SyncController) HandlePull() error { + return self.branchCheckedOut(self.pull)() +} + +func (self *SyncController) branchCheckedOut(f func(*models.Branch) error) func() error { + return func() error { + currentBranch := self.helpers.Refs.GetCheckedOutRef() + if currentBranch == nil { + // need to wait for branches to refresh + return nil + } + + return f(currentBranch) + } +} + +func (self *SyncController) push(currentBranch *models.Branch) error { + // if we have pullables we'll ask if the user wants to force push + if currentBranch.IsTrackingRemote() { + opts := pushOpts{} + if currentBranch.HasCommitsToPull() { + return self.requestToForcePush(opts) + } else { + return self.pushAux(opts) + } + } else { + if self.git.Config.GetPushToCurrent() { + return self.pushAux(pushOpts{setUpstream: true}) + } else { + return self.helpers.Upstream.PromptForUpstreamWithInitialContent(currentBranch, func(upstream string) error { + upstreamRemote, upstreamBranch, err := self.helpers.Upstream.ParseUpstream(upstream) + if err != nil { + return self.c.Error(err) + } + + return self.pushAux(pushOpts{ + setUpstream: true, + upstreamRemote: upstreamRemote, + upstreamBranch: upstreamBranch, + }) + }) + } + } +} + +func (self *SyncController) pull(currentBranch *models.Branch) error { + action := self.c.Tr.Actions.Pull + + // if we have no upstream branch we need to set that first + if !currentBranch.IsTrackingRemote() { + return self.helpers.Upstream.PromptForUpstreamWithInitialContent(currentBranch, func(upstream string) error { + if err := self.setCurrentBranchUpstream(upstream); err != nil { + return self.c.Error(err) + } + + return self.PullAux(PullFilesOptions{Action: action}) + }) + } + + return self.PullAux(PullFilesOptions{Action: action}) +} + +func (self *SyncController) setCurrentBranchUpstream(upstream string) error { + upstreamRemote, upstreamBranch, err := self.helpers.Upstream.ParseUpstream(upstream) + if err != nil { + return err + } + + if err := self.git.Branch.SetCurrentBranchUpstream(upstreamRemote, upstreamBranch); err != nil { + if strings.Contains(err.Error(), "does not exist") { + return fmt.Errorf( + "upstream branch %s/%s not found.\nIf you expect it to exist, you should fetch (with 'f').\nOtherwise, you should push (with 'shift+P')", + upstreamRemote, upstreamBranch, + ) + } + return err + } + return nil +} + +type PullFilesOptions struct { + UpstreamRemote string + UpstreamBranch string + FastForwardOnly bool + Action string +} + +func (self *SyncController) PullAux(opts PullFilesOptions) error { + return self.c.WithLoaderPanel(self.c.Tr.PullWait, func() error { + return self.pullWithLock(opts) + }) +} + +func (self *SyncController) pullWithLock(opts PullFilesOptions) error { + self.c.LogAction(opts.Action) + + err := self.git.Sync.Pull( + git_commands.PullOptions{ + RemoteName: opts.UpstreamRemote, + BranchName: opts.UpstreamBranch, + FastForwardOnly: opts.FastForwardOnly, + }, + ) + + return self.helpers.MergeAndRebase.CheckMergeOrRebase(err) +} + +type pushOpts struct { + force bool + upstreamRemote string + upstreamBranch string + setUpstream bool +} + +func (self *SyncController) pushAux(opts pushOpts) error { + return self.c.WithLoaderPanel(self.c.Tr.PushWait, func() error { + self.c.LogAction(self.c.Tr.Actions.Push) + err := self.git.Sync.Push(git_commands.PushOpts{ + Force: opts.force, + UpstreamRemote: opts.upstreamRemote, + UpstreamBranch: opts.upstreamBranch, + SetUpstream: opts.setUpstream, + }) + if err != nil { + if !opts.force && strings.Contains(err.Error(), "Updates were rejected") { + forcePushDisabled := self.c.UserConfig.Git.DisableForcePushing + if forcePushDisabled { + _ = self.c.ErrorMsg(self.c.Tr.UpdatesRejectedAndForcePushDisabled) + return nil + } + _ = self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.ForcePush, + Prompt: self.c.Tr.ForcePushPrompt, + HandleConfirm: func() error { + newOpts := opts + newOpts.force = true + + return self.pushAux(newOpts) + }, + }) + return nil + } + _ = self.c.Error(err) + } + return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}) + }) +} + +func (self *SyncController) requestToForcePush(opts pushOpts) error { + forcePushDisabled := self.c.UserConfig.Git.DisableForcePushing + if forcePushDisabled { + return self.c.ErrorMsg(self.c.Tr.ForcePushDisabled) + } + + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.ForcePush, + Prompt: self.c.Tr.ForcePushPrompt, + HandleConfirm: func() error { + opts.force = true + return self.pushAux(opts) + }, + }) +} diff --git a/pkg/gui/controllers/tags_controller.go b/pkg/gui/controllers/tags_controller.go new file mode 100644 index 000000000..f4b23374c --- /dev/null +++ b/pkg/gui/controllers/tags_controller.go @@ -0,0 +1,140 @@ +package controllers + +import ( + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/context" + "github.com/jesseduffield/lazygit/pkg/gui/types" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +type TagsController struct { + baseController + *controllerCommon +} + +var _ types.IController = &TagsController{} + +func NewTagsController( + common *controllerCommon, +) *TagsController { + return &TagsController{ + baseController: baseController{}, + controllerCommon: common, + } +} + +func (self *TagsController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { + bindings := []*types.Binding{ + { + Key: opts.GetKey(opts.Config.Universal.Select), + Handler: self.withSelectedTag(self.checkout), + Description: self.c.Tr.LcCheckout, + }, + { + Key: opts.GetKey(opts.Config.Universal.Remove), + Handler: self.withSelectedTag(self.delete), + Description: self.c.Tr.LcDeleteTag, + }, + { + Key: opts.GetKey(opts.Config.Branches.PushTag), + Handler: self.withSelectedTag(self.push), + Description: self.c.Tr.LcPushTag, + }, + { + Key: opts.GetKey(opts.Config.Universal.New), + Handler: self.create, + Description: self.c.Tr.LcCreateTag, + }, + { + Key: opts.GetKey(opts.Config.Commits.ViewResetOptions), + Handler: self.withSelectedTag(self.createResetMenu), + Description: self.c.Tr.LcViewResetOptions, + OpensMenu: true, + }, + } + + return bindings +} + +func (self *TagsController) checkout(tag *models.Tag) error { + self.c.LogAction(self.c.Tr.Actions.CheckoutTag) + if err := self.helpers.Refs.CheckoutRef(tag.Name, types.CheckoutRefOptions{}); err != nil { + return err + } + return self.c.PushContext(self.contexts.Branches) +} + +func (self *TagsController) delete(tag *models.Tag) error { + prompt := utils.ResolvePlaceholderString( + self.c.Tr.DeleteTagPrompt, + map[string]string{ + "tagName": tag.Name, + }, + ) + + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.DeleteTagTitle, + Prompt: prompt, + HandleConfirm: func() error { + self.c.LogAction(self.c.Tr.Actions.DeleteTag) + if err := self.git.Tag.Delete(tag.Name); err != nil { + return self.c.Error(err) + } + return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.COMMITS, types.TAGS}}) + }, + }) +} + +func (self *TagsController) push(tag *models.Tag) error { + title := utils.ResolvePlaceholderString( + self.c.Tr.PushTagTitle, + map[string]string{ + "tagName": tag.Name, + }, + ) + + return self.c.Prompt(types.PromptOpts{ + Title: title, + InitialContent: "origin", + FindSuggestionsFunc: self.helpers.Suggestions.GetRemoteSuggestionsFunc(), + HandleConfirm: func(response string) error { + return self.c.WithWaitingStatus(self.c.Tr.PushingTagStatus, func() error { + self.c.LogAction(self.c.Tr.Actions.PushTag) + err := self.git.Tag.Push(response, tag.Name) + if err != nil { + _ = self.c.Error(err) + } + + return nil + }) + }, + }) +} + +func (self *TagsController) createResetMenu(tag *models.Tag) error { + return self.helpers.Refs.CreateGitResetMenu(tag.Name) +} + +func (self *TagsController) create() error { + // leaving commit SHA blank so that we're just creating the tag for the current commit + return self.helpers.Tags.CreateTagMenu("", func() { self.context().SetSelectedLineIdx(0) }) +} + +func (self *TagsController) withSelectedTag(f func(tag *models.Tag) error) func() error { + return func() error { + tag := self.context().GetSelected() + if tag == nil { + return nil + } + + return f(tag) + } +} + +func (self *TagsController) Context() types.Context { + return self.context() +} + +func (self *TagsController) context() *context.TagsContext { + return self.contexts.Tags +} diff --git a/pkg/gui/controllers/types.go b/pkg/gui/controllers/types.go new file mode 100644 index 000000000..f719b5de0 --- /dev/null +++ b/pkg/gui/controllers/types.go @@ -0,0 +1,18 @@ +package controllers + +import ( + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +// all fields mandatory (except `CanRebase` because it's boolean) +type SwitchToCommitFilesContextOpts struct { + // this is something like a commit or branch + Ref types.Ref + + // from the local commits view we're allowed to do rebase stuff with any patch + // we generate from the diff files context, but we don't have that same ability + // with say the sub commits context or the reflog context. + CanRebase bool + + Context types.Context +} diff --git a/pkg/gui/controllers/undo_controller.go b/pkg/gui/controllers/undo_controller.go new file mode 100644 index 000000000..5e0bf5730 --- /dev/null +++ b/pkg/gui/controllers/undo_controller.go @@ -0,0 +1,274 @@ +package controllers + +import ( + "fmt" + + "github.com/jesseduffield/lazygit/pkg/commands/types/enums" + "github.com/jesseduffield/lazygit/pkg/gui/types" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +// Quick summary of how this all works: +// when you want to undo or redo, we start from the top of the reflog and work +// down until we've reached the last user-initiated reflog entry that hasn't already been undone +// we then do the reverse of what that reflog describes. +// When we do this, we create a new reflog entry, and tag it as either an undo or redo +// Then, next time we want to undo, we'll use those entries to know which user-initiated +// actions we can skip. E.g. if I do do three things, A, B, and C, and hit undo twice, +// the reflog will read UUCBA, and when I read the first two undos, I know to skip the following +// two user actions, meaning we end up undoing reflog entry C. Redoing works in a similar way. + +type UndoController struct { + baseController + *controllerCommon +} + +var _ types.IController = &UndoController{} + +func NewUndoController( + common *controllerCommon, +) *UndoController { + return &UndoController{ + baseController: baseController{}, + controllerCommon: common, + } +} + +type ReflogActionKind int + +const ( + CHECKOUT ReflogActionKind = iota + COMMIT + REBASE + CURRENT_REBASE +) + +type reflogAction struct { + kind ReflogActionKind + from string + to string +} + +func (self *UndoController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { + bindings := []*types.Binding{ + { + Key: opts.GetKey(opts.Config.Universal.Undo), + Handler: self.reflogUndo, + Description: self.c.Tr.LcUndoReflog, + Tooltip: self.c.Tr.UndoTooltip, + }, + { + Key: opts.GetKey(opts.Config.Universal.Redo), + Handler: self.reflogRedo, + Description: self.c.Tr.LcRedoReflog, + Tooltip: self.c.Tr.RedoTooltip, + }, + } + + return bindings +} + +func (self *UndoController) Context() types.Context { + return nil +} + +func (self *UndoController) reflogUndo() error { + undoEnvVars := []string{"GIT_REFLOG_ACTION=[lazygit undo]"} + undoingStatus := self.c.Tr.UndoingStatus + + if self.git.Status.WorkingTreeState() == enums.REBASE_MODE_REBASING { + return self.c.ErrorMsg(self.c.Tr.LcCantUndoWhileRebasing) + } + + return self.parseReflogForActions(func(counter int, action reflogAction) (bool, error) { + if counter != 0 { + return false, nil + } + + switch action.kind { + case COMMIT, REBASE: + return true, self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.Actions.Undo, + Prompt: fmt.Sprintf(self.c.Tr.HardResetAutostashPrompt, action.from), + HandleConfirm: func() error { + self.c.LogAction(self.c.Tr.Actions.Undo) + return self.hardResetWithAutoStash(action.from, hardResetOptions{ + EnvVars: undoEnvVars, + WaitingStatus: undoingStatus, + }) + }, + }) + case CHECKOUT: + return true, self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.Actions.Undo, + Prompt: fmt.Sprintf(self.c.Tr.CheckoutPrompt, action.from), + HandleConfirm: func() error { + self.c.LogAction(self.c.Tr.Actions.Undo) + return self.helpers.Refs.CheckoutRef(action.from, types.CheckoutRefOptions{ + EnvVars: undoEnvVars, + WaitingStatus: undoingStatus, + }) + }, + }) + + case CURRENT_REBASE: + // do nothing + } + + self.c.Log.Error("didn't match on the user action when trying to undo") + return true, nil + }) +} + +func (self *UndoController) reflogRedo() error { + redoEnvVars := []string{"GIT_REFLOG_ACTION=[lazygit redo]"} + redoingStatus := self.c.Tr.RedoingStatus + + if self.git.Status.WorkingTreeState() == enums.REBASE_MODE_REBASING { + return self.c.ErrorMsg(self.c.Tr.LcCantRedoWhileRebasing) + } + + return self.parseReflogForActions(func(counter int, action reflogAction) (bool, error) { + // if we're redoing and the counter is zero, we just return + if counter == 0 { + return true, nil + } else if counter > 1 { + return false, nil + } + + switch action.kind { + case COMMIT, REBASE: + return true, self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.Actions.Redo, + Prompt: fmt.Sprintf(self.c.Tr.HardResetAutostashPrompt, action.to), + HandleConfirm: func() error { + self.c.LogAction(self.c.Tr.Actions.Redo) + return self.hardResetWithAutoStash(action.to, hardResetOptions{ + EnvVars: redoEnvVars, + WaitingStatus: redoingStatus, + }) + }, + }) + + case CHECKOUT: + return true, self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.Actions.Redo, + Prompt: fmt.Sprintf(self.c.Tr.CheckoutPrompt, action.to), + HandleConfirm: func() error { + self.c.LogAction(self.c.Tr.Actions.Redo) + return self.helpers.Refs.CheckoutRef(action.to, types.CheckoutRefOptions{ + EnvVars: redoEnvVars, + WaitingStatus: redoingStatus, + }) + }, + }) + case CURRENT_REBASE: + // do nothing + } + + self.c.Log.Error("didn't match on the user action when trying to redo") + return true, nil + }) +} + +// Here we're going through the reflog and maintaining a counter that represents how many +// undos/redos/user actions we've seen. when we hit a user action we call the callback specifying +// what the counter is up to and the nature of the action. +// If we find ourselves mid-rebase, we just return because undo/redo mid rebase +// requires knowledge of previous TODO file states, which you can't just get from the reflog. +// Though we might support this later, hence the use of the CURRENT_REBASE action kind. +func (self *UndoController) parseReflogForActions(onUserAction func(counter int, action reflogAction) (bool, error)) error { + counter := 0 + reflogCommits := self.model.FilteredReflogCommits + rebaseFinishCommitSha := "" + var action *reflogAction + for reflogCommitIdx, reflogCommit := range reflogCommits { + action = nil + + prevCommitSha := "" + if len(reflogCommits)-1 >= reflogCommitIdx+1 { + prevCommitSha = reflogCommits[reflogCommitIdx+1].Sha + } + + if rebaseFinishCommitSha == "" { + if ok, _ := utils.FindStringSubmatch(reflogCommit.Name, `^\[lazygit undo\]`); ok { + counter++ + } else if ok, _ := utils.FindStringSubmatch(reflogCommit.Name, `^\[lazygit redo\]`); ok { + counter-- + } else if ok, _ := utils.FindStringSubmatch(reflogCommit.Name, `^rebase -i \(abort\)|^rebase -i \(finish\)`); ok { + rebaseFinishCommitSha = reflogCommit.Sha + } else if ok, match := utils.FindStringSubmatch(reflogCommit.Name, `^checkout: moving from ([\S]+) to ([\S]+)`); ok { + action = &reflogAction{kind: CHECKOUT, from: match[1], to: match[2]} + } else if ok, _ := utils.FindStringSubmatch(reflogCommit.Name, `^commit|^reset: moving to|^pull`); ok { + action = &reflogAction{kind: COMMIT, from: prevCommitSha, to: reflogCommit.Sha} + } else if ok, _ := utils.FindStringSubmatch(reflogCommit.Name, `^rebase -i \(start\)`); ok { + // if we're here then we must be currently inside an interactive rebase + action = &reflogAction{kind: CURRENT_REBASE, from: prevCommitSha} + } + } else if ok, _ := utils.FindStringSubmatch(reflogCommit.Name, `^rebase -i \(start\)`); ok { + action = &reflogAction{kind: REBASE, from: prevCommitSha, to: rebaseFinishCommitSha} + rebaseFinishCommitSha = "" + } + + if action != nil { + if action.kind != CURRENT_REBASE && action.from == action.to { + // if we're going from one place to the same place we'll ignore the action. + continue + } + ok, err := onUserAction(counter, *action) + if ok { + return err + } + counter-- + } + } + return nil +} + +type hardResetOptions struct { + WaitingStatus string + EnvVars []string +} + +// only to be used in the undo flow for now (does an autostash) +func (self *UndoController) hardResetWithAutoStash(commitSha string, options hardResetOptions) error { + reset := func() error { + if err := self.helpers.Refs.ResetToRef(commitSha, "hard", options.EnvVars); err != nil { + return self.c.Error(err) + } + return nil + } + + // if we have any modified tracked files we need to ask the user if they want us to stash for them + dirtyWorkingTree := self.helpers.WorkingTree.IsWorkingTreeDirty() + if dirtyWorkingTree { + // offer to autostash changes + return self.c.Confirm(types.ConfirmOpts{ + Title: self.c.Tr.AutoStashTitle, + Prompt: self.c.Tr.AutoStashPrompt, + HandleConfirm: func() error { + return self.c.WithWaitingStatus(options.WaitingStatus, func() error { + if err := self.git.Stash.Save(self.c.Tr.StashPrefix + commitSha); err != nil { + return self.c.Error(err) + } + if err := reset(); err != nil { + return err + } + + err := self.git.Stash.Pop(0) + if err := self.c.Refresh(types.RefreshOptions{}); err != nil { + return err + } + if err != nil { + return self.c.Error(err) + } + return nil + }) + }, + }) + } + + return self.c.WithWaitingStatus(options.WaitingStatus, func() error { + return reset() + }) +} diff --git a/pkg/gui/controllers/vertical_scroll_controller.go b/pkg/gui/controllers/vertical_scroll_controller.go new file mode 100644 index 000000000..3f3e9d177 --- /dev/null +++ b/pkg/gui/controllers/vertical_scroll_controller.go @@ -0,0 +1,70 @@ +package controllers + +import ( + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +// given we have no fields here, arguably we shouldn't even need this factory +// struct, but we're maintaining consistency with the other files. +type VerticalScrollControllerFactory struct { + controllerCommon *controllerCommon +} + +func NewVerticalScrollControllerFactory(c *controllerCommon) *VerticalScrollControllerFactory { + return &VerticalScrollControllerFactory{controllerCommon: c} +} + +func (self *VerticalScrollControllerFactory) Create(context types.Context) types.IController { + return &VerticalScrollController{ + baseController: baseController{}, + controllerCommon: self.controllerCommon, + context: context, + } +} + +type VerticalScrollController struct { + baseController + *controllerCommon + + context types.Context +} + +func (self *VerticalScrollController) Context() types.Context { + return self.context +} + +func (self *VerticalScrollController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { + return []*types.Binding{} +} + +func (self *VerticalScrollController) GetMouseKeybindings(opts types.KeybindingsOpts) []*gocui.ViewMouseBinding { + return []*gocui.ViewMouseBinding{ + { + ViewName: self.context.GetViewName(), + Key: gocui.MouseWheelUp, + Handler: func(gocui.ViewMouseBindingOpts) error { + return self.HandleScrollUp() + }, + }, + { + ViewName: self.context.GetViewName(), + Key: gocui.MouseWheelDown, + Handler: func(gocui.ViewMouseBindingOpts) error { + return self.HandleScrollDown() + }, + }, + } +} + +func (self *VerticalScrollController) HandleScrollUp() error { + self.context.GetViewTrait().ScrollUp(self.c.UserConfig.Gui.ScrollHeight) + + return nil +} + +func (self *VerticalScrollController) HandleScrollDown() error { + self.context.GetViewTrait().ScrollDown(self.c.UserConfig.Gui.ScrollHeight) + + return nil +} diff --git a/pkg/gui/controllers/workspace_reset_controller.go b/pkg/gui/controllers/workspace_reset_controller.go new file mode 100644 index 000000000..f34739af7 --- /dev/null +++ b/pkg/gui/controllers/workspace_reset_controller.go @@ -0,0 +1,137 @@ +package controllers + +import ( + "fmt" + + "github.com/jesseduffield/lazygit/pkg/gui/style" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +// this is in its own file given that the workspace controller file is already quite long + +func (self *FilesController) createResetMenu() error { + red := style.FgRed + + nukeStr := "git reset --hard HEAD && git clean -fd" + if len(self.model.Submodules) > 0 { + nukeStr = fmt.Sprintf("%s (%s)", nukeStr, self.c.Tr.LcAndResetSubmodules) + } + + menuItems := []*types.MenuItem{ + { + LabelColumns: []string{ + self.c.Tr.LcDiscardAllChangesToAllFiles, + red.Sprint(nukeStr), + }, + OnPress: func() error { + self.c.LogAction(self.c.Tr.Actions.NukeWorkingTree) + if err := self.git.WorkingTree.ResetAndClean(); err != nil { + return self.c.Error(err) + } + + return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.FILES}}) + }, + Key: 'D', + Tooltip: self.c.Tr.NukeDescription, + }, + { + LabelColumns: []string{ + self.c.Tr.LcDiscardAnyUnstagedChanges, + red.Sprint("git checkout -- ."), + }, + OnPress: func() error { + self.c.LogAction(self.c.Tr.Actions.DiscardUnstagedFileChanges) + if err := self.git.WorkingTree.DiscardAnyUnstagedFileChanges(); err != nil { + return self.c.Error(err) + } + + return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.FILES}}) + }, + Key: 'u', + }, + { + LabelColumns: []string{ + self.c.Tr.LcDiscardUntrackedFiles, + red.Sprint("git clean -fd"), + }, + OnPress: func() error { + self.c.LogAction(self.c.Tr.Actions.RemoveUntrackedFiles) + if err := self.git.WorkingTree.RemoveUntrackedFiles(); err != nil { + return self.c.Error(err) + } + + return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.FILES}}) + }, + Key: 'c', + }, + { + LabelColumns: []string{ + self.c.Tr.LcDiscardStagedChanges, + red.Sprint("stash staged and drop stash"), + }, + Tooltip: self.c.Tr.DiscardStagedChangesDescription, + OnPress: func() error { + self.c.LogAction(self.c.Tr.Actions.RemoveStagedFiles) + if !self.helpers.WorkingTree.IsWorkingTreeDirty() { + return self.c.ErrorMsg(self.c.Tr.NoTrackedStagedFilesStash) + } + if err := self.git.Stash.SaveStagedChanges("[lazygit] tmp stash"); err != nil { + return self.c.Error(err) + } + if err := self.git.Stash.DropNewest(); err != nil { + return self.c.Error(err) + } + + return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.FILES}}) + }, + Key: 'S', + }, + { + LabelColumns: []string{ + self.c.Tr.LcSoftReset, + red.Sprint("git reset --soft HEAD"), + }, + OnPress: func() error { + self.c.LogAction(self.c.Tr.Actions.SoftReset) + if err := self.git.WorkingTree.ResetSoft("HEAD"); err != nil { + return self.c.Error(err) + } + + return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.FILES}}) + }, + Key: 's', + }, + { + LabelColumns: []string{ + "mixed reset", + red.Sprint("git reset --mixed HEAD"), + }, + OnPress: func() error { + self.c.LogAction(self.c.Tr.Actions.MixedReset) + if err := self.git.WorkingTree.ResetMixed("HEAD"); err != nil { + return self.c.Error(err) + } + + return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.FILES}}) + }, + Key: 'm', + }, + { + LabelColumns: []string{ + self.c.Tr.LcHardReset, + red.Sprint("git reset --hard HEAD"), + }, + OnPress: func() error { + self.c.LogAction(self.c.Tr.Actions.HardReset) + if err := self.git.WorkingTree.ResetHard("HEAD"); err != nil { + return self.c.Error(err) + } + + return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.FILES}}) + }, + Key: 'h', + }, + } + + return self.c.Menu(types.CreateMenuOptions{Title: "", Items: menuItems}) +} diff --git a/pkg/gui/credentials_panel.go b/pkg/gui/credentials_panel.go deleted file mode 100644 index 984591a62..000000000 --- a/pkg/gui/credentials_panel.go +++ /dev/null @@ -1,86 +0,0 @@ -package gui - -import ( - "strings" - - "github.com/jesseduffield/lazygit/pkg/commands/oscommands" - "github.com/jesseduffield/lazygit/pkg/utils" -) - -type credentials chan string - -// promptUserForCredential wait for a username, password or passphrase input from the credentials popup -func (gui *Gui) promptUserForCredential(passOrUname oscommands.CredentialType) string { - gui.credentials = make(chan string) - gui.OnUIThread(func() error { - credentialsView := gui.Views.Credentials - switch passOrUname { - case oscommands.Username: - credentialsView.Title = gui.Tr.CredentialsUsername - credentialsView.Mask = 0 - case oscommands.Password: - credentialsView.Title = gui.Tr.CredentialsPassword - credentialsView.Mask = '*' - case oscommands.Passphrase: - credentialsView.Title = gui.Tr.CredentialsPassphrase - credentialsView.Mask = '*' - } - - if err := gui.pushContext(gui.State.Contexts.Credentials); err != nil { - return err - } - - gui.RenderCommitLength() - return nil - }) - - // wait for username/passwords/passphrase input - userInput := <-gui.credentials - return userInput + "\n" -} - -func (gui *Gui) handleSubmitCredential() error { - credentialsView := gui.Views.Credentials - message := strings.TrimSpace(credentialsView.TextArea.GetContent()) - gui.credentials <- message - credentialsView.ClearTextArea() - if err := gui.returnFromContext(); err != nil { - return err - } - - return gui.refreshSidePanels(refreshOptions{mode: ASYNC}) -} - -func (gui *Gui) handleCloseCredentialsView() error { - gui.credentials <- "" - return gui.returnFromContext() -} - -func (gui *Gui) handleCredentialsViewFocused() error { - keybindingConfig := gui.UserConfig.Keybinding - - message := utils.ResolvePlaceholderString( - gui.Tr.CloseConfirm, - map[string]string{ - "keyBindClose": gui.getKeyDisplay(keybindingConfig.Universal.Return), - "keyBindConfirm": gui.getKeyDisplay(keybindingConfig.Universal.Confirm), - }, - ) - - return gui.renderString(gui.Views.Options, message) -} - -// handleCredentialsPopup handles the views after executing a command that might ask for credentials -func (gui *Gui) handleCredentialsPopup(cmdErr error) { - if cmdErr != nil { - errMessage := cmdErr.Error() - if strings.Contains(errMessage, "Invalid username, password or passphrase") { - errMessage = gui.Tr.PassUnameWrong - } - _ = gui.returnFromContext() - // we are not logging this error because it may contain a password or a passphrase - _ = gui.createErrorPanel(errMessage) - } else { - _ = gui.closeConfirmationPrompt(false) - } -} diff --git a/pkg/gui/custom_commands.go b/pkg/gui/custom_commands.go deleted file mode 100644 index 02293dd65..000000000 --- a/pkg/gui/custom_commands.go +++ /dev/null @@ -1,348 +0,0 @@ -package gui - -import ( - "bytes" - "errors" - "log" - "regexp" - "strconv" - "strings" - "text/template" - - "github.com/jesseduffield/gocui" - "github.com/jesseduffield/lazygit/pkg/commands/models" - "github.com/jesseduffield/lazygit/pkg/config" - "github.com/jesseduffield/lazygit/pkg/gui/style" - "github.com/jesseduffield/lazygit/pkg/utils" -) - -type CustomCommandObjects struct { - SelectedLocalCommit *models.Commit - SelectedReflogCommit *models.Commit - SelectedSubCommit *models.Commit - SelectedFile *models.File - SelectedPath string - SelectedLocalBranch *models.Branch - SelectedRemoteBranch *models.RemoteBranch - SelectedRemote *models.Remote - SelectedTag *models.Tag - SelectedStashEntry *models.StashEntry - SelectedCommitFile *models.CommitFile - SelectedCommitFilePath string - CheckedOutBranch *models.Branch - PromptResponses []string -} - -type commandMenuEntry struct { - label string - value string -} - -func (gui *Gui) resolveTemplate(templateStr string, promptResponses []string) (string, error) { - objects := CustomCommandObjects{ - SelectedFile: gui.getSelectedFile(), - SelectedPath: gui.getSelectedPath(), - SelectedLocalCommit: gui.getSelectedLocalCommit(), - SelectedReflogCommit: gui.getSelectedReflogCommit(), - SelectedLocalBranch: gui.getSelectedBranch(), - SelectedRemoteBranch: gui.getSelectedRemoteBranch(), - SelectedRemote: gui.getSelectedRemote(), - SelectedTag: gui.getSelectedTag(), - SelectedStashEntry: gui.getSelectedStashEntry(), - SelectedCommitFile: gui.getSelectedCommitFile(), - SelectedCommitFilePath: gui.getSelectedCommitFilePath(), - SelectedSubCommit: gui.getSelectedSubCommit(), - CheckedOutBranch: gui.currentBranch(), - PromptResponses: promptResponses, - } - - return utils.ResolveTemplate(templateStr, objects) -} - -func (gui *Gui) inputPrompt(prompt config.CustomCommandPrompt, promptResponses []string, responseIdx int, wrappedF func() error) error { - title, err := gui.resolveTemplate(prompt.Title, promptResponses) - if err != nil { - return gui.surfaceError(err) - } - - initialValue, err := gui.resolveTemplate(prompt.InitialValue, promptResponses) - if err != nil { - return gui.surfaceError(err) - } - - return gui.prompt(promptOpts{ - title: title, - initialContent: initialValue, - handleConfirm: func(str string) error { - promptResponses[responseIdx] = str - return wrappedF() - }, - }) -} - -func (gui *Gui) menuPrompt(prompt config.CustomCommandPrompt, promptResponses []string, responseIdx int, wrappedF func() error) error { - // need to make a menu here some how - menuItems := make([]*menuItem, len(prompt.Options)) - for i, option := range prompt.Options { - option := option - - nameTemplate := option.Name - if nameTemplate == "" { - // this allows you to only pass values rather than bother with names/descriptions - nameTemplate = option.Value - } - name, err := gui.resolveTemplate(nameTemplate, promptResponses) - if err != nil { - return gui.surfaceError(err) - } - - description, err := gui.resolveTemplate(option.Description, promptResponses) - if err != nil { - return gui.surfaceError(err) - } - - value, err := gui.resolveTemplate(option.Value, promptResponses) - if err != nil { - return gui.surfaceError(err) - } - - menuItems[i] = &menuItem{ - displayStrings: []string{name, style.FgYellow.Sprint(description)}, - onPress: func() error { - promptResponses[responseIdx] = value - return wrappedF() - }, - } - } - - title, err := gui.resolveTemplate(prompt.Title, promptResponses) - if err != nil { - return gui.surfaceError(err) - } - - return gui.createMenu(title, menuItems, createMenuOptions{showCancel: true}) -} - -func (gui *Gui) GenerateMenuCandidates(commandOutput, filter, valueFormat, labelFormat string) ([]commandMenuEntry, error) { - reg, err := regexp.Compile(filter) - if err != nil { - return nil, gui.surfaceError(errors.New("unable to parse filter regex, error: " + err.Error())) - } - - buff := bytes.NewBuffer(nil) - - valueTemp, err := template.New("format").Parse(valueFormat) - if err != nil { - return nil, gui.surfaceError(errors.New("unable to parse value format, error: " + err.Error())) - } - - colorFuncMap := style.TemplateFuncMapAddColors(template.FuncMap{}) - - descTemp, err := template.New("format").Funcs(colorFuncMap).Parse(labelFormat) - if err != nil { - return nil, gui.surfaceError(errors.New("unable to parse label format, error: " + err.Error())) - } - - candidates := []commandMenuEntry{} - for _, str := range strings.Split(commandOutput, "\n") { - if str == "" { - continue - } - - tmplData := map[string]string{} - out := reg.FindAllStringSubmatch(str, -1) - if len(out) > 0 { - for groupIdx, group := range reg.SubexpNames() { - // Record matched group with group ids - matchName := "group_" + strconv.Itoa(groupIdx) - tmplData[matchName] = out[0][groupIdx] - // Record last named group non-empty matches as group matches - if group != "" { - tmplData[group] = out[0][groupIdx] - } - } - } - - err = valueTemp.Execute(buff, tmplData) - if err != nil { - return candidates, gui.surfaceError(err) - } - entry := commandMenuEntry{ - value: strings.TrimSpace(buff.String()), - } - - if labelFormat != "" { - buff.Reset() - err = descTemp.Execute(buff, tmplData) - if err != nil { - return candidates, gui.surfaceError(err) - } - entry.label = strings.TrimSpace(buff.String()) - } else { - entry.label = entry.value - } - - candidates = append(candidates, entry) - - buff.Reset() - } - return candidates, err -} - -func (gui *Gui) menuPromptFromCommand(prompt config.CustomCommandPrompt, promptResponses []string, responseIdx int, wrappedF func() error) error { - // Collect cmd to run from config - cmdStr, err := gui.resolveTemplate(prompt.Command, promptResponses) - if err != nil { - return gui.surfaceError(err) - } - - // Collect Filter regexp - filter, err := gui.resolveTemplate(prompt.Filter, promptResponses) - if err != nil { - return gui.surfaceError(err) - } - - // Run and save output - message, err := gui.Git.Custom.RunWithOutput(cmdStr) - if err != nil { - return gui.surfaceError(err) - } - - // Need to make a menu out of what the cmd has displayed - candidates, err := gui.GenerateMenuCandidates(message, filter, prompt.ValueFormat, prompt.LabelFormat) - if err != nil { - return gui.surfaceError(err) - } - - menuItems := make([]*menuItem, len(candidates)) - for i := range candidates { - i := i - menuItems[i] = &menuItem{ - displayStrings: []string{candidates[i].label}, - onPress: func() error { - promptResponses[responseIdx] = candidates[i].value - return wrappedF() - }, - } - } - - title, err := gui.resolveTemplate(prompt.Title, promptResponses) - if err != nil { - return gui.surfaceError(err) - } - - return gui.createMenu(title, menuItems, createMenuOptions{showCancel: true}) -} - -func (gui *Gui) handleCustomCommandKeybinding(customCommand config.CustomCommand) func() error { - return func() error { - promptResponses := make([]string, len(customCommand.Prompts)) - - f := func() error { - cmdStr, err := gui.resolveTemplate(customCommand.Command, promptResponses) - if err != nil { - return gui.surfaceError(err) - } - - if customCommand.Subprocess { - return gui.runSubprocessWithSuspenseAndRefresh(gui.OSCommand.Cmd.NewShell(cmdStr)) - } - - loadingText := customCommand.LoadingText - if loadingText == "" { - loadingText = gui.Tr.LcRunningCustomCommandStatus - } - return gui.WithWaitingStatus(loadingText, func() error { - gui.logAction(gui.Tr.Actions.CustomCommand) - cmdObj := gui.OSCommand.Cmd.NewShell(cmdStr) - if customCommand.Stream { - cmdObj.StreamOutput() - } - err := cmdObj.Run() - if err != nil { - return gui.surfaceError(err) - } - return gui.refreshSidePanels(refreshOptions{}) - }) - } - - // if we have prompts we'll recursively wrap our confirm handlers with more prompts - // until we reach the actual command - for reverseIdx := range customCommand.Prompts { - idx := len(customCommand.Prompts) - 1 - reverseIdx - - // going backwards so the outermost prompt is the first one - prompt := customCommand.Prompts[idx] - - // need to do this because f's value will change with each iteration - wrappedF := f - - switch prompt.Type { - case "input": - f = func() error { - return gui.inputPrompt(prompt, promptResponses, idx, wrappedF) - } - case "menu": - f = func() error { - return gui.menuPrompt(prompt, promptResponses, idx, wrappedF) - } - case "menuFromCommand": - f = func() error { - return gui.menuPromptFromCommand(prompt, promptResponses, idx, wrappedF) - } - default: - return gui.createErrorPanel("custom command prompt must have a type of 'input', 'menu' or 'menuFromCommand'") - } - - } - - return f() - } -} - -func (gui *Gui) GetCustomCommandKeybindings() []*Binding { - bindings := []*Binding{} - customCommands := gui.UserConfig.CustomCommands - - for _, customCommand := range customCommands { - var viewName string - var contexts []string - switch customCommand.Context { - case "global": - viewName = "" - case "": - log.Fatalf("Error parsing custom command keybindings: context not provided (use context: 'global' for the global context). Key: %s, Command: %s", customCommand.Key, customCommand.Command) - default: - context, ok := gui.contextForContextKey(ContextKey(customCommand.Context)) - // stupid golang making me build an array of strings for this. - allContextKeyStrings := make([]string, len(allContextKeys)) - for i := range allContextKeys { - allContextKeyStrings[i] = string(allContextKeys[i]) - } - if !ok { - log.Fatalf("Error when setting custom command keybindings: unknown context: %s. Key: %s, Command: %s.\nPermitted contexts: %s", customCommand.Context, customCommand.Key, customCommand.Command, strings.Join(allContextKeyStrings, ", ")) - } - // here we assume that a given context will always belong to the same view. - // Currently this is a safe bet but it's by no means guaranteed in the long term - // and we might need to make some changes in the future to support it. - viewName = context.GetViewName() - contexts = []string{customCommand.Context} - } - - description := customCommand.Description - if description == "" { - description = customCommand.Command - } - - bindings = append(bindings, &Binding{ - ViewName: viewName, - Contexts: contexts, - Key: gui.getKey(customCommand.Key), - Modifier: gocui.ModNone, - Handler: gui.handleCustomCommandKeybinding(customCommand), - Description: description, - }) - } - - return bindings -} diff --git a/pkg/gui/custom_commands_test.go b/pkg/gui/custom_commands_test.go deleted file mode 100644 index d31bcf291..000000000 --- a/pkg/gui/custom_commands_test.go +++ /dev/null @@ -1,64 +0,0 @@ -package gui - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestGuiGenerateMenuCandidates(t *testing.T) { - type scenario struct { - testName string - cmdOut string - filter string - valueFormat string - labelFormat string - test func([]commandMenuEntry, error) - } - - scenarios := []scenario{ - { - "Extract remote branch name", - "upstream/pr-1", - "(?P[a-z_]+)/(?P.*)", - "{{ .branch }}", - "Remote: {{ .remote }}", - func(actualEntry []commandMenuEntry, err error) { - assert.NoError(t, err) - assert.EqualValues(t, "pr-1", actualEntry[0].value) - assert.EqualValues(t, "Remote: upstream", actualEntry[0].label) - }, - }, - { - "Multiple named groups with empty labelFormat", - "upstream/pr-1", - "(?P[a-z]*)/(?P.*)", - "{{ .branch }}|{{ .remote }}", - "", - func(actualEntry []commandMenuEntry, err error) { - assert.NoError(t, err) - assert.EqualValues(t, "pr-1|upstream", actualEntry[0].value) - assert.EqualValues(t, "pr-1|upstream", actualEntry[0].label) - }, - }, - { - "Multiple named groups with group ids", - "upstream/pr-1", - "(?P[a-z]*)/(?P.*)", - "{{ .group_2 }}|{{ .group_1 }}", - "Remote: {{ .group_1 }}", - func(actualEntry []commandMenuEntry, err error) { - assert.NoError(t, err) - assert.EqualValues(t, "pr-1|upstream", actualEntry[0].value) - assert.EqualValues(t, "Remote: upstream", actualEntry[0].label) - }, - }, - } - - for _, s := range scenarios { - s := s - t.Run(s.testName, func(t *testing.T) { - s.test(NewDummyGui().GenerateMenuCandidates(s.cmdOut, s.filter, s.valueFormat, s.labelFormat)) - }) - } -} diff --git a/pkg/gui/custom_patch_options_panel.go b/pkg/gui/custom_patch_options_panel.go new file mode 100644 index 000000000..a508c7b44 --- /dev/null +++ b/pkg/gui/custom_patch_options_panel.go @@ -0,0 +1,194 @@ +package gui + +import ( + "fmt" + + "github.com/jesseduffield/lazygit/pkg/commands/types/enums" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +func (gui *Gui) handleCreatePatchOptionsMenu() error { + if !gui.git.Patch.PatchManager.Active() { + return gui.c.ErrorMsg(gui.c.Tr.NoPatchError) + } + + menuItems := []*types.MenuItem{ + { + Label: "reset patch", + OnPress: gui.helpers.PatchBuilding.Reset, + Key: 'c', + }, + { + Label: "apply patch", + OnPress: func() error { return gui.handleApplyPatch(false) }, + Key: 'a', + }, + { + Label: "apply patch in reverse", + OnPress: func() error { return gui.handleApplyPatch(true) }, + Key: 'r', + }, + } + + if gui.git.Patch.PatchManager.CanRebase && gui.git.Status.WorkingTreeState() == enums.REBASE_MODE_NONE { + menuItems = append(menuItems, []*types.MenuItem{ + { + Label: fmt.Sprintf("remove patch from original commit (%s)", gui.git.Patch.PatchManager.To), + OnPress: gui.handleDeletePatchFromCommit, + Key: 'd', + }, + { + Label: "move patch out into index", + OnPress: gui.handleMovePatchIntoWorkingTree, + Key: 'i', + }, + { + Label: "move patch into new commit", + OnPress: gui.handlePullPatchIntoNewCommit, + Key: 'n', + }, + }...) + + if gui.currentContext().GetKey() == gui.State.Contexts.LocalCommits.GetKey() { + selectedCommit := gui.getSelectedLocalCommit() + if selectedCommit != nil && gui.git.Patch.PatchManager.To != selectedCommit.Sha { + // adding this option to index 1 + menuItems = append( + menuItems[:1], + append( + []*types.MenuItem{ + { + Label: fmt.Sprintf("move patch to selected commit (%s)", selectedCommit.Sha), + OnPress: gui.handleMovePatchToSelectedCommit, + Key: 'm', + }, + }, menuItems[1:]..., + )..., + ) + } + } + } + + return gui.c.Menu(types.CreateMenuOptions{Title: gui.c.Tr.PatchOptionsTitle, Items: menuItems}) +} + +func (gui *Gui) getPatchCommitIndex() int { + for index, commit := range gui.State.Model.Commits { + if commit.Sha == gui.git.Patch.PatchManager.To { + return index + } + } + return -1 +} + +func (gui *Gui) validateNormalWorkingTreeState() (bool, error) { + if gui.git.Status.WorkingTreeState() != enums.REBASE_MODE_NONE { + return false, gui.c.ErrorMsg(gui.c.Tr.CantPatchWhileRebasingError) + } + return true, nil +} + +func (gui *Gui) returnFocusFromPatchExplorerIfNecessary() error { + if gui.currentContext().GetKey() == gui.State.Contexts.CustomPatchBuilder.GetKey() { + return gui.helpers.PatchBuilding.Escape() + } + return nil +} + +func (gui *Gui) handleDeletePatchFromCommit() error { + if ok, err := gui.validateNormalWorkingTreeState(); !ok { + return err + } + + if err := gui.returnFocusFromPatchExplorerIfNecessary(); err != nil { + return err + } + + return gui.c.WithWaitingStatus(gui.c.Tr.RebasingStatus, func() error { + commitIndex := gui.getPatchCommitIndex() + gui.c.LogAction(gui.c.Tr.Actions.RemovePatchFromCommit) + err := gui.git.Patch.DeletePatchesFromCommit(gui.State.Model.Commits, commitIndex) + return gui.helpers.MergeAndRebase.CheckMergeOrRebase(err) + }) +} + +func (gui *Gui) handleMovePatchToSelectedCommit() error { + if ok, err := gui.validateNormalWorkingTreeState(); !ok { + return err + } + + if err := gui.returnFocusFromPatchExplorerIfNecessary(); err != nil { + return err + } + + return gui.c.WithWaitingStatus(gui.c.Tr.RebasingStatus, func() error { + commitIndex := gui.getPatchCommitIndex() + gui.c.LogAction(gui.c.Tr.Actions.MovePatchToSelectedCommit) + err := gui.git.Patch.MovePatchToSelectedCommit(gui.State.Model.Commits, commitIndex, gui.State.Contexts.LocalCommits.GetSelectedLineIdx()) + return gui.helpers.MergeAndRebase.CheckMergeOrRebase(err) + }) +} + +func (gui *Gui) handleMovePatchIntoWorkingTree() error { + if ok, err := gui.validateNormalWorkingTreeState(); !ok { + return err + } + + if err := gui.returnFocusFromPatchExplorerIfNecessary(); err != nil { + return err + } + + pull := func(stash bool) error { + return gui.c.WithWaitingStatus(gui.c.Tr.RebasingStatus, func() error { + commitIndex := gui.getPatchCommitIndex() + gui.c.LogAction(gui.c.Tr.Actions.MovePatchIntoIndex) + err := gui.git.Patch.MovePatchIntoIndex(gui.State.Model.Commits, commitIndex, stash) + return gui.helpers.MergeAndRebase.CheckMergeOrRebase(err) + }) + } + + if gui.helpers.WorkingTree.IsWorkingTreeDirty() { + return gui.c.Confirm(types.ConfirmOpts{ + Title: gui.c.Tr.MustStashTitle, + Prompt: gui.c.Tr.MustStashWarning, + HandleConfirm: func() error { + return pull(true) + }, + }) + } else { + return pull(false) + } +} + +func (gui *Gui) handlePullPatchIntoNewCommit() error { + if ok, err := gui.validateNormalWorkingTreeState(); !ok { + return err + } + + if err := gui.returnFocusFromPatchExplorerIfNecessary(); err != nil { + return err + } + + return gui.c.WithWaitingStatus(gui.c.Tr.RebasingStatus, func() error { + commitIndex := gui.getPatchCommitIndex() + gui.c.LogAction(gui.c.Tr.Actions.MovePatchIntoNewCommit) + err := gui.git.Patch.PullPatchIntoNewCommit(gui.State.Model.Commits, commitIndex) + return gui.helpers.MergeAndRebase.CheckMergeOrRebase(err) + }) +} + +func (gui *Gui) handleApplyPatch(reverse bool) error { + if err := gui.returnFocusFromPatchExplorerIfNecessary(); err != nil { + return err + } + + action := gui.c.Tr.Actions.ApplyPatch + if reverse { + action = "Apply patch in reverse" + } + gui.c.LogAction(action) + if err := gui.git.Patch.PatchManager.ApplyPatches(reverse); err != nil { + return gui.c.Error(err) + } + return gui.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}) +} diff --git a/pkg/gui/diff_context_size.go b/pkg/gui/diff_context_size.go deleted file mode 100644 index 3b6f6b0a9..000000000 --- a/pkg/gui/diff_context_size.go +++ /dev/null @@ -1,75 +0,0 @@ -package gui - -import ( - "errors" -) - -var CONTEXT_KEYS_SHOWING_DIFFS = []ContextKey{ - FILES_CONTEXT_KEY, - COMMIT_FILES_CONTEXT_KEY, - STASH_CONTEXT_KEY, - BRANCH_COMMITS_CONTEXT_KEY, - SUB_COMMITS_CONTEXT_KEY, - MAIN_STAGING_CONTEXT_KEY, - MAIN_PATCH_BUILDING_CONTEXT_KEY, -} - -func isShowingDiff(gui *Gui) bool { - key := gui.currentStaticContext().GetKey() - - for _, contextKey := range CONTEXT_KEYS_SHOWING_DIFFS { - if key == contextKey { - return true - } - } - return false -} - -func (gui *Gui) IncreaseContextInDiffView() error { - if isShowingDiff(gui) { - if err := gui.CheckCanChangeContext(); err != nil { - return gui.surfaceError(err) - } - - gui.UserConfig.Git.DiffContextSize = gui.UserConfig.Git.DiffContextSize + 1 - return gui.handleDiffContextSizeChange() - } - - return nil -} - -func (gui *Gui) DecreaseContextInDiffView() error { - old_size := gui.UserConfig.Git.DiffContextSize - - if isShowingDiff(gui) && old_size > 1 { - if err := gui.CheckCanChangeContext(); err != nil { - return gui.surfaceError(err) - } - - gui.UserConfig.Git.DiffContextSize = old_size - 1 - return gui.handleDiffContextSizeChange() - } - - return nil -} - -func (gui *Gui) handleDiffContextSizeChange() error { - currentContext := gui.currentStaticContext() - switch currentContext.GetKey() { - // we make an exception for our staging and patch building contexts because they actually need to refresh their state afterwards. - case MAIN_PATCH_BUILDING_CONTEXT_KEY: - return gui.handleRefreshPatchBuildingPanel(-1) - case MAIN_STAGING_CONTEXT_KEY: - return gui.handleRefreshStagingPanel(false, -1) - default: - return currentContext.HandleRenderToMain() - } -} - -func (gui *Gui) CheckCanChangeContext() error { - if gui.Git.Patch.PatchManager.Active() { - return errors.New(gui.Tr.CantChangeContextSizeError) - } - - return nil -} diff --git a/pkg/gui/diff_context_size_test.go b/pkg/gui/diff_context_size_test.go index b459e40d0..62a784380 100644 --- a/pkg/gui/diff_context_size_test.go +++ b/pkg/gui/diff_context_size_test.go @@ -1,190 +1,182 @@ package gui -import ( - "testing" +// const diffForTest = `diff --git a/pkg/gui/diff_context_size.go b/pkg/gui/diff_context_size.go +// index 0da0a982..742b7dcf 100644 +// --- a/pkg/gui/diff_context_size.go +// +++ b/pkg/gui/diff_context_size.go +// @@ -9,12 +9,12 @@ func getRefreshFunction(gui *Gui) func()error { +// } +// } else if key == context.MAIN_STAGING_CONTEXT_KEY { +// return func() error { +// - selectedLine := gui.Views.Secondary.SelectedLineIdx() +// + selectedLine := gui.State.Panels.LineByLine.GetSelectedLineIdx() +// return gui.handleRefreshStagingPanel(false, selectedLine) +// } +// } else if key == context.MAIN_PATCH_BUILDING_CONTEXT_KEY { +// ` - "github.com/jesseduffield/gocui" - "github.com/jesseduffield/lazygit/pkg/commands/patch" - "github.com/stretchr/testify/assert" -) +// func setupGuiForTest(gui *Gui) { +// gui.g = &gocui.Gui{} +// gui.Views.Main, _ = gui.prepareView("main") +// gui.Views.Secondary, _ = gui.prepareView("secondary") +// gui.Views.Options, _ = gui.prepareView("options") +// gui.git.Patch.PatchManager = &patch.PatchManager{} +// _, _ = gui.refreshLineByLinePanel(diffForTest, "", false, 11) +// } -const diffForTest = `diff --git a/pkg/gui/diff_context_size.go b/pkg/gui/diff_context_size.go -index 0da0a982..742b7dcf 100644 ---- a/pkg/gui/diff_context_size.go -+++ b/pkg/gui/diff_context_size.go -@@ -9,12 +9,12 @@ func getRefreshFunction(gui *Gui) func()error { - } - } else if key == MAIN_STAGING_CONTEXT_KEY { - return func() error { -- selectedLine := gui.Views.Secondary.SelectedLineIdx() -+ selectedLine := gui.State.Panels.LineByLine.GetSelectedLineIdx() - return gui.handleRefreshStagingPanel(false, selectedLine) - } - } else if key == MAIN_PATCH_BUILDING_CONTEXT_KEY { -` +// func TestIncreasesContextInDiffViewByOneInContextWithDiff(t *testing.T) { +// contexts := []func(gui *Gui) types.Context{ +// func(gui *Gui) types.Context { return gui.State.Contexts.Files }, +// func(gui *Gui) types.Context { return gui.State.Contexts.BranchCommits }, +// func(gui *Gui) types.Context { return gui.State.Contexts.CommitFiles }, +// func(gui *Gui) types.Context { return gui.State.Contexts.Stash }, +// func(gui *Gui) types.Context { return gui.State.Contexts.Staging }, +// func(gui *Gui) types.Context { return gui.State.Contexts.PatchBuilding }, +// func(gui *Gui) types.Context { return gui.State.Contexts.SubCommits }, +// } -func setupGuiForTest(gui *Gui) { - gui.g = &gocui.Gui{} - gui.Views.Main, _ = gui.prepareView("main") - gui.Views.Secondary, _ = gui.prepareView("secondary") - gui.Views.Options, _ = gui.prepareView("options") - gui.Git.Patch.PatchManager = &patch.PatchManager{} - _, _ = gui.refreshLineByLinePanel(diffForTest, "", false, 11) -} +// for _, c := range contexts { +// gui := NewDummyGui() +// context := c(gui) +// setupGuiForTest(gui) +// gui.c.UserConfig.Git.DiffContextSize = 1 +// _ = gui.c.PushContext(context) -func TestIncreasesContextInDiffViewByOneInContextWithDiff(t *testing.T) { - contexts := []func(gui *Gui) Context{ - func(gui *Gui) Context { return gui.State.Contexts.Files }, - func(gui *Gui) Context { return gui.State.Contexts.BranchCommits }, - func(gui *Gui) Context { return gui.State.Contexts.CommitFiles }, - func(gui *Gui) Context { return gui.State.Contexts.Stash }, - func(gui *Gui) Context { return gui.State.Contexts.Staging }, - func(gui *Gui) Context { return gui.State.Contexts.PatchBuilding }, - func(gui *Gui) Context { return gui.State.Contexts.SubCommits }, - } +// _ = gui.IncreaseContextInDiffView() - for _, c := range contexts { - gui := NewDummyGui() - context := c(gui) - setupGuiForTest(gui) - gui.UserConfig.Git.DiffContextSize = 1 - _ = gui.pushContext(context) +// assert.Equal(t, 2, gui.c.UserConfig.Git.DiffContextSize, string(context.GetKey())) +// } +// } - _ = gui.IncreaseContextInDiffView() +// func TestDoesntIncreaseContextInDiffViewInContextWithoutDiff(t *testing.T) { +// contexts := []func(gui *Gui) types.Context{ +// func(gui *Gui) types.Context { return gui.State.Contexts.Status }, +// func(gui *Gui) types.Context { return gui.State.Contexts.Submodules }, +// func(gui *Gui) types.Context { return gui.State.Contexts.Remotes }, +// func(gui *Gui) types.Context { return gui.State.Contexts.Normal }, +// func(gui *Gui) types.Context { return gui.State.Contexts.ReflogCommits }, +// func(gui *Gui) types.Context { return gui.State.Contexts.RemoteBranches }, +// func(gui *Gui) types.Context { return gui.State.Contexts.Tags }, +// // not testing this because it will kick straight back to the files context +// // upon pushing the context +// // func(gui *Gui) types.Context { return gui.State.Contexts.Merging }, +// func(gui *Gui) types.Context { return gui.State.Contexts.CommandLog }, +// } - assert.Equal(t, 2, gui.UserConfig.Git.DiffContextSize, string(context.GetKey())) - } -} +// for _, c := range contexts { +// gui := NewDummyGui() +// context := c(gui) +// setupGuiForTest(gui) +// gui.c.UserConfig.Git.DiffContextSize = 1 +// _ = gui.c.PushContext(context) -func TestDoesntIncreaseContextInDiffViewInContextWithoutDiff(t *testing.T) { - contexts := []func(gui *Gui) Context{ - func(gui *Gui) Context { return gui.State.Contexts.Status }, - func(gui *Gui) Context { return gui.State.Contexts.Submodules }, - func(gui *Gui) Context { return gui.State.Contexts.Remotes }, - func(gui *Gui) Context { return gui.State.Contexts.Normal }, - func(gui *Gui) Context { return gui.State.Contexts.ReflogCommits }, - func(gui *Gui) Context { return gui.State.Contexts.RemoteBranches }, - func(gui *Gui) Context { return gui.State.Contexts.Tags }, - // not testing this because it will kick straight back to the files context - // upon pushing the context - // func(gui *Gui) Context { return gui.State.Contexts.Merging }, - func(gui *Gui) Context { return gui.State.Contexts.CommandLog }, - } +// _ = gui.IncreaseContextInDiffView() - for _, c := range contexts { - gui := NewDummyGui() - context := c(gui) - setupGuiForTest(gui) - gui.UserConfig.Git.DiffContextSize = 1 - _ = gui.pushContext(context) +// assert.Equal(t, 1, gui.c.UserConfig.Git.DiffContextSize, string(context.GetKey())) +// } +// } - _ = gui.IncreaseContextInDiffView() +// func TestDecreasesContextInDiffViewByOneInContextWithDiff(t *testing.T) { +// contexts := []func(gui *Gui) types.Context{ +// func(gui *Gui) types.Context { return gui.State.Contexts.Files }, +// func(gui *Gui) types.Context { return gui.State.Contexts.BranchCommits }, +// func(gui *Gui) types.Context { return gui.State.Contexts.CommitFiles }, +// func(gui *Gui) types.Context { return gui.State.Contexts.Stash }, +// func(gui *Gui) types.Context { return gui.State.Contexts.Staging }, +// func(gui *Gui) types.Context { return gui.State.Contexts.PatchBuilding }, +// func(gui *Gui) types.Context { return gui.State.Contexts.SubCommits }, +// } - assert.Equal(t, 1, gui.UserConfig.Git.DiffContextSize, string(context.GetKey())) - } -} +// for _, c := range contexts { +// gui := NewDummyGui() +// context := c(gui) +// setupGuiForTest(gui) +// gui.c.UserConfig.Git.DiffContextSize = 2 +// _ = gui.c.PushContext(context) -func TestDecreasesContextInDiffViewByOneInContextWithDiff(t *testing.T) { - contexts := []func(gui *Gui) Context{ - func(gui *Gui) Context { return gui.State.Contexts.Files }, - func(gui *Gui) Context { return gui.State.Contexts.BranchCommits }, - func(gui *Gui) Context { return gui.State.Contexts.CommitFiles }, - func(gui *Gui) Context { return gui.State.Contexts.Stash }, - func(gui *Gui) Context { return gui.State.Contexts.Staging }, - func(gui *Gui) Context { return gui.State.Contexts.PatchBuilding }, - func(gui *Gui) Context { return gui.State.Contexts.SubCommits }, - } +// _ = gui.DecreaseContextInDiffView() - for _, c := range contexts { - gui := NewDummyGui() - context := c(gui) - setupGuiForTest(gui) - gui.UserConfig.Git.DiffContextSize = 2 - _ = gui.pushContext(context) +// assert.Equal(t, 1, gui.c.UserConfig.Git.DiffContextSize, string(context.GetKey())) +// } +// } - _ = gui.DecreaseContextInDiffView() +// func TestDoesntDecreaseContextInDiffViewInContextWithoutDiff(t *testing.T) { +// contexts := []func(gui *Gui) types.Context{ +// func(gui *Gui) types.Context { return gui.State.Contexts.Status }, +// func(gui *Gui) types.Context { return gui.State.Contexts.Submodules }, +// func(gui *Gui) types.Context { return gui.State.Contexts.Remotes }, +// func(gui *Gui) types.Context { return gui.State.Contexts.Normal }, +// func(gui *Gui) types.Context { return gui.State.Contexts.ReflogCommits }, +// func(gui *Gui) types.Context { return gui.State.Contexts.RemoteBranches }, +// func(gui *Gui) types.Context { return gui.State.Contexts.Tags }, +// // not testing this because it will kick straight back to the files context +// // upon pushing the context +// // func(gui *Gui) types.Context { return gui.State.Contexts.Merging }, +// func(gui *Gui) types.Context { return gui.State.Contexts.CommandLog }, +// } - assert.Equal(t, 1, gui.UserConfig.Git.DiffContextSize, string(context.GetKey())) - } -} +// for _, c := range contexts { +// gui := NewDummyGui() +// context := c(gui) +// setupGuiForTest(gui) +// gui.c.UserConfig.Git.DiffContextSize = 2 +// _ = gui.c.PushContext(context) -func TestDoesntDecreaseContextInDiffViewInContextWithoutDiff(t *testing.T) { - contexts := []func(gui *Gui) Context{ - func(gui *Gui) Context { return gui.State.Contexts.Status }, - func(gui *Gui) Context { return gui.State.Contexts.Submodules }, - func(gui *Gui) Context { return gui.State.Contexts.Remotes }, - func(gui *Gui) Context { return gui.State.Contexts.Normal }, - func(gui *Gui) Context { return gui.State.Contexts.ReflogCommits }, - func(gui *Gui) Context { return gui.State.Contexts.RemoteBranches }, - func(gui *Gui) Context { return gui.State.Contexts.Tags }, - // not testing this because it will kick straight back to the files context - // upon pushing the context - // func(gui *Gui) Context { return gui.State.Contexts.Merging }, - func(gui *Gui) Context { return gui.State.Contexts.CommandLog }, - } +// _ = gui.DecreaseContextInDiffView() - for _, c := range contexts { - gui := NewDummyGui() - context := c(gui) - setupGuiForTest(gui) - gui.UserConfig.Git.DiffContextSize = 2 - _ = gui.pushContext(context) +// assert.Equal(t, 2, gui.c.UserConfig.Git.DiffContextSize, string(context.GetKey())) +// } +// } - _ = gui.DecreaseContextInDiffView() +// func TestDoesntIncreaseContextInDiffViewInContextWhenInPatchBuildingMode(t *testing.T) { +// gui := NewDummyGui() +// setupGuiForTest(gui) +// gui.c.UserConfig.Git.DiffContextSize = 2 +// _ = gui.c.PushContext(gui.State.Contexts.CommitFiles) +// gui.git.Patch.PatchManager.Start("from", "to", false, false) - assert.Equal(t, 2, gui.UserConfig.Git.DiffContextSize, string(context.GetKey())) - } -} +// errorCount := 0 +// gui.PopupHandler = &popup.TestPopupHandler{ +// OnErrorMsg: func(message string) error { +// assert.Equal(t, gui.c.Tr.CantChangeContextSizeError, message) +// errorCount += 1 +// return nil +// }, +// } -func TestDoesntIncreaseContextInDiffViewInContextWhenInPatchBuildingMode(t *testing.T) { - gui := NewDummyGui() - setupGuiForTest(gui) - gui.UserConfig.Git.DiffContextSize = 2 - _ = gui.pushContext(gui.State.Contexts.CommitFiles) - gui.Git.Patch.PatchManager.Start("from", "to", false, false) +// _ = gui.IncreaseContextInDiffView() - errorCount := 0 - gui.PopupHandler = &TestPopupHandler{ - onError: func(message string) error { - assert.Equal(t, gui.Tr.CantChangeContextSizeError, message) - errorCount += 1 - return nil - }, - } +// assert.Equal(t, 1, errorCount) +// assert.Equal(t, 2, gui.c.UserConfig.Git.DiffContextSize) +// } - _ = gui.IncreaseContextInDiffView() +// func TestDoesntDecreaseContextInDiffViewInContextWhenInPatchBuildingMode(t *testing.T) { +// gui := NewDummyGui() +// setupGuiForTest(gui) +// gui.c.UserConfig.Git.DiffContextSize = 2 +// _ = gui.c.PushContext(gui.State.Contexts.CommitFiles) +// gui.git.Patch.PatchManager.Start("from", "to", false, false) - assert.Equal(t, 1, errorCount) - assert.Equal(t, 2, gui.UserConfig.Git.DiffContextSize) -} +// errorCount := 0 +// gui.PopupHandler = &popup.TestPopupHandler{ +// OnErrorMsg: func(message string) error { +// assert.Equal(t, gui.c.Tr.CantChangeContextSizeError, message) +// errorCount += 1 +// return nil +// }, +// } -func TestDoesntDecreaseContextInDiffViewInContextWhenInPatchBuildingMode(t *testing.T) { - gui := NewDummyGui() - setupGuiForTest(gui) - gui.UserConfig.Git.DiffContextSize = 2 - _ = gui.pushContext(gui.State.Contexts.CommitFiles) - gui.Git.Patch.PatchManager.Start("from", "to", false, false) +// _ = gui.DecreaseContextInDiffView() - errorCount := 0 - gui.PopupHandler = &TestPopupHandler{ - onError: func(message string) error { - assert.Equal(t, gui.Tr.CantChangeContextSizeError, message) - errorCount += 1 - return nil - }, - } +// assert.Equal(t, 2, gui.c.UserConfig.Git.DiffContextSize) +// } - _ = gui.DecreaseContextInDiffView() +// func TestDecreasesContextInDiffViewNoFurtherThanOne(t *testing.T) { +// gui := NewDummyGui() +// setupGuiForTest(gui) +// gui.c.UserConfig.Git.DiffContextSize = 1 - assert.Equal(t, 2, gui.UserConfig.Git.DiffContextSize) -} +// _ = gui.DecreaseContextInDiffView() -func TestDecreasesContextInDiffViewNoFurtherThanOne(t *testing.T) { - gui := NewDummyGui() - setupGuiForTest(gui) - gui.UserConfig.Git.DiffContextSize = 1 - - _ = gui.DecreaseContextInDiffView() - - assert.Equal(t, 1, gui.UserConfig.Git.DiffContextSize) -} +// assert.Equal(t, 1, gui.c.UserConfig.Git.DiffContextSize) +// } diff --git a/pkg/gui/diffing.go b/pkg/gui/diffing.go index 2721a1880..f5fbde2a2 100644 --- a/pkg/gui/diffing.go +++ b/pkg/gui/diffing.go @@ -4,24 +4,27 @@ import ( "fmt" "strings" + "github.com/jesseduffield/lazygit/pkg/gui/context" "github.com/jesseduffield/lazygit/pkg/gui/modes/diffing" + "github.com/jesseduffield/lazygit/pkg/gui/types" ) func (gui *Gui) exitDiffMode() error { gui.State.Modes.Diffing = diffing.New() - return gui.refreshSidePanels(refreshOptions{mode: ASYNC}) + return gui.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}) } func (gui *Gui) renderDiff() error { - cmdObj := gui.OSCommand.Cmd.New( + cmdObj := gui.os.Cmd.New( fmt.Sprintf("git diff --submodule --no-ext-diff --color %s", gui.diffStr()), ) - task := NewRunPtyTask(cmdObj.GetCmd()) + task := types.NewRunPtyTask(cmdObj.GetCmd()) - return gui.refreshMainViews(refreshMainOpts{ - main: &viewUpdateOpts{ - title: "Diff", - task: task, + return gui.c.RenderToMainViews(types.RefreshMainOpts{ + Pair: gui.c.MainViewPairs().Normal, + Main: &types.ViewUpdateOpts{ + Title: "Diff", + Task: task, }, }) } @@ -31,17 +34,21 @@ func (gui *Gui) renderDiff() error { // which becomes an option when you bring up the diff menu, but when you're just // flicking through branches it will be using the local branch name. func (gui *Gui) currentDiffTerminals() []string { - switch gui.currentContext().GetKey() { - case "": + c := gui.currentSideContext() + + if c.GetKey() == "" { return nil - case FILES_CONTEXT_KEY, SUBMODULES_CONTEXT_KEY: + } + + switch v := c.(type) { + case *context.WorkingTreeContext, *context.SubmodulesContext: // TODO: should we just return nil here? return []string{""} - case COMMIT_FILES_CONTEXT_KEY: - return []string{gui.State.Panels.CommitFiles.refName} - case LOCAL_BRANCHES_CONTEXT_KEY: + case *context.CommitFilesContext: + return []string{v.GetRef().RefName()} + case *context.BranchesContext: // for our local branches we want to include both the branch and its upstream - branch := gui.getSelectedBranch() + branch := gui.State.Contexts.Branches.GetSelected() if branch != nil { names := []string{branch.ID()} if branch.IsTrackingRemote() { @@ -50,17 +57,13 @@ func (gui *Gui) currentDiffTerminals() []string { return names } return nil - default: - context := gui.currentSideListContext() - if context == nil { - return nil - } - item, ok := context.GetSelectedItem() - if !ok { - return nil - } - return []string{item.ID()} + case types.IListContext: + itemId := v.GetSelectedItemId() + + return []string{itemId} } + + return nil } func (gui *Gui) currentDiffTerminal() string { @@ -73,7 +76,7 @@ func (gui *Gui) currentDiffTerminal() string { func (gui *Gui) currentlySelectedFilename() string { switch gui.currentContext().GetKey() { - case FILES_CONTEXT_KEY, COMMIT_FILES_CONTEXT_KEY: + case context.FILES_CONTEXT_KEY, context.COMMIT_FILES_CONTEXT_KEY: return gui.getSideContextSelectedItemId() default: return "" @@ -105,31 +108,31 @@ func (gui *Gui) diffStr() string { func (gui *Gui) handleCreateDiffingMenuPanel() error { names := gui.currentDiffTerminals() - menuItems := []*menuItem{} + menuItems := []*types.MenuItem{} for _, name := range names { name := name - menuItems = append(menuItems, []*menuItem{ + menuItems = append(menuItems, []*types.MenuItem{ { - displayString: fmt.Sprintf("%s %s", gui.Tr.LcDiff, name), - onPress: func() error { + Label: fmt.Sprintf("%s %s", gui.c.Tr.LcDiff, name), + OnPress: func() error { gui.State.Modes.Diffing.Ref = name // can scope this down based on current view but too lazy right now - return gui.refreshSidePanels(refreshOptions{mode: ASYNC}) + return gui.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}) }, }, }...) } - menuItems = append(menuItems, []*menuItem{ + menuItems = append(menuItems, []*types.MenuItem{ { - displayString: gui.Tr.LcEnterRefToDiff, - onPress: func() error { - return gui.prompt(promptOpts{ - title: gui.Tr.LcEnteRefName, - findSuggestionsFunc: gui.getRefsSuggestionsFunc(), - handleConfirm: func(response string) error { + Label: gui.c.Tr.LcEnterRefToDiff, + OnPress: func() error { + return gui.c.Prompt(types.PromptOpts{ + Title: gui.c.Tr.LcEnteRefName, + FindSuggestionsFunc: gui.helpers.Suggestions.GetRefsSuggestionsFunc(), + HandleConfirm: func(response string) error { gui.State.Modes.Diffing.Ref = strings.TrimSpace(response) - return gui.refreshSidePanels(refreshOptions{mode: ASYNC}) + return gui.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}) }, }) }, @@ -137,23 +140,23 @@ func (gui *Gui) handleCreateDiffingMenuPanel() error { }...) if gui.State.Modes.Diffing.Active() { - menuItems = append(menuItems, []*menuItem{ + menuItems = append(menuItems, []*types.MenuItem{ { - displayString: gui.Tr.LcSwapDiff, - onPress: func() error { + Label: gui.c.Tr.LcSwapDiff, + OnPress: func() error { gui.State.Modes.Diffing.Reverse = !gui.State.Modes.Diffing.Reverse - return gui.refreshSidePanels(refreshOptions{mode: ASYNC}) + return gui.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}) }, }, { - displayString: gui.Tr.LcExitDiffMode, - onPress: func() error { + Label: gui.c.Tr.LcExitDiffMode, + OnPress: func() error { gui.State.Modes.Diffing = diffing.New() - return gui.refreshSidePanels(refreshOptions{mode: ASYNC}) + return gui.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}) }, }, }...) } - return gui.createMenu(gui.Tr.DiffingMenuTitle, menuItems, createMenuOptions{showCancel: true}) + return gui.c.Menu(types.CreateMenuOptions{Title: gui.c.Tr.DiffingMenuTitle, Items: menuItems}) } diff --git a/pkg/gui/discard_changes_menu_panel.go b/pkg/gui/discard_changes_menu_panel.go deleted file mode 100644 index 673f057e8..000000000 --- a/pkg/gui/discard_changes_menu_panel.go +++ /dev/null @@ -1,83 +0,0 @@ -package gui - -func (gui *Gui) handleCreateDiscardMenu() error { - node := gui.getSelectedFileNode() - if node == nil { - return nil - } - - var menuItems []*menuItem - if node.File == nil { - menuItems = []*menuItem{ - { - displayString: gui.Tr.LcDiscardAllChanges, - onPress: func() error { - gui.logAction(gui.Tr.Actions.DiscardAllChangesInDirectory) - if err := gui.Git.WorkingTree.DiscardAllDirChanges(node); err != nil { - return gui.surfaceError(err) - } - return gui.refreshSidePanels(refreshOptions{mode: ASYNC, scope: []RefreshableView{FILES}}) - }, - }, - } - - if node.GetHasStagedChanges() && node.GetHasUnstagedChanges() { - menuItems = append(menuItems, &menuItem{ - displayString: gui.Tr.LcDiscardUnstagedChanges, - onPress: func() error { - gui.logAction(gui.Tr.Actions.DiscardUnstagedChangesInDirectory) - if err := gui.Git.WorkingTree.DiscardUnstagedDirChanges(node); err != nil { - return gui.surfaceError(err) - } - - return gui.refreshSidePanels(refreshOptions{mode: ASYNC, scope: []RefreshableView{FILES}}) - }, - }) - } - } else { - file := node.File - - submodules := gui.State.Submodules - if file.IsSubmodule(submodules) { - submodule := file.SubmoduleConfig(submodules) - - menuItems = []*menuItem{ - { - displayString: gui.Tr.LcSubmoduleStashAndReset, - onPress: func() error { - return gui.handleResetSubmodule(submodule) - }, - }, - } - } else { - menuItems = []*menuItem{ - { - displayString: gui.Tr.LcDiscardAllChanges, - onPress: func() error { - gui.logAction(gui.Tr.Actions.DiscardAllChangesInFile) - if err := gui.Git.WorkingTree.DiscardAllFileChanges(file); err != nil { - return gui.surfaceError(err) - } - return gui.refreshSidePanels(refreshOptions{mode: ASYNC, scope: []RefreshableView{FILES}}) - }, - }, - } - - if file.HasStagedChanges && file.HasUnstagedChanges { - menuItems = append(menuItems, &menuItem{ - displayString: gui.Tr.LcDiscardUnstagedChanges, - onPress: func() error { - gui.logAction(gui.Tr.Actions.DiscardAllUnstagedChangesInFile) - if err := gui.Git.WorkingTree.DiscardUnstagedFileChanges(file); err != nil { - return gui.surfaceError(err) - } - - return gui.refreshSidePanels(refreshOptions{mode: ASYNC, scope: []RefreshableView{FILES}}) - }, - }) - } - } - } - - return gui.createMenu(node.GetPath(), menuItems, createMenuOptions{showCancel: true}) -} diff --git a/pkg/gui/dummies.go b/pkg/gui/dummies.go index 587460ccd..52112e122 100644 --- a/pkg/gui/dummies.go +++ b/pkg/gui/dummies.go @@ -17,6 +17,6 @@ func NewDummyUpdater() *updates.Updater { func NewDummyGui() *Gui { newAppConfig := config.NewDummyAppConfig() - dummyGui, _ := NewGui(utils.NewDummyCommon(), newAppConfig, git_config.NewFakeGitConfig(nil), NewDummyUpdater(), "", false) + dummyGui, _ := NewGui(utils.NewDummyCommon(), newAppConfig, git_config.NewFakeGitConfig(nil), NewDummyUpdater(), false, "") return dummyGui } diff --git a/pkg/gui/editors.go b/pkg/gui/editors.go index 054a36094..6f40c6d58 100644 --- a/pkg/gui/editors.go +++ b/pkg/gui/editors.go @@ -4,10 +4,11 @@ import ( "unicode" "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/gui/keybindings" ) func (gui *Gui) handleEditorKeypress(textArea *gocui.TextArea, key gocui.Key, ch rune, mod gocui.Modifier, allowMultiline bool) bool { - newlineKey, ok := gui.getKey(gui.UserConfig.Keybinding.Universal.AppendNewline).(gocui.Key) + newlineKey, ok := keybindings.GetKey(gui.c.UserConfig.Keybinding.Universal.AppendNewline).(gocui.Key) if !ok { newlineKey = gocui.KeyAltEnter } @@ -62,7 +63,7 @@ func (gui *Gui) commitMessageEditor(v *gocui.View, key gocui.Key, ch rune, mod g // considered out of bounds to add a newline, meaning we can avoid unnecessary scrolling. err := gui.resizePopupPanel(v, v.TextArea.GetContent()) if err != nil { - gui.Log.Error(err) + gui.c.Log.Error(err) } v.RenderTextArea() gui.RenderCommitLength() diff --git a/pkg/gui/extras_panel.go b/pkg/gui/extras_panel.go index 7d68bb1ec..c36f12a66 100644 --- a/pkg/gui/extras_panel.go +++ b/pkg/gui/extras_panel.go @@ -3,60 +3,64 @@ package gui import ( "io" + "github.com/jesseduffield/lazygit/pkg/gui/context" "github.com/jesseduffield/lazygit/pkg/gui/style" + "github.com/jesseduffield/lazygit/pkg/gui/types" ) func (gui *Gui) handleCreateExtrasMenuPanel() error { - menuItems := []*menuItem{ - { - displayString: gui.Tr.ToggleShowCommandLog, - onPress: func() error { - currentContext := gui.currentStaticContext() - if gui.ShowExtrasWindow && currentContext.GetKey() == COMMAND_LOG_CONTEXT_KEY { - if err := gui.returnFromContext(); err != nil { - return err + return gui.c.Menu(types.CreateMenuOptions{ + Title: gui.c.Tr.CommandLog, + Items: []*types.MenuItem{ + { + Label: gui.c.Tr.ToggleShowCommandLog, + OnPress: func() error { + currentContext := gui.currentStaticContext() + if gui.ShowExtrasWindow && currentContext.GetKey() == context.COMMAND_LOG_CONTEXT_KEY { + if err := gui.c.PopContext(); err != nil { + return err + } } - } - show := !gui.ShowExtrasWindow - gui.ShowExtrasWindow = show - gui.Config.GetAppState().HideCommandLog = !show - _ = gui.Config.SaveAppState() - return nil + show := !gui.ShowExtrasWindow + gui.ShowExtrasWindow = show + gui.c.GetAppState().HideCommandLog = !show + _ = gui.c.SaveAppState() + return nil + }, + }, + { + Label: gui.c.Tr.FocusCommandLog, + OnPress: gui.handleFocusCommandLog, }, }, - { - displayString: gui.Tr.FocusCommandLog, - onPress: gui.handleFocusCommandLog, - }, - } - - return gui.createMenu(gui.Tr.CommandLog, menuItems, createMenuOptions{showCancel: true}) + }) } func (gui *Gui) handleFocusCommandLog() error { gui.ShowExtrasWindow = true + // TODO: is this necessary? Can't I just call 'return from context'? gui.State.Contexts.CommandLog.SetParentContext(gui.currentSideContext()) - return gui.pushContext(gui.State.Contexts.CommandLog) + return gui.c.PushContext(gui.State.Contexts.CommandLog) } func (gui *Gui) scrollUpExtra() error { gui.Views.Extras.Autoscroll = false - return gui.scrollUpView(gui.Views.Extras) + gui.scrollUpView(gui.Views.Extras) + + return nil } func (gui *Gui) scrollDownExtra() error { gui.Views.Extras.Autoscroll = false - if err := gui.scrollDownView(gui.Views.Extras); err != nil { - return err - } + gui.scrollDownView(gui.Views.Extras) return nil } func (gui *Gui) getCmdWriter() io.Writer { - return &prefixWriter{writer: gui.Views.Extras, prefix: style.FgMagenta.Sprintf("\n\n%s\n", gui.Tr.GitOutput)} + return &prefixWriter{writer: gui.Views.Extras, prefix: style.FgMagenta.Sprintf("\n\n%s\n", gui.c.Tr.GitOutput)} } // Ensures that the first write is preceded by writing a prefix. diff --git a/pkg/gui/file_watching.go b/pkg/gui/file_watching.go index f5749a97d..01a2d0b88 100644 --- a/pkg/gui/file_watching.go +++ b/pkg/gui/file_watching.go @@ -6,6 +6,7 @@ import ( "github.com/fsnotify/fsnotify" "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/types" "github.com/jesseduffield/lazygit/pkg/utils" "github.com/sirupsen/logrus" ) @@ -117,13 +118,13 @@ func (gui *Gui) watchFilesForChanges() { } // only refresh if we're not already if !gui.State.IsRefreshingFiles { - _ = gui.refreshSidePanels(refreshOptions{mode: ASYNC, scope: []RefreshableView{FILES}}) + _ = gui.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.FILES}}) } // watch for errors case err := <-gui.fileWatcher.Watcher.Errors: if err != nil { - gui.Log.Error(err) + gui.c.Log.Error(err) } } } diff --git a/pkg/gui/files_panel.go b/pkg/gui/files_panel.go index fa8cfa79c..128ebfe72 100644 --- a/pkg/gui/files_panel.go +++ b/pkg/gui/files_panel.go @@ -1,29 +1,14 @@ package gui import ( - "fmt" - "regexp" - "strings" - - "github.com/jesseduffield/lazygit/pkg/commands/git_commands" - "github.com/jesseduffield/lazygit/pkg/commands/loaders" + "github.com/jesseduffield/gocui" "github.com/jesseduffield/lazygit/pkg/commands/models" - "github.com/jesseduffield/lazygit/pkg/commands/types/enums" - "github.com/jesseduffield/lazygit/pkg/config" "github.com/jesseduffield/lazygit/pkg/gui/filetree" - "github.com/jesseduffield/lazygit/pkg/gui/mergeconflicts" - "github.com/jesseduffield/lazygit/pkg/utils" + "github.com/jesseduffield/lazygit/pkg/gui/types" ) -// list panel functions - func (gui *Gui) getSelectedFileNode() *filetree.FileNode { - selectedLine := gui.State.Panels.Files.SelectedLineIdx - if selectedLine == -1 { - return nil - } - - return gui.State.FileTreeViewModel.GetItemAtIndex(selectedLine) + return gui.State.Contexts.Files.GetSelected() } func (gui *Gui) getSelectedFile() *models.File { @@ -34,1032 +19,76 @@ func (gui *Gui) getSelectedFile() *models.File { return node.File } -func (gui *Gui) getSelectedPath() string { - node := gui.getSelectedFileNode() - if node == nil { - return "" - } - - return node.GetPath() -} - func (gui *Gui) filesRenderToMain() error { node := gui.getSelectedFileNode() if node == nil { - return gui.refreshMainViews(refreshMainOpts{ - main: &viewUpdateOpts{ - title: "", - task: NewRenderStringTask(gui.Tr.NoChangedFiles), + return gui.c.RenderToMainViews(types.RefreshMainOpts{ + Pair: gui.c.MainViewPairs().Normal, + Main: &types.ViewUpdateOpts{ + Title: gui.c.Tr.DiffTitle, + Task: types.NewRenderStringTask(gui.c.Tr.NoChangedFiles), }, }) } if node.File != nil && node.File.HasInlineMergeConflicts { - ok, err := gui.setConflictsAndRenderWithLock(node.GetPath(), false) - if err != nil { - return err - } - if ok { - return nil - } - } - - gui.resetMergeStateWithLock() - - cmdObj := gui.Git.WorkingTree.WorktreeFileDiffCmdObj(node, false, !node.GetHasUnstagedChanges() && node.GetHasStagedChanges(), gui.State.IgnoreWhitespaceInDiffView) - - refreshOpts := refreshMainOpts{main: &viewUpdateOpts{ - title: gui.Tr.UnstagedChanges, - task: NewRunPtyTask(cmdObj.GetCmd()), - }} - - if node.GetHasUnstagedChanges() { - if node.GetHasStagedChanges() { - cmdObj := gui.Git.WorkingTree.WorktreeFileDiffCmdObj(node, false, true, gui.State.IgnoreWhitespaceInDiffView) - - refreshOpts.secondary = &viewUpdateOpts{ - title: gui.Tr.StagedChanges, - task: NewRunPtyTask(cmdObj.GetCmd()), - } - } - } else { - refreshOpts.main.title = gui.Tr.StagedChanges - } - - return gui.refreshMainViews(refreshOpts) -} - -func (gui *Gui) refreshFilesAndSubmodules() error { - gui.Mutexes.RefreshingFilesMutex.Lock() - gui.State.IsRefreshingFiles = true - defer func() { - gui.State.IsRefreshingFiles = false - gui.Mutexes.RefreshingFilesMutex.Unlock() - }() - - prevSelectedPath := gui.getSelectedPath() - - if err := gui.refreshStateSubmoduleConfigs(); err != nil { - return err - } - - if err := gui.refreshMergeState(); err != nil { - return err - } - - if err := gui.refreshStateFiles(); err != nil { - return err - } - - gui.OnUIThread(func() error { - if err := gui.postRefreshUpdate(gui.State.Contexts.Submodules); err != nil { - gui.Log.Error(err) - } - - if ContextKey(gui.Views.Files.Context) == FILES_CONTEXT_KEY { - // doing this a little custom (as opposed to using gui.postRefreshUpdate) because we handle selecting the file explicitly below - if err := gui.State.Contexts.Files.HandleRender(); err != nil { - return err - } - } - - if gui.currentContext().GetKey() == FILES_CONTEXT_KEY { - currentSelectedPath := gui.getSelectedPath() - alreadySelected := prevSelectedPath != "" && currentSelectedPath == prevSelectedPath - if !alreadySelected { - gui.takeOverMergeConflictScrolling() - } - - gui.Views.Files.FocusPoint(0, gui.State.Panels.Files.SelectedLineIdx) - return gui.filesRenderToMain() - } - - return nil - }) - - return nil -} - -// specific functions - -func (gui *Gui) stagedFiles() []*models.File { - files := gui.State.FileTreeViewModel.GetAllFiles() - result := make([]*models.File, 0) - for _, file := range files { - if file.HasStagedChanges { - result = append(result, file) - } - } - return result -} - -func (gui *Gui) trackedFiles() []*models.File { - files := gui.State.FileTreeViewModel.GetAllFiles() - result := make([]*models.File, 0, len(files)) - for _, file := range files { - if file.Tracked { - result = append(result, file) - } - } - return result -} - -func (gui *Gui) handleEnterFile() error { - return gui.enterFile(OnFocusOpts{ClickedViewName: "", ClickedViewLineIdx: -1}) -} - -func (gui *Gui) enterFile(opts OnFocusOpts) error { - node := gui.getSelectedFileNode() - if node == nil { - return nil - } - - if node.File == nil { - return gui.handleToggleDirCollapsed() - } - - file := node.File - - submoduleConfigs := gui.State.Submodules - if file.IsSubmodule(submoduleConfigs) { - submoduleConfig := file.SubmoduleConfig(submoduleConfigs) - return gui.enterSubmodule(submoduleConfig) - } - - if file.HasInlineMergeConflicts { - return gui.switchToMerge() - } - if file.HasMergeConflicts { - return gui.createErrorPanel(gui.Tr.FileStagingRequirements) - } - - return gui.pushContext(gui.State.Contexts.Staging, opts) -} - -func (gui *Gui) handleFilePress() error { - node := gui.getSelectedFileNode() - if node == nil { - return nil - } - - if node.IsLeaf() { - file := node.File - - if file.HasInlineMergeConflicts { - return gui.switchToMerge() - } - - if file.HasUnstagedChanges { - gui.logAction(gui.Tr.Actions.StageFile) - if err := gui.Git.WorkingTree.StageFile(file.Name); err != nil { - return gui.surfaceError(err) - } - } else { - gui.logAction(gui.Tr.Actions.UnstageFile) - if err := gui.Git.WorkingTree.UnStageFile(file.Names(), file.Tracked); err != nil { - return gui.surfaceError(err) - } - } - } else { - // if any files within have inline merge conflicts we can't stage or unstage, - // or it'll end up with those >>>>>> lines actually staged - if node.GetHasInlineMergeConflicts() { - return gui.createErrorPanel(gui.Tr.ErrStageDirWithInlineMergeConflicts) - } - - if node.GetHasUnstagedChanges() { - gui.logAction(gui.Tr.Actions.StageFile) - if err := gui.Git.WorkingTree.StageFile(node.Path); err != nil { - return gui.surfaceError(err) - } - } else { - // pretty sure it doesn't matter that we're always passing true here - gui.logAction(gui.Tr.Actions.UnstageFile) - if err := gui.Git.WorkingTree.UnStageFile([]string{node.Path}, true); err != nil { - return gui.surfaceError(err) - } - } - } - - if err := gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{FILES}}); err != nil { - return err - } - - return gui.State.Contexts.Files.HandleFocus() -} - -func (gui *Gui) allFilesStaged() bool { - for _, file := range gui.State.FileTreeViewModel.GetAllFiles() { - if file.HasUnstagedChanges { - return false - } - } - return true -} - -func (gui *Gui) onFocusFile() error { - gui.takeOverMergeConflictScrolling() - return nil -} - -func (gui *Gui) handleStageAll() error { - var err error - if gui.allFilesStaged() { - gui.logAction(gui.Tr.Actions.UnstageAllFiles) - err = gui.Git.WorkingTree.UnstageAll() - } else { - gui.logAction(gui.Tr.Actions.StageAllFiles) - err = gui.Git.WorkingTree.StageAll() - } - if err != nil { - _ = gui.surfaceError(err) - } - - if err := gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{FILES}}); err != nil { - return err - } - - return gui.State.Contexts.Files.HandleFocus() -} - -func (gui *Gui) handleIgnoreFile() error { - node := gui.getSelectedFileNode() - if node == nil { - return nil - } - - if node.GetPath() == ".gitignore" { - return gui.createErrorPanel("Cannot ignore .gitignore") - } - - unstageFiles := func() error { - return node.ForEachFile(func(file *models.File) error { - if file.HasStagedChanges { - if err := gui.Git.WorkingTree.UnStageFile(file.Names(), file.Tracked); err != nil { - return err - } - } - - return nil - }) - } - - if node.GetIsTracked() { - return gui.ask(askOpts{ - title: gui.Tr.IgnoreTracked, - prompt: gui.Tr.IgnoreTrackedPrompt, - handleConfirm: func() error { - gui.logAction(gui.Tr.Actions.IgnoreFile) - // not 100% sure if this is necessary but I'll assume it is - if err := unstageFiles(); err != nil { - return err - } - - if err := gui.Git.WorkingTree.RemoveTrackedFiles(node.GetPath()); err != nil { - return err - } - - if err := gui.Git.WorkingTree.Ignore(node.GetPath()); err != nil { - return err - } - return gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{FILES}}) - }, - }) - } - - gui.logAction(gui.Tr.Actions.IgnoreFile) - - if err := unstageFiles(); err != nil { - return err - } - - if err := gui.Git.WorkingTree.Ignore(node.GetPath()); err != nil { - return gui.surfaceError(err) - } - - return gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{FILES}}) -} - -func (gui *Gui) handleWIPCommitPress() error { - skipHookPrefix := gui.UserConfig.Git.SkipHookPrefix - if skipHookPrefix == "" { - return gui.createErrorPanel(gui.Tr.SkipHookPrefixNotConfigured) - } - - textArea := gui.Views.CommitMessage.TextArea - textArea.Clear() - textArea.TypeString(skipHookPrefix) - gui.Views.CommitMessage.RenderTextArea() - - return gui.handleCommitPress() -} - -func (gui *Gui) commitPrefixConfigForRepo() *config.CommitPrefixConfig { - cfg, ok := gui.UserConfig.Git.CommitPrefixes[utils.GetCurrentRepoName()] - if !ok { - return nil - } - - return &cfg -} - -func (gui *Gui) prepareFilesForCommit() error { - noStagedFiles := len(gui.stagedFiles()) == 0 - if noStagedFiles && gui.UserConfig.Gui.SkipNoStagedFilesWarning { - gui.logAction(gui.Tr.Actions.StageAllFiles) - err := gui.Git.WorkingTree.StageAll() + hasConflicts, err := gui.helpers.MergeConflicts.SetMergeState(node.GetPath()) if err != nil { return err } - return gui.refreshFilesAndSubmodules() - } - - return nil -} - -func (gui *Gui) handleCommitPress() error { - if err := gui.prepareFilesForCommit(); err != nil { - return gui.surfaceError(err) - } - - if gui.State.FileTreeViewModel.GetItemsLength() == 0 { - return gui.createErrorPanel(gui.Tr.NoFilesStagedTitle) - } - - if len(gui.stagedFiles()) == 0 { - return gui.promptToStageAllAndRetry(gui.handleCommitPress) - } - - if len(gui.State.failedCommitMessage) > 0 { - gui.Views.CommitMessage.ClearTextArea() - gui.Views.CommitMessage.TextArea.TypeString(gui.State.failedCommitMessage) - gui.Views.CommitMessage.RenderTextArea() - } else { - commitPrefixConfig := gui.commitPrefixConfigForRepo() - if commitPrefixConfig != nil { - prefixPattern := commitPrefixConfig.Pattern - prefixReplace := commitPrefixConfig.Replace - rgx, err := regexp.Compile(prefixPattern) - if err != nil { - return gui.createErrorPanel(fmt.Sprintf("%s: %s", gui.Tr.LcCommitPrefixPatternError, err.Error())) - } - prefix := rgx.ReplaceAllString(gui.getCheckedOutBranch().Name, prefixReplace) - gui.Views.CommitMessage.ClearTextArea() - gui.Views.CommitMessage.TextArea.TypeString(prefix) - gui.Views.CommitMessage.RenderTextArea() + if hasConflicts { + return gui.refreshMergePanel(false) } } - if err := gui.pushContext(gui.State.Contexts.CommitMessage); err != nil { - return err + gui.helpers.MergeConflicts.ResetMergeState() + + pair := gui.c.MainViewPairs().Normal + if node.File != nil { + pair = gui.c.MainViewPairs().Staging } - gui.RenderCommitLength() - return nil -} + split := gui.c.UserConfig.Gui.SplitDiff == "always" || (node.GetHasUnstagedChanges() && node.GetHasStagedChanges()) + mainShowsStaged := !split && node.GetHasStagedChanges() -func (gui *Gui) promptToStageAllAndRetry(retry func() error) error { - return gui.ask(askOpts{ - title: gui.Tr.NoFilesStagedTitle, - prompt: gui.Tr.NoFilesStagedPrompt, - handleConfirm: func() error { - gui.logAction(gui.Tr.Actions.StageAllFiles) - if err := gui.Git.WorkingTree.StageAll(); err != nil { - return gui.surfaceError(err) - } - if err := gui.refreshFilesAndSubmodules(); err != nil { - return gui.surfaceError(err) - } - - return retry() - }, - }) -} - -func (gui *Gui) handleAmendCommitPress() error { - if gui.State.FileTreeViewModel.GetItemsLength() == 0 { - return gui.createErrorPanel(gui.Tr.NoFilesStagedTitle) + cmdObj := gui.git.WorkingTree.WorktreeFileDiffCmdObj(node, false, mainShowsStaged, gui.IgnoreWhitespaceInDiffView) + title := gui.c.Tr.UnstagedChanges + if mainShowsStaged { + title = gui.c.Tr.StagedChanges } - - if len(gui.stagedFiles()) == 0 { - return gui.promptToStageAllAndRetry(gui.handleAmendCommitPress) - } - - if len(gui.State.Commits) == 0 { - return gui.createErrorPanel(gui.Tr.NoCommitToAmend) - } - - return gui.ask(askOpts{ - title: strings.Title(gui.Tr.AmendLastCommit), - prompt: gui.Tr.SureToAmend, - handleConfirm: func() error { - cmdObj := gui.Git.Commit.AmendHeadCmdObj() - gui.logAction(gui.Tr.Actions.AmendCommit) - return gui.withGpgHandling(cmdObj, gui.Tr.AmendingStatus, nil) - }, - }) -} - -// handleCommitEditorPress - handle when the user wants to commit changes via -// their editor rather than via the popup panel -func (gui *Gui) handleCommitEditorPress() error { - if gui.State.FileTreeViewModel.GetItemsLength() == 0 { - return gui.createErrorPanel(gui.Tr.NoFilesStagedTitle) - } - - if len(gui.stagedFiles()) == 0 { - return gui.promptToStageAllAndRetry(gui.handleCommitEditorPress) - } - - gui.logAction(gui.Tr.Actions.Commit) - return gui.runSubprocessWithSuspenseAndRefresh( - gui.Git.Commit.CommitEditorCmdObj(), - ) -} - -func (gui *Gui) handleStatusFilterPressed() error { - menuItems := []*menuItem{ - { - displayString: gui.Tr.FilterStagedFiles, - onPress: func() error { - return gui.setStatusFiltering(filetree.DisplayStaged) - }, - }, - { - displayString: gui.Tr.FilterUnstagedFiles, - onPress: func() error { - return gui.setStatusFiltering(filetree.DisplayUnstaged) - }, - }, - { - displayString: gui.Tr.ResetCommitFilterState, - onPress: func() error { - return gui.setStatusFiltering(filetree.DisplayAll) - }, + refreshOpts := types.RefreshMainOpts{ + Pair: pair, + Main: &types.ViewUpdateOpts{ + Task: types.NewRunPtyTask(cmdObj.GetCmd()), + Title: title, }, } - return gui.createMenu(gui.Tr.FilteringMenuTitle, menuItems, createMenuOptions{showCancel: true}) -} + if split { + cmdObj := gui.git.WorkingTree.WorktreeFileDiffCmdObj(node, false, true, gui.IgnoreWhitespaceInDiffView) -func (gui *Gui) setStatusFiltering(filter filetree.FileTreeDisplayFilter) error { - state := gui.State - state.FileTreeViewModel.SetFilter(filter) - return gui.handleRefreshFiles() -} - -func (gui *Gui) editFile(filename string) error { - return gui.editFileAtLine(filename, 1) -} - -func (gui *Gui) editFileAtLine(filename string, lineNumber int) error { - cmdStr, err := gui.Git.File.GetEditCmdStr(filename, lineNumber) - if err != nil { - return gui.surfaceError(err) - } - - gui.logAction(gui.Tr.Actions.EditFile) - return gui.runSubprocessWithSuspenseAndRefresh( - gui.OSCommand.Cmd.NewShell(cmdStr), - ) -} - -func (gui *Gui) handleFileEdit() error { - node := gui.getSelectedFileNode() - if node == nil { - return nil - } - - if node.File == nil { - return gui.createErrorPanel(gui.Tr.ErrCannotEditDirectory) - } - - return gui.editFile(node.GetPath()) -} - -func (gui *Gui) handleFileOpen() error { - node := gui.getSelectedFileNode() - if node == nil { - return nil - } - - return gui.openFile(node.GetPath()) -} - -func (gui *Gui) handleRefreshFiles() error { - return gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{FILES}}) -} - -func (gui *Gui) refreshStateFiles() error { - state := gui.State - - // keep track of where the cursor is currently and the current file names - // when we refresh, go looking for a matching name - // move the cursor to there. - - selectedNode := gui.getSelectedFileNode() - - prevNodes := gui.State.FileTreeViewModel.GetAllItems() - prevSelectedLineIdx := gui.State.Panels.Files.SelectedLineIdx - - // If git thinks any of our files have inline merge conflicts, but they actually don't, - // we stage them. - // Note that if files with merge conflicts have both arisen and have been resolved - // between refreshes, we won't stage them here. This is super unlikely though, - // and this approach spares us from having to call `git status` twice in a row. - // Although this also means that at startup we won't be staging anything until - // we call git status again. - pathsToStage := []string{} - prevConflictFileCount := 0 - for _, file := range state.FileTreeViewModel.GetAllFiles() { - if file.HasMergeConflicts { - prevConflictFileCount++ + title := gui.c.Tr.StagedChanges + if mainShowsStaged { + title = gui.c.Tr.UnstagedChanges } - if file.HasInlineMergeConflicts { - hasConflicts, err := mergeconflicts.FileHasConflictMarkers(file.Name) - if err != nil { - gui.Log.Error(err) - } else if !hasConflicts { - pathsToStage = append(pathsToStage, file.Name) - } + + refreshOpts.Secondary = &types.ViewUpdateOpts{ + Title: title, + Task: types.NewRunPtyTask(cmdObj.GetCmd()), } } - if len(pathsToStage) > 0 { - gui.logAction(gui.Tr.Actions.StageResolvedFiles) - if err := gui.Git.WorkingTree.StageFiles(pathsToStage); err != nil { - return gui.surfaceError(err) - } - } - - files := gui.Git.Loaders.Files. - GetStatusFiles(loaders.GetStatusFileOptions{}) - - conflictFileCount := 0 - for _, file := range files { - if file.HasMergeConflicts { - conflictFileCount++ - } - } - - if gui.Git.Status.WorkingTreeState() != enums.REBASE_MODE_NONE && conflictFileCount == 0 && prevConflictFileCount > 0 { - gui.OnUIThread(func() error { return gui.promptToContinueRebase() }) - } - - // for when you stage the old file of a rename and the new file is in a collapsed dir - state.FileTreeViewModel.RWMutex.Lock() - for _, file := range files { - if selectedNode != nil && selectedNode.Path != "" && file.PreviousName == selectedNode.Path { - state.FileTreeViewModel.ExpandToPath(file.Name) - } - } - - // only taking over the filter if it hasn't already been set by the user. - // Though this does make it impossible for the user to actually say they want to display all if - // conflicts are currently being shown. Hmm. Worth it I reckon. If we need to add some - // extra state here to see if the user's set the filter themselves we can do that, but - // I'd prefer to maintain as little state as possible. - if conflictFileCount > 0 { - if state.FileTreeViewModel.GetFilter() == filetree.DisplayAll { - state.FileTreeViewModel.SetFilter(filetree.DisplayConflicted) - } - } else if state.FileTreeViewModel.GetFilter() == filetree.DisplayConflicted { - state.FileTreeViewModel.SetFilter(filetree.DisplayAll) - } - - state.FileTreeViewModel.SetFiles(files) - state.FileTreeViewModel.RWMutex.Unlock() - - if err := gui.fileWatcher.addFilesToFileWatcher(files); err != nil { - return err - } - - if selectedNode != nil { - newIdx := gui.findNewSelectedIdx(prevNodes[prevSelectedLineIdx:], state.FileTreeViewModel.GetAllItems()) - if newIdx != -1 && newIdx != prevSelectedLineIdx { - newNode := state.FileTreeViewModel.GetItemAtIndex(newIdx) - // when not in tree mode, we show merge conflict files at the top, so you - // can work through them one by one without having to sift through a large - // set of files. If you have just fixed the merge conflicts of a file, we - // actually don't want to jump to that file's new position, because that - // file will now be ages away amidst the other files without merge - // conflicts: the user in this case would rather work on the next file - // with merge conflicts, which will have moved up to fill the gap left by - // the last file, meaning the cursor doesn't need to move at all. - leaveCursor := !state.FileTreeViewModel.InTreeMode() && newNode != nil && - selectedNode.File != nil && selectedNode.File.HasMergeConflicts && - newNode.File != nil && !newNode.File.HasMergeConflicts - - if !leaveCursor { - state.Panels.Files.SelectedLineIdx = newIdx - } - } - } - - gui.refreshSelectedLine(state.Panels.Files, state.FileTreeViewModel.GetItemsLength()) - return nil + return gui.c.RenderToMainViews(refreshOpts) } -// promptToContinueRebase asks the user if they want to continue the rebase/merge that's in progress -func (gui *Gui) promptToContinueRebase() error { - gui.takeOverMergeConflictScrolling() - - return gui.ask(askOpts{ - title: "continue", - prompt: gui.Tr.ConflictsResolved, - handleConfirm: func() error { - return gui.genericMergeCommand(REBASE_OPTION_CONTINUE) - }, - }) -} - -// Let's try to find our file again and move the cursor to that. -// If we can't find our file, it was probably just removed by the user. In that -// case, we go looking for where the next file has been moved to. Given that the -// user could have removed a whole directory, we continue iterating through the old -// nodes until we find one that exists in the new set of nodes, then move the cursor -// to that. -// prevNodes starts from our previously selected node because we don't need to consider anything above that -func (gui *Gui) findNewSelectedIdx(prevNodes []*filetree.FileNode, currNodes []*filetree.FileNode) int { - getPaths := func(node *filetree.FileNode) []string { - if node == nil { - return nil - } - if node.File != nil && node.File.IsRename() { - return node.File.Names() - } else { - return []string{node.Path} - } - } - - for _, prevNode := range prevNodes { - selectedPaths := getPaths(prevNode) - - for idx, node := range currNodes { - paths := getPaths(node) - - // If you started off with a rename selected, and now it's broken in two, we want you to jump to the new file, not the old file. - // This is because the new should be in the same position as the rename was meaning less cursor jumping - foundOldFileInRename := prevNode.File != nil && prevNode.File.IsRename() && node.Path == prevNode.File.PreviousName - foundNode := utils.StringArraysOverlap(paths, selectedPaths) && !foundOldFileInRename - if foundNode { - return idx - } - } - } - - return -1 -} - -func (gui *Gui) handlePullFiles() error { - if gui.popupPanelFocused() { - return nil - } - - action := gui.Tr.Actions.Pull - - currentBranch := gui.currentBranch() - if currentBranch == nil { - // need to wait for branches to refresh - return nil - } - - // if we have no upstream branch we need to set that first - if !currentBranch.IsTrackingRemote() { - suggestedRemote := getSuggestedRemote(gui.State.Remotes) - - return gui.prompt(promptOpts{ - title: gui.Tr.EnterUpstream, - initialContent: suggestedRemote + " " + currentBranch.Name, - findSuggestionsFunc: gui.getRemoteBranchesSuggestionsFunc(" "), - handleConfirm: func(upstream string) error { - var upstreamBranch, upstreamRemote string - split := strings.Split(upstream, " ") - if len(split) != 2 { - return gui.createErrorPanel(gui.Tr.InvalidUpstream) - } - - upstreamRemote = split[0] - upstreamBranch = split[1] - - if err := gui.Git.Branch.SetCurrentBranchUpstream(upstreamRemote, upstreamBranch); err != nil { - errorMessage := err.Error() - if strings.Contains(errorMessage, "does not exist") { - errorMessage = fmt.Sprintf("upstream branch %s not found.\nIf you expect it to exist, you should fetch (with 'f').\nOtherwise, you should push (with 'shift+P')", upstream) - } - return gui.createErrorPanel(errorMessage) - } - return gui.pullFiles(PullFilesOptions{UpstreamRemote: upstreamRemote, UpstreamBranch: upstreamBranch, action: action}) - }, - }) - } - - return gui.pullFiles(PullFilesOptions{UpstreamRemote: currentBranch.UpstreamRemote, UpstreamBranch: currentBranch.UpstreamBranch, action: action}) -} - -type PullFilesOptions struct { - UpstreamRemote string - UpstreamBranch string - FastForwardOnly bool - action string -} - -func (gui *Gui) pullFiles(opts PullFilesOptions) error { - if err := gui.createLoaderPanel(gui.Tr.PullWait); err != nil { - return err - } - - // TODO: this doesn't look like a good idea. Why the goroutine? - go utils.Safe(func() { _ = gui.pullWithLock(opts) }) - - return nil -} - -func (gui *Gui) pullWithLock(opts PullFilesOptions) error { - gui.Mutexes.FetchMutex.Lock() - defer gui.Mutexes.FetchMutex.Unlock() - - gui.logAction(opts.action) - - err := gui.Git.Sync.Pull( - git_commands.PullOptions{ - RemoteName: opts.UpstreamRemote, - BranchName: opts.UpstreamBranch, - FastForwardOnly: opts.FastForwardOnly, - }, - ) - if err == nil { - _ = gui.closeConfirmationPrompt(false) - } - return gui.handleGenericMergeCommandResult(err) -} - -type pushOpts struct { - force bool - upstreamRemote string - upstreamBranch string - setUpstream bool -} - -func (gui *Gui) push(opts pushOpts) error { - if err := gui.createLoaderPanel(gui.Tr.PushWait); err != nil { - return err - } - go utils.Safe(func() { - gui.logAction(gui.Tr.Actions.Push) - err := gui.Git.Sync.Push(git_commands.PushOpts{ - Force: opts.force, - UpstreamRemote: opts.upstreamRemote, - UpstreamBranch: opts.upstreamBranch, - SetUpstream: opts.setUpstream, - }) - - if err != nil && !opts.force && strings.Contains(err.Error(), "Updates were rejected") { - forcePushDisabled := gui.UserConfig.Git.DisableForcePushing - if forcePushDisabled { - _ = gui.createErrorPanel(gui.Tr.UpdatesRejectedAndForcePushDisabled) - return - } - _ = gui.ask(askOpts{ - title: gui.Tr.ForcePush, - prompt: gui.Tr.ForcePushPrompt, - handleConfirm: func() error { - newOpts := opts - newOpts.force = true - - return gui.push(newOpts) - }, - }) - return - } - gui.handleCredentialsPopup(err) - _ = gui.refreshSidePanels(refreshOptions{mode: ASYNC}) - }) - return nil -} - -func (gui *Gui) pushFiles() error { - if gui.popupPanelFocused() { - return nil - } - - // if we have pullables we'll ask if the user wants to force push - currentBranch := gui.currentBranch() - if currentBranch == nil { - // need to wait for branches to refresh - return nil - } - - if currentBranch.IsTrackingRemote() { - opts := pushOpts{ - force: false, - upstreamRemote: currentBranch.UpstreamRemote, - upstreamBranch: currentBranch.UpstreamBranch, - } - if currentBranch.HasCommitsToPull() { - opts.force = true - return gui.requestToForcePush(opts) - } else { - return gui.push(opts) - } - } else { - suggestedRemote := getSuggestedRemote(gui.State.Remotes) - - if gui.Git.Config.GetPushToCurrent() { - return gui.push(pushOpts{setUpstream: true}) - } else { - return gui.prompt(promptOpts{ - title: gui.Tr.EnterUpstream, - initialContent: suggestedRemote + " " + currentBranch.Name, - findSuggestionsFunc: gui.getRemoteBranchesSuggestionsFunc(" "), - handleConfirm: func(upstream string) error { - var upstreamBranch, upstreamRemote string - split := strings.Split(upstream, " ") - if len(split) == 2 { - upstreamRemote = split[0] - upstreamBranch = split[1] - } else { - upstreamRemote = upstream - upstreamBranch = "" - } - - return gui.push(pushOpts{ - force: false, - upstreamRemote: upstreamRemote, - upstreamBranch: upstreamBranch, - setUpstream: true, - }) - }, - }) - } +func (gui *Gui) getSetTextareaTextFn(getView func() *gocui.View) func(string) { + return func(text string) { + // using a getView function so that we don't need to worry about when the view is created + view := getView() + view.ClearTextArea() + view.TextArea.TypeString(text) + view.RenderTextArea() } } - -func getSuggestedRemote(remotes []*models.Remote) string { - if len(remotes) == 0 { - return "origin" - } - - for _, remote := range remotes { - if remote.Name == "origin" { - return remote.Name - } - } - - return remotes[0].Name -} - -func (gui *Gui) requestToForcePush(opts pushOpts) error { - forcePushDisabled := gui.UserConfig.Git.DisableForcePushing - if forcePushDisabled { - return gui.createErrorPanel(gui.Tr.ForcePushDisabled) - } - - return gui.ask(askOpts{ - title: gui.Tr.ForcePush, - prompt: gui.Tr.ForcePushPrompt, - handleConfirm: func() error { - return gui.push(opts) - }, - }) -} - -func (gui *Gui) switchToMerge() error { - file := gui.getSelectedFile() - if file == nil { - return nil - } - - gui.takeOverMergeConflictScrolling() - - if gui.State.Panels.Merging.GetPath() != file.Name { - hasConflicts, err := gui.setMergeStateWithLock(file.Name) - if err != nil { - return err - } - if !hasConflicts { - return nil - } - } - - return gui.pushContext(gui.State.Contexts.Merging) -} - -func (gui *Gui) openFile(filename string) error { - gui.logAction(gui.Tr.Actions.OpenFile) - if err := gui.OSCommand.OpenFile(filename); err != nil { - return gui.surfaceError(err) - } - return nil -} - -func (gui *Gui) handleCustomCommand() error { - return gui.prompt(promptOpts{ - title: gui.Tr.CustomCommand, - findSuggestionsFunc: gui.getCustomCommandsHistorySuggestionsFunc(), - handleConfirm: func(command string) error { - gui.Config.GetAppState().CustomCommandsHistory = utils.Limit( - utils.Uniq( - append(gui.Config.GetAppState().CustomCommandsHistory, command), - ), - 1000, - ) - - err := gui.Config.SaveAppState() - if err != nil { - gui.Log.Error(err) - } - - gui.logAction(gui.Tr.Actions.CustomCommand) - return gui.runSubprocessWithSuspenseAndRefresh( - gui.OSCommand.Cmd.NewShell(command), - ) - }, - }) -} - -func (gui *Gui) handleCreateStashMenu() error { - menuItems := []*menuItem{ - { - displayString: gui.Tr.LcStashAllChanges, - onPress: func() error { - gui.logAction(gui.Tr.Actions.StashAllChanges) - return gui.handleStashSave(gui.Git.Stash.Save) - }, - }, - { - displayString: gui.Tr.LcStashStagedChanges, - onPress: func() error { - gui.logAction(gui.Tr.Actions.StashStagedChanges) - return gui.handleStashSave(gui.Git.Stash.SaveStagedChanges) - }, - }, - } - - return gui.createMenu(gui.Tr.LcStashOptions, menuItems, createMenuOptions{showCancel: true}) -} - -func (gui *Gui) handleStashChanges() error { - return gui.handleStashSave(gui.Git.Stash.Save) -} - -func (gui *Gui) handleCreateResetToUpstreamMenu() error { - return gui.createResetMenu("@{upstream}") -} - -func (gui *Gui) handleToggleDirCollapsed() error { - node := gui.getSelectedFileNode() - if node == nil { - return nil - } - - gui.State.FileTreeViewModel.ToggleCollapsed(node.GetPath()) - - if err := gui.postRefreshUpdate(gui.State.Contexts.Files); err != nil { - gui.Log.Error(err) - } - - return nil -} - -func (gui *Gui) handleToggleFileTreeView() error { - // get path of currently selected file - path := gui.getSelectedPath() - - gui.State.FileTreeViewModel.ToggleShowTree() - - // find that same node in the new format and move the cursor to it - if path != "" { - gui.State.FileTreeViewModel.ExpandToPath(path) - index, found := gui.State.FileTreeViewModel.GetIndexForPath(path) - if found { - gui.filesListContext().GetPanelState().SetSelectedLineIdx(index) - } - } - - if ContextKey(gui.Views.Files.Context) == FILES_CONTEXT_KEY { - if err := gui.State.Contexts.Files.HandleRender(); err != nil { - return err - } - if err := gui.State.Contexts.Files.HandleFocus(); err != nil { - return err - } - } - - return nil -} - -func (gui *Gui) handleOpenMergeTool() error { - return gui.ask(askOpts{ - title: gui.Tr.MergeToolTitle, - prompt: gui.Tr.MergeToolPrompt, - handleConfirm: func() error { - gui.logAction(gui.Tr.Actions.OpenMergeTool) - return gui.runSubprocessWithSuspenseAndRefresh( - gui.Git.WorkingTree.OpenMergeToolCmdObj(), - ) - }, - }) -} diff --git a/pkg/gui/files_panel_test.go b/pkg/gui/files_panel_test.go deleted file mode 100644 index 8946898e5..000000000 --- a/pkg/gui/files_panel_test.go +++ /dev/null @@ -1,34 +0,0 @@ -package gui - -import ( - "testing" - - "github.com/jesseduffield/lazygit/pkg/commands/models" - "github.com/stretchr/testify/assert" -) - -func TestGetSuggestedRemote(t *testing.T) { - cases := []struct { - remotes []*models.Remote - expected string - }{ - {mkRemoteList(), "origin"}, - {mkRemoteList("upstream", "origin", "foo"), "origin"}, - {mkRemoteList("upstream", "foo", "bar"), "upstream"}, - } - - for _, c := range cases { - result := getSuggestedRemote(c.remotes) - assert.EqualValues(t, c.expected, result) - } -} - -func mkRemoteList(names ...string) []*models.Remote { - result := make([]*models.Remote, 0, len(names)) - - for _, name := range names { - result = append(result, &models.Remote{Name: name}) - } - - return result -} diff --git a/pkg/gui/filetree/build_tree.go b/pkg/gui/filetree/build_tree.go index 36034d02d..c7c465e28 100644 --- a/pkg/gui/filetree/build_tree.go +++ b/pkg/gui/filetree/build_tree.go @@ -7,10 +7,10 @@ import ( "github.com/jesseduffield/lazygit/pkg/commands/models" ) -func BuildTreeFromFiles(files []*models.File) *FileNode { - root := &FileNode{} +func BuildTreeFromFiles(files []*models.File) *Node[models.File] { + root := &Node[models.File]{} - var curr *FileNode + var curr *Node[models.File] for _, file := range files { splitPath := split(file.Name) curr = root @@ -30,7 +30,7 @@ func BuildTreeFromFiles(files []*models.File) *FileNode { } } - newChild := &FileNode{ + newChild := &Node[models.File]{ Path: path, File: setFile, } @@ -46,17 +46,17 @@ func BuildTreeFromFiles(files []*models.File) *FileNode { return root } -func BuildFlatTreeFromCommitFiles(files []*models.CommitFile) *CommitFileNode { +func BuildFlatTreeFromCommitFiles(files []*models.CommitFile) *Node[models.CommitFile] { rootAux := BuildTreeFromCommitFiles(files) sortedFiles := rootAux.GetLeaves() - return &CommitFileNode{Children: sortedFiles} + return &Node[models.CommitFile]{Children: sortedFiles} } -func BuildTreeFromCommitFiles(files []*models.CommitFile) *CommitFileNode { - root := &CommitFileNode{} +func BuildTreeFromCommitFiles(files []*models.CommitFile) *Node[models.CommitFile] { + root := &Node[models.CommitFile]{} - var curr *CommitFileNode + var curr *Node[models.CommitFile] for _, file := range files { splitPath := split(file.Name) curr = root @@ -77,7 +77,7 @@ func BuildTreeFromCommitFiles(files []*models.CommitFile) *CommitFileNode { } } - newChild := &CommitFileNode{ + newChild := &Node[models.CommitFile]{ Path: path, File: setFile, } @@ -93,7 +93,7 @@ func BuildTreeFromCommitFiles(files []*models.CommitFile) *CommitFileNode { return root } -func BuildFlatTreeFromFiles(files []*models.File) *FileNode { +func BuildFlatTreeFromFiles(files []*models.File) *Node[models.File] { rootAux := BuildTreeFromFiles(files) sortedFiles := rootAux.GetLeaves() @@ -128,7 +128,7 @@ func BuildFlatTreeFromFiles(files []*models.File) *FileNode { return false }) - return &FileNode{Children: sortedFiles} + return &Node[models.File]{Children: sortedFiles} } func split(str string) []string { diff --git a/pkg/gui/filetree/build_tree_test.go b/pkg/gui/filetree/build_tree_test.go index c486ddfa5..ac36be9af 100644 --- a/pkg/gui/filetree/build_tree_test.go +++ b/pkg/gui/filetree/build_tree_test.go @@ -11,14 +11,14 @@ func TestBuildTreeFromFiles(t *testing.T) { scenarios := []struct { name string files []*models.File - expected *FileNode + expected *Node[models.File] }{ { name: "no files", files: []*models.File{}, - expected: &FileNode{ + expected: &Node[models.File]{ Path: "", - Children: []*FileNode{}, + Children: nil, }, }, { @@ -31,12 +31,12 @@ func TestBuildTreeFromFiles(t *testing.T) { Name: "dir1/b", }, }, - expected: &FileNode{ + expected: &Node[models.File]{ Path: "", - Children: []*FileNode{ + Children: []*Node[models.File]{ { Path: "dir1", - Children: []*FileNode{ + Children: []*Node[models.File]{ { File: &models.File{Name: "dir1/a"}, Path: "dir1/a", @@ -60,12 +60,12 @@ func TestBuildTreeFromFiles(t *testing.T) { Name: "dir2/dir4/b", }, }, - expected: &FileNode{ + expected: &Node[models.File]{ Path: "", - Children: []*FileNode{ + Children: []*Node[models.File]{ { Path: "dir1/dir3", - Children: []*FileNode{ + Children: []*Node[models.File]{ { File: &models.File{Name: "dir1/dir3/a"}, Path: "dir1/dir3/a", @@ -75,7 +75,7 @@ func TestBuildTreeFromFiles(t *testing.T) { }, { Path: "dir2/dir4", - Children: []*FileNode{ + Children: []*Node[models.File]{ { File: &models.File{Name: "dir2/dir4/b"}, Path: "dir2/dir4/b", @@ -96,9 +96,9 @@ func TestBuildTreeFromFiles(t *testing.T) { Name: "a", }, }, - expected: &FileNode{ + expected: &Node[models.File]{ Path: "", - Children: []*FileNode{ + Children: []*Node[models.File]{ { File: &models.File{Name: "a"}, Path: "a", @@ -124,11 +124,11 @@ func TestBuildTreeFromFiles(t *testing.T) { Name: "a", }, }, - expected: &FileNode{ + expected: &Node[models.File]{ Path: "", // it is a little strange that we're not bubbling up our merge conflict // here but we are technically still in in tree mode and that's the rule - Children: []*FileNode{ + Children: []*Node[models.File]{ { File: &models.File{Name: "a"}, Path: "a", @@ -159,14 +159,14 @@ func TestBuildFlatTreeFromFiles(t *testing.T) { scenarios := []struct { name string files []*models.File - expected *FileNode + expected *Node[models.File] }{ { name: "no files", files: []*models.File{}, - expected: &FileNode{ + expected: &Node[models.File]{ Path: "", - Children: []*FileNode{}, + Children: []*Node[models.File]{}, }, }, { @@ -179,9 +179,9 @@ func TestBuildFlatTreeFromFiles(t *testing.T) { Name: "dir1/b", }, }, - expected: &FileNode{ + expected: &Node[models.File]{ Path: "", - Children: []*FileNode{ + Children: []*Node[models.File]{ { File: &models.File{Name: "dir1/a"}, Path: "dir1/a", @@ -205,9 +205,9 @@ func TestBuildFlatTreeFromFiles(t *testing.T) { Name: "dir2/b", }, }, - expected: &FileNode{ + expected: &Node[models.File]{ Path: "", - Children: []*FileNode{ + Children: []*Node[models.File]{ { File: &models.File{Name: "dir1/a"}, Path: "dir1/a", @@ -231,9 +231,9 @@ func TestBuildFlatTreeFromFiles(t *testing.T) { Name: "a", }, }, - expected: &FileNode{ + expected: &Node[models.File]{ Path: "", - Children: []*FileNode{ + Children: []*Node[models.File]{ { File: &models.File{Name: "a"}, Path: "a", @@ -273,9 +273,9 @@ func TestBuildFlatTreeFromFiles(t *testing.T) { Tracked: true, }, }, - expected: &FileNode{ + expected: &Node[models.File]{ Path: "", - Children: []*FileNode{ + Children: []*Node[models.File]{ { File: &models.File{Name: "c1", HasMergeConflicts: true}, Path: "c1", @@ -318,14 +318,14 @@ func TestBuildTreeFromCommitFiles(t *testing.T) { scenarios := []struct { name string files []*models.CommitFile - expected *CommitFileNode + expected *Node[models.CommitFile] }{ { name: "no files", files: []*models.CommitFile{}, - expected: &CommitFileNode{ + expected: &Node[models.CommitFile]{ Path: "", - Children: []*CommitFileNode{}, + Children: nil, }, }, { @@ -338,12 +338,12 @@ func TestBuildTreeFromCommitFiles(t *testing.T) { Name: "dir1/b", }, }, - expected: &CommitFileNode{ + expected: &Node[models.CommitFile]{ Path: "", - Children: []*CommitFileNode{ + Children: []*Node[models.CommitFile]{ { Path: "dir1", - Children: []*CommitFileNode{ + Children: []*Node[models.CommitFile]{ { File: &models.CommitFile{Name: "dir1/a"}, Path: "dir1/a", @@ -367,12 +367,12 @@ func TestBuildTreeFromCommitFiles(t *testing.T) { Name: "dir2/dir4/b", }, }, - expected: &CommitFileNode{ + expected: &Node[models.CommitFile]{ Path: "", - Children: []*CommitFileNode{ + Children: []*Node[models.CommitFile]{ { Path: "dir1/dir3", - Children: []*CommitFileNode{ + Children: []*Node[models.CommitFile]{ { File: &models.CommitFile{Name: "dir1/dir3/a"}, Path: "dir1/dir3/a", @@ -382,7 +382,7 @@ func TestBuildTreeFromCommitFiles(t *testing.T) { }, { Path: "dir2/dir4", - Children: []*CommitFileNode{ + Children: []*Node[models.CommitFile]{ { File: &models.CommitFile{Name: "dir2/dir4/b"}, Path: "dir2/dir4/b", @@ -403,9 +403,9 @@ func TestBuildTreeFromCommitFiles(t *testing.T) { Name: "a", }, }, - expected: &CommitFileNode{ + expected: &Node[models.CommitFile]{ Path: "", - Children: []*CommitFileNode{ + Children: []*Node[models.CommitFile]{ { File: &models.CommitFile{Name: "a"}, Path: "a", @@ -432,14 +432,14 @@ func TestBuildFlatTreeFromCommitFiles(t *testing.T) { scenarios := []struct { name string files []*models.CommitFile - expected *CommitFileNode + expected *Node[models.CommitFile] }{ { name: "no files", files: []*models.CommitFile{}, - expected: &CommitFileNode{ + expected: &Node[models.CommitFile]{ Path: "", - Children: []*CommitFileNode{}, + Children: []*Node[models.CommitFile]{}, }, }, { @@ -452,9 +452,9 @@ func TestBuildFlatTreeFromCommitFiles(t *testing.T) { Name: "dir1/b", }, }, - expected: &CommitFileNode{ + expected: &Node[models.CommitFile]{ Path: "", - Children: []*CommitFileNode{ + Children: []*Node[models.CommitFile]{ { File: &models.CommitFile{Name: "dir1/a"}, Path: "dir1/a", @@ -478,9 +478,9 @@ func TestBuildFlatTreeFromCommitFiles(t *testing.T) { Name: "dir2/b", }, }, - expected: &CommitFileNode{ + expected: &Node[models.CommitFile]{ Path: "", - Children: []*CommitFileNode{ + Children: []*Node[models.CommitFile]{ { File: &models.CommitFile{Name: "dir1/a"}, Path: "dir1/a", @@ -504,9 +504,9 @@ func TestBuildFlatTreeFromCommitFiles(t *testing.T) { Name: "a", }, }, - expected: &CommitFileNode{ + expected: &Node[models.CommitFile]{ Path: "", - Children: []*CommitFileNode{ + Children: []*Node[models.CommitFile]{ { File: &models.CommitFile{Name: "a"}, Path: "a", diff --git a/pkg/gui/filetree/collapsed_paths.go b/pkg/gui/filetree/collapsed_paths.go index 02c0b4303..903999b37 100644 --- a/pkg/gui/filetree/collapsed_paths.go +++ b/pkg/gui/filetree/collapsed_paths.go @@ -1,20 +1,38 @@ package filetree -type CollapsedPaths map[string]bool +import "github.com/jesseduffield/generics/set" -func (cp CollapsedPaths) ExpandToPath(path string) { +type CollapsedPaths struct { + collapsedPaths *set.Set[string] +} + +func NewCollapsedPaths() *CollapsedPaths { + return &CollapsedPaths{ + collapsedPaths: set.New[string](), + } +} + +func (self *CollapsedPaths) ExpandToPath(path string) { // need every directory along the way splitPath := split(path) for i := range splitPath { dir := join(splitPath[0 : i+1]) - cp[dir] = false + self.collapsedPaths.Remove(dir) } } -func (cp CollapsedPaths) IsCollapsed(path string) bool { - return cp[path] +func (self *CollapsedPaths) IsCollapsed(path string) bool { + return self.collapsedPaths.Includes(path) } -func (cp CollapsedPaths) ToggleCollapsed(path string) { - cp[path] = !cp[path] +func (self *CollapsedPaths) Collapse(path string) { + self.collapsedPaths.Add(path) +} + +func (self *CollapsedPaths) ToggleCollapsed(path string) { + if self.collapsedPaths.Includes(path) { + self.collapsedPaths.Remove(path) + } else { + self.collapsedPaths.Add(path) + } } diff --git a/pkg/gui/filetree/commit_file_node.go b/pkg/gui/filetree/commit_file_node.go index 14960ee30..be9868daa 100644 --- a/pkg/gui/filetree/commit_file_node.go +++ b/pkg/gui/filetree/commit_file_node.go @@ -1,171 +1,25 @@ package filetree -import ( - "github.com/jesseduffield/lazygit/pkg/commands/models" -) +import "github.com/jesseduffield/lazygit/pkg/commands/models" +// CommitFileNode wraps a node and provides some commit-file-specific methods for it. type CommitFileNode struct { - Children []*CommitFileNode - File *models.CommitFile - Path string // e.g. '/path/to/mydir' - CompressionLevel int // equal to the number of forward slashes you'll see in the path when it's rendered in tree mode + *Node[models.CommitFile] } -var _ INode = &CommitFileNode{} - -// methods satisfying ListItem interface - -func (s *CommitFileNode) ID() string { - return s.GetPath() -} - -func (s *CommitFileNode) Description() string { - return s.GetPath() -} - -// methods satisfying INode interface - -func (s *CommitFileNode) IsNil() bool { - return s == nil -} - -func (s *CommitFileNode) IsLeaf() bool { - return s.File != nil -} - -func (s *CommitFileNode) GetPath() string { - return s.Path -} - -func (s *CommitFileNode) GetChildren() []INode { - result := make([]INode, len(s.Children)) - for i, child := range s.Children { - result[i] = child - } - - return result -} - -func (s *CommitFileNode) SetChildren(children []INode) { - castChildren := make([]*CommitFileNode, len(children)) - for i, child := range children { - castChildren[i] = child.(*CommitFileNode) - } - - s.Children = castChildren -} - -func (s *CommitFileNode) GetCompressionLevel() int { - return s.CompressionLevel -} - -func (s *CommitFileNode) SetCompressionLevel(level int) { - s.CompressionLevel = level -} - -// methods utilising generic functions for INodes - -func (s *CommitFileNode) Sort() { - sortNode(s) -} - -func (s *CommitFileNode) ForEachFile(cb func(*models.CommitFile) error) error { - return forEachLeaf(s, func(n INode) error { - castNode := n.(*CommitFileNode) - return cb(castNode.File) - }) -} - -func (s *CommitFileNode) Any(test func(node *CommitFileNode) bool) bool { - return any(s, func(n INode) bool { - castNode := n.(*CommitFileNode) - return test(castNode) - }) -} - -func (s *CommitFileNode) Every(test func(node *CommitFileNode) bool) bool { - return every(s, func(n INode) bool { - castNode := n.(*CommitFileNode) - return test(castNode) - }) -} - -func (s *CommitFileNode) EveryFile(test func(file *models.CommitFile) bool) bool { - return every(s, func(n INode) bool { - castNode := n.(*CommitFileNode) - - return castNode.File == nil || test(castNode.File) - }) -} - -func (n *CommitFileNode) Flatten(collapsedPaths map[string]bool) []*CommitFileNode { - results := flatten(n, collapsedPaths) - nodes := make([]*CommitFileNode, len(results)) - for i, result := range results { - nodes[i] = result.(*CommitFileNode) - } - - return nodes -} - -func (node *CommitFileNode) GetNodeAtIndex(index int, collapsedPaths map[string]bool) *CommitFileNode { +func NewCommitFileNode(node *Node[models.CommitFile]) *CommitFileNode { if node == nil { return nil } - result := getNodeAtIndex(node, index, collapsedPaths) - if result == nil { - // not sure how this can be nil: we probably are missing a mutex somewhere + return &CommitFileNode{Node: node} +} + +// returns the underlying node, without any commit-file-specific methods attached +func (self *CommitFileNode) Raw() *Node[models.CommitFile] { + if self == nil { return nil } - return result.(*CommitFileNode) -} - -func (node *CommitFileNode) GetIndexForPath(path string, collapsedPaths map[string]bool) (int, bool) { - return getIndexForPath(node, path, collapsedPaths) -} - -func (node *CommitFileNode) Size(collapsedPaths map[string]bool) int { - if node == nil { - return 0 - } - - return size(node, collapsedPaths) -} - -func (s *CommitFileNode) Compress() { - // with these functions I try to only have type conversion code on the actual struct, - // but comparing interface values to nil is fraught with danger so I'm duplicating - // that code here. - if s == nil { - return - } - - compressAux(s) -} - -func (s *CommitFileNode) GetLeaves() []*CommitFileNode { - leaves := getLeaves(s) - castLeaves := make([]*CommitFileNode, len(leaves)) - for i := range leaves { - castLeaves[i] = leaves[i].(*CommitFileNode) - } - - return castLeaves -} - -// extra methods - -func (s *CommitFileNode) AnyFile(test func(file *models.CommitFile) bool) bool { - return s.Any(func(node *CommitFileNode) bool { - return node.IsLeaf() && test(node.File) - }) -} - -func (s *CommitFileNode) NameAtDepth(depth int) string { - splitName := split(s.Path) - name := join(splitName[depth:]) - - return name + return self.Node } diff --git a/pkg/gui/filetree/commit_file_tree.go b/pkg/gui/filetree/commit_file_tree.go new file mode 100644 index 000000000..862db26f1 --- /dev/null +++ b/pkg/gui/filetree/commit_file_tree.go @@ -0,0 +1,112 @@ +package filetree + +import ( + "github.com/jesseduffield/generics/slices" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/sirupsen/logrus" +) + +type ICommitFileTree interface { + ITree[models.CommitFile] + + Get(index int) *CommitFileNode + GetFile(path string) *models.CommitFile + GetAllItems() []*CommitFileNode + GetAllFiles() []*models.CommitFile + GetRoot() *CommitFileNode +} + +type CommitFileTree struct { + getFiles func() []*models.CommitFile + tree *Node[models.CommitFile] + showTree bool + log *logrus.Entry + collapsedPaths *CollapsedPaths +} + +var _ ICommitFileTree = &CommitFileTree{} + +func NewCommitFileTree(getFiles func() []*models.CommitFile, log *logrus.Entry, showTree bool) *CommitFileTree { + return &CommitFileTree{ + getFiles: getFiles, + log: log, + showTree: showTree, + collapsedPaths: NewCollapsedPaths(), + } +} + +func (self *CommitFileTree) ExpandToPath(path string) { + self.collapsedPaths.ExpandToPath(path) +} + +func (self *CommitFileTree) ToggleShowTree() { + self.showTree = !self.showTree + self.SetTree() +} + +func (self *CommitFileTree) Get(index int) *CommitFileNode { + // need to traverse the three depth first until we get to the index. + return NewCommitFileNode(self.tree.GetNodeAtIndex(index+1, self.collapsedPaths)) // ignoring root +} + +func (self *CommitFileTree) GetIndexForPath(path string) (int, bool) { + index, found := self.tree.GetIndexForPath(path, self.collapsedPaths) + return index - 1, found +} + +func (self *CommitFileTree) GetAllItems() []*CommitFileNode { + if self.tree == nil { + return nil + } + + // ignoring root + return slices.Map(self.tree.Flatten(self.collapsedPaths)[1:], func(node *Node[models.CommitFile]) *CommitFileNode { + return NewCommitFileNode(node) + }) +} + +func (self *CommitFileTree) Len() int { + return self.tree.Size(self.collapsedPaths) - 1 // ignoring root +} + +func (self *CommitFileTree) GetAllFiles() []*models.CommitFile { + return self.getFiles() +} + +func (self *CommitFileTree) SetTree() { + if self.showTree { + self.tree = BuildTreeFromCommitFiles(self.getFiles()) + } else { + self.tree = BuildFlatTreeFromCommitFiles(self.getFiles()) + } +} + +func (self *CommitFileTree) IsCollapsed(path string) bool { + return self.collapsedPaths.IsCollapsed(path) +} + +func (self *CommitFileTree) ToggleCollapsed(path string) { + self.collapsedPaths.ToggleCollapsed(path) +} + +func (self *CommitFileTree) GetRoot() *CommitFileNode { + return NewCommitFileNode(self.tree) +} + +func (self *CommitFileTree) CollapsedPaths() *CollapsedPaths { + return self.collapsedPaths +} + +func (self *CommitFileTree) GetFile(path string) *models.CommitFile { + for _, file := range self.getFiles() { + if file.Name == path { + return file + } + } + + return nil +} + +func (self *CommitFileTree) InTreeMode() bool { + return self.showTree +} diff --git a/pkg/gui/filetree/commit_file_tree_view_model.go b/pkg/gui/filetree/commit_file_tree_view_model.go index 301396462..a022bc25e 100644 --- a/pkg/gui/filetree/commit_file_tree_view_model.go +++ b/pkg/gui/filetree/commit_file_tree_view_model.go @@ -1,101 +1,111 @@ package filetree import ( + "sync" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/context/traits" + "github.com/jesseduffield/lazygit/pkg/gui/types" "github.com/sirupsen/logrus" ) +type ICommitFileTreeViewModel interface { + ICommitFileTree + types.IListCursor + + GetRef() types.Ref + SetRef(types.Ref) + GetCanRebase() bool + SetCanRebase(bool) +} + type CommitFileTreeViewModel struct { - files []*models.CommitFile - tree *CommitFileNode - showTree bool - log *logrus.Entry - collapsedPaths CollapsedPaths - // parent is the identifier of the parent object e.g. a commit SHA if this commit file is for a commit, or a stash entry ref like 'stash@{1}' - parent string + sync.RWMutex + ICommitFileTree + types.IListCursor + + // this is e.g. the commit for which we're viewing the files + ref types.Ref + + // we set this to true when you're viewing the files within the checked-out branch's commits. + // If you're viewing the files of some random other branch we can't do any rebase stuff. + canRebase bool } -func (self *CommitFileTreeViewModel) GetParent() string { - return self.parent -} +var _ ICommitFileTreeViewModel = &CommitFileTreeViewModel{} -func (self *CommitFileTreeViewModel) SetParent(parent string) { - self.parent = parent -} - -func NewCommitFileTreeViewModel(files []*models.CommitFile, log *logrus.Entry, showTree bool) *CommitFileTreeViewModel { - viewModel := &CommitFileTreeViewModel{ - log: log, - showTree: showTree, - collapsedPaths: CollapsedPaths{}, +func NewCommitFileTreeViewModel(getFiles func() []*models.CommitFile, log *logrus.Entry, showTree bool) *CommitFileTreeViewModel { + fileTree := NewCommitFileTree(getFiles, log, showTree) + listCursor := traits.NewListCursor(fileTree) + return &CommitFileTreeViewModel{ + ICommitFileTree: fileTree, + IListCursor: listCursor, + ref: nil, + canRebase: false, } - - viewModel.SetFiles(files) - - return viewModel } -func (self *CommitFileTreeViewModel) ExpandToPath(path string) { - self.collapsedPaths.ExpandToPath(path) +func (self *CommitFileTreeViewModel) GetRef() types.Ref { + return self.ref } -func (self *CommitFileTreeViewModel) ToggleShowTree() { - self.showTree = !self.showTree - self.SetTree() +func (self *CommitFileTreeViewModel) SetRef(ref types.Ref) { + self.ref = ref } -func (self *CommitFileTreeViewModel) GetItemAtIndex(index int) *CommitFileNode { - // need to traverse the three depth first until we get to the index. - return self.tree.GetNodeAtIndex(index+1, self.collapsedPaths) // ignoring root +func (self *CommitFileTreeViewModel) GetCanRebase() bool { + return self.canRebase } -func (self *CommitFileTreeViewModel) GetIndexForPath(path string) (int, bool) { - index, found := self.tree.GetIndexForPath(path, self.collapsedPaths) - return index - 1, found +func (self *CommitFileTreeViewModel) SetCanRebase(canRebase bool) { + self.canRebase = canRebase } -func (self *CommitFileTreeViewModel) GetAllItems() []*CommitFileNode { - if self.tree == nil { +func (self *CommitFileTreeViewModel) GetSelected() *CommitFileNode { + if self.Len() == 0 { return nil } - return self.tree.Flatten(self.collapsedPaths)[1:] // ignoring root + return self.Get(self.GetSelectedLineIdx()) } -func (self *CommitFileTreeViewModel) GetItemsLength() int { - return self.tree.Size(self.collapsedPaths) - 1 // ignoring root +func (self *CommitFileTreeViewModel) GetSelectedFile() *models.CommitFile { + node := self.GetSelected() + if node == nil { + return nil + } + + return node.File } -func (self *CommitFileTreeViewModel) GetAllFiles() []*models.CommitFile { - return self.files +func (self *CommitFileTreeViewModel) GetSelectedPath() string { + node := self.GetSelected() + if node == nil { + return "" + } + + return node.GetPath() } -func (self *CommitFileTreeViewModel) SetFiles(files []*models.CommitFile) { - self.files = files +// duplicated from file_tree_view_model.go. Generics will help here +func (self *CommitFileTreeViewModel) ToggleShowTree() { + selectedNode := self.GetSelected() - self.SetTree() -} + self.ICommitFileTree.ToggleShowTree() -func (self *CommitFileTreeViewModel) SetTree() { - if self.showTree { - self.tree = BuildTreeFromCommitFiles(self.files) - } else { - self.tree = BuildFlatTreeFromCommitFiles(self.files) + if selectedNode == nil { + return + } + path := selectedNode.Path + + if self.InTreeMode() { + self.ExpandToPath(path) + } else if len(selectedNode.Children) > 0 { + path = selectedNode.GetLeaves()[0].Path + } + + index, found := self.GetIndexForPath(path) + if found { + self.SetSelectedLineIdx(index) } } - -func (self *CommitFileTreeViewModel) IsCollapsed(path string) bool { - return self.collapsedPaths.IsCollapsed(path) -} - -func (self *CommitFileTreeViewModel) ToggleCollapsed(path string) { - self.collapsedPaths.ToggleCollapsed(path) -} - -func (self *CommitFileTreeViewModel) Tree() INode { - return self.tree -} - -func (self *CommitFileTreeViewModel) CollapsedPaths() CollapsedPaths { - return self.collapsedPaths -} diff --git a/pkg/gui/filetree/file_node.go b/pkg/gui/filetree/file_node.go index f332f0a76..2ff707113 100644 --- a/pkg/gui/filetree/file_node.go +++ b/pkg/gui/filetree/file_node.go @@ -1,198 +1,51 @@ package filetree -import ( - "github.com/jesseduffield/lazygit/pkg/commands/models" -) +import "github.com/jesseduffield/lazygit/pkg/commands/models" +// FileNode wraps a node and provides some file-specific methods for it. type FileNode struct { - Children []*FileNode - File *models.File - Path string // e.g. '/path/to/mydir' - CompressionLevel int // equal to the number of forward slashes you'll see in the path when it's rendered in tree mode + *Node[models.File] } -var _ INode = &FileNode{} +var _ models.IFile = &FileNode{} -// methods satisfying ListItem interface - -func (s *FileNode) ID() string { - return s.GetPath() -} - -func (s *FileNode) Description() string { - return s.GetPath() -} - -// methods satisfying INode interface - -// interfaces values whose concrete value is nil are not themselves nil -// hence the existence of this method -func (s *FileNode) IsNil() bool { - return s == nil -} - -func (s *FileNode) IsLeaf() bool { - return s.File != nil -} - -func (s *FileNode) GetPath() string { - return s.Path -} - -func (s *FileNode) GetChildren() []INode { - result := make([]INode, len(s.Children)) - for i, child := range s.Children { - result[i] = child - } - - return result -} - -func (s *FileNode) SetChildren(children []INode) { - castChildren := make([]*FileNode, len(children)) - for i, child := range children { - castChildren[i] = child.(*FileNode) - } - - s.Children = castChildren -} - -func (s *FileNode) GetCompressionLevel() int { - return s.CompressionLevel -} - -func (s *FileNode) SetCompressionLevel(level int) { - s.CompressionLevel = level -} - -// methods utilising generic functions for INodes - -func (s *FileNode) Sort() { - sortNode(s) -} - -func (s *FileNode) ForEachFile(cb func(*models.File) error) error { - return forEachLeaf(s, func(n INode) error { - castNode := n.(*FileNode) - return cb(castNode.File) - }) -} - -func (s *FileNode) Any(test func(node *FileNode) bool) bool { - return any(s, func(n INode) bool { - castNode := n.(*FileNode) - return test(castNode) - }) -} - -func (n *FileNode) Flatten(collapsedPaths map[string]bool) []*FileNode { - results := flatten(n, collapsedPaths) - nodes := make([]*FileNode, len(results)) - for i, result := range results { - nodes[i] = result.(*FileNode) - } - - return nodes -} - -func (node *FileNode) GetNodeAtIndex(index int, collapsedPaths map[string]bool) *FileNode { +func NewFileNode(node *Node[models.File]) *FileNode { if node == nil { return nil } - result := getNodeAtIndex(node, index, collapsedPaths) - if result == nil { - // not sure how this can be nil: we probably are missing a mutex somewhere + return &FileNode{Node: node} +} + +// returns the underlying node, without any file-specific methods attached +func (self *FileNode) Raw() *Node[models.File] { + if self == nil { return nil } - return result.(*FileNode) + return self.Node } -func (node *FileNode) GetIndexForPath(path string, collapsedPaths map[string]bool) (int, bool) { - return getIndexForPath(node, path, collapsedPaths) +func (self *FileNode) GetHasUnstagedChanges() bool { + return self.SomeFile(func(file *models.File) bool { return file.HasUnstagedChanges }) } -func (node *FileNode) Size(collapsedPaths map[string]bool) int { - if node == nil { - return 0 +func (self *FileNode) GetHasStagedChanges() bool { + return self.SomeFile(func(file *models.File) bool { return file.HasStagedChanges }) +} + +func (self *FileNode) GetHasInlineMergeConflicts() bool { + return self.SomeFile(func(file *models.File) bool { return file.HasInlineMergeConflicts }) +} + +func (self *FileNode) GetIsTracked() bool { + return self.SomeFile(func(file *models.File) bool { return file.Tracked }) +} + +func (self *FileNode) GetPreviousPath() string { + if self.File == nil { + return "" } - return size(node, collapsedPaths) -} - -func (s *FileNode) Compress() { - // with these functions I try to only have type conversion code on the actual struct, - // but comparing interface values to nil is fraught with danger so I'm duplicating - // that code here. - if s == nil { - return - } - - compressAux(s) -} - -func (node *FileNode) GetFilePathsMatching(test func(*models.File) bool) []string { - return getPathsMatching(node, func(n INode) bool { - castNode := n.(*FileNode) - if castNode.File == nil { - return false - } - return test(castNode.File) - }) -} - -func (s *FileNode) GetLeaves() []*FileNode { - leaves := getLeaves(s) - castLeaves := make([]*FileNode, len(leaves)) - for i := range leaves { - castLeaves[i] = leaves[i].(*FileNode) - } - - return castLeaves -} - -// extra methods - -func (s *FileNode) GetHasUnstagedChanges() bool { - return s.AnyFile(func(file *models.File) bool { return file.HasUnstagedChanges }) -} - -func (s *FileNode) GetHasStagedChanges() bool { - return s.AnyFile(func(file *models.File) bool { return file.HasStagedChanges }) -} - -func (s *FileNode) GetHasInlineMergeConflicts() bool { - return s.AnyFile(func(file *models.File) bool { return file.HasInlineMergeConflicts }) -} - -func (s *FileNode) GetIsTracked() bool { - return s.AnyFile(func(file *models.File) bool { return file.Tracked }) -} - -func (s *FileNode) AnyFile(test func(file *models.File) bool) bool { - return s.Any(func(node *FileNode) bool { - return node.IsLeaf() && test(node.File) - }) -} - -func (s *FileNode) NameAtDepth(depth int) string { - splitName := split(s.Path) - name := join(splitName[depth:]) - - if s.File != nil && s.File.IsRename() { - splitPrevName := split(s.File.PreviousName) - - prevName := s.File.PreviousName - // if the file has just been renamed inside the same directory, we can shave off - // the prefix for the previous path too. Otherwise we'll keep it unchanged - sameParentDir := len(splitName) == len(splitPrevName) && join(splitName[0:depth]) == join(splitPrevName[0:depth]) - if sameParentDir { - prevName = join(splitPrevName[depth:]) - } - - return prevName + " → " + name - } - - return name + return self.File.PreviousName } diff --git a/pkg/gui/filetree/file_node_test.go b/pkg/gui/filetree/file_node_test.go index 8961015ac..a3b2b9aee 100644 --- a/pkg/gui/filetree/file_node_test.go +++ b/pkg/gui/filetree/file_node_test.go @@ -10,8 +10,8 @@ import ( func TestCompress(t *testing.T) { scenarios := []struct { name string - root *FileNode - expected *FileNode + root *Node[models.File] + expected *Node[models.File] }{ { name: "nil node", @@ -20,27 +20,27 @@ func TestCompress(t *testing.T) { }, { name: "leaf node", - root: &FileNode{ + root: &Node[models.File]{ Path: "", - Children: []*FileNode{ + Children: []*Node[models.File]{ {File: &models.File{Name: "test", ShortStatus: " M", HasStagedChanges: true}, Path: "test"}, }, }, - expected: &FileNode{ + expected: &Node[models.File]{ Path: "", - Children: []*FileNode{ + Children: []*Node[models.File]{ {File: &models.File{Name: "test", ShortStatus: " M", HasStagedChanges: true}, Path: "test"}, }, }, }, { name: "big example", - root: &FileNode{ + root: &Node[models.File]{ Path: "", - Children: []*FileNode{ + Children: []*Node[models.File]{ { Path: "dir1", - Children: []*FileNode{ + Children: []*Node[models.File]{ { File: &models.File{Name: "file2", ShortStatus: "M ", HasUnstagedChanges: true}, Path: "dir1/file2", @@ -49,7 +49,7 @@ func TestCompress(t *testing.T) { }, { Path: "dir2", - Children: []*FileNode{ + Children: []*Node[models.File]{ { File: &models.File{Name: "file3", ShortStatus: " M", HasStagedChanges: true}, Path: "dir2/file3", @@ -62,10 +62,10 @@ func TestCompress(t *testing.T) { }, { Path: "dir3", - Children: []*FileNode{ + Children: []*Node[models.File]{ { Path: "dir3/dir3-1", - Children: []*FileNode{ + Children: []*Node[models.File]{ { File: &models.File{Name: "file5", ShortStatus: "M ", HasUnstagedChanges: true}, Path: "dir3/dir3-1/file5", @@ -80,12 +80,12 @@ func TestCompress(t *testing.T) { }, }, }, - expected: &FileNode{ + expected: &Node[models.File]{ Path: "", - Children: []*FileNode{ + Children: []*Node[models.File]{ { Path: "dir1", - Children: []*FileNode{ + Children: []*Node[models.File]{ { File: &models.File{Name: "file2", ShortStatus: "M ", HasUnstagedChanges: true}, Path: "dir1/file2", @@ -94,7 +94,7 @@ func TestCompress(t *testing.T) { }, { Path: "dir2", - Children: []*FileNode{ + Children: []*Node[models.File]{ { File: &models.File{Name: "file3", ShortStatus: " M", HasStagedChanges: true}, Path: "dir2/file3", @@ -108,7 +108,7 @@ func TestCompress(t *testing.T) { { Path: "dir3/dir3-1", CompressionLevel: 1, - Children: []*FileNode{ + Children: []*Node[models.File]{ { File: &models.File{Name: "file5", ShortStatus: "M ", HasUnstagedChanges: true}, Path: "dir3/dir3-1/file5", @@ -136,19 +136,19 @@ func TestCompress(t *testing.T) { func TestGetFile(t *testing.T) { scenarios := []struct { name string - viewModel *FileTreeViewModel + viewModel *FileTree path string expected *models.File }{ { name: "valid case", - viewModel: NewFileTreeViewModel([]*models.File{{Name: "blah/one"}, {Name: "blah/two"}}, nil, false), + viewModel: NewFileTree(func() []*models.File { return []*models.File{{Name: "blah/one"}, {Name: "blah/two"}} }, nil, false), path: "blah/two", expected: &models.File{Name: "blah/two"}, }, { name: "not found", - viewModel: NewFileTreeViewModel([]*models.File{{Name: "blah/one"}, {Name: "blah/two"}}, nil, false), + viewModel: NewFileTree(func() []*models.File { return []*models.File{{Name: "blah/one"}, {Name: "blah/two"}} }, nil, false), path: "blah/three", expected: nil, }, diff --git a/pkg/gui/filetree/file_tree.go b/pkg/gui/filetree/file_tree.go new file mode 100644 index 000000000..950bf24be --- /dev/null +++ b/pkg/gui/filetree/file_tree.go @@ -0,0 +1,177 @@ +package filetree + +import ( + "fmt" + + "github.com/jesseduffield/generics/slices" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/sirupsen/logrus" +) + +type FileTreeDisplayFilter int + +const ( + DisplayAll FileTreeDisplayFilter = iota + DisplayStaged + DisplayUnstaged + // this shows files with merge conflicts + DisplayConflicted +) + +type ITree[T any] interface { + InTreeMode() bool + ExpandToPath(path string) + ToggleShowTree() + GetIndexForPath(path string) (int, bool) + Len() int + SetTree() + IsCollapsed(path string) bool + ToggleCollapsed(path string) + CollapsedPaths() *CollapsedPaths +} + +type IFileTree interface { + ITree[models.File] + + FilterFiles(test func(*models.File) bool) []*models.File + SetFilter(filter FileTreeDisplayFilter) + Get(index int) *FileNode + GetFile(path string) *models.File + GetAllItems() []*FileNode + GetAllFiles() []*models.File + GetFilter() FileTreeDisplayFilter + GetRoot() *FileNode +} + +type FileTree struct { + getFiles func() []*models.File + tree *Node[models.File] + showTree bool + log *logrus.Entry + filter FileTreeDisplayFilter + collapsedPaths *CollapsedPaths +} + +var _ IFileTree = &FileTree{} + +func NewFileTree(getFiles func() []*models.File, log *logrus.Entry, showTree bool) *FileTree { + return &FileTree{ + getFiles: getFiles, + log: log, + showTree: showTree, + filter: DisplayAll, + collapsedPaths: NewCollapsedPaths(), + } +} + +func (self *FileTree) InTreeMode() bool { + return self.showTree +} + +func (self *FileTree) ExpandToPath(path string) { + self.collapsedPaths.ExpandToPath(path) +} + +func (self *FileTree) getFilesForDisplay() []*models.File { + switch self.filter { + case DisplayAll: + return self.getFiles() + case DisplayStaged: + return self.FilterFiles(func(file *models.File) bool { return file.HasStagedChanges }) + case DisplayUnstaged: + return self.FilterFiles(func(file *models.File) bool { return file.HasUnstagedChanges }) + case DisplayConflicted: + return self.FilterFiles(func(file *models.File) bool { return file.HasMergeConflicts }) + default: + panic(fmt.Sprintf("Unexpected files display filter: %d", self.filter)) + } +} + +func (self *FileTree) FilterFiles(test func(*models.File) bool) []*models.File { + return slices.Filter(self.getFiles(), test) +} + +func (self *FileTree) SetFilter(filter FileTreeDisplayFilter) { + self.filter = filter + self.SetTree() +} + +func (self *FileTree) ToggleShowTree() { + self.showTree = !self.showTree + self.SetTree() +} + +func (self *FileTree) Get(index int) *FileNode { + // need to traverse the three depth first until we get to the index. + return NewFileNode(self.tree.GetNodeAtIndex(index+1, self.collapsedPaths)) // ignoring root +} + +func (self *FileTree) GetFile(path string) *models.File { + for _, file := range self.getFiles() { + if file.Name == path { + return file + } + } + + return nil +} + +func (self *FileTree) GetIndexForPath(path string) (int, bool) { + index, found := self.tree.GetIndexForPath(path, self.collapsedPaths) + return index - 1, found +} + +// note: this gets all items when the filter is taken into consideration. There may +// be hidden files that aren't included here. Files off the screen however will +// be included +func (self *FileTree) GetAllItems() []*FileNode { + if self.tree == nil { + return nil + } + + // ignoring root + return slices.Map(self.tree.Flatten(self.collapsedPaths)[1:], func(node *Node[models.File]) *FileNode { + return NewFileNode(node) + }) +} + +func (self *FileTree) Len() int { + return self.tree.Size(self.collapsedPaths) - 1 // ignoring root +} + +func (self *FileTree) GetAllFiles() []*models.File { + return self.getFiles() +} + +func (self *FileTree) SetTree() { + filesForDisplay := self.getFilesForDisplay() + if self.showTree { + self.tree = BuildTreeFromFiles(filesForDisplay) + } else { + self.tree = BuildFlatTreeFromFiles(filesForDisplay) + } +} + +func (self *FileTree) IsCollapsed(path string) bool { + return self.collapsedPaths.IsCollapsed(path) +} + +func (self *FileTree) ToggleCollapsed(path string) { + self.collapsedPaths.ToggleCollapsed(path) +} + +func (self *FileTree) Tree() *FileNode { + return NewFileNode(self.tree) +} + +func (self *FileTree) GetRoot() *FileNode { + return NewFileNode(self.tree) +} + +func (self *FileTree) CollapsedPaths() *CollapsedPaths { + return self.collapsedPaths +} + +func (self *FileTree) GetFilter() FileTreeDisplayFilter { + return self.filter +} diff --git a/pkg/gui/filetree/file_tree_test.go b/pkg/gui/filetree/file_tree_test.go new file mode 100644 index 000000000..32c110425 --- /dev/null +++ b/pkg/gui/filetree/file_tree_test.go @@ -0,0 +1,81 @@ +package filetree + +import ( + "testing" + + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/stretchr/testify/assert" +) + +func TestFilterAction(t *testing.T) { + scenarios := []struct { + name string + filter FileTreeDisplayFilter + files []*models.File + expected []*models.File + }{ + { + name: "filter files with unstaged changes", + filter: DisplayUnstaged, + files: []*models.File{ + {Name: "dir2/dir2/file4", ShortStatus: "M ", HasUnstagedChanges: true}, + {Name: "dir2/file5", ShortStatus: "M ", HasStagedChanges: true}, + {Name: "file1", ShortStatus: "M ", HasUnstagedChanges: true}, + }, + expected: []*models.File{ + {Name: "dir2/dir2/file4", ShortStatus: "M ", HasUnstagedChanges: true}, + {Name: "file1", ShortStatus: "M ", HasUnstagedChanges: true}, + }, + }, + { + name: "filter files with staged changes", + filter: DisplayStaged, + files: []*models.File{ + {Name: "dir2/dir2/file4", ShortStatus: "M ", HasStagedChanges: true}, + {Name: "dir2/file5", ShortStatus: "M ", HasStagedChanges: false}, + {Name: "file1", ShortStatus: "M ", HasStagedChanges: true}, + }, + expected: []*models.File{ + {Name: "dir2/dir2/file4", ShortStatus: "M ", HasStagedChanges: true}, + {Name: "file1", ShortStatus: "M ", HasStagedChanges: true}, + }, + }, + { + name: "filter all files", + filter: DisplayAll, + files: []*models.File{ + {Name: "dir2/dir2/file4", ShortStatus: "M ", HasUnstagedChanges: true}, + {Name: "dir2/file5", ShortStatus: "M ", HasUnstagedChanges: true}, + {Name: "file1", ShortStatus: "M ", HasUnstagedChanges: true}, + }, + expected: []*models.File{ + {Name: "dir2/dir2/file4", ShortStatus: "M ", HasUnstagedChanges: true}, + {Name: "dir2/file5", ShortStatus: "M ", HasUnstagedChanges: true}, + {Name: "file1", ShortStatus: "M ", HasUnstagedChanges: true}, + }, + }, + { + name: "filter conflicted files", + filter: DisplayConflicted, + files: []*models.File{ + {Name: "dir2/dir2/file4", ShortStatus: "DU", HasMergeConflicts: true}, + {Name: "dir2/file5", ShortStatus: "M ", HasUnstagedChanges: true}, + {Name: "dir2/file6", ShortStatus: " M", HasStagedChanges: true}, + {Name: "file1", ShortStatus: "UU", HasMergeConflicts: true, HasInlineMergeConflicts: true}, + }, + expected: []*models.File{ + {Name: "dir2/dir2/file4", ShortStatus: "DU", HasMergeConflicts: true}, + {Name: "file1", ShortStatus: "UU", HasMergeConflicts: true, HasInlineMergeConflicts: true}, + }, + }, + } + + for _, s := range scenarios { + s := s + t.Run(s.name, func(t *testing.T) { + mngr := &FileTree{getFiles: func() []*models.File { return s.files }, filter: s.filter} + result := mngr.getFilesForDisplay() + assert.EqualValues(t, s.expected, result) + }) + } +} diff --git a/pkg/gui/filetree/file_tree_view_model.go b/pkg/gui/filetree/file_tree_view_model.go index 01eb751e3..333be8da2 100644 --- a/pkg/gui/filetree/file_tree_view_model.go +++ b/pkg/gui/filetree/file_tree_view_model.go @@ -1,159 +1,157 @@ package filetree import ( - "fmt" "sync" "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/context/traits" + "github.com/jesseduffield/lazygit/pkg/gui/types" + "github.com/jesseduffield/lazygit/pkg/utils" "github.com/sirupsen/logrus" ) -type FileTreeDisplayFilter int - -const ( - DisplayAll FileTreeDisplayFilter = iota - DisplayStaged - DisplayUnstaged - // this shows files with merge conflicts - DisplayConflicted -) +type IFileTreeViewModel interface { + IFileTree + types.IListCursor +} +// This combines our FileTree struct with a cursor that retains information about +// which item is selected. It also contains logic for repositioning that cursor +// after the files are refreshed type FileTreeViewModel struct { - files []*models.File - tree *FileNode - showTree bool - log *logrus.Entry - filter FileTreeDisplayFilter - collapsedPaths CollapsedPaths sync.RWMutex + IFileTree + types.IListCursor } -func NewFileTreeViewModel(files []*models.File, log *logrus.Entry, showTree bool) *FileTreeViewModel { - viewModel := &FileTreeViewModel{ - log: log, - showTree: showTree, - filter: DisplayAll, - collapsedPaths: CollapsedPaths{}, - RWMutex: sync.RWMutex{}, - } +var _ IFileTreeViewModel = &FileTreeViewModel{} - viewModel.SetFiles(files) - - return viewModel -} - -func (self *FileTreeViewModel) InTreeMode() bool { - return self.showTree -} - -func (self *FileTreeViewModel) ExpandToPath(path string) { - self.collapsedPaths.ExpandToPath(path) -} - -func (self *FileTreeViewModel) GetFilesForDisplay() []*models.File { - files := self.files - - switch self.filter { - case DisplayAll: - return files - case DisplayStaged: - return self.FilterFiles(func(file *models.File) bool { return file.HasStagedChanges }) - case DisplayUnstaged: - return self.FilterFiles(func(file *models.File) bool { return file.HasUnstagedChanges }) - case DisplayConflicted: - return self.FilterFiles(func(file *models.File) bool { return file.HasMergeConflicts }) - default: - panic(fmt.Sprintf("Unexpected files display filter: %d", self.filter)) +func NewFileTreeViewModel(getFiles func() []*models.File, log *logrus.Entry, showTree bool) *FileTreeViewModel { + fileTree := NewFileTree(getFiles, log, showTree) + listCursor := traits.NewListCursor(fileTree) + return &FileTreeViewModel{ + IFileTree: fileTree, + IListCursor: listCursor, } } -func (self *FileTreeViewModel) FilterFiles(test func(*models.File) bool) []*models.File { - result := make([]*models.File, 0) - for _, file := range self.files { - if test(file) { - result = append(result, file) - } - } - return result -} - -func (self *FileTreeViewModel) SetFilter(filter FileTreeDisplayFilter) { - self.filter = filter - self.SetTree() -} - -func (self *FileTreeViewModel) ToggleShowTree() { - self.showTree = !self.showTree - self.SetTree() -} - -func (self *FileTreeViewModel) GetItemAtIndex(index int) *FileNode { - // need to traverse the three depth first until we get to the index. - return self.tree.GetNodeAtIndex(index+1, self.collapsedPaths) // ignoring root -} - -func (self *FileTreeViewModel) GetFile(path string) *models.File { - for _, file := range self.files { - if file.Name == path { - return file - } - } - - return nil -} - -func (self *FileTreeViewModel) GetIndexForPath(path string) (int, bool) { - index, found := self.tree.GetIndexForPath(path, self.collapsedPaths) - return index - 1, found -} - -func (self *FileTreeViewModel) GetAllItems() []*FileNode { - if self.tree == nil { +func (self *FileTreeViewModel) GetSelected() *FileNode { + if self.Len() == 0 { return nil } - return self.tree.Flatten(self.collapsedPaths)[1:] // ignoring root + return self.Get(self.GetSelectedLineIdx()) } -func (self *FileTreeViewModel) GetItemsLength() int { - return self.tree.Size(self.collapsedPaths) - 1 // ignoring root +func (self *FileTreeViewModel) GetSelectedFile() *models.File { + node := self.GetSelected() + if node == nil { + return nil + } + + return node.File } -func (self *FileTreeViewModel) GetAllFiles() []*models.File { - return self.files -} +func (self *FileTreeViewModel) GetSelectedPath() string { + node := self.GetSelected() + if node == nil { + return "" + } -func (self *FileTreeViewModel) SetFiles(files []*models.File) { - self.files = files - - self.SetTree() + return node.GetPath() } func (self *FileTreeViewModel) SetTree() { - filesForDisplay := self.GetFilesForDisplay() - if self.showTree { - self.tree = BuildTreeFromFiles(filesForDisplay) - } else { - self.tree = BuildFlatTreeFromFiles(filesForDisplay) + newFiles := self.GetAllFiles() + selectedNode := self.GetSelected() + + // for when you stage the old file of a rename and the new file is in a collapsed dir + for _, file := range newFiles { + if selectedNode != nil && selectedNode.Path != "" && file.PreviousName == selectedNode.Path { + self.ExpandToPath(file.Name) + } + } + + prevNodes := self.GetAllItems() + prevSelectedLineIdx := self.GetSelectedLineIdx() + + self.IFileTree.SetTree() + + if selectedNode != nil { + newNodes := self.GetAllItems() + newIdx := self.findNewSelectedIdx(prevNodes[prevSelectedLineIdx:], newNodes) + if newIdx != -1 && newIdx != prevSelectedLineIdx { + self.SetSelectedLineIdx(newIdx) + } + } + + self.RefreshSelectedIdx() +} + +// Let's try to find our file again and move the cursor to that. +// If we can't find our file, it was probably just removed by the user. In that +// case, we go looking for where the next file has been moved to. Given that the +// user could have removed a whole directory, we continue iterating through the old +// nodes until we find one that exists in the new set of nodes, then move the cursor +// to that. +// prevNodes starts from our previously selected node because we don't need to consider anything above that +func (self *FileTreeViewModel) findNewSelectedIdx(prevNodes []*FileNode, currNodes []*FileNode) int { + getPaths := func(node *FileNode) []string { + if node == nil { + return nil + } + if node.File != nil && node.File.IsRename() { + return node.File.Names() + } else { + return []string{node.Path} + } + } + + for _, prevNode := range prevNodes { + selectedPaths := getPaths(prevNode) + + for idx, node := range currNodes { + paths := getPaths(node) + + // If you started off with a rename selected, and now it's broken in two, we want you to jump to the new file, not the old file. + // This is because the new should be in the same position as the rename was meaning less cursor jumping + foundOldFileInRename := prevNode.File != nil && prevNode.File.IsRename() && node.Path == prevNode.File.PreviousName + foundNode := utils.StringArraysOverlap(paths, selectedPaths) && !foundOldFileInRename + if foundNode { + return idx + } + } + } + + return -1 +} + +func (self *FileTreeViewModel) SetFilter(filter FileTreeDisplayFilter) { + self.IFileTree.SetFilter(filter) + self.IListCursor.SetSelectedLineIdx(0) +} + +// If we're going from flat to tree we want to select the same file. +// If we're going from tree to flat and we have a file selected we want to select that. +// If instead we've selected a directory we need to select the first file in that directory. +func (self *FileTreeViewModel) ToggleShowTree() { + selectedNode := self.GetSelected() + + self.IFileTree.ToggleShowTree() + + if selectedNode == nil { + return + } + path := selectedNode.Path + + if self.InTreeMode() { + self.ExpandToPath(path) + } else if len(selectedNode.Children) > 0 { + path = selectedNode.GetLeaves()[0].Path + } + + index, found := self.GetIndexForPath(path) + if found { + self.SetSelectedLineIdx(index) } } - -func (self *FileTreeViewModel) IsCollapsed(path string) bool { - return self.collapsedPaths.IsCollapsed(path) -} - -func (self *FileTreeViewModel) ToggleCollapsed(path string) { - self.collapsedPaths.ToggleCollapsed(path) -} - -func (self *FileTreeViewModel) Tree() INode { - return self.tree -} - -func (self *FileTreeViewModel) CollapsedPaths() CollapsedPaths { - return self.collapsedPaths -} - -func (self *FileTreeViewModel) GetFilter() FileTreeDisplayFilter { - return self.filter -} diff --git a/pkg/gui/filetree/file_tree_view_model_test.go b/pkg/gui/filetree/file_tree_view_model_test.go deleted file mode 100644 index 89b8e74df..000000000 --- a/pkg/gui/filetree/file_tree_view_model_test.go +++ /dev/null @@ -1,81 +0,0 @@ -package filetree - -import ( - "testing" - - "github.com/jesseduffield/lazygit/pkg/commands/models" - "github.com/stretchr/testify/assert" -) - -func TestFilterAction(t *testing.T) { - scenarios := []struct { - name string - filter FileTreeDisplayFilter - files []*models.File - expected []*models.File - }{ - { - name: "filter files with unstaged changes", - filter: DisplayUnstaged, - files: []*models.File{ - {Name: "dir2/dir2/file4", ShortStatus: "M ", HasUnstagedChanges: true}, - {Name: "dir2/file5", ShortStatus: "M ", HasStagedChanges: true}, - {Name: "file1", ShortStatus: "M ", HasUnstagedChanges: true}, - }, - expected: []*models.File{ - {Name: "dir2/dir2/file4", ShortStatus: "M ", HasUnstagedChanges: true}, - {Name: "file1", ShortStatus: "M ", HasUnstagedChanges: true}, - }, - }, - { - name: "filter files with staged changes", - filter: DisplayStaged, - files: []*models.File{ - {Name: "dir2/dir2/file4", ShortStatus: "M ", HasStagedChanges: true}, - {Name: "dir2/file5", ShortStatus: "M ", HasStagedChanges: false}, - {Name: "file1", ShortStatus: "M ", HasStagedChanges: true}, - }, - expected: []*models.File{ - {Name: "dir2/dir2/file4", ShortStatus: "M ", HasStagedChanges: true}, - {Name: "file1", ShortStatus: "M ", HasStagedChanges: true}, - }, - }, - { - name: "filter all files", - filter: DisplayAll, - files: []*models.File{ - {Name: "dir2/dir2/file4", ShortStatus: "M ", HasUnstagedChanges: true}, - {Name: "dir2/file5", ShortStatus: "M ", HasUnstagedChanges: true}, - {Name: "file1", ShortStatus: "M ", HasUnstagedChanges: true}, - }, - expected: []*models.File{ - {Name: "dir2/dir2/file4", ShortStatus: "M ", HasUnstagedChanges: true}, - {Name: "dir2/file5", ShortStatus: "M ", HasUnstagedChanges: true}, - {Name: "file1", ShortStatus: "M ", HasUnstagedChanges: true}, - }, - }, - { - name: "filter conflicted files", - filter: DisplayConflicted, - files: []*models.File{ - {Name: "dir2/dir2/file4", ShortStatus: "DU", HasMergeConflicts: true}, - {Name: "dir2/file5", ShortStatus: "M ", HasUnstagedChanges: true}, - {Name: "dir2/file6", ShortStatus: " M", HasStagedChanges: true}, - {Name: "file1", ShortStatus: "UU", HasMergeConflicts: true, HasInlineMergeConflicts: true}, - }, - expected: []*models.File{ - {Name: "dir2/dir2/file4", ShortStatus: "DU", HasMergeConflicts: true}, - {Name: "file1", ShortStatus: "UU", HasMergeConflicts: true, HasInlineMergeConflicts: true}, - }, - }, - } - - for _, s := range scenarios { - s := s - t.Run(s.name, func(t *testing.T) { - mngr := &FileTreeViewModel{files: s.files, filter: s.filter} - result := mngr.GetFilesForDisplay() - assert.EqualValues(t, s.expected, result) - }) - } -} diff --git a/pkg/gui/filetree/inode.go b/pkg/gui/filetree/inode.go deleted file mode 100644 index 7d9035fe3..000000000 --- a/pkg/gui/filetree/inode.go +++ /dev/null @@ -1,213 +0,0 @@ -package filetree - -import ( - "sort" -) - -type INode interface { - IsNil() bool - IsLeaf() bool - GetPath() string - GetChildren() []INode - SetChildren([]INode) - GetCompressionLevel() int - SetCompressionLevel(int) -} - -func sortNode(node INode) { - sortChildren(node) - - for _, child := range node.GetChildren() { - sortNode(child) - } -} - -func sortChildren(node INode) { - if node.IsLeaf() { - return - } - - children := node.GetChildren() - sortedChildren := make([]INode, len(children)) - copy(sortedChildren, children) - - sort.Slice(sortedChildren, func(i, j int) bool { - if !sortedChildren[i].IsLeaf() && sortedChildren[j].IsLeaf() { - return true - } - if sortedChildren[i].IsLeaf() && !sortedChildren[j].IsLeaf() { - return false - } - - return sortedChildren[i].GetPath() < sortedChildren[j].GetPath() - }) - - // TODO: think about making this in-place - node.SetChildren(sortedChildren) -} - -func forEachLeaf(node INode, cb func(INode) error) error { - if node.IsLeaf() { - if err := cb(node); err != nil { - return err - } - } - - for _, child := range node.GetChildren() { - if err := forEachLeaf(child, cb); err != nil { - return err - } - } - - return nil -} - -func any(node INode, test func(INode) bool) bool { - if test(node) { - return true - } - - for _, child := range node.GetChildren() { - if any(child, test) { - return true - } - } - - return false -} - -func every(node INode, test func(INode) bool) bool { - if !test(node) { - return false - } - - for _, child := range node.GetChildren() { - if !every(child, test) { - return false - } - } - - return true -} - -func flatten(node INode, collapsedPaths map[string]bool) []INode { - result := []INode{} - result = append(result, node) - - if !collapsedPaths[node.GetPath()] { - for _, child := range node.GetChildren() { - result = append(result, flatten(child, collapsedPaths)...) - } - } - - return result -} - -func getNodeAtIndex(node INode, index int, collapsedPaths map[string]bool) INode { - foundNode, _ := getNodeAtIndexAux(node, index, collapsedPaths) - - return foundNode -} - -func getNodeAtIndexAux(node INode, index int, collapsedPaths map[string]bool) (INode, int) { - offset := 1 - - if index == 0 { - return node, offset - } - - if !collapsedPaths[node.GetPath()] { - for _, child := range node.GetChildren() { - foundNode, offsetChange := getNodeAtIndexAux(child, index-offset, collapsedPaths) - offset += offsetChange - if foundNode != nil { - return foundNode, offset - } - } - } - - return nil, offset -} - -func getIndexForPath(node INode, path string, collapsedPaths map[string]bool) (int, bool) { - offset := 0 - - if node.GetPath() == path { - return offset, true - } - - if !collapsedPaths[node.GetPath()] { - for _, child := range node.GetChildren() { - offsetChange, found := getIndexForPath(child, path, collapsedPaths) - offset += offsetChange + 1 - if found { - return offset, true - } - } - } - - return offset, false -} - -func size(node INode, collapsedPaths map[string]bool) int { - output := 1 - - if !collapsedPaths[node.GetPath()] { - for _, child := range node.GetChildren() { - output += size(child, collapsedPaths) - } - } - - return output -} - -func compressAux(node INode) INode { - if node.IsLeaf() { - return node - } - - children := node.GetChildren() - for i := range children { - grandchildren := children[i].GetChildren() - for len(grandchildren) == 1 && !grandchildren[0].IsLeaf() { - grandchildren[0].SetCompressionLevel(children[i].GetCompressionLevel() + 1) - children[i] = grandchildren[0] - grandchildren = children[i].GetChildren() - } - } - - for i := range children { - children[i] = compressAux(children[i]) - } - - node.SetChildren(children) - - return node -} - -func getPathsMatching(node INode, test func(INode) bool) []string { - paths := []string{} - - if test(node) { - paths = append(paths, node.GetPath()) - } - - for _, child := range node.GetChildren() { - paths = append(paths, getPathsMatching(child, test)...) - } - - return paths -} - -func getLeaves(node INode) []INode { - if node.IsLeaf() { - return []INode{node} - } - - output := []INode{} - for _, child := range node.GetChildren() { - output = append(output, getLeaves(child)...) - } - - return output -} diff --git a/pkg/gui/filetree/node.go b/pkg/gui/filetree/node.go new file mode 100644 index 000000000..8de655b37 --- /dev/null +++ b/pkg/gui/filetree/node.go @@ -0,0 +1,301 @@ +package filetree + +import ( + "github.com/jesseduffield/generics/slices" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +// Represents a file or directory in a file tree. +type Node[T any] struct { + // File will be nil if the node is a directory. + File *T + + // If the node is a directory, Children contains the contents of the directory, + // otherwise it's nil. + Children []*Node[T] + + // path of the file/directory + Path string + + // rather than render a tree as: + // a/ + // b/ + // file.blah + // + // we instead render it as: + // a/b/ + // file.blah + // This saves vertical space. The CompressionLevel of a node is equal to the + // number of times a 'compression' like the above has happened, where two + // nodes are squished into one. + CompressionLevel int +} + +var _ types.ListItem = &Node[models.File]{} + +func (self *Node[T]) IsFile() bool { + return self.File != nil +} + +func (self *Node[T]) GetPath() string { + return self.Path +} + +func (self *Node[T]) Sort() { + self.SortChildren() + + for _, child := range self.Children { + child.Sort() + } +} + +func (self *Node[T]) ForEachFile(cb func(*T) error) error { + if self.IsFile() { + if err := cb(self.File); err != nil { + return err + } + } + + for _, child := range self.Children { + if err := child.ForEachFile(cb); err != nil { + return err + } + } + + return nil +} + +func (self *Node[T]) SortChildren() { + if self.IsFile() { + return + } + + children := slices.Clone(self.Children) + + slices.SortFunc(children, func(a, b *Node[T]) bool { + if !a.IsFile() && b.IsFile() { + return true + } + if a.IsFile() && !b.IsFile() { + return false + } + + return a.GetPath() < b.GetPath() + }) + + // TODO: think about making this in-place + self.Children = children +} + +func (self *Node[T]) Some(test func(*Node[T]) bool) bool { + if test(self) { + return true + } + + for _, child := range self.Children { + if child.Some(test) { + return true + } + } + + return false +} + +func (self *Node[T]) SomeFile(test func(*T) bool) bool { + if self.IsFile() { + if test(self.File) { + return true + } + } else { + for _, child := range self.Children { + if child.SomeFile(test) { + return true + } + } + } + + return false +} + +func (self *Node[T]) Every(test func(*Node[T]) bool) bool { + if !test(self) { + return false + } + + for _, child := range self.Children { + if !child.Every(test) { + return false + } + } + + return true +} + +func (self *Node[T]) EveryFile(test func(*T) bool) bool { + if self.IsFile() { + if !test(self.File) { + return false + } + } else { + for _, child := range self.Children { + if !child.EveryFile(test) { + return false + } + } + } + + return true +} + +func (self *Node[T]) Flatten(collapsedPaths *CollapsedPaths) []*Node[T] { + result := []*Node[T]{self} + + if len(self.Children) > 0 && !collapsedPaths.IsCollapsed(self.GetPath()) { + result = append(result, slices.FlatMap(self.Children, func(child *Node[T]) []*Node[T] { + return child.Flatten(collapsedPaths) + })...) + } + + return result +} + +func (self *Node[T]) GetNodeAtIndex(index int, collapsedPaths *CollapsedPaths) *Node[T] { + if self == nil { + return nil + } + + node, _ := self.getNodeAtIndexAux(index, collapsedPaths) + + return node +} + +func (self *Node[T]) getNodeAtIndexAux(index int, collapsedPaths *CollapsedPaths) (*Node[T], int) { + offset := 1 + + if index == 0 { + return self, offset + } + + if !collapsedPaths.IsCollapsed(self.GetPath()) { + for _, child := range self.Children { + foundNode, offsetChange := child.getNodeAtIndexAux(index-offset, collapsedPaths) + offset += offsetChange + if foundNode != nil { + return foundNode, offset + } + } + } + + return nil, offset +} + +func (self *Node[T]) GetIndexForPath(path string, collapsedPaths *CollapsedPaths) (int, bool) { + offset := 0 + + if self.GetPath() == path { + return offset, true + } + + if !collapsedPaths.IsCollapsed(self.GetPath()) { + for _, child := range self.Children { + offsetChange, found := child.GetIndexForPath(path, collapsedPaths) + offset += offsetChange + 1 + if found { + return offset, true + } + } + } + + return offset, false +} + +func (self *Node[T]) Size(collapsedPaths *CollapsedPaths) int { + if self == nil { + return 0 + } + + output := 1 + + if !collapsedPaths.IsCollapsed(self.GetPath()) { + for _, child := range self.Children { + output += child.Size(collapsedPaths) + } + } + + return output +} + +func (self *Node[T]) Compress() { + if self == nil { + return + } + + self.compressAux() +} + +func (self *Node[T]) compressAux() *Node[T] { + if self.IsFile() { + return self + } + + children := self.Children + for i := range children { + grandchildren := children[i].Children + for len(grandchildren) == 1 && !grandchildren[0].IsFile() { + grandchildren[0].CompressionLevel = children[i].CompressionLevel + 1 + children[i] = grandchildren[0] + grandchildren = children[i].Children + } + } + + for i := range children { + children[i] = children[i].compressAux() + } + + self.Children = children + + return self +} + +func (self *Node[T]) GetPathsMatching(test func(*Node[T]) bool) []string { + paths := []string{} + + if test(self) { + paths = append(paths, self.GetPath()) + } + + for _, child := range self.Children { + paths = append(paths, child.GetPathsMatching(test)...) + } + + return paths +} + +func (self *Node[T]) GetFilePathsMatching(test func(*T) bool) []string { + matchingFileNodes := slices.Filter(self.GetLeaves(), func(node *Node[T]) bool { + return test(node.File) + }) + + return slices.Map(matchingFileNodes, func(node *Node[T]) string { + return node.GetPath() + }) +} + +func (self *Node[T]) GetLeaves() []*Node[T] { + if self.IsFile() { + return []*Node[T]{self} + } + + return slices.FlatMap(self.Children, func(child *Node[T]) []*Node[T] { + return child.GetLeaves() + }) +} + +func (self *Node[T]) ID() string { + return self.GetPath() +} + +func (self *Node[T]) Description() string { + return self.GetPath() +} diff --git a/pkg/gui/filtering.go b/pkg/gui/filtering.go index 1f5c5032a..2746d0e2b 100644 --- a/pkg/gui/filtering.go +++ b/pkg/gui/filtering.go @@ -1,16 +1,30 @@ package gui -func (gui *Gui) validateNotInFilterMode() (bool, error) { +import ( + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +func (gui *Gui) validateNotInFilterMode() bool { if gui.State.Modes.Filtering.Active() { - err := gui.ask(askOpts{ - title: gui.Tr.MustExitFilterModeTitle, - prompt: gui.Tr.MustExitFilterModePrompt, - handleConfirm: gui.exitFilterMode, + _ = gui.c.Confirm(types.ConfirmOpts{ + Title: gui.c.Tr.MustExitFilterModeTitle, + Prompt: gui.c.Tr.MustExitFilterModePrompt, + HandleConfirm: gui.exitFilterMode, }) - return false, err + return false + } + return true +} + +func (gui *Gui) outsideFilterMode(f func() error) func() error { + return func() error { + if !gui.validateNotInFilterMode() { + return nil + } + + return f() } - return true, nil } func (gui *Gui) exitFilterMode() error { @@ -23,7 +37,7 @@ func (gui *Gui) clearFiltering() error { gui.State.ScreenMode = SCREEN_NORMAL } - return gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{COMMITS}}) + return gui.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.COMMITS}}) } func (gui *Gui) setFiltering(path string) error { @@ -32,11 +46,11 @@ func (gui *Gui) setFiltering(path string) error { gui.State.ScreenMode = SCREEN_HALF } - if err := gui.pushContext(gui.State.Contexts.BranchCommits); err != nil { + if err := gui.c.PushContext(gui.State.Contexts.LocalCommits); err != nil { return err } - return gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{COMMITS}, then: func() { - gui.State.Contexts.BranchCommits.GetPanelState().SetSelectedLineIdx(0) + return gui.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.COMMITS}, Then: func() { + gui.State.Contexts.LocalCommits.SetSelectedLineIdx(0) }}) } diff --git a/pkg/gui/filtering_menu_panel.go b/pkg/gui/filtering_menu_panel.go index 2955f6e8d..97327324e 100644 --- a/pkg/gui/filtering_menu_panel.go +++ b/pkg/gui/filtering_menu_panel.go @@ -3,6 +3,8 @@ package gui import ( "fmt" "strings" + + "github.com/jesseduffield/lazygit/pkg/gui/types" ) func (gui *Gui) handleCreateFilteringMenuPanel() error { @@ -14,30 +16,30 @@ func (gui *Gui) handleCreateFilteringMenuPanel() error { fileName = node.GetPath() } case gui.State.Contexts.CommitFiles: - node := gui.getSelectedCommitFileNode() + node := gui.State.Contexts.CommitFiles.GetSelected() if node != nil { fileName = node.GetPath() } } - menuItems := []*menuItem{} + menuItems := []*types.MenuItem{} if fileName != "" { - menuItems = append(menuItems, &menuItem{ - displayString: fmt.Sprintf("%s '%s'", gui.Tr.LcFilterBy, fileName), - onPress: func() error { + menuItems = append(menuItems, &types.MenuItem{ + Label: fmt.Sprintf("%s '%s'", gui.c.Tr.LcFilterBy, fileName), + OnPress: func() error { return gui.setFiltering(fileName) }, }) } - menuItems = append(menuItems, &menuItem{ - displayString: gui.Tr.LcFilterPathOption, - onPress: func() error { - return gui.prompt(promptOpts{ - findSuggestionsFunc: gui.getFilePathSuggestionsFunc(), - title: gui.Tr.EnterFileName, - handleConfirm: func(response string) error { + menuItems = append(menuItems, &types.MenuItem{ + Label: gui.c.Tr.LcFilterPathOption, + OnPress: func() error { + return gui.c.Prompt(types.PromptOpts{ + FindSuggestionsFunc: gui.helpers.Suggestions.GetFilePathSuggestionsFunc(), + Title: gui.c.Tr.EnterFileName, + HandleConfirm: func(response string) error { return gui.setFiltering(strings.TrimSpace(response)) }, }) @@ -45,11 +47,11 @@ func (gui *Gui) handleCreateFilteringMenuPanel() error { }) if gui.State.Modes.Filtering.Active() { - menuItems = append(menuItems, &menuItem{ - displayString: gui.Tr.LcExitFilterMode, - onPress: gui.clearFiltering, + menuItems = append(menuItems, &types.MenuItem{ + Label: gui.c.Tr.LcExitFilterMode, + OnPress: gui.clearFiltering, }) } - return gui.createMenu(gui.Tr.FilteringMenuTitle, menuItems, createMenuOptions{showCancel: true}) + return gui.c.Menu(types.CreateMenuOptions{Title: gui.c.Tr.FilteringMenuTitle, Items: menuItems}) } diff --git a/pkg/gui/git_flow.go b/pkg/gui/git_flow.go deleted file mode 100644 index e89c7637c..000000000 --- a/pkg/gui/git_flow.go +++ /dev/null @@ -1,72 +0,0 @@ -package gui - -import ( - "fmt" - - "github.com/jesseduffield/lazygit/pkg/utils" -) - -func (gui *Gui) handleCreateGitFlowMenu() error { - branch := gui.getSelectedBranch() - if branch == nil { - return nil - } - - if !gui.Git.Flow.GitFlowEnabled() { - return gui.createErrorPanel("You need to install git-flow and enable it in this repo to use git-flow features") - } - - startHandler := func(branchType string) func() error { - return func() error { - title := utils.ResolvePlaceholderString(gui.Tr.NewGitFlowBranchPrompt, map[string]string{"branchType": branchType}) - - return gui.prompt(promptOpts{ - title: title, - handleConfirm: func(name string) error { - gui.logAction(gui.Tr.Actions.GitFlowStart) - return gui.runSubprocessWithSuspenseAndRefresh( - gui.Git.Flow.StartCmdObj(branchType, name), - ) - }, - }) - } - } - - menuItems := []*menuItem{ - { - // not localising here because it's one to one with the actual git flow commands - displayString: fmt.Sprintf("finish branch '%s'", branch.Name), - onPress: func() error { - return gui.gitFlowFinishBranch(branch.Name) - }, - }, - { - displayString: "start feature", - onPress: startHandler("feature"), - }, - { - displayString: "start hotfix", - onPress: startHandler("hotfix"), - }, - { - displayString: "start bugfix", - onPress: startHandler("bugfix"), - }, - { - displayString: "start release", - onPress: startHandler("release"), - }, - } - - return gui.createMenu("git flow", menuItems, createMenuOptions{}) -} - -func (gui *Gui) gitFlowFinishBranch(branchName string) error { - cmdObj, err := gui.Git.Flow.FinishCmdObj(branchName) - if err != nil { - return gui.surfaceError(err) - } - - gui.logAction(gui.Tr.Actions.GitFlowFinish) - return gui.runSubprocessWithSuspenseAndRefresh(cmdObj) -} diff --git a/pkg/gui/global_handlers.go b/pkg/gui/global_handlers.go index 22b43b6b7..326b856bd 100644 --- a/pkg/gui/global_handlers.go +++ b/pkg/gui/global_handlers.go @@ -2,11 +2,11 @@ package gui import ( "fmt" - "math" "strings" "github.com/jesseduffield/gocui" "github.com/jesseduffield/lazygit/pkg/commands/git_commands" + "github.com/jesseduffield/lazygit/pkg/gui/types" "github.com/jesseduffield/lazygit/pkg/utils" ) @@ -15,8 +15,9 @@ const HORIZONTAL_SCROLL_FACTOR = 3 // these views need to be re-rendered when the screen mode changes. The commits view, // for example, will show authorship information in half and full screen mode. func (gui *Gui) rerenderViewsWithScreenModeDependentContent() error { - for _, view := range []*gocui.View{gui.Views.Branches, gui.Views.Commits} { - if err := gui.rerenderView(view); err != nil { + // for now we re-render all list views. + for _, context := range gui.getListContexts() { + if err := gui.rerenderView(context.GetView()); err != nil { return err } } @@ -24,7 +25,6 @@ func (gui *Gui) rerenderViewsWithScreenModeDependentContent() error { return nil } -// TODO: GENERICS func nextIntInCycle(sl []WindowMaximisation, current WindowMaximisation) WindowMaximisation { for i, val := range sl { if val == current { @@ -37,7 +37,6 @@ func nextIntInCycle(sl []WindowMaximisation, current WindowMaximisation) WindowM return sl[0] } -// TODO: GENERICS func prevIntInCycle(sl []WindowMaximisation, current WindowMaximisation) WindowMaximisation { for i, val := range sl { if val == current { @@ -62,101 +61,81 @@ func (gui *Gui) prevScreenMode() error { return gui.rerenderViewsWithScreenModeDependentContent() } -func (gui *Gui) scrollUpView(view *gocui.View) error { - ox, oy := view.Origin() - newOy := int(math.Max(0, float64(oy-gui.UserConfig.Gui.ScrollHeight))) - return view.SetOrigin(ox, newOy) +func (gui *Gui) scrollUpView(view *gocui.View) { + view.ScrollUp(gui.c.UserConfig.Gui.ScrollHeight) } -func (gui *Gui) scrollDownView(view *gocui.View) error { - ox, oy := view.Origin() - scrollHeight := gui.linesToScrollDown(view) - if scrollHeight > 0 { - if err := view.SetOrigin(ox, oy+scrollHeight); err != nil { - return err - } - } +func (gui *Gui) scrollDownView(view *gocui.View) { + scrollHeight := gui.c.UserConfig.Gui.ScrollHeight + view.ScrollDown(scrollHeight) if manager, ok := gui.viewBufferManagerMap[view.Name()]; ok { manager.ReadLines(scrollHeight) } - return nil -} - -func (gui *Gui) linesToScrollDown(view *gocui.View) int { - _, oy := view.Origin() - y := oy - canScrollPastBottom := gui.UserConfig.Gui.ScrollPastBottom - if !canScrollPastBottom { - _, sy := view.Size() - y += sy - } - scrollHeight := gui.UserConfig.Gui.ScrollHeight - scrollableLines := view.ViewLinesHeight() - y - if scrollableLines < 0 { - return 0 - } - - // margin is about how many lines must still appear if you scroll - // all the way down. In practice every file ends in a newline so it will really - // just show a single line - margin := 1 - if canScrollPastBottom { - margin = 2 - } - if scrollableLines-margin < scrollHeight { - scrollHeight = scrollableLines - margin - } - if oy+scrollHeight < 0 { - return 0 - } else { - return scrollHeight - } } func (gui *Gui) scrollUpMain() error { - if gui.renderingConflicts() { - gui.State.Panels.Merging.UserVerticalScrolling = true + var view *gocui.View + if gui.c.CurrentContext().GetWindowName() == "secondary" { + view = gui.secondaryView() + } else { + view = gui.mainView() } - return gui.scrollUpView(gui.Views.Main) + if view.Name() == "mergeConflicts" { + // although we have this same logic in the controller, this method can be invoked + // via the global scroll up/down keybindings, as opposed to just the mouse wheel keybinding. + // It would be nice to have a concept of a global keybinding that runs on the top context in a + // window but that might be overkill for this one use case. + gui.State.Contexts.MergeConflicts.SetUserScrolling(true) + } + + gui.scrollUpView(view) + + return nil } func (gui *Gui) scrollDownMain() error { - if gui.renderingConflicts() { - gui.State.Panels.Merging.UserVerticalScrolling = true + var view *gocui.View + if gui.c.CurrentContext().GetWindowName() == "secondary" { + view = gui.secondaryView() + } else { + view = gui.mainView() } - return gui.scrollDownView(gui.Views.Main) -} + if view.Name() == "mergeConflicts" { + gui.State.Contexts.MergeConflicts.SetUserScrolling(true) + } -func (gui *Gui) scrollLeftMain() error { - gui.scrollLeft(gui.Views.Main) + gui.scrollDownView(view) return nil } -func (gui *Gui) scrollRightMain() error { - gui.scrollRight(gui.Views.Main) - - return nil +func (gui *Gui) mainView() *gocui.View { + viewName := gui.getViewNameForWindow("main") + view, _ := gui.g.View(viewName) + return view } -func (gui *Gui) scrollLeft(view *gocui.View) { - newOriginX := utils.Max(view.OriginX()-view.InnerWidth()/HORIZONTAL_SCROLL_FACTOR, 0) - _ = view.SetOriginX(newOriginX) -} - -func (gui *Gui) scrollRight(view *gocui.View) { - _ = view.SetOriginX(view.OriginX() + view.InnerWidth()/HORIZONTAL_SCROLL_FACTOR) +func (gui *Gui) secondaryView() *gocui.View { + viewName := gui.getViewNameForWindow("secondary") + view, _ := gui.g.View(viewName) + return view } func (gui *Gui) scrollUpSecondary() error { - return gui.scrollUpView(gui.Views.Secondary) + gui.scrollUpView(gui.secondaryView()) + + return nil } func (gui *Gui) scrollDownSecondary() error { - return gui.scrollDownView(gui.Views.Secondary) + secondaryView := gui.secondaryView() + + gui.scrollDownView(secondaryView) + + return nil } func (gui *Gui) scrollUpConfirmationPanel() error { @@ -164,7 +143,9 @@ func (gui *Gui) scrollUpConfirmationPanel() error { return nil } - return gui.scrollUpView(gui.Views.Confirmation) + gui.scrollUpView(gui.Views.Confirmation) + + return nil } func (gui *Gui) scrollDownConfirmationPanel() error { @@ -172,67 +153,19 @@ func (gui *Gui) scrollDownConfirmationPanel() error { return nil } - return gui.scrollDownView(gui.Views.Confirmation) + gui.scrollDownView(gui.Views.Confirmation) + + return nil } func (gui *Gui) handleRefresh() error { - return gui.refreshSidePanels(refreshOptions{mode: ASYNC}) -} - -func (gui *Gui) handleMouseDownMain() error { - if gui.popupPanelFocused() { - return nil - } - - switch gui.currentSideContext() { - case gui.State.Contexts.Files: - // set filename, set primary/secondary selected, set line number, then switch context - // I'll need to know it was changed though. - // Could I pass something along to the context change? - return gui.enterFile(OnFocusOpts{ClickedViewName: "main", ClickedViewLineIdx: gui.Views.Main.SelectedLineIdx()}) - case gui.State.Contexts.CommitFiles: - return gui.enterCommitFile(OnFocusOpts{ClickedViewName: "main", ClickedViewLineIdx: gui.Views.Main.SelectedLineIdx()}) - } - - return nil -} - -func (gui *Gui) handleMouseDownSecondary() error { - if gui.popupPanelFocused() { - return nil - } - - switch gui.g.CurrentView() { - case gui.Views.Files: - return gui.enterFile(OnFocusOpts{ClickedViewName: "secondary", ClickedViewLineIdx: gui.Views.Secondary.SelectedLineIdx()}) - } - - return nil -} - -func (gui *Gui) fetch() (err error) { - gui.Mutexes.FetchMutex.Lock() - defer gui.Mutexes.FetchMutex.Unlock() - - gui.logAction("Fetch") - err = gui.Git.Sync.Fetch(git_commands.FetchOptions{}) - - if err != nil && strings.Contains(err.Error(), "exit status 128") { - _ = gui.createErrorPanel(gui.Tr.PassUnameWrong) - } - - _ = gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{BRANCHES, COMMITS, REMOTES, TAGS}, mode: ASYNC}) - - return err + return gui.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}) } func (gui *Gui) backgroundFetch() (err error) { - gui.Mutexes.FetchMutex.Lock() - defer gui.Mutexes.FetchMutex.Unlock() + err = gui.git.Sync.Fetch(git_commands.FetchOptions{Background: true}) - err = gui.Git.Sync.Fetch(git_commands.FetchOptions{Background: true}) - - _ = gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{BRANCHES, COMMITS, REMOTES, TAGS}, mode: ASYNC}) + _ = gui.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.BRANCHES, types.COMMITS, types.REMOTES, types.TAGS}, Mode: types.ASYNC}) return err } @@ -245,14 +178,14 @@ func (gui *Gui) handleCopySelectedSideContextItemToClipboard() error { return nil } - gui.logAction(gui.Tr.Actions.CopyToClipboard) - if err := gui.OSCommand.CopyToClipboard(itemId); err != nil { - return gui.surfaceError(err) + gui.c.LogAction(gui.c.Tr.Actions.CopyToClipboard) + if err := gui.os.CopyToClipboard(itemId); err != nil { + return gui.c.Error(err) } truncatedItemId := utils.TruncateWithEllipsis(strings.Replace(itemId, "\n", " ", -1), 50) - gui.raiseToast(fmt.Sprintf("'%s' %s", truncatedItemId, gui.Tr.LcCopiedToClipboard)) + gui.c.Toast(fmt.Sprintf("'%s' %s", truncatedItemId, gui.c.Tr.LcCopiedToClipboard)) return nil } diff --git a/pkg/gui/gpg.go b/pkg/gui/gpg.go deleted file mode 100644 index ca7e4b842..000000000 --- a/pkg/gui/gpg.go +++ /dev/null @@ -1,65 +0,0 @@ -package gui - -import ( - "fmt" - - "github.com/jesseduffield/lazygit/pkg/commands/oscommands" - "github.com/jesseduffield/lazygit/pkg/gui/style" -) - -// Currently there is a bug where if we switch to a subprocess from within -// WithWaitingStatus we get stuck there and can't return to lazygit. We could -// fix this bug, or just stop running subprocesses from within there, given that -// we don't need to see a loading status if we're in a subprocess. -// TODO: work out if we actually need to use a shell command here -func (gui *Gui) withGpgHandling(cmdObj oscommands.ICmdObj, waitingStatus string, onSuccess func() error) error { - gui.logCommand(cmdObj.ToString(), true) - - useSubprocess := gui.Git.Config.UsingGpg() - if useSubprocess { - success, err := gui.runSubprocessWithSuspense(gui.OSCommand.Cmd.NewShell(cmdObj.ToString())) - if success && onSuccess != nil { - if err := onSuccess(); err != nil { - return err - } - } - if err := gui.refreshSidePanels(refreshOptions{mode: ASYNC}); err != nil { - return err - } - - return err - } else { - return gui.RunAndStream(cmdObj, waitingStatus, onSuccess) - } -} - -func (gui *Gui) RunAndStream(cmdObj oscommands.ICmdObj, waitingStatus string, onSuccess func() error) error { - return gui.WithWaitingStatus(waitingStatus, func() error { - cmdObj := gui.OSCommand.Cmd.NewShell(cmdObj.ToString()) - cmdObj.AddEnvVars("TERM=dumb") - cmdWriter := gui.getCmdWriter() - cmd := cmdObj.GetCmd() - cmd.Stdout = cmdWriter - cmd.Stderr = cmdWriter - - if err := cmd.Run(); err != nil { - if _, err := cmd.Stdout.Write([]byte(fmt.Sprintf("%s\n", style.FgRed.Sprint(err.Error())))); err != nil { - gui.Log.Error(err) - } - _ = gui.refreshSidePanels(refreshOptions{mode: ASYNC}) - return gui.surfaceError( - fmt.Errorf( - gui.Tr.GitCommandFailed, gui.UserConfig.Keybinding.Universal.ExtrasMenu, - ), - ) - } - - if onSuccess != nil { - if err := onSuccess(); err != nil { - return err - } - } - - return gui.refreshSidePanels(refreshOptions{mode: ASYNC}) - }) -} diff --git a/pkg/gui/gui.go b/pkg/gui/gui.go index 375f7c0d4..d7103914d 100644 --- a/pkg/gui/gui.go +++ b/pkg/gui/gui.go @@ -5,12 +5,12 @@ import ( "io/ioutil" "log" "os" - "sync" - "strings" + "sync" "time" "github.com/jesseduffield/gocui" + appTypes "github.com/jesseduffield/lazygit/pkg/app/types" "github.com/jesseduffield/lazygit/pkg/commands" "github.com/jesseduffield/lazygit/pkg/commands/git_commands" "github.com/jesseduffield/lazygit/pkg/commands/git_config" @@ -18,21 +18,26 @@ import ( "github.com/jesseduffield/lazygit/pkg/commands/oscommands" "github.com/jesseduffield/lazygit/pkg/common" "github.com/jesseduffield/lazygit/pkg/config" - "github.com/jesseduffield/lazygit/pkg/gui/filetree" - "github.com/jesseduffield/lazygit/pkg/gui/lbl" - "github.com/jesseduffield/lazygit/pkg/gui/mergeconflicts" + "github.com/jesseduffield/lazygit/pkg/gui/context" + "github.com/jesseduffield/lazygit/pkg/gui/controllers/helpers" + "github.com/jesseduffield/lazygit/pkg/gui/keybindings" "github.com/jesseduffield/lazygit/pkg/gui/modes/cherrypicking" "github.com/jesseduffield/lazygit/pkg/gui/modes/diffing" "github.com/jesseduffield/lazygit/pkg/gui/modes/filtering" + "github.com/jesseduffield/lazygit/pkg/gui/popup" "github.com/jesseduffield/lazygit/pkg/gui/presentation" "github.com/jesseduffield/lazygit/pkg/gui/presentation/authors" "github.com/jesseduffield/lazygit/pkg/gui/presentation/graph" + "github.com/jesseduffield/lazygit/pkg/gui/presentation/icons" + "github.com/jesseduffield/lazygit/pkg/gui/services/custom_commands" "github.com/jesseduffield/lazygit/pkg/gui/style" "github.com/jesseduffield/lazygit/pkg/gui/types" + integrationTypes "github.com/jesseduffield/lazygit/pkg/integration/types" "github.com/jesseduffield/lazygit/pkg/tasks" "github.com/jesseduffield/lazygit/pkg/theme" "github.com/jesseduffield/lazygit/pkg/updates" "github.com/jesseduffield/lazygit/pkg/utils" + "github.com/sasha-s/go-deadlock" "gopkg.in/ozeidan/fuzzy-patricia.v3/patricia" ) @@ -54,13 +59,13 @@ const StartupPopupVersion = 5 var OverlappingEdges = false type ContextManager struct { - ContextStack []Context + ContextStack []types.Context sync.RWMutex } -func NewContextManager(initialContext Context) ContextManager { +func NewContextManager(initialContext types.Context) ContextManager { return ContextManager{ - ContextStack: []Context{initialContext}, + ContextStack: []types.Context{initialContext}, RWMutex: sync.RWMutex{}, } } @@ -70,30 +75,35 @@ type Repo string // Gui wraps the gocui Gui object which handles rendering and events type Gui struct { *common.Common - g *gocui.Gui - Git *commands.GitCommand - OSCommand *oscommands.OSCommand + g *gocui.Gui + git *commands.GitCommand + os *oscommands.OSCommand // this is the state of the GUI for the current repo - State *guiState + State *GuiRepoState + + CustomCommandsClient *custom_commands.Client // this is a mapping of repos to gui states, so that we can restore the original // gui state when returning from a subrepo - RepoStateMap map[Repo]*guiState + RepoStateMap map[Repo]*GuiRepoState Config config.AppConfigurer Updater *updates.Updater statusManager *statusManager - credentials credentials waitForIntro sync.WaitGroup fileWatcher *fileWatcher viewBufferManagerMap map[string]*tasks.ViewBufferManager - stopChan chan struct{} + // holds a mapping of view names to ptmx's. This is for rendering command outputs + // from within a pty. The point of keeping track of them is so that if we re-size + // the window, we can tell the pty it needs to resize accordingly. + viewPtmxMap map[string]*os.File + stopChan chan struct{} // when lazygit is opened outside a git directory we want to open to the most // recent repo with the recent repos popup showing showRecentRepos bool - Mutexes guiMutexes + Mutexes types.Mutexes // findSuggestions will take a string that the user has typed into a prompt // and return a slice of suggestions which match that string. @@ -101,7 +111,7 @@ type Gui struct { // when you enter into a submodule we'll append the superproject's path to this array // so that you can return to the superproject - RepoPathStack []string + RepoPathStack *utils.StringStack // this tells us whether our views have been initially set up ViewsSetup bool @@ -121,142 +131,74 @@ type Gui struct { suggestionsAsyncHandler *tasks.AsyncHandler - PopupHandler PopupHandler + PopupHandler types.IPopupHandler IsNewRepo bool + + // flag as to whether or not the diff view should ignore whitespace + IgnoreWhitespaceInDiffView bool + + // we use this to decide whether we'll return to the original directory that + // lazygit was opened in, or if we'll retain the one we're currently in. + RetainOriginalDir bool + + PrevLayout PrevLayout + + // this is the initial dir we are in upon opening lazygit. We hold onto this + // in case we want to restore it before quitting for users who have set up + // the feature for changing directory upon quit. + // The reason we don't just wait until quit time to handle changing directories + // is because some users want to keep track of the current lazygit directory in an outside + // process + InitialDir string + + c *types.HelperCommon + helpers *helpers.Helpers } -type listPanelState struct { - SelectedLineIdx int +// we keep track of some stuff from one render to the next to see if certain +// things have changed +type PrevLayout struct { + Information string + MainWidth int + MainHeight int } -func (h *listPanelState) SetSelectedLineIdx(value int) { - h.SelectedLineIdx = value -} +type GuiRepoState struct { + Model *types.Model + Modes *types.Modes -func (h *listPanelState) GetSelectedLineIdx() int { - return h.SelectedLineIdx -} + // Suggestions will sometimes appear when typing into a prompt + Suggestions []*types.Suggestion -// for now the staging panel state, unlike the other panel states, is going to be -// non-mutative, so that we don't accidentally end up -// with mismatches of data. We might change this in the future -type LblPanelState struct { - *lbl.State - SecondaryFocused bool // this is for if we show the left or right panel -} + Updating bool + SplitMainPanel bool + LimitCommits bool -type MergingPanelState struct { - *mergeconflicts.State + IsRefreshingFiles bool + Searching searchingState + StartupStage StartupStage // Allows us to not load everything at once - // UserVerticalScrolling tells us if the user has started scrolling through the file themselves - // in which case we won't auto-scroll to a conflict. - UserVerticalScrolling bool -} + ContextManager ContextManager + Contexts *context.ContextTree -type filePanelState struct { - listPanelState -} + // WindowViewNameMap is a mapping of windows to the current view of that window. + // Some views move between windows for example the commitFiles view and when cycling through + // side windows we need to know which view to give focus to for a given window + WindowViewNameMap map[string]string -// TODO: consider splitting this out into the window and the branches view -type branchPanelState struct { - listPanelState -} + // tells us whether we've set up our views for the current repo. We'll need to + // do this whenever we switch back and forth between repos to get the views + // back in sync with the repo state + ViewsSetup bool -type remotePanelState struct { - listPanelState -} + // we store a commit message in this field if we've escaped the commit message + // panel without committing or if our commit failed + savedCommitMessage string -type remoteBranchesState struct { - listPanelState -} + ScreenMode WindowMaximisation -type tagsPanelState struct { - listPanelState -} - -type commitPanelState struct { - listPanelState - - LimitCommits bool -} - -type reflogCommitPanelState struct { - listPanelState -} - -type subCommitPanelState struct { - listPanelState - - // e.g. name of branch whose commits we're looking at - refName string -} - -type stashPanelState struct { - listPanelState -} - -type menuPanelState struct { - listPanelState - OnPress func() error -} - -type commitFilesPanelState struct { - listPanelState - - // this is the SHA of the commit or the stash index of the stash. - // Not sure if ref is actually the right word here - refName string - canRebase bool -} - -type submodulePanelState struct { - listPanelState -} - -type suggestionsPanelState struct { - listPanelState -} - -type panelStates struct { - Files *filePanelState - Branches *branchPanelState - Remotes *remotePanelState - RemoteBranches *remoteBranchesState - Tags *tagsPanelState - Commits *commitPanelState - ReflogCommits *reflogCommitPanelState - SubCommits *subCommitPanelState - Stash *stashPanelState - Menu *menuPanelState - LineByLine *LblPanelState - Merging *MergingPanelState - CommitFiles *commitFilesPanelState - Submodules *submodulePanelState - Suggestions *suggestionsPanelState -} - -type Views struct { - Status *gocui.View - Files *gocui.View - Branches *gocui.View - Commits *gocui.View - Stash *gocui.View - Main *gocui.View - Secondary *gocui.View - Options *gocui.View - Confirmation *gocui.View - Menu *gocui.View - Credentials *gocui.View - CommitMessage *gocui.View - CommitFiles *gocui.View - Information *gocui.View - AppStatus *gocui.View - Search *gocui.View - SearchPrefix *gocui.View - Limit *gocui.View - Suggestions *gocui.View - Extras *gocui.View + CurrentPopupOpts *types.CreatePopupPanelOpts } type searchingState struct { @@ -273,89 +215,27 @@ const ( COMPLETE ) -type Modes struct { - Filtering filtering.Filtering - CherryPicking cherrypicking.CherryPicking - Diffing diffing.Diffing -} +func (gui *Gui) onNewRepo(startArgs appTypes.StartArgs, reuseState bool) error { + var err error + gui.git, err = commands.NewGitCommand( + gui.Common, + gui.os, + git_config.NewStdCachedGitConfig(gui.Log), + gui.Mutexes.SyncMutex, + ) + if err != nil { + return err + } -type guiMutexes struct { - RefreshingFilesMutex sync.Mutex - RefreshingStatusMutex sync.Mutex - FetchMutex sync.Mutex - BranchCommitsMutex sync.Mutex - LineByLinePanelMutex sync.Mutex - SubprocessMutex sync.Mutex -} + gui.resetState(startArgs, reuseState) -type guiState struct { - // the file panels (files and commit files) can render as a tree, so we have - // managers for them which handle rendering a flat list of files in tree form - FileTreeViewModel *filetree.FileTreeViewModel - CommitFileTreeViewModel *filetree.CommitFileTreeViewModel + gui.resetControllers() - Submodules []*models.SubmoduleConfig - Branches []*models.Branch - Commits []*models.Commit - StashEntries []*models.StashEntry - // Suggestions will sometimes appear when typing into a prompt - Suggestions []*types.Suggestion - // FilteredReflogCommits are the ones that appear in the reflog panel. - // when in filtering mode we only include the ones that match the given path - FilteredReflogCommits []*models.Commit - // ReflogCommits are the ones used by the branches panel to obtain recency values - // if we're not in filtering mode, CommitFiles and FilteredReflogCommits will be - // one and the same - ReflogCommits []*models.Commit - SubCommits []*models.Commit - Remotes []*models.Remote - RemoteBranches []*models.RemoteBranch - Tags []*models.Tag - MenuItems []*menuItem - BisectInfo *git_commands.BisectInfo - GithubState *GithubState + if err := gui.resetKeybindings(); err != nil { + return err + } - Updating bool - Panels *panelStates - SplitMainPanel bool - MainContext ContextKey // used to keep the main and secondary views' contexts in sync - RetainOriginalDir bool - IsRefreshingFiles bool - Searching searchingState - // if this is true, we'll load our commits using `git log --all` - ShowWholeGitGraph bool - ScreenMode WindowMaximisation - Ptmx *os.File - PrevMainWidth int - PrevMainHeight int - OldInformation string - StartupStage StartupStage // Allows us to not load everything at once - - Modes Modes - - ContextManager ContextManager - Contexts ContextTree - ViewContextMap map[string]Context - ViewTabContextMap map[string][]tabContext - - // WindowViewNameMap is a mapping of windows to the current view of that window. - // Some views move between windows for example the commitFiles view and when cycling through - // side windows we need to know which view to give focus to for a given window - WindowViewNameMap map[string]string - - // tells us whether we've set up our views for the current repo. We'll need to - // do this whenever we switch back and forth between repos to get the views - // back in sync with the repo state - ViewsSetup bool - - // flag as to whether or not the diff view should ignore whitespace - IgnoreWhitespaceInDiffView bool - - // for displaying suggestions while typing in a file name - FilesTrie *patricia.Trie - - // this is the message of the last failed commit attempt - failedCommitMessage string + return nil } type GithubState struct { @@ -371,7 +251,7 @@ type GithubState struct { // it gets a bit confusing to land back in the status panel when visiting a repo // you've already switched from. There's no doubt some easy way to make the UX // optimal for all cases but I'm too lazy to think about what that is right now -func (gui *Gui) resetState(filterPath string, reuseState bool) { +func (gui *Gui) resetState(startArgs appTypes.StartArgs, reuseState bool) { currentDir, err := os.Getwd() if reuseState { @@ -379,71 +259,84 @@ func (gui *Gui) resetState(filterPath string, reuseState bool) { if state := gui.RepoStateMap[Repo(currentDir)]; state != nil { gui.State = state gui.State.ViewsSetup = false + + // setting this to nil so we don't get stuck based on a popup that was + // previously opened + gui.Mutexes.PopupMutex.Lock() + gui.State.CurrentPopupOpts = nil + gui.Mutexes.PopupMutex.Unlock() + return } } else { - gui.Log.Error(err) + gui.c.Log.Error(err) } } - showTree := gui.UserConfig.Gui.ShowFileTree + contextTree := gui.contextTree() - contexts := gui.contextTree() + initialContext := initialContext(contextTree, startArgs) + initialScreenMode := initialScreenMode(startArgs) - screenMode := SCREEN_NORMAL - initialContext := contexts.Files - if filterPath != "" { - screenMode = SCREEN_HALF - initialContext = contexts.BranchCommits - } + initialWindowViewNameMap := gui.initialWindowViewNameMap(contextTree) - gui.State = &guiState{ - FileTreeViewModel: filetree.NewFileTreeViewModel(make([]*models.File, 0), gui.Log, showTree), - CommitFileTreeViewModel: filetree.NewCommitFileTreeViewModel(make([]*models.CommitFile, 0), gui.Log, showTree), - Commits: make([]*models.Commit, 0), - FilteredReflogCommits: make([]*models.Commit, 0), - ReflogCommits: make([]*models.Commit, 0), - StashEntries: make([]*models.StashEntry, 0), - BisectInfo: gui.Git.Bisect.GetInfo(), - Panels: &panelStates{ - // TODO: work out why some of these are -1 and some are 0. Last time I checked there was a good reason but I'm less certain now - Files: &filePanelState{listPanelState{SelectedLineIdx: -1}}, - Submodules: &submodulePanelState{listPanelState{SelectedLineIdx: -1}}, - Branches: &branchPanelState{listPanelState{SelectedLineIdx: 0}}, - Remotes: &remotePanelState{listPanelState{SelectedLineIdx: 0}}, - RemoteBranches: &remoteBranchesState{listPanelState{SelectedLineIdx: -1}}, - Tags: &tagsPanelState{listPanelState{SelectedLineIdx: -1}}, - Commits: &commitPanelState{listPanelState: listPanelState{SelectedLineIdx: 0}, LimitCommits: true}, - ReflogCommits: &reflogCommitPanelState{listPanelState{SelectedLineIdx: 0}}, - SubCommits: &subCommitPanelState{listPanelState: listPanelState{SelectedLineIdx: 0}, refName: ""}, - CommitFiles: &commitFilesPanelState{listPanelState: listPanelState{SelectedLineIdx: -1}, refName: ""}, - Stash: &stashPanelState{listPanelState{SelectedLineIdx: -1}}, - Menu: &menuPanelState{listPanelState: listPanelState{SelectedLineIdx: 0}, OnPress: nil}, - Suggestions: &suggestionsPanelState{listPanelState: listPanelState{SelectedLineIdx: 0}}, - Merging: &MergingPanelState{ - State: mergeconflicts.NewState(), - UserVerticalScrolling: false, - }, + gui.State = &GuiRepoState{ + Model: &types.Model{ + CommitFiles: nil, + Files: make([]*models.File, 0), + Commits: make([]*models.Commit, 0), + StashEntries: make([]*models.StashEntry, 0), + FilteredReflogCommits: make([]*models.Commit, 0), + ReflogCommits: make([]*models.Commit, 0), + BisectInfo: git_commands.NewNullBisectInfo(), + FilesTrie: patricia.NewTrie(), }, - GithubState: &GithubState{}, - Ptmx: nil, - Modes: Modes{ - Filtering: filtering.New(filterPath), + Modes: &types.Modes{ + Filtering: filtering.New(startArgs.FilterPath), CherryPicking: cherrypicking.New(), Diffing: diffing.New(), }, - ViewContextMap: contexts.initialViewContextMap(), - ViewTabContextMap: contexts.initialViewTabContextMap(), - ScreenMode: screenMode, + ScreenMode: initialScreenMode, // TODO: put contexts in the context manager - ContextManager: NewContextManager(initialContext), - Contexts: contexts, - FilesTrie: patricia.NewTrie(), + ContextManager: NewContextManager(initialContext), + Contexts: contextTree, + WindowViewNameMap: initialWindowViewNameMap, } gui.RepoStateMap[Repo(currentDir)] = gui.State } +func initialScreenMode(startArgs appTypes.StartArgs) WindowMaximisation { + if startArgs.FilterPath != "" || startArgs.GitArg != appTypes.GitArgNone { + return SCREEN_HALF + } else { + return SCREEN_NORMAL + } +} + +func initialContext(contextTree *context.ContextTree, startArgs appTypes.StartArgs) types.IListContext { + var initialContext types.IListContext = contextTree.Files + + if startArgs.FilterPath != "" { + initialContext = contextTree.LocalCommits + } else if startArgs.GitArg != appTypes.GitArgNone { + switch startArgs.GitArg { + case appTypes.GitArgStatus: + initialContext = contextTree.Files + case appTypes.GitArgBranch: + initialContext = contextTree.Branches + case appTypes.GitArgLog: + initialContext = contextTree.LocalCommits + case appTypes.GitArgStash: + initialContext = contextTree.Stash + default: + panic("unhandled git arg") + } + } + + return initialContext +} + // for now the split view will always be on // NewGui builds a new gui handler func NewGui( @@ -451,8 +344,8 @@ func NewGui( config config.AppConfigurer, gitConfig git_config.IGitConfig, updater *updates.Updater, - filterPath string, showRecentRepos bool, + initialDir string, ) (*Gui, error) { gui := &Gui{ Common: cmn, @@ -460,9 +353,10 @@ func NewGui( Updater: updater, statusManager: &statusManager{}, viewBufferManagerMap: map[string]*tasks.ViewBufferManager{}, + viewPtmxMap: map[string]*os.File{}, showRecentRepos: showRecentRepos, - RepoPathStack: []string{}, - RepoStateMap: map[Repo]*guiState{}, + RepoPathStack: &utils.StringStack{}, + RepoStateMap: map[Repo]*GuiRepoState{}, CmdLog: []string{}, suggestionsAsyncHandler: tasks.NewAsyncHandler(), @@ -470,35 +364,54 @@ func NewGui( // but now we do it via state. So we need to still support the config for the // sake of backwards compatibility. We're making use of short circuiting here ShowExtrasWindow: cmn.UserConfig.Gui.ShowCommandLog && !config.GetAppState().HideCommandLog, + Mutexes: types.Mutexes{ + RefreshingFilesMutex: &deadlock.Mutex{}, + RefreshingStatusMutex: &deadlock.Mutex{}, + SyncMutex: &deadlock.Mutex{}, + LocalCommitsMutex: &deadlock.Mutex{}, + SubprocessMutex: &deadlock.Mutex{}, + PopupMutex: &deadlock.Mutex{}, + PtyMutex: &deadlock.Mutex{}, + }, + InitialDir: initialDir, } - guiIO := oscommands.NewGuiIO( - cmn.Log, - gui.logCommand, - gui.getCmdWriter, - gui.promptUserForCredential, - ) - - osCommand := oscommands.NewOSCommand(cmn, oscommands.GetPlatform(), guiIO) - - gui.OSCommand = osCommand - var err error - gui.Git, err = commands.NewGitCommand( - cmn, - osCommand, - gitConfig, - ) - if err != nil { - return nil, err - } - - gui.resetState(filterPath, false) - gui.watchFilesForChanges() - gui.PopupHandler = &RealPopupHandler{gui: gui} + gui.PopupHandler = popup.NewPopupHandler( + cmn, + gui.createPopupPanel, + func() error { return gui.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}) }, + gui.popContext, + gui.currentContext, + gui.createMenu, + gui.withWaitingStatus, + gui.toast, + func() string { return gui.Views.Confirmation.TextArea.GetContent() }, + ) + + guiCommon := &guiCommon{gui: gui, IPopupHandler: gui.PopupHandler} + helperCommon := &types.HelperCommon{IGuiCommon: guiCommon, Common: cmn} + + credentialsHelper := helpers.NewCredentialsHelper(helperCommon) + + guiIO := oscommands.NewGuiIO( + cmn.Log, + gui.LogCommand, + gui.getCmdWriter, + credentialsHelper.PromptUserForCredential, + ) + + osCommand := oscommands.NewOSCommand(cmn, config, oscommands.GetPlatform(), guiIO) + + gui.os = osCommand + + // storing this stuff on the gui for now to ease refactoring + // TODO: reset these controllers upon changing repos due to state changing + gui.c = helperCommon authors.SetCustomAuthors(gui.UserConfig.Gui.AuthorColors) + icons.SetIconEnabled(gui.UserConfig.Gui.ShowIcons) presentation.SetCustomBranches(gui.UserConfig.Gui.BranchColors) return gui, nil @@ -510,80 +423,146 @@ var RuneReplacements = map[rune]string{ graph.CommitSymbol: "o", } -// Run setup the gui with keybindings and start the mainloop -func (gui *Gui) Run() error { - recordEvents := recordingEvents() +func (gui *Gui) initGocui(headless bool, test integrationTypes.IntegrationTest) (*gocui.Gui, error) { + recordEvents := RecordingEvents() playMode := gocui.NORMAL if recordEvents { playMode = gocui.RECORDING - } else if replaying() { + } else if Replaying() { playMode = gocui.REPLAYING + } else if test != nil { + playMode = gocui.REPLAYING_NEW } - g, err := gocui.NewGui(gocui.OutputTrue, OverlappingEdges, playMode, headless(), RuneReplacements) + g, err := gocui.NewGui(gocui.OutputTrue, OverlappingEdges, playMode, headless, RuneReplacements) + if err != nil { + return nil, err + } + + return g, nil +} + +func (gui *Gui) viewTabMap() map[string][]context.TabView { + return map[string][]context.TabView{ + "branches": { + { + Tab: gui.c.Tr.LocalBranchesTitle, + ViewName: "localBranches", + }, + { + Tab: gui.c.Tr.RemotesTitle, + ViewName: "remotes", + }, + { + Tab: gui.c.Tr.TagsTitle, + ViewName: "tags", + }, + }, + "commits": { + { + Tab: gui.c.Tr.CommitsTitle, + ViewName: "commits", + }, + { + Tab: gui.c.Tr.ReflogCommitsTitle, + ViewName: "reflogCommits", + }, + }, + "files": { + { + Tab: gui.c.Tr.FilesTitle, + ViewName: "files", + }, + { + Tab: gui.c.Tr.SubmodulesTitle, + ViewName: "submodules", + }, + }, + } +} + +// Run: setup the gui with keybindings and start the mainloop +func (gui *Gui) Run(startArgs appTypes.StartArgs) error { + g, err := gui.initGocui(Headless(), startArgs.IntegrationTest) if err != nil { return err } - gui.g = g // TODO: always use gui.g rather than passing g around everywhere - defer g.Close() + gui.g = g + defer gui.g.Close() - if replaying() { - g.RecordingConfig = gocui.RecordingConfig{ - Speed: getRecordingSpeed(), - Leeway: 100, - } + // if the deadlock package wants to report a deadlock, we first need to + // close the gui so that we can actually read what it prints. + deadlock.Opts.LogBuf = utils.NewOnceWriter(os.Stderr, func() { + gui.g.Close() + }) + deadlock.Opts.Disable = !gui.Debug - g.Recording, err = gui.loadRecording() - if err != nil { - return err - } + gui.handleTestMode(startArgs.IntegrationTest) - go utils.Safe(func() { - time.Sleep(time.Second * 40) - log.Fatal("40 seconds is up, lazygit recording took too long to complete") - }) - } - - g.OnSearchEscape = gui.onSearchEscape + gui.g.OnSearchEscape = gui.onSearchEscape if err := gui.Config.ReloadUserConfig(); err != nil { return nil } userConfig := gui.UserConfig - g.SearchEscapeKey = gui.getKey(userConfig.Keybinding.Universal.Return) - g.NextSearchMatchKey = gui.getKey(userConfig.Keybinding.Universal.NextMatch) - g.PrevSearchMatchKey = gui.getKey(userConfig.Keybinding.Universal.PrevMatch) + gui.g.SearchEscapeKey = keybindings.GetKey(userConfig.Keybinding.Universal.Return) + gui.g.NextSearchMatchKey = keybindings.GetKey(userConfig.Keybinding.Universal.NextMatch) + gui.g.PrevSearchMatchKey = keybindings.GetKey(userConfig.Keybinding.Universal.PrevMatch) - g.ShowListFooter = userConfig.Gui.ShowListFooter + gui.g.ShowListFooter = userConfig.Gui.ShowListFooter if userConfig.Gui.MouseEvents { - g.Mouse = true + gui.g.Mouse = true } if err := gui.setColorScheme(); err != nil { return err } - gui.waitForIntro.Add(1) - if gui.UserConfig.Git.AutoFetch { - go utils.Safe(gui.startBackgroundFetch) + gui.g.SetManager(gocui.ManagerFunc(gui.layout), gocui.ManagerFunc(gui.getFocusLayout())) + + if err := gui.createAllViews(); err != nil { + return err } - gui.goEvery(time.Second*time.Duration(userConfig.Refresher.RefreshInterval), gui.stopChan, gui.refreshFilesAndSubmodules) + // onNewRepo must be called after g.SetManager because SetManager deletes keybindings + if err := gui.onNewRepo(startArgs, false); err != nil { + return err + } - g.SetManager(gocui.ManagerFunc(gui.layout), gocui.ManagerFunc(gui.getFocusLayout())) + gui.waitForIntro.Add(1) - gui.Log.Info("starting main loop") + if userConfig.Git.AutoFetch { + fetchInterval := userConfig.Refresher.FetchInterval + if fetchInterval > 0 { + go utils.Safe(gui.startBackgroundFetch) + } else { + gui.c.Log.Errorf( + "Value of config option 'refresher.fetchInterval' (%d) is invalid, disabling auto-fetch", + fetchInterval) + } + } - err = g.MainLoop() - return err + if userConfig.Git.AutoRefresh { + refreshInterval := userConfig.Refresher.RefreshInterval + if refreshInterval > 0 { + gui.goEvery(time.Second*time.Duration(refreshInterval), gui.stopChan, gui.refreshFilesAndSubmodules) + } else { + gui.c.Log.Errorf( + "Value of config option 'refresher.refreshInterval' (%d) is invalid, disabling auto-refresh", + refreshInterval) + } + } + + gui.c.Log.Info("starting main loop") + + return gui.g.MainLoop() } -// RunAndHandleError -func (gui *Gui) RunAndHandleError() error { +func (gui *Gui) RunAndHandleError(startArgs appTypes.StartArgs) error { gui.stopChan = make(chan struct{}) return utils.SafeWithError(func() error { - if err := gui.Run(); err != nil { + if err := gui.Run(startArgs); err != nil { for _, manager := range gui.viewBufferManagerMap { manager.Close() } @@ -596,13 +575,17 @@ func (gui *Gui) RunAndHandleError() error { switch err { case gocui.ErrQuit: - if !gui.State.RetainOriginalDir { + if gui.RetainOriginalDir { + if err := gui.recordDirectory(gui.InitialDir); err != nil { + return err + } + } else { if err := gui.recordCurrentDirectory(); err != nil { return err } } - if err := gui.saveRecording(gui.g.Recording); err != nil { + if err := SaveRecording(gui.g.Recording); err != nil { return err } @@ -624,7 +607,7 @@ func (gui *Gui) runSubprocessWithSuspenseAndRefresh(subprocess oscommands.ICmdOb return err } - if err := gui.refreshSidePanels(refreshOptions{mode: ASYNC}); err != nil { + if err := gui.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}); err != nil { return err } @@ -636,7 +619,7 @@ func (gui *Gui) runSubprocessWithSuspense(subprocess oscommands.ICmdObj) (bool, gui.Mutexes.SubprocessMutex.Lock() defer gui.Mutexes.SubprocessMutex.Unlock() - if replaying() { + if Replaying() { // we do not yet support running subprocesses within integration tests. So if // we're replaying an integration test and we're inside this method, something // has gone wrong, so we should fail @@ -645,7 +628,7 @@ func (gui *Gui) runSubprocessWithSuspense(subprocess oscommands.ICmdObj) (bool, } if err := gui.g.Suspend(); err != nil { - return false, gui.surfaceError(err) + return false, gui.c.Error(err) } gui.PauseBackgroundThreads = true @@ -659,14 +642,14 @@ func (gui *Gui) runSubprocessWithSuspense(subprocess oscommands.ICmdObj) (bool, gui.PauseBackgroundThreads = false if cmdErr != nil { - return false, gui.surfaceError(cmdErr) + return false, gui.c.Error(cmdErr) } return true, nil } func (gui *Gui) runSubprocess(cmdObj oscommands.ICmdObj) error { //nolint:unparam - gui.logCommand(cmdObj.ToString(), true) + gui.LogCommand(cmdObj.ToString(), true) subprocess := cmdObj.GetCmd() subprocess.Stdout = os.Stdout @@ -681,8 +664,10 @@ func (gui *Gui) runSubprocess(cmdObj oscommands.ICmdObj) error { //nolint:unpara subprocess.Stderr = ioutil.Discard subprocess.Stdin = nil - fmt.Fprintf(os.Stdout, "\n%s\n", style.FgGreen.Sprint(gui.Tr.PressEnterToReturn)) - fmt.Scanln() // wait for enter press + if gui.Config.GetUserConfig().PromptToReturnFromSubprocess { + fmt.Fprintf(os.Stdout, "\n%s", style.FgGreen.Sprint(gui.Tr.PressEnterToReturn)) + fmt.Scanln() // wait for enter press + } return err } @@ -692,11 +677,11 @@ func (gui *Gui) loadNewRepo() error { return err } - if err := gui.refreshSidePanels(refreshOptions{mode: ASYNC}); err != nil { + if err := gui.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}); err != nil { return err } - if err := gui.OSCommand.UpdateWindowTitle(); err != nil { + if err := gui.os.UpdateWindowTitle(); err != nil { return err } @@ -712,7 +697,7 @@ func (gui *Gui) showInitialPopups(tasks []func(chan struct{}) error) { task := task go utils.Safe(func() { if err := task(done); err != nil { - _ = gui.surfaceError(err) + _ = gui.c.Error(err) } }) @@ -725,15 +710,15 @@ func (gui *Gui) showInitialPopups(tasks []func(chan struct{}) error) { func (gui *Gui) showIntroPopupMessage(done chan struct{}) error { onConfirm := func() error { done <- struct{}{} - gui.Config.GetAppState().StartupPopupVersion = StartupPopupVersion - return gui.Config.SaveAppState() + gui.c.GetAppState().StartupPopupVersion = StartupPopupVersion + return gui.c.SaveAppState() } - return gui.ask(askOpts{ - title: "", - prompt: gui.Tr.IntroPopupMessage, - handleConfirm: onConfirm, - handleClose: onConfirm, + return gui.c.Confirm(types.ConfirmOpts{ + Title: "", + Prompt: gui.c.Tr.IntroPopupMessage, + HandleConfirm: onConfirm, + HandleClose: onConfirm, }) } @@ -764,10 +749,7 @@ func (gui *Gui) startBackgroundFetch() { } err := gui.backgroundFetch() if err != nil && strings.Contains(err.Error(), "exit status 128") && isNew { - _ = gui.ask(askOpts{ - title: gui.Tr.NoAutomaticGitFetchTitle, - prompt: gui.Tr.NoAutomaticGitFetchBody, - }) + _ = gui.c.Alert(gui.c.Tr.NoAutomaticGitFetchTitle, gui.c.Tr.NoAutomaticGitFetchBody) } else { gui.goEvery(time.Second*time.Duration(userConfig.Refresher.FetchInterval), gui.stopChan, func() error { err := gui.backgroundFetch() @@ -790,22 +772,7 @@ func (gui *Gui) setColorScheme() error { return nil } -func (gui *Gui) GetPr(branch *models.Branch) (*models.GithubPullRequest, bool, error) { - prs, err := git_commands.GenerateGithubPullRequestMap( - gui.State.GithubState.RecentPRs, - []*models.Branch{branch}, - gui.State.Remotes, - ) - if err != nil { - return nil, false, err - } - - pr, hasPr := prs[branch] - - return pr, hasPr, nil -} - -func (gui *Gui) OnUIThread(f func() error) { +func (gui *Gui) onUIThread(f func() error) { gui.g.Update(func(*gocui.Gui) error { return f() }) diff --git a/pkg/gui/gui_common.go b/pkg/gui/gui_common.go new file mode 100644 index 000000000..835aa4f54 --- /dev/null +++ b/pkg/gui/gui_common.go @@ -0,0 +1,104 @@ +package gui + +import ( + "errors" + + "github.com/jesseduffield/lazygit/pkg/commands/oscommands" + "github.com/jesseduffield/lazygit/pkg/config" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +// hacking this by including the gui struct for now until we split more things out +type guiCommon struct { + gui *Gui + types.IPopupHandler +} + +var _ types.IGuiCommon = &guiCommon{} + +func (self *guiCommon) LogAction(msg string) { + self.gui.LogAction(msg) +} + +func (self *guiCommon) LogCommand(cmdStr string, isCommandLine bool) { + self.gui.LogCommand(cmdStr, isCommandLine) +} + +func (self *guiCommon) Refresh(opts types.RefreshOptions) error { + return self.gui.Refresh(opts) +} + +func (self *guiCommon) PostRefreshUpdate(context types.Context) error { + return self.gui.postRefreshUpdate(context) +} + +func (self *guiCommon) RunSubprocessAndRefresh(cmdObj oscommands.ICmdObj) error { + return self.gui.runSubprocessWithSuspenseAndRefresh(cmdObj) +} + +func (self *guiCommon) RunSubprocess(cmdObj oscommands.ICmdObj) (bool, error) { + return self.gui.runSubprocessWithSuspense(cmdObj) +} + +func (self *guiCommon) PushContext(context types.Context, opts ...types.OnFocusOpts) error { + singleOpts := types.OnFocusOpts{} + if len(opts) > 0 { + // using triple dot but you should only ever pass one of these opt structs + if len(opts) > 1 { + return errors.New("cannot pass multiple opts to pushContext") + } + + singleOpts = opts[0] + } + + return self.gui.pushContext(context, singleOpts) +} + +func (self *guiCommon) PopContext() error { + return self.gui.popContext() +} + +func (self *guiCommon) CurrentContext() types.Context { + return self.gui.currentContext() +} + +func (self *guiCommon) CurrentStaticContext() types.Context { + return self.gui.currentStaticContext() +} + +func (self *guiCommon) IsCurrentContext(c types.Context) bool { + return self.CurrentContext().GetKey() == c.GetKey() +} + +func (self *guiCommon) GetAppState() *config.AppState { + return self.gui.Config.GetAppState() +} + +func (self *guiCommon) SaveAppState() error { + return self.gui.Config.SaveAppState() +} + +func (self *guiCommon) Render() { + self.gui.render() +} + +func (self *guiCommon) OpenSearch() { + _ = self.gui.handleOpenSearch(self.gui.currentViewName()) +} + +func (self *guiCommon) OnUIThread(f func() error) { + self.gui.onUIThread(f) +} + +func (self *guiCommon) RenderToMainViews(opts types.RefreshMainOpts) error { + return self.gui.refreshMainViews(opts) +} + +func (self *guiCommon) MainViewPairs() types.MainViewPairs { + return types.MainViewPairs{ + Normal: self.gui.normalMainContextPair(), + Staging: self.gui.stagingMainContextPair(), + PatchBuilding: self.gui.patchBuildingMainContextPair(), + MergeConflicts: self.gui.mergingMainContextPair(), + } +} diff --git a/pkg/gui/gui_driver.go b/pkg/gui/gui_driver.go new file mode 100644 index 000000000..860c6c9b8 --- /dev/null +++ b/pkg/gui/gui_driver.go @@ -0,0 +1,73 @@ +package gui + +import ( + "time" + + "github.com/gdamore/tcell/v2" + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/config" + "github.com/jesseduffield/lazygit/pkg/gui/keybindings" + "github.com/jesseduffield/lazygit/pkg/gui/types" + integrationTypes "github.com/jesseduffield/lazygit/pkg/integration/types" +) + +// this gives our integration test a way of interacting with the gui for sending keypresses +// and reading state. +type GuiDriver struct { + gui *Gui +} + +var _ integrationTypes.GuiDriver = &GuiDriver{} + +func (self *GuiDriver) PressKey(keyStr string) { + key := keybindings.GetKey(keyStr) + + var r rune + var tcellKey tcell.Key + switch v := key.(type) { + case rune: + r = v + tcellKey = tcell.KeyRune + case gocui.Key: + tcellKey = tcell.Key(v) + } + + self.gui.g.ReplayedEvents.Keys <- gocui.NewTcellKeyEventWrapper( + tcell.NewEventKey(tcellKey, r, tcell.ModNone), + 0, + ) +} + +func (self *GuiDriver) Keys() config.KeybindingConfig { + return self.gui.Config.GetUserConfig().Keybinding +} + +func (self *GuiDriver) CurrentContext() types.Context { + return self.gui.c.CurrentContext() +} + +func (self *GuiDriver) Model() *types.Model { + return self.gui.State.Model +} + +func (self *GuiDriver) Fail(message string) { + self.gui.g.Close() + // need to give the gui time to close + time.Sleep(time.Millisecond * 100) + panic(message) +} + +// logs to the normal place that you log to i.e. viewable with `lazygit --logs` +func (self *GuiDriver) Log(message string) { + self.gui.c.Log.Warn(message) +} + +// logs in the actual UI (in the commands panel) +func (self *GuiDriver) LogUI(message string) { + self.gui.c.LogAction(message) +} + +func (self *GuiDriver) CheckedOutRef() *models.Branch { + return self.gui.helpers.Refs.GetCheckedOutRef() +} diff --git a/pkg/gui/gui_test.go b/pkg/gui/gui_test.go deleted file mode 100644 index e35ab1896..000000000 --- a/pkg/gui/gui_test.go +++ /dev/null @@ -1,81 +0,0 @@ -//go:build !windows -// +build !windows - -package gui - -import ( - "fmt" - "io" - "io/ioutil" - "os" - "os/exec" - "testing" - - "github.com/creack/pty" - "github.com/jesseduffield/lazygit/pkg/integration" - "github.com/stretchr/testify/assert" -) - -// This file is quite similar to integration/main.go. The main difference is that this file is -// run via `go test` whereas the other is run via `test/lazyintegration/main.go` which provides -// a convenient gui wrapper around our integration tests. The `go test` approach is better -// for CI and for running locally in the background to ensure you haven't broken -// anything while making changes. If you want to visually see what's happening when a test is run, -// you'll need to take the other approach -// -// As for this file, to run an integration test, e.g. for test 'commit', go: -// go test pkg/gui/gui_test.go -run /commit -// -// To update a snapshot for an integration test, pass UPDATE_SNAPSHOTS=true -// UPDATE_SNAPSHOTS=true go test pkg/gui/gui_test.go -run /commit -// -// integration tests are run in test/integration//actual and the final test does -// not clean up that directory so you can cd into it to see for yourself what -// happened when a test fails. -// -// To override speed, pass e.g. `SPEED=1` as an env var. Otherwise we start each test -// at a high speed and then drop down to lower speeds upon each failure until finally -// trying at the original playback speed (speed 1). A speed of 2 represents twice the -// original playback speed. Speed may be a decimal. - -func Test(t *testing.T) { - mode := integration.GetModeFromEnv() - speedEnv := os.Getenv("SPEED") - includeSkipped := os.Getenv("INCLUDE_SKIPPED") != "" - - err := integration.RunTests( - t.Logf, - runCmdHeadless, - func(test *integration.Test, f func(*testing.T) error) { - t.Run(test.Name, func(t *testing.T) { - err := f(t) - assert.NoError(t, err) - }) - }, - mode, - speedEnv, - func(t *testing.T, expected string, actual string, prefix string) { - assert.Equal(t, expected, actual, fmt.Sprintf("Unexpected %s. Expected:\n%s\nActual:\n%s\n", prefix, expected, actual)) - }, - includeSkipped, - ) - - assert.NoError(t, err) -} - -func runCmdHeadless(cmd *exec.Cmd) error { - cmd.Env = append( - cmd.Env, - "HEADLESS=true", - "TERM=xterm", - ) - - f, err := pty.StartWithSize(cmd, &pty.Winsize{Rows: 100, Cols: 100}) - if err != nil { - return err - } - - _, _ = io.Copy(ioutil.Discard, f) - - return f.Close() -} diff --git a/pkg/gui/information_panel.go b/pkg/gui/information_panel.go index d09f495c5..1577e3a2e 100644 --- a/pkg/gui/information_panel.go +++ b/pkg/gui/information_panel.go @@ -3,26 +3,38 @@ package gui import ( "fmt" + "github.com/jesseduffield/generics/slices" "github.com/jesseduffield/lazygit/pkg/constants" "github.com/jesseduffield/lazygit/pkg/gui/style" + "github.com/mattn/go-runewidth" ) func (gui *Gui) informationStr() string { - for _, mode := range gui.modeStatuses() { - if mode.isActive() { - return mode.description() - } + if activeMode, ok := gui.getActiveMode(); ok { + return activeMode.description() } if gui.g.Mouse { - donate := style.FgMagenta.SetUnderline().Sprint(gui.Tr.Donate) - askQuestion := style.FgYellow.SetUnderline().Sprint(gui.Tr.AskQuestion) + donate := style.FgMagenta.SetUnderline().Sprint(gui.c.Tr.Donate) + askQuestion := style.FgYellow.SetUnderline().Sprint(gui.c.Tr.AskQuestion) return fmt.Sprintf("%s %s %s", donate, askQuestion, gui.Config.GetVersion()) } else { return gui.Config.GetVersion() } } +func (gui *Gui) getActiveMode() (modeStatus, bool) { + return slices.Find(gui.modeStatuses(), func(mode modeStatus) bool { + return mode.isActive() + }) +} + +func (gui *Gui) isAnyModeActive() bool { + return slices.Some(gui.modeStatuses(), func(mode modeStatus) bool { + return mode.isActive() + }) +} + func (gui *Gui) handleInfoClick() error { if !gui.g.Mouse { return nil @@ -33,20 +45,18 @@ func (gui *Gui) handleInfoClick() error { cx, _ := view.Cursor() width, _ := view.Size() - for _, mode := range gui.modeStatuses() { - if mode.isActive() { - if width-cx > len(gui.Tr.ResetInParentheses) { - return nil - } - return mode.reset() + if activeMode, ok := gui.getActiveMode(); ok { + if width-cx > runewidth.StringWidth(gui.c.Tr.ResetInParentheses) { + return nil } + return activeMode.reset() } // if we're not in an active mode we show the donate button - if cx <= len(gui.Tr.Donate) { - return gui.OSCommand.OpenLink(constants.Links.Donate) - } else if cx <= len(gui.Tr.Donate)+1+len(gui.Tr.AskQuestion) { - return gui.OSCommand.OpenLink(constants.Links.Discussions) + if cx <= runewidth.StringWidth(gui.c.Tr.Donate) { + return gui.os.OpenLink(constants.Links.Donate) + } else if cx <= runewidth.StringWidth(gui.c.Tr.Donate)+1+runewidth.StringWidth(gui.c.Tr.AskQuestion) { + return gui.os.OpenLink(constants.Links.Discussions) } return nil } diff --git a/pkg/gui/keybindings.go b/pkg/gui/keybindings.go index 93d956061..8982a3056 100644 --- a/pkg/gui/keybindings.go +++ b/pkg/gui/keybindings.go @@ -1,1854 +1,427 @@ package gui import ( - "fmt" "log" - "strings" - - "unicode/utf8" "github.com/jesseduffield/gocui" - "github.com/jesseduffield/lazygit/pkg/constants" + "github.com/jesseduffield/lazygit/pkg/gui/controllers/helpers" + "github.com/jesseduffield/lazygit/pkg/gui/keybindings" + "github.com/jesseduffield/lazygit/pkg/gui/types" ) -// Binding - a keybinding mapping a key and modifier to a handler. The keypress -// is only handled if the given view has focus, or handled globally if the view -// is "" -type Binding struct { - ViewName string - Contexts []string - Handler func() error - Key interface{} // FIXME: find out how to get `gocui.Key | rune` - Modifier gocui.Modifier - Description string - Alternative string - Tag string // e.g. 'navigation'. Used for grouping things in the cheatsheet - OpensMenu bool -} - -// GetDisplayStrings returns the display string of a file -func (b *Binding) GetDisplayStrings(isFocused bool) []string { - return []string{GetKeyDisplay(b.Key), b.Description} -} - -var keyMapReversed = map[gocui.Key]string{ - gocui.KeyF1: "f1", - gocui.KeyF2: "f2", - gocui.KeyF3: "f3", - gocui.KeyF4: "f4", - gocui.KeyF5: "f5", - gocui.KeyF6: "f6", - gocui.KeyF7: "f7", - gocui.KeyF8: "f8", - gocui.KeyF9: "f9", - gocui.KeyF10: "f10", - gocui.KeyF11: "f11", - gocui.KeyF12: "f12", - gocui.KeyInsert: "insert", - gocui.KeyDelete: "delete", - gocui.KeyHome: "home", - gocui.KeyEnd: "end", - gocui.KeyPgup: "pgup", - gocui.KeyPgdn: "pgdown", - gocui.KeyArrowUp: "▲", - gocui.KeyArrowDown: "▼", - gocui.KeyArrowLeft: "◄", - gocui.KeyArrowRight: "►", - gocui.KeyTab: "tab", // ctrl+i - gocui.KeyBacktab: "shift+tab", - gocui.KeyEnter: "enter", // ctrl+m - gocui.KeyAltEnter: "alt+enter", - gocui.KeyEsc: "esc", // ctrl+[, ctrl+3 - gocui.KeyBackspace: "backspace", // ctrl+h - gocui.KeyCtrlSpace: "ctrl+space", // ctrl+~, ctrl+2 - gocui.KeyCtrlSlash: "ctrl+/", // ctrl+_ - gocui.KeySpace: "space", - gocui.KeyCtrlA: "ctrl+a", - gocui.KeyCtrlB: "ctrl+b", - gocui.KeyCtrlC: "ctrl+c", - gocui.KeyCtrlD: "ctrl+d", - gocui.KeyCtrlE: "ctrl+e", - gocui.KeyCtrlF: "ctrl+f", - gocui.KeyCtrlG: "ctrl+g", - gocui.KeyCtrlJ: "ctrl+j", - gocui.KeyCtrlK: "ctrl+k", - gocui.KeyCtrlL: "ctrl+l", - gocui.KeyCtrlN: "ctrl+n", - gocui.KeyCtrlO: "ctrl+o", - gocui.KeyCtrlP: "ctrl+p", - gocui.KeyCtrlQ: "ctrl+q", - gocui.KeyCtrlR: "ctrl+r", - gocui.KeyCtrlS: "ctrl+s", - gocui.KeyCtrlT: "ctrl+t", - gocui.KeyCtrlU: "ctrl+u", - gocui.KeyCtrlV: "ctrl+v", - gocui.KeyCtrlW: "ctrl+w", - gocui.KeyCtrlX: "ctrl+x", - gocui.KeyCtrlY: "ctrl+y", - gocui.KeyCtrlZ: "ctrl+z", - gocui.KeyCtrl4: "ctrl+4", // ctrl+\ - gocui.KeyCtrl5: "ctrl+5", // ctrl+] - gocui.KeyCtrl6: "ctrl+6", - gocui.KeyCtrl8: "ctrl+8", -} - -var keymap = map[string]interface{}{ - "": gocui.KeyCtrlA, - "": gocui.KeyCtrlB, - "": gocui.KeyCtrlC, - "": gocui.KeyCtrlD, - "": gocui.KeyCtrlE, - "": gocui.KeyCtrlF, - "": gocui.KeyCtrlG, - "": gocui.KeyCtrlH, - "": gocui.KeyCtrlI, - "": gocui.KeyCtrlJ, - "": gocui.KeyCtrlK, - "": gocui.KeyCtrlL, - "": gocui.KeyCtrlM, - "": gocui.KeyCtrlN, - "": gocui.KeyCtrlO, - "": gocui.KeyCtrlP, - "": gocui.KeyCtrlQ, - "": gocui.KeyCtrlR, - "": gocui.KeyCtrlS, - "": gocui.KeyCtrlT, - "": gocui.KeyCtrlU, - "": gocui.KeyCtrlV, - "": gocui.KeyCtrlW, - "": gocui.KeyCtrlX, - "": gocui.KeyCtrlY, - "": gocui.KeyCtrlZ, - "": gocui.KeyCtrlTilde, - "": gocui.KeyCtrl2, - "": gocui.KeyCtrl3, - "": gocui.KeyCtrl4, - "": gocui.KeyCtrl5, - "": gocui.KeyCtrl6, - "": gocui.KeyCtrl7, - "": gocui.KeyCtrl8, - "": gocui.KeyCtrlSpace, - "": gocui.KeyCtrlBackslash, - "": gocui.KeyCtrlLsqBracket, - "": gocui.KeyCtrlRsqBracket, - "": gocui.KeyCtrlSlash, - "": gocui.KeyCtrlUnderscore, - "": gocui.KeyBackspace, - "": gocui.KeyTab, - "": gocui.KeyBacktab, - "": gocui.KeyEnter, - "": gocui.KeyAltEnter, - "": gocui.KeyEsc, - "": gocui.KeySpace, - "": gocui.KeyF1, - "": gocui.KeyF2, - "": gocui.KeyF3, - "": gocui.KeyF4, - "": gocui.KeyF5, - "": gocui.KeyF6, - "": gocui.KeyF7, - "": gocui.KeyF8, - "": gocui.KeyF9, - "": gocui.KeyF10, - "": gocui.KeyF11, - "": gocui.KeyF12, - "": gocui.KeyInsert, - "": gocui.KeyDelete, - "": gocui.KeyHome, - "": gocui.KeyEnd, - "": gocui.KeyPgup, - "": gocui.KeyPgdn, - "": gocui.KeyArrowUp, - "": gocui.KeyArrowDown, - "": gocui.KeyArrowLeft, - "": gocui.KeyArrowRight, -} - -func (gui *Gui) getKeyDisplay(name string) string { - key := gui.getKey(name) - return GetKeyDisplay(key) -} - -func GetKeyDisplay(key interface{}) string { - keyInt := 0 - - switch key := key.(type) { - case rune: - keyInt = int(key) - case gocui.Key: - value, ok := keyMapReversed[key] - if ok { - return value +func (gui *Gui) noPopupPanel(f func() error) func() error { + return func() error { + if gui.popupPanelFocused() { + return nil } - keyInt = int(key) + + return f() + } +} + +// only to be called from the cheatsheet generate script. This mutates the Gui struct. +func (self *Gui) GetCheatsheetKeybindings() []*types.Binding { + self.g = &gocui.Gui{} + if err := self.createAllViews(); err != nil { + panic(err) + } + // need to instantiate views + self.helpers = helpers.NewStubHelpers() + self.State = &GuiRepoState{} + self.State.Contexts = self.contextTree() + self.resetControllers() + bindings, _ := self.GetInitialKeybindings() + return bindings +} + +// renaming receiver to 'self' to aid refactoring. Will probably end up moving all Gui handlers to this pattern eventually. +func (self *Gui) GetInitialKeybindings() ([]*types.Binding, []*gocui.ViewMouseBinding) { + config := self.c.UserConfig.Keybinding + + guards := types.KeybindingGuards{ + OutsideFilterMode: self.outsideFilterMode, + NoPopupPanel: self.noPopupPanel, } - return fmt.Sprintf("%c", keyInt) -} - -func (gui *Gui) getKey(key string) interface{} { - runeCount := utf8.RuneCountInString(key) - if runeCount > 1 { - binding := keymap[strings.ToLower(key)] - if binding == nil { - log.Fatalf("Unrecognized key %s for keybinding. For permitted values see %s", strings.ToLower(key), constants.Links.Docs.CustomKeybindings) - } else { - return binding - } - } else if runeCount == 1 { - return []rune(key)[0] + opts := types.KeybindingsOpts{ + GetKey: keybindings.GetKey, + Config: config, + Guards: guards, } - log.Fatal("Key empty for keybinding: " + strings.ToLower(key)) - return nil -} -// GetInitialKeybindings is a function. -func (gui *Gui) GetInitialKeybindings() []*Binding { - config := gui.UserConfig.Keybinding - - bindings := []*Binding{ + bindings := []*types.Binding{ { ViewName: "", - Key: gui.getKey(config.Universal.Quit), + Key: opts.GetKey(opts.Config.Universal.Quit), Modifier: gocui.ModNone, - Handler: gui.handleQuit, + Handler: self.handleQuit, }, { ViewName: "", - Key: gui.getKey(config.Universal.QuitWithoutChangingDirectory), + Key: opts.GetKey(opts.Config.Universal.QuitWithoutChangingDirectory), Modifier: gocui.ModNone, - Handler: gui.handleQuitWithoutChangingDirectory, + Handler: self.handleQuitWithoutChangingDirectory, }, { ViewName: "", - Key: gui.getKey(config.Universal.QuitAlt1), + Key: opts.GetKey(opts.Config.Universal.QuitAlt1), Modifier: gocui.ModNone, - Handler: gui.handleQuit, + Handler: self.handleQuit, }, { ViewName: "", - Key: gui.getKey(config.Universal.Return), + Key: opts.GetKey(opts.Config.Universal.Return), Modifier: gocui.ModNone, - Handler: gui.handleTopLevelReturn, + Handler: self.handleTopLevelReturn, }, { ViewName: "", - Key: gui.getKey(config.Universal.OpenRecentRepos), - Handler: gui.handleCreateRecentReposMenu, - Alternative: "", - Description: gui.Tr.SwitchRepo, + Key: opts.GetKey(opts.Config.Universal.OpenRecentRepos), + Handler: self.handleCreateRecentReposMenu, + Description: self.c.Tr.SwitchRepo, }, { ViewName: "", - Key: gui.getKey(config.Universal.ScrollUpMain), - Handler: gui.scrollUpMain, - Alternative: "fn+up", - Description: gui.Tr.LcScrollUpMainPanel, + Key: opts.GetKey(opts.Config.Universal.ScrollUpMain), + Handler: self.scrollUpMain, + Alternative: "fn+up/shift+k", + Description: self.c.Tr.LcScrollUpMainPanel, }, { ViewName: "", - Key: gui.getKey(config.Universal.ScrollDownMain), - Handler: gui.scrollDownMain, - Alternative: "fn+down", - Description: gui.Tr.LcScrollDownMainPanel, + Key: opts.GetKey(opts.Config.Universal.ScrollDownMain), + Handler: self.scrollDownMain, + Alternative: "fn+down/shift+j", + Description: self.c.Tr.LcScrollDownMainPanel, }, { ViewName: "", - Key: gui.getKey(config.Universal.ScrollUpMainAlt1), + Key: opts.GetKey(opts.Config.Universal.ScrollUpMainAlt1), Modifier: gocui.ModNone, - Handler: gui.scrollUpMain, + Handler: self.scrollUpMain, }, { ViewName: "", - Key: gui.getKey(config.Universal.ScrollDownMainAlt1), + Key: opts.GetKey(opts.Config.Universal.ScrollDownMainAlt1), Modifier: gocui.ModNone, - Handler: gui.scrollDownMain, + Handler: self.scrollDownMain, }, { ViewName: "", - Key: gui.getKey(config.Universal.ScrollUpMainAlt2), + Key: opts.GetKey(opts.Config.Universal.ScrollUpMainAlt2), Modifier: gocui.ModNone, - Handler: gui.scrollUpMain, + Handler: self.scrollUpMain, }, { ViewName: "", - Key: gui.getKey(config.Universal.ScrollDownMainAlt2), + Key: opts.GetKey(opts.Config.Universal.ScrollDownMainAlt2), Modifier: gocui.ModNone, - Handler: gui.scrollDownMain, + Handler: self.scrollDownMain, }, { ViewName: "", - Key: gui.getKey(config.Universal.CreateRebaseOptionsMenu), - Handler: gui.handleCreateRebaseOptionsMenu, - Description: gui.Tr.ViewMergeRebaseOptions, + Key: opts.GetKey(opts.Config.Universal.CreateRebaseOptionsMenu), + Handler: self.helpers.MergeAndRebase.CreateRebaseOptionsMenu, + Description: self.c.Tr.ViewMergeRebaseOptions, OpensMenu: true, }, { ViewName: "", - Key: gui.getKey(config.Universal.CreatePatchOptionsMenu), - Handler: gui.handleCreatePatchOptionsMenu, - Description: gui.Tr.ViewPatchOptions, + Key: opts.GetKey(opts.Config.Universal.CreatePatchOptionsMenu), + Handler: self.handleCreatePatchOptionsMenu, + Description: self.c.Tr.ViewPatchOptions, OpensMenu: true, }, { ViewName: "", - Key: gui.getKey(config.Universal.PushFiles), - Handler: gui.pushFiles, - Description: gui.Tr.LcPush, + Key: opts.GetKey(opts.Config.Universal.Refresh), + Handler: self.handleRefresh, + Description: self.c.Tr.LcRefresh, }, { ViewName: "", - Key: gui.getKey(config.Universal.PullFiles), - Handler: gui.handlePullFiles, - Description: gui.Tr.LcPull, - }, - { - ViewName: "", - Key: gui.getKey(config.Universal.Refresh), - Handler: gui.handleRefresh, - Description: gui.Tr.LcRefresh, - }, - { - ViewName: "", - Key: gui.getKey(config.Universal.OptionMenu), - Handler: gui.handleCreateOptionsMenu, - Description: gui.Tr.LcOpenMenu, + Key: opts.GetKey(opts.Config.Universal.OptionMenu), + Handler: self.handleCreateOptionsMenu, + Description: self.c.Tr.LcOpenMenu, OpensMenu: true, }, { ViewName: "", - Key: gui.getKey(config.Universal.OptionMenuAlt1), + Key: opts.GetKey(opts.Config.Universal.OptionMenuAlt1), Modifier: gocui.ModNone, - Handler: gui.handleCreateOptionsMenu, - }, - { - ViewName: "", - Key: gocui.MouseMiddle, - Modifier: gocui.ModNone, - Handler: gui.handleCreateOptionsMenu, - }, - { - ViewName: "", - Key: gui.getKey(config.Universal.Undo), - Handler: gui.reflogUndo, - Description: gui.Tr.LcUndoReflog, - }, - { - ViewName: "", - Key: gui.getKey(config.Universal.Redo), - Handler: gui.reflogRedo, - Description: gui.Tr.LcRedoReflog, + Handler: self.handleCreateOptionsMenu, }, { ViewName: "status", - Key: gui.getKey(config.Universal.Edit), - Handler: gui.handleEditConfig, - Description: gui.Tr.EditConfig, + Key: opts.GetKey(opts.Config.Universal.Edit), + Handler: self.handleEditConfig, + Description: self.c.Tr.EditConfig, }, { ViewName: "", - Key: gui.getKey(config.Universal.NextScreenMode), - Handler: gui.nextScreenMode, - Description: gui.Tr.LcNextScreenMode, + Key: opts.GetKey(opts.Config.Universal.NextScreenMode), + Handler: self.nextScreenMode, + Description: self.c.Tr.LcNextScreenMode, }, { ViewName: "", - Key: gui.getKey(config.Universal.PrevScreenMode), - Handler: gui.prevScreenMode, - Description: gui.Tr.LcPrevScreenMode, + Key: opts.GetKey(opts.Config.Universal.PrevScreenMode), + Handler: self.prevScreenMode, + Description: self.c.Tr.LcPrevScreenMode, }, { ViewName: "status", - Key: gui.getKey(config.Universal.OpenFile), - Handler: gui.handleOpenConfig, - Description: gui.Tr.OpenConfig, + Key: opts.GetKey(opts.Config.Universal.OpenFile), + Handler: self.handleOpenConfig, + Description: self.c.Tr.OpenConfig, }, { ViewName: "status", - Key: gui.getKey(config.Status.CheckForUpdate), - Handler: gui.handleCheckForUpdate, - Description: gui.Tr.LcCheckForUpdate, + Key: opts.GetKey(opts.Config.Status.CheckForUpdate), + Handler: self.handleCheckForUpdate, + Description: self.c.Tr.LcCheckForUpdate, }, { ViewName: "status", - Key: gui.getKey(config.Status.RecentRepos), - Handler: gui.handleCreateRecentReposMenu, - Description: gui.Tr.SwitchRepo, + Key: opts.GetKey(opts.Config.Status.RecentRepos), + Handler: self.handleCreateRecentReposMenu, + Description: self.c.Tr.SwitchRepo, }, { ViewName: "status", - Key: gui.getKey(config.Status.AllBranchesLogGraph), - Handler: gui.handleShowAllBranchLogs, - Description: gui.Tr.LcAllBranchesLogGraph, + Key: opts.GetKey(opts.Config.Status.AllBranchesLogGraph), + Handler: self.handleShowAllBranchLogs, + Description: self.c.Tr.LcAllBranchesLogGraph, }, { ViewName: "files", - Key: gui.getKey(""), - Handler: gui.handleStatusFilterPressed, - Description: gui.Tr.LcCommitFileFilter, + Key: opts.GetKey(opts.Config.Universal.CopyToClipboard), + Handler: self.handleCopySelectedSideContextItemToClipboard, + Description: self.c.Tr.LcCopyFileNameToClipboard, }, { - ViewName: "files", - Contexts: []string{string(FILES_CONTEXT_KEY)}, - Key: gui.getKey(config.Files.CommitChanges), - Handler: gui.handleCommitPress, - Description: gui.Tr.CommitChanges, - }, - { - ViewName: "files", - Contexts: []string{string(FILES_CONTEXT_KEY)}, - Key: gui.getKey(config.Files.CommitChangesWithoutHook), - Handler: gui.handleWIPCommitPress, - Description: gui.Tr.LcCommitChangesWithoutHook, - }, - { - ViewName: "files", - Contexts: []string{string(FILES_CONTEXT_KEY)}, - Key: gui.getKey(config.Files.AmendLastCommit), - Handler: gui.handleAmendCommitPress, - Description: gui.Tr.AmendLastCommit, - }, - { - ViewName: "files", - Contexts: []string{string(FILES_CONTEXT_KEY)}, - Key: gui.getKey(config.Files.CommitChangesWithEditor), - Handler: gui.handleCommitEditorPress, - Description: gui.Tr.CommitChangesWithEditor, - }, - { - ViewName: "files", - Contexts: []string{string(FILES_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.Select), - Handler: gui.handleFilePress, - Description: gui.Tr.LcToggleStaged, - }, - { - ViewName: "files", - Contexts: []string{string(FILES_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.Remove), - Handler: gui.handleCreateDiscardMenu, - Description: gui.Tr.LcViewDiscardOptions, - OpensMenu: true, - }, - { - ViewName: "files", - Contexts: []string{string(FILES_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.Edit), - Handler: gui.handleFileEdit, - Description: gui.Tr.LcEditFile, - }, - { - ViewName: "files", - Contexts: []string{string(FILES_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.OpenFile), - Handler: gui.handleFileOpen, - Description: gui.Tr.LcOpenFile, - }, - { - ViewName: "files", - Contexts: []string{string(FILES_CONTEXT_KEY)}, - Key: gui.getKey(config.Files.IgnoreFile), - Handler: gui.handleIgnoreFile, - Description: gui.Tr.LcIgnoreFile, - }, - { - ViewName: "files", - Contexts: []string{string(FILES_CONTEXT_KEY)}, - Key: gui.getKey(config.Files.RefreshFiles), - Handler: gui.handleRefreshFiles, - Description: gui.Tr.LcRefreshFiles, - }, - { - ViewName: "files", - Contexts: []string{string(FILES_CONTEXT_KEY)}, - Key: gui.getKey(config.Files.StashAllChanges), - Handler: gui.handleStashChanges, - Description: gui.Tr.LcStashAllChanges, - }, - { - ViewName: "files", - Contexts: []string{string(FILES_CONTEXT_KEY)}, - Key: gui.getKey(config.Files.ViewStashOptions), - Handler: gui.handleCreateStashMenu, - Description: gui.Tr.LcViewStashOptions, - OpensMenu: true, - }, - { - ViewName: "files", - Contexts: []string{string(FILES_CONTEXT_KEY)}, - Key: gui.getKey(config.Files.ToggleStagedAll), - Handler: gui.handleStageAll, - Description: gui.Tr.LcToggleStagedAll, - }, - { - ViewName: "files", - Contexts: []string{string(FILES_CONTEXT_KEY)}, - Key: gui.getKey(config.Files.ViewResetOptions), - Handler: gui.handleCreateResetMenu, - Description: gui.Tr.LcViewResetOptions, - OpensMenu: true, - }, - { - ViewName: "files", - Contexts: []string{string(FILES_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.GoInto), - Handler: gui.handleEnterFile, - Description: gui.Tr.FileEnter, - }, - { - ViewName: "files", - Contexts: []string{string(FILES_CONTEXT_KEY)}, - Key: gui.getKey(config.Files.Fetch), - Handler: gui.handleGitFetch, - Description: gui.Tr.LcFetch, - }, - { - ViewName: "files", - Contexts: []string{string(FILES_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.CopyToClipboard), - Handler: gui.handleCopySelectedSideContextItemToClipboard, - Description: gui.Tr.LcCopyFileNameToClipboard, - }, - { - ViewName: "", - Key: gui.getKey(config.Universal.ExecuteCustomCommand), - Handler: gui.handleCustomCommand, - Description: gui.Tr.LcExecuteCustomCommand, - }, - { - ViewName: "files", - Contexts: []string{string(FILES_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.ViewResetOptions), - Handler: gui.handleCreateResetToUpstreamMenu, - Description: gui.Tr.LcViewResetToUpstreamOptions, - OpensMenu: true, - }, - { - ViewName: "files", - Contexts: []string{string(FILES_CONTEXT_KEY)}, - Key: gui.getKey(config.Files.ToggleTreeView), - Handler: gui.handleToggleFileTreeView, - Description: gui.Tr.LcToggleTreeView, - }, - { - ViewName: "files", - Contexts: []string{string(FILES_CONTEXT_KEY)}, - Key: gui.getKey(config.Files.OpenMergeTool), - Handler: gui.handleOpenMergeTool, - Description: gui.Tr.LcOpenMergeTool, - }, - { - ViewName: "branches", - Contexts: []string{string(LOCAL_BRANCHES_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.Select), - Handler: gui.handleBranchPress, - Description: gui.Tr.LcCheckout, - }, - { - ViewName: "branches", - Contexts: []string{string(LOCAL_BRANCHES_CONTEXT_KEY)}, - Key: gui.getKey(config.Branches.CreateOrShowPullRequest), - Handler: gui.handleCreateOrShowPullRequestPress, - Description: gui.Tr.LcCreateOrShowPullRequest, - }, - { - ViewName: "branches", - Contexts: []string{string(LOCAL_BRANCHES_CONTEXT_KEY)}, - Key: gui.getKey(config.Branches.ViewPullRequestOptions), - Handler: gui.handleCreateOrOpenPullRequestMenu, - Description: gui.Tr.LcCreateOrOpenPullRequestOptions, - OpensMenu: true, - }, - { - ViewName: "branches", - Contexts: []string{string(LOCAL_BRANCHES_CONTEXT_KEY)}, - Key: gui.getKey(config.Branches.CopyPullRequestURL), - Handler: gui.handleCopyPullRequestURLPress, - Description: gui.Tr.LcCopyPullRequestURL, - }, - { - ViewName: "branches", - Contexts: []string{string(LOCAL_BRANCHES_CONTEXT_KEY)}, - Key: gui.getKey(config.Branches.CheckoutBranchByName), - Handler: gui.handleCheckoutByName, - Description: gui.Tr.LcCheckoutByName, - }, - { - ViewName: "branches", - Contexts: []string{string(LOCAL_BRANCHES_CONTEXT_KEY)}, - Key: gui.getKey(config.Branches.ForceCheckoutBranch), - Handler: gui.handleForceCheckout, - Description: gui.Tr.LcForceCheckout, - }, - { - ViewName: "branches", - Contexts: []string{string(LOCAL_BRANCHES_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.New), - Handler: gui.handleNewBranchOffCurrentItem, - Description: gui.Tr.LcNewBranch, - }, - { - ViewName: "branches", - Contexts: []string{string(LOCAL_BRANCHES_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.Remove), - Handler: gui.handleDeleteBranch, - Description: gui.Tr.LcDeleteBranch, - }, - { - ViewName: "branches", - Contexts: []string{string(LOCAL_BRANCHES_CONTEXT_KEY)}, - Key: gui.getKey(config.Branches.RebaseBranch), - Handler: gui.handleRebaseOntoLocalBranch, - Description: gui.Tr.LcRebaseBranch, - }, - { - ViewName: "branches", - Contexts: []string{string(LOCAL_BRANCHES_CONTEXT_KEY)}, - Key: gui.getKey(config.Branches.MergeIntoCurrentBranch), - Handler: gui.handleMerge, - Description: gui.Tr.LcMergeIntoCurrentBranch, - }, - { - ViewName: "branches", - Contexts: []string{string(LOCAL_BRANCHES_CONTEXT_KEY)}, - Key: gui.getKey(config.Branches.ViewGitFlowOptions), - Handler: gui.handleCreateGitFlowMenu, - Description: gui.Tr.LcGitFlowOptions, - OpensMenu: true, - }, - { - ViewName: "branches", - Contexts: []string{string(LOCAL_BRANCHES_CONTEXT_KEY)}, - Key: gui.getKey(config.Branches.FastForward), - Handler: gui.handleFastForward, - Description: gui.Tr.FastForward, - }, - { - ViewName: "branches", - Contexts: []string{string(LOCAL_BRANCHES_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.ViewResetOptions), - Handler: gui.handleCreateResetToBranchMenu, - Description: gui.Tr.LcViewResetOptions, - OpensMenu: true, - }, - { - ViewName: "branches", - Contexts: []string{string(LOCAL_BRANCHES_CONTEXT_KEY)}, - Key: gui.getKey(config.Branches.RenameBranch), - Handler: gui.handleRenameBranch, - Description: gui.Tr.LcRenameBranch, - }, - { - ViewName: "branches", - Contexts: []string{string(LOCAL_BRANCHES_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.CopyToClipboard), - Handler: gui.handleCopySelectedSideContextItemToClipboard, - Description: gui.Tr.LcCopyBranchNameToClipboard, - }, - { - ViewName: "branches", - Contexts: []string{string(LOCAL_BRANCHES_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.GoInto), - Handler: gui.handleSwitchToSubCommits, - Description: gui.Tr.LcViewCommits, - }, - { - ViewName: "branches", - Contexts: []string{string(TAGS_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.Select), - Handler: gui.withSelectedTag(gui.handleCheckoutTag), - Description: gui.Tr.LcCheckout, - }, - { - ViewName: "branches", - Contexts: []string{string(TAGS_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.Remove), - Handler: gui.withSelectedTag(gui.handleDeleteTag), - Description: gui.Tr.LcDeleteTag, - }, - { - ViewName: "branches", - Contexts: []string{string(TAGS_CONTEXT_KEY)}, - Key: gui.getKey(config.Branches.PushTag), - Handler: gui.withSelectedTag(gui.handlePushTag), - Description: gui.Tr.LcPushTag, - }, - { - ViewName: "branches", - Contexts: []string{string(TAGS_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.New), - Handler: gui.handleCreateTag, - Description: gui.Tr.LcCreateTag, - }, - { - ViewName: "branches", - Contexts: []string{string(TAGS_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.ViewResetOptions), - Handler: gui.withSelectedTag(gui.handleCreateResetToTagMenu), - Description: gui.Tr.LcViewResetOptions, - OpensMenu: true, - }, - { - ViewName: "branches", - Contexts: []string{string(TAGS_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.GoInto), - Handler: gui.handleSwitchToSubCommits, - Description: gui.Tr.LcViewCommits, - }, - { - ViewName: "branches", - Contexts: []string{string(REMOTE_BRANCHES_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.Return), - Handler: gui.handleRemoteBranchesEscape, - Description: gui.Tr.ReturnToRemotesList, - }, - { - ViewName: "branches", - Contexts: []string{string(REMOTE_BRANCHES_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.ViewResetOptions), - Handler: gui.handleCreateResetToRemoteBranchMenu, - Description: gui.Tr.LcViewResetOptions, - OpensMenu: true, - }, - { - ViewName: "branches", - Contexts: []string{string(REMOTE_BRANCHES_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.GoInto), - Handler: gui.handleSwitchToSubCommits, - Description: gui.Tr.LcViewCommits, - }, - { - ViewName: "branches", - Contexts: []string{string(REMOTES_CONTEXT_KEY)}, - Key: gui.getKey(config.Branches.FetchRemote), - Handler: gui.handleFetchRemote, - Description: gui.Tr.LcFetchRemote, + ViewName: "localBranches", + Key: opts.GetKey(opts.Config.Universal.CopyToClipboard), + Handler: self.handleCopySelectedSideContextItemToClipboard, + Description: self.c.Tr.LcCopyBranchNameToClipboard, }, { ViewName: "commits", - Contexts: []string{string(BRANCH_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.OpenLogMenu), - Handler: gui.handleOpenLogMenu, - Description: gui.Tr.LcOpenLogMenu, - OpensMenu: true, + Key: opts.GetKey(opts.Config.Universal.CopyToClipboard), + Handler: self.handleCopySelectedSideContextItemToClipboard, + Description: self.c.Tr.LcCopyCommitShaToClipboard, }, { ViewName: "commits", - Contexts: []string{string(BRANCH_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.SquashDown), - Handler: gui.handleCommitSquashDown, - Description: gui.Tr.LcSquashDown, + Key: opts.GetKey(opts.Config.Commits.ResetCherryPick), + Handler: self.helpers.CherryPick.Reset, + Description: self.c.Tr.LcResetCherryPick, }, { - ViewName: "commits", - Contexts: []string{string(BRANCH_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.RenameCommit), - Handler: gui.handleRewordCommit, - Description: gui.Tr.LcRewordCommit, + ViewName: "reflogCommits", + Key: opts.GetKey(opts.Config.Universal.CopyToClipboard), + Handler: self.handleCopySelectedSideContextItemToClipboard, + Description: self.c.Tr.LcCopyCommitShaToClipboard, }, { - ViewName: "commits", - Contexts: []string{string(BRANCH_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.RenameCommitWithEditor), - Handler: gui.handleRewordCommitEditor, - Description: gui.Tr.LcRenameCommitEditor, - }, - { - ViewName: "commits", - Contexts: []string{string(BRANCH_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.ViewResetOptions), - Handler: gui.handleCreateCommitResetMenu, - Description: gui.Tr.LcResetToThisCommit, - }, - { - ViewName: "commits", - Contexts: []string{string(BRANCH_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.MarkCommitAsFixup), - Handler: gui.handleCommitFixup, - Description: gui.Tr.LcFixupCommit, - }, - { - ViewName: "commits", - Contexts: []string{string(BRANCH_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.CreateFixupCommit), - Handler: gui.handleCreateFixupCommit, - Description: gui.Tr.LcCreateFixupCommit, - }, - { - ViewName: "commits", - Contexts: []string{string(BRANCH_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.SquashAboveCommits), - Handler: gui.handleSquashAllAboveFixupCommits, - Description: gui.Tr.LcSquashAboveCommits, - }, - { - ViewName: "commits", - Contexts: []string{string(BRANCH_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.Remove), - Handler: gui.handleCommitDelete, - Description: gui.Tr.LcDeleteCommit, - }, - { - ViewName: "commits", - Contexts: []string{string(BRANCH_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.MoveDownCommit), - Handler: gui.handleCommitMoveDown, - Description: gui.Tr.LcMoveDownCommit, - }, - { - ViewName: "commits", - Contexts: []string{string(BRANCH_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.MoveUpCommit), - Handler: gui.handleCommitMoveUp, - Description: gui.Tr.LcMoveUpCommit, - }, - { - ViewName: "commits", - Contexts: []string{string(BRANCH_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.Edit), - Handler: gui.handleCommitEdit, - Description: gui.Tr.LcEditCommit, - }, - { - ViewName: "commits", - Contexts: []string{string(BRANCH_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.AmendToCommit), - Handler: gui.handleCommitAmendTo, - Description: gui.Tr.LcAmendToCommit, - }, - { - ViewName: "commits", - Contexts: []string{string(BRANCH_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.PickCommit), - Handler: gui.handleCommitPick, - Description: gui.Tr.LcPickCommit, - }, - { - ViewName: "commits", - Contexts: []string{string(BRANCH_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.RevertCommit), - Handler: gui.handleCommitRevert, - Description: gui.Tr.LcRevertCommit, - }, - { - ViewName: "commits", - Contexts: []string{string(BRANCH_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.CherryPickCopy), - Handler: gui.handleCopyCommit, - Description: gui.Tr.LcCherryPickCopy, - }, - { - ViewName: "commits", - Contexts: []string{string(BRANCH_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.CopyToClipboard), - Handler: gui.handleCopySelectedSideContextItemToClipboard, - Description: gui.Tr.LcCopyCommitShaToClipboard, - }, - { - ViewName: "commits", - Contexts: []string{string(BRANCH_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.CherryPickCopyRange), - Handler: gui.handleCopyCommitRange, - Description: gui.Tr.LcCherryPickCopyRange, - }, - { - ViewName: "commits", - Contexts: []string{string(BRANCH_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.PasteCommits), - Handler: gui.HandlePasteCommits, - Description: gui.Tr.LcPasteCommits, - }, - { - ViewName: "commits", - Contexts: []string{string(BRANCH_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.GoInto), - Handler: gui.handleViewCommitFiles, - Description: gui.Tr.LcViewCommitFiles, - }, - { - ViewName: "commits", - Contexts: []string{string(BRANCH_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.CheckoutCommit), - Handler: gui.handleCheckoutCommit, - Description: gui.Tr.LcCheckoutCommit, - }, - { - ViewName: "commits", - Contexts: []string{string(BRANCH_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.New), - Modifier: gocui.ModNone, - Handler: gui.handleNewBranchOffCurrentItem, - Description: gui.Tr.LcCreateNewBranchFromCommit, - }, - { - ViewName: "commits", - Contexts: []string{string(BRANCH_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.TagCommit), - Handler: gui.handleTagCommit, - Description: gui.Tr.LcTagCommit, - }, - { - ViewName: "commits", - Contexts: []string{string(BRANCH_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.ResetCherryPick), - Handler: gui.exitCherryPickingMode, - Description: gui.Tr.LcResetCherryPick, - }, - { - ViewName: "commits", - Contexts: []string{string(BRANCH_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.CopyCommitMessageToClipboard), - Handler: gui.handleCopySelectedCommitMessageToClipboard, - Description: gui.Tr.LcCopyCommitMessageToClipboard, - }, - { - ViewName: "commits", - Contexts: []string{string(BRANCH_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.OpenInBrowser), - Handler: gui.handleOpenCommitInBrowser, - Description: gui.Tr.LcOpenCommitInBrowser, - }, - { - ViewName: "commits", - Contexts: []string{string(BRANCH_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.ViewBisectOptions), - Handler: gui.handleOpenBisectMenu, - Description: gui.Tr.LcViewBisectOptions, - OpensMenu: true, - }, - { - ViewName: "commits", - Contexts: []string{string(REFLOG_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.GoInto), - Handler: gui.handleViewReflogCommitFiles, - Description: gui.Tr.LcViewCommitFiles, - }, - { - ViewName: "commits", - Contexts: []string{string(REFLOG_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.Select), - Handler: gui.handleCheckoutReflogCommit, - Description: gui.Tr.LcCheckoutCommit, - }, - { - ViewName: "commits", - Contexts: []string{string(REFLOG_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.ViewResetOptions), - Handler: gui.handleCreateReflogResetMenu, - Description: gui.Tr.LcViewResetOptions, - OpensMenu: true, - }, - { - ViewName: "commits", - Contexts: []string{string(REFLOG_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.CherryPickCopy), - Handler: gui.handleCopyCommit, - Description: gui.Tr.LcCherryPickCopy, - }, - { - ViewName: "commits", - Contexts: []string{string(REFLOG_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.CherryPickCopyRange), - Handler: gui.handleCopyCommitRange, - Description: gui.Tr.LcCherryPickCopyRange, - }, - { - ViewName: "commits", - Contexts: []string{string(REFLOG_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.ResetCherryPick), - Handler: gui.exitCherryPickingMode, - Description: gui.Tr.LcResetCherryPick, - }, - { - ViewName: "commits", - Contexts: []string{string(REFLOG_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.CopyToClipboard), - Handler: gui.handleCopySelectedSideContextItemToClipboard, - Description: gui.Tr.LcCopyCommitShaToClipboard, - }, - { - ViewName: "branches", - Contexts: []string{string(SUB_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.GoInto), - Handler: gui.handleViewSubCommitFiles, - Description: gui.Tr.LcViewCommitFiles, - }, - { - ViewName: "branches", - Contexts: []string{string(SUB_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.Select), - Handler: gui.handleCheckoutSubCommit, - Description: gui.Tr.LcCheckoutCommit, - }, - { - ViewName: "branches", - Contexts: []string{string(SUB_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.ViewResetOptions), - Handler: gui.handleCreateSubCommitResetMenu, - Description: gui.Tr.LcViewResetOptions, - OpensMenu: true, - }, - { - ViewName: "branches", - Contexts: []string{string(SUB_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.New), - Handler: gui.handleNewBranchOffCurrentItem, - Description: gui.Tr.LcNewBranch, - }, - { - ViewName: "branches", - Contexts: []string{string(SUB_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.CherryPickCopy), - Handler: gui.handleCopyCommit, - Description: gui.Tr.LcCherryPickCopy, - }, - { - ViewName: "branches", - Contexts: []string{string(SUB_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.CherryPickCopyRange), - Handler: gui.handleCopyCommitRange, - Description: gui.Tr.LcCherryPickCopyRange, - }, - { - ViewName: "branches", - Contexts: []string{string(SUB_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Commits.ResetCherryPick), - Handler: gui.exitCherryPickingMode, - Description: gui.Tr.LcResetCherryPick, - }, - { - ViewName: "branches", - Contexts: []string{string(SUB_COMMITS_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.CopyToClipboard), - Handler: gui.handleCopySelectedSideContextItemToClipboard, - Description: gui.Tr.LcCopyCommitShaToClipboard, - }, - { - ViewName: "stash", - Key: gui.getKey(config.Universal.GoInto), - Handler: gui.handleViewStashFiles, - Description: gui.Tr.LcViewStashFiles, - }, - { - ViewName: "stash", - Key: gui.getKey(config.Universal.Select), - Handler: gui.handleStashApply, - Description: gui.Tr.LcApply, - }, - { - ViewName: "stash", - Key: gui.getKey(config.Stash.PopStash), - Handler: gui.handleStashPop, - Description: gui.Tr.LcPop, - }, - { - ViewName: "stash", - Key: gui.getKey(config.Universal.Remove), - Handler: gui.handleStashDrop, - Description: gui.Tr.LcDrop, - }, - { - ViewName: "stash", - Key: gui.getKey(config.Universal.New), - Handler: gui.handleNewBranchOffCurrentItem, - Description: gui.Tr.LcNewBranch, - }, - { - ViewName: "commitMessage", - Key: gui.getKey(config.Universal.SubmitEditorText), - Modifier: gocui.ModNone, - Handler: gui.handleCommitConfirm, - }, - { - ViewName: "commitMessage", - Key: gui.getKey(config.Universal.Return), - Modifier: gocui.ModNone, - Handler: gui.handleCommitClose, - }, - { - ViewName: "credentials", - Key: gui.getKey(config.Universal.Confirm), - Modifier: gocui.ModNone, - Handler: gui.handleSubmitCredential, - }, - { - ViewName: "credentials", - Key: gui.getKey(config.Universal.Return), - Modifier: gocui.ModNone, - Handler: gui.handleCloseCredentialsView, - }, - { - ViewName: "menu", - Key: gui.getKey(config.Universal.Return), - Handler: gui.handleMenuClose, - Description: gui.Tr.LcCloseMenu, + ViewName: "subCommits", + Key: opts.GetKey(opts.Config.Universal.CopyToClipboard), + Handler: self.handleCopySelectedSideContextItemToClipboard, + Description: self.c.Tr.LcCopyCommitShaToClipboard, }, { ViewName: "information", Key: gocui.MouseLeft, Modifier: gocui.ModNone, - Handler: gui.handleInfoClick, + Handler: self.handleInfoClick, }, { ViewName: "commitFiles", - Key: gui.getKey(config.Universal.CopyToClipboard), - Handler: gui.handleCopySelectedSideContextItemToClipboard, - Description: gui.Tr.LcCopyCommitFileNameToClipboard, - }, - { - ViewName: "commitFiles", - Key: gui.getKey(config.CommitFiles.CheckoutCommitFile), - Handler: gui.handleCheckoutCommitFile, - Description: gui.Tr.LcCheckoutCommitFile, - }, - { - ViewName: "commitFiles", - Key: gui.getKey(config.Universal.Remove), - Handler: gui.handleDiscardOldFileChange, - Description: gui.Tr.LcDiscardOldFileChange, - }, - { - ViewName: "commitFiles", - Key: gui.getKey(config.Universal.OpenFile), - Handler: gui.handleOpenOldCommitFile, - Description: gui.Tr.LcOpenFile, - }, - { - ViewName: "commitFiles", - Key: gui.getKey(config.Universal.Edit), - Handler: gui.handleEditCommitFile, - Description: gui.Tr.LcEditFile, - }, - { - ViewName: "commitFiles", - Key: gui.getKey(config.Universal.Select), - Handler: gui.handleToggleFileForPatch, - Description: gui.Tr.LcToggleAddToPatch, - }, - { - ViewName: "commitFiles", - Key: gui.getKey(config.Universal.GoInto), - Handler: gui.handleEnterCommitFile, - Description: gui.Tr.LcEnterFile, - }, - { - ViewName: "commitFiles", - Key: gui.getKey(config.Files.ToggleTreeView), - Handler: gui.handleToggleCommitFileTreeView, - Description: gui.Tr.LcToggleTreeView, + Key: opts.GetKey(opts.Config.Universal.CopyToClipboard), + Handler: self.handleCopySelectedSideContextItemToClipboard, + Description: self.c.Tr.LcCopyCommitFileNameToClipboard, }, { ViewName: "", - Key: gui.getKey(config.Universal.FilteringMenu), - Handler: gui.handleCreateFilteringMenuPanel, - Description: gui.Tr.LcOpenFilteringMenu, + Key: opts.GetKey(opts.Config.Universal.FilteringMenu), + Handler: self.handleCreateFilteringMenuPanel, + Description: self.c.Tr.LcOpenFilteringMenu, OpensMenu: true, }, { ViewName: "", - Key: gui.getKey(config.Universal.DiffingMenu), - Handler: gui.handleCreateDiffingMenuPanel, - Description: gui.Tr.LcOpenDiffingMenu, + Key: opts.GetKey(opts.Config.Universal.DiffingMenu), + Handler: self.handleCreateDiffingMenuPanel, + Description: self.c.Tr.LcOpenDiffingMenu, OpensMenu: true, }, { ViewName: "", - Key: gui.getKey(config.Universal.DiffingMenuAlt), - Handler: gui.handleCreateDiffingMenuPanel, - Description: gui.Tr.LcOpenDiffingMenu, + Key: opts.GetKey(opts.Config.Universal.DiffingMenuAlt), + Handler: self.handleCreateDiffingMenuPanel, + Description: self.c.Tr.LcOpenDiffingMenu, OpensMenu: true, }, { ViewName: "", - Key: gui.getKey(config.Universal.ExtrasMenu), - Handler: gui.handleCreateExtrasMenuPanel, - Description: gui.Tr.LcOpenExtrasMenu, + Key: opts.GetKey(opts.Config.Universal.ExtrasMenu), + Handler: self.handleCreateExtrasMenuPanel, + Description: self.c.Tr.LcOpenExtrasMenu, OpensMenu: true, }, { ViewName: "secondary", Key: gocui.MouseWheelUp, Modifier: gocui.ModNone, - Handler: gui.scrollUpSecondary, + Handler: self.scrollUpSecondary, }, { ViewName: "secondary", Key: gocui.MouseWheelDown, Modifier: gocui.ModNone, - Handler: gui.scrollDownSecondary, - }, - { - ViewName: "secondary", - Contexts: []string{string(MAIN_NORMAL_CONTEXT_KEY)}, - Key: gocui.MouseLeft, - Modifier: gocui.ModNone, - Handler: gui.handleMouseDownSecondary, + Handler: self.scrollDownSecondary, }, { ViewName: "main", - Contexts: []string{string(MAIN_NORMAL_CONTEXT_KEY)}, Key: gocui.MouseWheelDown, - Handler: gui.scrollDownMain, - Description: gui.Tr.ScrollDown, + Handler: self.scrollDownMain, + Description: self.c.Tr.ScrollDown, Alternative: "fn+up", }, { ViewName: "main", - Contexts: []string{string(MAIN_NORMAL_CONTEXT_KEY)}, Key: gocui.MouseWheelUp, - Handler: gui.scrollUpMain, - Description: gui.Tr.ScrollUp, + Handler: self.scrollUpMain, + Description: self.c.Tr.ScrollUp, Alternative: "fn+down", }, - { - ViewName: "main", - Contexts: []string{string(MAIN_NORMAL_CONTEXT_KEY)}, - Key: gocui.MouseLeft, - Modifier: gocui.ModNone, - Handler: gui.handleMouseDownMain, - }, { ViewName: "secondary", - Contexts: []string{string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gocui.MouseLeft, - Modifier: gocui.ModNone, - Handler: gui.handleTogglePanelClick, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.Return), - Handler: gui.handleStagingEscape, - Description: gui.Tr.ReturnToFilesPanel, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.Select), - Handler: gui.handleToggleStagedSelection, - Description: gui.Tr.StageSelection, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.Remove), - Handler: gui.handleResetSelection, - Description: gui.Tr.ResetSelection, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.TogglePanel), - Handler: gui.handleTogglePanel, - Description: gui.Tr.TogglePanel, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_PATCH_BUILDING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.Return), - Handler: gui.handleEscapePatchBuildingPanel, - Description: gui.Tr.ExitLineByLineMode, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_PATCH_BUILDING_CONTEXT_KEY), string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.OpenFile), - Handler: gui.handleOpenFileAtLine, - Description: gui.Tr.LcOpenFile, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_PATCH_BUILDING_CONTEXT_KEY), string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.PrevItem), - Handler: gui.handleSelectPrevLine, - Description: gui.Tr.PrevLine, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_PATCH_BUILDING_CONTEXT_KEY), string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.NextItem), - Handler: gui.handleSelectNextLine, - Description: gui.Tr.NextLine, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_PATCH_BUILDING_CONTEXT_KEY), string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.PrevItemAlt), - Modifier: gocui.ModNone, - Handler: gui.handleSelectPrevLine, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_PATCH_BUILDING_CONTEXT_KEY), string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.NextItemAlt), - Modifier: gocui.ModNone, - Handler: gui.handleSelectNextLine, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_PATCH_BUILDING_CONTEXT_KEY), string(MAIN_STAGING_CONTEXT_KEY)}, Key: gocui.MouseWheelUp, Modifier: gocui.ModNone, - Handler: gui.scrollUpMain, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_PATCH_BUILDING_CONTEXT_KEY), string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gocui.MouseWheelDown, - Modifier: gocui.ModNone, - Handler: gui.scrollDownMain, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_PATCH_BUILDING_CONTEXT_KEY), string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.PrevBlock), - Handler: gui.handleSelectPrevHunk, - Description: gui.Tr.PrevHunk, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_PATCH_BUILDING_CONTEXT_KEY), string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.PrevBlockAlt), - Modifier: gocui.ModNone, - Handler: gui.handleSelectPrevHunk, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_PATCH_BUILDING_CONTEXT_KEY), string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.NextBlock), - Handler: gui.handleSelectNextHunk, - Description: gui.Tr.NextHunk, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_PATCH_BUILDING_CONTEXT_KEY), string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.NextBlockAlt), - Modifier: gocui.ModNone, - Handler: gui.handleSelectNextHunk, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_PATCH_BUILDING_CONTEXT_KEY), string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.CopyToClipboard), - Modifier: gocui.ModNone, - Handler: gui.copySelectedToClipboard, - Description: gui.Tr.LcCopySelectedTexToClipboard, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.Edit), - Handler: gui.handleLineByLineEdit, - Description: gui.Tr.LcEditFile, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.OpenFile), - Handler: gui.handleFileOpen, - Description: gui.Tr.LcOpenFile, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_PATCH_BUILDING_CONTEXT_KEY), string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.NextPage), - Modifier: gocui.ModNone, - Handler: gui.handleLineByLineNextPage, - Description: gui.Tr.LcNextPage, - Tag: "navigation", - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_PATCH_BUILDING_CONTEXT_KEY), string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.PrevPage), - Modifier: gocui.ModNone, - Handler: gui.handleLineByLinePrevPage, - Description: gui.Tr.LcPrevPage, - Tag: "navigation", - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_PATCH_BUILDING_CONTEXT_KEY), string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.GotoTop), - Modifier: gocui.ModNone, - Handler: gui.handleLineByLineGotoTop, - Description: gui.Tr.LcGotoTop, - Tag: "navigation", - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_PATCH_BUILDING_CONTEXT_KEY), string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.GotoBottom), - Modifier: gocui.ModNone, - Handler: gui.handleLineByLineGotoBottom, - Description: gui.Tr.LcGotoBottom, - Tag: "navigation", - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_PATCH_BUILDING_CONTEXT_KEY), string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.StartSearch), - Handler: func() error { return gui.handleOpenSearch("main") }, - Description: gui.Tr.LcStartSearch, - Tag: "navigation", - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_PATCH_BUILDING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.Select), - Handler: gui.handleToggleSelectionForPatch, - Description: gui.Tr.ToggleSelectionForPatch, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_PATCH_BUILDING_CONTEXT_KEY), string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Main.ToggleDragSelect), - Handler: gui.handleToggleSelectRange, - Description: gui.Tr.ToggleDragSelect, - }, - // Alias 'V' -> 'v' - { - ViewName: "main", - Contexts: []string{string(MAIN_PATCH_BUILDING_CONTEXT_KEY), string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Main.ToggleDragSelectAlt), - Handler: gui.handleToggleSelectRange, - Description: gui.Tr.ToggleDragSelect, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_PATCH_BUILDING_CONTEXT_KEY), string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Main.ToggleSelectHunk), - Handler: gui.handleToggleSelectHunk, - Description: gui.Tr.ToggleSelectHunk, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_PATCH_BUILDING_CONTEXT_KEY), string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gocui.MouseLeft, - Modifier: gocui.ModNone, - Handler: gui.handleLBLMouseDown, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_PATCH_BUILDING_CONTEXT_KEY), string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gocui.MouseLeft, - Modifier: gocui.ModMotion, - Handler: gui.handleMouseDrag, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_PATCH_BUILDING_CONTEXT_KEY), string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gocui.MouseWheelUp, - Modifier: gocui.ModNone, - Handler: gui.scrollUpMain, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_PATCH_BUILDING_CONTEXT_KEY), string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gocui.MouseWheelDown, - Modifier: gocui.ModNone, - Handler: gui.scrollDownMain, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_PATCH_BUILDING_CONTEXT_KEY), string(MAIN_STAGING_CONTEXT_KEY), string(MAIN_MERGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.ScrollLeft), - Handler: gui.scrollLeftMain, - Description: gui.Tr.LcScrollLeft, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_PATCH_BUILDING_CONTEXT_KEY), string(MAIN_STAGING_CONTEXT_KEY), string(MAIN_MERGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.ScrollRight), - Handler: gui.scrollRightMain, - Description: gui.Tr.LcScrollRight, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Files.CommitChanges), - Handler: gui.handleCommitPress, - Description: gui.Tr.CommitChanges, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Files.CommitChangesWithoutHook), - Handler: gui.handleWIPCommitPress, - Description: gui.Tr.LcCommitChangesWithoutHook, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_STAGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Files.CommitChangesWithEditor), - Handler: gui.handleCommitEditorPress, - Description: gui.Tr.CommitChangesWithEditor, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_MERGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.Return), - Handler: gui.handleEscapeMerge, - Description: gui.Tr.ReturnToFilesPanel, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_MERGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Files.OpenMergeTool), - Handler: gui.handleOpenMergeTool, - Description: gui.Tr.LcOpenMergeTool, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_MERGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.Select), - Handler: gui.handlePickHunk, - Description: gui.Tr.PickHunk, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_MERGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Main.PickBothHunks), - Handler: gui.handlePickAllHunks, - Description: gui.Tr.PickAllHunks, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_MERGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.PrevBlock), - Handler: gui.handleSelectPrevConflict, - Description: gui.Tr.PrevConflict, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_MERGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.NextBlock), - Handler: gui.handleSelectNextConflict, - Description: gui.Tr.NextConflict, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_MERGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.PrevItem), - Handler: gui.handleSelectPrevConflictHunk, - Description: gui.Tr.SelectPrevHunk, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_MERGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.NextItem), - Handler: gui.handleSelectNextConflictHunk, - Description: gui.Tr.SelectNextHunk, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_MERGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.PrevBlockAlt), - Modifier: gocui.ModNone, - Handler: gui.handleSelectPrevConflict, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_MERGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.NextBlockAlt), - Modifier: gocui.ModNone, - Handler: gui.handleSelectNextConflict, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_MERGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.PrevItemAlt), - Modifier: gocui.ModNone, - Handler: gui.handleSelectPrevConflictHunk, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_MERGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.NextItemAlt), - Modifier: gocui.ModNone, - Handler: gui.handleSelectNextConflictHunk, - }, - { - ViewName: "main", - Contexts: []string{string(MAIN_MERGING_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.Undo), - Handler: gui.handleMergeConflictUndo, - Description: gui.Tr.LcUndo, - }, - { - ViewName: "branches", - Contexts: []string{string(REMOTES_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.GoInto), - Modifier: gocui.ModNone, - Handler: gui.handleRemoteEnter, - }, - { - ViewName: "branches", - Contexts: []string{string(REMOTES_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.New), - Handler: gui.handleAddRemote, - Description: gui.Tr.LcAddNewRemote, - }, - { - ViewName: "branches", - Contexts: []string{string(REMOTES_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.Remove), - Handler: gui.handleRemoveRemote, - Description: gui.Tr.LcRemoveRemote, - }, - { - ViewName: "branches", - Contexts: []string{string(REMOTES_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.Edit), - Handler: gui.handleEditRemote, - Description: gui.Tr.LcEditRemote, - }, - { - ViewName: "branches", - Contexts: []string{string(REMOTE_BRANCHES_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.Select), - // gonna use the exact same handler as the 'n' keybinding because everybody wants this to happen when they checkout a remote branch - Handler: gui.handleNewBranchOffCurrentItem, - Description: gui.Tr.LcCheckout, - }, - { - ViewName: "branches", - Contexts: []string{string(REMOTE_BRANCHES_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.New), - Handler: gui.handleNewBranchOffCurrentItem, - Description: gui.Tr.LcNewBranch, - }, - { - ViewName: "branches", - Contexts: []string{string(REMOTE_BRANCHES_CONTEXT_KEY)}, - Key: gui.getKey(config.Branches.MergeIntoCurrentBranch), - Handler: gui.handleMergeRemoteBranch, - Description: gui.Tr.LcMergeIntoCurrentBranch, - }, - { - ViewName: "branches", - Contexts: []string{string(REMOTE_BRANCHES_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.Remove), - Handler: gui.handleDeleteRemoteBranch, - Description: gui.Tr.LcDeleteBranch, - }, - { - ViewName: "branches", - Contexts: []string{string(REMOTE_BRANCHES_CONTEXT_KEY)}, - Key: gui.getKey(config.Branches.RebaseBranch), - Handler: gui.handleRebaseOntoRemoteBranch, - Description: gui.Tr.LcRebaseBranch, - }, - { - ViewName: "branches", - Contexts: []string{string(REMOTE_BRANCHES_CONTEXT_KEY)}, - Key: gui.getKey(config.Branches.SetUpstream), - Handler: gui.handleSetBranchUpstream, - Description: gui.Tr.LcSetUpstream, + Handler: self.scrollUpSecondary, }, { ViewName: "status", Key: gocui.MouseLeft, Modifier: gocui.ModNone, - Handler: gui.handleStatusClick, + Handler: self.handleStatusClick, }, { ViewName: "search", - Key: gui.getKey(config.Universal.Confirm), + Key: opts.GetKey(opts.Config.Universal.Confirm), Modifier: gocui.ModNone, - Handler: gui.handleSearch, + Handler: self.handleSearch, }, { ViewName: "search", - Key: gui.getKey(config.Universal.Return), + Key: opts.GetKey(opts.Config.Universal.Return), Modifier: gocui.ModNone, - Handler: gui.handleSearchEscape, + Handler: self.handleSearchEscape, }, { ViewName: "confirmation", - Key: gui.getKey(config.Universal.PrevItem), + Key: opts.GetKey(opts.Config.Universal.PrevItem), Modifier: gocui.ModNone, - Handler: gui.scrollUpConfirmationPanel, + Handler: self.scrollUpConfirmationPanel, }, { ViewName: "confirmation", - Key: gui.getKey(config.Universal.NextItem), + Key: opts.GetKey(opts.Config.Universal.NextItem), Modifier: gocui.ModNone, - Handler: gui.scrollDownConfirmationPanel, + Handler: self.scrollDownConfirmationPanel, }, { ViewName: "confirmation", - Key: gui.getKey(config.Universal.PrevItemAlt), + Key: opts.GetKey(opts.Config.Universal.PrevItemAlt), Modifier: gocui.ModNone, - Handler: gui.scrollUpConfirmationPanel, + Handler: self.scrollUpConfirmationPanel, }, { ViewName: "confirmation", - Key: gui.getKey(config.Universal.NextItemAlt), + Key: opts.GetKey(opts.Config.Universal.NextItemAlt), Modifier: gocui.ModNone, - Handler: gui.scrollDownConfirmationPanel, + Handler: self.scrollDownConfirmationPanel, }, { - ViewName: "menu", - Key: gui.getKey(config.Universal.Select), - Modifier: gocui.ModNone, - Handler: gui.onMenuPress, - }, - { - ViewName: "menu", - Key: gui.getKey(config.Universal.Confirm), - Modifier: gocui.ModNone, - Handler: gui.onMenuPress, - }, - { - ViewName: "menu", - Key: gui.getKey(config.Universal.ConfirmAlt1), - Modifier: gocui.ModNone, - Handler: gui.onMenuPress, + ViewName: "submodules", + Key: opts.GetKey(opts.Config.Universal.CopyToClipboard), + Handler: self.handleCopySelectedSideContextItemToClipboard, + Description: self.c.Tr.LcCopySubmoduleNameToClipboard, }, { ViewName: "files", - Contexts: []string{string(SUBMODULES_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.CopyToClipboard), - Handler: gui.handleCopySelectedSideContextItemToClipboard, - Description: gui.Tr.LcCopySubmoduleNameToClipboard, - }, - { - ViewName: "files", - Contexts: []string{string(SUBMODULES_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.GoInto), - Handler: gui.forSubmodule(gui.handleSubmoduleEnter), - Description: gui.Tr.LcEnterSubmodule, - }, - { - ViewName: "files", - Contexts: []string{string(SUBMODULES_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.Remove), - Handler: gui.forSubmodule(gui.removeSubmodule), - Description: gui.Tr.LcRemoveSubmodule, - OpensMenu: true, - }, - { - ViewName: "files", - Contexts: []string{string(SUBMODULES_CONTEXT_KEY)}, - Key: gui.getKey(config.Submodules.Update), - Handler: gui.forSubmodule(gui.handleUpdateSubmodule), - Description: gui.Tr.LcSubmoduleUpdate, - }, - { - ViewName: "files", - Contexts: []string{string(SUBMODULES_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.New), - Handler: gui.handleAddSubmodule, - Description: gui.Tr.LcAddSubmodule, - }, - { - ViewName: "files", - Contexts: []string{string(SUBMODULES_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.Edit), - Handler: gui.forSubmodule(gui.handleEditSubmoduleUrl), - Description: gui.Tr.LcEditSubmoduleUrl, - }, - { - ViewName: "files", - Contexts: []string{string(SUBMODULES_CONTEXT_KEY)}, - Key: gui.getKey(config.Submodules.Init), - Handler: gui.forSubmodule(gui.handleSubmoduleInit), - Description: gui.Tr.LcInitSubmodule, - }, - { - ViewName: "files", - Contexts: []string{string(SUBMODULES_CONTEXT_KEY)}, - Key: gui.getKey(config.Submodules.BulkMenu), - Handler: gui.handleBulkSubmoduleActionsMenu, - Description: gui.Tr.LcViewBulkSubmoduleOptions, - OpensMenu: true, - }, - { - ViewName: "files", - Contexts: []string{string(FILES_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.ToggleWhitespaceInDiffView), - Handler: gui.toggleWhitespaceInDiffView, - Description: gui.Tr.ToggleWhitespaceInDiffView, - }, - { - ViewName: "", - Key: gui.getKey(config.Universal.IncreaseContextInDiffView), - Handler: gui.IncreaseContextInDiffView, - Description: gui.Tr.IncreaseContextInDiffView, - }, - { - ViewName: "", - Key: gui.getKey(config.Universal.DecreaseContextInDiffView), - Handler: gui.DecreaseContextInDiffView, - Description: gui.Tr.DecreaseContextInDiffView, + Key: opts.GetKey(opts.Config.Universal.ToggleWhitespaceInDiffView), + Handler: self.toggleWhitespaceInDiffView, + Description: self.c.Tr.ToggleWhitespaceInDiffView, }, { ViewName: "extras", Key: gocui.MouseWheelUp, - Handler: gui.scrollUpExtra, + Handler: self.scrollUpExtra, }, { ViewName: "extras", Key: gocui.MouseWheelDown, - Handler: gui.scrollDownExtra, - }, - { - ViewName: "extras", - Key: gui.getKey(config.Universal.ExtrasMenu), - Handler: gui.handleCreateExtrasMenuPanel, - Description: gui.Tr.LcOpenExtrasMenu, - OpensMenu: true, + Handler: self.scrollDownExtra, }, { ViewName: "extras", Tag: "navigation", - Contexts: []string{string(COMMAND_LOG_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.PrevItemAlt), + Key: opts.GetKey(opts.Config.Universal.PrevItemAlt), Modifier: gocui.ModNone, - Handler: gui.scrollUpExtra, + Handler: self.scrollUpExtra, }, { ViewName: "extras", Tag: "navigation", - Contexts: []string{string(COMMAND_LOG_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.PrevItem), + Key: opts.GetKey(opts.Config.Universal.PrevItem), Modifier: gocui.ModNone, - Handler: gui.scrollUpExtra, + Handler: self.scrollUpExtra, }, { ViewName: "extras", Tag: "navigation", - Contexts: []string{string(COMMAND_LOG_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.NextItem), + Key: opts.GetKey(opts.Config.Universal.NextItem), Modifier: gocui.ModNone, - Handler: gui.scrollDownExtra, + Handler: self.scrollDownExtra, }, { ViewName: "extras", Tag: "navigation", - Contexts: []string{string(COMMAND_LOG_CONTEXT_KEY)}, - Key: gui.getKey(config.Universal.NextItemAlt), + Key: opts.GetKey(opts.Config.Universal.NextItemAlt), Modifier: gocui.ModNone, - Handler: gui.scrollDownExtra, + Handler: self.scrollDownExtra, }, { ViewName: "extras", Tag: "navigation", Key: gocui.MouseLeft, Modifier: gocui.ModNone, - Handler: gui.handleFocusCommandLog, + Handler: self.handleFocusCommandLog, }, } - for _, viewName := range []string{"status", "branches", "files", "commits", "commitFiles", "stash", "menu"} { - bindings = append(bindings, []*Binding{ - {ViewName: viewName, Key: gui.getKey(config.Universal.PrevBlock), Modifier: gocui.ModNone, Handler: gui.previousSideWindow}, - {ViewName: viewName, Key: gui.getKey(config.Universal.NextBlock), Modifier: gocui.ModNone, Handler: gui.nextSideWindow}, - {ViewName: viewName, Key: gui.getKey(config.Universal.PrevBlockAlt), Modifier: gocui.ModNone, Handler: gui.previousSideWindow}, - {ViewName: viewName, Key: gui.getKey(config.Universal.NextBlockAlt), Modifier: gocui.ModNone, Handler: gui.nextSideWindow}, - {ViewName: viewName, Key: gui.getKey(config.Universal.PrevBlockAlt2), Modifier: gocui.ModNone, Handler: gui.previousSideWindow}, - {ViewName: viewName, Key: gui.getKey(config.Universal.NextBlockAlt2), Modifier: gocui.ModNone, Handler: gui.nextSideWindow}, + mouseKeybindings := []*gocui.ViewMouseBinding{} + for _, c := range self.State.Contexts.Flatten() { + viewName := c.GetViewName() + for _, binding := range c.GetKeybindings(opts) { + // TODO: move all mouse keybindings into the mouse keybindings approach below + binding.ViewName = viewName + bindings = append(bindings, binding) + } + + mouseKeybindings = append(mouseKeybindings, c.GetMouseKeybindings(opts)...) + } + + for _, viewName := range []string{"status", "remotes", "tags", "localBranches", "remoteBranches", "files", "submodules", "reflogCommits", "commits", "commitFiles", "subCommits", "stash"} { + bindings = append(bindings, []*types.Binding{ + {ViewName: viewName, Key: opts.GetKey(opts.Config.Universal.PrevBlock), Modifier: gocui.ModNone, Handler: self.previousSideWindow}, + {ViewName: viewName, Key: opts.GetKey(opts.Config.Universal.NextBlock), Modifier: gocui.ModNone, Handler: self.nextSideWindow}, + {ViewName: viewName, Key: opts.GetKey(opts.Config.Universal.PrevBlockAlt), Modifier: gocui.ModNone, Handler: self.previousSideWindow}, + {ViewName: viewName, Key: opts.GetKey(opts.Config.Universal.NextBlockAlt), Modifier: gocui.ModNone, Handler: self.nextSideWindow}, + {ViewName: viewName, Key: opts.GetKey(opts.Config.Universal.PrevBlockAlt2), Modifier: gocui.ModNone, Handler: self.previousSideWindow}, + {ViewName: viewName, Key: opts.GetKey(opts.Config.Universal.NextBlockAlt2), Modifier: gocui.ModNone, Handler: self.nextSideWindow}, }...) } @@ -1859,57 +432,108 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { log.Fatal("Jump to block keybindings cannot be set. Exactly 5 keybindings must be supplied.") } else { for i, window := range windows { - bindings = append(bindings, &Binding{ + bindings = append(bindings, &types.Binding{ ViewName: "", - Key: gui.getKey(config.Universal.JumpToBlock[i]), + Key: opts.GetKey(opts.Config.Universal.JumpToBlock[i]), Modifier: gocui.ModNone, - Handler: gui.goToSideWindow(window)}) + Handler: self.goToSideWindow(window), + }) } } - for viewName := range gui.State.Contexts.initialViewTabContextMap() { - bindings = append(bindings, []*Binding{ - { - ViewName: viewName, - Key: gui.getKey(config.Universal.NextTab), - Handler: gui.handleNextTab, - Description: gui.Tr.LcNextTab, - Tag: "navigation", - }, - { - ViewName: viewName, - Key: gui.getKey(config.Universal.PrevTab), - Handler: gui.handlePrevTab, - Description: gui.Tr.LcPrevTab, - Tag: "navigation", - }, - }...) - } + bindings = append(bindings, []*types.Binding{ + { + ViewName: "", + Key: opts.GetKey(opts.Config.Universal.NextTab), + Handler: self.handleNextTab, + Description: self.c.Tr.LcNextTab, + Tag: "navigation", + }, + { + ViewName: "", + Key: opts.GetKey(opts.Config.Universal.PrevTab), + Handler: self.handlePrevTab, + Description: self.c.Tr.LcPrevTab, + Tag: "navigation", + }, + }...) - bindings = append(bindings, gui.getListContextKeyBindings()...) - - return bindings + return bindings, mouseKeybindings } -func (gui *Gui) keybindings() error { - bindings := gui.GetCustomCommandKeybindings() +func (gui *Gui) resetKeybindings() error { + gui.g.DeleteAllKeybindings() - bindings = append(bindings, gui.GetInitialKeybindings()...) + bindings, mouseBindings := gui.GetInitialKeybindings() + + // prepending because we want to give our custom keybindings precedence over default keybindings + customBindings, err := gui.CustomCommandsClient.GetCustomCommandKeybindings() + if err != nil { + log.Fatal(err) + } + bindings = append(customBindings, bindings...) for _, binding := range bindings { - if err := gui.g.SetKeybinding(binding.ViewName, binding.Contexts, binding.Key, binding.Modifier, gui.wrappedHandler(binding.Handler)); err != nil { + if err := gui.SetKeybinding(binding); err != nil { return err } } - for viewName := range gui.State.Contexts.initialViewTabContextMap() { - viewName := viewName - tabClickCallback := func(tabIndex int) error { return gui.onViewTabClick(viewName, tabIndex) } - - if err := gui.g.SetTabClickBinding(viewName, tabClickCallback); err != nil { + for _, binding := range mouseBindings { + if err := gui.SetMouseKeybinding(binding); err != nil { return err } } + for _, values := range gui.viewTabMap() { + for _, value := range values { + viewName := value.ViewName + tabClickCallback := func(tabIndex int) error { return gui.onViewTabClick(gui.windowForView(viewName), tabIndex) } + + if err := gui.g.SetTabClickBinding(viewName, tabClickCallback); err != nil { + return err + } + } + } + return nil } + +func (gui *Gui) wrappedHandler(f func() error) func(g *gocui.Gui, v *gocui.View) error { + return func(g *gocui.Gui, v *gocui.View) error { + return f() + } +} + +func (gui *Gui) SetKeybinding(binding *types.Binding) error { + handler := binding.Handler + // TODO: move all mouse-ey stuff into new mouse approach + if gocui.IsMouseKey(binding.Key) { + handler = func() error { + // we ignore click events on views that aren't popup panels, when a popup panel is focused + if gui.popupPanelFocused() && gui.currentViewName() != binding.ViewName { + return nil + } + + return binding.Handler() + } + } + + return gui.g.SetKeybinding(binding.ViewName, binding.Key, binding.Modifier, gui.wrappedHandler(handler)) +} + +// warning: mutates the binding +func (gui *Gui) SetMouseKeybinding(binding *gocui.ViewMouseBinding) error { + baseHandler := binding.Handler + newHandler := func(opts gocui.ViewMouseBindingOpts) error { + // we ignore click events on views that aren't popup panels, when a popup panel is focused + if gui.popupPanelFocused() && gui.currentViewName() != binding.ViewName { + return nil + } + + return baseHandler(opts) + } + binding.Handler = newHandler + + return gui.g.SetViewClickBinding(binding) +} diff --git a/pkg/gui/keybindings/keybindings.go b/pkg/gui/keybindings/keybindings.go new file mode 100644 index 000000000..a59180b56 --- /dev/null +++ b/pkg/gui/keybindings/keybindings.go @@ -0,0 +1,184 @@ +package keybindings + +import ( + "fmt" + "log" + "strings" + "unicode/utf8" + + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/constants" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +var keyMapReversed = map[gocui.Key]string{ + gocui.KeyF1: "f1", + gocui.KeyF2: "f2", + gocui.KeyF3: "f3", + gocui.KeyF4: "f4", + gocui.KeyF5: "f5", + gocui.KeyF6: "f6", + gocui.KeyF7: "f7", + gocui.KeyF8: "f8", + gocui.KeyF9: "f9", + gocui.KeyF10: "f10", + gocui.KeyF11: "f11", + gocui.KeyF12: "f12", + gocui.KeyInsert: "insert", + gocui.KeyDelete: "delete", + gocui.KeyHome: "home", + gocui.KeyEnd: "end", + gocui.KeyPgup: "pgup", + gocui.KeyPgdn: "pgdown", + gocui.KeyArrowUp: "▲", + gocui.KeyArrowDown: "▼", + gocui.KeyArrowLeft: "◄", + gocui.KeyArrowRight: "►", + gocui.KeyTab: "tab", // ctrl+i + gocui.KeyBacktab: "shift+tab", + gocui.KeyEnter: "enter", // ctrl+m + gocui.KeyAltEnter: "alt+enter", + gocui.KeyEsc: "esc", // ctrl+[, ctrl+3 + gocui.KeyBackspace: "backspace", // ctrl+h + gocui.KeyCtrlSpace: "ctrl+space", // ctrl+~, ctrl+2 + gocui.KeyCtrlSlash: "ctrl+/", // ctrl+_ + gocui.KeySpace: "space", + gocui.KeyCtrlA: "ctrl+a", + gocui.KeyCtrlB: "ctrl+b", + gocui.KeyCtrlC: "ctrl+c", + gocui.KeyCtrlD: "ctrl+d", + gocui.KeyCtrlE: "ctrl+e", + gocui.KeyCtrlF: "ctrl+f", + gocui.KeyCtrlG: "ctrl+g", + gocui.KeyCtrlJ: "ctrl+j", + gocui.KeyCtrlK: "ctrl+k", + gocui.KeyCtrlL: "ctrl+l", + gocui.KeyCtrlN: "ctrl+n", + gocui.KeyCtrlO: "ctrl+o", + gocui.KeyCtrlP: "ctrl+p", + gocui.KeyCtrlQ: "ctrl+q", + gocui.KeyCtrlR: "ctrl+r", + gocui.KeyCtrlS: "ctrl+s", + gocui.KeyCtrlT: "ctrl+t", + gocui.KeyCtrlU: "ctrl+u", + gocui.KeyCtrlV: "ctrl+v", + gocui.KeyCtrlW: "ctrl+w", + gocui.KeyCtrlX: "ctrl+x", + gocui.KeyCtrlY: "ctrl+y", + gocui.KeyCtrlZ: "ctrl+z", + gocui.KeyCtrl4: "ctrl+4", // ctrl+\ + gocui.KeyCtrl5: "ctrl+5", // ctrl+] + gocui.KeyCtrl6: "ctrl+6", + gocui.KeyCtrl8: "ctrl+8", + gocui.MouseWheelUp: "mouse wheel ▲", + gocui.MouseWheelDown: "mouse wheel ▼", +} + +var keyMap = map[string]types.Key{ + "": gocui.KeyCtrlA, + "": gocui.KeyCtrlB, + "": gocui.KeyCtrlC, + "": gocui.KeyCtrlD, + "": gocui.KeyCtrlE, + "": gocui.KeyCtrlF, + "": gocui.KeyCtrlG, + "": gocui.KeyCtrlH, + "": gocui.KeyCtrlI, + "": gocui.KeyCtrlJ, + "": gocui.KeyCtrlK, + "": gocui.KeyCtrlL, + "": gocui.KeyCtrlM, + "": gocui.KeyCtrlN, + "": gocui.KeyCtrlO, + "": gocui.KeyCtrlP, + "": gocui.KeyCtrlQ, + "": gocui.KeyCtrlR, + "": gocui.KeyCtrlS, + "": gocui.KeyCtrlT, + "": gocui.KeyCtrlU, + "": gocui.KeyCtrlV, + "": gocui.KeyCtrlW, + "": gocui.KeyCtrlX, + "": gocui.KeyCtrlY, + "": gocui.KeyCtrlZ, + "": gocui.KeyCtrlTilde, + "": gocui.KeyCtrl2, + "": gocui.KeyCtrl3, + "": gocui.KeyCtrl4, + "": gocui.KeyCtrl5, + "": gocui.KeyCtrl6, + "": gocui.KeyCtrl7, + "": gocui.KeyCtrl8, + "": gocui.KeyCtrlSpace, + "": gocui.KeyCtrlBackslash, + "": gocui.KeyCtrlLsqBracket, + "": gocui.KeyCtrlRsqBracket, + "": gocui.KeyCtrlSlash, + "": gocui.KeyCtrlUnderscore, + "": gocui.KeyBackspace, + "": gocui.KeyTab, + "": gocui.KeyBacktab, + "": gocui.KeyEnter, + "": gocui.KeyAltEnter, + "": gocui.KeyEsc, + "": gocui.KeySpace, + "": gocui.KeyF1, + "": gocui.KeyF2, + "": gocui.KeyF3, + "": gocui.KeyF4, + "": gocui.KeyF5, + "": gocui.KeyF6, + "": gocui.KeyF7, + "": gocui.KeyF8, + "": gocui.KeyF9, + "": gocui.KeyF10, + "": gocui.KeyF11, + "": gocui.KeyF12, + "": gocui.KeyInsert, + "": gocui.KeyDelete, + "": gocui.KeyHome, + "": gocui.KeyEnd, + "": gocui.KeyPgup, + "": gocui.KeyPgdn, + "": gocui.KeyArrowUp, + "": gocui.KeyArrowDown, + "": gocui.KeyArrowLeft, + "": gocui.KeyArrowRight, +} + +func Label(name string) string { + return LabelFromKey(GetKey(name)) +} + +func LabelFromKey(key types.Key) string { + keyInt := 0 + + switch key := key.(type) { + case rune: + keyInt = int(key) + case gocui.Key: + value, ok := keyMapReversed[key] + if ok { + return value + } + keyInt = int(key) + } + + return fmt.Sprintf("%c", keyInt) +} + +func GetKey(key string) types.Key { + runeCount := utf8.RuneCountInString(key) + if runeCount > 1 { + binding := keyMap[strings.ToLower(key)] + if binding == nil { + log.Fatalf("Unrecognized key %s for keybinding. For permitted values see %s", strings.ToLower(key), constants.Links.Docs.CustomKeybindings) + } else { + return binding + } + } else if runeCount == 1 { + return []rune(key)[0] + } + log.Fatal("Key empty for keybinding: " + strings.ToLower(key)) + return nil +} diff --git a/pkg/gui/layout.go b/pkg/gui/layout.go index c5872654a..5777524f5 100644 --- a/pkg/gui/layout.go +++ b/pkg/gui/layout.go @@ -1,136 +1,20 @@ package gui import ( + "github.com/jesseduffield/generics/slices" "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/gui/context" "github.com/jesseduffield/lazygit/pkg/theme" ) const SEARCH_PREFIX = "search: " -func (gui *Gui) createAllViews() error { - viewNameMappings := []struct { - viewPtr **gocui.View - name string - }{ - {viewPtr: &gui.Views.Status, name: "status"}, - {viewPtr: &gui.Views.Files, name: "files"}, - {viewPtr: &gui.Views.Branches, name: "branches"}, - {viewPtr: &gui.Views.Commits, name: "commits"}, - {viewPtr: &gui.Views.Stash, name: "stash"}, - {viewPtr: &gui.Views.CommitFiles, name: "commitFiles"}, - {viewPtr: &gui.Views.Main, name: "main"}, - {viewPtr: &gui.Views.Secondary, name: "secondary"}, - {viewPtr: &gui.Views.Options, name: "options"}, - {viewPtr: &gui.Views.AppStatus, name: "appStatus"}, - {viewPtr: &gui.Views.Information, name: "information"}, - {viewPtr: &gui.Views.Search, name: "search"}, - {viewPtr: &gui.Views.SearchPrefix, name: "searchPrefix"}, - {viewPtr: &gui.Views.CommitMessage, name: "commitMessage"}, - {viewPtr: &gui.Views.Credentials, name: "credentials"}, - {viewPtr: &gui.Views.Menu, name: "menu"}, - {viewPtr: &gui.Views.Suggestions, name: "suggestions"}, - {viewPtr: &gui.Views.Confirmation, name: "confirmation"}, - {viewPtr: &gui.Views.Limit, name: "limit"}, - {viewPtr: &gui.Views.Extras, name: "extras"}, - } - - var err error - for _, mapping := range viewNameMappings { - *mapping.viewPtr, err = gui.prepareView(mapping.name) - if err != nil && err.Error() != UNKNOWN_VIEW_ERROR_MSG { - return err - } - } - - gui.Views.Options.Frame = false - gui.Views.Options.FgColor = theme.OptionsColor - - gui.Views.SearchPrefix.BgColor = gocui.ColorDefault - gui.Views.SearchPrefix.FgColor = gocui.ColorGreen - gui.Views.SearchPrefix.Frame = false - gui.setViewContent(gui.Views.SearchPrefix, SEARCH_PREFIX) - - gui.Views.Stash.Title = gui.Tr.StashTitle - gui.Views.Stash.FgColor = theme.GocuiDefaultTextColor - - gui.Views.Commits.Title = gui.Tr.CommitsTitle - gui.Views.Commits.FgColor = theme.GocuiDefaultTextColor - - gui.Views.CommitFiles.Title = gui.Tr.CommitFiles - gui.Views.CommitFiles.FgColor = theme.GocuiDefaultTextColor - - gui.Views.Branches.Title = gui.Tr.BranchesTitle - gui.Views.Branches.FgColor = theme.GocuiDefaultTextColor - - gui.Views.Files.Highlight = true - gui.Views.Files.Title = gui.Tr.FilesTitle - gui.Views.Files.FgColor = theme.GocuiDefaultTextColor - - gui.Views.Secondary.Title = gui.Tr.DiffTitle - gui.Views.Secondary.Wrap = true - gui.Views.Secondary.FgColor = theme.GocuiDefaultTextColor - gui.Views.Secondary.IgnoreCarriageReturns = true - - gui.Views.Main.Title = gui.Tr.DiffTitle - gui.Views.Main.Wrap = true - gui.Views.Main.FgColor = theme.GocuiDefaultTextColor - gui.Views.Main.IgnoreCarriageReturns = true - - gui.Views.Limit.Title = gui.Tr.NotEnoughSpace - gui.Views.Limit.Wrap = true - - gui.Views.Status.Title = gui.Tr.StatusTitle - gui.Views.Status.FgColor = theme.GocuiDefaultTextColor - - gui.Views.Search.BgColor = gocui.ColorDefault - gui.Views.Search.FgColor = gocui.ColorGreen - gui.Views.Search.Frame = false - gui.Views.Search.Editable = true - - gui.Views.AppStatus.BgColor = gocui.ColorDefault - gui.Views.AppStatus.FgColor = gocui.ColorCyan - gui.Views.AppStatus.Frame = false - gui.Views.AppStatus.Visible = false - - gui.Views.CommitMessage.Visible = false - gui.Views.CommitMessage.Title = gui.Tr.CommitMessage - gui.Views.CommitMessage.FgColor = theme.GocuiDefaultTextColor - gui.Views.CommitMessage.Editable = true - gui.Views.CommitMessage.Editor = gocui.EditorFunc(gui.commitMessageEditor) - - gui.Views.Confirmation.Visible = false - - gui.Views.Credentials.Visible = false - gui.Views.Credentials.Title = gui.Tr.CredentialsUsername - gui.Views.Credentials.FgColor = theme.GocuiDefaultTextColor - gui.Views.Credentials.Editable = true - - gui.Views.Suggestions.Visible = false - - gui.Views.Menu.Visible = false - - gui.Views.Information.BgColor = gocui.ColorDefault - gui.Views.Information.FgColor = gocui.ColorGreen - gui.Views.Information.Frame = false - - gui.Views.Extras.Title = gui.Tr.CommandLog - gui.Views.Extras.FgColor = theme.GocuiDefaultTextColor - gui.Views.Extras.Autoscroll = true - gui.Views.Extras.Wrap = true - - gui.printCommandLogHeader() - - if _, err := gui.g.SetCurrentView(gui.defaultSideContext().GetViewName()); err != nil { - return err - } - - return nil -} - // layout is called for every screen re-render e.g. when the screen is resized func (gui *Gui) layout(g *gocui.Gui) error { if !gui.ViewsSetup { - if err := gui.createAllViews(); err != nil { + gui.printCommandLogHeader() + + if _, err := gui.g.SetCurrentView(gui.defaultSideContext().GetViewName()); err != nil { return err } } @@ -138,15 +22,6 @@ func (gui *Gui) layout(g *gocui.Gui) error { g.Highlight = true width, height := g.Size() - minimumHeight := 9 - minimumWidth := 10 - var err error - _, err = g.SetView("limit", 0, 0, width-1, height-1, 0) - if err != nil && err.Error() != UNKNOWN_VIEW_ERROR_MSG { - return err - } - gui.Views.Limit.Visible = height < minimumHeight || width < minimumWidth - informationStr := gui.informationStr() appStatus := gui.statusManager.getStatusString() @@ -168,26 +43,30 @@ func (gui *Gui) layout(g *gocui.Gui) error { } } - setViewFromDimensions := func(viewName string, windowName string, frame bool) (*gocui.View, error) { + // we assume that the view has already been created. + setViewFromDimensions := func(viewName string, windowName string) (*gocui.View, error) { dimensionsObj, ok := viewDimensions[windowName] + view, err := g.View(viewName) + if err != nil { + return nil, err + } + if !ok { // view not specified in dimensions object: so create the view and hide it // making the view take up the whole space in the background in case it needs // to render content as soon as it appears, because lazyloaded content (via a pty task) // cares about the size of the view. - view, err := g.SetView(viewName, 0, 0, width, height, 0) - if view != nil { - view.Visible = false - } + _, err := g.SetView(viewName, 0, 0, width, height, 0) + view.Visible = false return view, err } frameOffset := 1 - if frame { + if view.Frame { frameOffset = 0 } - view, err := g.SetView( + _, err = g.SetView( viewName, dimensionsObj.X0-frameOffset, dimensionsObj.Y0-frameOffset, @@ -195,48 +74,39 @@ func (gui *Gui) layout(g *gocui.Gui) error { dimensionsObj.Y1+frameOffset, 0, ) - - if view != nil { - view.Visible = true - } + view.Visible = true return view, err } - args := []struct { - viewName string - windowName string - frame bool - }{ - {viewName: "main", windowName: "main", frame: true}, - {viewName: "secondary", windowName: "secondary", frame: true}, - {viewName: "status", windowName: "status", frame: true}, - {viewName: "files", windowName: "files", frame: true}, - {viewName: "branches", windowName: "branches", frame: true}, - {viewName: "commitFiles", windowName: gui.State.Contexts.CommitFiles.GetWindowName(), frame: true}, - {viewName: "commits", windowName: "commits", frame: true}, - {viewName: "stash", windowName: "stash", frame: true}, - {viewName: "options", windowName: "options", frame: false}, - {viewName: "searchPrefix", windowName: "searchPrefix", frame: false}, - {viewName: "search", windowName: "search", frame: false}, - {viewName: "appStatus", windowName: "appStatus", frame: false}, - {viewName: "information", windowName: "information", frame: false}, - {viewName: "extras", windowName: "extras", frame: true}, - } + for _, context := range gui.State.Contexts.Flatten() { + if !context.HasControlledBounds() { + continue + } - for _, arg := range args { - _, err = setViewFromDimensions(arg.viewName, arg.windowName, arg.frame) + _, err := setViewFromDimensions(context.GetViewName(), context.GetWindowName()) if err != nil && err.Error() != UNKNOWN_VIEW_ERROR_MSG { return err } } - // if the commit files view is the view to be displayed for its window, we'll display it - gui.Views.CommitFiles.Visible = gui.getViewNameForWindow(gui.State.Contexts.CommitFiles.GetWindowName()) == "commitFiles" + minimumHeight := 9 + minimumWidth := 10 + gui.Views.Limit.Visible = height < minimumHeight || width < minimumWidth - if gui.State.OldInformation != informationStr { + gui.Views.Tooltip.Visible = gui.Views.Menu.Visible && gui.Views.Tooltip.Buffer() != "" + + for _, context := range gui.TransientContexts() { + view, err := gui.g.View(context.GetViewName()) + if err != nil && err.Error() != UNKNOWN_VIEW_ERROR_MSG { + return err + } + view.Visible = gui.getViewNameForWindow(context.GetWindowName()) == context.GetViewName() + } + + if gui.PrevLayout.Information != informationStr { gui.setViewContent(gui.Views.Information, informationStr) - gui.State.OldInformation = informationStr + gui.PrevLayout.Information = informationStr } if !gui.ViewsSetup { @@ -261,25 +131,29 @@ func (gui *Gui) layout(g *gocui.Gui) error { continue } - // ignore contexts whose view is owned by another context right now - if ContextKey(view.Context) != listContext.GetKey() { - continue - } - listContext.FocusLine() view.SelBgColor = theme.GocuiSelectedLineBgColor // I doubt this is expensive though it's admittedly redundant after the first render - view.SetOnSelectItem(gui.onSelectItemWrapper(listContext.onSearchSelect)) + view.SetOnSelectItem(gui.onSelectItemWrapper(listContext.OnSearchSelect)) } - gui.Views.Main.SetOnSelectItem(gui.onSelectItemWrapper(gui.handlelineByLineNavigateTo)) + for _, context := range gui.getPatchExplorerContexts() { + context := context + context.GetView().SetOnSelectItem(gui.onSelectItemWrapper( + func(selectedLineIdx int) error { + context.GetMutex().Lock() + defer context.GetMutex().Unlock() + return context.NavigateTo(gui.c.IsCurrentContext(context), selectedLineIdx) + }), + ) + } mainViewWidth, mainViewHeight := gui.Views.Main.Size() - if mainViewWidth != gui.State.PrevMainWidth || mainViewHeight != gui.State.PrevMainHeight { - gui.State.PrevMainWidth = mainViewWidth - gui.State.PrevMainHeight = mainViewHeight + if mainViewWidth != gui.PrevLayout.MainWidth || mainViewHeight != gui.PrevLayout.MainHeight { + gui.PrevLayout.MainWidth = mainViewWidth + gui.PrevLayout.MainHeight = mainViewHeight if err := gui.onResize(); err != nil { return err } @@ -288,7 +162,7 @@ func (gui *Gui) layout(g *gocui.Gui) error { // here is a good place log some stuff // if you run `lazygit --logs` // this will let you see these branches as prettified json - // gui.Log.Info(utils.AsJson(gui.State.Branches[0:4])) + // gui.c.Log.Info(utils.AsJson(gui.State.Model.Branches[0:4])) return gui.resizeCurrentPopupPanel() } @@ -299,8 +173,6 @@ func (gui *Gui) prepareView(viewName string) (*gocui.View, error) { } func (gui *Gui) onInitialViewsCreationForRepo() error { - gui.setInitialViewContexts() - // hide any popup views. This only applies when we've just switched repos for _, viewName := range gui.popupViewNames() { view, err := gui.g.View(viewName) @@ -310,7 +182,7 @@ func (gui *Gui) onInitialViewsCreationForRepo() error { } initialContext := gui.currentSideContext() - if err := gui.pushContext(initialContext); err != nil { + if err := gui.c.PushContext(initialContext); err != nil { return err } @@ -319,39 +191,7 @@ func (gui *Gui) onInitialViewsCreationForRepo() error { func (gui *Gui) onInitialViewsCreation() error { // now we order the views (in order of bottom first) - layerOneViews := []*gocui.View{ - // first layer. Ordering within this layer does not matter because there are - // no overlapping views - gui.Views.Status, - gui.Views.Files, - gui.Views.Branches, - gui.Views.Commits, - gui.Views.Stash, - gui.Views.CommitFiles, - gui.Views.Main, - gui.Views.Secondary, - gui.Views.Extras, - - // bottom line - gui.Views.Options, - gui.Views.AppStatus, - gui.Views.Information, - gui.Views.Search, - gui.Views.SearchPrefix, // this view takes up one character. Its only purpose is to show the slash when searching - - // popups. Ordering within this layer does not matter because there should - // only be one popup shown at a time - gui.Views.CommitMessage, - gui.Views.Menu, - gui.Views.Suggestions, - gui.Views.Confirmation, - gui.Views.Credentials, - - // this guy will cover everything else when it appears - gui.Views.Limit, - } - - for _, view := range layerOneViews { + for _, view := range gui.orderedViews() { if _, err := gui.g.SetViewOnTop(view.Name()); err != nil { return err } @@ -360,21 +200,25 @@ func (gui *Gui) onInitialViewsCreation() error { gui.g.Mutexes.ViewsMutex.Lock() // add tabs to views for _, view := range gui.g.Views() { - tabs := gui.viewTabNames(view.Name()) - if len(tabs) == 0 { - continue + // if the view is in our mapping, we'll set the tabs and the tab index + for _, values := range gui.viewTabMap() { + index := slices.IndexFunc(values, func(tabContext context.TabView) bool { + return tabContext.ViewName == view.Name() + }) + + if index != -1 { + view.Tabs = slices.Map(values, func(tabContext context.TabView) string { + return tabContext.Tab + }) + view.TabIndex = index + } } - view.Tabs = tabs } gui.g.Mutexes.ViewsMutex.Unlock() - if err := gui.keybindings(); err != nil { - return err - } - - if !gui.UserConfig.DisableStartupPopups { + if !gui.c.UserConfig.DisableStartupPopups { popupTasks := []func(chan struct{}) error{} - storedPopupVersion := gui.Config.GetAppState().StartupPopupVersion + storedPopupVersion := gui.c.GetAppState().StartupPopupVersion if storedPopupVersion < StartupPopupVersion { popupTasks = append(popupTasks, gui.showIntroPopupMessage) } diff --git a/pkg/gui/line_by_line_panel.go b/pkg/gui/line_by_line_panel.go deleted file mode 100644 index 0576d3c0f..000000000 --- a/pkg/gui/line_by_line_panel.go +++ /dev/null @@ -1,292 +0,0 @@ -package gui - -import ( - "fmt" - - "github.com/go-errors/errors" - "github.com/jesseduffield/lazygit/pkg/commands/patch" - "github.com/jesseduffield/lazygit/pkg/gui/lbl" -) - -// Currently there are two 'pseudo-panels' that make use of this 'pseudo-panel'. -// One is the staging panel where we stage files line-by-line, the other is the -// patch building panel where we add lines of an old commit's file to a patch. -// This file contains the logic around selecting lines and displaying the diffs -// staging_panel.go and patch_building_panel.go have functions specific to their -// use cases - -// returns whether the patch is empty so caller can escape if necessary -// both diffs should be non-coloured because we'll parse them and colour them here -func (gui *Gui) refreshLineByLinePanel(diff string, secondaryDiff string, secondaryFocused bool, selectedLineIdx int) (bool, error) { - gui.splitMainPanel(true) - - var oldState *lbl.State - if gui.State.Panels.LineByLine != nil { - oldState = gui.State.Panels.LineByLine.State - } - - state := lbl.NewState(diff, selectedLineIdx, oldState, gui.Log) - if state == nil { - return true, nil - } - - gui.State.Panels.LineByLine = &LblPanelState{ - State: state, - SecondaryFocused: secondaryFocused, - } - - if err := gui.refreshMainViewForLineByLine(gui.State.Panels.LineByLine); err != nil { - return false, err - } - - if err := gui.focusSelection(gui.State.Panels.LineByLine); err != nil { - return false, err - } - - gui.Views.Secondary.Highlight = true - gui.Views.Secondary.Wrap = false - - secondaryPatchParser := patch.NewPatchParser(gui.Log, secondaryDiff) - - gui.setViewContent(gui.Views.Secondary, secondaryPatchParser.Render(-1, -1, nil)) - - return false, nil -} - -func (gui *Gui) handleSelectPrevLine() error { - return gui.withLBLActiveCheck(func(state *LblPanelState) error { - state.CycleSelection(false) - - return gui.refreshAndFocusLblPanel(state) - }) -} - -func (gui *Gui) handleSelectNextLine() error { - return gui.withLBLActiveCheck(func(state *LblPanelState) error { - state.CycleSelection(true) - - return gui.refreshAndFocusLblPanel(state) - }) -} - -func (gui *Gui) handleSelectPrevHunk() error { - return gui.withLBLActiveCheck(func(state *LblPanelState) error { - state.CycleHunk(false) - - return gui.refreshAndFocusLblPanel(state) - }) -} - -func (gui *Gui) handleSelectNextHunk() error { - return gui.withLBLActiveCheck(func(state *LblPanelState) error { - state.CycleHunk(true) - - return gui.refreshAndFocusLblPanel(state) - }) -} - -func (gui *Gui) copySelectedToClipboard() error { - return gui.withLBLActiveCheck(func(state *LblPanelState) error { - selected := state.PlainRenderSelected() - - gui.logAction(gui.Tr.Actions.CopySelectedTextToClipboard) - if err := gui.OSCommand.CopyToClipboard(selected); err != nil { - return gui.surfaceError(err) - } - - return nil - }) -} - -func (gui *Gui) refreshAndFocusLblPanel(state *LblPanelState) error { - if err := gui.refreshMainViewForLineByLine(state); err != nil { - return err - } - - return gui.focusSelection(state) -} - -func (gui *Gui) handleLBLMouseDown() error { - return gui.withLBLActiveCheck(func(state *LblPanelState) error { - if gui.popupPanelFocused() { - return nil - } - - state.SelectNewLineForRange(gui.Views.Main.SelectedLineIdx()) - - return gui.refreshAndFocusLblPanel(state) - }) -} - -func (gui *Gui) handleMouseDrag() error { - return gui.withLBLActiveCheck(func(state *LblPanelState) error { - if gui.popupPanelFocused() { - return nil - } - - state.SelectLine(gui.Views.Main.SelectedLineIdx()) - - return gui.refreshAndFocusLblPanel(state) - }) -} - -func (gui *Gui) getSelectedCommitFileName() string { - idx := gui.State.Panels.CommitFiles.SelectedLineIdx - - return gui.State.CommitFileTreeViewModel.GetItemAtIndex(idx).GetPath() -} - -func (gui *Gui) refreshMainViewForLineByLine(state *LblPanelState) error { - var includedLineIndices []int - // I'd prefer not to have knowledge of contexts using this file but I'm not sure - // how to get around this - if gui.currentContext().GetKey() == gui.State.Contexts.PatchBuilding.GetKey() { - filename := gui.getSelectedCommitFileName() - var err error - includedLineIndices, err = gui.Git.Patch.PatchManager.GetFileIncLineIndices(filename) - if err != nil { - return err - } - } - colorDiff := state.RenderForLineIndices(includedLineIndices) - - gui.Views.Main.Highlight = true - gui.Views.Main.Wrap = false - - gui.setViewContent(gui.Views.Main, colorDiff) - - return nil -} - -// focusSelection works out the best focus for the staging panel given the -// selected line and size of the hunk -func (gui *Gui) focusSelection(state *LblPanelState) error { - stagingView := gui.Views.Main - - _, viewHeight := stagingView.Size() - bufferHeight := viewHeight - 1 - _, origin := stagingView.Origin() - - selectedLineIdx := state.GetSelectedLineIdx() - - newOrigin := state.CalculateOrigin(origin, bufferHeight) - - if err := stagingView.SetOriginY(newOrigin); err != nil { - return err - } - - return stagingView.SetCursor(0, selectedLineIdx-newOrigin) -} - -func (gui *Gui) handleToggleSelectRange() error { - return gui.withLBLActiveCheck(func(state *LblPanelState) error { - state.ToggleSelectRange() - - return gui.refreshMainViewForLineByLine(state) - }) -} - -func (gui *Gui) handleToggleSelectHunk() error { - return gui.withLBLActiveCheck(func(state *LblPanelState) error { - state.ToggleSelectHunk() - - return gui.refreshAndFocusLblPanel(state) - }) -} - -func (gui *Gui) escapeLineByLinePanel() { - gui.State.Panels.LineByLine = nil -} - -func (gui *Gui) handleOpenFileAtLine() error { - return gui.withLBLActiveCheck(func(state *LblPanelState) error { - // again, would be good to use inheritance here (or maybe even composition) - var filename string - switch gui.State.MainContext { - case gui.State.Contexts.PatchBuilding.GetKey(): - filename = gui.getSelectedCommitFileName() - case gui.State.Contexts.Staging.GetKey(): - file := gui.getSelectedFile() - if file == nil { - return nil - } - filename = file.Name - default: - return errors.Errorf("unknown main context: %s", gui.State.MainContext) - } - - // need to look at current index, then work out what my hunk's header information is, and see how far my line is away from the hunk header - lineNumber := state.CurrentLineNumber() - filenameWithLineNum := fmt.Sprintf("%s:%d", filename, lineNumber) - if err := gui.OSCommand.OpenFile(filenameWithLineNum); err != nil { - return err - } - - return nil - }) -} - -func (gui *Gui) handleLineByLineNextPage() error { - return gui.withLBLActiveCheck(func(state *LblPanelState) error { - state.SetLineSelectMode() - state.AdjustSelectedLineIdx(gui.pageDelta(gui.Views.Main)) - - return gui.refreshAndFocusLblPanel(state) - }) -} - -func (gui *Gui) handleLineByLinePrevPage() error { - return gui.withLBLActiveCheck(func(state *LblPanelState) error { - state.SetLineSelectMode() - state.AdjustSelectedLineIdx(-gui.pageDelta(gui.Views.Main)) - - return gui.refreshAndFocusLblPanel(state) - }) -} - -func (gui *Gui) handleLineByLineGotoBottom() error { - return gui.withLBLActiveCheck(func(state *LblPanelState) error { - state.SelectBottom() - - return gui.refreshAndFocusLblPanel(state) - }) -} - -func (gui *Gui) handleLineByLineGotoTop() error { - return gui.withLBLActiveCheck(func(state *LblPanelState) error { - state.SelectTop() - - return gui.refreshAndFocusLblPanel(state) - }) -} - -func (gui *Gui) handlelineByLineNavigateTo(selectedLineIdx int) error { - return gui.withLBLActiveCheck(func(state *LblPanelState) error { - state.SetLineSelectMode() - state.SelectLine(selectedLineIdx) - - return gui.refreshAndFocusLblPanel(state) - }) -} - -func (gui *Gui) withLBLActiveCheck(f func(*LblPanelState) error) error { - gui.Mutexes.LineByLinePanelMutex.Lock() - defer gui.Mutexes.LineByLinePanelMutex.Unlock() - - state := gui.State.Panels.LineByLine - if state == nil { - return nil - } - - return f(state) -} - -func (gui *Gui) handleLineByLineEdit() error { - file := gui.getSelectedFile() - if file == nil { - return nil - } - - lineNumber := gui.State.Panels.LineByLine.CurrentLineNumber() - return gui.editFileAtLine(file.Name, lineNumber) -} diff --git a/pkg/gui/list_context.go b/pkg/gui/list_context.go deleted file mode 100644 index 9f0d86372..000000000 --- a/pkg/gui/list_context.go +++ /dev/null @@ -1,283 +0,0 @@ -package gui - -import ( - "fmt" - - "github.com/jesseduffield/gocui" -) - -type ListContext struct { - GetItemsLength func() int - GetDisplayStrings func(startIdx int, length int) [][]string - OnFocus func(...OnFocusOpts) error - OnRenderToMain func(...OnFocusOpts) error - OnFocusLost func() error - OnClickSelectedItem func() error - - // the boolean here tells us whether the item is nil. This is needed because you can't work it out on the calling end once the pointer is wrapped in an interface (unless you want to use reflection) - SelectedItem func() (ListItem, bool) - OnGetPanelState func() IListPanelState - // if this is true, we'll call GetDisplayStrings for just the visible part of the - // view and re-render that. This is useful when you need to render different - // content based on the selection (e.g. for showing the selected commit) - RenderSelection bool - - Gui *Gui - - *BasicContext -} - -type IListContext interface { - GetSelectedItem() (ListItem, bool) - GetSelectedItemId() string - handlePrevLine() error - handleNextLine() error - handleScrollLeft() error - handleScrollRight() error - handleLineChange(change int) error - handleNextPage() error - handleGotoTop() error - handleGotoBottom() error - handlePrevPage() error - handleClick() error - onSearchSelect(selectedLineIdx int) error - FocusLine() - HandleRenderToMain() error - - GetPanelState() IListPanelState - - Context -} - -func (self *ListContext) GetPanelState() IListPanelState { - return self.OnGetPanelState() -} - -type IListPanelState interface { - SetSelectedLineIdx(int) - GetSelectedLineIdx() int -} - -type ListItem interface { - // ID is a SHA when the item is a commit, a filename when the item is a file, 'stash@{4}' when it's a stash entry, 'my_branch' when it's a branch - ID() string - - // Description is something we would show in a message e.g. '123as14: push blah' for a commit - Description() string -} - -func (self *ListContext) FocusLine() { - view, err := self.Gui.g.View(self.ViewName) - if err != nil { - // ignoring error for now - return - } - - // we need a way of knowing whether we've rendered to the view yet. - view.FocusPoint(view.OriginX(), self.GetPanelState().GetSelectedLineIdx()) - if self.RenderSelection { - _, originY := view.Origin() - displayStrings := self.GetDisplayStrings(originY, view.InnerHeight()+1) - self.Gui.renderDisplayStringsAtPos(view, originY, displayStrings) - } - view.Footer = formatListFooter(self.GetPanelState().GetSelectedLineIdx(), self.GetItemsLength()) -} - -func formatListFooter(selectedLineIdx int, length int) string { - return fmt.Sprintf("%d of %d", selectedLineIdx+1, length) -} - -func (self *ListContext) GetSelectedItem() (ListItem, bool) { - return self.SelectedItem() -} - -func (self *ListContext) GetSelectedItemId() string { - item, ok := self.GetSelectedItem() - - if !ok { - return "" - } - - return item.ID() -} - -// OnFocus assumes that the content of the context has already been rendered to the view. OnRender is the function which actually renders the content to the view -func (self *ListContext) HandleRender() error { - view, err := self.Gui.g.View(self.ViewName) - if err != nil { - return nil - } - - if self.GetDisplayStrings != nil { - self.Gui.refreshSelectedLine(self.GetPanelState(), self.GetItemsLength()) - self.Gui.renderDisplayStrings(view, self.GetDisplayStrings(0, self.GetItemsLength())) - self.Gui.render() - } - - return nil -} - -func (self *ListContext) HandleFocusLost() error { - if self.OnFocusLost != nil { - return self.OnFocusLost() - } - - view, err := self.Gui.g.View(self.ViewName) - if err != nil { - return nil - } - - _ = view.SetOriginX(0) - - return nil -} - -func (self *ListContext) HandleFocus(opts ...OnFocusOpts) error { - if self.Gui.popupPanelFocused() { - return nil - } - - self.FocusLine() - - if self.Gui.State.Modes.Diffing.Active() { - return self.Gui.renderDiff() - } - - if self.OnFocus != nil { - if err := self.OnFocus(opts...); err != nil { - return err - } - } - - if self.OnRenderToMain != nil { - if err := self.OnRenderToMain(opts...); err != nil { - return err - } - } - - return nil -} - -func (self *ListContext) handlePrevLine() error { - return self.handleLineChange(-1) -} - -func (self *ListContext) handleNextLine() error { - return self.handleLineChange(1) -} - -func (self *ListContext) handleScrollLeft() error { - return self.scroll(self.Gui.scrollLeft) -} - -func (self *ListContext) handleScrollRight() error { - return self.scroll(self.Gui.scrollRight) -} - -func (self *ListContext) scroll(scrollFunc func(*gocui.View)) error { - if self.ignoreKeybinding() { - return nil - } - - // get the view, move the origin - view, err := self.Gui.g.View(self.ViewName) - if err != nil { - return nil - } - - scrollFunc(view) - - return self.HandleFocus() -} - -func (self *ListContext) ignoreKeybinding() bool { - return !self.Gui.isPopupPanel(self.ViewName) && self.Gui.popupPanelFocused() -} - -func (self *ListContext) handleLineChange(change int) error { - if self.ignoreKeybinding() { - return nil - } - - selectedLineIdx := self.GetPanelState().GetSelectedLineIdx() - if (change < 0 && selectedLineIdx == 0) || (change > 0 && selectedLineIdx == self.GetItemsLength()-1) { - return nil - } - - self.Gui.changeSelectedLine(self.GetPanelState(), self.GetItemsLength(), change) - - return self.HandleFocus() -} - -func (self *ListContext) handleNextPage() error { - view, err := self.Gui.g.View(self.ViewName) - if err != nil { - return nil - } - delta := self.Gui.pageDelta(view) - - return self.handleLineChange(delta) -} - -func (self *ListContext) handleGotoTop() error { - return self.handleLineChange(-self.GetItemsLength()) -} - -func (self *ListContext) handleGotoBottom() error { - return self.handleLineChange(self.GetItemsLength()) -} - -func (self *ListContext) handlePrevPage() error { - view, err := self.Gui.g.View(self.ViewName) - if err != nil { - return nil - } - - delta := self.Gui.pageDelta(view) - - return self.handleLineChange(-delta) -} - -func (self *ListContext) handleClick() error { - if self.ignoreKeybinding() { - return nil - } - - view, err := self.Gui.g.View(self.ViewName) - if err != nil { - return nil - } - - prevSelectedLineIdx := self.GetPanelState().GetSelectedLineIdx() - newSelectedLineIdx := view.SelectedLineIdx() - - // we need to focus the view - if err := self.Gui.pushContext(self); err != nil { - return err - } - - if newSelectedLineIdx > self.GetItemsLength()-1 { - return nil - } - - self.GetPanelState().SetSelectedLineIdx(newSelectedLineIdx) - - prevViewName := self.Gui.currentViewName() - if prevSelectedLineIdx == newSelectedLineIdx && prevViewName == self.ViewName && self.OnClickSelectedItem != nil { - return self.OnClickSelectedItem() - } - return self.HandleFocus() -} - -func (self *ListContext) onSearchSelect(selectedLineIdx int) error { - self.GetPanelState().SetSelectedLineIdx(selectedLineIdx) - return self.HandleFocus() -} - -func (self *ListContext) HandleRenderToMain() error { - if self.OnRenderToMain != nil { - return self.OnRenderToMain() - } - - return nil -} diff --git a/pkg/gui/list_context_config.go b/pkg/gui/list_context_config.go index 3fde1edfd..d463c2ac5 100644 --- a/pkg/gui/list_context_config.go +++ b/pkg/gui/list_context_config.go @@ -3,224 +3,161 @@ package gui import ( "log" - "github.com/jesseduffield/gocui" + "github.com/jesseduffield/generics/slices" "github.com/jesseduffield/lazygit/pkg/commands/git_commands" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/context" "github.com/jesseduffield/lazygit/pkg/gui/presentation" "github.com/jesseduffield/lazygit/pkg/gui/style" + "github.com/jesseduffield/lazygit/pkg/gui/types" ) -func (gui *Gui) menuListContext() IListContext { - return &ListContext{ - BasicContext: &BasicContext{ - ViewName: "menu", - Key: "menu", - Kind: PERSISTENT_POPUP, - OnGetOptionsMap: gui.getMenuOptions, +func (gui *Gui) menuListContext() *context.MenuContext { + return context.NewMenuContext( + gui.Views.Menu, + gui.c, + gui.getMenuOptions, + func(content string) { + gui.Views.Tooltip.SetContent(content) }, - GetItemsLength: func() int { return gui.Views.Menu.LinesHeight() }, - OnGetPanelState: func() IListPanelState { return gui.State.Panels.Menu }, - OnClickSelectedItem: gui.onMenuPress, - Gui: gui, + ) +} - // no GetDisplayStrings field because we do a custom render on menu creation +func (gui *Gui) filesListContext() *context.WorkingTreeContext { + return context.NewWorkingTreeContext( + func() []*models.File { return gui.State.Model.Files }, + gui.Views.Files, + func(startIdx int, length int) [][]string { + lines := presentation.RenderFileTree(gui.State.Contexts.Files.FileTreeViewModel, gui.State.Modes.Diffing.Ref, gui.State.Model.Submodules) + return slices.Map(lines, func(line string) []string { + return []string{line} + }) + }, + nil, + gui.withDiffModeCheck(gui.filesRenderToMain), + nil, + gui.c, + ) +} + +func (gui *Gui) branchesListContext() *context.BranchesContext { + return context.NewBranchesContext( + func() []*models.Branch { return gui.State.Model.Branches }, + gui.Views.Branches, + func(startIdx int, length int) [][]string { + return presentation.GetBranchListDisplayStrings(gui.State.Model.Branches, gui.State.ScreenMode != SCREEN_NORMAL, gui.State.Modes.Diffing.Ref, gui.Tr) + }, + nil, + gui.withDiffModeCheck(gui.branchesRenderToMain), + nil, + gui.c, + ) +} + +func (gui *Gui) remotesListContext() *context.RemotesContext { + return context.NewRemotesContext( + func() []*models.Remote { return gui.State.Model.Remotes }, + gui.Views.Remotes, + func(startIdx int, length int) [][]string { + return presentation.GetRemoteListDisplayStrings(gui.State.Model.Remotes, gui.State.Modes.Diffing.Ref) + }, + nil, + gui.withDiffModeCheck(gui.remotesRenderToMain), + nil, + gui.c, + ) +} + +func (gui *Gui) remoteBranchesListContext() *context.RemoteBranchesContext { + return context.NewRemoteBranchesContext( + func() []*models.RemoteBranch { return gui.State.Model.RemoteBranches }, + gui.Views.RemoteBranches, + func(startIdx int, length int) [][]string { + return presentation.GetRemoteBranchListDisplayStrings(gui.State.Model.RemoteBranches, gui.State.Modes.Diffing.Ref) + }, + nil, + gui.withDiffModeCheck(gui.remoteBranchesRenderToMain), + nil, + gui.c, + ) +} + +func (gui *Gui) withDiffModeCheck(f func() error) func() error { + return func() error { + if gui.State.Modes.Diffing.Active() { + return gui.renderDiff() + } + + return f() } } -func (gui *Gui) filesListContext() IListContext { - return &ListContext{ - BasicContext: &BasicContext{ - ViewName: "files", - WindowName: "files", - Key: FILES_CONTEXT_KEY, - Kind: SIDE_CONTEXT, +func (gui *Gui) tagsListContext() *context.TagsContext { + return context.NewTagsContext( + func() []*models.Tag { return gui.State.Model.Tags }, + gui.Views.Tags, + func(startIdx int, length int) [][]string { + return presentation.GetTagListDisplayStrings(gui.State.Model.Tags, gui.State.Modes.Diffing.Ref) }, - GetItemsLength: func() int { return gui.State.FileTreeViewModel.GetItemsLength() }, - OnGetPanelState: func() IListPanelState { return gui.State.Panels.Files }, - OnFocus: OnFocusWrapper(gui.onFocusFile), - OnRenderToMain: OnFocusWrapper(gui.filesRenderToMain), - OnClickSelectedItem: gui.handleFilePress, - Gui: gui, - GetDisplayStrings: func(startIdx int, length int) [][]string { - lines := presentation.RenderFileTree(gui.State.FileTreeViewModel, gui.State.Modes.Diffing.Ref, gui.State.Submodules) - mappedLines := make([][]string, len(lines)) - for i, line := range lines { - mappedLines[i] = []string{line} - } - - return mappedLines - }, - SelectedItem: func() (ListItem, bool) { - item := gui.getSelectedFileNode() - return item, item != nil - }, - } + nil, + gui.withDiffModeCheck(gui.tagsRenderToMain), + nil, + gui.c, + ) } -func (gui *Gui) branchesListContext() IListContext { - return &ListContext{ - BasicContext: &BasicContext{ - ViewName: "branches", - WindowName: "branches", - Key: LOCAL_BRANCHES_CONTEXT_KEY, - Kind: SIDE_CONTEXT, - }, - GetItemsLength: func() int { return len(gui.State.Branches) }, - OnGetPanelState: func() IListPanelState { return gui.State.Panels.Branches }, - OnRenderToMain: OnFocusWrapper(gui.branchesRenderToMain), - Gui: gui, - GetDisplayStrings: func(startIdx int, length int) [][]string { - prs, err := git_commands.GenerateGithubPullRequestMap(gui.State.GithubState.RecentPRs, gui.State.Branches, gui.State.Remotes) - if err != nil { - panic(err) - } - - return presentation.GetBranchListDisplayStrings(gui.State.Branches, prs, gui.State.ScreenMode != SCREEN_NORMAL, gui.State.Modes.Diffing.Ref) - }, - SelectedItem: func() (ListItem, bool) { - item := gui.getSelectedBranch() - return item, item != nil - }, - } -} - -func (gui *Gui) remotesListContext() IListContext { - return &ListContext{ - BasicContext: &BasicContext{ - ViewName: "branches", - WindowName: "branches", - Key: REMOTES_CONTEXT_KEY, - Kind: SIDE_CONTEXT, - }, - GetItemsLength: func() int { return len(gui.State.Remotes) }, - OnGetPanelState: func() IListPanelState { return gui.State.Panels.Remotes }, - OnRenderToMain: OnFocusWrapper(gui.remotesRenderToMain), - OnClickSelectedItem: gui.handleRemoteEnter, - Gui: gui, - GetDisplayStrings: func(startIdx int, length int) [][]string { - return presentation.GetRemoteListDisplayStrings(gui.State.Remotes, gui.State.Modes.Diffing.Ref) - }, - SelectedItem: func() (ListItem, bool) { - item := gui.getSelectedRemote() - return item, item != nil - }, - } -} - -func (gui *Gui) remoteBranchesListContext() IListContext { - return &ListContext{ - BasicContext: &BasicContext{ - ViewName: "branches", - WindowName: "branches", - Key: REMOTE_BRANCHES_CONTEXT_KEY, - Kind: SIDE_CONTEXT, - }, - GetItemsLength: func() int { return len(gui.State.RemoteBranches) }, - OnGetPanelState: func() IListPanelState { return gui.State.Panels.RemoteBranches }, - OnRenderToMain: OnFocusWrapper(gui.remoteBranchesRenderToMain), - Gui: gui, - GetDisplayStrings: func(startIdx int, length int) [][]string { - return presentation.GetRemoteBranchListDisplayStrings(gui.State.RemoteBranches, gui.State.Modes.Diffing.Ref) - }, - SelectedItem: func() (ListItem, bool) { - item := gui.getSelectedRemoteBranch() - return item, item != nil - }, - } -} - -func (gui *Gui) tagsListContext() IListContext { - return &ListContext{ - BasicContext: &BasicContext{ - ViewName: "branches", - WindowName: "branches", - Key: TAGS_CONTEXT_KEY, - Kind: SIDE_CONTEXT, - }, - GetItemsLength: func() int { return len(gui.State.Tags) }, - OnGetPanelState: func() IListPanelState { return gui.State.Panels.Tags }, - OnRenderToMain: OnFocusWrapper(gui.tagsRenderToMain), - Gui: gui, - GetDisplayStrings: func(startIdx int, length int) [][]string { - return presentation.GetTagListDisplayStrings(gui.State.Tags, gui.State.Modes.Diffing.Ref) - }, - SelectedItem: func() (ListItem, bool) { - item := gui.getSelectedTag() - return item, item != nil - }, - } -} - -func (gui *Gui) branchCommitsListContext() IListContext { - parseEmoji := gui.UserConfig.Git.ParseEmoji - return &ListContext{ - BasicContext: &BasicContext{ - ViewName: "commits", - WindowName: "commits", - Key: BRANCH_COMMITS_CONTEXT_KEY, - Kind: SIDE_CONTEXT, - }, - GetItemsLength: func() int { return len(gui.State.Commits) }, - OnGetPanelState: func() IListPanelState { return gui.State.Panels.Commits }, - OnFocus: OnFocusWrapper(gui.onCommitFocus), - OnRenderToMain: OnFocusWrapper(gui.branchCommitsRenderToMain), - OnClickSelectedItem: gui.handleViewCommitFiles, - Gui: gui, - GetDisplayStrings: func(startIdx int, length int) [][]string { +func (gui *Gui) branchCommitsListContext() *context.LocalCommitsContext { + return context.NewLocalCommitsContext( + func() []*models.Commit { return gui.State.Model.Commits }, + gui.Views.Commits, + func(startIdx int, length int) [][]string { selectedCommitSha := "" - if gui.currentContext().GetKey() == BRANCH_COMMITS_CONTEXT_KEY { - selectedCommit := gui.getSelectedLocalCommit() + if gui.currentContext().GetKey() == context.LOCAL_COMMITS_CONTEXT_KEY { + selectedCommit := gui.State.Contexts.LocalCommits.GetSelected() if selectedCommit != nil { selectedCommitSha = selectedCommit.Sha } } return presentation.GetCommitListDisplayStrings( - gui.State.Commits, + gui.State.Model.Commits, gui.State.ScreenMode != SCREEN_NORMAL, - gui.cherryPickedCommitShaMap(), + gui.helpers.CherryPick.CherryPickedCommitShaSet(), gui.State.Modes.Diffing.Ref, - parseEmoji, + gui.c.UserConfig.Gui.TimeFormat, + gui.c.UserConfig.Git.ParseEmoji, selectedCommitSha, startIdx, length, gui.shouldShowGraph(), - gui.State.BisectInfo, + gui.State.Model.BisectInfo, ) }, - SelectedItem: func() (ListItem, bool) { - item := gui.getSelectedLocalCommit() - return item, item != nil - }, - RenderSelection: true, - } + OnFocusWrapper(gui.onCommitFocus), + gui.withDiffModeCheck(gui.branchCommitsRenderToMain), + nil, + gui.c, + ) } -func (gui *Gui) subCommitsListContext() IListContext { - parseEmoji := gui.UserConfig.Git.ParseEmoji - return &ListContext{ - BasicContext: &BasicContext{ - ViewName: "branches", - WindowName: "branches", - Key: SUB_COMMITS_CONTEXT_KEY, - Kind: SIDE_CONTEXT, - }, - GetItemsLength: func() int { return len(gui.State.SubCommits) }, - OnGetPanelState: func() IListPanelState { return gui.State.Panels.SubCommits }, - OnRenderToMain: OnFocusWrapper(gui.subCommitsRenderToMain), - Gui: gui, - GetDisplayStrings: func(startIdx int, length int) [][]string { +func (gui *Gui) subCommitsListContext() *context.SubCommitsContext { + return context.NewSubCommitsContext( + func() []*models.Commit { return gui.State.Model.SubCommits }, + gui.Views.SubCommits, + func(startIdx int, length int) [][]string { selectedCommitSha := "" - if gui.currentContext().GetKey() == SUB_COMMITS_CONTEXT_KEY { - selectedCommit := gui.getSelectedSubCommit() + if gui.currentContext().GetKey() == context.SUB_COMMITS_CONTEXT_KEY { + selectedCommit := gui.State.Contexts.SubCommits.GetSelected() if selectedCommit != nil { selectedCommitSha = selectedCommit.Sha } } return presentation.GetCommitListDisplayStrings( - gui.State.SubCommits, + gui.State.Model.SubCommits, gui.State.ScreenMode != SCREEN_NORMAL, - gui.cherryPickedCommitShaMap(), + gui.helpers.CherryPick.CherryPickedCommitShaSet(), gui.State.Modes.Diffing.Ref, - parseEmoji, + gui.c.UserConfig.Gui.TimeFormat, + gui.c.UserConfig.Git.ParseEmoji, selectedCommitSha, startIdx, length, @@ -228,12 +165,11 @@ func (gui *Gui) subCommitsListContext() IListContext { git_commands.NewNullBisectInfo(), ) }, - SelectedItem: func() (ListItem, bool) { - item := gui.getSelectedSubCommit() - return item, item != nil - }, - RenderSelection: true, - } + nil, + gui.withDiffModeCheck(gui.subCommitsRenderToMain), + nil, + gui.c, + ) } func (gui *Gui) shouldShowGraph() bool { @@ -241,7 +177,7 @@ func (gui *Gui) shouldShowGraph() bool { return false } - value := gui.UserConfig.Git.Log.ShowGraph + value := gui.c.UserConfig.Git.Log.ShowGraph switch value { case "always": return true @@ -255,138 +191,102 @@ func (gui *Gui) shouldShowGraph() bool { return false } -func (gui *Gui) reflogCommitsListContext() IListContext { - parseEmoji := gui.UserConfig.Git.ParseEmoji - return &ListContext{ - BasicContext: &BasicContext{ - ViewName: "commits", - WindowName: "commits", - Key: REFLOG_COMMITS_CONTEXT_KEY, - Kind: SIDE_CONTEXT, - }, - GetItemsLength: func() int { return len(gui.State.FilteredReflogCommits) }, - OnGetPanelState: func() IListPanelState { return gui.State.Panels.ReflogCommits }, - OnRenderToMain: OnFocusWrapper(gui.reflogCommitsRenderToMain), - Gui: gui, - GetDisplayStrings: func(startIdx int, length int) [][]string { +func (gui *Gui) reflogCommitsListContext() *context.ReflogCommitsContext { + return context.NewReflogCommitsContext( + func() []*models.Commit { return gui.State.Model.FilteredReflogCommits }, + gui.Views.ReflogCommits, + func(startIdx int, length int) [][]string { return presentation.GetReflogCommitListDisplayStrings( - gui.State.FilteredReflogCommits, + gui.State.Model.FilteredReflogCommits, gui.State.ScreenMode != SCREEN_NORMAL, - gui.cherryPickedCommitShaMap(), + gui.helpers.CherryPick.CherryPickedCommitShaSet(), gui.State.Modes.Diffing.Ref, - parseEmoji, + gui.c.UserConfig.Gui.TimeFormat, + gui.c.UserConfig.Git.ParseEmoji, ) }, - SelectedItem: func() (ListItem, bool) { - item := gui.getSelectedReflogCommit() - return item, item != nil - }, - } + nil, + gui.withDiffModeCheck(gui.reflogCommitsRenderToMain), + nil, + gui.c, + ) } -func (gui *Gui) stashListContext() IListContext { - return &ListContext{ - BasicContext: &BasicContext{ - ViewName: "stash", - WindowName: "stash", - Key: STASH_CONTEXT_KEY, - Kind: SIDE_CONTEXT, +func (gui *Gui) stashListContext() *context.StashContext { + return context.NewStashContext( + func() []*models.StashEntry { return gui.State.Model.StashEntries }, + gui.Views.Stash, + func(startIdx int, length int) [][]string { + return presentation.GetStashEntryListDisplayStrings(gui.State.Model.StashEntries, gui.State.Modes.Diffing.Ref) }, - GetItemsLength: func() int { return len(gui.State.StashEntries) }, - OnGetPanelState: func() IListPanelState { return gui.State.Panels.Stash }, - OnRenderToMain: OnFocusWrapper(gui.stashRenderToMain), - Gui: gui, - GetDisplayStrings: func(startIdx int, length int) [][]string { - return presentation.GetStashEntryListDisplayStrings(gui.State.StashEntries, gui.State.Modes.Diffing.Ref) - }, - SelectedItem: func() (ListItem, bool) { - item := gui.getSelectedStashEntry() - return item, item != nil - }, - } + nil, + gui.withDiffModeCheck(gui.stashRenderToMain), + nil, + gui.c, + ) } -func (gui *Gui) commitFilesListContext() IListContext { - return &ListContext{ - BasicContext: &BasicContext{ - ViewName: "commitFiles", - WindowName: "commits", - Key: COMMIT_FILES_CONTEXT_KEY, - Kind: SIDE_CONTEXT, - }, - GetItemsLength: func() int { return gui.State.CommitFileTreeViewModel.GetItemsLength() }, - OnGetPanelState: func() IListPanelState { return gui.State.Panels.CommitFiles }, - OnFocus: OnFocusWrapper(gui.onCommitFileFocus), - OnRenderToMain: OnFocusWrapper(gui.commitFilesRenderToMain), - Gui: gui, - GetDisplayStrings: func(startIdx int, length int) [][]string { - if gui.State.CommitFileTreeViewModel.GetItemsLength() == 0 { +func (gui *Gui) commitFilesListContext() *context.CommitFilesContext { + return context.NewCommitFilesContext( + func() []*models.CommitFile { return gui.State.Model.CommitFiles }, + gui.Views.CommitFiles, + func(startIdx int, length int) [][]string { + if gui.State.Contexts.CommitFiles.CommitFileTreeViewModel.Len() == 0 { return [][]string{{style.FgRed.Sprint("(none)")}} } - lines := presentation.RenderCommitFileTree(gui.State.CommitFileTreeViewModel, gui.State.Modes.Diffing.Ref, gui.Git.Patch.PatchManager) - mappedLines := make([][]string, len(lines)) - for i, line := range lines { - mappedLines[i] = []string{line} - } - - return mappedLines + lines := presentation.RenderCommitFileTree(gui.State.Contexts.CommitFiles.CommitFileTreeViewModel, gui.State.Modes.Diffing.Ref, gui.git.Patch.PatchManager) + return slices.Map(lines, func(line string) []string { + return []string{line} + }) }, - SelectedItem: func() (ListItem, bool) { - item := gui.getSelectedCommitFileNode() - return item, item != nil - }, - } + nil, + gui.withDiffModeCheck(gui.commitFilesRenderToMain), + nil, + gui.c, + ) } -func (gui *Gui) submodulesListContext() IListContext { - return &ListContext{ - BasicContext: &BasicContext{ - ViewName: "files", - WindowName: "files", - Key: SUBMODULES_CONTEXT_KEY, - Kind: SIDE_CONTEXT, +func (gui *Gui) submodulesListContext() *context.SubmodulesContext { + return context.NewSubmodulesContext( + func() []*models.SubmoduleConfig { return gui.State.Model.Submodules }, + gui.Views.Submodules, + func(startIdx int, length int) [][]string { + return presentation.GetSubmoduleListDisplayStrings(gui.State.Model.Submodules) }, - GetItemsLength: func() int { return len(gui.State.Submodules) }, - OnGetPanelState: func() IListPanelState { return gui.State.Panels.Submodules }, - OnRenderToMain: OnFocusWrapper(gui.submodulesRenderToMain), - Gui: gui, - GetDisplayStrings: func(startIdx int, length int) [][]string { - return presentation.GetSubmoduleListDisplayStrings(gui.State.Submodules) - }, - SelectedItem: func() (ListItem, bool) { - item := gui.getSelectedSubmodule() - return item, item != nil - }, - } + nil, + gui.withDiffModeCheck(gui.submodulesRenderToMain), + nil, + gui.c, + ) } -func (gui *Gui) suggestionsListContext() IListContext { - return &ListContext{ - BasicContext: &BasicContext{ - ViewName: "suggestions", - WindowName: "suggestions", - Key: SUGGESTIONS_CONTEXT_KEY, - Kind: PERSISTENT_POPUP, - }, - GetItemsLength: func() int { return len(gui.State.Suggestions) }, - OnGetPanelState: func() IListPanelState { return gui.State.Panels.Suggestions }, - Gui: gui, - GetDisplayStrings: func(startIdx int, length int) [][]string { +func (gui *Gui) suggestionsListContext() *context.SuggestionsContext { + return context.NewSuggestionsContext( + func() []*types.Suggestion { return gui.State.Suggestions }, + gui.Views.Suggestions, + func(startIdx int, length int) [][]string { return presentation.GetSuggestionListDisplayStrings(gui.State.Suggestions) }, - } + nil, + nil, + func(types.OnFocusLostOpts) error { + gui.deactivateConfirmationPrompt() + return nil + }, + gui.c, + ) } -func (gui *Gui) getListContexts() []IListContext { - return []IListContext{ +func (gui *Gui) getListContexts() []types.IListContext { + return []types.IListContext{ gui.State.Contexts.Menu, gui.State.Contexts.Files, gui.State.Contexts.Branches, gui.State.Contexts.Remotes, gui.State.Contexts.RemoteBranches, gui.State.Contexts.Tags, - gui.State.Contexts.BranchCommits, + gui.State.Contexts.LocalCommits, gui.State.Contexts.ReflogCommits, gui.State.Contexts.SubCommits, gui.State.Contexts.Stash, @@ -395,58 +295,3 @@ func (gui *Gui) getListContexts() []IListContext { gui.State.Contexts.Suggestions, } } - -func (gui *Gui) getListContextKeyBindings() []*Binding { - bindings := make([]*Binding, 0) - - keybindingConfig := gui.UserConfig.Keybinding - - for _, listContext := range gui.getListContexts() { - listContext := listContext - - bindings = append(bindings, []*Binding{ - {ViewName: listContext.GetViewName(), Tag: "navigation", Contexts: []string{string(listContext.GetKey())}, Key: gui.getKey(keybindingConfig.Universal.PrevItemAlt), Modifier: gocui.ModNone, Handler: listContext.handlePrevLine}, - {ViewName: listContext.GetViewName(), Tag: "navigation", Contexts: []string{string(listContext.GetKey())}, Key: gui.getKey(keybindingConfig.Universal.PrevItem), Modifier: gocui.ModNone, Handler: listContext.handlePrevLine}, - {ViewName: listContext.GetViewName(), Tag: "navigation", Contexts: []string{string(listContext.GetKey())}, Key: gocui.MouseWheelUp, Modifier: gocui.ModNone, Handler: listContext.handlePrevLine}, - {ViewName: listContext.GetViewName(), Tag: "navigation", Contexts: []string{string(listContext.GetKey())}, Key: gui.getKey(keybindingConfig.Universal.NextItemAlt), Modifier: gocui.ModNone, Handler: listContext.handleNextLine}, - {ViewName: listContext.GetViewName(), Tag: "navigation", Contexts: []string{string(listContext.GetKey())}, Key: gui.getKey(keybindingConfig.Universal.NextItem), Modifier: gocui.ModNone, Handler: listContext.handleNextLine}, - {ViewName: listContext.GetViewName(), Tag: "navigation", Contexts: []string{string(listContext.GetKey())}, Key: gui.getKey(keybindingConfig.Universal.PrevPage), Modifier: gocui.ModNone, Handler: listContext.handlePrevPage, Description: gui.Tr.LcPrevPage}, - {ViewName: listContext.GetViewName(), Tag: "navigation", Contexts: []string{string(listContext.GetKey())}, Key: gui.getKey(keybindingConfig.Universal.NextPage), Modifier: gocui.ModNone, Handler: listContext.handleNextPage, Description: gui.Tr.LcNextPage}, - {ViewName: listContext.GetViewName(), Tag: "navigation", Contexts: []string{string(listContext.GetKey())}, Key: gui.getKey(keybindingConfig.Universal.GotoTop), Modifier: gocui.ModNone, Handler: listContext.handleGotoTop, Description: gui.Tr.LcGotoTop}, - {ViewName: listContext.GetViewName(), Tag: "navigation", Contexts: []string{string(listContext.GetKey())}, Key: gocui.MouseWheelDown, Modifier: gocui.ModNone, Handler: listContext.handleNextLine}, - {ViewName: listContext.GetViewName(), Contexts: []string{string(listContext.GetKey())}, Key: gocui.MouseLeft, Modifier: gocui.ModNone, Handler: listContext.handleClick}, - {ViewName: listContext.GetViewName(), Tag: "navigation", Contexts: []string{string(listContext.GetKey())}, Key: gui.getKey(keybindingConfig.Universal.ScrollLeft), Modifier: gocui.ModNone, Handler: listContext.handleScrollLeft}, - {ViewName: listContext.GetViewName(), Tag: "navigation", Contexts: []string{string(listContext.GetKey())}, Key: gui.getKey(keybindingConfig.Universal.ScrollRight), Modifier: gocui.ModNone, Handler: listContext.handleScrollRight}, - }...) - - openSearchHandler := gui.handleOpenSearch - gotoBottomHandler := listContext.handleGotoBottom - - // the branch commits context needs to lazyload things so it has a couple of its own handlers - if listContext.GetKey() == BRANCH_COMMITS_CONTEXT_KEY { - openSearchHandler = gui.handleOpenSearchForCommitsPanel - gotoBottomHandler = gui.handleGotoBottomForCommitsPanel - } - - bindings = append(bindings, []*Binding{ - { - ViewName: listContext.GetViewName(), - Contexts: []string{string(listContext.GetKey())}, - Key: gui.getKey(keybindingConfig.Universal.StartSearch), - Handler: func() error { return openSearchHandler(listContext.GetViewName()) }, - Description: gui.Tr.LcStartSearch, - Tag: "navigation", - }, - { - ViewName: listContext.GetViewName(), - Contexts: []string{string(listContext.GetKey())}, - Key: gui.getKey(keybindingConfig.Universal.GotoBottom), - Handler: gotoBottomHandler, - Description: gui.Tr.LcGotoBottom, - Tag: "navigation", - }, - }...) - } - - return bindings -} diff --git a/pkg/gui/main_panels.go b/pkg/gui/main_panels.go index 72af94b1d..625391480 100644 --- a/pkg/gui/main_panels.go +++ b/pkg/gui/main_panels.go @@ -1,150 +1,120 @@ package gui import ( - "os/exec" - "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/gui/types" ) -type viewUpdateOpts struct { - title string +func (gui *Gui) runTaskForView(view *gocui.View, task types.UpdateTask) error { + switch v := task.(type) { + case *types.RenderStringTask: + return gui.newStringTask(view, v.Str) - // awkwardly calling this noWrap because of how hard Go makes it to have - // a boolean option that defaults to true - noWrap bool + case *types.RenderStringWithoutScrollTask: + return gui.newStringTaskWithoutScroll(view, v.Str) - highlight bool + case *types.RenderStringWithScrollTask: + return gui.newStringTaskWithScroll(view, v.Str, v.OriginX, v.OriginY) - task updateTask -} + case *types.RunCommandTask: + return gui.newCmdTask(view, v.Cmd, v.Prefix) -type refreshMainOpts struct { - main *viewUpdateOpts - secondary *viewUpdateOpts -} - -// constants for updateTask's kind field -type TaskKind int - -const ( - RENDER_STRING TaskKind = iota - RENDER_STRING_WITHOUT_SCROLL - RUN_COMMAND - RUN_PTY -) - -type updateTask interface { - GetKind() TaskKind -} - -type renderStringTask struct { - str string -} - -func (t *renderStringTask) GetKind() TaskKind { - return RENDER_STRING -} - -func NewRenderStringTask(str string) *renderStringTask { - return &renderStringTask{str: str} -} - -type renderStringWithoutScrollTask struct { - str string -} - -func (t *renderStringWithoutScrollTask) GetKind() TaskKind { - return RENDER_STRING_WITHOUT_SCROLL -} - -func NewRenderStringWithoutScrollTask(str string) *renderStringWithoutScrollTask { - return &renderStringWithoutScrollTask{str: str} -} - -type runCommandTask struct { - cmd *exec.Cmd - prefix string -} - -func (t *runCommandTask) GetKind() TaskKind { - return RUN_COMMAND -} - -func NewRunCommandTask(cmd *exec.Cmd) *runCommandTask { - return &runCommandTask{cmd: cmd} -} - -func NewRunCommandTaskWithPrefix(cmd *exec.Cmd, prefix string) *runCommandTask { - return &runCommandTask{cmd: cmd, prefix: prefix} -} - -type runPtyTask struct { - cmd *exec.Cmd - prefix string -} - -func (t *runPtyTask) GetKind() TaskKind { - return RUN_PTY -} - -func NewRunPtyTask(cmd *exec.Cmd) *runPtyTask { - return &runPtyTask{cmd: cmd} -} - -// currently unused -// func (gui *Gui) createRunPtyTaskWithPrefix(cmd *exec.Cmd, prefix string) *runPtyTask { -// return &runPtyTask{cmd: cmd, prefix: prefix} -// } - -func (gui *Gui) runTaskForView(view *gocui.View, task updateTask) error { - switch task.GetKind() { - case RENDER_STRING: - specificTask := task.(*renderStringTask) - return gui.newStringTask(view, specificTask.str) - - case RENDER_STRING_WITHOUT_SCROLL: - specificTask := task.(*renderStringWithoutScrollTask) - return gui.newStringTaskWithoutScroll(view, specificTask.str) - - case RUN_COMMAND: - specificTask := task.(*runCommandTask) - return gui.newCmdTask(view, specificTask.cmd, specificTask.prefix) - - case RUN_PTY: - specificTask := task.(*runPtyTask) - return gui.newPtyTask(view, specificTask.cmd, specificTask.prefix) + case *types.RunPtyTask: + return gui.newPtyTask(view, v.Cmd, v.Prefix) } return nil } -func (gui *Gui) refreshMainView(opts *viewUpdateOpts, view *gocui.View) error { - view.Title = opts.title - view.Wrap = !opts.noWrap - view.Highlight = opts.highlight +func (gui *Gui) moveMainContextPairToTop(pair types.MainContextPair) { + gui.setWindowContext(pair.Main) + gui.moveToTopOfWindow(pair.Main) + if pair.Secondary != nil { + gui.setWindowContext(pair.Secondary) + gui.moveToTopOfWindow(pair.Secondary) + } +} - if err := gui.runTaskForView(view, opts.task); err != nil { - gui.Log.Error(err) +func (gui *Gui) RefreshMainView(opts *types.ViewUpdateOpts, context types.Context) error { + view := context.GetView() + + if opts.Title != "" { + view.Title = opts.Title + } + + if err := gui.runTaskForView(view, opts.Task); err != nil { + gui.c.Log.Error(err) return nil } return nil } -func (gui *Gui) refreshMainViews(opts refreshMainOpts) error { - if opts.main != nil { - if err := gui.refreshMainView(opts.main, gui.Views.Main); err != nil { +func (gui *Gui) normalMainContextPair() types.MainContextPair { + return types.NewMainContextPair( + gui.State.Contexts.Normal, + gui.State.Contexts.NormalSecondary, + ) +} + +func (gui *Gui) stagingMainContextPair() types.MainContextPair { + return types.NewMainContextPair( + gui.State.Contexts.Staging, + gui.State.Contexts.StagingSecondary, + ) +} + +func (gui *Gui) patchBuildingMainContextPair() types.MainContextPair { + return types.NewMainContextPair( + gui.State.Contexts.CustomPatchBuilder, + gui.State.Contexts.CustomPatchBuilderSecondary, + ) +} + +func (gui *Gui) mergingMainContextPair() types.MainContextPair { + return types.NewMainContextPair( + gui.State.Contexts.MergeConflicts, + nil, + ) +} + +func (gui *Gui) allMainContextPairs() []types.MainContextPair { + return []types.MainContextPair{ + gui.normalMainContextPair(), + gui.stagingMainContextPair(), + gui.patchBuildingMainContextPair(), + gui.mergingMainContextPair(), + } +} + +func (gui *Gui) refreshMainViews(opts types.RefreshMainOpts) error { + // need to reset scroll positions of all other main views + for _, pair := range gui.allMainContextPairs() { + if pair.Main != opts.Pair.Main { + _ = pair.Main.GetView().SetOrigin(0, 0) + } + if pair.Secondary != nil && pair.Secondary != opts.Pair.Secondary { + _ = pair.Secondary.GetView().SetOrigin(0, 0) + } + } + + if opts.Main != nil { + if err := gui.RefreshMainView(opts.Main, opts.Pair.Main); err != nil { return err } } - if opts.secondary != nil { - if err := gui.refreshMainView(opts.secondary, gui.Views.Secondary); err != nil { + if opts.Secondary != nil { + if err := gui.RefreshMainView(opts.Secondary, opts.Pair.Secondary); err != nil { return err } + } else if opts.Pair.Secondary != nil { + opts.Pair.Secondary.GetView().Clear() } - gui.splitMainPanel(opts.secondary != nil) + gui.moveMainContextPairToTop(opts.Pair) + + gui.splitMainPanel(opts.Secondary != nil) return nil } diff --git a/pkg/gui/menu_panel.go b/pkg/gui/menu_panel.go index b32b3bf44..bc3d087c3 100644 --- a/pkg/gui/menu_panel.go +++ b/pkg/gui/menu_panel.go @@ -1,105 +1,79 @@ package gui import ( - "errors" "fmt" - "strings" + "github.com/jesseduffield/lazygit/pkg/gui/keybindings" + "github.com/jesseduffield/lazygit/pkg/gui/presentation" + "github.com/jesseduffield/lazygit/pkg/gui/types" "github.com/jesseduffield/lazygit/pkg/theme" "github.com/jesseduffield/lazygit/pkg/utils" ) -type menuItem struct { - displayString string - displayStrings []string - onPress func() error - // only applies when displayString is used - opensMenu bool -} - -// every item in a list context needs an ID -func (i *menuItem) ID() string { - if i.displayString != "" { - return i.displayString - } - - return strings.Join(i.displayStrings, "-") -} - -// specific functions - func (gui *Gui) getMenuOptions() map[string]string { - keybindingConfig := gui.UserConfig.Keybinding + keybindingConfig := gui.c.UserConfig.Keybinding return map[string]string{ - gui.getKeyDisplay(keybindingConfig.Universal.Return): gui.Tr.LcClose, - fmt.Sprintf("%s %s", gui.getKeyDisplay(keybindingConfig.Universal.PrevItem), gui.getKeyDisplay(keybindingConfig.Universal.NextItem)): gui.Tr.LcNavigate, - gui.getKeyDisplay(keybindingConfig.Universal.Select): gui.Tr.LcExecute, + keybindings.Label(keybindingConfig.Universal.Return): gui.c.Tr.LcClose, + fmt.Sprintf("%s %s", keybindings.Label(keybindingConfig.Universal.PrevItem), keybindings.Label(keybindingConfig.Universal.NextItem)): gui.c.Tr.LcNavigate, + keybindings.Label(keybindingConfig.Universal.Select): gui.c.Tr.LcExecute, } } -func (gui *Gui) handleMenuClose() error { - return gui.returnFromContext() -} - -type createMenuOptions struct { - showCancel bool -} - -func (gui *Gui) createMenu(title string, items []*menuItem, createMenuOptions createMenuOptions) error { - if createMenuOptions.showCancel { +// note: items option is mutated by this function +func (gui *Gui) createMenu(opts types.CreateMenuOptions) error { + if !opts.HideCancel { // this is mutative but I'm okay with that for now - items = append(items, &menuItem{ - displayStrings: []string{gui.Tr.LcCancel}, - onPress: func() error { + opts.Items = append(opts.Items, &types.MenuItem{ + LabelColumns: []string{gui.c.Tr.LcCancel}, + OnPress: func() error { return nil }, }) } - gui.State.MenuItems = items + maxColumnSize := 1 - stringArrays := make([][]string, len(items)) - for i, item := range items { - if item.opensMenu && item.displayStrings != nil { - return errors.New("Message for the developer of this app: you've set opensMenu with displaystrings on the menu panel. Bad developer!. Apologies, user") + for _, item := range opts.Items { + if item.LabelColumns == nil { + item.LabelColumns = []string{item.Label} } - if item.displayStrings == nil { - styledStr := item.displayString - if item.opensMenu { - styledStr = opensMenuStyle(styledStr) - } - stringArrays[i] = []string{styledStr} - } else { - stringArrays[i] = item.displayStrings + if item.OpensMenu { + item.LabelColumns[0] = presentation.OpensMenuStyle(item.LabelColumns[0]) + } + + maxColumnSize = utils.Max(maxColumnSize, len(item.LabelColumns)) + } + + for _, item := range opts.Items { + if len(item.LabelColumns) < maxColumnSize { + // we require that each item has the same number of columns so we're padding out with blank strings + // if this item has too few + item.LabelColumns = append(item.LabelColumns, make([]string, maxColumnSize-len(item.LabelColumns))...) } } - list := utils.RenderDisplayStrings(stringArrays) + gui.State.Contexts.Menu.SetMenuItems(opts.Items) + gui.State.Contexts.Menu.SetSelectedLineIdx(0) - x0, y0, x1, y1 := gui.getConfirmationPanelDimensions(false, list) - menuView, _ := gui.g.SetView("menu", x0, y0, x1, y1, 0) - menuView.Title = title - menuView.FgColor = theme.GocuiDefaultTextColor - menuView.SetOnSelectItem(gui.onSelectItemWrapper(func(selectedLine int) error { + gui.Views.Menu.Title = opts.Title + gui.Views.Menu.FgColor = theme.GocuiDefaultTextColor + gui.Views.Menu.SetOnSelectItem(gui.onSelectItemWrapper(func(selectedLine int) error { return nil })) - menuView.SetContent(list) - gui.State.Panels.Menu.SelectedLineIdx = 0 - return gui.pushContext(gui.State.Contexts.Menu) -} + gui.Views.Tooltip.Wrap = true + gui.Views.Tooltip.FgColor = theme.GocuiDefaultTextColor + gui.Views.Tooltip.Visible = true -func (gui *Gui) onMenuPress() error { - selectedLine := gui.State.Panels.Menu.SelectedLineIdx - if err := gui.returnFromContext(); err != nil { + // resetting keybindings so that the menu-specific keybindings are registered + if err := gui.resetKeybindings(); err != nil { return err } - if err := gui.State.MenuItems[selectedLine].onPress(); err != nil { - return err - } + _ = gui.c.PostRefreshUpdate(gui.State.Contexts.Menu) - return nil + // TODO: ensure that if we're opened a menu from within a menu that it renders correctly + return gui.c.PushContext(gui.State.Contexts.Menu) } diff --git a/pkg/gui/merge_panel.go b/pkg/gui/merge_panel.go deleted file mode 100644 index dbd5b3be7..000000000 --- a/pkg/gui/merge_panel.go +++ /dev/null @@ -1,304 +0,0 @@ -// though this panel is called the merge panel, it's really going to use the main panel. This may change in the future - -package gui - -import ( - "fmt" - "io/ioutil" - "math" - - "github.com/jesseduffield/gocui" - "github.com/jesseduffield/lazygit/pkg/gui/mergeconflicts" -) - -func (gui *Gui) handleSelectPrevConflictHunk() error { - return gui.withMergeConflictLock(func() error { - gui.takeOverMergeConflictScrolling() - gui.State.Panels.Merging.SelectPrevConflictHunk() - return gui.renderConflictsWithFocus() - }) -} - -func (gui *Gui) handleSelectNextConflictHunk() error { - return gui.withMergeConflictLock(func() error { - gui.takeOverMergeConflictScrolling() - gui.State.Panels.Merging.SelectNextConflictHunk() - return gui.renderConflictsWithFocus() - }) -} - -func (gui *Gui) handleSelectNextConflict() error { - return gui.withMergeConflictLock(func() error { - gui.takeOverMergeConflictScrolling() - gui.State.Panels.Merging.SelectNextConflict() - return gui.renderConflictsWithFocus() - }) -} - -func (gui *Gui) handleSelectPrevConflict() error { - return gui.withMergeConflictLock(func() error { - gui.takeOverMergeConflictScrolling() - gui.State.Panels.Merging.SelectPrevConflict() - return gui.renderConflictsWithFocus() - }) -} - -func (gui *Gui) handleMergeConflictUndo() error { - state := gui.State.Panels.Merging - - ok := state.Undo() - if !ok { - return nil - } - - gui.logAction("Restoring file to previous state") - gui.logCommand("Undoing last conflict resolution", false) - if err := ioutil.WriteFile(state.GetPath(), []byte(state.GetContent()), 0644); err != nil { - return err - } - - return gui.renderConflictsWithFocus() -} - -func (gui *Gui) handlePickHunk() error { - return gui.withMergeConflictLock(func() error { - ok, err := gui.resolveConflict(gui.State.Panels.Merging.Selection()) - if err != nil { - return err - } - - if !ok { - return nil - } - - if gui.State.Panels.Merging.AllConflictsResolved() { - return gui.onLastConflictResolved() - } - - return gui.renderConflictsWithFocus() - }) -} - -func (gui *Gui) handlePickAllHunks() error { - return gui.withMergeConflictLock(func() error { - ok, err := gui.resolveConflict(mergeconflicts.ALL) - if err != nil { - return err - } - - if !ok { - return nil - } - - if gui.State.Panels.Merging.AllConflictsResolved() { - return gui.onLastConflictResolved() - } - - return gui.renderConflictsWithFocus() - }) -} - -func (gui *Gui) resolveConflict(selection mergeconflicts.Selection) (bool, error) { - gui.takeOverMergeConflictScrolling() - - state := gui.State.Panels.Merging - - ok, content, err := state.ContentAfterConflictResolve(selection) - if err != nil { - return false, err - } - - if !ok { - return false, nil - } - - var logStr string - switch selection { - case mergeconflicts.TOP: - logStr = "Picking top hunk" - case mergeconflicts.MIDDLE: - logStr = "Picking middle hunk" - case mergeconflicts.BOTTOM: - logStr = "Picking bottom hunk" - case mergeconflicts.ALL: - logStr = "Picking all hunks" - } - gui.logAction("Resolve merge conflict") - gui.logCommand(logStr, false) - state.PushContent(content) - return true, ioutil.WriteFile(state.GetPath(), []byte(content), 0644) -} - -// precondition: we actually have conflicts to render -func (gui *Gui) renderConflicts(hasFocus bool) error { - state := gui.State.Panels.Merging.State - content := mergeconflicts.ColoredConflictFile(state, hasFocus) - - if !gui.State.Panels.Merging.UserVerticalScrolling { - // TODO: find a way to not have to do this OnUIThread thing. Why doesn't it work - // without it given that we're calling the 'no scroll' variant below? - gui.OnUIThread(func() error { - gui.State.Panels.Merging.Lock() - defer gui.State.Panels.Merging.Unlock() - - if !state.Active() { - return nil - } - - gui.centerYPos(gui.Views.Main, state.GetConflictMiddle()) - return nil - }) - } - - return gui.refreshMainViews(refreshMainOpts{ - main: &viewUpdateOpts{ - title: gui.Tr.MergeConflictsTitle, - task: NewRenderStringWithoutScrollTask(content), - noWrap: true, - }, - }) -} - -func (gui *Gui) renderConflictsWithFocus() error { - return gui.renderConflicts(true) -} - -func (gui *Gui) renderConflictsWithLock(hasFocus bool) error { - return gui.withMergeConflictLock(func() error { - return gui.renderConflicts(hasFocus) - }) -} - -func (gui *Gui) centerYPos(view *gocui.View, y int) { - ox, _ := view.Origin() - _, height := view.Size() - newOriginY := int(math.Max(0, float64(y-(height/2)))) - _ = view.SetOrigin(ox, newOriginY) -} - -func (gui *Gui) getMergingOptions() map[string]string { - keybindingConfig := gui.UserConfig.Keybinding - - return map[string]string{ - fmt.Sprintf("%s %s", gui.getKeyDisplay(keybindingConfig.Universal.PrevItem), gui.getKeyDisplay(keybindingConfig.Universal.NextItem)): gui.Tr.LcSelectHunk, - fmt.Sprintf("%s %s", gui.getKeyDisplay(keybindingConfig.Universal.PrevBlock), gui.getKeyDisplay(keybindingConfig.Universal.NextBlock)): gui.Tr.LcNavigateConflicts, - gui.getKeyDisplay(keybindingConfig.Universal.Select): gui.Tr.LcPickHunk, - gui.getKeyDisplay(keybindingConfig.Main.PickBothHunks): gui.Tr.LcPickAllHunks, - gui.getKeyDisplay(keybindingConfig.Universal.Undo): gui.Tr.LcUndo, - } -} - -func (gui *Gui) handleEscapeMerge() error { - if err := gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{FILES}}); err != nil { - return err - } - - return gui.escapeMerge() -} - -func (gui *Gui) onLastConflictResolved() error { - // as part of refreshing files, we handle the situation where a file has had - // its merge conflicts resolved. - return gui.refreshSidePanels(refreshOptions{mode: ASYNC, scope: []RefreshableView{FILES}}) -} - -func (gui *Gui) resetMergeState() { - gui.takeOverMergeConflictScrolling() - gui.State.Panels.Merging.Reset() -} - -func (gui *Gui) setMergeState(path string) (bool, error) { - content, err := gui.Git.File.Cat(path) - if err != nil { - return false, err - } - - gui.State.Panels.Merging.SetContent(content, path) - - return !gui.State.Panels.Merging.NoConflicts(), nil -} - -func (gui *Gui) setMergeStateWithLock(path string) (bool, error) { - gui.State.Panels.Merging.Lock() - defer gui.State.Panels.Merging.Unlock() - - return gui.setMergeState(path) -} - -func (gui *Gui) resetMergeStateWithLock() { - gui.State.Panels.Merging.Lock() - defer gui.State.Panels.Merging.Unlock() - - gui.resetMergeState() -} - -func (gui *Gui) escapeMerge() error { - gui.resetMergeState() - - // doing this in separate UI thread so that we're not still holding the lock by the time refresh the file - gui.OnUIThread(func() error { - return gui.pushContext(gui.State.Contexts.Files) - }) - return nil -} - -func (gui *Gui) renderingConflicts() bool { - currentView := gui.g.CurrentView() - if currentView != gui.Views.Main && currentView != gui.Views.Files { - return false - } - - return gui.State.Panels.Merging.Active() -} - -func (gui *Gui) withMergeConflictLock(f func() error) error { - gui.State.Panels.Merging.Lock() - defer gui.State.Panels.Merging.Unlock() - - return f() -} - -func (gui *Gui) takeOverMergeConflictScrolling() { - gui.State.Panels.Merging.UserVerticalScrolling = false -} - -func (gui *Gui) setConflictsAndRender(path string, hasFocus bool) (bool, error) { - hasConflicts, err := gui.setMergeState(path) - if err != nil { - return false, err - } - - // if we don't have conflicts we'll fall through and show the diff - if hasConflicts { - return true, gui.renderConflicts(hasFocus) - } - - return false, nil -} - -func (gui *Gui) setConflictsAndRenderWithLock(path string, hasFocus bool) (bool, error) { - gui.State.Panels.Merging.Lock() - defer gui.State.Panels.Merging.Unlock() - - return gui.setConflictsAndRender(path, hasFocus) -} - -func (gui *Gui) refreshMergeState() error { - gui.State.Panels.Merging.Lock() - defer gui.State.Panels.Merging.Unlock() - - if gui.currentContext().GetKey() != MAIN_MERGING_CONTEXT_KEY { - return nil - } - - hasConflicts, err := gui.setConflictsAndRender(gui.State.Panels.Merging.GetPath(), true) - if err != nil { - return gui.surfaceError(err) - } - - if !hasConflicts { - return gui.escapeMerge() - } - - return nil -} diff --git a/pkg/gui/mergeconflicts/find_conflicts.go b/pkg/gui/mergeconflicts/find_conflicts.go index 14a08fd68..3802a66b7 100644 --- a/pkg/gui/mergeconflicts/find_conflicts.go +++ b/pkg/gui/mergeconflicts/find_conflicts.go @@ -57,10 +57,12 @@ func findConflicts(content string) []*mergeConflict { return conflicts } -var CONFLICT_START = "<<<<<<< " -var CONFLICT_END = ">>>>>>> " -var CONFLICT_START_BYTES = []byte(CONFLICT_START) -var CONFLICT_END_BYTES = []byte(CONFLICT_END) +var ( + CONFLICT_START = "<<<<<<< " + CONFLICT_END = ">>>>>>> " + CONFLICT_START_BYTES = []byte(CONFLICT_START) + CONFLICT_END_BYTES = []byte(CONFLICT_END) +) func determineLineType(line string) LineType { // TODO: find out whether we ever actually get this prefix diff --git a/pkg/gui/mergeconflicts/state.go b/pkg/gui/mergeconflicts/state.go index d84f05545..384fb735f 100644 --- a/pkg/gui/mergeconflicts/state.go +++ b/pkg/gui/mergeconflicts/state.go @@ -1,14 +1,11 @@ package mergeconflicts import ( - "sync" - "github.com/jesseduffield/lazygit/pkg/utils" ) +// State represents the selection state of the merge conflict context. type State struct { - sync.Mutex - // path of the file with the conflicts path string @@ -27,7 +24,6 @@ type State struct { func NewState() *State { return &State{ - Mutex: sync.Mutex{}, conflictIndex: 0, selectionIndex: 0, conflicts: []*mergeConflict{}, @@ -39,14 +35,14 @@ func (s *State) setConflictIndex(index int) { if len(s.conflicts) == 0 { s.conflictIndex = 0 } else { - s.conflictIndex = clamp(index, 0, len(s.conflicts)-1) + s.conflictIndex = utils.Clamp(index, 0, len(s.conflicts)-1) } s.setSelectionIndex(s.selectionIndex) } func (s *State) setSelectionIndex(index int) { if selections := s.availableSelections(); len(selections) != 0 { - s.selectionIndex = clamp(index, 0, len(selections)-1) + s.selectionIndex = utils.Clamp(index, 0, len(selections)-1) } } @@ -150,6 +146,12 @@ func (s *State) Reset() { s.path = "" } +// we're not resetting selectedIndex here because the user typically would want +// to pick either all top hunks or all bottom hunks so we retain that selection +func (s *State) ResetConflictSelection() { + s.conflictIndex = 0 +} + func (s *State) Active() bool { return s.path != "" } @@ -176,7 +178,6 @@ func (s *State) ContentAfterConflictResolve(selection Selection) (bool, string, content += line } }) - if err != nil { return false, "", err } @@ -184,11 +185,12 @@ func (s *State) ContentAfterConflictResolve(selection Selection) (bool, string, return true, content, nil } -func clamp(x int, min int, max int) int { - if x < min { - return min - } else if x > max { - return max +func (s *State) GetSelectedLine() int { + conflict := s.currentConflict() + if conflict == nil { + return 1 } - return x + selection := s.Selection() + startIndex, _ := selection.bounds(conflict) + return startIndex + 1 } diff --git a/pkg/gui/modes.go b/pkg/gui/modes.go index b60fafc8a..3a3bc51a6 100644 --- a/pkg/gui/modes.go +++ b/pkg/gui/modes.go @@ -21,7 +21,7 @@ func (gui *Gui) modeStatuses() []modeStatus { return gui.withResetButton( fmt.Sprintf( "%s %s", - gui.Tr.LcShowingGitDiff, + gui.c.Tr.LcShowingGitDiff, "git diff "+gui.diffStr(), ), style.FgMagenta, @@ -30,11 +30,11 @@ func (gui *Gui) modeStatuses() []modeStatus { reset: gui.exitDiffMode, }, { - isActive: gui.Git.Patch.PatchManager.Active, + isActive: gui.git.Patch.PatchManager.Active, description: func() string { - return gui.withResetButton(gui.Tr.LcBuildingPatch, style.FgYellow.SetBold()) + return gui.withResetButton(gui.c.Tr.LcBuildingPatch, style.FgYellow.SetBold()) }, - reset: gui.handleResetPatch, + reset: gui.helpers.PatchBuilding.Reset, }, { isActive: gui.State.Modes.Filtering.Active, @@ -42,7 +42,7 @@ func (gui *Gui) modeStatuses() []modeStatus { return gui.withResetButton( fmt.Sprintf( "%s '%s'", - gui.Tr.LcFilteringBy, + gui.c.Tr.LcFilteringBy, gui.State.Modes.Filtering.GetPath(), ), style.FgRed, @@ -61,28 +61,28 @@ func (gui *Gui) modeStatuses() []modeStatus { style.FgCyan, ) }, - reset: gui.exitCherryPickingMode, + reset: gui.helpers.CherryPick.Reset, }, { isActive: func() bool { - return gui.Git.Status.WorkingTreeState() != enums.REBASE_MODE_NONE + return gui.git.Status.WorkingTreeState() != enums.REBASE_MODE_NONE }, description: func() string { - workingTreeState := gui.Git.Status.WorkingTreeState() + workingTreeState := gui.git.Status.WorkingTreeState() return gui.withResetButton( formatWorkingTreeState(workingTreeState), style.FgYellow, ) }, - reset: gui.abortMergeOrRebaseWithConfirm, + reset: gui.helpers.MergeAndRebase.AbortMergeOrRebaseWithConfirm, }, { isActive: func() bool { - return gui.State.BisectInfo.Started() + return gui.State.Model.BisectInfo.Started() }, description: func() string { return gui.withResetButton("bisecting", style.FgGreen) }, - reset: gui.resetBisect, + reset: gui.helpers.Bisect.Reset, }, } } @@ -91,6 +91,6 @@ func (gui *Gui) withResetButton(content string, textStyle style.TextStyle) strin return textStyle.Sprintf( "%s %s", content, - style.AttrUnderline.Sprint(gui.Tr.ResetInParentheses), + style.AttrUnderline.Sprint(gui.c.Tr.ResetInParentheses), ) } diff --git a/pkg/gui/modes/cherrypicking/cherry_picking.go b/pkg/gui/modes/cherrypicking/cherry_picking.go index 705735510..bd5c6437a 100644 --- a/pkg/gui/modes/cherrypicking/cherry_picking.go +++ b/pkg/gui/modes/cherrypicking/cherry_picking.go @@ -11,8 +11,8 @@ type CherryPicking struct { ContextKey string } -func New() CherryPicking { - return CherryPicking{ +func New() *CherryPicking { + return &CherryPicking{ CherryPickedCommits: make([]*models.Commit, 0), ContextKey: "", } diff --git a/pkg/gui/modes/diffing/diffing.go b/pkg/gui/modes/diffing/diffing.go index a5e103d62..aa13bd1c1 100644 --- a/pkg/gui/modes/diffing/diffing.go +++ b/pkg/gui/modes/diffing/diffing.go @@ -10,6 +10,19 @@ func New() Diffing { return Diffing{} } -func (m *Diffing) Active() bool { - return m.Ref != "" +func (self *Diffing) Active() bool { + return self.Ref != "" +} + +// GetFromAndReverseArgsForDiff tells us the from and reverse args to be used in a diff command. +// If we're not in diff mode we'll end up with the equivalent of a `git show` i.e `git diff blah^..blah`. +func (self *Diffing) GetFromAndReverseArgsForDiff(from string) (string, bool) { + reverse := false + + if self.Active() { + reverse = self.Reverse + from = self.Ref + } + + return from, reverse } diff --git a/pkg/gui/options_menu_panel.go b/pkg/gui/options_menu_panel.go index 12507597f..909c97fc8 100644 --- a/pkg/gui/options_menu_panel.go +++ b/pkg/gui/options_menu_panel.go @@ -1,76 +1,77 @@ package gui import ( - "strings" + "log" - "github.com/jesseduffield/gocui" - "github.com/jesseduffield/lazygit/pkg/gui/style" - "github.com/jesseduffield/lazygit/pkg/utils" + "github.com/jesseduffield/generics/slices" + "github.com/jesseduffield/lazygit/pkg/gui/keybindings" + "github.com/jesseduffield/lazygit/pkg/gui/types" + "github.com/samber/lo" ) -func (gui *Gui) getBindings(v *gocui.View) []*Binding { - var ( - bindingsGlobal, bindingsPanel []*Binding - ) +func (gui *Gui) getBindings(context types.Context) []*types.Binding { + var bindingsGlobal, bindingsPanel, bindingsNavigation []*types.Binding - bindings := append(gui.GetCustomCommandKeybindings(), gui.GetInitialKeybindings()...) + bindings, _ := gui.GetInitialKeybindings() + customBindings, err := gui.CustomCommandsClient.GetCustomCommandKeybindings() + if err != nil { + log.Fatal(err) + } + bindings = append(customBindings, bindings...) for _, binding := range bindings { - if GetKeyDisplay(binding.Key) != "" && binding.Description != "" { - switch binding.ViewName { - case "": + if keybindings.LabelFromKey(binding.Key) != "" && binding.Description != "" { + if binding.ViewName == "" { bindingsGlobal = append(bindingsGlobal, binding) - case v.Name(): - if len(binding.Contexts) == 0 || utils.IncludesString(binding.Contexts, v.Context) { - bindingsPanel = append(bindingsPanel, binding) - } + } else if binding.Tag == "navigation" { + bindingsNavigation = append(bindingsNavigation, binding) + } else if binding.ViewName == context.GetViewName() { + bindingsPanel = append(bindingsPanel, binding) } } } - // append dummy element to have a separator between - // panel and global keybindings - bindingsPanel = append(bindingsPanel, &Binding{}) - return append(bindingsPanel, bindingsGlobal...) + resultBindings := []*types.Binding{} + resultBindings = append(resultBindings, uniqueBindings(bindingsPanel)...) + // adding a separator between the panel-specific bindings and the other bindings + resultBindings = append(resultBindings, &types.Binding{}) + resultBindings = append(resultBindings, uniqueBindings(bindingsGlobal)...) + resultBindings = append(resultBindings, uniqueBindings(bindingsNavigation)...) + + return resultBindings } -func (gui *Gui) displayDescription(binding *Binding) string { - if binding.OpensMenu { - return opensMenuStyle(binding.Description) - } - - return style.FgCyan.Sprint(binding.Description) -} - -func opensMenuStyle(str string) string { - return style.FgMagenta.Sprintf("%s...", str) +// We shouldn't really need to do this. We should define alternative keys for the same +// handler in the keybinding struct. +func uniqueBindings(bindings []*types.Binding) []*types.Binding { + return lo.UniqBy(bindings, func(binding *types.Binding) string { + return binding.Description + }) } func (gui *Gui) handleCreateOptionsMenu() error { - view := gui.g.CurrentView() - if view == nil { - return nil - } + context := gui.currentContext() + bindings := gui.getBindings(context) - bindings := gui.getBindings(view) - - menuItems := make([]*menuItem, len(bindings)) - - for i, binding := range bindings { - binding := binding // note to self, never close over loop variables - menuItems[i] = &menuItem{ - displayStrings: []string{GetKeyDisplay(binding.Key), gui.displayDescription(binding)}, - onPress: func() error { + menuItems := slices.Map(bindings, func(binding *types.Binding) *types.MenuItem { + return &types.MenuItem{ + OpensMenu: binding.OpensMenu, + Label: binding.Description, + OnPress: func() error { if binding.Key == nil { return nil } - if err := gui.handleMenuClose(); err != nil { - return err - } + return binding.Handler() }, + Key: binding.Key, + Tooltip: binding.Tooltip, } - } + }) - return gui.createMenu(strings.Title(gui.Tr.LcMenu), menuItems, createMenuOptions{}) + return gui.c.Menu(types.CreateMenuOptions{ + Title: gui.c.Tr.MenuTitle, + Items: menuItems, + HideCancel: true, + }) } diff --git a/pkg/gui/patch_building_panel.go b/pkg/gui/patch_building_panel.go deleted file mode 100644 index eb7728100..000000000 --- a/pkg/gui/patch_building_panel.go +++ /dev/null @@ -1,144 +0,0 @@ -package gui - -import ( - "github.com/jesseduffield/lazygit/pkg/utils" -) - -// getFromAndReverseArgsForDiff tells us the from and reverse args to be used in a diff command. If we're not in diff mode we'll end up with the equivalent of a `git show` i.e `git diff blah^..blah`. -func (gui *Gui) getFromAndReverseArgsForDiff(to string) (string, bool) { - from := to + "^" - reverse := false - - if gui.State.Modes.Diffing.Active() { - reverse = gui.State.Modes.Diffing.Reverse - from = gui.State.Modes.Diffing.Ref - } - - return from, reverse -} - -func (gui *Gui) refreshPatchBuildingPanel(selectedLineIdx int) error { - if !gui.Git.Patch.PatchManager.Active() { - return gui.handleEscapePatchBuildingPanel() - } - - gui.Views.Main.Title = "Patch" - gui.Views.Secondary.Title = "Custom Patch" - - // get diff from commit file that's currently selected - node := gui.getSelectedCommitFileNode() - if node == nil { - return nil - } - - to := gui.State.CommitFileTreeViewModel.GetParent() - from, reverse := gui.getFromAndReverseArgsForDiff(to) - diff, err := gui.Git.WorkingTree.ShowFileDiff(from, to, reverse, node.GetPath(), true) - if err != nil { - return err - } - - secondaryDiff := gui.Git.Patch.PatchManager.RenderPatchForFile(node.GetPath(), true, false, true) - if err != nil { - return err - } - - empty, err := gui.refreshLineByLinePanel(diff, secondaryDiff, false, selectedLineIdx) - if err != nil { - return err - } - - if empty { - return gui.handleEscapePatchBuildingPanel() - } - - return nil -} - -func (gui *Gui) handleRefreshPatchBuildingPanel(selectedLineIdx int) error { - gui.Mutexes.LineByLinePanelMutex.Lock() - defer gui.Mutexes.LineByLinePanelMutex.Unlock() - - return gui.refreshPatchBuildingPanel(selectedLineIdx) -} - -func (gui *Gui) onPatchBuildingFocus(selectedLineIdx int) error { - gui.Mutexes.LineByLinePanelMutex.Lock() - defer gui.Mutexes.LineByLinePanelMutex.Unlock() - - if gui.State.Panels.LineByLine == nil || selectedLineIdx != -1 { - return gui.refreshPatchBuildingPanel(selectedLineIdx) - } - - return nil -} - -func (gui *Gui) handleToggleSelectionForPatch() error { - err := gui.withLBLActiveCheck(func(state *LblPanelState) error { - toggleFunc := gui.Git.Patch.PatchManager.AddFileLineRange - filename := gui.getSelectedCommitFileName() - includedLineIndices, err := gui.Git.Patch.PatchManager.GetFileIncLineIndices(filename) - if err != nil { - return err - } - currentLineIsStaged := utils.IncludesInt(includedLineIndices, state.GetSelectedLineIdx()) - if currentLineIsStaged { - toggleFunc = gui.Git.Patch.PatchManager.RemoveFileLineRange - } - - // add range of lines to those set for the file - node := gui.getSelectedCommitFileNode() - if node == nil { - return nil - } - - firstLineIdx, lastLineIdx := state.SelectedRange() - - if err := toggleFunc(node.GetPath(), firstLineIdx, lastLineIdx); err != nil { - // might actually want to return an error here - gui.Log.Error(err) - } - - return nil - }) - - if err != nil { - return err - } - - if err := gui.refreshCommitFilesView(); err != nil { - return err - } - - return nil -} - -func (gui *Gui) handleEscapePatchBuildingPanel() error { - gui.escapeLineByLinePanel() - - if gui.Git.Patch.PatchManager.IsEmpty() { - gui.Git.Patch.PatchManager.Reset() - } - - if gui.currentContext().GetKey() == gui.State.Contexts.PatchBuilding.GetKey() { - return gui.pushContext(gui.State.Contexts.CommitFiles) - } else { - // need to re-focus in case the secondary view should now be hidden - return gui.currentContext().HandleFocus() - } -} - -func (gui *Gui) secondaryPatchPanelUpdateOpts() *viewUpdateOpts { - if gui.Git.Patch.PatchManager.Active() { - patch := gui.Git.Patch.PatchManager.RenderAggregatedPatchColored(false) - - return &viewUpdateOpts{ - title: "Custom Patch", - noWrap: true, - highlight: true, - task: NewRenderStringWithoutScrollTask(patch), - } - } - - return nil -} diff --git a/pkg/gui/lbl/focus.go b/pkg/gui/patch_exploring/focus.go similarity index 98% rename from pkg/gui/lbl/focus.go rename to pkg/gui/patch_exploring/focus.go index 780551e5d..cf0908999 100644 --- a/pkg/gui/lbl/focus.go +++ b/pkg/gui/patch_exploring/focus.go @@ -1,4 +1,4 @@ -package lbl +package patch_exploring import "github.com/jesseduffield/lazygit/pkg/utils" diff --git a/pkg/gui/lbl/focus_test.go b/pkg/gui/patch_exploring/focus_test.go similarity index 98% rename from pkg/gui/lbl/focus_test.go rename to pkg/gui/patch_exploring/focus_test.go index f36191ce5..eb3ed7c66 100644 --- a/pkg/gui/lbl/focus_test.go +++ b/pkg/gui/patch_exploring/focus_test.go @@ -1,4 +1,4 @@ -package lbl +package patch_exploring import ( "testing" diff --git a/pkg/gui/lbl/state.go b/pkg/gui/patch_exploring/state.go similarity index 84% rename from pkg/gui/lbl/state.go rename to pkg/gui/patch_exploring/state.go index 8ff7d7e88..008338326 100644 --- a/pkg/gui/lbl/state.go +++ b/pkg/gui/patch_exploring/state.go @@ -1,10 +1,13 @@ -package lbl +package patch_exploring import ( "github.com/jesseduffield/lazygit/pkg/commands/patch" "github.com/sirupsen/logrus" ) +// State represents the current state of the patch explorer context i.e. when +// you're staging a file or you're building a patch from an existing commit +// this struct holds the info about the diff you're interacting with and what's currently selected. type State struct { selectedLineIdx int rangeStartLineIdx int @@ -23,6 +26,13 @@ const ( ) func NewState(diff string, selectedLineIdx int, oldState *State, log *logrus.Entry) *State { + if oldState != nil && diff == oldState.diff && selectedLineIdx == -1 { + // if we're here then we can return the old state. If selectedLineIdx was not -1 + // then that would mean we were trying to click and potentiall drag a range, which + // is why in that case we continue below + return oldState + } + patchParser := patch.NewPatchParser(log, diff) if len(patchParser.StageableLines) == 0 { @@ -175,14 +185,14 @@ func (s *State) AdjustSelectedLineIdx(change int) { s.SelectLine(s.selectedLineIdx + change) } -func (s *State) RenderForLineIndices(includedLineIndices []int) string { +func (s *State) RenderForLineIndices(isFocused bool, includedLineIndices []int) string { firstLineIdx, lastLineIdx := s.SelectedRange() - return s.patchParser.Render(firstLineIdx, lastLineIdx, includedLineIndices) + return s.patchParser.Render(isFocused, firstLineIdx, lastLineIdx, includedLineIndices) } func (s *State) PlainRenderSelected() string { firstLineIdx, lastLineIdx := s.SelectedRange() - return s.patchParser.PlainRenderLines(firstLineIdx, lastLineIdx) + return s.patchParser.RenderLinesPlain(firstLineIdx, lastLineIdx) } func (s *State) SelectBottom() { diff --git a/pkg/gui/patch_options_panel.go b/pkg/gui/patch_options_panel.go deleted file mode 100644 index c9a3defce..000000000 --- a/pkg/gui/patch_options_panel.go +++ /dev/null @@ -1,196 +0,0 @@ -package gui - -import ( - "fmt" - - "github.com/jesseduffield/lazygit/pkg/commands/types/enums" -) - -func (gui *Gui) handleCreatePatchOptionsMenu() error { - if !gui.Git.Patch.PatchManager.Active() { - return gui.createErrorPanel(gui.Tr.NoPatchError) - } - - menuItems := []*menuItem{ - { - displayString: "reset patch", - onPress: gui.handleResetPatch, - }, - { - displayString: "apply patch", - onPress: func() error { return gui.handleApplyPatch(false) }, - }, - { - displayString: "apply patch in reverse", - onPress: func() error { return gui.handleApplyPatch(true) }, - }, - } - - if gui.Git.Patch.PatchManager.CanRebase && gui.Git.Status.WorkingTreeState() == enums.REBASE_MODE_NONE { - menuItems = append(menuItems, []*menuItem{ - { - displayString: fmt.Sprintf("remove patch from original commit (%s)", gui.Git.Patch.PatchManager.To), - onPress: gui.handleDeletePatchFromCommit, - }, - { - displayString: "move patch out into index", - onPress: gui.handleMovePatchIntoWorkingTree, - }, - { - displayString: "move patch into new commit", - onPress: gui.handlePullPatchIntoNewCommit, - }, - }...) - - if gui.currentContext().GetKey() == gui.State.Contexts.BranchCommits.GetKey() { - selectedCommit := gui.getSelectedLocalCommit() - if selectedCommit != nil && gui.Git.Patch.PatchManager.To != selectedCommit.Sha { - // adding this option to index 1 - menuItems = append( - menuItems[:1], - append( - []*menuItem{ - { - displayString: fmt.Sprintf("move patch to selected commit (%s)", selectedCommit.Sha), - onPress: gui.handleMovePatchToSelectedCommit, - }, - }, menuItems[1:]..., - )..., - ) - } - } - } - - return gui.createMenu(gui.Tr.PatchOptionsTitle, menuItems, createMenuOptions{showCancel: true}) -} - -func (gui *Gui) getPatchCommitIndex() int { - for index, commit := range gui.State.Commits { - if commit.Sha == gui.Git.Patch.PatchManager.To { - return index - } - } - return -1 -} - -func (gui *Gui) validateNormalWorkingTreeState() (bool, error) { - if gui.Git.Status.WorkingTreeState() != enums.REBASE_MODE_NONE { - return false, gui.createErrorPanel(gui.Tr.CantPatchWhileRebasingError) - } - return true, nil -} - -func (gui *Gui) returnFocusFromLineByLinePanelIfNecessary() error { - if gui.State.MainContext == MAIN_PATCH_BUILDING_CONTEXT_KEY { - return gui.handleEscapePatchBuildingPanel() - } - return nil -} - -func (gui *Gui) handleDeletePatchFromCommit() error { - if ok, err := gui.validateNormalWorkingTreeState(); !ok { - return err - } - - if err := gui.returnFocusFromLineByLinePanelIfNecessary(); err != nil { - return err - } - - return gui.WithWaitingStatus(gui.Tr.RebasingStatus, func() error { - commitIndex := gui.getPatchCommitIndex() - gui.logAction(gui.Tr.Actions.RemovePatchFromCommit) - err := gui.Git.Patch.DeletePatchesFromCommit(gui.State.Commits, commitIndex) - return gui.handleGenericMergeCommandResult(err) - }) -} - -func (gui *Gui) handleMovePatchToSelectedCommit() error { - if ok, err := gui.validateNormalWorkingTreeState(); !ok { - return err - } - - if err := gui.returnFocusFromLineByLinePanelIfNecessary(); err != nil { - return err - } - - return gui.WithWaitingStatus(gui.Tr.RebasingStatus, func() error { - commitIndex := gui.getPatchCommitIndex() - gui.logAction(gui.Tr.Actions.MovePatchToSelectedCommit) - err := gui.Git.Patch.MovePatchToSelectedCommit(gui.State.Commits, commitIndex, gui.State.Panels.Commits.SelectedLineIdx) - return gui.handleGenericMergeCommandResult(err) - }) -} - -func (gui *Gui) handleMovePatchIntoWorkingTree() error { - if ok, err := gui.validateNormalWorkingTreeState(); !ok { - return err - } - - if err := gui.returnFocusFromLineByLinePanelIfNecessary(); err != nil { - return err - } - - pull := func(stash bool) error { - return gui.WithWaitingStatus(gui.Tr.RebasingStatus, func() error { - commitIndex := gui.getPatchCommitIndex() - gui.logAction(gui.Tr.Actions.MovePatchIntoIndex) - err := gui.Git.Patch.MovePatchIntoIndex(gui.State.Commits, commitIndex, stash) - return gui.handleGenericMergeCommandResult(err) - }) - } - - if len(gui.trackedFiles()) > 0 { - return gui.ask(askOpts{ - title: gui.Tr.MustStashTitle, - prompt: gui.Tr.MustStashWarning, - handleConfirm: func() error { - return pull(true) - }, - }) - } else { - return pull(false) - } -} - -func (gui *Gui) handlePullPatchIntoNewCommit() error { - if ok, err := gui.validateNormalWorkingTreeState(); !ok { - return err - } - - if err := gui.returnFocusFromLineByLinePanelIfNecessary(); err != nil { - return err - } - - return gui.WithWaitingStatus(gui.Tr.RebasingStatus, func() error { - commitIndex := gui.getPatchCommitIndex() - gui.logAction(gui.Tr.Actions.MovePatchIntoNewCommit) - err := gui.Git.Patch.PullPatchIntoNewCommit(gui.State.Commits, commitIndex) - return gui.handleGenericMergeCommandResult(err) - }) -} - -func (gui *Gui) handleApplyPatch(reverse bool) error { - if err := gui.returnFocusFromLineByLinePanelIfNecessary(); err != nil { - return err - } - - action := gui.Tr.Actions.ApplyPatch - if reverse { - action = "Apply patch in reverse" - } - gui.logAction(action) - if err := gui.Git.Patch.PatchManager.ApplyPatches(reverse); err != nil { - return gui.surfaceError(err) - } - return gui.refreshSidePanels(refreshOptions{mode: ASYNC}) -} - -func (gui *Gui) handleResetPatch() error { - gui.Git.Patch.PatchManager.Reset() - if gui.currentContextKeyIgnoringPopups() == MAIN_PATCH_BUILDING_CONTEXT_KEY { - if err := gui.pushContext(gui.State.Contexts.CommitFiles); err != nil { - return err - } - } - return gui.refreshCommitFilesView() -} diff --git a/pkg/gui/popup/fake_popup_handler.go b/pkg/gui/popup/fake_popup_handler.go new file mode 100644 index 000000000..95b0a3b1d --- /dev/null +++ b/pkg/gui/popup/fake_popup_handler.go @@ -0,0 +1,51 @@ +package popup + +import "github.com/jesseduffield/lazygit/pkg/gui/types" + +type FakePopupHandler struct { + OnErrorMsg func(message string) error + OnConfirm func(opts types.ConfirmOpts) error + OnPrompt func(opts types.PromptOpts) error +} + +var _ types.IPopupHandler = &FakePopupHandler{} + +func (self *FakePopupHandler) Error(err error) error { + return self.ErrorMsg(err.Error()) +} + +func (self *FakePopupHandler) ErrorMsg(message string) error { + return self.OnErrorMsg(message) +} + +func (self *FakePopupHandler) Alert(title string, message string) error { + panic("not yet implemented") +} + +func (self *FakePopupHandler) Confirm(opts types.ConfirmOpts) error { + return self.OnConfirm(opts) +} + +func (self *FakePopupHandler) Prompt(opts types.PromptOpts) error { + return self.OnPrompt(opts) +} + +func (self *FakePopupHandler) WithLoaderPanel(message string, f func() error) error { + return f() +} + +func (self *FakePopupHandler) WithWaitingStatus(message string, f func() error) error { + return f() +} + +func (self *FakePopupHandler) Menu(opts types.CreateMenuOptions) error { + panic("not yet implemented") +} + +func (self *FakePopupHandler) Toast(message string) { + panic("not yet implemented") +} + +func (self *FakePopupHandler) GetPromptInput() string { + panic("not yet implemented") +} diff --git a/pkg/gui/popup/popup_handler.go b/pkg/gui/popup/popup_handler.go new file mode 100644 index 000000000..26b886fb7 --- /dev/null +++ b/pkg/gui/popup/popup_handler.go @@ -0,0 +1,158 @@ +package popup + +import ( + "strings" + + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/common" + "github.com/jesseduffield/lazygit/pkg/gui/context" + "github.com/jesseduffield/lazygit/pkg/gui/style" + "github.com/jesseduffield/lazygit/pkg/gui/types" + "github.com/jesseduffield/lazygit/pkg/utils" + "github.com/sasha-s/go-deadlock" +) + +type PopupHandler struct { + *common.Common + index int + deadlock.Mutex + createPopupPanelFn func(types.CreatePopupPanelOpts) error + onErrorFn func() error + popContextFn func() error + currentContextFn func() types.Context + createMenuFn func(types.CreateMenuOptions) error + withWaitingStatusFn func(message string, f func() error) error + toastFn func(message string) + getPromptInputFn func() string +} + +var _ types.IPopupHandler = &PopupHandler{} + +func NewPopupHandler( + common *common.Common, + createPopupPanelFn func(types.CreatePopupPanelOpts) error, + onErrorFn func() error, + popContextFn func() error, + currentContextFn func() types.Context, + createMenuFn func(types.CreateMenuOptions) error, + withWaitingStatusFn func(message string, f func() error) error, + toastFn func(message string), + getPromptInputFn func() string, +) *PopupHandler { + return &PopupHandler{ + Common: common, + index: 0, + createPopupPanelFn: createPopupPanelFn, + onErrorFn: onErrorFn, + popContextFn: popContextFn, + currentContextFn: currentContextFn, + createMenuFn: createMenuFn, + withWaitingStatusFn: withWaitingStatusFn, + toastFn: toastFn, + getPromptInputFn: getPromptInputFn, + } +} + +func (self *PopupHandler) Menu(opts types.CreateMenuOptions) error { + return self.createMenuFn(opts) +} + +func (self *PopupHandler) Toast(message string) { + self.toastFn(message) +} + +func (self *PopupHandler) WithWaitingStatus(message string, f func() error) error { + return self.withWaitingStatusFn(message, f) +} + +func (self *PopupHandler) Error(err error) error { + if err == gocui.ErrQuit { + return err + } + + return self.ErrorMsg(err.Error()) +} + +func (self *PopupHandler) ErrorMsg(message string) error { + self.Lock() + self.index++ + self.Unlock() + + // Need to set bold here explicitly; otherwise it gets cancelled by the red colouring. + coloredMessage := style.FgRed.SetBold().Sprint(strings.TrimSpace(message)) + if err := self.onErrorFn(); err != nil { + return err + } + + return self.Alert(self.Tr.Error, coloredMessage) +} + +func (self *PopupHandler) Alert(title string, message string) error { + return self.Confirm(types.ConfirmOpts{Title: title, Prompt: message}) +} + +func (self *PopupHandler) Confirm(opts types.ConfirmOpts) error { + self.Lock() + self.index++ + self.Unlock() + + return self.createPopupPanelFn(types.CreatePopupPanelOpts{ + Title: opts.Title, + Prompt: opts.Prompt, + HandleConfirm: opts.HandleConfirm, + HandleClose: opts.HandleClose, + }) +} + +func (self *PopupHandler) Prompt(opts types.PromptOpts) error { + self.Lock() + self.index++ + self.Unlock() + + return self.createPopupPanelFn(types.CreatePopupPanelOpts{ + Title: opts.Title, + Prompt: opts.InitialContent, + Editable: true, + HandleConfirmPrompt: opts.HandleConfirm, + HandleClose: opts.HandleClose, + FindSuggestionsFunc: opts.FindSuggestionsFunc, + Mask: opts.Mask, + }) +} + +func (self *PopupHandler) WithLoaderPanel(message string, f func() error) error { + index := 0 + self.Lock() + self.index++ + index = self.index + self.Unlock() + + err := self.createPopupPanelFn(types.CreatePopupPanelOpts{ + Prompt: message, + HasLoader: true, + }) + if err != nil { + self.Log.Error(err) + return nil + } + + go utils.Safe(func() { + if err := f(); err != nil { + self.Log.Error(err) + } + + self.Lock() + if index == self.index && self.currentContextFn().GetKey() == context.CONFIRMATION_CONTEXT_KEY { + _ = self.popContextFn() + } + self.Unlock() + }) + + return nil +} + +// returns the content that has currently been typed into the prompt. Useful for +// asynchronously updating the suggestions list under the prompt. +func (self *PopupHandler) GetPromptInput() string { + return self.getPromptInputFn() +} diff --git a/pkg/gui/popup_handler.go b/pkg/gui/popup_handler.go deleted file mode 100644 index 9cacc3574..000000000 --- a/pkg/gui/popup_handler.go +++ /dev/null @@ -1,87 +0,0 @@ -package gui - -import ( - "strings" - - "github.com/jesseduffield/lazygit/pkg/gui/style" -) - -type PopupHandler interface { - Error(message string) error - Ask(opts askOpts) error - Prompt(opts promptOpts) error - Loader(message string) error -} - -type RealPopupHandler struct { - gui *Gui -} - -func (self *RealPopupHandler) Error(message string) error { - gui := self.gui - - coloredMessage := style.FgRed.Sprint(strings.TrimSpace(message)) - if err := gui.refreshSidePanels(refreshOptions{mode: ASYNC}); err != nil { - return err - } - - return self.Ask(askOpts{ - title: gui.Tr.Error, - prompt: coloredMessage, - }) -} - -func (self *RealPopupHandler) Ask(opts askOpts) error { - gui := self.gui - - return gui.createPopupPanel(createPopupPanelOpts{ - title: opts.title, - prompt: opts.prompt, - handleConfirm: opts.handleConfirm, - handleClose: opts.handleClose, - handlersManageFocus: opts.handlersManageFocus, - }) -} - -func (self *RealPopupHandler) Prompt(opts promptOpts) error { - gui := self.gui - - return gui.createPopupPanel(createPopupPanelOpts{ - title: opts.title, - prompt: opts.initialContent, - editable: true, - handleConfirmPrompt: opts.handleConfirm, - findSuggestionsFunc: opts.findSuggestionsFunc, - }) -} - -func (self *RealPopupHandler) Loader(message string) error { - gui := self.gui - - return gui.createPopupPanel(createPopupPanelOpts{ - prompt: message, - hasLoader: true, - }) -} - -type TestPopupHandler struct { - onError func(message string) error - onAsk func(opts askOpts) error - onPrompt func(opts promptOpts) error -} - -func (self *TestPopupHandler) Error(message string) error { - return self.onError(message) -} - -func (self *TestPopupHandler) Ask(opts askOpts) error { - return self.onAsk(opts) -} - -func (self *TestPopupHandler) Prompt(opts promptOpts) error { - return self.onPrompt(opts) -} - -func (self *TestPopupHandler) Loader(message string) error { - return nil -} diff --git a/pkg/gui/presentation/branches.go b/pkg/gui/presentation/branches.go index 1ace50fab..1b9cc9b12 100644 --- a/pkg/gui/presentation/branches.go +++ b/pkg/gui/presentation/branches.go @@ -5,34 +5,26 @@ import ( "strconv" "strings" + "github.com/jesseduffield/generics/slices" "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/presentation/icons" "github.com/jesseduffield/lazygit/pkg/gui/style" + "github.com/jesseduffield/lazygit/pkg/i18n" "github.com/jesseduffield/lazygit/pkg/theme" "github.com/jesseduffield/lazygit/pkg/utils" ) var branchPrefixColorCache = make(map[string]style.TextStyle) -func GetBranchListDisplayStrings( - branches []*models.Branch, - prs map[*models.Branch]*models.GithubPullRequest, - fullDescription bool, diffName string) [][]string { - lines := make([][]string, len(branches)) - - for i := range branches { - diffed := branches[i].Name == diffName - lines[i] = getBranchDisplayStrings(branches[i], prs, fullDescription, diffed) - } - - return lines +func GetBranchListDisplayStrings(branches []*models.Branch, fullDescription bool, diffName string, tr *i18n.TranslationSet) [][]string { + return slices.Map(branches, func(branch *models.Branch) []string { + diffed := branch.Name == diffName + return getBranchDisplayStrings(branch, fullDescription, diffed, tr) + }) } // getBranchDisplayStrings returns the display string of branch -func getBranchDisplayStrings( - b *models.Branch, - prs map[*models.Branch]*models.GithubPullRequest, - fullDescription bool, - diffed bool) []string { +func getBranchDisplayStrings(b *models.Branch, fullDescription bool, diffed bool, tr *i18n.TranslationSet) []string { displayName := b.Name if b.DisplayName != "" { displayName = b.DisplayName @@ -42,23 +34,25 @@ func getBranchDisplayStrings( if diffed { nameTextStyle = theme.DiffTerminalColor } + coloredName := nameTextStyle.Sprint(displayName) - if b.IsTrackingRemote() { - coloredName = fmt.Sprintf("%s %s", coloredName, ColoredBranchStatus(b)) - } + branchStatus := utils.WithPadding(ColoredBranchStatus(b, tr), 2) + coloredName = fmt.Sprintf("%s %s", coloredName, branchStatus) recencyColor := style.FgCyan if b.Recency == " *" { recencyColor = style.FgGreen } - res := []string{recencyColor.Sprint(b.Recency)} - pr, hasPr := prs[b] - - res = append(res, coloredPrNumber(pr, hasPr), coloredName) - + res := make([]string, 0, 4) + res = append(res, recencyColor.Sprint(b.Recency)) + if icons.IsIconEnabled() { + res = append(res, nameTextStyle.Sprint(icons.IconForBranch(b))) + } + res = append(res, coloredName) if fullDescription { - res = append(res, + res = append( + res, fmt.Sprintf("%s %s", style.FgYellow.Sprint(b.UpstreamRemote), style.FgYellow.Sprint(b.UpstreamBranch), @@ -88,19 +82,44 @@ func GetBranchTextStyle(name string) style.TextStyle { } } -func ColoredBranchStatus(branch *models.Branch) string { +func ColoredBranchStatus(branch *models.Branch, tr *i18n.TranslationSet) string { colour := style.FgYellow - if branch.MatchesUpstream() { - colour = style.FgGreen - } else if !branch.IsTrackingRemote() { + if branch.UpstreamGone { colour = style.FgRed + } else if branch.MatchesUpstream() { + colour = style.FgGreen + } else if branch.RemoteBranchNotStoredLocally() { + colour = style.FgMagenta } - return colour.Sprint(BranchStatus(branch)) + return colour.Sprint(BranchStatus(branch, tr)) } -func BranchStatus(branch *models.Branch) string { - return fmt.Sprintf("↑%s↓%s", branch.Pushables, branch.Pullables) +func BranchStatus(branch *models.Branch, tr *i18n.TranslationSet) string { + if !branch.IsTrackingRemote() { + return "" + } + + if branch.UpstreamGone { + return tr.UpstreamGone + } + + if branch.MatchesUpstream() { + return "âś“" + } + if branch.RemoteBranchNotStoredLocally() { + return "?" + } + + result := "" + if branch.HasCommitsToPush() { + result = fmt.Sprintf("↑%s", branch.Pushables) + } + if branch.HasCommitsToPull() { + result = fmt.Sprintf("%s↓%s", result, branch.Pullables) + } + + return result } func SetCustomBranches(customBranchColors map[string]string) { diff --git a/pkg/gui/presentation/commits.go b/pkg/gui/presentation/commits.go index 2bc9f475c..f9bdaee47 100644 --- a/pkg/gui/presentation/commits.go +++ b/pkg/gui/presentation/commits.go @@ -2,16 +2,18 @@ package presentation import ( "strings" - "sync" + "github.com/jesseduffield/generics/set" "github.com/jesseduffield/lazygit/pkg/commands/git_commands" "github.com/jesseduffield/lazygit/pkg/commands/models" "github.com/jesseduffield/lazygit/pkg/gui/presentation/authors" "github.com/jesseduffield/lazygit/pkg/gui/presentation/graph" + "github.com/jesseduffield/lazygit/pkg/gui/presentation/icons" "github.com/jesseduffield/lazygit/pkg/gui/style" "github.com/jesseduffield/lazygit/pkg/theme" "github.com/jesseduffield/lazygit/pkg/utils" "github.com/kyokomi/emoji/v2" + "github.com/sasha-s/go-deadlock" ) type pipeSetCacheKey struct { @@ -19,8 +21,10 @@ type pipeSetCacheKey struct { commitCount int } -var pipeSetCache = make(map[pipeSetCacheKey][][]*graph.Pipe) -var mutex sync.Mutex +var ( + pipeSetCache = make(map[pipeSetCacheKey][][]*graph.Pipe) + mutex deadlock.Mutex +) type bisectBounds struct { newIndex int @@ -30,8 +34,9 @@ type bisectBounds struct { func GetCommitListDisplayStrings( commits []*models.Commit, fullDescription bool, - cherryPickedCommitShaMap map[string]bool, + cherryPickedCommitShaSet *set.Set[string], diffName string, + timeFormat string, parseEmoji bool, selectedCommitSha string, startIdx int, @@ -92,8 +97,9 @@ func GetCommitListDisplayStrings( bisectStatus = getBisectStatus(unfilteredIdx, commit.Sha, bisectInfo, bisectBounds) lines = append(lines, displayCommit( commit, - cherryPickedCommitShaMap, + cherryPickedCommitShaSet, diffName, + timeFormat, parseEmoji, getGraphLine(unfilteredIdx), fullDescription, @@ -152,7 +158,7 @@ func loadPipesets(commits []*models.Commit) [][]*graph.Pipe { // pipe sets are unique to a commit head. and a commit count. Sometimes we haven't loaded everything for that. // so let's just cache it based on that. getStyle := func(commit *models.Commit) style.TextStyle { - return authors.AuthorStyle(commit.Author) + return authors.AuthorStyle(commit.AuthorName) } pipeSets = graph.GetPipeSets(commits, getStyle) pipeSetCache[cacheKey] = pipeSets @@ -226,6 +232,8 @@ func getBisectStatusText(bisectStatus BisectStatus, bisectInfo *git_commands.Bis return style.Sprintf("<-- skipped") case BisectStatusCandidate: return style.Sprintf("?") + case BisectStatusNone: + return "" } return "" @@ -233,15 +241,16 @@ func getBisectStatusText(bisectStatus BisectStatus, bisectInfo *git_commands.Bis func displayCommit( commit *models.Commit, - cherryPickedCommitShaMap map[string]bool, + cherryPickedCommitShaSet *set.Set[string], diffName string, + timeFormat string, parseEmoji bool, graphLine string, fullDescription bool, bisectStatus BisectStatus, bisectInfo *git_commands.BisectInfo, ) []string { - shaColor := getShaColor(commit, diffName, cherryPickedCommitShaMap, bisectStatus, bisectInfo) + shaColor := getShaColor(commit, diffName, cherryPickedCommitShaSet, bisectStatus, bisectInfo) bisectString := getBisectStatusText(bisectStatus, bisectInfo) actionString := "" @@ -270,16 +279,19 @@ func displayCommit( authorFunc = authors.LongAuthor } - cols := make([]string, 0, 5) + cols := make([]string, 0, 7) + if icons.IsIconEnabled() { + cols = append(cols, shaColor.Sprint(icons.IconForCommit(commit))) + } cols = append(cols, shaColor.Sprint(commit.ShortSha())) cols = append(cols, bisectString) if fullDescription { - cols = append(cols, style.FgBlue.Sprint(utils.UnixToDate(commit.UnixTimestamp))) + cols = append(cols, style.FgBlue.Sprint(utils.UnixToDate(commit.UnixTimestamp, timeFormat))) } cols = append( cols, actionString, - authorFunc(commit.Author), + authorFunc(commit.AuthorName), graphLine+tagString+theme.DefaultTextColor.Sprint(name), ) @@ -309,7 +321,7 @@ func getBisectStatusColor(status BisectStatus) style.TextStyle { func getShaColor( commit *models.Commit, diffName string, - cherryPickedCommitShaMap map[string]bool, + cherryPickedCommitShaSet *set.Set[string], bisectStatus BisectStatus, bisectInfo *git_commands.BisectInfo, ) style.TextStyle { @@ -334,7 +346,7 @@ func getShaColor( if diffed { shaColor = theme.DiffTerminalColor - } else if cherryPickedCommitShaMap[commit.Sha] { + } else if cherryPickedCommitShaSet.Includes(commit.Sha) { shaColor = theme.CherryPickedCommitTextStyle } diff --git a/pkg/gui/presentation/commits_test.go b/pkg/gui/presentation/commits_test.go index b7fd23468..158396c2f 100644 --- a/pkg/gui/presentation/commits_test.go +++ b/pkg/gui/presentation/commits_test.go @@ -1,10 +1,12 @@ package presentation import ( + "os" "strings" "testing" "github.com/gookit/color" + "github.com/jesseduffield/generics/set" "github.com/jesseduffield/lazygit/pkg/commands/git_commands" "github.com/jesseduffield/lazygit/pkg/commands/models" "github.com/jesseduffield/lazygit/pkg/utils" @@ -25,8 +27,9 @@ func TestGetCommitListDisplayStrings(t *testing.T) { testName string commits []*models.Commit fullDescription bool - cherryPickedCommitShaMap map[string]bool + cherryPickedCommitShaSet *set.Set[string] diffName string + timeFormat string parseEmoji bool selectedCommitSha string startIdx int @@ -37,13 +40,14 @@ func TestGetCommitListDisplayStrings(t *testing.T) { focus bool }{ { - testName: "no commits", - commits: []*models.Commit{}, - startIdx: 0, - length: 1, - showGraph: false, - bisectInfo: git_commands.NewNullBisectInfo(), - expected: "", + testName: "no commits", + commits: []*models.Commit{}, + startIdx: 0, + length: 1, + showGraph: false, + bisectInfo: git_commands.NewNullBisectInfo(), + cherryPickedCommitShaSet: set.New[string](), + expected: "", }, { testName: "some commits", @@ -51,10 +55,11 @@ func TestGetCommitListDisplayStrings(t *testing.T) { {Name: "commit1", Sha: "sha1"}, {Name: "commit2", Sha: "sha2"}, }, - startIdx: 0, - length: 2, - showGraph: false, - bisectInfo: git_commands.NewNullBisectInfo(), + startIdx: 0, + length: 2, + showGraph: false, + bisectInfo: git_commands.NewNullBisectInfo(), + cherryPickedCommitShaSet: set.New[string](), expected: formatExpected(` sha1 commit1 sha2 commit2 @@ -69,10 +74,11 @@ func TestGetCommitListDisplayStrings(t *testing.T) { {Name: "commit4", Sha: "sha4", Parents: []string{"sha5"}}, {Name: "commit5", Sha: "sha5", Parents: []string{"sha7"}}, }, - startIdx: 0, - length: 5, - showGraph: true, - bisectInfo: git_commands.NewNullBisectInfo(), + startIdx: 0, + length: 5, + showGraph: true, + bisectInfo: git_commands.NewNullBisectInfo(), + cherryPickedCommitShaSet: set.New[string](), expected: formatExpected(` sha1 ⏣─╮ commit1 sha2 â—Ż │ commit2 @@ -90,10 +96,11 @@ func TestGetCommitListDisplayStrings(t *testing.T) { {Name: "commit4", Sha: "sha4", Parents: []string{"sha5"}}, {Name: "commit5", Sha: "sha5", Parents: []string{"sha7"}}, }, - startIdx: 0, - length: 5, - showGraph: true, - bisectInfo: git_commands.NewNullBisectInfo(), + startIdx: 0, + length: 5, + showGraph: true, + bisectInfo: git_commands.NewNullBisectInfo(), + cherryPickedCommitShaSet: set.New[string](), expected: formatExpected(` sha1 pick commit1 sha2 pick commit2 @@ -111,10 +118,11 @@ func TestGetCommitListDisplayStrings(t *testing.T) { {Name: "commit4", Sha: "sha4", Parents: []string{"sha5"}}, {Name: "commit5", Sha: "sha5", Parents: []string{"sha7"}}, }, - startIdx: 1, - length: 10, - showGraph: true, - bisectInfo: git_commands.NewNullBisectInfo(), + startIdx: 1, + length: 10, + showGraph: true, + bisectInfo: git_commands.NewNullBisectInfo(), + cherryPickedCommitShaSet: set.New[string](), expected: formatExpected(` sha2 pick commit2 sha3 â—Ż commit3 @@ -131,10 +139,11 @@ func TestGetCommitListDisplayStrings(t *testing.T) { {Name: "commit4", Sha: "sha4", Parents: []string{"sha5"}}, {Name: "commit5", Sha: "sha5", Parents: []string{"sha7"}}, }, - startIdx: 3, - length: 2, - showGraph: true, - bisectInfo: git_commands.NewNullBisectInfo(), + startIdx: 3, + length: 2, + showGraph: true, + bisectInfo: git_commands.NewNullBisectInfo(), + cherryPickedCommitShaSet: set.New[string](), expected: formatExpected(` sha4 â—Ż commit4 sha5 â—Ż commit5 @@ -149,10 +158,11 @@ func TestGetCommitListDisplayStrings(t *testing.T) { {Name: "commit4", Sha: "sha4", Parents: []string{"sha5"}}, {Name: "commit5", Sha: "sha5", Parents: []string{"sha7"}}, }, - startIdx: 0, - length: 2, - showGraph: true, - bisectInfo: git_commands.NewNullBisectInfo(), + startIdx: 0, + length: 2, + showGraph: true, + bisectInfo: git_commands.NewNullBisectInfo(), + cherryPickedCommitShaSet: set.New[string](), expected: formatExpected(` sha1 pick commit1 sha2 pick commit2 @@ -167,10 +177,11 @@ func TestGetCommitListDisplayStrings(t *testing.T) { {Name: "commit4", Sha: "sha4", Parents: []string{"sha5"}}, {Name: "commit5", Sha: "sha5", Parents: []string{"sha7"}}, }, - startIdx: 4, - length: 2, - showGraph: true, - bisectInfo: git_commands.NewNullBisectInfo(), + startIdx: 4, + length: 2, + showGraph: true, + bisectInfo: git_commands.NewNullBisectInfo(), + cherryPickedCommitShaSet: set.New[string](), expected: formatExpected(` sha5 â—Ż commit5 `), @@ -184,17 +195,38 @@ func TestGetCommitListDisplayStrings(t *testing.T) { {Name: "commit4", Sha: "sha4", Parents: []string{"sha5"}, Action: "pick"}, {Name: "commit5", Sha: "sha5", Parents: []string{"sha7"}}, }, - startIdx: 0, - length: 2, - showGraph: true, - bisectInfo: git_commands.NewNullBisectInfo(), + startIdx: 0, + length: 2, + showGraph: true, + bisectInfo: git_commands.NewNullBisectInfo(), + cherryPickedCommitShaSet: set.New[string](), expected: formatExpected(` sha1 pick commit1 sha2 pick commit2 `), }, + { + testName: "custom time format", + commits: []*models.Commit{ + {Name: "commit1", Sha: "sha1", UnixTimestamp: 1652443200, AuthorName: "Jesse Duffield"}, + {Name: "commit2", Sha: "sha2", UnixTimestamp: 1652529600, AuthorName: "Jesse Duffield"}, + }, + fullDescription: true, + timeFormat: "2006-01-02 15:04:05", + startIdx: 0, + length: 2, + showGraph: false, + bisectInfo: git_commands.NewNullBisectInfo(), + cherryPickedCommitShaSet: set.New[string](), + expected: formatExpected(` + sha1 2022-05-13 12:00:00 Jesse Duffield commit1 + sha2 2022-05-14 12:00:00 Jesse Duffield commit2 + `), + }, } + os.Setenv("TZ", "UTC") + focusing := false for _, scenario := range scenarios { if scenario.focus { @@ -209,8 +241,9 @@ func TestGetCommitListDisplayStrings(t *testing.T) { result := GetCommitListDisplayStrings( s.commits, s.fullDescription, - s.cherryPickedCommitShaMap, + s.cherryPickedCommitShaSet, s.diffName, + s.timeFormat, s.parseEmoji, s.selectedCommitSha, s.startIdx, diff --git a/pkg/gui/presentation/files.go b/pkg/gui/presentation/files.go index 116d4fc4b..394b39f73 100644 --- a/pkg/gui/presentation/files.go +++ b/pkg/gui/presentation/files.go @@ -1,96 +1,96 @@ package presentation import ( - "fmt" "strings" "github.com/jesseduffield/lazygit/pkg/commands/models" "github.com/jesseduffield/lazygit/pkg/commands/patch" "github.com/jesseduffield/lazygit/pkg/gui/filetree" + "github.com/jesseduffield/lazygit/pkg/gui/presentation/icons" "github.com/jesseduffield/lazygit/pkg/gui/style" "github.com/jesseduffield/lazygit/pkg/theme" "github.com/jesseduffield/lazygit/pkg/utils" ) -const EXPANDED_ARROW = "â–Ľ" -const COLLAPSED_ARROW = "â–ş" +const ( + EXPANDED_ARROW = "â–Ľ" + COLLAPSED_ARROW = "â–ş" +) -const INNER_ITEM = "├─ " -const LAST_ITEM = "└─ " -const NESTED = "│ " -const NOTHING = " " +// keeping these here as individual constants in case later on people want the old tree shape +const ( + INNER_ITEM = " " + LAST_ITEM = " " + NESTED = " " + NOTHING = " " +) func RenderFileTree( - fileMgr *filetree.FileTreeViewModel, + tree filetree.IFileTree, diffName string, submoduleConfigs []*models.SubmoduleConfig, ) []string { - return renderAux(fileMgr.Tree(), fileMgr.CollapsedPaths(), "", -1, func(n filetree.INode, depth int) string { - castN := n.(*filetree.FileNode) - return getFileLine(castN.GetHasUnstagedChanges(), castN.GetHasStagedChanges(), castN.NameAtDepth(depth), diffName, submoduleConfigs, castN.File) + return renderAux(tree.GetRoot().Raw(), tree.CollapsedPaths(), "", -1, func(node *filetree.Node[models.File], depth int) string { + fileNode := filetree.NewFileNode(node) + + return getFileLine(fileNode.GetHasUnstagedChanges(), fileNode.GetHasStagedChanges(), fileNameAtDepth(node, depth), diffName, submoduleConfigs, node.File) }) } func RenderCommitFileTree( - commitFileMgr *filetree.CommitFileTreeViewModel, + tree *filetree.CommitFileTreeViewModel, diffName string, patchManager *patch.PatchManager, ) []string { - return renderAux(commitFileMgr.Tree(), commitFileMgr.CollapsedPaths(), "", -1, func(n filetree.INode, depth int) string { - castN := n.(*filetree.CommitFileNode) - + return renderAux(tree.GetRoot().Raw(), tree.CollapsedPaths(), "", -1, func(node *filetree.Node[models.CommitFile], depth int) string { // This is a little convoluted because we're dealing with either a leaf or a non-leaf. // But this code actually applies to both. If it's a leaf, the status will just // be whatever status it is, but if it's a non-leaf it will determine its status // based on the leaves of that subtree var status patch.PatchStatus - if castN.EveryFile(func(file *models.CommitFile) bool { - return patchManager.GetFileStatus(file.Name, commitFileMgr.GetParent()) == patch.WHOLE + if node.EveryFile(func(file *models.CommitFile) bool { + return patchManager.GetFileStatus(file.Name, tree.GetRef().RefName()) == patch.WHOLE }) { status = patch.WHOLE - } else if castN.EveryFile(func(file *models.CommitFile) bool { - return patchManager.GetFileStatus(file.Name, commitFileMgr.GetParent()) == patch.UNSELECTED + } else if node.EveryFile(func(file *models.CommitFile) bool { + return patchManager.GetFileStatus(file.Name, tree.GetRef().RefName()) == patch.UNSELECTED }) { status = patch.UNSELECTED } else { status = patch.PART } - return getCommitFileLine(castN.NameAtDepth(depth), diffName, castN.File, status) + return getCommitFileLine(commitFileNameAtDepth(node, depth), diffName, node.File, status) }) } -func renderAux( - s filetree.INode, - collapsedPaths filetree.CollapsedPaths, +func renderAux[T any]( + node *filetree.Node[T], + collapsedPaths *filetree.CollapsedPaths, prefix string, depth int, - renderLine func(filetree.INode, int) string, + renderLine func(*filetree.Node[T], int) string, ) []string { - if s == nil || s.IsNil() { + if node == nil { return []string{} } isRoot := depth == -1 - renderLineWithPrefix := func() string { - return prefix + renderLine(s, depth) - } - - if s.IsLeaf() { + if node.IsFile() { if isRoot { return []string{} } - return []string{renderLineWithPrefix()} + return []string{prefix + renderLine(node, depth)} } - if collapsedPaths.IsCollapsed(s.GetPath()) { - return []string{fmt.Sprintf("%s %s", renderLineWithPrefix(), COLLAPSED_ARROW)} + if collapsedPaths.IsCollapsed(node.GetPath()) { + return []string{prefix + COLLAPSED_ARROW + " " + renderLine(node, depth)} } arr := []string{} if !isRoot { - arr = append(arr, fmt.Sprintf("%s %s", renderLineWithPrefix(), EXPANDED_ARROW)) + arr = append(arr, prefix+EXPANDED_ARROW+" "+renderLine(node, depth)) } newPrefix := prefix @@ -100,8 +100,8 @@ func renderAux( newPrefix = strings.TrimSuffix(prefix, INNER_ITEM) + NESTED } - for i, child := range s.GetChildren() { - isLast := i == len(s.GetChildren())-1 + for i, child := range node.Children { + isLast := i == len(node.Children)-1 var childPrefix string if isRoot { @@ -112,7 +112,7 @@ func renderAux( childPrefix = newPrefix + INNER_ITEM } - arr = append(arr, renderAux(child, collapsedPaths, childPrefix, depth+1+s.GetCompressionLevel(), renderLine)...) + arr = append(arr, renderAux(child, collapsedPaths, childPrefix, depth+1+node.CompressionLevel, renderLine)...) } return arr @@ -129,7 +129,7 @@ func getFileLine(hasUnstagedChanges bool, hasStagedChanges bool, name string, di } else if file == nil && hasStagedChanges && hasUnstagedChanges { restColor = partiallyModifiedColor } else if hasUnstagedChanges { - restColor = style.FgRed + restColor = theme.UnstagedChangesColor } output := "" @@ -138,13 +138,13 @@ func getFileLine(hasUnstagedChanges bool, hasStagedChanges bool, name string, di firstChar := file.ShortStatus[0:1] firstCharCl := style.FgGreen if firstChar == "?" { - firstCharCl = style.FgRed + firstCharCl = theme.UnstagedChangesColor } else if firstChar == " " { firstCharCl = restColor } secondChar := file.ShortStatus[1:2] - secondCharCl := style.FgRed + secondCharCl := theme.UnstagedChangesColor if secondChar == " " { secondCharCl = restColor } @@ -154,9 +154,16 @@ func getFileLine(hasUnstagedChanges bool, hasStagedChanges bool, name string, di output += restColor.Sprint(" ") } + isSubmodule := file != nil && file.IsSubmodule(submoduleConfigs) + isDirectory := file == nil + + if icons.IsIconEnabled() { + output += restColor.Sprintf("%s ", icons.IconForFile(name, isSubmodule, isDirectory)) + } + output += restColor.Sprint(utils.EscapeSpecialChars(name)) - if file != nil && file.IsSubmodule(submoduleConfigs) { + if isSubmodule { output += theme.DefaultTextColor.Sprint(" (submodule)") } @@ -178,12 +185,22 @@ func getCommitFileLine(name string, diffName string, commitFile *models.CommitFi } } + output := "" + name = utils.EscapeSpecialChars(name) - if commitFile == nil { - return colour.Sprint(name) + if commitFile != nil { + output += getColorForChangeStatus(commitFile.ChangeStatus).Sprint(commitFile.ChangeStatus) + " " } - return getColorForChangeStatus(commitFile.ChangeStatus).Sprint(commitFile.ChangeStatus) + " " + colour.Sprint(name) + isSubmodule := false + isDirectory := commitFile == nil + + if icons.IsIconEnabled() { + output += colour.Sprintf("%s ", icons.IconForFile(name, isSubmodule, isDirectory)) + } + + output += colour.Sprint(name) + return output } func getColorForChangeStatus(changeStatus string) style.TextStyle { @@ -193,7 +210,7 @@ func getColorForChangeStatus(changeStatus string) style.TextStyle { case "M", "R": return style.FgYellow case "D": - return style.FgRed + return theme.UnstagedChangesColor case "C": return style.FgCyan case "T": @@ -202,3 +219,39 @@ func getColorForChangeStatus(changeStatus string) style.TextStyle { return theme.DefaultTextColor } } + +func fileNameAtDepth(node *filetree.Node[models.File], depth int) string { + splitName := split(node.Path) + name := join(splitName[depth:]) + + if node.File != nil && node.File.IsRename() { + splitPrevName := split(node.File.PreviousName) + + prevName := node.File.PreviousName + // if the file has just been renamed inside the same directory, we can shave off + // the prefix for the previous path too. Otherwise we'll keep it unchanged + sameParentDir := len(splitName) == len(splitPrevName) && join(splitName[0:depth]) == join(splitPrevName[0:depth]) + if sameParentDir { + prevName = join(splitPrevName[depth:]) + } + + return prevName + " → " + name + } + + return name +} + +func commitFileNameAtDepth(node *filetree.Node[models.CommitFile], depth int) string { + splitName := split(node.Path) + name := join(splitName[depth:]) + + return name +} + +func split(str string) []string { + return strings.Split(str, "/") +} + +func join(strs []string) string { + return strings.Join(strs, "/") +} diff --git a/pkg/gui/presentation/files_test.go b/pkg/gui/presentation/files_test.go index c40f6247e..17e061012 100644 --- a/pkg/gui/presentation/files_test.go +++ b/pkg/gui/presentation/files_test.go @@ -53,12 +53,12 @@ func TestRenderFileTree(t *testing.T) { }, expected: toStringSlice( ` -dir1 â–ş -dir2 â–Ľ -├─ dir2 â–Ľ -│ ├─ M file3 -│ └─ M file4 -└─ M file5 +â–ş dir1 +â–Ľ dir2 + â–Ľ dir2 + M file3 + M file4 + M file5 M file1 `, ), @@ -69,7 +69,8 @@ M file1 for _, s := range scenarios { s := s t.Run(s.name, func(t *testing.T) { - viewModel := filetree.NewFileTreeViewModel(s.files, utils.NewDummyLog(), true) + viewModel := filetree.NewFileTree(func() []*models.File { return s.files }, utils.NewDummyLog(), true) + viewModel.SetTree() for _, path := range s.collapsedPaths { viewModel.ToggleCollapsed(path) } @@ -111,12 +112,12 @@ func TestRenderCommitFileTree(t *testing.T) { }, expected: toStringSlice( ` -dir1 â–ş -dir2 â–Ľ -├─ dir2 â–Ľ -│ ├─ D file3 -│ └─ M file4 -└─ M file5 +â–ş dir1 +â–Ľ dir2 + â–Ľ dir2 + D file3 + M file4 + M file5 M file1 `, ), @@ -127,7 +128,9 @@ M file1 for _, s := range scenarios { s := s t.Run(s.name, func(t *testing.T) { - viewModel := filetree.NewCommitFileTreeViewModel(s.files, utils.NewDummyLog(), true) + viewModel := filetree.NewCommitFileTreeViewModel(func() []*models.CommitFile { return s.files }, utils.NewDummyLog(), true) + viewModel.SetRef(&models.Commit{}) + viewModel.SetTree() for _, path := range s.collapsedPaths { viewModel.ToggleCollapsed(path) } diff --git a/pkg/gui/presentation/graph/cell.go b/pkg/gui/presentation/graph/cell.go index e970c6dd2..cc2ad53c3 100644 --- a/pkg/gui/presentation/graph/cell.go +++ b/pkg/gui/presentation/graph/cell.go @@ -8,8 +8,10 @@ import ( "github.com/jesseduffield/lazygit/pkg/gui/style" ) -const MergeSymbol = '⏣' -const CommitSymbol = 'â—Ż' +const ( + MergeSymbol = '⏣' + CommitSymbol = 'â—Ż' +) type cellType int @@ -66,8 +68,10 @@ type rgbCacheKey struct { str string } -var rgbCache = make(map[rgbCacheKey]string) -var rgbCacheMutex sync.RWMutex +var ( + rgbCache = make(map[rgbCacheKey]string) + rgbCacheMutex sync.RWMutex +) func cachedSprint(style style.TextStyle, str string) string { switch v := style.Style.(type) { diff --git a/pkg/gui/presentation/graph/graph.go b/pkg/gui/presentation/graph/graph.go index 0e193cba8..392af8984 100644 --- a/pkg/gui/presentation/graph/graph.go +++ b/pkg/gui/presentation/graph/graph.go @@ -2,13 +2,15 @@ package graph import ( "runtime" - "sort" "strings" "sync" + "github.com/jesseduffield/generics/set" + "github.com/jesseduffield/generics/slices" "github.com/jesseduffield/lazygit/pkg/commands/models" "github.com/jesseduffield/lazygit/pkg/gui/style" "github.com/jesseduffield/lazygit/pkg/utils" + "github.com/samber/lo" ) type PipeKind uint8 @@ -65,19 +67,15 @@ func GetPipeSets(commits []*models.Commit, getStyle func(c *models.Commit) style pipes := []*Pipe{{fromPos: 0, toPos: 0, fromSha: "START", toSha: commits[0].Sha, kind: STARTS, style: style.FgDefault}} - pipeSets := [][]*Pipe{} - for _, commit := range commits { + return slices.Map(commits, func(commit *models.Commit) []*Pipe { pipes = getNextPipes(pipes, commit, getStyle) - pipeSets = append(pipeSets, pipes) - } - - return pipeSets + return pipes + }) } func RenderAux(pipeSets [][]*Pipe, commits []*models.Commit, selectedCommitSha string) []string { maxProcs := runtime.GOMAXPROCS(0) - lines := make([]string, 0, len(pipeSets)) // splitting up the rendering of the graph into multiple goroutines allows us to render the graph in parallel chunks := make([][]string, maxProcs) perProc := len(pipeSets) / maxProcs @@ -110,24 +108,19 @@ func RenderAux(pipeSets [][]*Pipe, commits []*models.Commit, selectedCommitSha s wg.Wait() - for _, chunk := range chunks { - lines = append(lines, chunk...) - } - - return lines + return slices.Flatten(chunks) } func getNextPipes(prevPipes []*Pipe, commit *models.Commit, getStyle func(c *models.Commit) style.TextStyle) []*Pipe { - currentPipes := make([]*Pipe, 0, len(prevPipes)) - maxPos := 0 - for _, pipe := range prevPipes { - // a pipe that terminated in the previous line has no bearing on the current line - // so we'll filter those out - if pipe.kind != TERMINATES { - currentPipes = append(currentPipes, pipe) - } - maxPos = utils.Max(maxPos, pipe.toPos) - } + maxPos := slices.MaxBy(prevPipes, func(pipe *Pipe) int { + return pipe.toPos + }) + + // a pipe that terminated in the previous line has no bearing on the current line + // so we'll filter those out + currentPipes := slices.Filter(prevPipes, func(pipe *Pipe) bool { + return pipe.kind != TERMINATES + }) newPipes := make([]*Pipe, 0, len(currentPipes)+len(commit.Parents)) // start by assuming that we've got a brand new commit not related to any preceding commit. @@ -142,9 +135,9 @@ func getNextPipes(prevPipes []*Pipe, commit *models.Commit, getStyle func(c *mod } // a taken spot is one where a current pipe is ending on - takenSpots := make(map[int]bool) + takenSpots := set.New[int]() // a traversed spot is one where a current pipe is starting on, ending on, or passing through - traversedSpots := make(map[int]bool) + traversedSpots := set.New[int]() if len(commit.Parents) > 0 { newPipes = append(newPipes, &Pipe{ @@ -157,17 +150,17 @@ func getNextPipes(prevPipes []*Pipe, commit *models.Commit, getStyle func(c *mod }) } - traversedSpotsForContinuingPipes := make(map[int]bool) + traversedSpotsForContinuingPipes := set.New[int]() for _, pipe := range currentPipes { if !equalHashes(pipe.toSha, commit.Sha) { - traversedSpotsForContinuingPipes[pipe.toPos] = true + traversedSpotsForContinuingPipes.Add(pipe.toPos) } } getNextAvailablePosForContinuingPipe := func() int { i := 0 for { - if !traversedSpots[i] { + if !traversedSpots.Includes(i) { return i } i++ @@ -179,7 +172,7 @@ func getNextPipes(prevPipes []*Pipe, commit *models.Commit, getStyle func(c *mod for { // a newly created pipe is not allowed to end on a spot that's already taken, // nor on a spot that's been traversed by a continuing pipe. - if !takenSpots[i] && !traversedSpotsForContinuingPipes[i] { + if !takenSpots.Includes(i) && !traversedSpotsForContinuingPipes.Includes(i) { return i } i++ @@ -192,9 +185,9 @@ func getNextPipes(prevPipes []*Pipe, commit *models.Commit, getStyle func(c *mod left, right = right, left } for i := left; i <= right; i++ { - traversedSpots[i] = true + traversedSpots.Add(i) } - takenSpots[to] = true + takenSpots.Add(to) } for _, pipe := range currentPipes { @@ -237,7 +230,7 @@ func getNextPipes(prevPipes []*Pipe, commit *models.Commit, getStyle func(c *mod style: getStyle(commit), }) - takenSpots[availablePos] = true + takenSpots.Add(availablePos) } } @@ -246,7 +239,7 @@ func getNextPipes(prevPipes []*Pipe, commit *models.Commit, getStyle func(c *mod // continuing on, potentially moving left to fill in a blank spot last := pipe.toPos for i := pipe.toPos; i > pos; i-- { - if takenSpots[i] || traversedSpots[i] { + if takenSpots.Includes(i) || traversedSpots.Includes(i) { break } else { last = i @@ -265,11 +258,11 @@ func getNextPipes(prevPipes []*Pipe, commit *models.Commit, getStyle func(c *mod } // not efficient but doing it for now: sorting my pipes by toPos, then by kind - sort.Slice(newPipes, func(i, j int) bool { - if newPipes[i].toPos == newPipes[j].toPos { - return newPipes[i].kind < newPipes[j].kind + slices.SortFunc(newPipes, func(a, b *Pipe) bool { + if a.toPos == b.toPos { + return a.kind < b.kind } - return newPipes[i].toPos < newPipes[j].toPos + return a.toPos < b.toPos }) return newPipes @@ -297,10 +290,9 @@ func renderPipeSet( } isMerge := startCount > 1 - cells := make([]*Cell, maxPos+1) - for i := range cells { - cells[i] = &Cell{cellType: CONNECTION, style: style.FgDefault} - } + cells := slices.Map(lo.Range(maxPos+1), func(i int) *Cell { + return &Cell{cellType: CONNECTION, style: style.FgDefault} + }) renderPipe := func(pipe *Pipe, style style.TextStyle, overrideRightStyle bool) { left := pipe.left() @@ -336,17 +328,9 @@ func renderPipeSet( // so we have our commit pos again, now it's time to build the cells. // we'll handle the one that's sourced from our selected commit last so that it can override the other cells. - selectedPipes := []*Pipe{} - // pre-allocating this one because most of the time we'll only have non-selected pipes - nonSelectedPipes := make([]*Pipe, 0, len(pipes)) - - for _, pipe := range pipes { - if highlight && equalHashes(pipe.fromSha, selectedCommitSha) { - selectedPipes = append(selectedPipes, pipe) - } else { - nonSelectedPipes = append(nonSelectedPipes, pipe) - } - } + selectedPipes, nonSelectedPipes := slices.Partition(pipes, func(pipe *Pipe) bool { + return highlight && equalHashes(pipe.fromSha, selectedCommitSha) + }) for _, pipe := range nonSelectedPipes { if pipe.kind == STARTS { diff --git a/pkg/gui/presentation/graph/graph_test.go b/pkg/gui/presentation/graph/graph_test.go index 300042558..a6c60acf5 100644 --- a/pkg/gui/presentation/graph/graph_test.go +++ b/pkg/gui/presentation/graph/graph_test.go @@ -528,7 +528,7 @@ func TestGetNextPipes(t *testing.T) { func BenchmarkRenderCommitGraph(b *testing.B) { commits := generateCommits(50) getStyle := func(commit *models.Commit) style.TextStyle { - return authors.AuthorStyle(commit.Author) + return authors.AuthorStyle(commit.AuthorName) } b.ResetTimer() for i := 0; i < b.N; i++ { @@ -538,7 +538,7 @@ func BenchmarkRenderCommitGraph(b *testing.B) { func generateCommits(count int) []*models.Commit { rand.Seed(1234) - pool := []*models.Commit{{Sha: "a", Author: "A"}} + pool := []*models.Commit{{Sha: "a", AuthorName: "A"}} commits := make([]*models.Commit, 0, count) authorPool := []string{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"} for len(commits) < count { @@ -555,8 +555,8 @@ func generateCommits(count int) []*models.Commit { newParent = pool[j] } else { newParent = &models.Commit{ - Sha: fmt.Sprintf("%s%d", currentCommit.Sha, j), - Author: authorPool[rand.Intn(len(authorPool))], + Sha: fmt.Sprintf("%s%d", currentCommit.Sha, j), + AuthorName: authorPool[rand.Intn(len(authorPool))], } pool = append(pool, newParent) } diff --git a/pkg/gui/presentation/icons/file_icons.go b/pkg/gui/presentation/icons/file_icons.go new file mode 100644 index 000000000..e3f2b68eb --- /dev/null +++ b/pkg/gui/presentation/icons/file_icons.go @@ -0,0 +1,331 @@ +package icons + +import ( + "path/filepath" +) + +// https://github.com/ogham/exa/blob/master/src/output/icons.rs +const ( + DEFAULT_FILE_ICON = "\uf15b" // ď…› + DEFAULT_SUBMODULE_ICON = "\uf1d3" //  + DEFAULT_DIRECTORY_ICON = "\uf114" // ď„” +) + +var nameIconMap = map[string]string{ + ".Trash": "\uf1f8", //  + ".atom": "\ue764", //  + ".bashprofile": "\ue615", // î• + ".bashrc": "\uf489", // ď’‰ + ".idea": "\ue7b5", // îžµ + ".git": "\uf1d3", //  + ".gitattributes": "\uf1d3", //  + ".gitconfig": "\uf1d3", //  + ".github": "\uf408", // ď + ".gitignore": "\uf1d3", //  + ".gitmodules": "\uf1d3", //  + ".rvm": "\ue21e", // îž + ".vimrc": "\ue62b", // î« + ".vscode": "\ue70c", //  + ".zshrc": "\uf489", // ď’‰ + "Cargo.lock": "\ue7a8", //  + "Cargo.toml": "\ue7a8", //  + "bin": "\ue5fc", // î—Ľ + "config": "\ue5fc", // î—Ľ + "docker-compose.yml": "\uf308", // ďŚ + "Dockerfile": "\uf308", // ďŚ + "ds_store": "\uf179", // ď…ą + "gitignore_global": "\uf1d3", //  + "go.mod": "\ue626", // î¦ + "go.sum": "\ue626", // î¦ + "gradle": "\ue256", //  + "gruntfile.coffee": "\ue611", // î‘ + "gruntfile.js": "\ue611", // î‘ + "gruntfile.ls": "\ue611", // î‘ + "gulpfile.coffee": "\ue610", // î + "gulpfile.js": "\ue610", // î + "gulpfile.ls": "\ue610", // î + "hidden": "\uf023", //  + "include": "\ue5fc", // î—Ľ + "lib": "\uf121", //  + "localized": "\uf179", // ď…ą + "Makefile": "\uf489", // ď’‰ + "node_modules": "\ue718", // îś + "npmignore": "\ue71e", // îśž + "PKGBUILD": "\uf303", // ďŚ + "rubydoc": "\ue73b", // îś» + "yarn.lock": "\ue718", // îś +} + +var extIconMap = map[string]string{ + ".ai": "\ue7b4", // îž´ + ".android": "\ue70e", //  + ".apk": "\ue70e", //  + ".apple": "\uf179", // ď…ą + ".avi": "\uf03d", //  + ".avif": "\uf1c5", //  + ".avro": "\ue60b", // î‹ + ".awk": "\uf489", // ď’‰ + ".bash": "\uf489", // ď’‰ + ".bash_history": "\uf489", // ď’‰ + ".bash_profile": "\uf489", // ď’‰ + ".bashrc": "\uf489", // ď’‰ + ".bat": "\uf17a", // ď…ş + ".bats": "\uf489", // ď’‰ + ".bmp": "\uf1c5", //  + ".bz": "\uf410", // ď + ".bz2": "\uf410", // ď + ".c": "\ue61e", // îž + ".c++": "\ue61d", // îť + ".cab": "\ue70f", //  + ".cc": "\ue61d", // îť + ".cfg": "\ue615", // î• + ".class": "\ue256", //  + ".clj": "\ue768", //  + ".cljs": "\ue76a", //  + ".cls": "\uf034", //  + ".cmd": "\ue70f", //  + ".coffee": "\uf0f4", // ď´ + ".conf": "\ue615", // î• + ".cp": "\ue61d", // îť + ".cpio": "\uf410", // ď + ".cpp": "\ue61d", // îť + ".cs": "\uf81a", // ď š + ".csh": "\uf489", // ď’‰ + ".cshtml": "\uf1fa", //  + ".csproj": "\uf81a", // ď š + ".css": "\ue749", //  + ".csv": "\uf1c3", // ď‡ + ".csx": "\uf81a", // ď š + ".cxx": "\ue61d", // îť + ".d": "\ue7af", //  + ".dart": "\ue798", // îž + ".db": "\uf1c0", //  + ".deb": "\ue77d", // îť˝ + ".diff": "\uf440", // ď‘€ + ".djvu": "\uf02d", //  + ".dll": "\ue70f", //  + ".doc": "\uf1c2", //  + ".docx": "\uf1c2", //  + ".ds_store": "\uf179", // ď…ą + ".DS_store": "\uf179", // ď…ą + ".dump": "\uf1c0", //  + ".ebook": "\ue28b", //  + ".ebuild": "\uf30d", //  + ".editorconfig": "\ue615", // î• + ".ejs": "\ue618", // î + ".elm": "\ue62c", // î¬ + ".env": "\uf462", //  + ".eot": "\uf031", //  + ".epub": "\ue28a", //  + ".erb": "\ue73b", // îś» + ".erl": "\ue7b1", // îž± + ".ex": "\ue62d", // î­ + ".exe": "\uf17a", // ď…ş + ".exs": "\ue62d", // î­ + ".fish": "\uf489", // ď’‰ + ".flac": "\uf001", // ď€ + ".flv": "\uf03d", //  + ".font": "\uf031", //  + ".fs": "\ue7a7", // îž§ + ".fsi": "\ue7a7", // îž§ + ".fsx": "\ue7a7", // îž§ + ".gdoc": "\uf1c2", //  + ".gem": "\ue21e", // îž + ".gemfile": "\ue21e", // îž + ".gemspec": "\ue21e", // îž + ".gform": "\uf298", // ďŠ + ".gif": "\uf1c5", //  + ".git": "\uf1d3", //  + ".gitattributes": "\uf1d3", //  + ".gitignore": "\uf1d3", //  + ".gitmodules": "\uf1d3", //  + ".go": "\ue626", // î¦ + ".gradle": "\ue256", //  + ".groovy": "\ue775", // îťµ + ".gsheet": "\uf1c3", // ď‡ + ".gslides": "\uf1c4", //  + ".guardfile": "\ue21e", // îž + ".gz": "\uf410", // ď + ".h": "\uf0fd", // ď˝ + ".hbs": "\ue60f", // îŹ + ".hpp": "\uf0fd", // ď˝ + ".hs": "\ue777", // îť· + ".htm": "\uf13b", // ď„» + ".html": "\uf13b", // ď„» + ".hxx": "\uf0fd", // ď˝ + ".ico": "\uf1c5", //  + ".image": "\uf1c5", //  + ".iml": "\ue7b5", // îžµ + ".ini": "\uf17a", // ď…ş + ".ipynb": "\ue606", // î† + ".iso": "\ue271", //  + ".j2c": "\uf1c5", //  + ".j2k": "\uf1c5", //  + ".jad": "\ue256", //  + ".jar": "\ue256", //  + ".java": "\ue256", //  + ".jfi": "\uf1c5", //  + ".jfif": "\uf1c5", //  + ".jif": "\uf1c5", //  + ".jl": "\ue624", // î¤ + ".jmd": "\uf48a", // ď’Š + ".jp2": "\uf1c5", //  + ".jpe": "\uf1c5", //  + ".jpeg": "\uf1c5", //  + ".jpg": "\uf1c5", //  + ".jpx": "\uf1c5", //  + ".js": "\ue74e", //  + ".json": "\ue60b", // î‹ + ".jsx": "\ue7ba", // îžş + ".jxl": "\uf1c5", //  + ".ksh": "\uf489", // ď’‰ + ".latex": "\uf034", //  + ".less": "\ue758", // îť + ".lhs": "\ue777", // îť· + ".license": "\uf718", // ďś + ".localized": "\uf179", // ď…ą + ".lock": "\uf023", //  + ".log": "\uf18d", //  + ".lua": "\ue620", // î  + ".lz": "\uf410", // ď + ".lz4": "\uf410", // ď + ".lzh": "\uf410", // ď + ".lzma": "\uf410", // ď + ".lzo": "\uf410", // ď + ".m": "\ue61e", // îž + ".mm": "\ue61d", // îť + ".m4a": "\uf001", // ď€ + ".markdown": "\uf48a", // ď’Š + ".md": "\uf48a", // ď’Š + ".mjs": "\ue74e", //  + ".mk": "\uf489", // ď’‰ + ".mkd": "\uf48a", // ď’Š + ".mkv": "\uf03d", //  + ".mobi": "\ue28b", //  + ".mov": "\uf03d", //  + ".mp3": "\uf001", // ď€ + ".mp4": "\uf03d", //  + ".msi": "\ue70f", //  + ".mustache": "\ue60f", // îŹ + ".nix": "\uf313", //  + ".node": "\uf898", // ď˘ + ".npmignore": "\ue71e", // îśž + ".odp": "\uf1c4", //  + ".ods": "\uf1c3", // ď‡ + ".odt": "\uf1c2", //  + ".ogg": "\uf001", // ď€ + ".ogv": "\uf03d", //  + ".otf": "\uf031", //  + ".part": "\uf43a", // ďş + ".patch": "\uf440", // ď‘€ + ".pdf": "\uf1c1", // ď‡ + ".php": "\ue73d", // îś˝ + ".pl": "\ue769", // îť© + ".png": "\uf1c5", //  + ".ppt": "\uf1c4", //  + ".pptx": "\uf1c4", //  + ".procfile": "\ue21e", // îž + ".properties": "\ue60b", // î‹ + ".ps1": "\uf489", // ď’‰ + ".psd": "\ue7b8", //  + ".pxm": "\uf1c5", //  + ".py": "\ue606", // î† + ".pyc": "\ue606", // î† + ".r": "\uf25d", //  + ".rakefile": "\ue21e", // îž + ".rar": "\uf410", // ď + ".razor": "\uf1fa", //  + ".rb": "\ue21e", // îž + ".rdata": "\uf25d", //  + ".rdb": "\ue76d", // îť­ + ".rdoc": "\uf48a", // ď’Š + ".rds": "\uf25d", //  + ".readme": "\uf48a", // ď’Š + ".rlib": "\ue7a8", //  + ".rmd": "\uf48a", // ď’Š + ".rpm": "\ue7bb", // îž» + ".rs": "\ue7a8", //  + ".rspec": "\ue21e", // îž + ".rspec_parallel": "\ue21e", // îž + ".rspec_status": "\ue21e", // îž + ".rss": "\uf09e", //  + ".rtf": "\uf718", // ďś + ".ru": "\ue21e", // îž + ".rubydoc": "\ue73b", // îś» + ".sass": "\ue603", // î + ".scala": "\ue737", // îś· + ".scss": "\ue749", //  + ".sh": "\uf489", // ď’‰ + ".shell": "\uf489", // ď’‰ + ".slim": "\ue73b", // îś» + ".sln": "\ue70c", //  + ".so": "\uf17c", // ď…Ľ + ".sql": "\uf1c0", //  + ".sqlite3": "\ue7c4", // îź„ + ".sty": "\uf034", //  + ".styl": "\ue600", // î€ + ".stylus": "\ue600", // î€ + ".svg": "\uf1c5", //  + ".swift": "\ue755", // îť• + ".tar": "\uf410", // ď + ".taz": "\uf410", // ď + ".tbz": "\uf410", // ď + ".tbz2": "\uf410", // ď + ".tex": "\uf034", //  + ".tgz": "\uf410", // ď + ".tiff": "\uf1c5", //  + ".tlz": "\uf410", // ď + ".toml": "\ue615", // î• + ".torrent": "\ue275", //  + ".ts": "\ue628", // î¨ + ".tsv": "\uf1c3", // ď‡ + ".tsx": "\ue7ba", // îžş + ".ttf": "\uf031", //  + ".twig": "\ue61c", // îś + ".txt": "\uf15c", // ď…ś + ".txz": "\uf410", // ď + ".tz": "\uf410", // ď + ".tzo": "\uf410", // ď + ".video": "\uf03d", //  + ".vim": "\ue62b", // î« + ".vue": "\ufd42", // ﵂ + ".war": "\ue256", //  + ".wav": "\uf001", // ď€ + ".webm": "\uf03d", //  + ".webp": "\uf1c5", //  + ".windows": "\uf17a", // ď…ş + ".woff": "\uf031", //  + ".woff2": "\uf031", //  + ".xhtml": "\uf13b", // ď„» + ".xls": "\uf1c3", // ď‡ + ".xlsx": "\uf1c3", // ď‡ + ".xml": "\uf121", //  + ".xul": "\uf121", //  + ".xz": "\uf410", // ď + ".yaml": "\uf481", // ď’ + ".yml": "\uf481", // ď’ + ".zip": "\uf410", // ď + ".zsh": "\uf489", // ď’‰ + ".zsh-theme": "\uf489", // ď’‰ + ".zshrc": "\uf489", // ď’‰ + ".zst": "\uf410", // ď +} + +func IconForFile(name string, isSubmodule bool, isDirectory bool) string { + base := filepath.Base(name) + if icon, ok := nameIconMap[base]; ok { + return icon + } + + ext := filepath.Ext(name) + if icon, ok := extIconMap[ext]; ok { + return icon + } + + if isSubmodule { + return DEFAULT_SUBMODULE_ICON + } else if isDirectory { + return DEFAULT_DIRECTORY_ICON + } + return DEFAULT_FILE_ICON +} diff --git a/pkg/gui/presentation/icons/git_icons.go b/pkg/gui/presentation/icons/git_icons.go new file mode 100644 index 000000000..0f891d7bd --- /dev/null +++ b/pkg/gui/presentation/icons/git_icons.go @@ -0,0 +1,61 @@ +package icons + +import ( + "strings" + + "github.com/jesseduffield/lazygit/pkg/commands/models" +) + +const ( + BRANCH_ICON = "\ufb2b" // שׂ + DETACHED_HEAD_ICON = "\ue729" // îś© + TAG_ICON = "\uf02b" //  + COMMIT_ICON = "\ufc16" // ď°– + MERGE_COMMIT_ICON = "\ufb2c" // שּׁ + DEFAULT_REMOTE_ICON = "\uf7a1" //  +) + +type remoteIcon struct { + domain string + icon string +} + +var remoteIcons = []remoteIcon{ + {domain: "github.com", icon: "\ue709"}, //  + {domain: "bitbucket.org", icon: "\ue703"}, // îś + {domain: "gitlab.com", icon: "\uf296"}, //  + {domain: "dev.azure.com", icon: "\ufd03"}, // ď´ +} + +func IconForBranch(branch *models.Branch) string { + if branch.DisplayName != "" { + return DETACHED_HEAD_ICON + } + return BRANCH_ICON +} + +func IconForRemoteBranch(branch *models.RemoteBranch) string { + return BRANCH_ICON +} + +func IconForTag(tag *models.Tag) string { + return TAG_ICON +} + +func IconForCommit(commit *models.Commit) string { + if len(commit.Parents) > 1 { + return MERGE_COMMIT_ICON + } + return COMMIT_ICON +} + +func IconForRemote(remote *models.Remote) string { + for _, r := range remoteIcons { + for _, url := range remote.Urls { + if strings.Contains(url, r.domain) { + return r.icon + } + } + } + return DEFAULT_REMOTE_ICON +} diff --git a/pkg/gui/presentation/icons/icons.go b/pkg/gui/presentation/icons/icons.go new file mode 100644 index 000000000..81b16108b --- /dev/null +++ b/pkg/gui/presentation/icons/icons.go @@ -0,0 +1,11 @@ +package icons + +var isIconEnabled = false + +func IsIconEnabled() bool { + return isIconEnabled +} + +func SetIconEnabled(showIcons bool) { + isIconEnabled = showIcons +} diff --git a/pkg/gui/presentation/menu.go b/pkg/gui/presentation/menu.go new file mode 100644 index 000000000..c43896c22 --- /dev/null +++ b/pkg/gui/presentation/menu.go @@ -0,0 +1,7 @@ +package presentation + +import "github.com/jesseduffield/lazygit/pkg/gui/style" + +func OpensMenuStyle(str string) string { + return style.FgMagenta.Sprintf("%s...", str) +} diff --git a/pkg/gui/presentation/reflog_commits.go b/pkg/gui/presentation/reflog_commits.go index fd843d884..5a49f0374 100644 --- a/pkg/gui/presentation/reflog_commits.go +++ b/pkg/gui/presentation/reflog_commits.go @@ -1,6 +1,8 @@ package presentation import ( + "github.com/jesseduffield/generics/set" + "github.com/jesseduffield/generics/slices" "github.com/jesseduffield/lazygit/pkg/commands/models" "github.com/jesseduffield/lazygit/pkg/gui/style" "github.com/jesseduffield/lazygit/pkg/theme" @@ -8,59 +10,68 @@ import ( "github.com/kyokomi/emoji/v2" ) -func GetReflogCommitListDisplayStrings(commits []*models.Commit, fullDescription bool, cherryPickedCommitShaMap map[string]bool, diffName string, parseEmoji bool) [][]string { - lines := make([][]string, len(commits)) - - var displayFunc func(*models.Commit, map[string]bool, bool, bool) []string +func GetReflogCommitListDisplayStrings(commits []*models.Commit, fullDescription bool, cherryPickedCommitShaSet *set.Set[string], diffName string, timeFormat string, parseEmoji bool) [][]string { + var displayFunc func(*models.Commit, reflogCommitDisplayAttributes) []string if fullDescription { displayFunc = getFullDescriptionDisplayStringsForReflogCommit } else { displayFunc = getDisplayStringsForReflogCommit } - for i := range commits { - diffed := commits[i].Sha == diffName - lines[i] = displayFunc(commits[i], cherryPickedCommitShaMap, diffed, parseEmoji) - } - - return lines + return slices.Map(commits, func(commit *models.Commit) []string { + diffed := commit.Sha == diffName + cherryPicked := cherryPickedCommitShaSet.Includes(commit.Sha) + return displayFunc(commit, + reflogCommitDisplayAttributes{ + cherryPicked: cherryPicked, + diffed: diffed, + parseEmoji: parseEmoji, + timeFormat: timeFormat, + }) + }) } -func coloredReflogSha(c *models.Commit, cherryPickedCommitShaMap map[string]bool) string { +func reflogShaColor(cherryPicked, diffed bool) style.TextStyle { + if diffed { + return theme.DiffTerminalColor + } + shaColor := style.FgBlue - if cherryPickedCommitShaMap[c.Sha] { + if cherryPicked { shaColor = theme.CherryPickedCommitTextStyle } - return shaColor.Sprint(c.ShortSha()) + return shaColor } -func getFullDescriptionDisplayStringsForReflogCommit(c *models.Commit, cherryPickedCommitShaMap map[string]bool, diffed, parseEmoji bool) []string { - colorAttr := theme.DefaultTextColor - if diffed { - colorAttr = theme.DiffTerminalColor - } +type reflogCommitDisplayAttributes struct { + cherryPicked bool + diffed bool + parseEmoji bool + timeFormat string +} +func getFullDescriptionDisplayStringsForReflogCommit(c *models.Commit, attrs reflogCommitDisplayAttributes) []string { name := c.Name - if parseEmoji { + if attrs.parseEmoji { name = emoji.Sprint(name) } return []string{ - coloredReflogSha(c, cherryPickedCommitShaMap), - style.FgMagenta.Sprint(utils.UnixToDate(c.UnixTimestamp)), - colorAttr.Sprint(name), - } -} - -func getDisplayStringsForReflogCommit(c *models.Commit, cherryPickedCommitShaMap map[string]bool, diffed, parseEmoji bool) []string { - name := c.Name - if parseEmoji { - name = emoji.Sprint(name) - } - - return []string{ - coloredReflogSha(c, cherryPickedCommitShaMap), + reflogShaColor(attrs.cherryPicked, attrs.diffed).Sprint(c.ShortSha()), + style.FgMagenta.Sprint(utils.UnixToDate(c.UnixTimestamp, attrs.timeFormat)), + theme.DefaultTextColor.Sprint(name), + } +} + +func getDisplayStringsForReflogCommit(c *models.Commit, attrs reflogCommitDisplayAttributes) []string { + name := c.Name + if attrs.parseEmoji { + name = emoji.Sprint(name) + } + + return []string{ + reflogShaColor(attrs.cherryPicked, attrs.diffed).Sprint(c.ShortSha()), theme.DefaultTextColor.Sprint(name), } } diff --git a/pkg/gui/presentation/remote_branches.go b/pkg/gui/presentation/remote_branches.go index d8439acfe..4052d3fed 100644 --- a/pkg/gui/presentation/remote_branches.go +++ b/pkg/gui/presentation/remote_branches.go @@ -1,19 +1,17 @@ package presentation import ( + "github.com/jesseduffield/generics/slices" "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/presentation/icons" "github.com/jesseduffield/lazygit/pkg/theme" ) func GetRemoteBranchListDisplayStrings(branches []*models.RemoteBranch, diffName string) [][]string { - lines := make([][]string, len(branches)) - - for i := range branches { - diffed := branches[i].FullName() == diffName - lines[i] = getRemoteBranchDisplayStrings(branches[i], diffed) - } - - return lines + return slices.Map(branches, func(branch *models.RemoteBranch) []string { + diffed := branch.FullName() == diffName + return getRemoteBranchDisplayStrings(branch, diffed) + }) } // getRemoteBranchDisplayStrings returns the display string of branch @@ -23,5 +21,10 @@ func getRemoteBranchDisplayStrings(b *models.RemoteBranch, diffed bool) []string textStyle = theme.DiffTerminalColor } - return []string{textStyle.Sprint(b.Name)} + res := make([]string, 0, 2) + if icons.IsIconEnabled() { + res = append(res, textStyle.Sprint(icons.IconForRemoteBranch(b))) + } + res = append(res, textStyle.Sprint(b.Name)) + return res } diff --git a/pkg/gui/presentation/remotes.go b/pkg/gui/presentation/remotes.go index a1e50fe2f..7f82fe970 100644 --- a/pkg/gui/presentation/remotes.go +++ b/pkg/gui/presentation/remotes.go @@ -1,20 +1,18 @@ package presentation import ( + "github.com/jesseduffield/generics/slices" "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/presentation/icons" "github.com/jesseduffield/lazygit/pkg/gui/style" "github.com/jesseduffield/lazygit/pkg/theme" ) func GetRemoteListDisplayStrings(remotes []*models.Remote, diffName string) [][]string { - lines := make([][]string, len(remotes)) - - for i := range remotes { - diffed := remotes[i].Name == diffName - lines[i] = getRemoteDisplayStrings(remotes[i], diffed) - } - - return lines + return slices.Map(remotes, func(remote *models.Remote) []string { + diffed := remote.Name == diffName + return getRemoteDisplayStrings(remote, diffed) + }) } // getRemoteDisplayStrings returns the display string of branch @@ -26,5 +24,10 @@ func getRemoteDisplayStrings(r *models.Remote, diffed bool) []string { textStyle = theme.DiffTerminalColor } - return []string{textStyle.Sprint(r.Name), style.FgBlue.Sprintf("%d branches", branchCount)} + res := make([]string, 0, 3) + if icons.IsIconEnabled() { + res = append(res, textStyle.Sprint(icons.IconForRemote(r))) + } + res = append(res, textStyle.Sprint(r.Name), style.FgBlue.Sprintf("%d branches", branchCount)) + return res } diff --git a/pkg/gui/presentation/stash_entries.go b/pkg/gui/presentation/stash_entries.go index f15b35a9c..54b39c636 100644 --- a/pkg/gui/presentation/stash_entries.go +++ b/pkg/gui/presentation/stash_entries.go @@ -1,19 +1,16 @@ package presentation import ( + "github.com/jesseduffield/generics/slices" "github.com/jesseduffield/lazygit/pkg/commands/models" "github.com/jesseduffield/lazygit/pkg/theme" ) func GetStashEntryListDisplayStrings(stashEntries []*models.StashEntry, diffName string) [][]string { - lines := make([][]string, len(stashEntries)) - - for i := range stashEntries { - diffed := stashEntries[i].RefName() == diffName - lines[i] = getStashEntryDisplayStrings(stashEntries[i], diffed) - } - - return lines + return slices.Map(stashEntries, func(stashEntry *models.StashEntry) []string { + diffed := stashEntry.RefName() == diffName + return getStashEntryDisplayStrings(stashEntry, diffed) + }) } // getStashEntryDisplayStrings returns the display string of branch diff --git a/pkg/gui/presentation/submodules.go b/pkg/gui/presentation/submodules.go index 2d131ed8f..0fb057ef0 100644 --- a/pkg/gui/presentation/submodules.go +++ b/pkg/gui/presentation/submodules.go @@ -1,18 +1,15 @@ package presentation import ( + "github.com/jesseduffield/generics/slices" "github.com/jesseduffield/lazygit/pkg/commands/models" "github.com/jesseduffield/lazygit/pkg/theme" ) func GetSubmoduleListDisplayStrings(submodules []*models.SubmoduleConfig) [][]string { - lines := make([][]string, len(submodules)) - - for i := range submodules { - lines[i] = getSubmoduleDisplayStrings(submodules[i]) - } - - return lines + return slices.Map(submodules, func(submodule *models.SubmoduleConfig) []string { + return getSubmoduleDisplayStrings(submodule) + }) } func getSubmoduleDisplayStrings(s *models.SubmoduleConfig) []string { diff --git a/pkg/gui/presentation/suggestions.go b/pkg/gui/presentation/suggestions.go index 81c6a3a3d..5319b40f7 100644 --- a/pkg/gui/presentation/suggestions.go +++ b/pkg/gui/presentation/suggestions.go @@ -1,17 +1,14 @@ package presentation import ( + "github.com/jesseduffield/generics/slices" "github.com/jesseduffield/lazygit/pkg/gui/types" ) func GetSuggestionListDisplayStrings(suggestions []*types.Suggestion) [][]string { - lines := make([][]string, len(suggestions)) - - for i := range suggestions { - lines[i] = getSuggestionDisplayStrings(suggestions[i]) - } - - return lines + return slices.Map(suggestions, func(suggestion *types.Suggestion) []string { + return getSuggestionDisplayStrings(suggestion) + }) } func getSuggestionDisplayStrings(suggestion *types.Suggestion) []string { diff --git a/pkg/gui/presentation/tags.go b/pkg/gui/presentation/tags.go index 4754c4bef..2996db18d 100644 --- a/pkg/gui/presentation/tags.go +++ b/pkg/gui/presentation/tags.go @@ -1,19 +1,17 @@ package presentation import ( + "github.com/jesseduffield/generics/slices" "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/presentation/icons" "github.com/jesseduffield/lazygit/pkg/theme" ) func GetTagListDisplayStrings(tags []*models.Tag, diffName string) [][]string { - lines := make([][]string, len(tags)) - - for i := range tags { - diffed := tags[i].Name == diffName - lines[i] = getTagDisplayStrings(tags[i], diffed) - } - - return lines + return slices.Map(tags, func(tag *models.Tag) []string { + diffed := tag.Name == diffName + return getTagDisplayStrings(tag, diffed) + }) } // getTagDisplayStrings returns the display string of branch @@ -22,5 +20,10 @@ func getTagDisplayStrings(t *models.Tag, diffed bool) []string { if diffed { textStyle = theme.DiffTerminalColor } - return []string{textStyle.Sprint(t.Name)} + res := make([]string, 0, 2) + if icons.IsIconEnabled() { + res = append(res, textStyle.Sprint(icons.IconForTag(t))) + } + res = append(res, textStyle.Sprint(t.Name)) + return res } diff --git a/pkg/gui/pty.go b/pkg/gui/pty.go index b6c3069f2..4a87c98da 100644 --- a/pkg/gui/pty.go +++ b/pkg/gui/pty.go @@ -5,11 +5,13 @@ package gui import ( "io" + "os" "os/exec" "strings" "github.com/creack/pty" "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/utils" ) func (gui *Gui) desiredPtySize() *pty.Winsize { @@ -19,15 +21,16 @@ func (gui *Gui) desiredPtySize() *pty.Winsize { } func (gui *Gui) onResize() error { - if gui.State.Ptmx == nil { - return nil - } + gui.Mutexes.PtyMutex.Lock() + defer gui.Mutexes.PtyMutex.Unlock() - // TODO: handle resizing properly: we need to actually clear the main view - // and re-read the output from our pty. Or we could just re-run the original - // command from scratch - if err := pty.Setsize(gui.State.Ptmx, gui.desiredPtySize()); err != nil { - return err + for _, ptmx := range gui.viewPtmxMap { + // TODO: handle resizing properly: we need to actually clear the main view + // and re-read the output from our pty. Or we could just re-run the original + // command from scratch + if err := pty.Setsize(ptmx, gui.desiredPtySize()); err != nil { + return utils.WrapError(err) + } } return nil @@ -41,7 +44,7 @@ func (gui *Gui) onResize() error { // command. func (gui *Gui) newPtyTask(view *gocui.View, cmd *exec.Cmd, prefix string) error { width, _ := gui.Views.Main.Size() - pager := gui.Git.Config.GetPager(width) + pager := gui.git.Config.GetPager(width) if pager == "" { // if we're not using a custom pager we don't need to use a pty @@ -57,20 +60,26 @@ func (gui *Gui) newPtyTask(view *gocui.View, cmd *exec.Cmd, prefix string) error manager := gui.getManager(view) + var ptmx *os.File start := func() (*exec.Cmd, io.Reader) { - ptmx, err := pty.StartWithSize(cmd, gui.desiredPtySize()) + var err error + ptmx, err = pty.StartWithSize(cmd, gui.desiredPtySize()) if err != nil { - gui.Log.Error(err) + gui.c.Log.Error(err) } - gui.State.Ptmx = ptmx + gui.Mutexes.PtyMutex.Lock() + gui.viewPtmxMap[view.Name()] = ptmx + gui.Mutexes.PtyMutex.Unlock() return cmd, ptmx } onClose := func() { - gui.State.Ptmx.Close() - gui.State.Ptmx = nil + gui.Mutexes.PtyMutex.Lock() + ptmx.Close() + delete(gui.viewPtmxMap, view.Name()) + gui.Mutexes.PtyMutex.Unlock() } if err := manager.NewTask(manager.NewCmdTask(start, prefix, height+oy+10, onClose), cmdStr); err != nil { diff --git a/pkg/gui/quitting.go b/pkg/gui/quitting.go index c3fd2ce2f..cdb1ff09a 100644 --- a/pkg/gui/quitting.go +++ b/pkg/gui/quitting.go @@ -4,6 +4,7 @@ import ( "os" "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/gui/types" ) // when a user runs lazygit with the LAZYGIT_NEW_DIR_FILE env variable defined @@ -11,26 +12,29 @@ import ( // shell can then change to that directory. That means you don't get kicked // back to the directory that you started with. func (gui *Gui) recordCurrentDirectory() error { - if os.Getenv("LAZYGIT_NEW_DIR_FILE") == "" { - return nil - } - // determine current directory, set it in LAZYGIT_NEW_DIR_FILE dirName, err := os.Getwd() if err != nil { return err } + return gui.recordDirectory(dirName) +} - return gui.OSCommand.CreateFileWithContent(os.Getenv("LAZYGIT_NEW_DIR_FILE"), dirName) +func (gui *Gui) recordDirectory(dirName string) error { + newDirFilePath := os.Getenv("LAZYGIT_NEW_DIR_FILE") + if newDirFilePath == "" { + return nil + } + return gui.os.CreateFileWithContent(newDirFilePath, dirName) } func (gui *Gui) handleQuitWithoutChangingDirectory() error { - gui.State.RetainOriginalDir = true + gui.RetainOriginalDir = true return gui.quit() } func (gui *Gui) handleQuit() error { - gui.State.RetainOriginalDir = false + gui.RetainOriginalDir = false return gui.quit() } @@ -40,7 +44,7 @@ func (gui *Gui) handleTopLevelReturn() error { parentContext, hasParent := currentContext.GetParentContext() if hasParent && currentContext != nil && parentContext != nil { // TODO: think about whether this should be marked as a return rather than adding to the stack - return gui.pushContext(parentContext) + return gui.c.PushContext(parentContext) } for _, mode := range gui.modeStatuses() { @@ -50,17 +54,13 @@ func (gui *Gui) handleTopLevelReturn() error { } repoPathStack := gui.RepoPathStack - if len(repoPathStack) > 0 { - n := len(repoPathStack) - 1 - - path := repoPathStack[n] - - gui.RepoPathStack = repoPathStack[:n] + if !repoPathStack.IsEmpty() { + path := repoPathStack.Pop() return gui.dispatchSwitchToRepo(path, true) } - if gui.UserConfig.QuitOnTopLevelReturn { + if gui.c.UserConfig.QuitOnTopLevelReturn { return gui.handleQuit() } @@ -72,11 +72,11 @@ func (gui *Gui) quit() error { return gui.createUpdateQuitConfirmation() } - if gui.UserConfig.ConfirmOnQuit { - return gui.ask(askOpts{ - title: "", - prompt: gui.Tr.ConfirmQuit, - handleConfirm: func() error { + if gui.c.UserConfig.ConfirmOnQuit { + return gui.c.Confirm(types.ConfirmOpts{ + Title: "", + Prompt: gui.c.Tr.ConfirmQuit, + HandleConfirm: func() error { return gocui.ErrQuit }, }) diff --git a/pkg/gui/rebase_options_panel.go b/pkg/gui/rebase_options_panel.go deleted file mode 100644 index a9e7d9317..000000000 --- a/pkg/gui/rebase_options_panel.go +++ /dev/null @@ -1,155 +0,0 @@ -package gui - -import ( - "fmt" - "strings" - - "github.com/jesseduffield/lazygit/pkg/commands/types/enums" -) - -type RebaseOption string - -const ( - REBASE_OPTION_CONTINUE = "continue" - REBASE_OPTION_ABORT = "abort" - REBASE_OPTION_SKIP = "skip" -) - -func (gui *Gui) handleCreateRebaseOptionsMenu() error { - options := []string{REBASE_OPTION_CONTINUE, REBASE_OPTION_ABORT} - - if gui.Git.Status.WorkingTreeState() == enums.REBASE_MODE_REBASING { - options = append(options, REBASE_OPTION_SKIP) - } - - menuItems := make([]*menuItem, len(options)) - for i, option := range options { - // note to self. Never, EVER, close over loop variables in a function - option := option - menuItems[i] = &menuItem{ - displayString: option, - onPress: func() error { - return gui.genericMergeCommand(option) - }, - } - } - - var title string - if gui.Git.Status.WorkingTreeState() == enums.REBASE_MODE_MERGING { - title = gui.Tr.MergeOptionsTitle - } else { - title = gui.Tr.RebaseOptionsTitle - } - - return gui.createMenu(title, menuItems, createMenuOptions{showCancel: true}) -} - -func (gui *Gui) genericMergeCommand(command string) error { - status := gui.Git.Status.WorkingTreeState() - - if status != enums.REBASE_MODE_MERGING && status != enums.REBASE_MODE_REBASING { - return gui.createErrorPanel(gui.Tr.NotMergingOrRebasing) - } - - gui.logAction(fmt.Sprintf("Merge/Rebase: %s", command)) - - commandType := "" - switch status { - case enums.REBASE_MODE_MERGING: - commandType = "merge" - case enums.REBASE_MODE_REBASING: - commandType = "rebase" - default: - // shouldn't be possible to land here - } - - // we should end up with a command like 'git merge --continue' - - // it's impossible for a rebase to require a commit so we'll use a subprocess only if it's a merge - if status == enums.REBASE_MODE_MERGING && command != REBASE_OPTION_ABORT && gui.UserConfig.Git.Merging.ManualCommit { - // TODO: see if we should be calling more of the code from gui.Git.Rebase.GenericMergeOrRebaseAction - return gui.runSubprocessWithSuspenseAndRefresh( - gui.Git.Rebase.GenericMergeOrRebaseActionCmdObj(commandType, command), - ) - } - result := gui.Git.Rebase.GenericMergeOrRebaseAction(commandType, command) - if err := gui.handleGenericMergeCommandResult(result); err != nil { - return err - } - return nil -} - -var conflictStrings = []string{ - "Failed to merge in the changes", - "When you have resolved this problem", - "fix conflicts", - "Resolve all conflicts manually", -} - -func isMergeConflictErr(errStr string) bool { - for _, str := range conflictStrings { - if strings.Contains(errStr, str) { - return true - } - } - - return false -} - -func (gui *Gui) handleGenericMergeCommandResult(result error) error { - if err := gui.refreshSidePanels(refreshOptions{mode: ASYNC}); err != nil { - return err - } - if result == nil { - return nil - } else if strings.Contains(result.Error(), "No changes - did you forget to use") { - return gui.genericMergeCommand(REBASE_OPTION_SKIP) - } else if strings.Contains(result.Error(), "The previous cherry-pick is now empty") { - return gui.genericMergeCommand(REBASE_OPTION_CONTINUE) - } else if strings.Contains(result.Error(), "No rebase in progress?") { - // assume in this case that we're already done - return nil - } else if isMergeConflictErr(result.Error()) { - return gui.ask(askOpts{ - title: gui.Tr.FoundConflictsTitle, - prompt: gui.Tr.FoundConflicts, - handlersManageFocus: true, - handleConfirm: func() error { - return gui.pushContext(gui.State.Contexts.Files) - }, - handleClose: func() error { - if err := gui.returnFromContext(); err != nil { - return err - } - - return gui.genericMergeCommand(REBASE_OPTION_ABORT) - }, - }) - } else { - return gui.createErrorPanel(result.Error()) - } -} - -func (gui *Gui) abortMergeOrRebaseWithConfirm() error { - // prompt user to confirm that they want to abort, then do it - mode := gui.workingTreeStateNoun() - return gui.ask(askOpts{ - title: fmt.Sprintf(gui.Tr.AbortTitle, mode), - prompt: fmt.Sprintf(gui.Tr.AbortPrompt, mode), - handleConfirm: func() error { - return gui.genericMergeCommand(REBASE_OPTION_ABORT) - }, - }) -} - -func (gui *Gui) workingTreeStateNoun() string { - workingTreeState := gui.Git.Status.WorkingTreeState() - switch workingTreeState { - case enums.REBASE_MODE_NONE: - return "" - case enums.REBASE_MODE_MERGING: - return "merge" - default: - return "rebase" - } -} diff --git a/pkg/gui/recent_repos_panel.go b/pkg/gui/recent_repos_panel.go index 7bf6b068c..705461726 100644 --- a/pkg/gui/recent_repos_panel.go +++ b/pkg/gui/recent_repos_panel.go @@ -1,49 +1,120 @@ package gui import ( + "fmt" + "io/ioutil" "os" "path/filepath" + "strings" + "sync" + "github.com/jesseduffield/generics/slices" + appTypes "github.com/jesseduffield/lazygit/pkg/app/types" "github.com/jesseduffield/lazygit/pkg/commands" - "github.com/jesseduffield/lazygit/pkg/commands/git_config" "github.com/jesseduffield/lazygit/pkg/env" + "github.com/jesseduffield/lazygit/pkg/gui/presentation/icons" "github.com/jesseduffield/lazygit/pkg/gui/style" + "github.com/jesseduffield/lazygit/pkg/gui/types" "github.com/jesseduffield/lazygit/pkg/utils" ) -func (gui *Gui) handleCreateRecentReposMenu() error { - recentRepoPaths := gui.Config.GetAppState().RecentRepos - reposCount := utils.Min(len(recentRepoPaths), 20) +func (gui *Gui) getCurrentBranch(path string) string { + readHeadFile := func(path string) (string, error) { + headFile, err := ioutil.ReadFile(filepath.Join(path, "HEAD")) + if err == nil { + content := strings.TrimSpace(string(headFile)) + refsPrefix := "ref: refs/heads/" + branchDisplay := "" + if strings.HasPrefix(content, refsPrefix) { + // is a branch + branchDisplay = strings.TrimPrefix(content, refsPrefix) + } else { + // detached HEAD state, displaying short SHA + branchDisplay = utils.ShortSha(content) + } + return branchDisplay, nil + } + return "", err + } - // we won't show the current repo hence the -1 - menuItems := make([]*menuItem, reposCount-1) - for i, path := range recentRepoPaths[1:reposCount] { - path := path // cos we're closing over the loop variable - menuItems[i] = &menuItem{ - displayStrings: []string{ - filepath.Base(path), - style.FgMagenta.Sprint(path), - }, - onPress: func() error { - // if we were in a submodule, we want to forget about that stack of repos - // so that hitting escape in the new repo does nothing - gui.RepoPathStack = []string{} - return gui.dispatchSwitchToRepo(path, false) - }, + gitDirPath := filepath.Join(path, ".git") + + if gitDir, err := os.Stat(gitDirPath); err == nil { + if gitDir.IsDir() { + // ordinary repo + if branch, err := readHeadFile(gitDirPath); err == nil { + return branch + } + } else { + // worktree + if worktreeGitDir, err := ioutil.ReadFile(gitDirPath); err == nil { + content := strings.TrimSpace(string(worktreeGitDir)) + worktreePath := strings.TrimPrefix(content, "gitdir: ") + if branch, err := readHeadFile(worktreePath); err == nil { + return branch + } + } } } - return gui.createMenu(gui.Tr.RecentRepos, menuItems, createMenuOptions{showCancel: true}) + return gui.c.Tr.LcBranchUnknown +} + +func (gui *Gui) handleCreateRecentReposMenu() error { + // we'll show an empty panel if there are no recent repos + recentRepoPaths := []string{} + if len(gui.c.GetAppState().RecentRepos) > 0 { + // we skip the first one because we're currently in it + recentRepoPaths = gui.c.GetAppState().RecentRepos[1:] + } + + currentBranches := sync.Map{} + + wg := sync.WaitGroup{} + wg.Add(len(recentRepoPaths)) + + for _, path := range recentRepoPaths { + go func(path string) { + defer wg.Done() + currentBranches.Store(path, gui.getCurrentBranch(path)) + }(path) + } + + wg.Wait() + + menuItems := slices.Map(recentRepoPaths, func(path string) *types.MenuItem { + branchName, _ := currentBranches.Load(path) + if icons.IsIconEnabled() { + branchName = icons.BRANCH_ICON + " " + fmt.Sprintf("%v", branchName) + } + + return &types.MenuItem{ + LabelColumns: []string{ + filepath.Base(path), + style.FgCyan.Sprint(branchName), + style.FgMagenta.Sprint(path), + }, + OnPress: func() error { + // if we were in a submodule, we want to forget about that stack of repos + // so that hitting escape in the new repo does nothing + gui.RepoPathStack.Clear() + return gui.dispatchSwitchToRepo(path, false) + }, + } + }) + + return gui.c.Menu(types.CreateMenuOptions{Title: gui.c.Tr.RecentRepos, Items: menuItems}) } func (gui *Gui) handleShowAllBranchLogs() error { - cmdObj := gui.Git.Branch.AllBranchesLogCmdObj() - task := NewRunPtyTask(cmdObj.GetCmd()) + cmdObj := gui.git.Branch.AllBranchesLogCmdObj() + task := types.NewRunPtyTask(cmdObj.GetCmd()) - return gui.refreshMainViews(refreshMainOpts{ - main: &viewUpdateOpts{ - title: "Log", - task: task, + return gui.c.RenderToMainViews(types.RefreshMainOpts{ + Pair: gui.c.MainViewPairs().Normal, + Main: &types.ViewUpdateOpts{ + Title: gui.c.Tr.LogTitle, + Task: task, }, }) } @@ -57,12 +128,12 @@ func (gui *Gui) dispatchSwitchToRepo(path string, reuse bool) error { if err := os.Chdir(path); err != nil { if os.IsNotExist(err) { - return gui.createErrorPanel(gui.Tr.ErrRepositoryMovedOrDeleted) + return gui.c.ErrorMsg(gui.c.Tr.ErrRepositoryMovedOrDeleted) } return err } - if err := commands.VerifyInGitRepo(gui.OSCommand); err != nil { + if err := commands.VerifyInGitRepo(gui.os); err != nil { if err := os.Chdir(originalPath); err != nil { return err } @@ -70,45 +141,41 @@ func (gui *Gui) dispatchSwitchToRepo(path string, reuse bool) error { return err } - newGitCommand, err := commands.NewGitCommand(gui.Common, gui.OSCommand, git_config.NewStdCachedGitConfig(gui.Log)) - if err != nil { + if err := gui.recordCurrentDirectory(); err != nil { return err } - gui.Git = newGitCommand // these two mutexes are used by our background goroutines (triggered via `gui.goEvery`. We don't want to // switch to a repo while one of these goroutines is in the process of updating something - gui.Mutexes.FetchMutex.Lock() - defer gui.Mutexes.FetchMutex.Unlock() + gui.Mutexes.SyncMutex.Lock() + defer gui.Mutexes.SyncMutex.Unlock() gui.Mutexes.RefreshingFilesMutex.Lock() defer gui.Mutexes.RefreshingFilesMutex.Unlock() - gui.resetState("", reuse) - - return nil + return gui.onNewRepo(appTypes.StartArgs{}, reuse) } // updateRecentRepoList registers the fact that we opened lazygit in this repo, // so that we can open the same repo via the 'recent repos' menu func (gui *Gui) updateRecentRepoList() error { - if gui.Git.Status.IsBareRepo() { + if gui.git.Status.IsBareRepo() { // we could totally do this but it would require storing both the git-dir and the // worktree in our recent repos list, which is a change that would need to be // backwards compatible - gui.Log.Info("Not appending bare repo to recent repo list") + gui.c.Log.Info("Not appending bare repo to recent repo list") return nil } - recentRepos := gui.Config.GetAppState().RecentRepos + recentRepos := gui.c.GetAppState().RecentRepos currentRepo, err := os.Getwd() if err != nil { return err } known, recentRepos := newRecentReposList(recentRepos, currentRepo) gui.IsNewRepo = known - gui.Config.GetAppState().RecentRepos = recentRepos - return gui.Config.SaveAppState() + gui.c.GetAppState().RecentRepos = recentRepos + return gui.c.SaveAppState() } // newRecentReposList returns a new repo list with a new entry but only when it doesn't exist yet @@ -117,6 +184,9 @@ func newRecentReposList(recentRepos []string, currentRepo string) (bool, []strin newRepos := []string{currentRepo} for _, repo := range recentRepos { if repo != currentRepo { + if _, err := os.Stat(filepath.Join(repo, ".git")); err != nil { + continue + } newRepos = append(newRepos, repo) } else { isNew = false diff --git a/pkg/gui/recording.go b/pkg/gui/recording.go deleted file mode 100644 index 0a7f723df..000000000 --- a/pkg/gui/recording.go +++ /dev/null @@ -1,74 +0,0 @@ -package gui - -import ( - "encoding/json" - "io/ioutil" - "log" - "os" - "strconv" - - "github.com/jesseduffield/gocui" -) - -func recordingEvents() bool { - return recordEventsTo() != "" -} - -func recordEventsTo() string { - return os.Getenv("RECORD_EVENTS_TO") -} - -func replaying() bool { - return os.Getenv("REPLAY_EVENTS_FROM") != "" -} - -func headless() bool { - return os.Getenv("HEADLESS") != "" -} - -func getRecordingSpeed() float64 { - // humans are slow so this speeds things up. - speed := 1.0 - envReplaySpeed := os.Getenv("SPEED") - if envReplaySpeed != "" { - var err error - speed, err = strconv.ParseFloat(envReplaySpeed, 64) - if err != nil { - log.Fatal(err) - } - } - return speed -} - -func (gui *Gui) loadRecording() (*gocui.Recording, error) { - path := os.Getenv("REPLAY_EVENTS_FROM") - - data, err := ioutil.ReadFile(path) - if err != nil { - return nil, err - } - - recording := &gocui.Recording{} - - err = json.Unmarshal(data, &recording) - if err != nil { - return nil, err - } - - return recording, nil -} - -func (gui *Gui) saveRecording(recording *gocui.Recording) error { - if !recordingEvents() { - return nil - } - - jsonEvents, err := json.Marshal(recording) - if err != nil { - return err - } - - path := recordEventsTo() - - return ioutil.WriteFile(path, jsonEvents, 0600) -} diff --git a/pkg/gui/reflog_panel.go b/pkg/gui/reflog_panel.go index af8e8092c..cb84177da 100644 --- a/pkg/gui/reflog_panel.go +++ b/pkg/gui/reflog_panel.go @@ -1,120 +1,23 @@ package gui -import ( - "github.com/jesseduffield/lazygit/pkg/commands/models" -) - -// list panel functions - -func (gui *Gui) getSelectedReflogCommit() *models.Commit { - selectedLine := gui.State.Panels.ReflogCommits.SelectedLineIdx - reflogComits := gui.State.FilteredReflogCommits - if selectedLine == -1 || len(reflogComits) == 0 { - return nil - } - - return reflogComits[selectedLine] -} +import "github.com/jesseduffield/lazygit/pkg/gui/types" func (gui *Gui) reflogCommitsRenderToMain() error { - commit := gui.getSelectedReflogCommit() - var task updateTask + commit := gui.State.Contexts.ReflogCommits.GetSelected() + var task types.UpdateTask if commit == nil { - task = NewRenderStringTask("No reflog history") + task = types.NewRenderStringTask("No reflog history") } else { - cmdObj := gui.Git.Commit.ShowCmdObj(commit.Sha, gui.State.Modes.Filtering.GetPath()) + cmdObj := gui.git.Commit.ShowCmdObj(commit.Sha, gui.State.Modes.Filtering.GetPath()) - task = NewRunPtyTask(cmdObj.GetCmd()) + task = types.NewRunPtyTask(cmdObj.GetCmd()) } - return gui.refreshMainViews(refreshMainOpts{ - main: &viewUpdateOpts{ - title: "Reflog Entry", - task: task, + return gui.c.RenderToMainViews(types.RefreshMainOpts{ + Pair: gui.c.MainViewPairs().Normal, + Main: &types.ViewUpdateOpts{ + Title: "Reflog Entry", + Task: task, }, }) } - -// the reflogs panel is the only panel where we cache data, in that we only -// load entries that have been created since we last ran the call. This means -// we need to be more careful with how we use this, and to ensure we're emptying -// the reflogs array when changing contexts. -// This method also manages two things: ReflogCommits and FilteredReflogCommits. -// FilteredReflogCommits are rendered in the reflogs panel, and ReflogCommits -// are used by the branches panel to obtain recency values for sorting. -func (gui *Gui) refreshReflogCommits() error { - // pulling state into its own variable incase it gets swapped out for another state - // and we get an out of bounds exception - state := gui.State - var lastReflogCommit *models.Commit - if len(state.ReflogCommits) > 0 { - lastReflogCommit = state.ReflogCommits[0] - } - - refresh := func(stateCommits *[]*models.Commit, filterPath string) error { - commits, onlyObtainedNewReflogCommits, err := gui.Git.Loaders.ReflogCommits. - GetReflogCommits(lastReflogCommit, filterPath) - if err != nil { - return gui.surfaceError(err) - } - - if onlyObtainedNewReflogCommits { - *stateCommits = append(commits, *stateCommits...) - } else { - *stateCommits = commits - } - return nil - } - - if err := refresh(&state.ReflogCommits, ""); err != nil { - return err - } - - if gui.State.Modes.Filtering.Active() { - if err := refresh(&state.FilteredReflogCommits, state.Modes.Filtering.GetPath()); err != nil { - return err - } - } else { - state.FilteredReflogCommits = state.ReflogCommits - } - - return gui.postRefreshUpdate(gui.State.Contexts.ReflogCommits) -} - -func (gui *Gui) handleCheckoutReflogCommit() error { - commit := gui.getSelectedReflogCommit() - if commit == nil { - return nil - } - - err := gui.ask(askOpts{ - title: gui.Tr.LcCheckoutCommit, - prompt: gui.Tr.SureCheckoutThisCommit, - handleConfirm: func() error { - gui.logAction(gui.Tr.Actions.CheckoutReflogCommit) - return gui.handleCheckoutRef(commit.Sha, handleCheckoutRefOptions{}) - }, - }) - if err != nil { - return err - } - - gui.State.Panels.ReflogCommits.SelectedLineIdx = 0 - - return nil -} - -func (gui *Gui) handleCreateReflogResetMenu() error { - commit := gui.getSelectedReflogCommit() - - return gui.createResetMenu(commit.Sha) -} - -func (gui *Gui) handleViewReflogCommitFiles() error { - commit := gui.getSelectedReflogCommit() - if commit == nil { - return nil - } - - return gui.switchToCommitFilesContext(commit.Sha, false, gui.State.Contexts.ReflogCommits, "commits") -} diff --git a/pkg/gui/refresh.go b/pkg/gui/refresh.go new file mode 100644 index 000000000..d09583389 --- /dev/null +++ b/pkg/gui/refresh.go @@ -0,0 +1,713 @@ +package gui + +import ( + "fmt" + "strings" + "sync" + + "github.com/jesseduffield/generics/set" + "github.com/jesseduffield/generics/slices" + "github.com/jesseduffield/lazygit/pkg/commands/loaders" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/commands/types/enums" + "github.com/jesseduffield/lazygit/pkg/gui/context" + "github.com/jesseduffield/lazygit/pkg/gui/filetree" + "github.com/jesseduffield/lazygit/pkg/gui/mergeconflicts" + "github.com/jesseduffield/lazygit/pkg/gui/patch_exploring" + "github.com/jesseduffield/lazygit/pkg/gui/presentation" + "github.com/jesseduffield/lazygit/pkg/gui/style" + "github.com/jesseduffield/lazygit/pkg/gui/types" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +func getScopeNames(scopes []types.RefreshableView) []string { + scopeNameMap := map[types.RefreshableView]string{ + types.COMMITS: "commits", + types.BRANCHES: "branches", + types.FILES: "files", + types.SUBMODULES: "submodules", + types.STASH: "stash", + types.REFLOG: "reflog", + types.TAGS: "tags", + types.REMOTES: "remotes", + types.STATUS: "status", + types.BISECT_INFO: "bisect", + types.STAGING: "staging", + types.MERGE_CONFLICTS: "mergeConflicts", + } + + return slices.Map(scopes, func(scope types.RefreshableView) string { + return scopeNameMap[scope] + }) +} + +func getModeName(mode types.RefreshMode) string { + switch mode { + case types.SYNC: + return "sync" + case types.ASYNC: + return "async" + case types.BLOCK_UI: + return "block-ui" + default: + return "unknown mode" + } +} + +func (gui *Gui) Refresh(options types.RefreshOptions) error { + if options.Scope == nil { + gui.c.Log.Infof( + "refreshing all scopes in %s mode", + getModeName(options.Mode), + ) + } else { + gui.c.Log.Infof( + "refreshing the following scopes in %s mode: %s", + getModeName(options.Mode), + strings.Join(getScopeNames(options.Scope), ","), + ) + } + + wg := sync.WaitGroup{} + + f := func() { + var scopeSet *set.Set[types.RefreshableView] + if len(options.Scope) == 0 { + // not refreshing staging/patch-building unless explicitly requested because we only need + // to refresh those while focused. + scopeSet = set.NewFromSlice([]types.RefreshableView{ + types.COMMITS, + types.BRANCHES, + types.FILES, + types.STASH, + types.REFLOG, + types.TAGS, + types.REMOTES, + types.STATUS, + types.BISECT_INFO, + }) + } else { + scopeSet = set.NewFromSlice(options.Scope) + } + + refresh := func(f func()) { + wg.Add(1) + func() { + if options.Mode == types.ASYNC { + go utils.Safe(f) + } else { + f() + } + wg.Done() + }() + } + + if scopeSet.Includes(types.COMMITS) || scopeSet.Includes(types.BRANCHES) || scopeSet.Includes(types.REFLOG) || scopeSet.Includes(types.BISECT_INFO) { + refresh(gui.refreshCommits) + } else if scopeSet.Includes(types.REBASE_COMMITS) { + // the above block handles rebase commits so we only need to call this one + // if we've asked specifically for rebase commits and not those other things + refresh(func() { _ = gui.refreshRebaseCommits() }) + } + + // reason we're not doing this if the COMMITS type is included is that if the COMMITS type _is_ included we will refresh the commit files context anyway + if scopeSet.Includes(types.COMMIT_FILES) && !scopeSet.Includes(types.COMMITS) { + refresh(func() { _ = gui.refreshCommitFilesContext() }) + } + + if scopeSet.Includes(types.FILES) || scopeSet.Includes(types.SUBMODULES) { + refresh(func() { _ = gui.refreshFilesAndSubmodules() }) + } + + if scopeSet.Includes(types.STASH) { + refresh(func() { _ = gui.refreshStashEntries() }) + } + + if scopeSet.Includes(types.TAGS) { + refresh(func() { _ = gui.refreshTags() }) + } + + if scopeSet.Includes(types.REMOTES) { + refresh(func() { _ = gui.refreshRemotes() }) + } + + if scopeSet.Includes(types.STAGING) { + refresh(func() { _ = gui.refreshStagingPanel(types.OnFocusOpts{}) }) + } + + if scopeSet.Includes(types.PATCH_BUILDING) { + refresh(func() { _ = gui.refreshPatchBuildingPanel(types.OnFocusOpts{}) }) + } + + if scopeSet.Includes(types.MERGE_CONFLICTS) || scopeSet.Includes(types.FILES) { + refresh(func() { _ = gui.refreshMergeState() }) + } + + wg.Wait() + + gui.refreshStatus() + + if options.Then != nil { + options.Then() + } + } + + if options.Mode == types.BLOCK_UI { + gui.c.OnUIThread(func() error { + f() + return nil + }) + } else { + f() + } + + return nil +} + +// during startup, the bottleneck is fetching the reflog entries. We need these +// on startup to sort the branches by recency. So we have two phases: INITIAL, and COMPLETE. +// In the initial phase we don't get any reflog commits, but we asynchronously get them +// and refresh the branches after that +func (gui *Gui) refreshReflogCommitsConsideringStartup() { + switch gui.State.StartupStage { + case INITIAL: + go utils.Safe(func() { + _ = gui.refreshReflogCommits() + gui.refreshBranches() + gui.State.StartupStage = COMPLETE + }) + + case COMPLETE: + _ = gui.refreshReflogCommits() + } +} + +// whenever we change commits, we should update branches because the upstream/downstream +// counts can change. Whenever we change branches we should probably also change commits +// e.g. in the case of switching branches. +func (gui *Gui) refreshCommits() { + wg := sync.WaitGroup{} + wg.Add(2) + + go utils.Safe(func() { + gui.refreshReflogCommitsConsideringStartup() + + gui.refreshBranches() + wg.Done() + }) + + go utils.Safe(func() { + _ = gui.refreshCommitsWithLimit() + ctx, ok := gui.State.Contexts.CommitFiles.GetParentContext() + if ok && ctx.GetKey() == context.LOCAL_COMMITS_CONTEXT_KEY { + // This makes sense when we've e.g. just amended a commit, meaning we get a new commit SHA at the same position. + // However if we've just added a brand new commit, it pushes the list down by one and so we would end up + // showing the contents of a different commit than the one we initially entered. + // Ideally we would know when to refresh the commit files context and when not to, + // or perhaps we could just pop that context off the stack whenever cycling windows. + // For now the awkwardness remains. + commit := gui.getSelectedLocalCommit() + if commit != nil { + gui.State.Contexts.CommitFiles.SetRef(commit) + gui.State.Contexts.CommitFiles.SetTitleRef(commit.RefName()) + _ = gui.refreshCommitFilesContext() + } + } + wg.Done() + }) + + wg.Wait() +} + +func (gui *Gui) refreshCommitsWithLimit() error { + gui.Mutexes.LocalCommitsMutex.Lock() + defer gui.Mutexes.LocalCommitsMutex.Unlock() + + commits, err := gui.git.Loaders.Commits.GetCommits( + loaders.GetCommitsOptions{ + Limit: gui.State.Contexts.LocalCommits.GetLimitCommits(), + FilterPath: gui.State.Modes.Filtering.GetPath(), + IncludeRebaseCommits: true, + RefName: gui.refForLog(), + All: gui.State.Contexts.LocalCommits.GetShowWholeGitGraph(), + }, + ) + if err != nil { + return err + } + gui.State.Model.Commits = commits + + return gui.c.PostRefreshUpdate(gui.State.Contexts.LocalCommits) +} + +func (gui *Gui) refreshCommitFilesContext() error { + ref := gui.State.Contexts.CommitFiles.GetRef() + to := ref.RefName() + from, reverse := gui.State.Modes.Diffing.GetFromAndReverseArgsForDiff(ref.ParentRefName()) + + files, err := gui.git.Loaders.CommitFiles.GetFilesInDiff(from, to, reverse) + if err != nil { + return gui.c.Error(err) + } + gui.State.Model.CommitFiles = files + gui.State.Contexts.CommitFiles.CommitFileTreeViewModel.SetTree() + + return gui.c.PostRefreshUpdate(gui.State.Contexts.CommitFiles) +} + +func (gui *Gui) refreshRebaseCommits() error { + gui.Mutexes.LocalCommitsMutex.Lock() + defer gui.Mutexes.LocalCommitsMutex.Unlock() + + updatedCommits, err := gui.git.Loaders.Commits.MergeRebasingCommits(gui.State.Model.Commits) + if err != nil { + return err + } + gui.State.Model.Commits = updatedCommits + + return gui.c.PostRefreshUpdate(gui.State.Contexts.LocalCommits) +} + +func (self *Gui) refreshTags() error { + tags, err := self.git.Loaders.Tags.GetTags() + if err != nil { + return self.c.Error(err) + } + + self.State.Model.Tags = tags + + return self.postRefreshUpdate(self.State.Contexts.Tags) +} + +func (gui *Gui) refreshStateSubmoduleConfigs() error { + configs, err := gui.git.Submodule.GetConfigs() + if err != nil { + return err + } + + gui.State.Model.Submodules = configs + + return nil +} + +// gui.refreshStatus is called at the end of this because that's when we can +// be sure there is a State.Model.Branches array to pick the current branch from +func (gui *Gui) refreshBranches() { + reflogCommits := gui.State.Model.FilteredReflogCommits + if gui.State.Modes.Filtering.Active() { + // in filter mode we filter our reflog commits to just those containing the path + // however we need all the reflog entries to populate the recencies of our branches + // which allows us to order them correctly. So if we're filtering we'll just + // manually load all the reflog commits here + var err error + reflogCommits, _, err = gui.git.Loaders.ReflogCommits.GetReflogCommits(nil, "") + if err != nil { + gui.c.Log.Error(err) + } + } + + branches, err := gui.git.Loaders.Branches.Load(reflogCommits) + if err != nil { + _ = gui.c.Error(err) + } + + gui.State.Model.Branches = branches + + if err := gui.c.PostRefreshUpdate(gui.State.Contexts.Branches); err != nil { + gui.c.Log.Error(err) + } + + gui.refreshStatus() +} + +func (gui *Gui) refreshFilesAndSubmodules() error { + gui.Mutexes.RefreshingFilesMutex.Lock() + gui.State.IsRefreshingFiles = true + defer func() { + gui.State.IsRefreshingFiles = false + gui.Mutexes.RefreshingFilesMutex.Unlock() + }() + + if err := gui.refreshStateSubmoduleConfigs(); err != nil { + return err + } + + if err := gui.refreshStateFiles(); err != nil { + return err + } + + gui.c.OnUIThread(func() error { + if err := gui.c.PostRefreshUpdate(gui.State.Contexts.Submodules); err != nil { + gui.c.Log.Error(err) + } + + if err := gui.c.PostRefreshUpdate(gui.State.Contexts.Files); err != nil { + gui.c.Log.Error(err) + } + + return nil + }) + + return nil +} + +func (gui *Gui) refreshMergeState() error { + gui.State.Contexts.MergeConflicts.GetMutex().Lock() + defer gui.State.Contexts.MergeConflicts.GetMutex().Unlock() + + if gui.currentContext().GetKey() != context.MERGE_CONFLICTS_CONTEXT_KEY { + return nil + } + + hasConflicts, err := gui.helpers.MergeConflicts.SetConflictsAndRender(gui.State.Contexts.MergeConflicts.GetState().GetPath(), true) + if err != nil { + return gui.c.Error(err) + } + + if !hasConflicts { + return gui.helpers.MergeConflicts.EscapeMerge() + } + + return nil +} + +func (gui *Gui) refreshStateFiles() error { + state := gui.State + + fileTreeViewModel := state.Contexts.Files.FileTreeViewModel + + // If git thinks any of our files have inline merge conflicts, but they actually don't, + // we stage them. + // Note that if files with merge conflicts have both arisen and have been resolved + // between refreshes, we won't stage them here. This is super unlikely though, + // and this approach spares us from having to call `git status` twice in a row. + // Although this also means that at startup we won't be staging anything until + // we call git status again. + pathsToStage := []string{} + prevConflictFileCount := 0 + for _, file := range gui.State.Model.Files { + if file.HasMergeConflicts { + prevConflictFileCount++ + } + if file.HasInlineMergeConflicts { + hasConflicts, err := mergeconflicts.FileHasConflictMarkers(file.Name) + if err != nil { + gui.Log.Error(err) + } else if !hasConflicts { + pathsToStage = append(pathsToStage, file.Name) + } + } + } + + if len(pathsToStage) > 0 { + gui.c.LogAction(gui.Tr.Actions.StageResolvedFiles) + if err := gui.git.WorkingTree.StageFiles(pathsToStage); err != nil { + return gui.c.Error(err) + } + } + + files := gui.git.Loaders.Files. + GetStatusFiles(loaders.GetStatusFileOptions{}) + + conflictFileCount := 0 + for _, file := range files { + if file.HasMergeConflicts { + conflictFileCount++ + } + } + + if gui.git.Status.WorkingTreeState() != enums.REBASE_MODE_NONE && conflictFileCount == 0 && prevConflictFileCount > 0 { + gui.c.OnUIThread(func() error { return gui.helpers.MergeAndRebase.PromptToContinueRebase() }) + } + + fileTreeViewModel.RWMutex.Lock() + + // only taking over the filter if it hasn't already been set by the user. + // Though this does make it impossible for the user to actually say they want to display all if + // conflicts are currently being shown. Hmm. Worth it I reckon. If we need to add some + // extra state here to see if the user's set the filter themselves we can do that, but + // I'd prefer to maintain as little state as possible. + if conflictFileCount > 0 { + if fileTreeViewModel.GetFilter() == filetree.DisplayAll { + fileTreeViewModel.SetFilter(filetree.DisplayConflicted) + } + } else if fileTreeViewModel.GetFilter() == filetree.DisplayConflicted { + fileTreeViewModel.SetFilter(filetree.DisplayAll) + } + + state.Model.Files = files + fileTreeViewModel.SetTree() + fileTreeViewModel.RWMutex.Unlock() + + if err := gui.fileWatcher.addFilesToFileWatcher(files); err != nil { + return err + } + + return nil +} + +// the reflogs panel is the only panel where we cache data, in that we only +// load entries that have been created since we last ran the call. This means +// we need to be more careful with how we use this, and to ensure we're emptying +// the reflogs array when changing contexts. +// This method also manages two things: ReflogCommits and FilteredReflogCommits. +// FilteredReflogCommits are rendered in the reflogs panel, and ReflogCommits +// are used by the branches panel to obtain recency values for sorting. +func (gui *Gui) refreshReflogCommits() error { + // pulling state into its own variable incase it gets swapped out for another state + // and we get an out of bounds exception + state := gui.State + var lastReflogCommit *models.Commit + if len(state.Model.ReflogCommits) > 0 { + lastReflogCommit = state.Model.ReflogCommits[0] + } + + refresh := func(stateCommits *[]*models.Commit, filterPath string) error { + commits, onlyObtainedNewReflogCommits, err := gui.git.Loaders.ReflogCommits. + GetReflogCommits(lastReflogCommit, filterPath) + if err != nil { + return gui.c.Error(err) + } + + if onlyObtainedNewReflogCommits { + *stateCommits = append(commits, *stateCommits...) + } else { + *stateCommits = commits + } + return nil + } + + if err := refresh(&state.Model.ReflogCommits, ""); err != nil { + return err + } + + if gui.State.Modes.Filtering.Active() { + if err := refresh(&state.Model.FilteredReflogCommits, state.Modes.Filtering.GetPath()); err != nil { + return err + } + } else { + state.Model.FilteredReflogCommits = state.Model.ReflogCommits + } + + return gui.c.PostRefreshUpdate(gui.State.Contexts.ReflogCommits) +} + +func (gui *Gui) refreshRemotes() error { + prevSelectedRemote := gui.State.Contexts.Remotes.GetSelected() + + remotes, err := gui.git.Loaders.Remotes.GetRemotes() + if err != nil { + return gui.c.Error(err) + } + + gui.State.Model.Remotes = remotes + + // we need to ensure our selected remote branches aren't now outdated + if prevSelectedRemote != nil && gui.State.Model.RemoteBranches != nil { + // find remote now + for _, remote := range remotes { + if remote.Name == prevSelectedRemote.Name { + gui.State.Model.RemoteBranches = remote.Branches + break + } + } + } + + if err := gui.c.PostRefreshUpdate(gui.State.Contexts.Remotes); err != nil { + return err + } + + if err := gui.c.PostRefreshUpdate(gui.State.Contexts.RemoteBranches); err != nil { + return err + } + + return nil +} + +func (gui *Gui) refreshStashEntries() error { + gui.State.Model.StashEntries = gui.git.Loaders.Stash. + GetStashEntries(gui.State.Modes.Filtering.GetPath()) + + return gui.postRefreshUpdate(gui.State.Contexts.Stash) +} + +// never call this on its own, it should only be called from within refreshCommits() +func (gui *Gui) refreshStatus() { + gui.Mutexes.RefreshingStatusMutex.Lock() + defer gui.Mutexes.RefreshingStatusMutex.Unlock() + + currentBranch := gui.helpers.Refs.GetCheckedOutRef() + if currentBranch == nil { + // need to wait for branches to refresh + return + } + status := "" + + if currentBranch.IsRealBranch() { + status += presentation.ColoredBranchStatus(currentBranch, gui.Tr) + " " + } + + workingTreeState := gui.git.Status.WorkingTreeState() + if workingTreeState != enums.REBASE_MODE_NONE { + status += style.FgYellow.Sprintf("(%s) ", formatWorkingTreeState(workingTreeState)) + } + + name := presentation.GetBranchTextStyle(currentBranch.Name).Sprint(currentBranch.Name) + repoName := utils.GetCurrentRepoName() + status += fmt.Sprintf("%s → %s ", repoName, name) + + gui.setViewContent(gui.Views.Status, status) +} + +func (gui *Gui) refreshStagingPanel(focusOpts types.OnFocusOpts) error { + secondaryFocused := gui.secondaryStagingFocused() + + mainSelectedLineIdx := -1 + secondarySelectedLineIdx := -1 + if focusOpts.ClickedViewLineIdx > 0 { + if secondaryFocused { + secondarySelectedLineIdx = focusOpts.ClickedViewLineIdx + } else { + mainSelectedLineIdx = focusOpts.ClickedViewLineIdx + } + } + + mainContext := gui.State.Contexts.Staging + secondaryContext := gui.State.Contexts.StagingSecondary + + file := gui.getSelectedFile() + if file == nil || (!file.HasUnstagedChanges && !file.HasStagedChanges) { + return gui.handleStagingEscape() + } + + mainDiff := gui.git.WorkingTree.WorktreeFileDiff(file, true, false, false) + secondaryDiff := gui.git.WorkingTree.WorktreeFileDiff(file, true, true, false) + + // grabbing locks here and releasing before we finish the function + // because pushing say the secondary context could mean entering this function + // again, and we don't want to have a deadlock + mainContext.GetMutex().Lock() + secondaryContext.GetMutex().Lock() + + mainContext.SetState( + patch_exploring.NewState(mainDiff, mainSelectedLineIdx, mainContext.GetState(), gui.Log), + ) + + secondaryContext.SetState( + patch_exploring.NewState(secondaryDiff, secondarySelectedLineIdx, secondaryContext.GetState(), gui.Log), + ) + + mainState := mainContext.GetState() + secondaryState := secondaryContext.GetState() + + mainContent := mainContext.GetContentToRender(!secondaryFocused) + secondaryContent := secondaryContext.GetContentToRender(secondaryFocused) + + mainContext.GetMutex().Unlock() + secondaryContext.GetMutex().Unlock() + + if mainState == nil && secondaryState == nil { + return gui.handleStagingEscape() + } + + if mainState == nil && !secondaryFocused { + return gui.c.PushContext(secondaryContext, focusOpts) + } + + if secondaryState == nil && secondaryFocused { + return gui.c.PushContext(mainContext, focusOpts) + } + + return gui.c.RenderToMainViews(types.RefreshMainOpts{ + Pair: gui.c.MainViewPairs().Staging, + Main: &types.ViewUpdateOpts{ + Task: types.NewRenderStringWithoutScrollTask(mainContent), + Title: gui.Tr.UnstagedChanges, + }, + Secondary: &types.ViewUpdateOpts{ + Task: types.NewRenderStringWithoutScrollTask(secondaryContent), + Title: gui.Tr.StagedChanges, + }, + }) +} + +func (gui *Gui) handleStagingEscape() error { + return gui.c.PushContext(gui.State.Contexts.Files) +} + +func (gui *Gui) secondaryStagingFocused() bool { + return gui.currentStaticContext().GetKey() == gui.State.Contexts.StagingSecondary.GetKey() +} + +func (gui *Gui) refreshPatchBuildingPanel(opts types.OnFocusOpts) error { + selectedLineIdx := -1 + if opts.ClickedWindowName == "main" { + selectedLineIdx = opts.ClickedViewLineIdx + } + + if !gui.git.Patch.PatchManager.Active() { + return gui.helpers.PatchBuilding.Escape() + } + + // get diff from commit file that's currently selected + path := gui.State.Contexts.CommitFiles.GetSelectedPath() + if path == "" { + return nil + } + + ref := gui.State.Contexts.CommitFiles.CommitFileTreeViewModel.GetRef() + to := ref.RefName() + from, reverse := gui.State.Modes.Diffing.GetFromAndReverseArgsForDiff(ref.ParentRefName()) + diff, err := gui.git.WorkingTree.ShowFileDiff(from, to, reverse, path, true) + if err != nil { + return err + } + + secondaryDiff := gui.git.Patch.PatchManager.RenderPatchForFile(path, false, false, true) + if err != nil { + return err + } + + context := gui.State.Contexts.CustomPatchBuilder + + oldState := context.GetState() + + state := patch_exploring.NewState(diff, selectedLineIdx, oldState, gui.Log) + context.SetState(state) + if state == nil { + return gui.helpers.PatchBuilding.Escape() + } + + mainContent := context.GetContentToRender(true) + + return gui.c.RenderToMainViews(types.RefreshMainOpts{ + Pair: gui.c.MainViewPairs().PatchBuilding, + Main: &types.ViewUpdateOpts{ + Task: types.NewRenderStringWithoutScrollTask(mainContent), + Title: gui.Tr.Patch, + }, + Secondary: &types.ViewUpdateOpts{ + Task: types.NewRenderStringWithoutScrollTask(secondaryDiff), + Title: gui.Tr.CustomPatch, + }, + }) +} + +func (gui *Gui) refreshMergePanel(isFocused bool) error { + content := gui.State.Contexts.MergeConflicts.GetContentToRender(isFocused) + + var task types.UpdateTask + if gui.State.Contexts.MergeConflicts.IsUserScrolling() { + task = types.NewRenderStringWithoutScrollTask(content) + } else { + originY := gui.State.Contexts.MergeConflicts.GetOriginY() + task = types.NewRenderStringWithScrollTask(content, 0, originY) + } + + return gui.c.RenderToMainViews(types.RefreshMainOpts{ + Pair: gui.c.MainViewPairs().MergeConflicts, + Main: &types.ViewUpdateOpts{ + Task: task, + }, + }) +} diff --git a/pkg/gui/remote_branches_panel.go b/pkg/gui/remote_branches_panel.go index 29ab59187..6e9a8e779 100644 --- a/pkg/gui/remote_branches_panel.go +++ b/pkg/gui/remote_branches_panel.go @@ -1,108 +1,22 @@ package gui -import ( - "fmt" - - "github.com/jesseduffield/lazygit/pkg/commands/models" - "github.com/jesseduffield/lazygit/pkg/utils" -) - -// list panel functions - -func (gui *Gui) getSelectedRemoteBranch() *models.RemoteBranch { - selectedLine := gui.State.Panels.RemoteBranches.SelectedLineIdx - if selectedLine == -1 || len(gui.State.RemoteBranches) == 0 { - return nil - } - - return gui.State.RemoteBranches[selectedLine] -} +import "github.com/jesseduffield/lazygit/pkg/gui/types" func (gui *Gui) remoteBranchesRenderToMain() error { - var task updateTask - remoteBranch := gui.getSelectedRemoteBranch() + var task types.UpdateTask + remoteBranch := gui.State.Contexts.RemoteBranches.GetSelected() if remoteBranch == nil { - task = NewRenderStringTask("No branches for this remote") + task = types.NewRenderStringTask("No branches for this remote") } else { - cmdObj := gui.Git.Branch.GetGraphCmdObj(remoteBranch.FullName()) - task = NewRunCommandTask(cmdObj.GetCmd()) + cmdObj := gui.git.Branch.GetGraphCmdObj(remoteBranch.FullRefName()) + task = types.NewRunCommandTask(cmdObj.GetCmd()) } - return gui.refreshMainViews(refreshMainOpts{ - main: &viewUpdateOpts{ - title: "Remote Branch", - task: task, + return gui.c.RenderToMainViews(types.RefreshMainOpts{ + Pair: gui.c.MainViewPairs().Normal, + Main: &types.ViewUpdateOpts{ + Title: "Remote Branch", + Task: task, }, }) } - -func (gui *Gui) handleRemoteBranchesEscape() error { - return gui.pushContext(gui.State.Contexts.Remotes) -} - -func (gui *Gui) handleMergeRemoteBranch() error { - selectedBranchName := gui.getSelectedRemoteBranch().FullName() - return gui.mergeBranchIntoCheckedOutBranch(selectedBranchName) -} - -func (gui *Gui) handleDeleteRemoteBranch() error { - remoteBranch := gui.getSelectedRemoteBranch() - if remoteBranch == nil { - return nil - } - message := fmt.Sprintf("%s '%s'?", gui.Tr.DeleteRemoteBranchMessage, remoteBranch.FullName()) - - return gui.ask(askOpts{ - title: gui.Tr.DeleteRemoteBranch, - prompt: message, - handleConfirm: func() error { - return gui.WithWaitingStatus(gui.Tr.DeletingStatus, func() error { - gui.logAction(gui.Tr.Actions.DeleteRemoteBranch) - err := gui.Git.Remote.DeleteRemoteBranch(remoteBranch.RemoteName, remoteBranch.Name) - gui.handleCredentialsPopup(err) - - return gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{BRANCHES, REMOTES}}) - }) - }, - }) -} - -func (gui *Gui) handleRebaseOntoRemoteBranch() error { - selectedBranchName := gui.getSelectedRemoteBranch().FullName() - return gui.handleRebaseOntoBranch(selectedBranchName) -} - -func (gui *Gui) handleSetBranchUpstream() error { - selectedBranch := gui.getSelectedRemoteBranch() - checkedOutBranch := gui.getCheckedOutBranch() - - message := utils.ResolvePlaceholderString( - gui.Tr.SetUpstreamMessage, - map[string]string{ - "checkedOut": checkedOutBranch.Name, - "selected": selectedBranch.FullName(), - }, - ) - - return gui.ask(askOpts{ - title: gui.Tr.SetUpstreamTitle, - prompt: message, - handleConfirm: func() error { - gui.logAction(gui.Tr.Actions.SetBranchUpstream) - if err := gui.Git.Branch.SetUpstream(selectedBranch.RemoteName, selectedBranch.Name, checkedOutBranch.Name); err != nil { - return gui.surfaceError(err) - } - - return gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{BRANCHES, REMOTES}}) - }, - }) -} - -func (gui *Gui) handleCreateResetToRemoteBranchMenu() error { - selectedBranch := gui.getSelectedRemoteBranch() - if selectedBranch == nil { - return nil - } - - return gui.createResetMenu(selectedBranch.FullName()) -} diff --git a/pkg/gui/remotes_panel.go b/pkg/gui/remotes_panel.go index c74653a27..edaade8a8 100644 --- a/pkg/gui/remotes_panel.go +++ b/pkg/gui/remotes_panel.go @@ -4,184 +4,26 @@ import ( "fmt" "strings" - "github.com/jesseduffield/lazygit/pkg/commands/models" "github.com/jesseduffield/lazygit/pkg/gui/style" - "github.com/jesseduffield/lazygit/pkg/utils" + "github.com/jesseduffield/lazygit/pkg/gui/types" ) // list panel functions -func (gui *Gui) getSelectedRemote() *models.Remote { - selectedLine := gui.State.Panels.Remotes.SelectedLineIdx - if selectedLine == -1 || len(gui.State.Remotes) == 0 { - return nil - } - - return gui.State.Remotes[selectedLine] -} - func (gui *Gui) remotesRenderToMain() error { - var task updateTask - remote := gui.getSelectedRemote() + var task types.UpdateTask + remote := gui.State.Contexts.Remotes.GetSelected() if remote == nil { - task = NewRenderStringTask("No remotes") + task = types.NewRenderStringTask("No remotes") } else { - task = NewRenderStringTask(fmt.Sprintf("%s\nUrls:\n%s", style.FgGreen.Sprint(remote.Name), strings.Join(remote.Urls, "\n"))) + task = types.NewRenderStringTask(fmt.Sprintf("%s\nUrls:\n%s", style.FgGreen.Sprint(remote.Name), strings.Join(remote.Urls, "\n"))) } - return gui.refreshMainViews(refreshMainOpts{ - main: &viewUpdateOpts{ - title: "Remote", - task: task, + return gui.c.RenderToMainViews(types.RefreshMainOpts{ + Pair: gui.c.MainViewPairs().Normal, + Main: &types.ViewUpdateOpts{ + Title: "Remote", + Task: task, }, }) } - -func (gui *Gui) refreshRemotes() error { - prevSelectedRemote := gui.getSelectedRemote() - - remotes, err := gui.Git.Loaders.Remotes.GetRemotes() - if err != nil { - return gui.surfaceError(err) - } - - gui.State.Remotes = remotes - - // we need to ensure our selected remote branches aren't now outdated - if prevSelectedRemote != nil && gui.State.RemoteBranches != nil { - // find remote now - for _, remote := range remotes { - if remote.Name == prevSelectedRemote.Name { - gui.State.RemoteBranches = remote.Branches - } - } - } - - return gui.postRefreshUpdate(gui.mustContextForContextKey(ContextKey(gui.Views.Branches.Context))) -} - -func (gui *Gui) handleRemoteEnter() error { - // naive implementation: get the branches and render them to the list, change the context - remote := gui.getSelectedRemote() - if remote == nil { - return nil - } - - gui.State.RemoteBranches = remote.Branches - - newSelectedLine := 0 - if len(remote.Branches) == 0 { - newSelectedLine = -1 - } - gui.State.Panels.RemoteBranches.SelectedLineIdx = newSelectedLine - - return gui.pushContext(gui.State.Contexts.RemoteBranches) -} - -func (gui *Gui) handleAddRemote() error { - return gui.prompt(promptOpts{ - title: gui.Tr.LcNewRemoteName, - handleConfirm: func(remoteName string) error { - return gui.prompt(promptOpts{ - title: gui.Tr.LcNewRemoteUrl, - handleConfirm: func(remoteUrl string) error { - gui.logAction(gui.Tr.Actions.AddRemote) - if err := gui.Git.Remote.AddRemote(remoteName, remoteUrl); err != nil { - return err - } - return gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{REMOTES}}) - }, - }) - }, - }) - -} - -func (gui *Gui) handleRemoveRemote() error { - remote := gui.getSelectedRemote() - if remote == nil { - return nil - } - - return gui.ask(askOpts{ - title: gui.Tr.LcRemoveRemote, - prompt: gui.Tr.LcRemoveRemotePrompt + " '" + remote.Name + "'?", - handleConfirm: func() error { - gui.logAction(gui.Tr.Actions.RemoveRemote) - if err := gui.Git.Remote.RemoveRemote(remote.Name); err != nil { - return gui.surfaceError(err) - } - - return gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{BRANCHES, REMOTES}}) - }, - }) -} - -func (gui *Gui) handleEditRemote() error { - remote := gui.getSelectedRemote() - if remote == nil { - return nil - } - - editNameMessage := utils.ResolvePlaceholderString( - gui.Tr.LcEditRemoteName, - map[string]string{ - "remoteName": remote.Name, - }, - ) - - return gui.prompt(promptOpts{ - title: editNameMessage, - initialContent: remote.Name, - handleConfirm: func(updatedRemoteName string) error { - if updatedRemoteName != remote.Name { - gui.logAction(gui.Tr.Actions.UpdateRemote) - if err := gui.Git.Remote.RenameRemote(remote.Name, updatedRemoteName); err != nil { - return gui.surfaceError(err) - } - } - - editUrlMessage := utils.ResolvePlaceholderString( - gui.Tr.LcEditRemoteUrl, - map[string]string{ - "remoteName": updatedRemoteName, - }, - ) - - urls := remote.Urls - url := "" - if len(urls) > 0 { - url = urls[0] - } - - return gui.prompt(promptOpts{ - title: editUrlMessage, - initialContent: url, - handleConfirm: func(updatedRemoteUrl string) error { - gui.logAction(gui.Tr.Actions.UpdateRemote) - if err := gui.Git.Remote.UpdateRemoteUrl(updatedRemoteName, updatedRemoteUrl); err != nil { - return gui.surfaceError(err) - } - return gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{BRANCHES, REMOTES}}) - }, - }) - }, - }) -} - -func (gui *Gui) handleFetchRemote() error { - remote := gui.getSelectedRemote() - if remote == nil { - return nil - } - - return gui.WithWaitingStatus(gui.Tr.FetchingRemoteStatus, func() error { - gui.Mutexes.FetchMutex.Lock() - defer gui.Mutexes.FetchMutex.Unlock() - - err := gui.Git.Sync.FetchRemote(remote.Name) - gui.handleCredentialsPopup(err) - - return gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{BRANCHES, REMOTES}}) - }) -} diff --git a/pkg/gui/reset_menu_panel.go b/pkg/gui/reset_menu_panel.go deleted file mode 100644 index 586987778..000000000 --- a/pkg/gui/reset_menu_panel.go +++ /dev/null @@ -1,48 +0,0 @@ -package gui - -import ( - "fmt" - - "github.com/jesseduffield/lazygit/pkg/gui/style" -) - -func (gui *Gui) resetToRef(ref string, strength string, envVars []string) error { - if err := gui.Git.Commit.ResetToCommit(ref, strength, envVars); err != nil { - return gui.surfaceError(err) - } - - gui.State.Panels.Commits.SelectedLineIdx = 0 - gui.State.Panels.ReflogCommits.SelectedLineIdx = 0 - // loading a heap of commits is slow so we limit them whenever doing a reset - gui.State.Panels.Commits.LimitCommits = true - - if err := gui.pushContext(gui.State.Contexts.BranchCommits); err != nil { - return err - } - - if err := gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{FILES, BRANCHES, REFLOG, COMMITS}}); err != nil { - return err - } - - return nil -} - -func (gui *Gui) createResetMenu(ref string) error { - strengths := []string{"soft", "mixed", "hard"} - menuItems := make([]*menuItem, len(strengths)) - for i, strength := range strengths { - strength := strength - menuItems[i] = &menuItem{ - displayStrings: []string{ - fmt.Sprintf("%s reset", strength), - style.FgRed.Sprintf("reset --%s %s", strength, ref), - }, - onPress: func() error { - gui.logAction("Reset") - return gui.resetToRef(ref, strength, []string{}) - }, - } - } - - return gui.createMenu(fmt.Sprintf("%s %s", gui.Tr.LcResetTo, ref), menuItems, createMenuOptions{showCancel: true}) -} diff --git a/pkg/gui/searching.go b/pkg/gui/searching.go index dd7697363..a8580655c 100644 --- a/pkg/gui/searching.go +++ b/pkg/gui/searching.go @@ -3,6 +3,7 @@ package gui import ( "fmt" + "github.com/jesseduffield/lazygit/pkg/gui/keybindings" "github.com/jesseduffield/lazygit/pkg/theme" ) @@ -17,7 +18,7 @@ func (gui *Gui) handleOpenSearch(viewName string) error { gui.Views.Search.ClearTextArea() - if err := gui.pushContext(gui.State.Contexts.Search); err != nil { + if err := gui.c.PushContext(gui.State.Contexts.Search); err != nil { return err } @@ -26,7 +27,7 @@ func (gui *Gui) handleOpenSearch(viewName string) error { func (gui *Gui) handleSearch() error { gui.State.Searching.searchString = gui.Views.Search.TextArea.GetContent() - if err := gui.returnFromContext(); err != nil { + if err := gui.c.PopContext(); err != nil { return err } @@ -43,7 +44,7 @@ func (gui *Gui) handleSearch() error { } func (gui *Gui) onSelectItemWrapper(innerFunc func(int) error) func(int, int, int) error { - keybindingConfig := gui.UserConfig.Keybinding + keybindingConfig := gui.c.UserConfig.Keybinding return func(y int, index int, total int) error { if total == 0 { @@ -52,7 +53,7 @@ func (gui *Gui) onSelectItemWrapper(innerFunc func(int) error) func(int, int, in fmt.Sprintf( "no matches for '%s' %s", gui.State.Searching.searchString, - theme.OptionsFgColor.Sprintf("%s: exit search mode", gui.getKeyDisplay(keybindingConfig.Universal.Return)), + theme.OptionsFgColor.Sprintf("%s: exit search mode", keybindings.Label(keybindingConfig.Universal.Return)), ), ) } @@ -65,9 +66,9 @@ func (gui *Gui) onSelectItemWrapper(innerFunc func(int) error) func(int, int, in total, theme.OptionsFgColor.Sprintf( "%s: next match, %s: previous match, %s: exit search mode", - gui.getKeyDisplay(keybindingConfig.Universal.NextMatch), - gui.getKeyDisplay(keybindingConfig.Universal.PrevMatch), - gui.getKeyDisplay(keybindingConfig.Universal.Return), + keybindings.Label(keybindingConfig.Universal.NextMatch), + keybindings.Label(keybindingConfig.Universal.PrevMatch), + keybindings.Label(keybindingConfig.Universal.Return), ), ), ) @@ -93,7 +94,7 @@ func (gui *Gui) handleSearchEscape() error { return err } - if err := gui.returnFromContext(); err != nil { + if err := gui.c.PopContext(); err != nil { return err } diff --git a/pkg/gui/services/custom_commands/client.go b/pkg/gui/services/custom_commands/client.go new file mode 100644 index 000000000..aeaae084e --- /dev/null +++ b/pkg/gui/services/custom_commands/client.go @@ -0,0 +1,51 @@ +package custom_commands + +import ( + "github.com/jesseduffield/lazygit/pkg/commands" + "github.com/jesseduffield/lazygit/pkg/commands/oscommands" + "github.com/jesseduffield/lazygit/pkg/config" + "github.com/jesseduffield/lazygit/pkg/gui/context" + "github.com/jesseduffield/lazygit/pkg/gui/controllers/helpers" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +// Client is the entry point to this package. It returns a list of keybindings based on the config's user-defined custom commands. +// See https://github.com/jesseduffield/lazygit/blob/master/docs/Custom_Command_Keybindings.md for more info. +type Client struct { + customCommands []config.CustomCommand + handlerCreator *HandlerCreator + keybindingCreator *KeybindingCreator +} + +func NewClient( + c *types.HelperCommon, + os *oscommands.OSCommand, + git *commands.GitCommand, + contexts *context.ContextTree, + helpers *helpers.Helpers, +) *Client { + sessionStateLoader := NewSessionStateLoader(contexts, helpers) + handlerCreator := NewHandlerCreator(c, os, git, sessionStateLoader) + keybindingCreator := NewKeybindingCreator(contexts) + customCommands := c.UserConfig.CustomCommands + + return &Client{ + customCommands: customCommands, + keybindingCreator: keybindingCreator, + handlerCreator: handlerCreator, + } +} + +func (self *Client) GetCustomCommandKeybindings() ([]*types.Binding, error) { + bindings := []*types.Binding{} + for _, customCommand := range self.customCommands { + handler := self.handlerCreator.call(customCommand) + binding, err := self.keybindingCreator.call(customCommand, handler) + if err != nil { + return nil, err + } + bindings = append(bindings, binding) + } + + return bindings, nil +} diff --git a/pkg/gui/services/custom_commands/handler_creator.go b/pkg/gui/services/custom_commands/handler_creator.go new file mode 100644 index 000000000..6ac9fb733 --- /dev/null +++ b/pkg/gui/services/custom_commands/handler_creator.go @@ -0,0 +1,208 @@ +package custom_commands + +import ( + "strings" + + "github.com/jesseduffield/generics/slices" + "github.com/jesseduffield/lazygit/pkg/commands" + "github.com/jesseduffield/lazygit/pkg/commands/oscommands" + "github.com/jesseduffield/lazygit/pkg/config" + "github.com/jesseduffield/lazygit/pkg/gui/style" + "github.com/jesseduffield/lazygit/pkg/gui/types" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +// takes a custom command and returns a function that will be called when the corresponding user-defined keybinding is pressed +type HandlerCreator struct { + c *types.HelperCommon + os *oscommands.OSCommand + git *commands.GitCommand + sessionStateLoader *SessionStateLoader + resolver *Resolver + menuGenerator *MenuGenerator +} + +func NewHandlerCreator( + c *types.HelperCommon, + os *oscommands.OSCommand, + git *commands.GitCommand, + sessionStateLoader *SessionStateLoader, +) *HandlerCreator { + resolver := NewResolver(c.Common) + menuGenerator := NewMenuGenerator(c.Common) + + return &HandlerCreator{ + c: c, + os: os, + git: git, + sessionStateLoader: sessionStateLoader, + resolver: resolver, + menuGenerator: menuGenerator, + } +} + +func (self *HandlerCreator) call(customCommand config.CustomCommand) func() error { + return func() error { + sessionState := self.sessionStateLoader.call() + promptResponses := make([]string, len(customCommand.Prompts)) + + f := func() error { return self.finalHandler(customCommand, sessionState, promptResponses) } + + // if we have prompts we'll recursively wrap our confirm handlers with more prompts + // until we reach the actual command + for reverseIdx := range customCommand.Prompts { + // reassigning so that we don't end up with an infinite recursion + g := f + idx := len(customCommand.Prompts) - 1 - reverseIdx + + // going backwards so the outermost prompt is the first one + prompt := customCommand.Prompts[idx] + + wrappedF := func(response string) error { + promptResponses[idx] = response + return g() + } + + resolveTemplate := self.getResolveTemplateFn(promptResponses, sessionState) + resolvedPrompt, err := self.resolver.resolvePrompt(&prompt, resolveTemplate) + if err != nil { + return self.c.Error(err) + } + + switch prompt.Type { + case "input": + f = func() error { + return self.inputPrompt(resolvedPrompt, wrappedF) + } + case "menu": + f = func() error { + return self.menuPrompt(resolvedPrompt, wrappedF) + } + case "menuFromCommand": + f = func() error { + return self.menuPromptFromCommand(resolvedPrompt, wrappedF) + } + case "confirm": + f = func() error { + return self.confirmPrompt(resolvedPrompt, g) + } + default: + return self.c.ErrorMsg("custom command prompt must have a type of 'input', 'menu', 'menuFromCommand', or 'confirm'") + } + } + + return f() + } +} + +func (self *HandlerCreator) inputPrompt(prompt *config.CustomCommandPrompt, wrappedF func(string) error) error { + return self.c.Prompt(types.PromptOpts{ + Title: prompt.Title, + InitialContent: prompt.InitialValue, + HandleConfirm: func(str string) error { + return wrappedF(str) + }, + }) +} + +func (self *HandlerCreator) menuPrompt(prompt *config.CustomCommandPrompt, wrappedF func(string) error) error { + menuItems := slices.Map(prompt.Options, func(option config.CustomCommandMenuOption) *types.MenuItem { + return &types.MenuItem{ + LabelColumns: []string{option.Name, style.FgYellow.Sprint(option.Description)}, + OnPress: func() error { + return wrappedF(option.Value) + }, + } + }) + + return self.c.Menu(types.CreateMenuOptions{Title: prompt.Title, Items: menuItems}) +} + +func (self *HandlerCreator) confirmPrompt(prompt *config.CustomCommandPrompt, handleConfirm func() error) error { + return self.c.Confirm(types.ConfirmOpts{ + Title: prompt.Title, + Prompt: prompt.Body, + HandleConfirm: handleConfirm, + }) +} + +func (self *HandlerCreator) menuPromptFromCommand(prompt *config.CustomCommandPrompt, wrappedF func(string) error) error { + // Run and save output + message, err := self.git.Custom.RunWithOutput(prompt.Command) + if err != nil { + return self.c.Error(err) + } + + // Need to make a menu out of what the cmd has displayed + candidates, err := self.menuGenerator.call(message, prompt.Filter, prompt.ValueFormat, prompt.LabelFormat) + if err != nil { + return self.c.Error(err) + } + + menuItems := slices.Map(candidates, func(candidate *commandMenuEntry) *types.MenuItem { + return &types.MenuItem{ + LabelColumns: []string{candidate.label}, + OnPress: func() error { + return wrappedF(candidate.value) + }, + } + }) + + return self.c.Menu(types.CreateMenuOptions{Title: prompt.Title, Items: menuItems}) +} + +type CustomCommandObjects struct { + *SessionState + PromptResponses []string +} + +func (self *HandlerCreator) getResolveTemplateFn(promptResponses []string, sessionState *SessionState) func(string) (string, error) { + objects := CustomCommandObjects{ + SessionState: sessionState, + PromptResponses: promptResponses, + } + + return func(templateStr string) (string, error) { return utils.ResolveTemplate(templateStr, objects) } +} + +func (self *HandlerCreator) finalHandler(customCommand config.CustomCommand, sessionState *SessionState, promptResponses []string) error { + resolveTemplate := self.getResolveTemplateFn(promptResponses, sessionState) + cmdStr, err := resolveTemplate(customCommand.Command) + if err != nil { + return self.c.Error(err) + } + + cmdObj := self.os.Cmd.NewShell(cmdStr) + + if customCommand.Subprocess { + return self.c.RunSubprocessAndRefresh(cmdObj) + } + + loadingText := customCommand.LoadingText + if loadingText == "" { + loadingText = self.c.Tr.LcRunningCustomCommandStatus + } + + return self.c.WithWaitingStatus(loadingText, func() error { + self.c.LogAction(self.c.Tr.Actions.CustomCommand) + + if customCommand.Stream { + cmdObj.StreamOutput() + } + output, err := cmdObj.RunWithOutput() + if err != nil { + return self.c.Error(err) + } + + if customCommand.ShowOutput { + if strings.TrimSpace(output) == "" { + output = self.c.Tr.EmptyOutput + } + if err = self.c.Alert(cmdStr, output); err != nil { + return self.c.Error(err) + } + return self.c.Refresh(types.RefreshOptions{}) + } + return self.c.Refresh(types.RefreshOptions{}) + }) +} diff --git a/pkg/gui/services/custom_commands/keybinding_creator.go b/pkg/gui/services/custom_commands/keybinding_creator.go new file mode 100644 index 000000000..7251225fe --- /dev/null +++ b/pkg/gui/services/custom_commands/keybinding_creator.go @@ -0,0 +1,84 @@ +package custom_commands + +import ( + "fmt" + "strings" + + "github.com/jesseduffield/generics/slices" + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/config" + "github.com/jesseduffield/lazygit/pkg/gui/context" + "github.com/jesseduffield/lazygit/pkg/gui/keybindings" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +// KeybindingCreator takes a custom command along with its handler and returns a corresponding keybinding +type KeybindingCreator struct { + contexts *context.ContextTree +} + +func NewKeybindingCreator(contexts *context.ContextTree) *KeybindingCreator { + return &KeybindingCreator{ + contexts: contexts, + } +} + +func (self *KeybindingCreator) call(customCommand config.CustomCommand, handler func() error) (*types.Binding, error) { + if customCommand.Context == "" { + return nil, formatContextNotProvidedError(customCommand) + } + + viewName, err := self.getViewNameAndContexts(customCommand) + if err != nil { + return nil, err + } + + description := customCommand.Description + if description == "" { + description = customCommand.Command + } + + return &types.Binding{ + ViewName: viewName, + Key: keybindings.GetKey(customCommand.Key), + Modifier: gocui.ModNone, + Handler: handler, + Description: description, + }, nil +} + +func (self *KeybindingCreator) getViewNameAndContexts(customCommand config.CustomCommand) (string, error) { + if customCommand.Context == "global" { + return "", nil + } + + ctx, ok := self.contextForContextKey(types.ContextKey(customCommand.Context)) + if !ok { + return "", formatUnknownContextError(customCommand) + } + + viewName := ctx.GetViewName() + return viewName, nil +} + +func (self *KeybindingCreator) contextForContextKey(contextKey types.ContextKey) (types.Context, bool) { + for _, context := range self.contexts.Flatten() { + if context.GetKey() == contextKey { + return context, true + } + } + + return nil, false +} + +func formatUnknownContextError(customCommand config.CustomCommand) error { + allContextKeyStrings := slices.Map(context.AllContextKeys, func(key types.ContextKey) string { + return string(key) + }) + + return fmt.Errorf("Error when setting custom command keybindings: unknown context: %s. Key: %s, Command: %s.\nPermitted contexts: %s", customCommand.Context, customCommand.Key, customCommand.Command, strings.Join(allContextKeyStrings, ", ")) +} + +func formatContextNotProvidedError(customCommand config.CustomCommand) error { + return fmt.Errorf("Error parsing custom command keybindings: context not provided (use context: 'global' for the global context). Key: %s, Command: %s", customCommand.Key, customCommand.Command) +} diff --git a/pkg/gui/services/custom_commands/menu_generator.go b/pkg/gui/services/custom_commands/menu_generator.go new file mode 100644 index 000000000..5bec1db91 --- /dev/null +++ b/pkg/gui/services/custom_commands/menu_generator.go @@ -0,0 +1,138 @@ +package custom_commands + +import ( + "bytes" + "errors" + "regexp" + "strconv" + "strings" + "text/template" + + "github.com/jesseduffield/lazygit/pkg/common" + "github.com/jesseduffield/lazygit/pkg/gui/style" +) + +type MenuGenerator struct { + c *common.Common +} + +// takes the output of a command and returns a list of menu entries based on a filter +// and value/label format templates provided by the user +func NewMenuGenerator(c *common.Common) *MenuGenerator { + return &MenuGenerator{c: c} +} + +type commandMenuEntry struct { + label string + value string +} + +func (self *MenuGenerator) call(commandOutput, filter, valueFormat, labelFormat string) ([]*commandMenuEntry, error) { + regex, err := regexp.Compile(filter) + if err != nil { + return nil, errors.New("unable to parse filter regex, error: " + err.Error()) + } + + valueTemplateAux, err := template.New("format").Parse(valueFormat) + if err != nil { + return nil, errors.New("unable to parse value format, error: " + err.Error()) + } + valueTemplate := NewTrimmerTemplate(valueTemplateAux) + + var labelTemplate *TrimmerTemplate + if labelFormat != "" { + colorFuncMap := style.TemplateFuncMapAddColors(template.FuncMap{}) + labelTemplateAux, err := template.New("format").Funcs(colorFuncMap).Parse(labelFormat) + if err != nil { + return nil, errors.New("unable to parse label format, error: " + err.Error()) + } + labelTemplate = NewTrimmerTemplate(labelTemplateAux) + } else { + labelTemplate = valueTemplate + } + + candidates := []*commandMenuEntry{} + for _, line := range strings.Split(commandOutput, "\n") { + if line == "" { + continue + } + + candidate, err := self.generateMenuCandidate( + line, + regex, + valueTemplate, + labelTemplate, + ) + if err != nil { + return nil, err + } + + candidates = append(candidates, candidate) + } + + return candidates, err +} + +func (self *MenuGenerator) generateMenuCandidate( + line string, + regex *regexp.Regexp, + valueTemplate *TrimmerTemplate, + labelTemplate *TrimmerTemplate, +) (*commandMenuEntry, error) { + tmplData := self.parseLine(line, regex) + + entry := &commandMenuEntry{} + + var err error + entry.value, err = valueTemplate.execute(tmplData) + if err != nil { + return nil, err + } + + entry.label, err = labelTemplate.execute(tmplData) + if err != nil { + return nil, err + } + + return entry, nil +} + +func (self *MenuGenerator) parseLine(line string, regex *regexp.Regexp) map[string]string { + tmplData := map[string]string{} + out := regex.FindAllStringSubmatch(line, -1) + if len(out) > 0 { + for groupIdx, group := range regex.SubexpNames() { + // Record matched group with group ids + matchName := "group_" + strconv.Itoa(groupIdx) + tmplData[matchName] = out[0][groupIdx] + // Record last named group non-empty matches as group matches + if group != "" { + tmplData[group] = out[0][groupIdx] + } + } + } + + return tmplData +} + +// wrapper around a template which trims the output +type TrimmerTemplate struct { + template *template.Template + buffer *bytes.Buffer +} + +func NewTrimmerTemplate(template *template.Template) *TrimmerTemplate { + return &TrimmerTemplate{ + template: template, + buffer: bytes.NewBuffer(nil), + } +} + +func (self *TrimmerTemplate) execute(tmplData map[string]string) (string, error) { + self.buffer.Reset() + err := self.template.Execute(self.buffer, tmplData) + if err != nil { + return "", err + } + return strings.TrimSpace(self.buffer.String()), nil +} diff --git a/pkg/gui/services/custom_commands/menu_generator_test.go b/pkg/gui/services/custom_commands/menu_generator_test.go new file mode 100644 index 000000000..7dd3e58e8 --- /dev/null +++ b/pkg/gui/services/custom_commands/menu_generator_test.go @@ -0,0 +1,65 @@ +package custom_commands + +import ( + "testing" + + "github.com/jesseduffield/lazygit/pkg/utils" + "github.com/stretchr/testify/assert" +) + +func TestMenuGenerator(t *testing.T) { + type scenario struct { + testName string + cmdOut string + filter string + valueFormat string + labelFormat string + test func([]*commandMenuEntry, error) + } + + scenarios := []scenario{ + { + "Extract remote branch name", + "upstream/pr-1", + "(?P[a-z_]+)/(?P.*)", + "{{ .branch }}", + "Remote: {{ .remote }}", + func(actualEntry []*commandMenuEntry, err error) { + assert.NoError(t, err) + assert.EqualValues(t, "pr-1", actualEntry[0].value) + assert.EqualValues(t, "Remote: upstream", actualEntry[0].label) + }, + }, + { + "Multiple named groups with empty labelFormat", + "upstream/pr-1", + "(?P[a-z]*)/(?P.*)", + "{{ .branch }}|{{ .remote }}", + "", + func(actualEntry []*commandMenuEntry, err error) { + assert.NoError(t, err) + assert.EqualValues(t, "pr-1|upstream", actualEntry[0].value) + assert.EqualValues(t, "pr-1|upstream", actualEntry[0].label) + }, + }, + { + "Multiple named groups with group ids", + "upstream/pr-1", + "(?P[a-z]*)/(?P.*)", + "{{ .group_2 }}|{{ .group_1 }}", + "Remote: {{ .group_1 }}", + func(actualEntry []*commandMenuEntry, err error) { + assert.NoError(t, err) + assert.EqualValues(t, "pr-1|upstream", actualEntry[0].value) + assert.EqualValues(t, "Remote: upstream", actualEntry[0].label) + }, + }, + } + + for _, s := range scenarios { + s := s + t.Run(s.testName, func(t *testing.T) { + s.test(NewMenuGenerator(utils.NewDummyCommon()).call(s.cmdOut, s.filter, s.valueFormat, s.labelFormat)) + }) + } +} diff --git a/pkg/gui/services/custom_commands/resolver.go b/pkg/gui/services/custom_commands/resolver.go new file mode 100644 index 000000000..4702d36c4 --- /dev/null +++ b/pkg/gui/services/custom_commands/resolver.go @@ -0,0 +1,126 @@ +package custom_commands + +import ( + "bytes" + "text/template" + + "github.com/jesseduffield/lazygit/pkg/common" + "github.com/jesseduffield/lazygit/pkg/config" +) + +// takes a prompt that is defined in terms of template strings and resolves the templates to contain actual values +type Resolver struct { + c *common.Common +} + +func NewResolver(c *common.Common) *Resolver { + return &Resolver{c: c} +} + +func (self *Resolver) resolvePrompt( + prompt *config.CustomCommandPrompt, + resolveTemplate func(string) (string, error), +) (*config.CustomCommandPrompt, error) { + var err error + result := &config.CustomCommandPrompt{ + ValueFormat: prompt.ValueFormat, + LabelFormat: prompt.LabelFormat, + } + + result.Title, err = resolveTemplate(prompt.Title) + if err != nil { + return nil, err + } + + result.InitialValue, err = resolveTemplate(prompt.InitialValue) + if err != nil { + return nil, err + } + + result.Body, err = resolveTemplate(prompt.Body) + if err != nil { + return nil, err + } + + result.Command, err = resolveTemplate(prompt.Command) + if err != nil { + return nil, err + } + + result.Filter, err = resolveTemplate(prompt.Filter) + if err != nil { + return nil, err + } + + if prompt.Type == "menu" { + result.Options, err = self.resolveMenuOptions(prompt, resolveTemplate) + if err != nil { + return nil, err + } + } + + return result, nil +} + +func (self *Resolver) resolveMenuOptions(prompt *config.CustomCommandPrompt, resolveTemplate func(string) (string, error)) ([]config.CustomCommandMenuOption, error) { + newOptions := make([]config.CustomCommandMenuOption, 0, len(prompt.Options)) + for _, option := range prompt.Options { + option := option + newOption, err := self.resolveMenuOption(&option, resolveTemplate) + if err != nil { + return nil, err + } + newOptions = append(newOptions, *newOption) + } + + return newOptions, nil +} + +func (self *Resolver) resolveMenuOption(option *config.CustomCommandMenuOption, resolveTemplate func(string) (string, error)) (*config.CustomCommandMenuOption, error) { + nameTemplate := option.Name + if nameTemplate == "" { + // this allows you to only pass values rather than bother with names/descriptions + nameTemplate = option.Value + } + + name, err := resolveTemplate(nameTemplate) + if err != nil { + return nil, err + } + + description, err := resolveTemplate(option.Description) + if err != nil { + return nil, err + } + + value, err := resolveTemplate(option.Value) + if err != nil { + return nil, err + } + + return &config.CustomCommandMenuOption{ + Name: name, + Description: description, + Value: value, + }, nil +} + +type CustomCommandObject struct { + // deprecated. Use Responses instead + PromptResponses []string + Form map[string]string +} + +func ResolveTemplate(templateStr string, object interface{}) (string, error) { + tmpl, err := template.New("template").Parse(templateStr) + if err != nil { + return "", err + } + + var buf bytes.Buffer + if err := tmpl.Execute(&buf, object); err != nil { + return "", err + } + + return buf.String(), nil +} diff --git a/pkg/gui/services/custom_commands/session_state_loader.go b/pkg/gui/services/custom_commands/session_state_loader.go new file mode 100644 index 000000000..42f3403ec --- /dev/null +++ b/pkg/gui/services/custom_commands/session_state_loader.go @@ -0,0 +1,56 @@ +package custom_commands + +import ( + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/context" + "github.com/jesseduffield/lazygit/pkg/gui/controllers/helpers" +) + +// loads the session state at the time that a custom command is invoked, for use +// in the custom command's template strings +type SessionStateLoader struct { + contexts *context.ContextTree + helpers *helpers.Helpers +} + +func NewSessionStateLoader(contexts *context.ContextTree, helpers *helpers.Helpers) *SessionStateLoader { + return &SessionStateLoader{ + contexts: contexts, + helpers: helpers, + } +} + +// SessionState captures the current state of the application for use in custom commands +type SessionState struct { + SelectedLocalCommit *models.Commit + SelectedReflogCommit *models.Commit + SelectedSubCommit *models.Commit + SelectedFile *models.File + SelectedPath string + SelectedLocalBranch *models.Branch + SelectedRemoteBranch *models.RemoteBranch + SelectedRemote *models.Remote + SelectedTag *models.Tag + SelectedStashEntry *models.StashEntry + SelectedCommitFile *models.CommitFile + SelectedCommitFilePath string + CheckedOutBranch *models.Branch +} + +func (self *SessionStateLoader) call() *SessionState { + return &SessionState{ + SelectedFile: self.contexts.Files.GetSelectedFile(), + SelectedPath: self.contexts.Files.GetSelectedPath(), + SelectedLocalCommit: self.contexts.LocalCommits.GetSelected(), + SelectedReflogCommit: self.contexts.ReflogCommits.GetSelected(), + SelectedLocalBranch: self.contexts.Branches.GetSelected(), + SelectedRemoteBranch: self.contexts.RemoteBranches.GetSelected(), + SelectedRemote: self.contexts.Remotes.GetSelected(), + SelectedTag: self.contexts.Tags.GetSelected(), + SelectedStashEntry: self.contexts.Stash.GetSelected(), + SelectedCommitFile: self.contexts.CommitFiles.GetSelectedFile(), + SelectedCommitFilePath: self.contexts.CommitFiles.GetSelectedPath(), + SelectedSubCommit: self.contexts.SubCommits.GetSelected(), + CheckedOutBranch: self.helpers.Refs.GetCheckedOutRef(), + } +} diff --git a/pkg/gui/side_window.go b/pkg/gui/side_window.go index 2aad00c37..b57998d00 100644 --- a/pkg/gui/side_window.go +++ b/pkg/gui/side_window.go @@ -21,9 +21,9 @@ func (gui *Gui) nextSideWindow() error { return err } - viewName := gui.getViewNameForWindow(newWindow) + context := gui.getContextForWindow(newWindow) - return gui.pushContextWithView(viewName) + return gui.c.PushContext(context) } func (gui *Gui) previousSideWindow() error { @@ -47,13 +47,15 @@ func (gui *Gui) previousSideWindow() error { return err } - viewName := gui.getViewNameForWindow(newWindow) + context := gui.getContextForWindow(newWindow) - return gui.pushContextWithView(viewName) + return gui.c.PushContext(context) } -func (gui *Gui) goToSideWindow(sideViewName string) func() error { +func (gui *Gui) goToSideWindow(window string) func() error { return func() error { - return gui.pushContextWithView(sideViewName) + context := gui.getContextForWindow(window) + + return gui.c.PushContext(context) } } diff --git a/pkg/gui/staging_panel.go b/pkg/gui/staging_panel.go deleted file mode 100644 index ecb208dcc..000000000 --- a/pkg/gui/staging_panel.go +++ /dev/null @@ -1,166 +0,0 @@ -package gui - -import ( - "strings" - - "github.com/jesseduffield/lazygit/pkg/commands/patch" -) - -func (gui *Gui) refreshStagingPanel(forceSecondaryFocused bool, selectedLineIdx int) error { - gui.splitMainPanel(true) - - file := gui.getSelectedFile() - if file == nil || (!file.HasUnstagedChanges && !file.HasStagedChanges) { - return gui.handleStagingEscape() - } - - secondaryFocused := false - if forceSecondaryFocused { - secondaryFocused = true - } else if gui.State.Panels.LineByLine != nil { - secondaryFocused = gui.State.Panels.LineByLine.SecondaryFocused - } - - if (secondaryFocused && !file.HasStagedChanges) || (!secondaryFocused && !file.HasUnstagedChanges) { - secondaryFocused = !secondaryFocused - } - - if secondaryFocused { - gui.Views.Main.Title = gui.Tr.StagedChanges - gui.Views.Secondary.Title = gui.Tr.UnstagedChanges - } else { - gui.Views.Main.Title = gui.Tr.UnstagedChanges - gui.Views.Secondary.Title = gui.Tr.StagedChanges - } - - // note for custom diffs, we'll need to send a flag here saying not to use the custom diff - diff := gui.Git.WorkingTree.WorktreeFileDiff(file, true, secondaryFocused, false) - secondaryDiff := gui.Git.WorkingTree.WorktreeFileDiff(file, true, !secondaryFocused, false) - - // if we have e.g. a deleted file with nothing else to the diff will have only - // 4-5 lines in which case we'll swap panels - if len(strings.Split(diff, "\n")) < 5 { - if len(strings.Split(secondaryDiff, "\n")) < 5 { - return gui.handleStagingEscape() - } - secondaryFocused = !secondaryFocused - diff, secondaryDiff = secondaryDiff, diff - } - - empty, err := gui.refreshLineByLinePanel(diff, secondaryDiff, secondaryFocused, selectedLineIdx) - if err != nil { - return err - } - - if empty { - return gui.handleStagingEscape() - } - - return nil -} - -func (gui *Gui) handleTogglePanelClick() error { - return gui.withLBLActiveCheck(func(state *LblPanelState) error { - state.SecondaryFocused = !state.SecondaryFocused - - return gui.refreshStagingPanel(false, gui.Views.Secondary.SelectedLineIdx()) - }) -} - -func (gui *Gui) handleRefreshStagingPanel(forceSecondaryFocused bool, selectedLineIdx int) error { - gui.Mutexes.LineByLinePanelMutex.Lock() - defer gui.Mutexes.LineByLinePanelMutex.Unlock() - - return gui.refreshStagingPanel(forceSecondaryFocused, selectedLineIdx) -} - -func (gui *Gui) onStagingFocus(forceSecondaryFocused bool, selectedLineIdx int) error { - gui.Mutexes.LineByLinePanelMutex.Lock() - defer gui.Mutexes.LineByLinePanelMutex.Unlock() - - if gui.State.Panels.LineByLine == nil || selectedLineIdx != -1 { - return gui.refreshStagingPanel(forceSecondaryFocused, selectedLineIdx) - } - - return nil -} - -func (gui *Gui) handleTogglePanel() error { - return gui.withLBLActiveCheck(func(state *LblPanelState) error { - state.SecondaryFocused = !state.SecondaryFocused - return gui.refreshStagingPanel(false, -1) - }) -} - -func (gui *Gui) handleStagingEscape() error { - gui.escapeLineByLinePanel() - - return gui.pushContext(gui.State.Contexts.Files) -} - -func (gui *Gui) handleToggleStagedSelection() error { - return gui.withLBLActiveCheck(func(state *LblPanelState) error { - return gui.applySelection(state.SecondaryFocused, state) - }) -} - -func (gui *Gui) handleResetSelection() error { - return gui.withLBLActiveCheck(func(state *LblPanelState) error { - if state.SecondaryFocused { - // for backwards compatibility - return gui.applySelection(true, state) - } - - if !gui.UserConfig.Gui.SkipUnstageLineWarning { - return gui.ask(askOpts{ - title: gui.Tr.UnstageLinesTitle, - prompt: gui.Tr.UnstageLinesPrompt, - handleConfirm: func() error { - return gui.withLBLActiveCheck(func(state *LblPanelState) error { - return gui.applySelection(true, state) - }) - }, - }) - } else { - return gui.applySelection(true, state) - } - }) -} - -func (gui *Gui) applySelection(reverse bool, state *LblPanelState) error { - file := gui.getSelectedFile() - if file == nil { - return nil - } - - firstLineIdx, lastLineIdx := state.SelectedRange() - patch := patch.ModifiedPatchForRange(gui.Log, file.Name, state.GetDiff(), firstLineIdx, lastLineIdx, reverse, false) - - if patch == "" { - return nil - } - - // apply the patch then refresh this panel - // create a new temp file with the patch, then call git apply with that patch - applyFlags := []string{} - if !reverse || state.SecondaryFocused { - applyFlags = append(applyFlags, "cached") - } - gui.logAction(gui.Tr.Actions.ApplyPatch) - err := gui.Git.WorkingTree.ApplyPatch(patch, applyFlags...) - if err != nil { - return gui.surfaceError(err) - } - - if state.SelectingRange() { - state.SetLineSelectMode() - } - - if err := gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{FILES}}); err != nil { - return err - } - if err := gui.refreshStagingPanel(false, -1); err != nil { - return err - } - return nil -} diff --git a/pkg/gui/stash_panel.go b/pkg/gui/stash_panel.go index 2b9bae445..439d8205e 100644 --- a/pkg/gui/stash_panel.go +++ b/pkg/gui/stash_panel.go @@ -1,156 +1,21 @@ package gui -import ( - "github.com/jesseduffield/lazygit/pkg/commands/models" -) - -// list panel functions - -func (gui *Gui) getSelectedStashEntry() *models.StashEntry { - selectedLine := gui.State.Panels.Stash.SelectedLineIdx - if selectedLine == -1 { - return nil - } - - return gui.State.StashEntries[selectedLine] -} +import "github.com/jesseduffield/lazygit/pkg/gui/types" func (gui *Gui) stashRenderToMain() error { - var task updateTask - stashEntry := gui.getSelectedStashEntry() + var task types.UpdateTask + stashEntry := gui.State.Contexts.Stash.GetSelected() if stashEntry == nil { - task = NewRenderStringTask(gui.Tr.NoStashEntries) + task = types.NewRenderStringTask(gui.c.Tr.NoStashEntries) } else { - task = NewRunPtyTask(gui.Git.Stash.ShowStashEntryCmdObj(stashEntry.Index).GetCmd()) + task = types.NewRunPtyTask(gui.git.Stash.ShowStashEntryCmdObj(stashEntry.Index).GetCmd()) } - return gui.refreshMainViews(refreshMainOpts{ - main: &viewUpdateOpts{ - title: "Stash", - task: task, + return gui.c.RenderToMainViews(types.RefreshMainOpts{ + Pair: gui.c.MainViewPairs().Normal, + Main: &types.ViewUpdateOpts{ + Title: "Stash", + Task: task, }, }) } - -func (gui *Gui) refreshStashEntries() error { - gui.State.StashEntries = gui.Git.Loaders.Stash. - GetStashEntries(gui.State.Modes.Filtering.GetPath()) - - return gui.postRefreshUpdate(gui.State.Contexts.Stash) -} - -// specific functions - -func (gui *Gui) handleStashApply() error { - stashEntry := gui.getSelectedStashEntry() - if stashEntry == nil { - return nil - } - - skipStashWarning := gui.UserConfig.Gui.SkipStashWarning - - apply := func() error { - gui.logAction(gui.Tr.Actions.Stash) - err := gui.Git.Stash.Apply(stashEntry.Index) - _ = gui.postStashRefresh() - if err != nil { - return gui.surfaceError(err) - } - return nil - } - - if skipStashWarning { - return apply() - } - - return gui.ask(askOpts{ - title: gui.Tr.StashApply, - prompt: gui.Tr.SureApplyStashEntry, - handleConfirm: func() error { - return apply() - }, - }) -} - -func (gui *Gui) handleStashPop() error { - stashEntry := gui.getSelectedStashEntry() - if stashEntry == nil { - return nil - } - - skipStashWarning := gui.UserConfig.Gui.SkipStashWarning - - pop := func() error { - gui.logAction(gui.Tr.Actions.Stash) - err := gui.Git.Stash.Pop(stashEntry.Index) - _ = gui.postStashRefresh() - if err != nil { - return gui.surfaceError(err) - } - return nil - } - - if skipStashWarning { - return pop() - } - - return gui.ask(askOpts{ - title: gui.Tr.StashPop, - prompt: gui.Tr.SurePopStashEntry, - handleConfirm: func() error { - return pop() - }, - }) -} - -func (gui *Gui) handleStashDrop() error { - stashEntry := gui.getSelectedStashEntry() - if stashEntry == nil { - return nil - } - - return gui.ask(askOpts{ - title: gui.Tr.StashDrop, - prompt: gui.Tr.SureDropStashEntry, - handleConfirm: func() error { - gui.logAction(gui.Tr.Actions.Stash) - err := gui.Git.Stash.Drop(stashEntry.Index) - _ = gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{STASH}}) - if err != nil { - return gui.surfaceError(err) - } - return nil - }, - }) -} - -func (gui *Gui) postStashRefresh() error { - return gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{STASH, FILES}}) -} - -func (gui *Gui) handleStashSave(stashFunc func(message string) error) error { - if len(gui.trackedFiles()) == 0 && len(gui.stagedFiles()) == 0 { - return gui.createErrorPanel(gui.Tr.NoTrackedStagedFilesStash) - } - - return gui.prompt(promptOpts{ - title: gui.Tr.StashChanges, - handleConfirm: func(stashComment string) error { - err := stashFunc(stashComment) - _ = gui.postStashRefresh() - if err != nil { - return gui.surfaceError(err) - } - return nil - }, - }) -} - -func (gui *Gui) handleViewStashFiles() error { - stashEntry := gui.getSelectedStashEntry() - if stashEntry == nil { - return nil - } - - return gui.switchToCommitFilesContext(stashEntry.RefName(), false, gui.State.Contexts.Stash, "stash") -} diff --git a/pkg/gui/status_panel.go b/pkg/gui/status_panel.go index 444c32da1..75f69b736 100644 --- a/pkg/gui/status_panel.go +++ b/pkg/gui/status_panel.go @@ -5,41 +5,15 @@ import ( "fmt" "strings" + "github.com/jesseduffield/generics/slices" "github.com/jesseduffield/lazygit/pkg/commands/types/enums" "github.com/jesseduffield/lazygit/pkg/constants" "github.com/jesseduffield/lazygit/pkg/gui/presentation" "github.com/jesseduffield/lazygit/pkg/gui/style" + "github.com/jesseduffield/lazygit/pkg/gui/types" "github.com/jesseduffield/lazygit/pkg/utils" ) -// never call this on its own, it should only be called from within refreshCommits() -func (gui *Gui) refreshStatus() { - gui.Mutexes.RefreshingStatusMutex.Lock() - defer gui.Mutexes.RefreshingStatusMutex.Unlock() - - currentBranch := gui.currentBranch() - if currentBranch == nil { - // need to wait for branches to refresh - return - } - status := "" - - if currentBranch.IsRealBranch() { - status += presentation.ColoredBranchStatus(currentBranch) + " " - } - - workingTreeState := gui.Git.Status.WorkingTreeState() - if workingTreeState != enums.REBASE_MODE_NONE { - status += style.FgYellow.Sprintf("(%s) ", formatWorkingTreeState(workingTreeState)) - } - - name := presentation.GetBranchTextStyle(currentBranch.Name).Sprint(currentBranch.Name) - repoName := utils.GetCurrentRepoName() - status += fmt.Sprintf("%s → %s ", repoName, name) - - gui.setViewContent(gui.Views.Status, status) -} - func runeCount(str string) int { return len([]rune(str)) } @@ -49,35 +23,33 @@ func cursorInSubstring(cx int, prefix string, substring string) bool { } func (gui *Gui) handleCheckForUpdate() error { - gui.Updater.CheckForNewUpdate(gui.onUserUpdateCheckFinish, true) - return gui.createLoaderPanel(gui.Tr.CheckingForUpdates) + return gui.c.WithWaitingStatus(gui.c.Tr.CheckingForUpdates, func() error { + gui.Updater.CheckForNewUpdate(gui.onUserUpdateCheckFinish, true) + return nil + }) } func (gui *Gui) handleStatusClick() error { // TODO: move into some abstraction (status is currently not a listViewContext where a lot of this code lives) - if gui.popupPanelFocused() { - return nil - } - - currentBranch := gui.currentBranch() + currentBranch := gui.helpers.Refs.GetCheckedOutRef() if currentBranch == nil { // need to wait for branches to refresh return nil } - if err := gui.pushContext(gui.State.Contexts.Status); err != nil { + if err := gui.c.PushContext(gui.State.Contexts.Status); err != nil { return err } cx, _ := gui.Views.Status.Cursor() - upstreamStatus := presentation.BranchStatus(currentBranch) + upstreamStatus := presentation.BranchStatus(currentBranch, gui.Tr) repoName := utils.GetCurrentRepoName() - workingTreeState := gui.Git.Status.WorkingTreeState() + workingTreeState := gui.git.Status.WorkingTreeState() switch workingTreeState { case enums.REBASE_MODE_REBASING, enums.REBASE_MODE_MERGING: workingTreeStatus := fmt.Sprintf("(%s)", formatWorkingTreeState(workingTreeState)) if cursorInSubstring(cx, upstreamStatus+" ", workingTreeStatus) { - return gui.handleCreateRebaseOptionsMenu() + return gui.helpers.MergeAndRebase.CreateRebaseOptionsMenu() } if cursorInSubstring(cx, upstreamStatus+" "+workingTreeStatus+" ", repoName) { return gui.handleCreateRecentReposMenu() @@ -103,11 +75,6 @@ func formatWorkingTreeState(rebaseMode enums.RebaseMode) string { } func (gui *Gui) statusRenderToMain() error { - // TODO: move into some abstraction (status is currently not a listViewContext where a lot of this code lives) - if gui.popupPanelFocused() { - return nil - } - dashboardString := strings.Join( []string{ lazygitTitle(), @@ -120,10 +87,11 @@ func (gui *Gui) statusRenderToMain() error { style.FgMagenta.Sprintf("Become a sponsor: %s", constants.Links.Donate), // caffeine ain't free }, "\n\n") - return gui.refreshMainViews(refreshMainOpts{ - main: &viewUpdateOpts{ - title: "", - task: NewRenderStringTask(dashboardString), + return gui.c.RenderToMainViews(types.RefreshMainOpts{ + Pair: gui.c.MainViewPairs().Normal, + Main: &types.ViewUpdateOpts{ + Title: gui.c.Tr.StatusTitle, + Task: types.NewRenderStringTask(dashboardString), }, }) } @@ -132,30 +100,32 @@ func (gui *Gui) askForConfigFile(action func(file string) error) error { confPaths := gui.Config.GetUserConfigPaths() switch len(confPaths) { case 0: - return errors.New(gui.Tr.NoConfigFileFoundErr) + return errors.New(gui.c.Tr.NoConfigFileFoundErr) case 1: return action(confPaths[0]) default: - menuItems := make([]*menuItem, len(confPaths)) - for i, file := range confPaths { - i := i - menuItems[i] = &menuItem{ - displayString: file, - onPress: func() error { - return action(confPaths[i]) + menuItems := slices.Map(confPaths, func(path string) *types.MenuItem { + return &types.MenuItem{ + Label: path, + OnPress: func() error { + return action(path) }, } - } - return gui.createMenu(gui.Tr.SelectConfigFile, menuItems, createMenuOptions{}) + }) + + return gui.c.Menu(types.CreateMenuOptions{ + Title: gui.c.Tr.SelectConfigFile, + Items: menuItems, + }) } } func (gui *Gui) handleOpenConfig() error { - return gui.askForConfigFile(gui.openFile) + return gui.askForConfigFile(gui.helpers.Files.OpenFile) } func (gui *Gui) handleEditConfig() error { - return gui.askForConfigFile(gui.editFile) + return gui.askForConfigFile(gui.helpers.Files.EditFile) } func lazygitTitle() string { diff --git a/pkg/gui/style/style_test.go b/pkg/gui/style/style_test.go index 360ad00e6..c8157efd6 100644 --- a/pkg/gui/style/style_test.go +++ b/pkg/gui/style/style_test.go @@ -135,7 +135,7 @@ func TestMerge(t *testing.T) { "\x1b[38;2;255;0;255;48;2;255;255;0;1;4mfoo\x1b[0m", }, { - "mix color-16 with rgb colors", + "mix color-16 (background) with rgb (foreground)", []TextStyle{New().SetFg(rgbYellow), BgRed}, TextStyle{ fg: &rgbYellow, @@ -147,6 +147,19 @@ func TestMerge(t *testing.T) { }, "\x1b[38;2;255;255;0;48;2;197;30;20mfoo\x1b[0m", }, + { + "mix color-16 (foreground) with rgb (background)", + []TextStyle{FgRed, New().SetBg(rgbYellow)}, + TextStyle{ + fg: &Color{basic: &fgRed}, + bg: &rgbYellow, + Style: color.NewRGBStyle( + fgRed.RGB(), + rgbYellowLib, + ).SetOpts(color.Opts{}), + }, + "\x1b[38;2;197;30;20;48;2;255;255;0mfoo\x1b[0m", + }, } for _, s := range scenarios { diff --git a/pkg/gui/sub_commits_panel.go b/pkg/gui/sub_commits_panel.go index d023d261f..ae3f4e905 100644 --- a/pkg/gui/sub_commits_panel.go +++ b/pkg/gui/sub_commits_panel.go @@ -1,106 +1,25 @@ package gui -import ( - "github.com/jesseduffield/lazygit/pkg/commands/loaders" - "github.com/jesseduffield/lazygit/pkg/commands/models" -) +import "github.com/jesseduffield/lazygit/pkg/gui/types" // list panel functions -func (gui *Gui) getSelectedSubCommit() *models.Commit { - selectedLine := gui.State.Panels.SubCommits.SelectedLineIdx - commits := gui.State.SubCommits - if selectedLine == -1 || len(commits) == 0 { - return nil - } - - return commits[selectedLine] -} - func (gui *Gui) subCommitsRenderToMain() error { - commit := gui.getSelectedSubCommit() - var task updateTask + commit := gui.State.Contexts.SubCommits.GetSelected() + var task types.UpdateTask if commit == nil { - task = NewRenderStringTask("No commits") + task = types.NewRenderStringTask("No commits") } else { - cmdObj := gui.Git.Commit.ShowCmdObj(commit.Sha, gui.State.Modes.Filtering.GetPath()) + cmdObj := gui.git.Commit.ShowCmdObj(commit.Sha, gui.State.Modes.Filtering.GetPath()) - task = NewRunPtyTask(cmdObj.GetCmd()) + task = types.NewRunPtyTask(cmdObj.GetCmd()) } - return gui.refreshMainViews(refreshMainOpts{ - main: &viewUpdateOpts{ - title: "Commit", - task: task, + return gui.c.RenderToMainViews(types.RefreshMainOpts{ + Pair: gui.c.MainViewPairs().Normal, + Main: &types.ViewUpdateOpts{ + Title: "Commit", + Task: task, }, }) } - -func (gui *Gui) handleCheckoutSubCommit() error { - commit := gui.getSelectedSubCommit() - if commit == nil { - return nil - } - - err := gui.ask(askOpts{ - title: gui.Tr.LcCheckoutCommit, - prompt: gui.Tr.SureCheckoutThisCommit, - handleConfirm: func() error { - gui.logAction(gui.Tr.Actions.CheckoutCommit) - return gui.handleCheckoutRef(commit.Sha, handleCheckoutRefOptions{}) - }, - }) - if err != nil { - return err - } - - gui.State.Panels.SubCommits.SelectedLineIdx = 0 - - return nil -} - -func (gui *Gui) handleCreateSubCommitResetMenu() error { - commit := gui.getSelectedSubCommit() - - return gui.createResetMenu(commit.Sha) -} - -func (gui *Gui) handleViewSubCommitFiles() error { - commit := gui.getSelectedSubCommit() - if commit == nil { - return nil - } - - return gui.switchToCommitFilesContext(commit.Sha, false, gui.State.Contexts.SubCommits, "branches") -} - -func (gui *Gui) switchToSubCommitsContext(refName string) error { - // need to populate my sub commits - commits, err := gui.Git.Loaders.Commits.GetCommits( - loaders.GetCommitsOptions{ - Limit: gui.State.Panels.Commits.LimitCommits, - FilterPath: gui.State.Modes.Filtering.GetPath(), - IncludeRebaseCommits: false, - RefName: refName, - }, - ) - if err != nil { - return err - } - - gui.State.SubCommits = commits - gui.State.Panels.SubCommits.refName = refName - gui.State.Panels.SubCommits.SelectedLineIdx = 0 - gui.State.Contexts.SubCommits.SetParentContext(gui.currentSideListContext()) - - return gui.pushContext(gui.State.Contexts.SubCommits) -} - -func (gui *Gui) handleSwitchToSubCommits() error { - currentContext := gui.currentSideListContext() - if currentContext == nil { - return nil - } - - return gui.switchToSubCommitsContext(currentContext.GetSelectedItemId()) -} diff --git a/pkg/gui/submodules_panel.go b/pkg/gui/submodules_panel.go index be0574356..163234153 100644 --- a/pkg/gui/submodules_panel.go +++ b/pkg/gui/submodules_panel.go @@ -3,27 +3,17 @@ package gui import ( "fmt" "os" - "path/filepath" - "strings" "github.com/jesseduffield/lazygit/pkg/commands/models" "github.com/jesseduffield/lazygit/pkg/gui/style" + "github.com/jesseduffield/lazygit/pkg/gui/types" ) -func (gui *Gui) getSelectedSubmodule() *models.SubmoduleConfig { - selectedLine := gui.State.Panels.Submodules.SelectedLineIdx - if selectedLine == -1 || len(gui.State.Submodules) == 0 { - return nil - } - - return gui.State.Submodules[selectedLine] -} - func (gui *Gui) submodulesRenderToMain() error { - var task updateTask - submodule := gui.getSelectedSubmodule() + var task types.UpdateTask + submodule := gui.State.Contexts.Submodules.GetSelected() if submodule == nil { - task = NewRenderStringTask("No submodules") + task = types.NewRenderStringTask("No submodules") } else { prefix := fmt.Sprintf( "Name: %s\nPath: %s\nUrl: %s\n\n", @@ -32,233 +22,30 @@ func (gui *Gui) submodulesRenderToMain() error { style.FgCyan.Sprint(submodule.Url), ) - file := gui.fileForSubmodule(submodule) + file := gui.helpers.WorkingTree.FileForSubmodule(submodule) if file == nil { - task = NewRenderStringTask(prefix) + task = types.NewRenderStringTask(prefix) } else { - cmdObj := gui.Git.WorkingTree.WorktreeFileDiffCmdObj(file, false, !file.HasUnstagedChanges && file.HasStagedChanges, gui.State.IgnoreWhitespaceInDiffView) - task = NewRunCommandTaskWithPrefix(cmdObj.GetCmd(), prefix) + cmdObj := gui.git.WorkingTree.WorktreeFileDiffCmdObj(file, false, !file.HasUnstagedChanges && file.HasStagedChanges, gui.IgnoreWhitespaceInDiffView) + task = types.NewRunCommandTaskWithPrefix(cmdObj.GetCmd(), prefix) } } - return gui.refreshMainViews(refreshMainOpts{ - main: &viewUpdateOpts{ - title: "Submodule", - task: task, + return gui.c.RenderToMainViews(types.RefreshMainOpts{ + Pair: gui.c.MainViewPairs().Normal, + Main: &types.ViewUpdateOpts{ + Title: "Submodule", + Task: task, }, }) } -func (gui *Gui) refreshStateSubmoduleConfigs() error { - configs, err := gui.Git.Submodule.GetConfigs() - if err != nil { - return err - } - - gui.State.Submodules = configs - - return nil -} - -func (gui *Gui) handleSubmoduleEnter(submodule *models.SubmoduleConfig) error { - return gui.enterSubmodule(submodule) -} - func (gui *Gui) enterSubmodule(submodule *models.SubmoduleConfig) error { wd, err := os.Getwd() if err != nil { return err } - gui.RepoPathStack = append(gui.RepoPathStack, wd) + gui.RepoPathStack.Push(wd) return gui.dispatchSwitchToRepo(submodule.Path, true) } - -func (gui *Gui) removeSubmodule(submodule *models.SubmoduleConfig) error { - return gui.ask(askOpts{ - title: gui.Tr.RemoveSubmodule, - prompt: fmt.Sprintf(gui.Tr.RemoveSubmodulePrompt, submodule.Name), - handleConfirm: func() error { - gui.logAction(gui.Tr.Actions.RemoveSubmodule) - if err := gui.Git.Submodule.Delete(submodule); err != nil { - return gui.surfaceError(err) - } - - return gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{SUBMODULES, FILES}}) - }, - }) -} - -func (gui *Gui) handleResetSubmodule(submodule *models.SubmoduleConfig) error { - return gui.WithWaitingStatus(gui.Tr.LcResettingSubmoduleStatus, func() error { - return gui.resetSubmodule(submodule) - }) -} - -func (gui *Gui) fileForSubmodule(submodule *models.SubmoduleConfig) *models.File { - for _, file := range gui.State.FileTreeViewModel.GetAllFiles() { - if file.IsSubmodule([]*models.SubmoduleConfig{submodule}) { - return file - } - } - - return nil -} - -func (gui *Gui) resetSubmodule(submodule *models.SubmoduleConfig) error { - gui.logAction(gui.Tr.Actions.ResetSubmodule) - - file := gui.fileForSubmodule(submodule) - if file != nil { - if err := gui.Git.WorkingTree.UnStageFile(file.Names(), file.Tracked); err != nil { - return gui.surfaceError(err) - } - } - - if err := gui.Git.Submodule.Stash(submodule); err != nil { - return gui.surfaceError(err) - } - if err := gui.Git.Submodule.Reset(submodule); err != nil { - return gui.surfaceError(err) - } - - return gui.refreshSidePanels(refreshOptions{mode: ASYNC, scope: []RefreshableView{FILES, SUBMODULES}}) -} - -func (gui *Gui) handleAddSubmodule() error { - return gui.prompt(promptOpts{ - title: gui.Tr.LcNewSubmoduleUrl, - handleConfirm: func(submoduleUrl string) error { - nameSuggestion := filepath.Base(strings.TrimSuffix(submoduleUrl, filepath.Ext(submoduleUrl))) - - return gui.prompt(promptOpts{ - title: gui.Tr.LcNewSubmoduleName, - initialContent: nameSuggestion, - handleConfirm: func(submoduleName string) error { - - return gui.prompt(promptOpts{ - title: gui.Tr.LcNewSubmodulePath, - initialContent: submoduleName, - handleConfirm: func(submodulePath string) error { - return gui.WithWaitingStatus(gui.Tr.LcAddingSubmoduleStatus, func() error { - gui.logAction(gui.Tr.Actions.AddSubmodule) - err := gui.Git.Submodule.Add(submoduleName, submodulePath, submoduleUrl) - gui.handleCredentialsPopup(err) - - return gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{SUBMODULES}}) - }) - }, - }) - }, - }) - }, - }) - -} - -func (gui *Gui) handleEditSubmoduleUrl(submodule *models.SubmoduleConfig) error { - return gui.prompt(promptOpts{ - title: fmt.Sprintf(gui.Tr.LcUpdateSubmoduleUrl, submodule.Name), - initialContent: submodule.Url, - handleConfirm: func(newUrl string) error { - return gui.WithWaitingStatus(gui.Tr.LcUpdatingSubmoduleUrlStatus, func() error { - gui.logAction(gui.Tr.Actions.UpdateSubmoduleUrl) - err := gui.Git.Submodule.UpdateUrl(submodule.Name, submodule.Path, newUrl) - gui.handleCredentialsPopup(err) - - return gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{SUBMODULES}}) - }) - }, - }) -} - -func (gui *Gui) handleSubmoduleInit(submodule *models.SubmoduleConfig) error { - return gui.WithWaitingStatus(gui.Tr.LcInitializingSubmoduleStatus, func() error { - gui.logAction(gui.Tr.Actions.InitialiseSubmodule) - err := gui.Git.Submodule.Init(submodule.Path) - gui.handleCredentialsPopup(err) - - return gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{SUBMODULES}}) - }) -} - -func (gui *Gui) forSubmodule(callback func(*models.SubmoduleConfig) error) func() error { - return func() error { - submodule := gui.getSelectedSubmodule() - if submodule == nil { - return nil - } - - return callback(submodule) - } -} - -func (gui *Gui) handleBulkSubmoduleActionsMenu() error { - menuItems := []*menuItem{ - { - displayStrings: []string{gui.Tr.LcBulkInitSubmodules, style.FgGreen.Sprint(gui.Git.Submodule.BulkInitCmdObj().ToString())}, - onPress: func() error { - return gui.WithWaitingStatus(gui.Tr.LcRunningCommand, func() error { - gui.logAction(gui.Tr.Actions.BulkInitialiseSubmodules) - err := gui.Git.Submodule.BulkInitCmdObj().Run() - if err != nil { - return gui.surfaceError(err) - } - - return gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{SUBMODULES}}) - }) - }, - }, - { - displayStrings: []string{gui.Tr.LcBulkUpdateSubmodules, style.FgYellow.Sprint(gui.Git.Submodule.BulkUpdateCmdObj().ToString())}, - onPress: func() error { - return gui.WithWaitingStatus(gui.Tr.LcRunningCommand, func() error { - gui.logAction(gui.Tr.Actions.BulkUpdateSubmodules) - if err := gui.Git.Submodule.BulkUpdateCmdObj().Run(); err != nil { - return gui.surfaceError(err) - } - - return gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{SUBMODULES}}) - }) - }, - }, - { - displayStrings: []string{gui.Tr.LcSubmoduleStashAndReset, style.FgRed.Sprintf("git stash in each submodule && %s", gui.Git.Submodule.ForceBulkUpdateCmdObj().ToString())}, - onPress: func() error { - return gui.WithWaitingStatus(gui.Tr.LcRunningCommand, func() error { - gui.logAction(gui.Tr.Actions.BulkStashAndResetSubmodules) - if err := gui.Git.Submodule.ResetSubmodules(gui.State.Submodules); err != nil { - return gui.surfaceError(err) - } - - return gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{SUBMODULES}}) - }) - }, - }, - { - displayStrings: []string{gui.Tr.LcBulkDeinitSubmodules, style.FgRed.Sprint(gui.Git.Submodule.BulkDeinitCmdObj().ToString())}, - onPress: func() error { - return gui.WithWaitingStatus(gui.Tr.LcRunningCommand, func() error { - gui.logAction(gui.Tr.Actions.BulkDeinitialiseSubmodules) - if err := gui.Git.Submodule.BulkDeinitCmdObj().Run(); err != nil { - return gui.surfaceError(err) - } - - return gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{SUBMODULES}}) - }) - }, - }, - } - - return gui.createMenu(gui.Tr.LcBulkSubmoduleOptions, menuItems, createMenuOptions{showCancel: true}) -} - -func (gui *Gui) handleUpdateSubmodule(submodule *models.SubmoduleConfig) error { - return gui.WithWaitingStatus(gui.Tr.LcUpdatingSubmoduleStatus, func() error { - gui.logAction(gui.Tr.Actions.UpdateSubmodule) - err := gui.Git.Submodule.Update(submodule.Path) - gui.handleCredentialsPopup(err) - - return gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{SUBMODULES}}) - }) -} diff --git a/pkg/gui/suggestions_panel.go b/pkg/gui/suggestions_panel.go index c11145ded..d7b8b0d2b 100644 --- a/pkg/gui/suggestions_panel.go +++ b/pkg/gui/suggestions_panel.go @@ -15,17 +15,12 @@ func (gui *Gui) getSelectedSuggestionValue() string { } func (gui *Gui) getSelectedSuggestion() *types.Suggestion { - selectedLine := gui.State.Panels.Suggestions.SelectedLineIdx - if selectedLine == -1 { - return nil - } - - return gui.State.Suggestions[selectedLine] + return gui.State.Contexts.Suggestions.GetSelected() } func (gui *Gui) setSuggestions(suggestions []*types.Suggestion) { gui.State.Suggestions = suggestions - gui.State.Panels.Suggestions.SelectedLineIdx = 0 + gui.State.Contexts.Suggestions.SetSelectedLineIdx(0) _ = gui.resetOrigin(gui.Views.Suggestions) _ = gui.State.Contexts.Suggestions.HandleRender() } diff --git a/pkg/gui/tags_panel.go b/pkg/gui/tags_panel.go index efad33fbf..af09e4242 100644 --- a/pkg/gui/tags_panel.go +++ b/pkg/gui/tags_panel.go @@ -1,120 +1,22 @@ package gui -import ( - "github.com/jesseduffield/lazygit/pkg/commands/models" - "github.com/jesseduffield/lazygit/pkg/utils" -) - -func (gui *Gui) getSelectedTag() *models.Tag { - selectedLine := gui.State.Panels.Tags.SelectedLineIdx - if selectedLine == -1 || len(gui.State.Tags) == 0 { - return nil - } - - return gui.State.Tags[selectedLine] -} - -func (gui *Gui) handleCreateTag() error { - // leaving commit SHA blank so that we're just creating the tag for the current commit - return gui.createTagMenu("") -} +import "github.com/jesseduffield/lazygit/pkg/gui/types" func (gui *Gui) tagsRenderToMain() error { - var task updateTask - tag := gui.getSelectedTag() + var task types.UpdateTask + tag := gui.State.Contexts.Tags.GetSelected() if tag == nil { - task = NewRenderStringTask("No tags") + task = types.NewRenderStringTask("No tags") } else { - cmdObj := gui.Git.Branch.GetGraphCmdObj(tag.Name) - task = NewRunCommandTask(cmdObj.GetCmd()) + cmdObj := gui.git.Branch.GetGraphCmdObj(tag.FullRefName()) + task = types.NewRunCommandTask(cmdObj.GetCmd()) } - return gui.refreshMainViews(refreshMainOpts{ - main: &viewUpdateOpts{ - title: "Tag", - task: task, + return gui.c.RenderToMainViews(types.RefreshMainOpts{ + Pair: gui.c.MainViewPairs().Normal, + Main: &types.ViewUpdateOpts{ + Title: "Tag", + Task: task, }, }) } - -// this is a controller: it can't access tags directly. Or can it? It should be able to get but not set. But that's exactly what I'm doing here, setting it. but through a mutator which encapsulates the event. -func (gui *Gui) refreshTags() error { - tags, err := gui.Git.Loaders.Tags.GetTags() - if err != nil { - return gui.surfaceError(err) - } - - gui.State.Tags = tags - - return gui.postRefreshUpdate(gui.State.Contexts.Tags) -} - -func (gui *Gui) withSelectedTag(f func(tag *models.Tag) error) func() error { - return func() error { - tag := gui.getSelectedTag() - if tag == nil { - return nil - } - - return f(tag) - } -} - -// tag-specific handlers - -func (gui *Gui) handleCheckoutTag(tag *models.Tag) error { - gui.logAction(gui.Tr.Actions.CheckoutTag) - if err := gui.handleCheckoutRef(tag.Name, handleCheckoutRefOptions{}); err != nil { - return err - } - return gui.pushContext(gui.State.Contexts.Branches) -} - -func (gui *Gui) handleDeleteTag(tag *models.Tag) error { - prompt := utils.ResolvePlaceholderString( - gui.Tr.DeleteTagPrompt, - map[string]string{ - "tagName": tag.Name, - }, - ) - - return gui.ask(askOpts{ - title: gui.Tr.DeleteTagTitle, - prompt: prompt, - handleConfirm: func() error { - gui.logAction(gui.Tr.Actions.DeleteTag) - if err := gui.Git.Tag.Delete(tag.Name); err != nil { - return gui.surfaceError(err) - } - return gui.refreshSidePanels(refreshOptions{mode: ASYNC, scope: []RefreshableView{COMMITS, TAGS}}) - }, - }) -} - -func (gui *Gui) handlePushTag(tag *models.Tag) error { - title := utils.ResolvePlaceholderString( - gui.Tr.PushTagTitle, - map[string]string{ - "tagName": tag.Name, - }, - ) - - return gui.prompt(promptOpts{ - title: title, - initialContent: "origin", - findSuggestionsFunc: gui.getRemoteSuggestionsFunc(), - handleConfirm: func(response string) error { - return gui.WithWaitingStatus(gui.Tr.PushingTagStatus, func() error { - gui.logAction(gui.Tr.Actions.PushTag) - err := gui.Git.Tag.Push(response, tag.Name) - gui.handleCredentialsPopup(err) - - return nil - }) - }, - }) -} - -func (gui *Gui) handleCreateResetToTagMenu(tag *models.Tag) error { - return gui.createResetMenu(tag.Name) -} diff --git a/pkg/gui/tasks_adapter.go b/pkg/gui/tasks_adapter.go index 4c268c14d..33aa09eb9 100644 --- a/pkg/gui/tasks_adapter.go +++ b/pkg/gui/tasks_adapter.go @@ -11,7 +11,7 @@ import ( func (gui *Gui) newCmdTask(view *gocui.View, cmd *exec.Cmd, prefix string) error { cmdStr := strings.Join(cmd.Args, " ") - gui.Log.WithField( + gui.c.Log.WithField( "command", cmdStr, ).Debug("RunCommand") @@ -24,19 +24,19 @@ func (gui *Gui) newCmdTask(view *gocui.View, cmd *exec.Cmd, prefix string) error start := func() (*exec.Cmd, io.Reader) { r, err := cmd.StdoutPipe() if err != nil { - gui.Log.Warn(err) + gui.c.Log.Error(err) } cmd.Stderr = cmd.Stdout if err := cmd.Start(); err != nil { - gui.Log.Warn(err) + gui.c.Log.Error(err) } return cmd, r } if err := manager.NewTask(manager.NewCmdTask(start, prefix, height+oy+10, nil), cmdStr); err != nil { - gui.Log.Warn(err) + gui.c.Log.Error(err) } return nil @@ -64,6 +64,22 @@ func (gui *Gui) newStringTaskWithoutScroll(view *gocui.View, str string) error { return nil } +func (gui *Gui) newStringTaskWithScroll(view *gocui.View, str string, originX int, originY int) error { + manager := gui.getManager(view) + + f := func(stop chan struct{}) error { + gui.setViewContent(view, str) + _ = view.SetOrigin(originX, originY) + return nil + } + + if err := manager.NewTask(f, ""); err != nil { + return err + } + + return nil +} + func (gui *Gui) newStringTaskWithKey(view *gocui.View, str string, key string) error { manager := gui.getManager(view) @@ -98,21 +114,15 @@ func (gui *Gui) getManager(view *gocui.View) *tasks.ViewBufferManager { }, func() { // Need to check if the content of the view is well past the origin. - // It would be better to use .ViewLinesHeight here (given it considers - // wrapping) but when this function is called they haven't been written to yet. - linesHeight := view.LinesHeight() - _, height := view.Size() + linesHeight := view.ViewLinesHeight() _, originY := view.Origin() if linesHeight < originY { - newOriginY := linesHeight - height - if newOriginY < 0 { - newOriginY = 0 - } + newOriginY := linesHeight + err := view.SetOrigin(0, newOriginY) if err != nil { panic(err) } - } view.FlushStaleCells() diff --git a/pkg/gui/test_mode.go b/pkg/gui/test_mode.go new file mode 100644 index 000000000..cd3bd83ba --- /dev/null +++ b/pkg/gui/test_mode.go @@ -0,0 +1,124 @@ +package gui + +import ( + "encoding/json" + "io/ioutil" + "log" + "os" + "strconv" + "time" + + "github.com/jesseduffield/gocui" + integrationTypes "github.com/jesseduffield/lazygit/pkg/integration/types" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +type IntegrationTest interface { + Run(guiAdapter *GuiDriver) +} + +func (gui *Gui) handleTestMode(test integrationTypes.IntegrationTest) { + if test != nil { + go func() { + time.Sleep(time.Millisecond * 100) + + test.Run(&GuiDriver{gui: gui}) + + gui.g.Update(func(*gocui.Gui) error { + return gocui.ErrQuit + }) + + time.Sleep(time.Second * 1) + + log.Fatal("gocui should have already exited") + }() + + go utils.Safe(func() { + time.Sleep(time.Second * 40) + log.Fatal("40 seconds is up, lazygit recording took too long to complete") + }) + } + + if Replaying() { + gui.g.RecordingConfig = gocui.RecordingConfig{ + Speed: GetRecordingSpeed(), + Leeway: 100, + } + + var err error + gui.g.Recording, err = LoadRecording() + if err != nil { + panic(err) + } + + go utils.Safe(func() { + time.Sleep(time.Second * 40) + log.Fatal("40 seconds is up, lazygit recording took too long to complete") + }) + } +} + +func Headless() bool { + return os.Getenv("HEADLESS") != "" +} + +// OLD integration test format stuff + +func Replaying() bool { + return os.Getenv("REPLAY_EVENTS_FROM") != "" +} + +func RecordingEvents() bool { + return recordEventsTo() != "" +} + +func recordEventsTo() string { + return os.Getenv("RECORD_EVENTS_TO") +} + +func GetRecordingSpeed() float64 { + // humans are slow so this speeds things up. + speed := 1.0 + envReplaySpeed := os.Getenv("SPEED") + if envReplaySpeed != "" { + var err error + speed, err = strconv.ParseFloat(envReplaySpeed, 64) + if err != nil { + log.Fatal(err) + } + } + return speed +} + +func LoadRecording() (*gocui.Recording, error) { + path := os.Getenv("REPLAY_EVENTS_FROM") + + data, err := ioutil.ReadFile(path) + if err != nil { + return nil, err + } + + recording := &gocui.Recording{} + + err = json.Unmarshal(data, &recording) + if err != nil { + return nil, err + } + + return recording, nil +} + +func SaveRecording(recording *gocui.Recording) error { + if !RecordingEvents() { + return nil + } + + jsonEvents, err := json.Marshal(recording) + if err != nil { + return err + } + + path := recordEventsTo() + + return ioutil.WriteFile(path, jsonEvents, 0o600) +} diff --git a/pkg/gui/types/common.go b/pkg/gui/types/common.go new file mode 100644 index 000000000..ab8f6b2b8 --- /dev/null +++ b/pkg/gui/types/common.go @@ -0,0 +1,175 @@ +package types + +import ( + "github.com/jesseduffield/lazygit/pkg/commands/git_commands" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/commands/oscommands" + "github.com/jesseduffield/lazygit/pkg/common" + "github.com/jesseduffield/lazygit/pkg/config" + "github.com/sasha-s/go-deadlock" + "gopkg.in/ozeidan/fuzzy-patricia.v3/patricia" +) + +type HelperCommon struct { + *common.Common + IGuiCommon +} + +type IGuiCommon interface { + IPopupHandler + + LogAction(action string) + LogCommand(cmdStr string, isCommandLine bool) + // we call this when we want to refetch some models and render the result. Internally calls PostRefreshUpdate + Refresh(RefreshOptions) error + // we call this when we've changed something in the view model but not the actual model, + // e.g. expanding or collapsing a folder in a file view. Calling 'Refresh' in this + // case would be overkill, although refresh will internally call 'PostRefreshUpdate' + PostRefreshUpdate(Context) error + // this just re-renders the screen + Render() + // allows rendering to main views (i.e. the ones to the right of the side panel) + // in such a way that avoids concurrency issues when there are slow commands + // to display the output of + RenderToMainViews(opts RefreshMainOpts) error + // used purely for the sake of RenderToMainViews to provide the pair of main views we want to render to + MainViewPairs() MainViewPairs + + // returns true if command completed successfully + RunSubprocess(cmdObj oscommands.ICmdObj) (bool, error) + RunSubprocessAndRefresh(oscommands.ICmdObj) error + + PushContext(context Context, opts ...OnFocusOpts) error + PopContext() error + CurrentContext() Context + CurrentStaticContext() Context + IsCurrentContext(Context) bool + // enters search mode for the current view + OpenSearch() + + GetAppState() *config.AppState + SaveAppState() error + + // Runs the given function on the UI thread (this is for things like showing a popup asking a user for input). + // Only necessary to call if you're not already on the UI thread i.e. you're inside a goroutine. + // All controller handlers are executed on the UI thread. + OnUIThread(f func() error) +} + +type IPopupHandler interface { + // Shows a popup with a (localized) "Error" caption and the given error message (in red). + // + // This is a convenience wrapper around Alert(). + ErrorMsg(message string) error + Error(err error) error + // Shows a notification popup with the given title and message to the user. + // + // This is a convenience wrapper around Confirm(), thus the popup can be closed using both 'Enter' and 'ESC'. + Alert(title string, message string) error + // Shows a popup asking the user for confirmation. + Confirm(opts ConfirmOpts) error + // Shows a popup prompting the user for input. + Prompt(opts PromptOpts) error + WithLoaderPanel(message string, f func() error) error + WithWaitingStatus(message string, f func() error) error + Menu(opts CreateMenuOptions) error + Toast(message string) + GetPromptInput() string +} + +type CreateMenuOptions struct { + Title string + Items []*MenuItem + HideCancel bool +} + +type CreatePopupPanelOpts struct { + HasLoader bool + Editable bool + Title string + Prompt string + HandleConfirm func() error + HandleConfirmPrompt func(string) error + HandleClose func() error + + FindSuggestionsFunc func(string) []*Suggestion + Mask bool +} + +type ConfirmOpts struct { + Title string + Prompt string + HandleConfirm func() error + HandleClose func() error + HasLoader bool + FindSuggestionsFunc func(string) []*Suggestion + Editable bool + Mask bool +} + +type PromptOpts struct { + Title string + InitialContent string + FindSuggestionsFunc func(string) []*Suggestion + HandleConfirm func(string) error + // CAPTURE THIS + HandleClose func() error + Mask bool +} + +type MenuItem struct { + Label string + + // alternative to Label. Allows specifying columns which will be auto-aligned + LabelColumns []string + + OnPress func() error + + // Only applies when Label is used + OpensMenu bool + + // If Key is defined it allows the user to press the key to invoke the menu + // item, as opposed to having to navigate to it + Key Key + + // The tooltip will be displayed upon highlighting the menu item + Tooltip string +} + +type Model struct { + CommitFiles []*models.CommitFile + Files []*models.File + Submodules []*models.SubmoduleConfig + Branches []*models.Branch + Commits []*models.Commit + StashEntries []*models.StashEntry + SubCommits []*models.Commit + Remotes []*models.Remote + + // FilteredReflogCommits are the ones that appear in the reflog panel. + // when in filtering mode we only include the ones that match the given path + FilteredReflogCommits []*models.Commit + // ReflogCommits are the ones used by the branches panel to obtain recency values + // if we're not in filtering mode, CommitFiles and FilteredReflogCommits will be + // one and the same + ReflogCommits []*models.Commit + + BisectInfo *git_commands.BisectInfo + RemoteBranches []*models.RemoteBranch + Tags []*models.Tag + + // for displaying suggestions while typing in a file name + FilesTrie *patricia.Trie +} + +// if you add a new mutex here be sure to instantiate it. We're using pointers to +// mutexes so that we can pass the mutexes to controllers. +type Mutexes struct { + RefreshingFilesMutex *deadlock.Mutex + RefreshingStatusMutex *deadlock.Mutex + SyncMutex *deadlock.Mutex + LocalCommitsMutex *deadlock.Mutex + SubprocessMutex *deadlock.Mutex + PopupMutex *deadlock.Mutex + PtyMutex *deadlock.Mutex +} diff --git a/pkg/gui/types/common_commands.go b/pkg/gui/types/common_commands.go new file mode 100644 index 000000000..74bfd603b --- /dev/null +++ b/pkg/gui/types/common_commands.go @@ -0,0 +1,7 @@ +package types + +type CheckoutRefOptions struct { + WaitingStatus string + EnvVars []string + OnRefNotFound func(ref string) error +} diff --git a/pkg/gui/types/context.go b/pkg/gui/types/context.go new file mode 100644 index 000000000..e88d0d0f9 --- /dev/null +++ b/pkg/gui/types/context.go @@ -0,0 +1,183 @@ +package types + +import ( + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/config" + "github.com/jesseduffield/lazygit/pkg/gui/patch_exploring" + "github.com/sasha-s/go-deadlock" +) + +type ContextKind int + +const ( + // this is your files, branches, commits, contexts etc. They're all on the left hand side + // and you can cycle through them. + SIDE_CONTEXT ContextKind = iota + // This is either the left or right 'main' contexts that appear to the right of the side contexts + MAIN_CONTEXT + // A persistent popup is one that has its own identity e.g. the commit message context. + // When you open a popup over it, we'll let you return to it upon pressing escape + PERSISTENT_POPUP + // A temporary popup is one that could be used for various things (e.g. a generic menu or confirmation popup). + // Because we re-use these contexts, they're temporary in that you can't return to them after you've switched from them + // to some other context, because the context you switched to might actually be the same context but rendering different content. + // We should really be able to spawn new contexts for menus/prompts so that we can actually return to old ones. + TEMPORARY_POPUP + // This contains the command log, underneath the main contexts. + EXTRAS_CONTEXT + // only used by the one global context, purely for the sake of defining keybindings globally + GLOBAL_CONTEXT + // a display context only renders a view. It has no keybindings associated and + // it cannot receive focus. + DISPLAY_CONTEXT +) + +type ParentContexter interface { + SetParentContext(Context) + // we return a bool here to tell us whether or not the returned value just wraps a nil + GetParentContext() (Context, bool) +} + +type IBaseContext interface { + HasKeybindings + ParentContexter + + GetKind() ContextKind + GetViewName() string + GetView() *gocui.View + GetViewTrait() IViewTrait + GetWindowName() string + SetWindowName(string) + GetKey() ContextKey + IsFocusable() bool + // if a context is transient, then it only appears via some keybinding on another + // context. Until we add support for having multiple of the same context, no two + // of the same transient context can appear at once meaning one might be 'stolen' + // from another window. + IsTransient() bool + // this tells us if the view's bounds are determined by its window or if they're + // determined independently. + HasControlledBounds() bool + + // returns the desired title for the view upon activation. If there is no desired title (returns empty string), then + // no title will be set + Title() string + + GetOptionsMap() map[string]string + + AddKeybindingsFn(KeybindingsFn) + AddMouseKeybindingsFn(MouseKeybindingsFn) + + // This is a bit of a hack at the moment: we currently only set an onclick function so that + // our list controller can come along and wrap it in a list-specific click handler. + // We'll need to think of a better way to do this. + AddOnClickFn(func() error) +} + +type Context interface { + IBaseContext + + HandleFocus(opts OnFocusOpts) error + HandleFocusLost(opts OnFocusLostOpts) error + HandleRender() error + HandleRenderToMain() error +} + +type IListContext interface { + Context + + GetSelectedItemId() string + + GetList() IList + + OnSearchSelect(selectedLineIdx int) error + FocusLine() +} + +type IPatchExplorerContext interface { + Context + + GetState() *patch_exploring.State + SetState(*patch_exploring.State) + GetIncludedLineIndices() []int + RenderAndFocus(isFocused bool) error + Render(isFocused bool) error + Focus() error + GetContentToRender(isFocused bool) string + NavigateTo(isFocused bool, selectedLineIdx int) error + GetMutex() *deadlock.Mutex +} + +type IViewTrait interface { + FocusPoint(yIdx int) + SetViewPortContent(content string) + SetContent(content string) + SetFooter(value string) + SetOriginX(value int) + ViewPortYBounds() (int, int) + ScrollLeft() + ScrollRight() + ScrollUp(value int) + ScrollDown(value int) + PageDelta() int + SelectedLineIdx() int + SetHighlight(bool) +} + +type OnFocusOpts struct { + ClickedWindowName string + ClickedViewLineIdx int +} + +type OnFocusLostOpts struct { + NewContextKey ContextKey +} + +type ContextKey string + +type KeybindingsOpts struct { + GetKey func(key string) Key + Config config.KeybindingConfig + Guards KeybindingGuards +} + +type ( + KeybindingsFn func(opts KeybindingsOpts) []*Binding + MouseKeybindingsFn func(opts KeybindingsOpts) []*gocui.ViewMouseBinding +) + +type HasKeybindings interface { + GetKeybindings(opts KeybindingsOpts) []*Binding + GetMouseKeybindings(opts KeybindingsOpts) []*gocui.ViewMouseBinding + GetOnClick() func() error +} + +type IController interface { + HasKeybindings + Context() Context +} + +type IList interface { + IListCursor + Len() int +} + +type IListCursor interface { + GetSelectedLineIdx() int + SetSelectedLineIdx(value int) + MoveSelectedLine(delta int) + RefreshSelectedIdx() +} + +type IListPanelState interface { + SetSelectedLineIdx(int) + GetSelectedLineIdx() int +} + +type ListItem interface { + // ID is a SHA when the item is a commit, a filename when the item is a file, 'stash@{4}' when it's a stash entry, 'my_branch' when it's a branch + ID() string + + // Description is something we would show in a message e.g. '123as14: push blah' for a commit + Description() string +} diff --git a/pkg/gui/types/keybindings.go b/pkg/gui/types/keybindings.go new file mode 100644 index 000000000..c945ce3ab --- /dev/null +++ b/pkg/gui/types/keybindings.go @@ -0,0 +1,31 @@ +package types + +import "github.com/jesseduffield/gocui" + +type Key interface{} // FIXME: find out how to get `gocui.Key | rune` + +// Binding - a keybinding mapping a key and modifier to a handler. The keypress +// is only handled if the given view has focus, or handled globally if the view +// is "" +type Binding struct { + ViewName string + Handler func() error + Key Key + Modifier gocui.Modifier + Description string + Alternative string + Tag string // e.g. 'navigation'. Used for grouping things in the cheatsheet + OpensMenu bool + + // to be displayed if the keybinding is highlighted from within a menu + Tooltip string +} + +// A guard is a decorator which checks something before executing a handler +// and potentially early-exits if some precondition hasn't been met. +type Guard func(func() error) func() error + +type KeybindingGuards struct { + OutsideFilterMode Guard + NoPopupPanel Guard +} diff --git a/pkg/gui/types/modes.go b/pkg/gui/types/modes.go new file mode 100644 index 000000000..ba135de63 --- /dev/null +++ b/pkg/gui/types/modes.go @@ -0,0 +1,13 @@ +package types + +import ( + "github.com/jesseduffield/lazygit/pkg/gui/modes/cherrypicking" + "github.com/jesseduffield/lazygit/pkg/gui/modes/diffing" + "github.com/jesseduffield/lazygit/pkg/gui/modes/filtering" +) + +type Modes struct { + Filtering filtering.Filtering + CherryPicking *cherrypicking.CherryPicking + Diffing diffing.Diffing +} diff --git a/pkg/gui/types/ref.go b/pkg/gui/types/ref.go new file mode 100644 index 000000000..e83d91b65 --- /dev/null +++ b/pkg/gui/types/ref.go @@ -0,0 +1,8 @@ +package types + +type Ref interface { + FullRefName() string + RefName() string + ParentRefName() string + Description() string +} diff --git a/pkg/gui/types/refresh.go b/pkg/gui/types/refresh.go new file mode 100644 index 000000000..475b90942 --- /dev/null +++ b/pkg/gui/types/refresh.go @@ -0,0 +1,37 @@ +package types + +// models/views that we can refresh +type RefreshableView int + +const ( + COMMITS RefreshableView = iota + REBASE_COMMITS + BRANCHES + FILES + STASH + REFLOG + TAGS + REMOTES + STATUS + SUBMODULES + STAGING + PATCH_BUILDING + MERGE_CONFLICTS + COMMIT_FILES + // not actually a view. Will refactor this later + BISECT_INFO +) + +type RefreshMode int + +const ( + SYNC RefreshMode = iota // wait until everything is done before returning + ASYNC // return immediately, allowing each independent thing to update itself + BLOCK_UI // wrap code in an update call to ensure UI updates all at once and keybindings aren't executed till complete +) + +type RefreshOptions struct { + Then func() + Scope []RefreshableView // e.g. []int{COMMITS, BRANCHES}. Leave empty to refresh everything + Mode RefreshMode // one of SYNC (default), ASYNC, and BLOCK_UI +} diff --git a/pkg/gui/types/rendering.go b/pkg/gui/types/rendering.go new file mode 100644 index 000000000..b4e7bedcb --- /dev/null +++ b/pkg/gui/types/rendering.go @@ -0,0 +1,95 @@ +package types + +import ( + "os/exec" +) + +type MainContextPair struct { + Main Context + Secondary Context +} + +func NewMainContextPair(main Context, secondary Context) MainContextPair { + return MainContextPair{Main: main, Secondary: secondary} +} + +type MainViewPairs struct { + Normal MainContextPair + MergeConflicts MainContextPair + Staging MainContextPair + PatchBuilding MainContextPair +} + +type ViewUpdateOpts struct { + Title string + + Task UpdateTask +} + +type RefreshMainOpts struct { + Pair MainContextPair + Main *ViewUpdateOpts + Secondary *ViewUpdateOpts +} + +type UpdateTask interface { + IsUpdateTask() +} + +type RenderStringTask struct { + Str string +} + +func (t *RenderStringTask) IsUpdateTask() {} + +func NewRenderStringTask(str string) *RenderStringTask { + return &RenderStringTask{Str: str} +} + +type RenderStringWithoutScrollTask struct { + Str string +} + +func (t *RenderStringWithoutScrollTask) IsUpdateTask() {} + +func NewRenderStringWithoutScrollTask(str string) *RenderStringWithoutScrollTask { + return &RenderStringWithoutScrollTask{Str: str} +} + +type RenderStringWithScrollTask struct { + Str string + OriginX int + OriginY int +} + +func (t *RenderStringWithScrollTask) IsUpdateTask() {} + +func NewRenderStringWithScrollTask(str string, originX int, originY int) *RenderStringWithScrollTask { + return &RenderStringWithScrollTask{Str: str, OriginX: originX, OriginY: originY} +} + +type RunCommandTask struct { + Cmd *exec.Cmd + Prefix string +} + +func (t *RunCommandTask) IsUpdateTask() {} + +func NewRunCommandTask(cmd *exec.Cmd) *RunCommandTask { + return &RunCommandTask{Cmd: cmd} +} + +func NewRunCommandTaskWithPrefix(cmd *exec.Cmd, prefix string) *RunCommandTask { + return &RunCommandTask{Cmd: cmd, Prefix: prefix} +} + +type RunPtyTask struct { + Cmd *exec.Cmd + Prefix string +} + +func (t *RunPtyTask) IsUpdateTask() {} + +func NewRunPtyTask(cmd *exec.Cmd) *RunPtyTask { + return &RunPtyTask{Cmd: cmd} +} diff --git a/pkg/gui/undoing.go b/pkg/gui/undoing.go deleted file mode 100644 index 72a4ef302..000000000 --- a/pkg/gui/undoing.go +++ /dev/null @@ -1,206 +0,0 @@ -package gui - -import ( - "github.com/jesseduffield/lazygit/pkg/commands/types/enums" - "github.com/jesseduffield/lazygit/pkg/utils" -) - -// Quick summary of how this all works: -// when you want to undo or redo, we start from the top of the reflog and work -// down until we've reached the last user-initiated reflog entry that hasn't already been undone -// we then do the reverse of what that reflog describes. -// When we do this, we create a new reflog entry, and tag it as either an undo or redo -// Then, next time we want to undo, we'll use those entries to know which user-initiated -// actions we can skip. E.g. if I do do three things, A, B, and C, and hit undo twice, -// the reflog will read UUCBA, and when I read the first two undos, I know to skip the following -// two user actions, meaning we end up undoing reflog entry C. Redoing works in a similar way. - -type ReflogActionKind int - -const ( - CHECKOUT ReflogActionKind = iota - COMMIT - REBASE - CURRENT_REBASE -) - -type reflogAction struct { - kind ReflogActionKind - from string - to string -} - -// Here we're going through the reflog and maintaining a counter that represents how many -// undos/redos/user actions we've seen. when we hit a user action we call the callback specifying -// what the counter is up to and the nature of the action. -// If we find ourselves mid-rebase, we just return because undo/redo mid rebase -// requires knowledge of previous TODO file states, which you can't just get from the reflog. -// Though we might support this later, hence the use of the CURRENT_REBASE action kind. -func (gui *Gui) parseReflogForActions(onUserAction func(counter int, action reflogAction) (bool, error)) error { - counter := 0 - reflogCommits := gui.State.FilteredReflogCommits - rebaseFinishCommitSha := "" - var action *reflogAction - for reflogCommitIdx, reflogCommit := range reflogCommits { - action = nil - - prevCommitSha := "" - if len(reflogCommits)-1 >= reflogCommitIdx+1 { - prevCommitSha = reflogCommits[reflogCommitIdx+1].Sha - } - - if rebaseFinishCommitSha == "" { - if ok, _ := utils.FindStringSubmatch(reflogCommit.Name, `^\[lazygit undo\]`); ok { - counter++ - } else if ok, _ := utils.FindStringSubmatch(reflogCommit.Name, `^\[lazygit redo\]`); ok { - counter-- - } else if ok, _ := utils.FindStringSubmatch(reflogCommit.Name, `^rebase -i \(abort\)|^rebase -i \(finish\)`); ok { - rebaseFinishCommitSha = reflogCommit.Sha - } else if ok, match := utils.FindStringSubmatch(reflogCommit.Name, `^checkout: moving from ([\S]+) to ([\S]+)`); ok { - action = &reflogAction{kind: CHECKOUT, from: match[1], to: match[2]} - } else if ok, _ := utils.FindStringSubmatch(reflogCommit.Name, `^commit|^reset: moving to|^pull`); ok { - action = &reflogAction{kind: COMMIT, from: prevCommitSha, to: reflogCommit.Sha} - } else if ok, _ := utils.FindStringSubmatch(reflogCommit.Name, `^rebase -i \(start\)`); ok { - // if we're here then we must be currently inside an interactive rebase - action = &reflogAction{kind: CURRENT_REBASE, from: prevCommitSha} - } - } else if ok, _ := utils.FindStringSubmatch(reflogCommit.Name, `^rebase -i \(start\)`); ok { - action = &reflogAction{kind: REBASE, from: prevCommitSha, to: rebaseFinishCommitSha} - rebaseFinishCommitSha = "" - } - - if action != nil { - if action.kind != CURRENT_REBASE && action.from == action.to { - // if we're going from one place to the same place we'll ignore the action. - continue - } - ok, err := onUserAction(counter, *action) - if ok { - return err - } - counter-- - } - } - return nil -} - -func (gui *Gui) reflogUndo() error { - undoEnvVars := []string{"GIT_REFLOG_ACTION=[lazygit undo]"} - undoingStatus := gui.Tr.UndoingStatus - - if gui.Git.Status.WorkingTreeState() == enums.REBASE_MODE_REBASING { - return gui.createErrorPanel(gui.Tr.LcCantUndoWhileRebasing) - } - - return gui.parseReflogForActions(func(counter int, action reflogAction) (bool, error) { - if counter != 0 { - return false, nil - } - - switch action.kind { - case COMMIT, REBASE: - gui.logAction(gui.Tr.Actions.Undo) - return true, gui.handleHardResetWithAutoStash(action.from, handleHardResetWithAutoStashOptions{ - EnvVars: undoEnvVars, - WaitingStatus: undoingStatus, - }) - case CHECKOUT: - gui.logAction(gui.Tr.Actions.Undo) - return true, gui.handleCheckoutRef(action.from, handleCheckoutRefOptions{ - EnvVars: undoEnvVars, - WaitingStatus: undoingStatus, - }) - case CURRENT_REBASE: - // do nothing - } - - gui.Log.Error("didn't match on the user action when trying to undo") - return true, nil - }) -} - -func (gui *Gui) reflogRedo() error { - redoEnvVars := []string{"GIT_REFLOG_ACTION=[lazygit redo]"} - redoingStatus := gui.Tr.RedoingStatus - - if gui.Git.Status.WorkingTreeState() == enums.REBASE_MODE_REBASING { - return gui.createErrorPanel(gui.Tr.LcCantRedoWhileRebasing) - } - - return gui.parseReflogForActions(func(counter int, action reflogAction) (bool, error) { - // if we're redoing and the counter is zero, we just return - if counter == 0 { - return true, nil - } else if counter > 1 { - return false, nil - } - - switch action.kind { - case COMMIT, REBASE: - gui.logAction(gui.Tr.Actions.Redo) - return true, gui.handleHardResetWithAutoStash(action.to, handleHardResetWithAutoStashOptions{ - EnvVars: redoEnvVars, - WaitingStatus: redoingStatus, - }) - case CHECKOUT: - gui.logAction(gui.Tr.Actions.Redo) - return true, gui.handleCheckoutRef(action.to, handleCheckoutRefOptions{ - EnvVars: redoEnvVars, - WaitingStatus: redoingStatus, - }) - case CURRENT_REBASE: - // do nothing - } - - gui.Log.Error("didn't match on the user action when trying to redo") - return true, nil - }) -} - -type handleHardResetWithAutoStashOptions struct { - WaitingStatus string - EnvVars []string -} - -// only to be used in the undo flow for now -func (gui *Gui) handleHardResetWithAutoStash(commitSha string, options handleHardResetWithAutoStashOptions) error { - reset := func() error { - if err := gui.resetToRef(commitSha, "hard", options.EnvVars); err != nil { - return gui.surfaceError(err) - } - return nil - } - - // if we have any modified tracked files we need to ask the user if they want us to stash for them - dirtyWorkingTree := len(gui.trackedFiles()) > 0 || len(gui.stagedFiles()) > 0 - if dirtyWorkingTree { - // offer to autostash changes - return gui.ask(askOpts{ - title: gui.Tr.AutoStashTitle, - prompt: gui.Tr.AutoStashPrompt, - handleConfirm: func() error { - return gui.WithWaitingStatus(options.WaitingStatus, func() error { - if err := gui.Git.Stash.Save(gui.Tr.StashPrefix + commitSha); err != nil { - return gui.surfaceError(err) - } - if err := reset(); err != nil { - return err - } - - err := gui.Git.Stash.Pop(0) - if err := gui.refreshSidePanels(refreshOptions{}); err != nil { - return err - } - if err != nil { - return gui.surfaceError(err) - } - return nil - }) - }, - }) - } - - return gui.WithWaitingStatus(options.WaitingStatus, func() error { - return reset() - }) -} diff --git a/pkg/gui/updates.go b/pkg/gui/updates.go index cce723c4f..93231e4f0 100644 --- a/pkg/gui/updates.go +++ b/pkg/gui/updates.go @@ -1,16 +1,22 @@ package gui import ( - "fmt" - "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/gui/types" + "github.com/jesseduffield/lazygit/pkg/utils" ) func (gui *Gui) showUpdatePrompt(newVersion string) error { - return gui.ask(askOpts{ - title: "New version available!", - prompt: fmt.Sprintf("Download version %s? (enter/esc)", newVersion), - handleConfirm: func() error { + message := utils.ResolvePlaceholderString( + gui.Tr.UpdateAvailable, map[string]string{ + "newVersion": newVersion, + }, + ) + + return gui.c.Confirm(types.ConfirmOpts{ + Title: gui.Tr.UpdateAvailableTitle, + Prompt: message, + HandleConfirm: func() error { gui.startUpdating(newVersion) return nil }, @@ -19,10 +25,10 @@ func (gui *Gui) showUpdatePrompt(newVersion string) error { func (gui *Gui) onUserUpdateCheckFinish(newVersion string, err error) error { if err != nil { - return gui.surfaceError(err) + return gui.c.Error(err) } if newVersion == "" { - return gui.createErrorPanel("New version not found") + return gui.c.ErrorMsg(gui.Tr.FailedToRetrieveLatestVersionErr) } return gui.showUpdatePrompt(newVersion) } @@ -30,13 +36,13 @@ func (gui *Gui) onUserUpdateCheckFinish(newVersion string, err error) error { func (gui *Gui) onBackgroundUpdateCheckFinish(newVersion string, err error) error { if err != nil { // ignoring the error for now so that I'm not annoying users - gui.Log.Error(err.Error()) + gui.c.Log.Error(err.Error()) return nil } if newVersion == "" { return nil } - if gui.UserConfig.Update.Method == "background" { + if gui.c.UserConfig.Update.Method == "background" { gui.startUpdating(newVersion) return nil } @@ -45,29 +51,34 @@ func (gui *Gui) onBackgroundUpdateCheckFinish(newVersion string, err error) erro func (gui *Gui) startUpdating(newVersion string) { gui.State.Updating = true - statusId := gui.statusManager.addWaitingStatus("updating") + statusId := gui.statusManager.addWaitingStatus(gui.Tr.UpdateInProgressWaitingStatus) gui.Updater.Update(newVersion, func(err error) error { return gui.onUpdateFinish(statusId, err) }) } func (gui *Gui) onUpdateFinish(statusId int, err error) error { gui.State.Updating = false gui.statusManager.removeStatus(statusId) - gui.OnUIThread(func() error { + gui.c.OnUIThread(func() error { _ = gui.renderString(gui.Views.AppStatus, "") if err != nil { - return gui.createErrorPanel("Update failed: " + err.Error()) + errMessage := utils.ResolvePlaceholderString( + gui.Tr.UpdateFailedErr, map[string]string{ + "errMessage": err.Error(), + }, + ) + return gui.c.ErrorMsg(errMessage) } - return nil + return gui.c.Alert(gui.Tr.UpdateCompletedTitle, gui.Tr.UpdateCompleted) }) return nil } func (gui *Gui) createUpdateQuitConfirmation() error { - return gui.ask(askOpts{ - title: "Currently Updating", - prompt: "An update is in progress. Are you sure you want to quit?", - handleConfirm: func() error { + return gui.c.Confirm(types.ConfirmOpts{ + Title: gui.Tr.ConfirmQuitDuringUpdateTitle, + Prompt: gui.Tr.ConfirmQuitDuringUpdate, + HandleConfirm: func() error { return gocui.ErrQuit }, }) diff --git a/pkg/gui/view_helpers.go b/pkg/gui/view_helpers.go index 300571ad3..40bc2fa02 100644 --- a/pkg/gui/view_helpers.go +++ b/pkg/gui/view_helpers.go @@ -2,197 +2,14 @@ package gui import ( "fmt" - "sort" - "strings" - "sync" "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/gui/keybindings" + "github.com/jesseduffield/lazygit/pkg/gui/types" "github.com/jesseduffield/lazygit/pkg/utils" "github.com/spkg/bom" ) -func (gui *Gui) getCyclableWindows() []string { - return []string{"status", "files", "branches", "commits", "stash"} -} - -// models/views that we can refresh -type RefreshableView int - -const ( - COMMITS RefreshableView = iota - BRANCHES - FILES - STASH - REFLOG - TAGS - REMOTES - STATUS - SUBMODULES - // not actually a view. Will refactor this later - BISECT_INFO -) - -func getScopeNames(scopes []RefreshableView) []string { - scopeNameMap := map[RefreshableView]string{ - COMMITS: "commits", - BRANCHES: "branches", - FILES: "files", - SUBMODULES: "submodules", - STASH: "stash", - REFLOG: "reflog", - TAGS: "tags", - REMOTES: "remotes", - STATUS: "status", - } - - scopeNames := make([]string, len(scopes)) - for i, scope := range scopes { - scopeNames[i] = scopeNameMap[scope] - } - - return scopeNames -} - -func getModeName(mode RefreshMode) string { - switch mode { - case SYNC: - return "sync" - case ASYNC: - return "async" - case BLOCK_UI: - return "block-ui" - default: - return "unknown mode" - } -} - -type RefreshMode int - -const ( - SYNC RefreshMode = iota // wait until everything is done before returning - ASYNC // return immediately, allowing each independent thing to update itself - BLOCK_UI // wrap code in an update call to ensure UI updates all at once and keybindings aren't executed till complete -) - -type refreshOptions struct { - then func() - scope []RefreshableView // e.g. []int{COMMITS, BRANCHES}. Leave empty to refresh everything - mode RefreshMode // one of SYNC (default), ASYNC, and BLOCK_UI -} - -func arrToMap(arr []RefreshableView) map[RefreshableView]bool { - output := map[RefreshableView]bool{} - for _, el := range arr { - output[el] = true - } - return output -} - -func (gui *Gui) refreshSidePanels(options refreshOptions) error { - if options.scope == nil { - gui.Log.Infof( - "refreshing all scopes in %s mode", - getModeName(options.mode), - ) - } else { - gui.Log.Infof( - "refreshing the following scopes in %s mode: %s", - getModeName(options.mode), - strings.Join(getScopeNames(options.scope), ","), - ) - } - - wg := sync.WaitGroup{} - - f := func() { - var scopeMap map[RefreshableView]bool - if len(options.scope) == 0 { - scopeMap = arrToMap([]RefreshableView{COMMITS, BRANCHES, FILES, STASH, REFLOG, TAGS, REMOTES, STATUS, BISECT_INFO}) - } else { - scopeMap = arrToMap(options.scope) - } - - if scopeMap[COMMITS] || scopeMap[BRANCHES] || scopeMap[REFLOG] || scopeMap[BISECT_INFO] { - wg.Add(1) - func() { - if options.mode == ASYNC { - go utils.Safe(func() { gui.refreshCommits() }) - } else { - gui.refreshCommits() - } - wg.Done() - }() - } - - if scopeMap[FILES] || scopeMap[SUBMODULES] { - wg.Add(1) - func() { - if options.mode == ASYNC { - go utils.Safe(func() { _ = gui.refreshFilesAndSubmodules() }) - } else { - _ = gui.refreshFilesAndSubmodules() - } - wg.Done() - }() - } - - if scopeMap[STASH] { - wg.Add(1) - func() { - if options.mode == ASYNC { - go utils.Safe(func() { _ = gui.refreshStashEntries() }) - } else { - _ = gui.refreshStashEntries() - } - wg.Done() - }() - } - - if scopeMap[TAGS] { - wg.Add(1) - func() { - if options.mode == ASYNC { - go utils.Safe(func() { _ = gui.refreshTags() }) - } else { - _ = gui.refreshTags() - } - wg.Done() - }() - } - - if scopeMap[REMOTES] { - wg.Add(1) - func() { - if options.mode == ASYNC { - go utils.Safe(func() { _ = gui.refreshRemotes() }) - } else { - _ = gui.refreshRemotes() - } - wg.Done() - }() - } - - wg.Wait() - - gui.refreshStatus() - - if options.then != nil { - options.then() - } - } - - if options.mode == BLOCK_UI { - gui.OnUIThread(func() error { - f() - return nil - }) - } else { - f() - } - - return nil -} - func (gui *Gui) resetOrigin(v *gocui.View) error { _ = v.SetCursor(0, 0) return v.SetOrigin(0, 0) @@ -219,19 +36,6 @@ func (gui *Gui) renderString(view *gocui.View, s string) error { return nil } -func (gui *Gui) optionsMapToString(optionsMap map[string]string) string { - optionsArray := make([]string, 0) - for key, description := range optionsMap { - optionsArray = append(optionsArray, key+": "+description) - } - sort.Strings(optionsArray) - return strings.Join(optionsArray, ", ") -} - -func (gui *Gui) renderOptionsMap(optionsMap map[string]string) { - _ = gui.renderString(gui.Views.Options, gui.optionsMapToString(optionsMap)) -} - func (gui *Gui) currentViewName() string { currentView := gui.g.CurrentView() if currentView == nil { @@ -245,131 +49,140 @@ func (gui *Gui) resizeCurrentPopupPanel() error { if v == nil { return nil } - if gui.isPopupPanel(v.Name()) { + + if v == gui.Views.Menu { + gui.resizeMenu() + } else if v == gui.Views.Confirmation || v == gui.Views.Suggestions { + gui.resizeConfirmationPanel() + } else if gui.isPopupPanel(v.Name()) { return gui.resizePopupPanel(v, v.Buffer()) } + return nil } func (gui *Gui) resizePopupPanel(v *gocui.View, content string) error { - // If the confirmation panel is already displayed, just resize the width, - // otherwise continue x0, y0, x1, y1 := gui.getConfirmationPanelDimensions(v.Wrap, content) - vx0, vy0, vx1, vy1 := v.Dimensions() - if vx0 == x0 && vy0 == y0 && vx1 == x1 && vy1 == y1 { - return nil - } _, err := gui.g.SetView(v.Name(), x0, y0, x1, y1, 0) return err } -func (gui *Gui) changeSelectedLine(panelState IListPanelState, total int, change int) { - // TODO: find out why we're doing this - line := panelState.GetSelectedLineIdx() +func (gui *Gui) resizeMenu() { + itemCount := gui.State.Contexts.Menu.GetList().Len() + offset := 3 + panelWidth := gui.getConfirmationPanelWidth() + x0, y0, x1, y1 := gui.getConfirmationPanelDimensionsForContentHeight(panelWidth, itemCount+offset) + menuBottom := y1 - offset + _, _ = gui.g.SetView(gui.Views.Menu.Name(), x0, y0, x1, menuBottom, 0) - if line == -1 { - return - } - var newLine int - if line+change < 0 { - newLine = 0 - } else if line+change >= total { - newLine = total - 1 - } else { - newLine = line + change - } - - panelState.SetSelectedLineIdx(newLine) + tooltipTop := menuBottom + 1 + tooltipHeight := gui.getMessageHeight(true, gui.State.Contexts.Menu.GetSelected().Tooltip, panelWidth) + 2 // plus 2 for the frame + _, _ = gui.g.SetView(gui.Views.Tooltip.Name(), x0, tooltipTop, x1, tooltipTop+tooltipHeight-1, 0) } -func (gui *Gui) refreshSelectedLine(panelState IListPanelState, total int) { - line := panelState.GetSelectedLineIdx() - - if line == -1 && total > 0 { - panelState.SetSelectedLineIdx(0) - } else if total-1 < line { - panelState.SetSelectedLineIdx(total - 1) +func (gui *Gui) resizeConfirmationPanel() { + suggestionsViewHeight := 0 + if gui.Views.Suggestions.Visible { + suggestionsViewHeight = 11 } -} + panelWidth := gui.getConfirmationPanelWidth() + prompt := gui.Views.Confirmation.Buffer() + panelHeight := gui.getMessageHeight(true, prompt, panelWidth) + suggestionsViewHeight + x0, y0, x1, y1 := gui.getConfirmationPanelDimensionsAux(panelWidth, panelHeight) + confirmationViewBottom := y1 - suggestionsViewHeight + _, _ = gui.g.SetView(gui.Views.Confirmation.Name(), x0, y0, x1, confirmationViewBottom, 0) -func (gui *Gui) renderDisplayStrings(v *gocui.View, displayStrings [][]string) { - list := utils.RenderDisplayStrings(displayStrings) - v.SetContent(list) -} - -func (gui *Gui) renderDisplayStringsAtPos(v *gocui.View, y int, displayStrings [][]string) { - list := utils.RenderDisplayStrings(displayStrings) - v.OverwriteLines(y, list) + suggestionsViewTop := confirmationViewBottom + 1 + _, _ = gui.g.SetView(gui.Views.Suggestions.Name(), x0, suggestionsViewTop, x1, suggestionsViewTop+suggestionsViewHeight, 0) } func (gui *Gui) globalOptionsMap() map[string]string { - keybindingConfig := gui.UserConfig.Keybinding + keybindingConfig := gui.c.UserConfig.Keybinding return map[string]string{ - fmt.Sprintf("%s/%s", gui.getKeyDisplay(keybindingConfig.Universal.ScrollUpMain), gui.getKeyDisplay(keybindingConfig.Universal.ScrollDownMain)): gui.Tr.LcScroll, - fmt.Sprintf("%s %s %s %s", gui.getKeyDisplay(keybindingConfig.Universal.PrevBlock), gui.getKeyDisplay(keybindingConfig.Universal.NextBlock), gui.getKeyDisplay(keybindingConfig.Universal.PrevItem), gui.getKeyDisplay(keybindingConfig.Universal.NextItem)): gui.Tr.LcNavigate, - gui.getKeyDisplay(keybindingConfig.Universal.Return): gui.Tr.LcCancel, - gui.getKeyDisplay(keybindingConfig.Universal.Quit): gui.Tr.LcQuit, - gui.getKeyDisplay(keybindingConfig.Universal.OptionMenu): gui.Tr.LcMenu, - fmt.Sprintf("%s-%s", gui.getKeyDisplay(keybindingConfig.Universal.JumpToBlock[0]), gui.getKeyDisplay(keybindingConfig.Universal.JumpToBlock[len(keybindingConfig.Universal.JumpToBlock)-1])): gui.Tr.LcJump, - fmt.Sprintf("%s/%s", gui.getKeyDisplay(keybindingConfig.Universal.ScrollLeft), gui.getKeyDisplay(keybindingConfig.Universal.ScrollRight)): gui.Tr.LcScrollLeftRight, + fmt.Sprintf("%s/%s", keybindings.Label(keybindingConfig.Universal.ScrollUpMain), keybindings.Label(keybindingConfig.Universal.ScrollDownMain)): gui.c.Tr.LcScroll, + fmt.Sprintf("%s %s %s %s", keybindings.Label(keybindingConfig.Universal.PrevBlock), keybindings.Label(keybindingConfig.Universal.NextBlock), keybindings.Label(keybindingConfig.Universal.PrevItem), keybindings.Label(keybindingConfig.Universal.NextItem)): gui.c.Tr.LcNavigate, + keybindings.Label(keybindingConfig.Universal.Return): gui.c.Tr.LcCancel, + keybindings.Label(keybindingConfig.Universal.Quit): gui.c.Tr.LcQuit, + keybindings.Label(keybindingConfig.Universal.OptionMenu): gui.c.Tr.LcMenu, + fmt.Sprintf("%s-%s", keybindings.Label(keybindingConfig.Universal.JumpToBlock[0]), keybindings.Label(keybindingConfig.Universal.JumpToBlock[len(keybindingConfig.Universal.JumpToBlock)-1])): gui.c.Tr.LcJump, + fmt.Sprintf("%s/%s", keybindings.Label(keybindingConfig.Universal.ScrollLeft), keybindings.Label(keybindingConfig.Universal.ScrollRight)): gui.c.Tr.LcScrollLeftRight, } } func (gui *Gui) isPopupPanel(viewName string) bool { - return viewName == "commitMessage" || viewName == "credentials" || viewName == "confirmation" || viewName == "menu" + return viewName == "commitMessage" || viewName == "confirmation" || viewName == "menu" } func (gui *Gui) popupPanelFocused() bool { return gui.isPopupPanel(gui.currentViewName()) } -// secondaryViewFocused tells us whether it appears that the secondary view is focused. The view is actually never focused for real: we just swap the main and secondary views and then you're still focused on the main view so that we can give you access to all its keybindings for free. I will probably regret this design decision soon enough. -func (gui *Gui) secondaryViewFocused() bool { - state := gui.State.Panels.LineByLine - return state != nil && state.SecondaryFocused +func (gui *Gui) onViewTabClick(windowName string, tabIndex int) error { + tabs := gui.viewTabMap()[windowName] + if len(tabs) == 0 { + return nil + } + + viewName := tabs[tabIndex].ViewName + + context, ok := gui.contextForView(viewName) + if !ok { + return nil + } + + return gui.c.PushContext(context) } -func (gui *Gui) onViewTabClick(viewName string, tabIndex int) error { - context := gui.State.ViewTabContextMap[viewName][tabIndex].contexts[0] +func (gui *Gui) contextForView(viewName string) (types.Context, bool) { + view, err := gui.g.View(viewName) + if err != nil { + return nil, false + } - return gui.pushContext(context) + for _, context := range gui.State.Contexts.Flatten() { + if context.GetViewName() == view.Name() { + return context, true + } + } + + return nil, false } func (gui *Gui) handleNextTab() error { - v := getTabbedView(gui) - if v == nil { + view := getTabbedView(gui) + if view == nil { return nil } - return gui.onViewTabClick( - v.Name(), - utils.ModuloWithWrap(v.TabIndex+1, len(v.Tabs)), - ) + for _, context := range gui.State.Contexts.Flatten() { + if context.GetViewName() == view.Name() { + return gui.onViewTabClick( + context.GetWindowName(), + utils.ModuloWithWrap(view.TabIndex+1, len(view.Tabs)), + ) + } + } + + return nil } func (gui *Gui) handlePrevTab() error { - v := getTabbedView(gui) - if v == nil { + view := getTabbedView(gui) + if view == nil { return nil } - return gui.onViewTabClick( - v.Name(), - utils.ModuloWithWrap(v.TabIndex-1, len(v.Tabs)), - ) -} - -// this is the distance we will move the cursor when paging up or down in a view -func (gui *Gui) pageDelta(view *gocui.View) int { - _, height := view.Size() - - delta := height - 1 - if delta == 0 { - return 1 + for _, context := range gui.State.Contexts.Flatten() { + if context.GetViewName() == view.Name() { + return gui.onViewTabClick( + context.GetWindowName(), + utils.ModuloWithWrap(view.TabIndex-1, len(view.Tabs)), + ) + } } - return delta + return nil } func getTabbedView(gui *Gui) *gocui.View { @@ -380,5 +193,5 @@ func getTabbedView(gui *Gui) *gocui.View { } func (gui *Gui) render() { - gui.OnUIThread(func() error { return nil }) + gui.c.OnUIThread(func() error { return nil }) } diff --git a/pkg/gui/views.go b/pkg/gui/views.go new file mode 100644 index 000000000..9cc3d983f --- /dev/null +++ b/pkg/gui/views.go @@ -0,0 +1,224 @@ +package gui + +import ( + "github.com/jesseduffield/generics/slices" + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/theme" +) + +type Views struct { + Status *gocui.View + Submodules *gocui.View + Files *gocui.View + Branches *gocui.View + Remotes *gocui.View + Tags *gocui.View + RemoteBranches *gocui.View + ReflogCommits *gocui.View + Commits *gocui.View + Stash *gocui.View + + Main *gocui.View + Secondary *gocui.View + Staging *gocui.View + StagingSecondary *gocui.View + PatchBuilding *gocui.View + PatchBuildingSecondary *gocui.View + MergeConflicts *gocui.View + + Options *gocui.View + Confirmation *gocui.View + Menu *gocui.View + CommitMessage *gocui.View + CommitFiles *gocui.View + SubCommits *gocui.View + Information *gocui.View + AppStatus *gocui.View + Search *gocui.View + SearchPrefix *gocui.View + Limit *gocui.View + Suggestions *gocui.View + Tooltip *gocui.View + Extras *gocui.View +} + +type viewNameMapping struct { + viewPtr **gocui.View + name string +} + +func (gui *Gui) orderedViews() []*gocui.View { + return slices.Map(gui.orderedViewNameMappings(), func(v viewNameMapping) *gocui.View { + return *v.viewPtr + }) +} + +func (gui *Gui) orderedViewNameMappings() []viewNameMapping { + return []viewNameMapping{ + // first layer. Ordering within this layer does not matter because there are + // no overlapping views + {viewPtr: &gui.Views.Status, name: "status"}, + {viewPtr: &gui.Views.Submodules, name: "submodules"}, + {viewPtr: &gui.Views.Files, name: "files"}, + {viewPtr: &gui.Views.Tags, name: "tags"}, + {viewPtr: &gui.Views.Remotes, name: "remotes"}, + {viewPtr: &gui.Views.Branches, name: "localBranches"}, + {viewPtr: &gui.Views.RemoteBranches, name: "remoteBranches"}, + {viewPtr: &gui.Views.ReflogCommits, name: "reflogCommits"}, + {viewPtr: &gui.Views.Commits, name: "commits"}, + {viewPtr: &gui.Views.Stash, name: "stash"}, + {viewPtr: &gui.Views.SubCommits, name: "subCommits"}, + {viewPtr: &gui.Views.CommitFiles, name: "commitFiles"}, + + {viewPtr: &gui.Views.Staging, name: "staging"}, + {viewPtr: &gui.Views.StagingSecondary, name: "stagingSecondary"}, + {viewPtr: &gui.Views.PatchBuilding, name: "patchBuilding"}, + {viewPtr: &gui.Views.PatchBuildingSecondary, name: "patchBuildingSecondary"}, + {viewPtr: &gui.Views.MergeConflicts, name: "mergeConflicts"}, + {viewPtr: &gui.Views.Secondary, name: "secondary"}, + {viewPtr: &gui.Views.Main, name: "main"}, + + {viewPtr: &gui.Views.Extras, name: "extras"}, + + // bottom line + {viewPtr: &gui.Views.Options, name: "options"}, + {viewPtr: &gui.Views.AppStatus, name: "appStatus"}, + {viewPtr: &gui.Views.Information, name: "information"}, + {viewPtr: &gui.Views.Search, name: "search"}, + // this view takes up one character. Its only purpose is to show the slash when searching + {viewPtr: &gui.Views.SearchPrefix, name: "searchPrefix"}, + + // popups. + {viewPtr: &gui.Views.CommitMessage, name: "commitMessage"}, + {viewPtr: &gui.Views.Menu, name: "menu"}, + {viewPtr: &gui.Views.Suggestions, name: "suggestions"}, + {viewPtr: &gui.Views.Confirmation, name: "confirmation"}, + {viewPtr: &gui.Views.Tooltip, name: "tooltip"}, + + // this guy will cover everything else when it appears + {viewPtr: &gui.Views.Limit, name: "limit"}, + } +} + +func (gui *Gui) windowForView(viewName string) string { + context, ok := gui.contextForView(viewName) + if !ok { + panic("todo: deal with this") + } + + return context.GetWindowName() +} + +func (gui *Gui) createAllViews() error { + var err error + for _, mapping := range gui.orderedViewNameMappings() { + *mapping.viewPtr, err = gui.prepareView(mapping.name) + if err != nil && err.Error() != UNKNOWN_VIEW_ERROR_MSG { + return err + } + } + + gui.Views.Options.FgColor = theme.OptionsColor + gui.Views.Options.Frame = false + + gui.Views.SearchPrefix.BgColor = gocui.ColorDefault + gui.Views.SearchPrefix.FgColor = gocui.ColorGreen + gui.Views.SearchPrefix.Frame = false + gui.setViewContent(gui.Views.SearchPrefix, SEARCH_PREFIX) + + gui.Views.Stash.Title = gui.c.Tr.StashTitle + gui.Views.Stash.FgColor = theme.GocuiDefaultTextColor + + gui.Views.Commits.Title = gui.c.Tr.CommitsTitle + gui.Views.Commits.FgColor = theme.GocuiDefaultTextColor + + gui.Views.CommitFiles.Title = gui.c.Tr.CommitFiles + gui.Views.CommitFiles.FgColor = theme.GocuiDefaultTextColor + + gui.Views.SubCommits.FgColor = theme.GocuiDefaultTextColor + + gui.Views.Branches.Title = gui.c.Tr.BranchesTitle + gui.Views.Branches.FgColor = theme.GocuiDefaultTextColor + + gui.Views.Remotes.Title = gui.c.Tr.RemotesTitle + gui.Views.Remotes.FgColor = theme.GocuiDefaultTextColor + + gui.Views.Tags.Title = gui.c.Tr.TagsTitle + gui.Views.Tags.FgColor = theme.GocuiDefaultTextColor + + gui.Views.RemoteBranches.FgColor = theme.GocuiDefaultTextColor + + gui.Views.Files.Title = gui.c.Tr.FilesTitle + gui.Views.Files.FgColor = theme.GocuiDefaultTextColor + + for _, view := range []*gocui.View{gui.Views.Main, gui.Views.Secondary, gui.Views.Staging, gui.Views.StagingSecondary, gui.Views.PatchBuilding, gui.Views.PatchBuildingSecondary, gui.Views.MergeConflicts} { + view.Title = gui.c.Tr.DiffTitle + view.Wrap = true + view.FgColor = theme.GocuiDefaultTextColor + view.IgnoreCarriageReturns = true + view.CanScrollPastBottom = gui.c.UserConfig.Gui.ScrollPastBottom + } + + gui.Views.Staging.Title = gui.c.Tr.UnstagedChanges + gui.Views.Staging.Highlight = true + gui.Views.Staging.Wrap = true + + gui.Views.StagingSecondary.Title = gui.c.Tr.StagedChanges + gui.Views.StagingSecondary.Highlight = true + gui.Views.StagingSecondary.Wrap = true + + gui.Views.PatchBuilding.Title = gui.Tr.Patch + gui.Views.PatchBuilding.Highlight = true + gui.Views.PatchBuilding.Wrap = true + + gui.Views.PatchBuildingSecondary.Title = gui.Tr.CustomPatch + gui.Views.PatchBuildingSecondary.Highlight = true + gui.Views.PatchBuildingSecondary.Wrap = true + + gui.Views.MergeConflicts.Title = gui.c.Tr.MergeConflictsTitle + gui.Views.MergeConflicts.Highlight = true + gui.Views.MergeConflicts.Wrap = false + + gui.Views.Limit.Title = gui.c.Tr.NotEnoughSpace + gui.Views.Limit.Wrap = true + + gui.Views.Status.Title = gui.c.Tr.StatusTitle + gui.Views.Status.FgColor = theme.GocuiDefaultTextColor + + gui.Views.Search.BgColor = gocui.ColorDefault + gui.Views.Search.FgColor = gocui.ColorGreen + gui.Views.Search.Editable = true + gui.Views.Search.Frame = false + + gui.Views.AppStatus.BgColor = gocui.ColorDefault + gui.Views.AppStatus.FgColor = gocui.ColorCyan + gui.Views.AppStatus.Visible = false + gui.Views.AppStatus.Frame = false + + gui.Views.CommitMessage.Visible = false + gui.Views.CommitMessage.Title = gui.c.Tr.CommitMessage + gui.Views.CommitMessage.FgColor = theme.GocuiDefaultTextColor + gui.Views.CommitMessage.Editable = true + gui.Views.CommitMessage.Editor = gocui.EditorFunc(gui.commitMessageEditor) + + gui.Views.Confirmation.Visible = false + + gui.Views.Suggestions.Visible = false + + gui.Views.Tooltip.FgColor = theme.GocuiDefaultTextColor + + gui.Views.Menu.Visible = false + + gui.Views.Tooltip.Visible = false + + gui.Views.Information.BgColor = gocui.ColorDefault + gui.Views.Information.FgColor = gocui.ColorGreen + gui.Views.Information.Frame = false + + gui.Views.Extras.Title = gui.c.Tr.CommandLog + gui.Views.Extras.FgColor = theme.GocuiDefaultTextColor + gui.Views.Extras.Autoscroll = true + gui.Views.Extras.Wrap = true + + return nil +} diff --git a/pkg/gui/whitespace-toggle.go b/pkg/gui/whitespace-toggle.go index e7df9d879..ad82bc036 100644 --- a/pkg/gui/whitespace-toggle.go +++ b/pkg/gui/whitespace-toggle.go @@ -1,13 +1,13 @@ package gui func (gui *Gui) toggleWhitespaceInDiffView() error { - gui.State.IgnoreWhitespaceInDiffView = !gui.State.IgnoreWhitespaceInDiffView + gui.IgnoreWhitespaceInDiffView = !gui.IgnoreWhitespaceInDiffView - toastMessage := gui.Tr.ShowingWhitespaceInDiffView - if gui.State.IgnoreWhitespaceInDiffView { - toastMessage = gui.Tr.IgnoringWhitespaceInDiffView + toastMessage := gui.c.Tr.ShowingWhitespaceInDiffView + if gui.IgnoreWhitespaceInDiffView { + toastMessage = gui.c.Tr.IgnoringWhitespaceInDiffView } - gui.raiseToast(toastMessage) + gui.c.Toast(toastMessage) return gui.refreshFilesAndSubmodules() } diff --git a/pkg/gui/window.go b/pkg/gui/window.go index 3dccde7e7..efee847e1 100644 --- a/pkg/gui/window.go +++ b/pkg/gui/window.go @@ -1,6 +1,12 @@ package gui -import "github.com/jesseduffield/gocui" +import ( + "fmt" + + "github.com/jesseduffield/lazygit/pkg/gui/context" + "github.com/jesseduffield/lazygit/pkg/gui/types" + "github.com/samber/lo" +) // A window refers to a place on the screen which can hold one or more views. // A view is a box that renders content, and within a window only one view will @@ -8,37 +14,93 @@ import "github.com/jesseduffield/gocui" // space. Right now most windows are 1:1 with views, except for commitFiles which // is a view that moves between windows +func (gui *Gui) initialWindowViewNameMap(contextTree *context.ContextTree) map[string]string { + result := map[string]string{} + + for _, context := range contextTree.Flatten() { + result[context.GetWindowName()] = context.GetViewName() + } + + return result +} + func (gui *Gui) getViewNameForWindow(window string) string { viewName, ok := gui.State.WindowViewNameMap[window] if !ok { - return window + panic(fmt.Sprintf("Viewname not found for window: %s", window)) } return viewName } -func (gui *Gui) getWindowForView(view *gocui.View) string { - if view == gui.Views.CommitFiles { - return gui.State.Contexts.CommitFiles.GetWindowName() +func (gui *Gui) getContextForWindow(window string) types.Context { + viewName := gui.getViewNameForWindow(window) + + context, ok := gui.contextForView(viewName) + if !ok { + panic("TODO: fix this") } - return view.Name() + return context } -func (gui *Gui) setViewAsActiveForWindow(view *gocui.View) { - if gui.State.WindowViewNameMap == nil { - gui.State.WindowViewNameMap = map[string]string{} +// for now all we actually care about is the context's view so we're storing that +func (gui *Gui) setWindowContext(c types.Context) { + if c.IsTransient() { + gui.resetWindowContext(c) } - gui.State.WindowViewNameMap[gui.getWindowForView(view)] = view.Name() + gui.State.WindowViewNameMap[c.GetWindowName()] = c.GetViewName() } func (gui *Gui) currentWindow() string { - return gui.getWindowForView(gui.g.CurrentView()) + return gui.currentContext().GetWindowName() } -func (gui *Gui) resetWindowForView(view *gocui.View) { - window := gui.getWindowForView(view) - // we assume here that the window contains as its default view a view with the same name as the window - gui.State.WindowViewNameMap[window] = window +// assumes the context's windowName has been set to the new window if necessary +func (gui *Gui) resetWindowContext(c types.Context) { + for windowName, viewName := range gui.State.WindowViewNameMap { + if viewName == c.GetViewName() && windowName != c.GetWindowName() { + for _, context := range gui.State.Contexts.Flatten() { + if context.GetKey() != c.GetKey() && context.GetWindowName() == windowName { + gui.State.WindowViewNameMap[windowName] = context.GetViewName() + } + } + } + } +} + +func (gui *Gui) moveToTopOfWindow(context types.Context) { + view := context.GetView() + if view == nil { + return + } + + window := context.GetWindowName() + + // now I need to find all views in that same window, via contexts. And I guess then I need to find the index of the highest view in that list. + viewNamesInWindow := gui.viewNamesInWindow(window) + + // The views list is ordered highest-last, so we're grabbing the last view of the window + topView := view + for _, currentView := range gui.g.Views() { + if lo.Contains(viewNamesInWindow, currentView.Name()) { + topView = currentView + } + } + + if err := gui.g.SetViewOnTopOf(view.Name(), topView.Name()); err != nil { + gui.Log.Error(err) + } +} + +func (gui *Gui) viewNamesInWindow(windowName string) []string { + result := []string{} + for _, context := range gui.State.Contexts.Flatten() { + if context.GetWindowName() == windowName { + result = append(result, context.GetViewName()) + } + } + + return result } diff --git a/pkg/gui/workspace_reset_options_panel.go b/pkg/gui/workspace_reset_options_panel.go deleted file mode 100644 index ba2df22e6..000000000 --- a/pkg/gui/workspace_reset_options_panel.go +++ /dev/null @@ -1,105 +0,0 @@ -package gui - -import ( - "fmt" - - "github.com/jesseduffield/lazygit/pkg/gui/style" -) - -func (gui *Gui) handleCreateResetMenu() error { - red := style.FgRed - - nukeStr := "reset --hard HEAD && git clean -fd" - if len(gui.State.Submodules) > 0 { - nukeStr = fmt.Sprintf("%s (%s)", nukeStr, gui.Tr.LcAndResetSubmodules) - } - - menuItems := []*menuItem{ - { - displayStrings: []string{ - gui.Tr.LcDiscardAllChangesToAllFiles, - red.Sprint(nukeStr), - }, - onPress: func() error { - gui.logAction(gui.Tr.Actions.NukeWorkingTree) - if err := gui.Git.WorkingTree.ResetAndClean(); err != nil { - return gui.surfaceError(err) - } - - return gui.refreshSidePanels(refreshOptions{mode: ASYNC, scope: []RefreshableView{FILES}}) - }, - }, - { - displayStrings: []string{ - gui.Tr.LcDiscardAnyUnstagedChanges, - red.Sprint("git checkout -- ."), - }, - onPress: func() error { - gui.logAction(gui.Tr.Actions.DiscardUnstagedFileChanges) - if err := gui.Git.WorkingTree.DiscardAnyUnstagedFileChanges(); err != nil { - return gui.surfaceError(err) - } - - return gui.refreshSidePanels(refreshOptions{mode: ASYNC, scope: []RefreshableView{FILES}}) - }, - }, - { - displayStrings: []string{ - gui.Tr.LcDiscardUntrackedFiles, - red.Sprint("git clean -fd"), - }, - onPress: func() error { - gui.logAction(gui.Tr.Actions.RemoveUntrackedFiles) - if err := gui.Git.WorkingTree.RemoveUntrackedFiles(); err != nil { - return gui.surfaceError(err) - } - - return gui.refreshSidePanels(refreshOptions{mode: ASYNC, scope: []RefreshableView{FILES}}) - }, - }, - { - displayStrings: []string{ - gui.Tr.LcSoftReset, - red.Sprint("git reset --soft HEAD"), - }, - onPress: func() error { - gui.logAction(gui.Tr.Actions.SoftReset) - if err := gui.Git.WorkingTree.ResetSoft("HEAD"); err != nil { - return gui.surfaceError(err) - } - - return gui.refreshSidePanels(refreshOptions{mode: ASYNC, scope: []RefreshableView{FILES}}) - }, - }, - { - displayStrings: []string{ - "mixed reset", - red.Sprint("git reset --mixed HEAD"), - }, - onPress: func() error { - gui.logAction(gui.Tr.Actions.MixedReset) - if err := gui.Git.WorkingTree.ResetMixed("HEAD"); err != nil { - return gui.surfaceError(err) - } - - return gui.refreshSidePanels(refreshOptions{mode: ASYNC, scope: []RefreshableView{FILES}}) - }, - }, - { - displayStrings: []string{ - gui.Tr.LcHardReset, - red.Sprint("git reset --hard HEAD"), - }, - onPress: func() error { - gui.logAction(gui.Tr.Actions.HardReset) - if err := gui.Git.WorkingTree.ResetHard("HEAD"); err != nil { - return gui.surfaceError(err) - } - - return gui.refreshSidePanels(refreshOptions{mode: ASYNC, scope: []RefreshableView{FILES}}) - }, - }, - } - - return gui.createMenu("", menuItems, createMenuOptions{showCancel: true}) -} diff --git a/pkg/i18n/chinese.go b/pkg/i18n/chinese.go index 580a08205..66e895359 100644 --- a/pkg/i18n/chinese.go +++ b/pkg/i18n/chinese.go @@ -1,33 +1,38 @@ +/* + +本翻译文件中的词语的翻译参č€äş† https://github.com/progit/progit2-zh/blob/master/TRANSLATION_NOTES.asc。 +下方的术语对照表ćŻĺŻąĺ…¶çš„čˇĄĺ……ă€‚ + +Translation in this file refer to https://github.com/progit/progit2-zh/blob/master/TRANSLATION_NOTES.asc. +Glossary below is a supplement of that documentation. + +Glossary 术语对照表 + +change 更改 +fixup 修正 +reset 重置 + +*/ + package i18n -// 本翻译文件中的词语的翻译参č€äş† https://github.com/progit/progit2-zh/blob/master/TRANSLATION_NOTES.asc。 -// 下方的术语对照表ćŻĺŻąĺ…¶çš„čˇĄĺ…… - -// Translation in this file refer to https://github.com/progit/progit2-zh/blob/master/TRANSLATION_NOTES.asc. -// Glossary below is a supplement of that documentation. - -// Glossary 术语对照表 - -// change 更改 -// fixup 修正 -// reset 重置 - const chineseIntroPopupMessage = ` -感谢使用 lazygitďĽä¸‹éť˘ĺ‡ ç‚ąä˝ ĺŹŻč˝äĽšć„źĺ…´č¶ŁďĽš +感谢使用 lazygitďĽä˝ çśźçš„太棒了。下面几点你可č˝äĽšć„źĺ…´č¶ŁďĽš 1) 观看此视频,快速了解 lazygit 的功č˝ďĽš https://youtu.be/CPLdltN7wgE - 2) č®°ĺľ—é…读最新的发行说ćŽďĽš + 2) 记得看看最新发行说ćŽďĽš https://github.com/jesseduffield/lazygit/releases - 3) 使用 git 说ćŽä˝ ćŻä¸€ä˝Ťç¨‹ĺşŹĺ‘ďĽä˝ ĺŹŻä»Ąĺ’Ść‘们一起让 - lazygit ĺŹĺľ—更好。č€č™‘贡献一些代ç ďĽš + 3) 使用 git 说ćŽä˝ ćŻä¸€ä˝Ťç¨‹ĺşŹĺ‘ďĽä˝ ĺŹŻä»Ąĺ’Ść‘们一起让 lazygit ĺŹĺľ—更好。 + č€č™‘为本项目ĺšäş›č´ˇçŚ®ĺ§ďĽš https://github.com/jesseduffield/lazygit - 也可以赞助并告诉ć‘哪里需č¦ć”ąčż›ďĽŚç‚ąĺŹłä¸‹č§’çš„ćŤčµ ćŚ‰é’®ĺ°±ĺĄ˝äş†ă€‚ - 就算给仓库点个ćźćźäąźĺľćŁ’ďĽ + 你也可以直接赞助,并告诉ć‘哪里需č¦ć”ąčż›ďĽŚç‚ąĺŹłä¸‹č§’çš„ćŤčµ ćŚ‰é’®ĺ°±ĺĄ˝äş†ă€‚ + 哪怕只ćŻç»™ä»“库点个ćźćźäąźĺľćŁ’ďĽ ` +// exporting this so we can use it in tests func chineseTranslationSet() TranslationSet { return TranslationSet{ NotEnoughSpace: "没有足够的空间来渲染面板", @@ -40,7 +45,7 @@ func chineseTranslationSet() TranslationSet { StagedChanges: `已暂ĺ­ć›´ć”ą`, MainTitle: "主č¦", StagingTitle: "正在暂ĺ­", - MergingTitle: "ĺ并中", + MergingTitle: "正在ĺĺą¶", NormalTitle: "正常", CommitMessage: "ćŹäş¤äżˇćŻ", CredentialsUsername: "用ć·ĺŤ", @@ -49,6 +54,7 @@ func chineseTranslationSet() TranslationSet { PassUnameWrong: "ĺŻ†ç  ĺ’Ś/ć– ç”¨ć·ĺŤé”™čŻŻ", CommitChanges: "ćŹäş¤ć›´ć”ą", AmendLastCommit: "修补最ĺŽä¸€ć¬ˇćŹäş¤", + AmendLastCommitTitle: "修补最ĺŽä¸€ć¬ˇćŹäş¤", SureToAmend: "您确定č¦äż®čˇĄä¸Šä¸€ć¬ˇćŹäş¤ĺ—?之ĺŽć‚¨ĺŹŻä»Ąä»ŽćŹäş¤éť˘ćťżć›´ć”ąćŹäş¤ć¶ćŻă€‚", NoCommitToAmend: "没有需č¦ćŹäş¤çš„修补。", CommitChangesWithEditor: "ćŹäş¤ć›´ć”ąďĽä˝żç”¨çĽ–辑器编辑ćŹäş¤äżˇćŻďĽ‰", @@ -59,22 +65,21 @@ func chineseTranslationSet() TranslationSet { LcToggleStaged: "ĺ‡ćŤ˘ćš‚ĺ­çжć€", LcToggleStagedAll: "ĺ‡ćŤ˘ć‰€ćś‰ć–‡ä»¶çš„ćš‚ĺ­çжć€", LcToggleTreeView: "ĺ‡ćŤ˘ć–‡ä»¶ć ‘视图", - LcOpenMergeTool: "打开ĺĺą¶ĺ·Ąĺ…·", + LcOpenMergeTool: "打开外é¨ĺĺą¶ĺ·Ąĺ…· (git mergetool)", LcRefresh: "ĺ·ć–°", LcPush: "推é€", LcPull: "拉取", LcScroll: "滚动", MergeConflictsTitle: "ĺ并冲çŞ", LcCheckout: "检出", - LcCommitFileFilter: "过滤ćŹäş¤ć–‡ä»¶", NoChangedFiles: "没有更改过文件", NoFilesDisplay: "没有文件可ćľç¤ş", NotAFile: "不ćŻć–‡ä»¶", - PullWait: "拉取中……", - PushWait: "推é€ä¸­â€¦â€¦", - FetchWait: "正在抓取……", + PullWait: "正在拉取…", + PushWait: "正在推é€â€¦", + FetchWait: "正在抓取…", LcSoftReset: "软重置", - AlreadyCheckedOutBranch: "您已经检出了这个ĺ†ć”Ż", + AlreadyCheckedOutBranch: "您已经检出至此ĺ†ć”Ż", SureForceCheckout: "您确定č¦ĺĽşĺ¶ćŁ€ĺ‡şĺ—?您将丢失所有本地更改", ForceCheckoutBranch: "强ĺ¶ćŁ€ĺ‡şĺ†ć”Ż", BranchName: "ĺ†ć”ŻĺŤç§°", @@ -97,7 +102,6 @@ func chineseTranslationSet() TranslationSet { LcClose: "ĺ…łé—­", LcQuit: "退出", LcSquashDown: "ĺ‘下压缩", - LcResetToThisCommit: "重置为此ćŹäş¤", LcFixupCommit: "修正ćŹäş¤ďĽfixup)", NoCommitsThisBranch: "该ĺ†ć”Żć˛ˇćś‰ćŹäş¤", OnlySquashTopmostCommit: "只č˝ĺŽ‹çĽ©ćś€éˇ¶ĺ±‚çš„ćŹäş¤", @@ -135,7 +139,6 @@ func chineseTranslationSet() TranslationSet { SureApplyStashEntry: "您确定č¦ĺş”用此贮藏条目?", NoTrackedStagedFilesStash: "没有可以贮藏的已跟踪/ćš‚ĺ­ć–‡ä»¶", StashChanges: "贮藏更改", - MergeAborted: "ĺ并中止", OpenConfig: "打开配置文件", EditConfig: "编辑配置文件", ForcePush: "强ĺ¶ćލé€", @@ -143,9 +146,9 @@ func chineseTranslationSet() TranslationSet { ForcePushDisabled: "您的ĺ†ć”Żĺ·˛ä¸Žčżśç¨‹ĺ†ć”Żä¸ŤĺŚ, 并且您已经ç¦ç”¨äş†ĺĽşčˇŚćލé€", UpdatesRejectedAndForcePushDisabled: "更新被拒绝,您已ç¦ç”¨ĺĽşĺ¶ćލé€", LcCheckForUpdate: "检查更新", - CheckingForUpdates: "检查更新中……", - OnLatestVersionErr: "您的软件已经ćŻćś€ć–°ç‰ćś¬", - MajorVersionErr: "ć–°ç‰ćś¬ ({{.newVersion}}) 与当前ç‰ćś¬ç›¸ćŻ”ďĽŚĺ…·ćś‰ĺ‘ĺŽĺ…Ľĺ®ąçš„更改 ({{.currentVersion}})", + CheckingForUpdates: "正在检查更新…", + OnLatestVersionErr: "ĺ·˛ćŻćś€ć–°ç‰ćś¬", + MajorVersionErr: "ć–°ç‰ćś¬ ({{.newVersion}}) 与当前ç‰ćś¬ ({{.currentVersion}}) 相比,具有非ĺ‘ĺŽĺ…Ľĺ®ąçš„更改", CouldNotFindBinaryErr: "在 {{.url}} 处找不ĺ°ä»»ä˝•二进ĺ¶ć–‡ä»¶", MergeToolTitle: "ĺĺą¶ĺ·Ąĺ…·", MergeToolPrompt: "确定č¦ć‰“开 `git mergetool` ĺ—?", @@ -173,7 +176,7 @@ func chineseTranslationSet() TranslationSet { ToggleDragSelect: `ĺ‡ćŤ˘ć‹–动选择`, ToggleSelectHunk: `ĺ‡ćŤ˘é€‰ć‹©ĺŚşĺť—`, ToggleSelectionForPatch: `添加/移除 行ĺ°čˇĄä¸`, - TogglePanel: `ĺ‡ćŤ˘ĺ°ĺ…¶ä»–面板`, + ToggleStagingPanel: `ĺ‡ćŤ˘ĺ°ĺ…¶ä»–面板`, ReturnToFilesPanel: `返回文件面板`, FastForward: `从上游快进此ĺ†ć”Ż`, Fetching: "抓取并快进 {{.from}} -> {{.to}} ...", @@ -187,37 +190,37 @@ func chineseTranslationSet() TranslationSet { MergeOptionsTitle: "ĺ并选项", RebaseOptionsTitle: "ĺŹĺźşé€‰éˇą", CommitMessageTitle: "ćŹäş¤č®ŻćŻ", - LocalBranchesTitle: "ĺ†ć”Żć ‡ç­ľ", + LocalBranchesTitle: "ĺ†ć”Żéˇµéť˘", SearchTitle: "ćśç´˘", TagsTitle: "标签页面", MenuTitle: "菜单", RemotesTitle: "远程页面", - CredentialsTitle: "čŻäą¦", - RemoteBranchesTitle: "远程ĺ†ć”ŻďĽĺś¨čżśç¨‹éˇµéť˘ä¸­ďĽ‰", + RemoteBranchesTitle: "远程ĺ†ć”Ż", PatchBuildingTitle: "构建补ä¸ä¸­", InformationTitle: "信ćŻ", SecondaryTitle: "次č¦", - ReflogCommitsTitle: "Reflog", + ReflogCommitsTitle: "Reflog 页面", GlobalTitle: "全局键绑定", ConflictsResolved: "已解决所有冲çŞă€‚ćŻĺ¦ç»§ç»­ďĽź", RebasingTitle: "ĺŹĺźş", ConfirmRebase: "您确定č¦ĺ°†ĺ†ć”Ż {{.checkedOutBranch}} ĺŹĺźşĺ° {{.selectedBranch}} ĺ—?", ConfirmMerge: "您确定č¦ĺ°†ĺ†ć”Ż {{.selectedBranch}} ĺĺą¶ĺ° {{.checkedOutBranch}} ĺ—?", - FwdNoUpstream: "无法快进没有上游的ĺ†ć”Ż", - FwdCommitsToPush: "无法快进并ćŹäş¤ćލé€çš„ĺ†ć”Ż", + FwdNoUpstream: "ć­¤ĺ†ć”Żć˛ˇćś‰ä¸Šć¸¸ďĽŚć— ćł•快进", + FwdNoLocalUpstream: "ć­¤ĺ†ć”Żçš„远程未在本地注册,无法快进", + FwdCommitsToPush: "ć­¤ĺ†ć”Żĺ¸¦ćś‰ĺ°šćśŞćލé€çš„ćŹäş¤ďĽŚć— ćł•快进", ErrorOccurred: "发生错误ďĽčŻ·ĺś¨ä»Ąä¸‹ä˝Ťç˝®ĺ›ĺ»ş issue", - NoRoom: "没有足够的空间", + NoRoom: "空间不足", YouAreHere: "您在这里", LcRewordNotSupported: "当前不支ćŚäş¤äş’式重新基准化时的重新措词ćŹäş¤", LcCherryPickCopy: "复ĺ¶ćŹäş¤ďĽć‹Łé€‰ďĽ‰", LcCherryPickCopyRange: "复ĺ¶ćŹäş¤čŚĺ›´ďĽć‹Łé€‰ďĽ‰", LcPasteCommits: "ç˛č´´ćŹäş¤ďĽć‹Łé€‰ďĽ‰", SureCherryPick: "您确定č¦ĺ°†é€‰ä¸­çš„ćŹäş¤čż›čˇŚć‹Łé€‰ĺ°čż™ä¸Şĺ†ć”Żĺ—?", - CherryPick: "拣选", - CannotRebaseOntoFirstCommit: "您不č˝ä»Ąäş¤äş’方式基于第一次ćŹäş¤", - CannotSquashOntoSecondCommit: "ć‚¨ä¸Ťč˝ ĺŽ‹çĽ©/修正(fixup)第二个ćŹäş¤", + CherryPick: "拣选 (Cherry-Pick)", + CannotRebaseOntoFirstCommit: "您不č˝ä»Ąäş¤äş’方式ĺŹĺźş (rebase) 至第一次ćŹäş¤", + CannotSquashOntoSecondCommit: "您不č˝ĺŽ‹çĽ© (squash) ć–修正 (fixup) 第二个ćŹäş¤", Donate: "ćŤĺŠ©", - AskQuestion: "é—®é˘ĺ’¨čŻ˘", + AskQuestion: "ćŹé—®ĺ’¨čŻ˘", PrevLine: "选择上一行", NextLine: "选择下一行", PrevHunk: "选择上一个区块", @@ -238,26 +241,26 @@ func chineseTranslationSet() TranslationSet { FixingStatus: "正在修正", DeletingStatus: "正在ĺ é™¤", MovingStatus: "正在移动", - RebasingStatus: "ĺŹĺźş", - AmendingStatus: "修改", - CherryPickingStatus: "拣选中", + RebasingStatus: "正在ĺŹĺźş", + AmendingStatus: "正在修改", + CherryPickingStatus: "正在拣选", UndoingStatus: "正在撤销", RedoingStatus: "正在重ĺš", - CheckingOutStatus: "检出", + CheckingOutStatus: "长ĺ­ćŁ€ĺ‡ş", CommittingStatus: "正在ćŹäş¤", CommitFiles: "ćŹäş¤ć–‡ä»¶", - LcViewCommitFiles: "查看ćŹäş¤çš„文件", + LcViewItemFiles: "查看ćŹäş¤çš„文件", CommitFilesTitle: "ćŹäş¤ć–‡ä»¶", LcCheckoutCommitFile: "检出文件", LcDiscardOldFileChange: "放ĺĽĺŻąć­¤ć–‡ä»¶çš„ćŹäş¤ć›´ć”ą", DiscardFileChangesTitle: "放ĺĽć–‡ä»¶ć›´ć”ą", DiscardFileChangesPrompt: "您确定č¦čŤĺĽć­¤ćŹäş¤ĺŻąčŻĄć–‡ä»¶çš„ć›´ć”ąĺ—?如果此文件ćŻĺś¨ć­¤ćŹäş¤ä¸­ĺ›ĺ»şçš„,ĺ®ĺ°†č˘«ĺ é™¤", DisabledForGPG: "该功č˝ä¸Ťé€‚用于使用 GPG 的用ć·", - CreateRepo: "不在 git 仓库中。ĺ›ĺ»şä¸€ä¸Şć–°çš„ git 仓库ĺ—?(y/n): ", + CreateRepo: "当前目录不在 git 仓库中。ćŻĺ¦ĺś¨ć­¤ç›®ĺ˝•ĺ›ĺ»şä¸€ä¸Şć–°çš„ git 仓库?(y/n): ", AutoStashTitle: "自动ĺ­ĺ‚¨ďĽź", AutoStashPrompt: "您必须éšč—Źĺą¶ĺĽąĺ‡şć›´ć”ąä»Ąä˝żć›´ć”ąç”źć•。自动执行?(enter/esc)", StashPrefix: "自动éšč—Źć›´ć”ą ", - LcViewDiscardOptions: "查看'放ĺĽć›´ć”ąâ€é€‰éˇą", + LcViewDiscardOptions: "查看'放ĺĽć›´ć”ą'选项", LcCancel: "取ć¶", LcDiscardAllChanges: "放ĺĽć‰€ćś‰ć›´ć”ą", LcDiscardUnstagedChanges: "放ĺĽćśŞćš‚ĺ­çš„ĺŹć›´", @@ -278,12 +281,15 @@ func chineseTranslationSet() TranslationSet { SkipHookPrefixNotConfigured: "您尚未配置用于跳过钩ĺ­çš„ćŹäş¤ć¶ćŻĺ‰ŤçĽ€ă€‚请在您的配置中设置 `git.skipHookPrefix ='WIP'`", LcResetTo: `重置为`, PressEnterToReturn: "按下 Enter 键返回 lazygit", - LcViewStashOptions: "查看éšč—Źé€‰éˇą", + LcViewStashOptions: "查看贮藏选项", LcStashAllChanges: "将所有更改加入贮藏", - LcStashStagedChanges: "将已暂ĺ­çš„更改加入贮藏", + LcStashAllChangesKeepIndex: "将已暂ĺ­çš„更改加入贮藏", LcStashOptions: "贮藏选项", NotARepository: "错误:必须在 git 仓库中čżčˇŚ", LcJump: "č·łĺ°éť˘ćťż", + LcScrollLeftRight: "左右滚动", + LcScrollLeft: "ĺ‘左滚动", + LcScrollRight: "ĺ‘右滚动", DiscardPatch: "丢ĺĽčˇĄä¸", DiscardPatchConfirm: "您一次只č˝é€ščż‡ä¸€ä¸ŞćŹäş¤ć–贮藏条目构建补ä¸ă€‚需č¦ć”ľĺĽĺ˝“前补ä¸ĺ—?", CantPatchWhileRebasingError: "处于ĺĺą¶ć–ĺŹĺźşçжć€ć—¶ďĽŚć‚¨ć— ćł•构建修补程序ć–čżčˇŚäż®čˇĄç¨‹ĺşŹĺ‘˝ä»¤", @@ -292,12 +298,13 @@ func chineseTranslationSet() TranslationSet { PatchOptionsTitle: "补ä¸é€‰éˇą", NoPatchError: "尚未ĺ›ĺ»şčˇĄä¸ă€‚你可以在ćŹäş¤ä¸­çš„文件上按下“空格”ć–使用“回车”添加其中的特定行以开始构建补ä¸", LcEnterFile: "输入文件以将所选行添加ĺ°čˇĄä¸ä¸­ďĽć–ĺ‡ćŤ˘ç›®ĺ˝•ćŠĺŹ ďĽ‰", - ExitLineByLineMode: `退出é€čˇŚć¨ˇĺĽŹ`, - EnterUpstream: `以这种形式输入上游:“<远程仓库> <ĺ†ć”ŻĺŤç§°>”`, + ExitCustomPatchBuilder: `退出é€čˇŚć¨ˇĺĽŹ`, + EnterUpstream: `以这种格式输入上游:'<远程仓库> <ĺ†ć”ŻĺŤç§°>'`, + InvalidUpstream: "上游格式无ć•,格式应当为:' '", ReturnToRemotesList: `返回远程仓库ĺ—表`, LcAddNewRemote: `添加新的远程仓库`, - LcNewRemoteName: `新的远程仓库ĺŤç§°:`, - LcNewRemoteUrl: `新的远程仓库 URL:`, + LcNewRemoteName: `新远程仓库ĺŤç§°:`, + LcNewRemoteUrl: `新远程仓库 URL:`, LcEditRemoteName: `输入远程仓库 {{.remoteName}} 的新ĺŤç§°ďĽš`, LcEditRemoteUrl: `输入远程仓库 {{.remoteName}} 的新 URL:`, LcRemoveRemote: `ĺ é™¤čżśç¨‹`, @@ -305,18 +312,23 @@ func chineseTranslationSet() TranslationSet { DeleteRemoteBranch: "ĺ é™¤čżśç¨‹ĺ†ć”Ż", DeleteRemoteBranchMessage: "您确定č¦ĺ é™¤čżśç¨‹ĺ†ć”Żĺ—?", LcSetUpstream: "设置为检出ĺ†ć”Żçš„上游", + LcSetAsUpstream: "设置为检出ĺ†ć”Żçš„上游", SetUpstreamTitle: "设置上游ĺ†ć”Ż", SetUpstreamMessage: "您确定č¦ĺ°† {{.checkedOut}} 的上游ĺ†ć”Żč®ľç˝®ä¸ş {{.selected}} ĺ—?", LcEditRemote: "编辑远程仓库", LcTagCommit: "标签ćŹäş¤", - TagNameTitle: "标签ĺŤďĽš", + TagMenuTitle: "ĺ›ĺ»şć ‡ç­ľ", + TagNameTitle: "标签ĺŤç§°ďĽš", + TagMessageTitle: "标签ć¶ćŻďĽš", + LcAnnotatedTag: "附注标签", + LcLightweightTag: "轻量标签", LcDeleteTag: "ĺ é™¤ć ‡ç­ľ", DeleteTagTitle: "ĺ é™¤ć ‡ç­ľ", DeleteTagPrompt: "您确定č¦ĺ é™¤ć ‡ç­ľ {{.tagName}} ĺ—?", PushTagTitle: "ĺ°† {{.tagName}} 推é€ĺ°čżśç¨‹ä»“库:", LcPushTag: "推é€ć ‡ç­ľ", LcCreateTag: "ĺ›ĺ»şć ‡ç­ľ", - CreateTagTitle: "标签ĺŤďĽš", + CreateTagTitle: "标签ĺŤç§°ďĽš", LcFetchRemote: "抓取远程仓库", FetchingRemoteStatus: "抓取远程仓库中", LcCheckoutCommit: "检出ćŹäş¤", @@ -336,7 +348,6 @@ func chineseTranslationSet() TranslationSet { NewBranchNamePrompt: "输入ĺ†ć”Żçš„ć–°ĺŤç§°", RenameBranchWarning: "该ĺ†ć”Żć­Łĺś¨č·źč¸Şčżśç¨‹ä»“库。此操作将仅会重命ĺŤćś¬ĺś°ĺ†ć”ŻĺŤç§°ďĽŚč€Śä¸ŤäĽšé‡Ťĺ‘˝ĺŤčżśç¨‹ĺ†ć”Żçš„ĺŤç§°ă€‚确定继续?", LcOpenMenu: "打开菜单", - LcCloseMenu: "关闭菜单", LcResetCherryPick: "重置已拣选ďĽĺ¤Ťĺ¶ďĽ‰çš„ćŹäş¤", LcNextTab: "下一个标签", LcPrevTab: "上一个标签", @@ -360,32 +371,32 @@ func chineseTranslationSet() TranslationSet { MustExitFilterModeTitle: "命令不可用", MustExitFilterModePrompt: "命令在过滤模式下不可用。退出过滤模式?", LcDiff: "差异", - LcEnterRefToDiff: "输入 ref 以 diff", // TODO + LcEnterRefToDiff: "输入 ref 以 diff", LcEnteRefName: "输入 ref:", LcExitDiffMode: "退出差异模式", - DiffingMenuTitle: "diff 中", // TODO + DiffingMenuTitle: "正在 diff", LcSwapDiff: "ĺŹŤĺ‘ diff", LcOpenDiffingMenu: "打开 diff 菜单", + // 实际视图 (actual view) ćŻé™„加视图 (extras view),未来,ć‘打算为附加视图ćŹäľ›ć›´ĺ¤šé€‰éˇąĺŤˇďĽŚä˝†çŽ°ĺś¨ďĽŚä¸Šéť˘çš„ć–‡ćś¬ĺŹŞéś€č¦ćŹĺŹŠâ€śĺ‘˝ä»¤ć—Ąĺż—â€ťčż™ä¸Şé¨ĺ† LcOpenExtrasMenu: "打开命令日志菜单", - LcShowingGitDiff: "ćľç¤şčľ“出:", // TODO + LcShowingGitDiff: "ćľç¤şčľ“出:", LcCopyCommitShaToClipboard: "ĺ°†ćŹäş¤çš„ SHA 复ĺ¶ĺ°ĺ‰Şč´´ćťż", LcCopyCommitMessageToClipboard: "ĺ°†ćŹäş¤ć¶ćŻĺ¤Ťĺ¶ĺ°ĺ‰Şč´´ćťż", LcCopyBranchNameToClipboard: "ĺ°†ĺ†ć”ŻĺŤç§°ĺ¤Ťĺ¶ĺ°ĺ‰Şč´´ćťż", LcCopyFileNameToClipboard: "将文件ĺŤĺ¤Ťĺ¶ĺ°ĺ‰Şč´´ćťż", LcCopyCommitFileNameToClipboard: "ĺ°†ćŹäş¤çš„文件ĺŤĺ¤Ťĺ¶ĺ°ĺ‰Şč´´ćťż", + LcCopySelectedTexToClipboard: "将选中文本复ĺ¶ĺ°ĺ‰Şč´´ćťż", LcCommitPrefixPatternError: "ćŹäş¤ĺ‰ŤçĽ€ć¨ˇĺĽŹé”™čŻŻ", NoFilesStagedTitle: "没有暂ĺ­ć–‡ä»¶", NoFilesStagedPrompt: "您尚未暂ĺ­ä»»ä˝•文件。ćŹäş¤ć‰€ćś‰ć–‡ä»¶ďĽź", BranchNotFoundTitle: "找不ĺ°ĺ†ć”Ż", BranchNotFoundPrompt: "找不ĺ°ĺ†ć”Żă€‚ĺ›ĺ»şä¸€ä¸Şć–°ĺ†ć”Żĺ‘˝ĺŤä¸şďĽš", - UnstageLinesTitle: "未暂ĺ­çš„行", + UnstageLinesTitle: "取ć¶ćš‚ĺ­é€‰ä¸­çš„行", UnstageLinesPrompt: "您确定č¦ĺ é™¤ć‰€é€‰çš„行ďĽgit reset)ĺ—?这ćŻä¸ŤĺŹŻé€†çš„ă€‚\nč¦ç¦ç”¨ć­¤ĺŻąčŻťćˇ†ďĽŚčŻ·ĺ°† 'gui.skipUnstageLineWarning' 的配置键设置为 true", LcCreateNewBranchFromCommit: "从ćŹäş¤ĺ›ĺ»şć–°ĺ†ć”Ż", - LcViewStashFiles: "查看贮藏条目中的文件", LcBuildingPatch: "正在构建补ä¸", LcViewCommits: "查看ćŹäş¤", - MinGitVersionError: "Git ç‰ćś¬ĺż…须至少为 2.0ďĽĺŤłä»Ž 2014 年开始)。请升级您的 git ç‰ćś¬ă€‚ć–者在 https://github.com/jesseduffield/lazygit/issues 上ćŹĺ‡şä¸€ä¸Şé—®é˘ďĽŚä»Ąä˝ż lazygit 更加ĺ‘ĺŽĺ…Ľĺ®ąă€‚", - MinGhVersionError: "GHç‰ćś¬ĺż…须至少ćŻ2.0 请升级您的ghç‰ćś¬ă€‚ć–者在https://github.com/jesseduffield/lazygit/issues ćŹĺ‡şä¸€ä¸Şé—®é˘ďĽŚä»Ąä˝żlazygit更加ĺ‘ĺŽĺ…Ľĺ®ąă€‚", + MinGitVersionError: "Git ç‰ćś¬ĺż…须至少为 2.0ďĽĺŤłä»Ž 2014 年开始的ç‰ćś¬ďĽ‰ă€‚请更新 git。ć–者在 https://github.com/jesseduffield/lazygit/issues 上ćŹĺ‡şä¸€ä¸Şé—®é˘ďĽŚä»Ąä˝ż lazygit 更加ĺ‘ĺŽĺ…Ľĺ®ąă€‚", LcRunningCustomCommandStatus: "正在čżčˇŚč‡Şĺ®šäą‰ĺ‘˝ä»¤", LcSubmoduleStashAndReset: "ĺ­ć”ľćśŞćŹäş¤çš„ĺ­ć¨ˇĺť—更改和更新", LcAndResetSubmodules: "和重置ĺ­ć¨ˇĺť—", @@ -393,14 +404,14 @@ func chineseTranslationSet() TranslationSet { LcCopySubmoduleNameToClipboard: "ĺ°†ĺ­ć¨ˇĺť—ĺŤç§°ĺ¤Ťĺ¶ĺ°ĺ‰Şč´´ćťż", RemoveSubmodule: "ĺ é™¤ĺ­ć¨ˇĺť—", LcRemoveSubmodule: "ĺ é™¤ĺ­ć¨ˇĺť—", - RemoveSubmodulePrompt: "您确定č¦ĺ é™¤ĺ­ć¨ˇĺť— %s 及其对应的目录ĺ—?这ćŻä¸ŤĺŹŻé€†çš„ă€‚", + RemoveSubmodulePrompt: "您确定č¦ĺ é™¤ĺ­ć¨ˇĺť— '%s' 及其对应的目录ĺ—?这ćŻä¸ŤĺŹŻé€†çš„ă€‚", LcResettingSubmoduleStatus: "正在重置ĺ­ć¨ˇĺť—", LcNewSubmoduleName: "ć–°çš„ĺ­ć¨ˇĺť—ĺŤç§°ďĽš", LcNewSubmoduleUrl: "ć–°çš„ĺ­ć¨ˇĺť— URL:", LcNewSubmodulePath: "ć–°çš„ĺ­ć¨ˇĺť—路径:", LcAddSubmodule: "添加新的ĺ­ć¨ˇĺť—", LcAddingSubmoduleStatus: "添加ĺ­ć¨ˇĺť—", - LcUpdateSubmoduleUrl: "ć›´ć–°ĺ­ć¨ˇĺť— %s çš„ URL", + LcUpdateSubmoduleUrl: "ć›´ć–°ĺ­ć¨ˇĺť— '%s' çš„ URL", LcUpdatingSubmoduleUrlStatus: "ć›´ć–° URL 中", LcEditSubmoduleUrl: "ć›´ć–°ĺ­ć¨ˇĺť— URL", LcInitializingSubmoduleStatus: "正在ĺťĺ§‹ĺŚ–ĺ­ć¨ˇĺť—", @@ -417,6 +428,8 @@ func chineseTranslationSet() TranslationSet { SubmodulesTitle: "ĺ­ć¨ˇĺť—", NavigationTitle: "ĺ—表面板导čŞ", SuggestionsCheatsheetTitle: "意č§ĺ»şč®®", + SuggestionsTitle: "意č§ĺ»şč®® (点击 %s 以čšç„¦)", + ExtrasTitle: "附加", PushingTagStatus: "推é€ć ‡ç­ľ", PullRequestURLCopiedToClipboard: "抓取请求网址已复ĺ¶ĺ°ĺ‰Şč´´ćťż", CommitMessageCopiedToClipboard: "ćŹäş¤ć¶ćŻĺ¤Ťĺ¶ĺ°ĺ‰Şč´´ćťż", @@ -428,23 +441,38 @@ func chineseTranslationSet() TranslationSet { ToggleShowCommandLog: "ĺ‡ćŤ˘ ćľç¤ş/éšč—Ź ĺ‘˝ä»¤ć—Ąĺż—", FocusCommandLog: "焦点命令日志", CommandLogHeader: "您可以通过按 '%s' éšč—Źć–集中ćľç¤şčŻĄéť˘ćťżďĽŚć–使用 `gui.showCommandLog: false`\n将其永久éšč—Źĺś¨ć‚¨çš„配置中", - RandomTip: "随机ćŹç¤ş", - SelectRemoteRepository: "选择ĺ­ĺ‚¨ĺş“", - LcSelectingRemote: "选择éĄćŽ§ĺ™¨", + RandomTip: "随机小ćŹç¤ş", SelectParentCommitForMerge: "选择ç¶ćŹäş¤čż›čˇŚĺĺą¶", - ToggleWhitespaceInDiffView: "ĺ‡ćŤ˘ćŻĺ¦ĺś¨ĺ·®ĺĽ‚视图中ćľç¤şç©şç™˝ć›´ć”ą", - IgnoringWhitespaceInDiffView: "差异视图中的空格将被忽略", - ShowingWhitespaceInDiffView: "空白将ćľç¤şĺś¨ĺ·®ĺĽ‚视图中", - LcCreateOrShowPullRequest: "ĺ›ĺ»şćŠ“ĺŹ–čŻ·ć±‚", - CreateOrOpenPullRequestOptions: "ĺ›ĺ»şćŠ“ĺŹ–čŻ·ć±‚é€‰éˇą", + ToggleWhitespaceInDiffView: "ĺ‡ćŤ˘ćŻĺ¦ĺś¨ĺ·®ĺĽ‚视图中ćľç¤şç©şç™˝ĺ­—符差异", + IgnoringWhitespaceInDiffView: "将会在差异视图中忽略空格字符差异", + ShowingWhitespaceInDiffView: "将会在差异视图中ćľç¤şç©şç™˝ĺ­—符差异", + IncreaseContextInDiffView: "扩大差异视图中ćľç¤şçš„上下文čŚĺ›´", + DecreaseContextInDiffView: "缩小差异视图中ćľç¤şçš„上下文čŚĺ›´", + CreatePullRequest: "ĺ›ĺ»şćŠ“ĺŹ–čŻ·ć±‚", + CreatePullRequestOptions: "ĺ›ĺ»şćŠ“ĺŹ–čŻ·ć±‚é€‰éˇą", + LcCreatePullRequestOptions: "ĺ›ĺ»şćŠ“ĺŹ–čŻ·ć±‚é€‰éˇą", LcDefaultBranch: "é»č®¤ĺ†ć”Ż", LcSelectBranch: "选择ĺ†ć”Ż", - CreatingPullRequestAtUrl: "在 URL ĺ›ĺ»şćŠ“ĺŹ–čŻ·ć±‚: %s", - OpenPr: "公开公关 #", + SelectConfigFile: "选择配置文件", + NoConfigFileFoundErr: "找不ĺ°é…Ťç˝®ć–‡ä»¶", + LcLoadingFileSuggestions: "正在加载文件建议", + LcLoadingCommits: "正在加载ćŹäş¤", + MustSpecifyOriginError: "指定ĺ†ć”Żć—¶ďĽŚĺż…须ĺŚć—¶ćŚ‡ĺ®ščżśç¨‹", + GitOutput: "Git 输出:", + GitCommandFailed: "Git ĺ‘˝ä»¤ć‰§čˇŚĺ¤±č´Ąă€‚ćźĄçś‹ĺ‘˝ä»¤ć—Ąĺż—äş†č§ŁčŻ¦ć… (使用 %s 打开)", + AbortTitle: "ć”ľĺĽ %s", + AbortPrompt: "您确定č¦ć”ľĺĽĺ˝“前 %s ĺ—?", + LcOpenLogMenu: "打开日志菜单", + LogMenuTitle: "ćŹäş¤ć—Ąĺż—选项", + ToggleShowGitGraphAll: "ĺ‡ćŤ˘ćľç¤şĺ®Ść•´ git ĺ†ć”Żĺ›ľ (ĺ‘ `git log` 命令传入 `--all` 选项)", + ShowGitGraph: "ćľç¤ş git ĺ†ć”Żĺ›ľ", + SortCommits: "ćŹäş¤ćŽ’ĺşŹ", + CantChangeContextSizeError: "无法在补ä¸ćž„建模式下更改上下文,因为ć‘们在发ĺ¸čŻĄĺŠźč˝ć—¶ć‡’得支ćŚĺ®ă€‚ 如果你真的ćłč¦čż™äąĺšďĽŚčŻ·ĺ‘ŠčŻ‰ć‘们ďĽ", + LcOpenCommitInBrowser: "在浏č§ĺ™¨ä¸­ć‰“开ćŹäş¤", + LcViewBisectOptions: "查看二ĺ†ćźĄć‰ľé€‰éˇą", Actions: Actions{ // TODO: combine this with the original keybinding descriptions (those are all in lowercase atm) CheckoutCommit: "检出ćŹäş¤", - CheckoutReflogCommit: "检出reflogćŹäş¤", CheckoutTag: "检出标签", CheckoutBranch: "检出ĺ†ć”Ż", ForceCheckoutBranch: "强ĺ¶ćŁ€ĺ‡şĺ†ć”Ż", @@ -453,7 +481,7 @@ func chineseTranslationSet() TranslationSet { RebaseBranch: "ĺŹĺźşĺ†ć”Ż", RenameBranch: "重命ĺŤĺ†ć”Ż", CreateBranch: "建立ĺ†ć”Ż", - CherryPick: "拣选ćŹäş¤", + CherryPick: "(拣选) ç˛č´´ćŹäş¤", CheckoutFile: "检出文件", DiscardOldFileChange: "放ĺĽć—§ć–‡ä»¶ć›´ć”ą", SquashCommitDown: "ĺ‘下压缩ćŹäş¤", @@ -464,31 +492,33 @@ func chineseTranslationSet() TranslationSet { AmendCommit: "修改ćŹäş¤", RevertCommit: "čżĺŽźćŹäş¤", CreateFixupCommit: "ĺ›ĺ»şäż®ć­ŁćŹäş¤", - SquashAllAboveFixupCommits: "压缩所有以上的修正ćŹäş¤", - CreateLightweightTag: "ĺ›ĺ»şč˝»é‡Źçş§ć ‡ç­ľ", + SquashAllAboveFixupCommits: "压缩以上所有的修正ćŹäş¤", + CreateLightweightTag: "ĺ›ĺ»şč˝»é‡Źć ‡ç­ľ", + CreateAnnotatedTag: "ĺ›ĺ»şé™„注标签", CopyCommitMessageToClipboard: "ĺ°†ćŹäş¤ć¶ćŻĺ¤Ťĺ¶ĺ°ĺ‰Şč´´ćťż", - MoveCommitUp: "ĺ‘上ćŹäş¤", + MoveCommitUp: "上移ćŹäş¤", MoveCommitDown: "下移ćŹäş¤", CustomCommand: "自定义命令", - DiscardAllChangesInDirectory: "放ĺĽç›®ĺ˝•中的所有更改", - DiscardUnstagedChangesInDirectory: "放ĺĽç›®ĺ˝•中未暂ĺ­çš„更改", - DiscardAllChangesInFile: "放ĺĽć–‡ä»¶ä¸­çš„所有更改", + DiscardAllChangesInDirectory: "丢ĺĽç›®ĺ˝•中的所有更改", + DiscardUnstagedChangesInDirectory: "丢ĺĽç›®ĺ˝•中未暂ĺ­çš„更改", + DiscardAllChangesInFile: "丢ĺĽć–‡ä»¶ä¸­çš„所有更改", DiscardAllUnstagedChangesInFile: "丢ĺĽć–‡ä»¶ä¸­ć‰€ćś‰ćśŞćš‚ĺ­çš„更改", StageFile: "ćš‚ĺ­ć–‡ä»¶", - UnstageFile: "未暂ĺ­ć–‡ä»¶", + UnstageFile: "取ć¶ćš‚ĺ­ć–‡ä»¶", UnstageAllFiles: "取ć¶ćš‚ĺ­ć‰€ćś‰ć–‡ä»¶", StageAllFiles: "ćš‚ĺ­ć‰€ćś‰ć–‡ä»¶", - IgnoreFile: "忽略文件", - Commit: "ćŹäş¤(Commit)", + LcIgnoreExcludeFile: "忽略文件", + Commit: "ćŹäş¤ (Commit)", EditFile: "编辑文件", - Push: "推é€(Push)", - Pull: "拉取(Pull)", + Push: "ćŽ¨é€ (Push)", + Pull: "拉取 (Pull)", OpenFile: "打开文件", - StashAllChanges: "Stash所有更改", - StashStagedChanges: "Stashćš‚ĺ­ć›´ć”ą", - GitFlowFinish: "Gitćµĺ®Ść", - GitFlowStart: "Git Flow开始", + StashAllChanges: "贮藏所有更改", + StashStagedChanges: "贮藏暂ĺ­çš„更改", + GitFlowFinish: "Git flow 结果", + GitFlowStart: "Git Flow 开始", CopyToClipboard: "复ĺ¶ĺ°ĺ‰Şč´´ćťż", + CopySelectedTextToClipboard: "将选中文本复ĺ¶ĺ°ĺ‰Şč´´ćťż", RemovePatchFromCommit: "从ćŹäş¤ä¸­ĺ é™¤čˇĄä¸", MovePatchToSelectedCommit: "将补ä¸ç§»ĺЍĺ°é€‰ĺ®šçš„ćŹäş¤", MovePatchIntoIndex: "将补ä¸ç§»ĺ°ç´˘ĺĽ•", @@ -497,22 +527,21 @@ func chineseTranslationSet() TranslationSet { SetBranchUpstream: "设置ĺ†ć”Żä¸Šć¸¸", AddRemote: "添加远程", RemoveRemote: "移除远程", - UpdateRemote: "远程更新", - ApplyPatch: "套用补ä¸", - Stash: "Stash", + UpdateRemote: "更新远程", + ApplyPatch: "应用补ä¸", + Stash: "贮藏 (Stash)", RemoveSubmodule: "ĺ é™¤ĺ­ć¨ˇĺť—", ResetSubmodule: "重置ĺ­ć¨ˇĺť—", AddSubmodule: "添加ĺ­ć¨ˇĺť—", - UpdateSubmoduleUrl: "ć›´ć–°ĺ­ć¨ˇĺť—URL", + UpdateSubmoduleUrl: "ć›´ć–°ĺ­ć¨ˇĺť— URL", InitialiseSubmodule: "ĺťĺ§‹ĺŚ–ĺ­ć¨ˇĺť—", BulkInitialiseSubmodules: "批量ĺťĺ§‹ĺŚ–ĺ­ć¨ˇĺť—", BulkUpdateSubmodules: "批量更新ĺ­ć¨ˇĺť—", - BulkStashAndResetSubmodules: "批量ĺ­ĺ‚¨ĺ’Śé‡Ťç˝®ĺ­ć¨ˇĺť—", BulkDeinitialiseSubmodules: "批量取ć¶ĺťĺ§‹ĺŚ–ĺ­ć¨ˇĺť—", UpdateSubmodule: "ć›´ć–°ĺ­ć¨ˇĺť—", DeleteTag: "ĺ é™¤ć ‡ç­ľ", PushTag: "推é€ć ‡ç­ľ", - NukeWorkingTree: "Nuke工作树", + NukeWorkingTree: "Nuke 工作树", DiscardUnstagedFileChanges: "放ĺĽćśŞćš‚ĺ­çš„文件更改", RemoveUntrackedFiles: "ĺ é™¤ćśŞč·źč¸Şçš„文件", SoftReset: "软重置", @@ -521,6 +550,26 @@ func chineseTranslationSet() TranslationSet { FastForwardBranch: "快进ĺ†ć”Ż", Undo: "撤销", Redo: "重ĺš", + CopyPullRequestURL: "复ĺ¶ć‹‰ĺŹ–čŻ·ć±‚ URL", + OpenMergeTool: "打开ĺĺą¶ĺ·Ąĺ…·", + OpenCommitInBrowser: "在浏č§ĺ™¨ä¸­ć‰“开ćŹäş¤", + OpenPullRequest: "在浏č§ĺ™¨ä¸­ć‰“开拉取请求", + StartBisect: "开始二ĺ†ćźĄć‰ľ (Bisect)", + ResetBisect: "重置二ĺ†ćźĄć‰ľ", + BisectSkip: "二ĺ†ćźĄć‰ľč·łčż‡", + BisectMark: "二ĺ†ćźĄć‰ľć ‡č®°", + }, + Bisect: Bisect{ + Mark: "ĺ°† %s 标记为 %s", + MarkStart: "ĺ°† %s 标记为 %s (start bisect)", + Skip: "跳过 %s", + ResetTitle: "重置 'git bisect'", + ResetPrompt: "您确定č¦é‡Ťç˝® 'git bisect' ĺ—?", + ResetOption: "重置二ĺ†ćźĄć‰ľ", + BisectMenuTitle: "二ĺ†ćźĄć‰ľ", + CompleteTitle: "二ĺ†ćźĄć‰ľĺ®Ść", + CompletePrompt: "二ĺ†ćźĄć‰ľĺ®ŚćďĽä»Ąä¸‹ćŹäş¤ĺĽ•入了此ĺŹć›´ďĽš\n\n%s\n\n您现在č¦é‡Ťç˝® 'git bisect' ĺ—?", + CompletePromptIndeterminate: "二ĺ†ćźĄć‰ľĺ®ŚćďĽä¸€äş›ćŹäş¤č˘«č·łčż‡äş†ďĽŚć‰€ä»Ąä¸‹ĺ—ćŹäş¤ä¸­çš„任何一个é˝ĺŹŻč˝ĺĽ•入了此ĺŹć›´ďĽš\n\n%s\n\n您现在č¦é‡Ťç˝® 'git bisect' ĺ—?", }, } } diff --git a/pkg/i18n/dutch.go b/pkg/i18n/dutch.go index 09e79473c..1aaee6952 100644 --- a/pkg/i18n/dutch.go +++ b/pkg/i18n/dutch.go @@ -18,8 +18,9 @@ func dutchTranslationSet() TranslationSet { CredentialsPassword: "Wachtwoord", CredentialsPassphrase: "Voer een wachtwoordzin in voor de SSH-sleutel", PassUnameWrong: "Wachtwoord en/of gebruikersnaam verkeerd", - CommitChanges: "Commit veranderingen", + CommitChanges: "commit veranderingen", AmendLastCommit: "wijzig laatste commit", + AmendLastCommitTitle: "Wijzig Laatste Commit", SureToAmend: "Weet je zeker dat je de laatste commit wilt wijzigen? U kunt het commit-bericht wijzigen vanuit het commits-paneel.", NoCommitToAmend: "Er is geen commits om te wijzigen.", CommitChangesWithEditor: "commit veranderingen met de git editor", @@ -33,7 +34,6 @@ func dutchTranslationSet() TranslationSet { LcPush: "push", LcPull: "pull", LcScroll: "scroll", - LcCommitFileFilter: "Commit dossiers filteren", FilterStagedFiles: "Show only staged files", FilterUnstagedFiles: "Show only unstaged files", ResetCommitFilterState: "Reset commit file state filter", @@ -68,7 +68,6 @@ func dutchTranslationSet() TranslationSet { LcClose: "sluiten", LcQuit: "quit", LcSquashDown: "squash beneden", - LcResetToThisCommit: "reset naar deze commit", LcFixupCommit: "Fixup commit", OnlySquashTopmostCommit: "Kan alleen bovenste commit squashen", YouNoCommitsToSquash: "Je hebt geen commits om mee te squashen", @@ -107,7 +106,6 @@ func dutchTranslationSet() TranslationSet { NoTrackedStagedFilesStash: "Je hebt geen tracked/staged bestanden om te laten stashen", StashChanges: "Stash veranderingen", NoChangedFiles: "Geen veranderde bestanden", - MergeAborted: "Merge afgebroken", OpenConfig: "open config bestand", EditConfig: "verander config bestand", ForcePush: "Forceer push", @@ -143,7 +141,7 @@ func dutchTranslationSet() TranslationSet { ToggleDragSelect: `toggle drag selecteer`, ToggleSelectHunk: `toggle selecteer hunk`, ToggleSelectionForPatch: `voeg toe/verwijder lijn(en) in patch`, - TogglePanel: `ga naar een ander paneel`, + ToggleStagingPanel: `ga naar een ander paneel`, ReturnToFilesPanel: `ga terug naar het bestanden paneel`, FastForward: `fast-forward deze branch vanaf zijn upstream`, Fetching: "fetching en fast-forwarding {{.from}} -> {{.to}} ...", @@ -157,17 +155,16 @@ func dutchTranslationSet() TranslationSet { MergeOptionsTitle: "Merge Opties", RebaseOptionsTitle: "Rebase Opties", CommitMessageTitle: "Commit Bericht", - LocalBranchesTitle: "Branches Tabblad", + LocalBranchesTitle: "Branches", SearchTitle: "Zoek", - TagsTitle: "Tags Tabblad", + TagsTitle: "Tags", MenuTitle: "Menu", - RemotesTitle: "Remotes Tabblad", - CredentialsTitle: "Credentials", - RemoteBranchesTitle: "Remote Branches (in Remotes tabblad)", + RemotesTitle: "Remotes", + RemoteBranchesTitle: "Remote Branches", PatchBuildingTitle: "Patch Bouwen", InformationTitle: "Informatie", SecondaryTitle: "Secondary", - ReflogCommitsTitle: "Reflog Tabblad", + ReflogCommitsTitle: "Reflog", GlobalTitle: "Globale Sneltoetsen", ConflictsResolved: "alle merge conflicten zijn opgelost. Wilt je verder gaan?", RebasingTitle: "Rebasen", @@ -215,7 +212,7 @@ func dutchTranslationSet() TranslationSet { RedoingStatus: "redoing", CheckingOutStatus: "uitchecken", CommitFiles: "Commit bestanden", - LcViewCommitFiles: "bekijk gecommite bestanden", + LcViewItemFiles: "bekijk gecommite bestanden", CommitFilesTitle: "Commit bestanden", LcCheckoutCommitFile: "bestand uitchecken", LcDiscardOldFileChange: "uitsluit deze commit zijn veranderingen aan dit bestand", @@ -241,7 +238,7 @@ func dutchTranslationSet() TranslationSet { SureSquashAboveCommits: `Weet je zeker dat je alles wil squash/fixup! voor de bovenstaand commits {{.commit}}?`, CreateFixupCommit: `CreĂ«er fixup commit`, SureCreateFixupCommit: `Weet je zeker dat je een fixup wil maken! commit voor commit {{.commit}}?`, - LcExecuteCustomCommand: "voor aangepaste commando uit", + LcExecuteCustomCommand: "voer aangepaste commando uit", CustomCommand: "Aangepaste commando:", LcCommitChangesWithoutHook: "commit veranderingen zonder pre-commit hook", SkipHookPrefixNotConfigured: "Je hebt nog niet een commit bericht voorvoegsel ingesteld voor het overslaan van hooks. Set `git.skipHookPrefix = 'WIP'` in je config", @@ -249,7 +246,7 @@ func dutchTranslationSet() TranslationSet { PressEnterToReturn: "Press om terug te gaan naar lazygit", LcViewStashOptions: "bekijk stash opties", LcStashAllChanges: "stash-bestanden", - LcStashStagedChanges: "stash staged wijzigingen", + LcStashAllChangesKeepIndex: "stash staged wijzigingen", LcStashOptions: "Stash opties", NotARepository: "Fout: moet in een git repository uitgevoerd worden", LcJump: "ga naar paneel", @@ -261,9 +258,9 @@ func dutchTranslationSet() TranslationSet { PatchOptionsTitle: "Patch Opties", NoPatchError: "Nog geen patch gecreĂ«erd. Om een patch te bouwen gebruik 'space' op een commit bestand of 'enter' om een spesiefieke lijnen toe te voegen", LcEnterFile: "enter bestand om geselecteerde regels toe te voegen aan de patch", - ExitLineByLineMode: `sluit lijn-bij-lijn modus`, + ExitCustomPatchBuilder: `sluit lijn-bij-lijn modus`, EnterUpstream: `Enter upstream als ' '`, - ReturnToRemotesList: `Ga terug naar remotes lijst`, + ReturnToRemotesList: `ga terug naar remotes lijst`, LcAddNewRemote: `voeg een nieuwe remote toe`, LcNewRemoteName: `Nieuwe remote name:`, LcNewRemoteUrl: `Nieuwe remote url:`, @@ -274,6 +271,7 @@ func dutchTranslationSet() TranslationSet { DeleteRemoteBranch: "Verwijder Remote Branch", DeleteRemoteBranchMessage: "Weet je zeker dat je deze remote branch wilt verwijderen", LcSetUpstream: "stel in als upstream van uitgecheckte branch", + LcSetAsUpstream: "stel in als upstream van uitgecheckte branch", SetUpstreamTitle: "Stel in als upstream branch", SetUpstreamMessage: "Weet je zeker dat je de upstream branch van '{{.checkedOut}}' naar '{{.selected}}' wilt zetten", LcEditRemote: "wijzig remote", @@ -305,7 +303,6 @@ func dutchTranslationSet() TranslationSet { NewBranchNamePrompt: "Noem een nieuwe branch naam", RenameBranchWarning: "Deze branch volgt een remote. Deze actie zal alleen de locale branch name wijzigen niet de naam van de remote branch. Verder gaan?", LcOpenMenu: "open menu", - LcCloseMenu: "sluit menu", LcResetCherryPick: "reset cherry-picked (gekopieerde) commits selectie", LcNextTab: "volgende tabblad", LcPrevTab: "vorige tabblad", @@ -358,9 +355,6 @@ func dutchTranslationSet() TranslationSet { LcAddSubmodule: "voeg nieuwe submodule toe", LcInitSubmodule: "initialiseer submodule", LcViewBulkSubmoduleOptions: "bekijk bulk submodule opties", - LcViewStashFiles: "bekijk bestanden van stash entry", - CreateOrOpenPullRequestOptions: "Bekijk opties voor pull-aanvraag", - LcCreateOrOpenPullRequestOptions: "bekijk opties voor pull-aanvraag", CreatePullRequestOptions: "Bekijk opties voor pull-aanvraag", LcCreatePullRequestOptions: "bekijk opties voor pull-aanvraag", ConfirmRevertCommit: "Weet u zeker dat u {{.selectedCommit}} ongedaan wilt maken?", diff --git a/pkg/i18n/english.go b/pkg/i18n/english.go index 222ad4d89..d993d70d0 100644 --- a/pkg/i18n/english.go +++ b/pkg/i18n/english.go @@ -22,7 +22,9 @@ type TranslationSet struct { MainTitle string StagingTitle string MergingTitle string + MergeConfirmTitle string NormalTitle string + LogTitle string CommitMessage string CredentialsUsername string CredentialsPassword string @@ -30,6 +32,7 @@ type TranslationSet struct { PassUnameWrong string CommitChanges string AmendLastCommit string + AmendLastCommitTitle string SureToAmend string NoCommitToAmend string CommitChangesWithEditor string @@ -46,7 +49,7 @@ type TranslationSet struct { LcPush string LcPull string LcScroll string - LcCommitFileFilter string + LcFileFilter string FilterStagedFiles string FilterUnstagedFiles string ResetCommitFilterState string @@ -82,7 +85,6 @@ type TranslationSet struct { LcClose string LcQuit string LcSquashDown string - LcResetToThisCommit string LcFixupCommit string OnlySquashTopmostCommit string YouNoCommitsToSquash string @@ -98,6 +100,9 @@ type TranslationSet struct { LcMoveUpCommit string LcEditCommit string LcAmendToCommit string + LcResetCommitAuthor string + SetAuthorPromptTitle string + SureResetCommitAuthor string LcRenameCommitEditor string NoCommitsThisBranch string Error string @@ -108,6 +113,8 @@ type TranslationSet struct { LcUndo string LcUndoReflog string LcRedoReflog string + UndoTooltip string + RedoTooltip string LcPop string LcDrop string LcApply string @@ -119,8 +126,8 @@ type TranslationSet struct { StashApply string SureApplyStashEntry string NoTrackedStagedFilesStash string + NoFilesToStash string StashChanges string - MergeAborted string OpenConfig string EditConfig string ForcePush string @@ -129,9 +136,18 @@ type TranslationSet struct { UpdatesRejectedAndForcePushDisabled string LcCheckForUpdate string CheckingForUpdates string + UpdateAvailableTitle string + UpdateAvailable string + UpdateInProgressWaitingStatus string + UpdateCompletedTitle string + UpdateCompleted string + FailedToRetrieveLatestVersionErr string OnLatestVersionErr string MajorVersionErr string CouldNotFindBinaryErr string + UpdateFailedErr string + ConfirmQuitDuringUpdateTitle string + ConfirmQuitDuringUpdate string MergeToolTitle string MergeToolPrompt string IntroPopupMessage string @@ -139,6 +155,7 @@ type TranslationSet struct { LcEditFile string LcOpenFile string LcIgnoreFile string + LcExcludeFile string LcRefreshFiles string LcMergeIntoCurrentBranch string ConfirmQuit string @@ -158,7 +175,8 @@ type TranslationSet struct { ToggleDragSelect string ToggleSelectHunk string ToggleSelectionForPatch string - TogglePanel string + EditHunk string + ToggleStagingPanel string ReturnToFilesPanel string FastForward string Fetching string @@ -177,7 +195,6 @@ type TranslationSet struct { TagsTitle string MenuTitle string RemotesTitle string - CredentialsTitle string RemoteBranchesTitle string PatchBuildingTitle string InformationTitle string @@ -231,7 +248,10 @@ type TranslationSet struct { CheckingOutStatus string CommittingStatus string CommitFiles string - LcViewCommitFiles string + SubCommitsDynamicTitle string + CommitFilesDynamicTitle string + RemoteBranchesDynamicTitle string + LcViewItemFiles string CommitFilesTitle string LcCheckoutCommitFile string LcDiscardOldFileChange string @@ -239,6 +259,9 @@ type TranslationSet struct { DiscardFileChangesPrompt string DisabledForGPG string CreateRepo string + InitialBranch string + NoRecentRepositories string + IncorrectNotARepository string AutoStashTitle string AutoStashPrompt string StashPrefix string @@ -249,6 +272,7 @@ type TranslationSet struct { LcDiscardAllChangesToAllFiles string LcDiscardAnyUnstagedChanges string LcDiscardUntrackedFiles string + LcDiscardStagedChanges string LcHardReset string LcViewResetOptions string LcCreateFixupCommit string @@ -266,6 +290,8 @@ type TranslationSet struct { LcViewStashOptions string LcStashAllChanges string LcStashStagedChanges string + LcStashAllChangesKeepIndex string + LcStashUnstagedChanges string LcStashOptions string NotARepository string LcJump string @@ -276,11 +302,13 @@ type TranslationSet struct { DiscardPatchConfirm string CantPatchWhileRebasingError string LcToggleAddToPatch string + LcToggleAllInPatch string + LcUpdatingPatch string ViewPatchOptions string PatchOptionsTitle string NoPatchError string LcEnterFile string - ExitLineByLineMode string + ExitCustomPatchBuilder string EnterUpstream string InvalidUpstream string ReturnToRemotesList string @@ -293,7 +321,9 @@ type TranslationSet struct { LcRemoveRemotePrompt string DeleteRemoteBranch string DeleteRemoteBranchMessage string + LcSetAsUpstream string LcSetUpstream string + LcUnsetUpstream string SetUpstreamTitle string SetUpstreamMessage string LcEditRemote string @@ -318,7 +348,9 @@ type TranslationSet struct { NotAGitFlowBranch string NewBranchNamePrompt string IgnoreTracked string + ExcludeTracked string IgnoreTrackedPrompt string + ExcludeTrackedPrompt string LcViewResetToUpstreamOptions string LcNextScreenMode string LcPrevScreenMode string @@ -326,10 +358,10 @@ type TranslationSet struct { Panel string Keybindings string LcRenameBranch string + LcSetUnsetUpstream string NewGitFlowBranchPrompt string RenameBranchWarning string LcOpenMenu string - LcCloseMenu string LcResetCherryPick string LcNextTab string LcPrevTab string @@ -361,8 +393,14 @@ type TranslationSet struct { LcOpenDiffingMenu string LcOpenExtrasMenu string LcShowingGitDiff string + LcCommitDiff string LcCopyCommitShaToClipboard string + LcCommitSha string + LcCommitURL string LcCopyCommitMessageToClipboard string + LcCommitMessage string + LcCommitAuthor string + LcCopyCommitAttributeToClipboard string LcCopyBranchNameToClipboard string LcCopyFileNameToClipboard string LcCopyCommitFileNameToClipboard string @@ -372,10 +410,10 @@ type TranslationSet struct { NoFilesStagedPrompt string BranchNotFoundTitle string BranchNotFoundPrompt string + LcBranchUnknown string UnstageLinesTitle string UnstageLinesPrompt string LcCreateNewBranchFromCommit string - LcViewStashFiles string LcBuildingPatch string LcViewCommits string MinGitVersionError string @@ -416,7 +454,11 @@ type TranslationSet struct { ExtrasTitle string PushingTagStatus string PullRequestURLCopiedToClipboard string + CommitDiffCopiedToClipboard string + CommitSHACopiedToClipboard string + CommitURLCopiedToClipboard string CommitMessageCopiedToClipboard string + CommitAuthorCopiedToClipboard string LcCopiedToClipboard string ErrCannotEditDirectory string ErrStageDirWithInlineMergeConflicts string @@ -462,6 +504,16 @@ type TranslationSet struct { LcOpenCommitInBrowser string LcViewBisectOptions string ConfirmRevertCommit string + RewordInEditorTitle string + RewordInEditorPrompt string + CheckoutPrompt string + HardResetAutostashPrompt string + UpstreamGone string + NukeDescription string + DiscardStagedChangesDescription string + EmptyOutput string + Patch string + CustomPatch string Actions Actions Bisect Bisect } @@ -483,7 +535,6 @@ type Bisect struct { type Actions struct { CheckoutCommit string - CheckoutReflogCommit string CheckoutTag string CheckoutBranch string ForceCheckoutBranch string @@ -491,6 +542,7 @@ type Actions struct { Merge string RebaseBranch string RenameBranch string + SetUnsetUpstream string CreateBranch string FastForwardBranch string CherryPick string @@ -502,12 +554,19 @@ type Actions struct { DropCommit string EditCommit string AmendCommit string + ResetCommitAuthor string + SetCommitAuthor string RevertCommit string CreateFixupCommit string SquashAllAboveFixupCommits string MoveCommitUp string MoveCommitDown string CopyCommitMessageToClipboard string + CopyCommitDiffToClipboard string + CopyCommitSHAToClipboard string + CopyCommitURLToClipboard string + CopyCommitAuthorToClipboard string + CopyCommitAttributeToClipboard string CustomCommand string DiscardAllChangesInDirectory string DiscardUnstagedChangesInDirectory string @@ -518,14 +577,20 @@ type Actions struct { UnstageFile string UnstageAllFiles string StageAllFiles string - IgnoreFile string + LcIgnoreExcludeFile string + IgnoreFileErr string + ExcludeFile string + ExcludeFileErr string + ExcludeGitIgnoreErr string Commit string EditFile string Push string Pull string OpenFile string StashAllChanges string + StashAllChangesKeepIndex string StashStagedChanges string + StashUnstagedChanges string GitFlowFinish string GitFlowStart string CopyToClipboard string @@ -548,7 +613,6 @@ type Actions struct { InitialiseSubmodule string BulkInitialiseSubmodules string BulkUpdateSubmodules string - BulkStashAndResetSubmodules string BulkDeinitialiseSubmodules string UpdateSubmodule string CreateLightweightTag string @@ -558,6 +622,7 @@ type Actions struct { NukeWorkingTree string DiscardUnstagedFileChanges string RemoveUntrackedFiles string + RemoveStagedFiles string SoftReset string MixedReset string HardReset string @@ -602,9 +667,11 @@ func EnglishTranslationSet() TranslationSet { UnstagedChanges: `Unstaged Changes`, StagedChanges: `Staged Changes`, MainTitle: "Main", - StagingTitle: "Staging", - MergingTitle: "Merging", - NormalTitle: "Normal", + MergeConfirmTitle: "Merge", + StagingTitle: "Main Panel (Staging)", + MergingTitle: "Main Panel (Merging)", + NormalTitle: "Main Panel (Normal)", + LogTitle: "Log", CommitMessage: "Commit message", CredentialsUsername: "Username", CredentialsPassword: "Password", @@ -612,6 +679,7 @@ func EnglishTranslationSet() TranslationSet { PassUnameWrong: "Password, passphrase and/or username wrong", CommitChanges: "commit changes", AmendLastCommit: "amend last commit", + AmendLastCommitTitle: "Amend Last Commit", SureToAmend: "Are you sure you want to amend last commit? Afterwards, you can change commit message from the commits panel.", NoCommitToAmend: "There's no commit to amend.", CommitChangesWithEditor: "commit changes using git editor", @@ -629,7 +697,7 @@ func EnglishTranslationSet() TranslationSet { LcScroll: "scroll", MergeConflictsTitle: "Merge Conflicts", LcCheckout: "checkout", - LcCommitFileFilter: "Filter commit files", + LcFileFilter: "Filter files (staged/unstaged)", FilterStagedFiles: "Show only staged files", FilterUnstagedFiles: "Show only unstaged files", ResetCommitFilterState: "Reset filter", @@ -659,11 +727,10 @@ func EnglishTranslationSet() TranslationSet { NoBranchesThisRepo: "No branches for this repo", CommitMessageConfirm: "{{.keyBindClose}}: close, {{.keyBindNewLine}}: new line, {{.keyBindConfirm}}: confirm", CommitWithoutMessageErr: "You cannot commit without a commit message", - CloseConfirm: "{{.keyBindClose}}: close, {{.keyBindConfirm}}: confirm", + CloseConfirm: "{{.keyBindClose}}: close/cancel, {{.keyBindConfirm}}: confirm", LcClose: "close", LcQuit: "quit", LcSquashDown: "squash down", - LcResetToThisCommit: "reset to this commit", LcFixupCommit: "fixup commit", NoCommitsThisBranch: "No commits for this branch", OnlySquashTopmostCommit: "Can only squash topmost commit", @@ -680,6 +747,9 @@ func EnglishTranslationSet() TranslationSet { LcMoveUpCommit: "move commit up one", LcEditCommit: "edit commit", LcAmendToCommit: "amend commit with staged changes", + LcResetCommitAuthor: "reset commit author", + SetAuthorPromptTitle: "Set author (must look like 'Name ')", + SureResetCommitAuthor: "The author field of this commit will be updated to match the configured user. This also renews the author timestamp. Continue?", LcRenameCommitEditor: "reword commit with editor", Error: "Error", LcSelectHunk: "select hunk", @@ -689,6 +759,8 @@ func EnglishTranslationSet() TranslationSet { LcUndo: "undo", LcUndoReflog: "undo (via reflog) (experimental)", LcRedoReflog: "redo (via reflog) (experimental)", + UndoTooltip: "The reflog will be used to determine what git command to run to undo the last git command. This does not include changes to the working tree; only commits are taken into consideration.", + RedoTooltip: "The reflog will be used to determine what git command to run to redo the last git command. This does not include changes to the working tree; only commits are taken into consideration.", LcPop: "pop", LcDrop: "drop", LcApply: "apply", @@ -700,8 +772,8 @@ func EnglishTranslationSet() TranslationSet { StashApply: "Stash apply", SureApplyStashEntry: "Are you sure you want to apply this stash entry?", NoTrackedStagedFilesStash: "You have no tracked/staged files to stash", + NoFilesToStash: "You have no files to stash", StashChanges: "Stash changes", - MergeAborted: "Merge aborted", OpenConfig: "open config file", EditConfig: "edit config file", ForcePush: "Force push", @@ -710,9 +782,18 @@ func EnglishTranslationSet() TranslationSet { UpdatesRejectedAndForcePushDisabled: "Updates were rejected and you have disabled force pushing", LcCheckForUpdate: "check for update", CheckingForUpdates: "Checking for updates...", + UpdateAvailableTitle: "Update available!", + UpdateAvailable: "Download and install version {{.newVersion}}?", + UpdateInProgressWaitingStatus: "updating", + UpdateCompletedTitle: "Update completed!", + UpdateCompleted: "Update has been installed successfully. Restart lazygit for it to take effect.", + FailedToRetrieveLatestVersionErr: "Failed to retrieve version information", OnLatestVersionErr: "You already have the latest version", MajorVersionErr: "New version ({{.newVersion}}) has non-backwards compatible changes compared to the current version ({{.currentVersion}})", CouldNotFindBinaryErr: "Could not find any binary at {{.url}}", + UpdateFailedErr: "Update failed: {{.errMessage}}", + ConfirmQuitDuringUpdateTitle: "Currently Updating", + ConfirmQuitDuringUpdate: "An update is in progress. Are you sure you want to quit?", MergeToolTitle: "Merge tool", MergeToolPrompt: "Are you sure you want to open `git mergetool`?", IntroPopupMessage: englishIntroPopupMessage, @@ -720,6 +801,7 @@ func EnglishTranslationSet() TranslationSet { LcEditFile: `edit file`, LcOpenFile: `open file`, LcIgnoreFile: `add to .gitignore`, + LcExcludeFile: `add to .git/info/exclude`, LcRefreshFiles: `refresh files`, LcMergeIntoCurrentBranch: `merge into currently checked out branch`, ConfirmQuit: `Are you sure you want to quit?`, @@ -739,7 +821,8 @@ func EnglishTranslationSet() TranslationSet { ToggleDragSelect: `toggle drag select`, ToggleSelectHunk: `toggle select hunk`, ToggleSelectionForPatch: `add/remove line(s) to patch`, - TogglePanel: `switch to other panel`, + EditHunk: `edit hunk`, + ToggleStagingPanel: `switch to other panel (staged/unstaged changes)`, ReturnToFilesPanel: `return to files panel`, FastForward: `fast-forward this branch from its upstream`, Fetching: "fetching and fast-forwarding {{.from}} -> {{.to}} ...", @@ -753,17 +836,16 @@ func EnglishTranslationSet() TranslationSet { MergeOptionsTitle: "Merge Options", RebaseOptionsTitle: "Rebase Options", CommitMessageTitle: "Commit Message", - LocalBranchesTitle: "Branches Tab", + LocalBranchesTitle: "Local Branches", SearchTitle: "Search", - TagsTitle: "Tags Tab", + TagsTitle: "Tags", MenuTitle: "Menu", - RemotesTitle: "Remotes Tab", - CredentialsTitle: "Credentials", - RemoteBranchesTitle: "Remote Branches (in Remotes tab)", - PatchBuildingTitle: "Patch Building", + RemotesTitle: "Remotes", + RemoteBranchesTitle: "Remote Branches", + PatchBuildingTitle: "Main Panel (Patch Building)", InformationTitle: "Information", SecondaryTitle: "Secondary", - ReflogCommitsTitle: "Reflog Tab", + ReflogCommitsTitle: "Reflog", GlobalTitle: "Global Keybindings", ConflictsResolved: "all merge conflicts resolved. Continue?", RebasingTitle: "Rebasing", @@ -813,7 +895,10 @@ func EnglishTranslationSet() TranslationSet { CheckingOutStatus: "checking out", CommittingStatus: "committing", CommitFiles: "Commit files", - LcViewCommitFiles: "view commit's files", + SubCommitsDynamicTitle: "Commits (%s)", + CommitFilesDynamicTitle: "Diff files (%s)", + RemoteBranchesDynamicTitle: "Remote branches (%s)", + LcViewItemFiles: "view selected item's files", CommitFilesTitle: "Commit Files", LcCheckoutCommitFile: "checkout file", LcDiscardOldFileChange: "discard this commit's changes to this file", @@ -821,6 +906,9 @@ func EnglishTranslationSet() TranslationSet { DiscardFileChangesPrompt: "Are you sure you want to discard this commit's changes to this file? If this file was created in this commit, it will be deleted", DisabledForGPG: "Feature not available for users using GPG", CreateRepo: "Not in a git repository. Create a new git repository? (y/n): ", + InitialBranch: "Branch name? (leave empty for git's default): ", + NoRecentRepositories: "Must open lazygit in a git repository. No valid recent repositories. Exiting.", + IncorrectNotARepository: "The value of 'notARepository' is incorrect. It should be one of 'prompt', 'create', 'skip', or 'quit'.", AutoStashTitle: "Autostash?", AutoStashPrompt: "You must stash and pop your changes to bring them across. Do this automatically? (enter/esc)", StashPrefix: "Auto-stashing changes for ", @@ -831,6 +919,7 @@ func EnglishTranslationSet() TranslationSet { LcDiscardAllChangesToAllFiles: "nuke working tree", LcDiscardAnyUnstagedChanges: "discard unstaged changes", LcDiscardUntrackedFiles: "discard untracked files", + LcDiscardStagedChanges: "discard staged changes", LcHardReset: "hard reset", LcViewResetOptions: `view reset options`, LcCreateFixupCommit: `create fixup commit for this commit`, @@ -846,8 +935,10 @@ func EnglishTranslationSet() TranslationSet { LcResetTo: `reset to`, PressEnterToReturn: "Press enter to return to lazygit", LcViewStashOptions: "view stash options", - LcStashAllChanges: "stash changes", + LcStashAllChanges: "stash all changes", LcStashStagedChanges: "stash staged changes", + LcStashAllChangesKeepIndex: "stash all changes and keep index", + LcStashUnstagedChanges: "stash unstaged changes", LcStashOptions: "Stash options", NotARepository: "Error: must be run inside a git repository", LcJump: "jump to panel", @@ -858,11 +949,13 @@ func EnglishTranslationSet() TranslationSet { DiscardPatchConfirm: "You can only build a patch from one commit/stash-entry at a time. Discard current patch?", CantPatchWhileRebasingError: "You cannot build a patch or run patch commands while in a merging or rebasing state", LcToggleAddToPatch: "toggle file included in patch", + LcToggleAllInPatch: "toggle all files included in patch", + LcUpdatingPatch: "updating patch", ViewPatchOptions: "view custom patch options", PatchOptionsTitle: "Patch Options", NoPatchError: "No patch created yet. To start building a patch, use 'space' on a commit file or enter to add specific lines", LcEnterFile: "enter file to add selected lines to the patch (or toggle directory collapsed)", - ExitLineByLineMode: `exit line-by-line mode`, + ExitCustomPatchBuilder: `exit custom patch builder`, EnterUpstream: `Enter upstream as ' '`, InvalidUpstream: "Invalid upstream. Must be in the format ' '", ReturnToRemotesList: `Return to remotes list`, @@ -875,7 +968,9 @@ func EnglishTranslationSet() TranslationSet { LcRemoveRemotePrompt: "Are you sure you want to remove remote", DeleteRemoteBranch: "Delete Remote Branch", DeleteRemoteBranchMessage: "Are you sure you want to delete remote branch", - LcSetUpstream: "set as upstream of checked-out branch", + LcSetAsUpstream: "set as upstream of checked-out branch", + LcSetUpstream: "set upstream of selected branch", + LcUnsetUpstream: "unset upstream of selected branch", SetUpstreamTitle: "Set upstream branch", SetUpstreamMessage: "Are you sure you want to set the upstream branch of '{{.checkedOut}}' to '{{.selected}}'", LcEditRemote: "edit remote", @@ -901,6 +996,8 @@ func EnglishTranslationSet() TranslationSet { NewGitFlowBranchPrompt: "new {{.branchType}} name:", IgnoreTracked: "Ignore tracked file", IgnoreTrackedPrompt: "Are you sure you want to ignore a tracked file?", + ExcludeTracked: "Exclude tracked file", + ExcludeTrackedPrompt: "Are you sure you want to exclude a tracked file?", LcViewResetToUpstreamOptions: "view upstream reset options", LcNextScreenMode: "next screen mode (normal/half/fullscreen)", LcPrevScreenMode: "prev screen mode", @@ -908,10 +1005,10 @@ func EnglishTranslationSet() TranslationSet { Panel: "Panel", Keybindings: "Keybindings", LcRenameBranch: "rename branch", + LcSetUnsetUpstream: "set/unset upstream", NewBranchNamePrompt: "Enter new branch name for branch", RenameBranchWarning: "This branch is tracking a remote. This action will only rename the local branch name, not the name of the remote branch. Continue?", LcOpenMenu: "open menu", - LcCloseMenu: "close menu", LcResetCherryPick: "reset cherry-picked (copied) commits selection", LcNextTab: "next tab", LcPrevTab: "previous tab", @@ -944,8 +1041,14 @@ func EnglishTranslationSet() TranslationSet { // the actual view is the extras view which I intend to give more tabs in future but for now we'll only mention the command log part LcOpenExtrasMenu: "open command log menu", LcShowingGitDiff: "showing output for:", + LcCommitDiff: "commit diff", LcCopyCommitShaToClipboard: "copy commit SHA to clipboard", + LcCommitSha: "commit SHA", + LcCommitURL: "commit URL", LcCopyCommitMessageToClipboard: "copy commit message to clipboard", + LcCommitMessage: "commit message", + LcCommitAuthor: "commit author", + LcCopyCommitAttributeToClipboard: "copy commit attribute", LcCopyBranchNameToClipboard: "copy branch name to clipboard", LcCopyFileNameToClipboard: "copy the file name to the clipboard", LcCopyCommitFileNameToClipboard: "copy the committed file name to the clipboard", @@ -955,10 +1058,10 @@ func EnglishTranslationSet() TranslationSet { NoFilesStagedPrompt: "You have not staged any files. Commit all files?", BranchNotFoundTitle: "Branch not found", BranchNotFoundPrompt: "Branch not found. Create a new branch named", + LcBranchUnknown: "branch unknown", UnstageLinesTitle: "Unstage lines", UnstageLinesPrompt: "Are you sure you want to delete the selected lines (git reset)? It is irreversible.\nTo disable this dialogue set the config key of 'gui.skipUnstageLineWarning' to true", LcCreateNewBranchFromCommit: "create new branch off of commit", - LcViewStashFiles: "view stash entry's files", LcBuildingPatch: "building patch", LcViewCommits: "view commits", MinGitVersionError: "Git version must be at least 2.0 (i.e. from 2014 onwards). Please upgrade your git version. Alternatively raise an issue at https://github.com/jesseduffield/lazygit/issues for lazygit to be more backwards compatible.", @@ -995,12 +1098,16 @@ func EnglishTranslationSet() TranslationSet { NavigationTitle: "List Panel Navigation", SuggestionsCheatsheetTitle: "Suggestions", SuggestionsTitle: "Suggestions (press %s to focus)", - ExtrasTitle: "Extras", + ExtrasTitle: "Command Log", PushingTagStatus: "pushing tag", SelectRemoteRepository: "select base remote repository", LcSelectingRemote: "selecting remote", PullRequestURLCopiedToClipboard: "Pull request URL copied to clipboard", + CommitDiffCopiedToClipboard: "Commit diff copied to clipboard", + CommitSHACopiedToClipboard: "Commit SHA copied to clipboard", + CommitURLCopiedToClipboard: "Commit URL copied to clipboard", CommitMessageCopiedToClipboard: "Commit message copied to clipboard", + CommitAuthorCopiedToClipboard: "Commit author copied to clipboard", LcCopiedToClipboard: "copied to clipboard", ErrCannotEditDirectory: "Cannot edit directory: you can only edit individual files", ErrStageDirWithInlineMergeConflicts: "Cannot stage/unstage directory containing files with inline merge conflicts. Please fix up the merge conflicts first", @@ -1043,10 +1150,19 @@ func EnglishTranslationSet() TranslationSet { LcOpenCommitInBrowser: "open commit in browser", LcViewBisectOptions: "view bisect options", ConfirmRevertCommit: "Are you sure you want to revert {{.selectedCommit}}?", + RewordInEditorTitle: "Reword in editor", + RewordInEditorPrompt: "Are you sure you want to reword this commit in your editor?", + HardResetAutostashPrompt: "Are you sure you want to hard reset to '%s'? An auto-stash will be performed if necessary.", + CheckoutPrompt: "Are you sure you want to checkout '%s'?", + UpstreamGone: "(upstream gone)", + NukeDescription: "If you want to make all the changes in the worktree go away, this is the way to do it. If there are dirty submodule changes this will stash those changes in the submodule(s).", + DiscardStagedChangesDescription: "This will create a new stash entry containing only staged files and then drop it, so that the working tree is left with only unstaged changes", + EmptyOutput: "", + Patch: "Patch", + CustomPatch: "Custom patch", Actions: Actions{ // TODO: combine this with the original keybinding descriptions (those are all in lowercase atm) CheckoutCommit: "Checkout commit", - CheckoutReflogCommit: "Checkout reflog commit", CheckoutTag: "Checkout tag", CheckoutBranch: "Checkout branch", ForceCheckoutBranch: "Force checkout branch", @@ -1054,6 +1170,7 @@ func EnglishTranslationSet() TranslationSet { Merge: "Merge", RebaseBranch: "Rebase branch", RenameBranch: "Rename branch", + SetUnsetUpstream: "Set/unset upstream", CreateBranch: "Create branch", CherryPick: "(Cherry-pick) Paste commits", CheckoutFile: "Checkout file", @@ -1064,12 +1181,19 @@ func EnglishTranslationSet() TranslationSet { DropCommit: "Drop commit", EditCommit: "Edit commit", AmendCommit: "Amend commit", + ResetCommitAuthor: "Reset commit author", + SetCommitAuthor: "Set commit author", RevertCommit: "Revert commit", CreateFixupCommit: "Create fixup commit", SquashAllAboveFixupCommits: "Squash all above fixup commits", CreateLightweightTag: "Create lightweight tag", CreateAnnotatedTag: "Create annotated tag", CopyCommitMessageToClipboard: "Copy commit message to clipboard", + CopyCommitDiffToClipboard: "Copy commit diff to clipboard", + CopyCommitSHAToClipboard: "Copy commit SHA to clipboard", + CopyCommitURLToClipboard: "Copy commit URL to clipboard", + CopyCommitAuthorToClipboard: "Copy commit author to clipboard", + CopyCommitAttributeToClipboard: "Copy to clipboard", MoveCommitUp: "Move commit up", MoveCommitDown: "Move commit down", CustomCommand: "Custom command", @@ -1082,14 +1206,20 @@ func EnglishTranslationSet() TranslationSet { UnstageFile: "Unstage file", UnstageAllFiles: "Unstage all files", StageAllFiles: "Stage all files", - IgnoreFile: "Ignore file", + LcIgnoreExcludeFile: "ignore or exclude file", + IgnoreFileErr: "Cannot ignore .gitignore", + ExcludeFile: "Exclude file", + ExcludeFileErr: "Cannot exclude .git/info/exclude", + ExcludeGitIgnoreErr: "Cannot exclude .gitignore", Commit: "Commit", EditFile: "Edit file", Push: "Push", Pull: "Pull", OpenFile: "Open file", StashAllChanges: "Stash all changes", + StashAllChangesKeepIndex: "Stash all changes and keep index", StashStagedChanges: "Stash staged changes", + StashUnstagedChanges: "Stash unstaged changes", GitFlowFinish: "Git flow finish", GitFlowStart: "Git Flow start", CopyToClipboard: "Copy to clipboard", @@ -1112,7 +1242,6 @@ func EnglishTranslationSet() TranslationSet { InitialiseSubmodule: "Initialise submodule", BulkInitialiseSubmodules: "Bulk initialise submodules", BulkUpdateSubmodules: "Bulk update submodules", - BulkStashAndResetSubmodules: "Bulk stash and reset submodules", BulkDeinitialiseSubmodules: "Bulk deinitialise submodules", UpdateSubmodule: "Update submodule", DeleteTag: "Delete tag", @@ -1120,6 +1249,7 @@ func EnglishTranslationSet() TranslationSet { NukeWorkingTree: "Nuke working tree", DiscardUnstagedFileChanges: "Discard unstaged file changes", RemoveUntrackedFiles: "Remove untracked files", + RemoveStagedFiles: "Remove staged files", SoftReset: "Soft reset", MixedReset: "Mixed reset", HardReset: "Hard reset", diff --git a/pkg/i18n/i18n.go b/pkg/i18n/i18n.go index f6c57da8d..6819ecd87 100644 --- a/pkg/i18n/i18n.go +++ b/pkg/i18n/i18n.go @@ -50,6 +50,8 @@ func GetTranslationSets() map[string]TranslationSet { "nl": dutchTranslationSet(), "en": EnglishTranslationSet(), "zh": chineseTranslationSet(), + "ja": japaneseTranslationSet(), + "ko": koreanTranslationSet(), } } diff --git a/pkg/i18n/japanese.go b/pkg/i18n/japanese.go new file mode 100644 index 000000000..03d949549 --- /dev/null +++ b/pkg/i18n/japanese.go @@ -0,0 +1,601 @@ +package i18n + +const japaneseIntroPopupMessage = ` +Thanks for using lazygit! Seriously you rock. Three things to share with you: + + 1) If you want to learn about lazygit's features, watch this vid: + https://youtu.be/CPLdltN7wgE + + 2) Be sure to read the latest release notes at: + https://github.com/jesseduffield/lazygit/releases + + 3) If you're using git, that makes you a programmer! With your help we can make + lazygit better, so consider becoming a contributor and joining the fun at + https://github.com/jesseduffield/lazygit + You can also sponsor me and tell me what to work on by clicking the donate + button at the bottom right. + Or even just star the repo to share the love! +` + +// exporting this so we can use it in tests +func japaneseTranslationSet() TranslationSet { + return TranslationSet{ + NotEnoughSpace: "ă‘ăŤă«ă®ćŹŹç”»ă«ĺŤĺ†ăŞç©şé–“ăŚă‚りăľă›ă‚“", + DiffTitle: "ĺ·®ĺ†", + FilesTitle: "ă•ァイă«", + BranchesTitle: "ă–ă©ăłă", + CommitsTitle: "コăźăă", + StashTitle: "Stash", + UnstagedChanges: `スă†ăĽă‚¸ă•れă¦ă„ăŞă„変更`, + StagedChanges: `スă†ăĽă‚¸ă•れăźĺ¤‰ć›´`, + MainTitle: "ăˇă‚¤ăł", + MergeConfirmTitle: "ăžăĽă‚¸", + StagingTitle: "ăˇă‚¤ăłă‘ăŤă« (Staging)", + MergingTitle: "ăˇă‚¤ăłă‘ăŤă« (Merging)", + NormalTitle: "ăˇă‚¤ăłă‘ăŤă« (Normal)", + LogTitle: "ă­ă‚°", + CommitMessage: "コăźăăăˇăă‚»ăĽă‚¸", + CredentialsUsername: "ă¦ăĽă‚¶ĺŤ", + CredentialsPassword: "ă‘スăŻăĽă‰", + CredentialsPassphrase: "SSH鍵ă®ă‘スă•ă¬ăĽă‚şă‚’入力", + PassUnameWrong: "ă‘スăŻăĽă‰, ă‘スă•ă¬ăĽă‚şăľăźăŻă¦ăĽă‚¶ĺŤăŚé–“é•ăŁă¦ă„ăľă™ă€‚", + CommitChanges: "変更をコăźăă", + AmendLastCommit: "最新ă®ă‚łăźăăă«amend", + AmendLastCommitTitle: "最新ă®ă‚łăźăăă«amend", + SureToAmend: "最新ă®ă‚łăźăăă«ĺ¤‰ć›´ă‚’amendă—ăľă™ă€‚ă‚ろă—ă„ă§ă™ă‹? コăźăăăˇăă‚»ăĽă‚¸ăŻă‚łăźăăă‘ăŤă«ă‹ă‚‰ĺ¤‰ć›´ă§ăŤăľă™ă€‚", + NoCommitToAmend: "amend可č˝ăŞă‚łăźăăăŚĺ­ĺś¨ă—ăľă›ă‚“。", + CommitChangesWithEditor: "gitエă‡ă‚Łă‚żă‚’使用ă—ă¦ĺ¤‰ć›´ă‚’コăźăă", + StatusTitle: "スă†ăĽă‚żă‚ą", + LcNavigate: "移動", + LcMenu: "ăˇă‹ăĄăĽ", + LcExecute: "実行", + LcToggleStaged: "スă†ăĽă‚¸/アăłă‚ąă†ăĽă‚¸", + LcToggleStagedAll: "ă™ăąă¦ă®ĺ¤‰ć›´ă‚’スă†ăĽă‚¸/アăłă‚ąă†ăĽă‚¸", + LcToggleTreeView: "ă•ァイă«ă„ăŞăĽă®čˇ¨ç¤şă‚’ĺ‡ă‚Šć›żă", + LcOpenMergeTool: "git mergetoolă‚’é–‹ăŹ", + LcRefresh: "ăŞă•ă¬ăă‚·ăĄ", + LcPush: "push", + LcPull: "pull", + LcScroll: "スクă­ăĽă«", + MergeConflictsTitle: "ăžăĽă‚¸ă‚łăłă•ăŞă‚Żă", + LcCheckout: "ăă‚§ăクアウă", + LcFileFilter: "ă•ァイă«ă‚’ă•ィă«ă‚ż (スă†ăĽă‚¸/アăłă‚ąă†ăĽă‚¸)", + FilterStagedFiles: "スă†ăĽă‚¸ă•れăźă•ァイă«ă®ăżă‚’表示", + FilterUnstagedFiles: "スă†ăĽă‚¸ă•れă¦ă„ăŞă„ă•ァイă«ă®ăżă‚’表示", + ResetCommitFilterState: "ă•ィă«ă‚żă‚’ăŞă‚»ăă", + // NoChangedFiles: "No changed files", + // NoFilesDisplay: "No file to display", + // NotAFile: "Not a file", + PullWait: "Pull中...", + PushWait: "Push中...", + FetchWait: "Fetch中...", + LcSoftReset: "softăŞă‚»ăă", + AlreadyCheckedOutBranch: "ă–ă©ăłăăŻă™ă§ă«ăă‚§ăクアウăă•れă¦ă„ăľă™ă€‚", + // SureForceCheckout: "Are you sure you want force checkout? You will lose all local changes", + // ForceCheckoutBranch: "Force Checkout Branch", + BranchName: "ă–ă©ăłăĺŤ", + NewBranchNameBranchOff: "新規ă–ă©ăłăĺŤ ('{{.branchName}}' ă«ä˝ść)", + CantDeleteCheckOutBranch: "ăă‚§ăクアウă中ă®ă–ă©ăłăăŻĺ‰Šé™¤ă§ăŤăľă›ă‚“!", + DeleteBranch: "ă–ă©ăłăを削除", + DeleteBranchMessage: "ă–ă©ăłă '{{.selectedBranchName}}' を削除ă—ăľă™ă€‚ă‚ろă—ă„ă§ă™ă‹?", + ForceDeleteBranchMessage: "'{{.selectedBranchName}}' ăŻăžăĽă‚¸ă•れă¦ă„ăľă›ă‚“。本当ă«ĺ‰Šé™¤ă—ăľă™ă‹?", + // LcRebaseBranch: "rebase checked-out branch onto this branch", + CantRebaseOntoSelf: "ă–ă©ăłăを自ĺ†č‡Şčş«ă«ăŞă™ăĽă‚ąă™ă‚‹ă“ă¨ăŻă§ăŤăľă›ă‚“。", + CantMergeBranchIntoItself: "ă–ă©ăłăを自ĺ†č‡Şčş«ă«ăžăĽă‚¸ă™ă‚‹ă“ă¨ăŻă§ăŤăľă›ă‚“。", + // LcForceCheckout: "force checkout", + // LcCheckoutByName: "checkout by name", + LcNewBranch: "ć–°ă—ă„ă–ă©ăłăを作ć", + LcDeleteBranch: "ă–ă©ăłăを削除", + NoBranchesThisRepo: "ăŞăťă‚¸ăăŞă«ă–ă©ăłăăŚĺ­ĺś¨ă—ăľă›ă‚“", + CommitMessageConfirm: "{{.keyBindClose}}: é–‰ăă‚‹, {{.keyBindNewLine}}: 改行, {{.keyBindConfirm}}: 確定", + CommitWithoutMessageErr: "コăźăăăˇăă‚»ăĽă‚¸ă‚’入力ă—ă¦ăŹă ă•ă„", + CloseConfirm: "{{.keyBindClose}}: é–‰ăă‚‹/ă‚­ăŁăłă‚»ă«, {{.keyBindConfirm}}: 確認", + LcClose: "é–‰ăă‚‹", + LcQuit: "終了", + // LcSquashDown: "squash down", + // LcFixupCommit: "fixup commit", + // NoCommitsThisBranch: "No commits for this branch", + // OnlySquashTopmostCommit: "Can only squash topmost commit", + // YouNoCommitsToSquash: "You have no commits to squash with", + // Fixup: "Fixup", + // SureFixupThisCommit: "Are you sure you want to 'fixup' this commit? It will be merged into the commit below", + // SureSquashThisCommit: "Are you sure you want to squash this commit into the commit below?", + // Squash: "Squash", + // LcPickCommit: "pick commit (when mid-rebase)", + LcRevertCommit: "コăźăăă‚’revert", + LcRewordCommit: "コăźăăăˇăă‚»ăĽă‚¸ă‚’変更", + LcDeleteCommit: "コăźăăを削除", + LcMoveDownCommit: "コăźăăă‚’1ă¤ä¸‹ă«ç§»ĺ‹•", + LcMoveUpCommit: "コăźăăă‚’1ă¤ä¸Šă«ç§»ĺ‹•", + LcEditCommit: "コăźăăを編集", + LcAmendToCommit: "スă†ăĽă‚¸ă•れăźĺ¤‰ć›´ă§amendコăźăă", + LcRenameCommitEditor: "エă‡ă‚Łă‚żă§ă‚łăźăăăˇăă‚»ăĽă‚¸ă‚’編集", + Error: "エă©ăĽ", + LcSelectHunk: "hunkă‚’é¸ćŠž", + LcNavigateConflicts: "コăłă•ăŞă‚Żăを移動", + // LcPickHunk: "pick hunk", + // LcPickAllHunks: "pick all hunks", + LcUndo: "アăłă‰ă‚Ą", + LcUndoReflog: "アăłă‰ă‚Ą (via reflog) (experimental)", + LcRedoReflog: "ăŞă‰ă‚Ą (via reflog) (experimental)", + LcPop: "pop", + LcDrop: "drop", + LcApply: "é©ç”¨", + NoStashEntries: "StashăŚĺ­ĺś¨ă—ăľă›ă‚“", + StashDrop: "Stashを削除", + SureDropStashEntry: "Stashを削除ă—ăľă™ă€‚ă‚ろă—ă„ă§ă™ă‹?", + StashPop: "Stashă‚’pop", + SurePopStashEntry: "Stashă‚’popă—ăľă™ă€‚ă‚ろă—ă„ă§ă™ă‹?", + StashApply: "Stashă‚’é©ç”¨", + SureApplyStashEntry: "Stashă‚’é©ç”¨ă—ăľă™ă€‚ă‚ろă—ă„ă§ă™ă‹?", + // NoTrackedStagedFilesStash: "You have no tracked/staged files to stash", + StashChanges: "変更をStash", + OpenConfig: "設定ă•ァイă«ă‚’é–‹ăŹ", + EditConfig: "設定ă•ァイă«ă‚’編集", + ForcePush: "Force push", + ForcePushPrompt: "ă–ă©ăłăăŚăŞă˘ăĽăă–ă©ăłăă‹ă‚‰ĺ†ĺ˛ă—ă¦ă„ăľă™ă€‚'esc'ă§ă‚­ăŁăłă‚»ă«, ăľăźăŻ'enter'ă§force pushă—ăľă™ă€‚", + ForcePushDisabled: "ă–ă©ăłăăŚăŞă˘ăĽăă–ă©ăłăă‹ă‚‰ĺ†ĺ˛ă—ă¦ă„ăľă™ă€‚force pushăŻç„ˇĺŠąĺŚ–ă•れă¦ă„ăľă™ă€‚", + // UpdatesRejectedAndForcePushDisabled: "Updates were rejected and you have disabled force pushing", + LcCheckForUpdate: "更新を確認", + CheckingForUpdates: "更新を確認中...", + UpdateAvailableTitle: "最新ăŞăŞăĽă‚ą!", + UpdateAvailable: "ăăĽă‚¸ă§ăł {{.newVersion}} をイăłă‚ąăăĽă«ă—ăľă™ă‹?", + UpdateInProgressWaitingStatus: "更新中", + UpdateCompletedTitle: "更新完了!", + UpdateCompleted: "ć›´ć–°ă®ă‚¤ăłă‚ąăăĽă«ă«ć功ă—ăľă—ăźă€‚lazygitを再起動ă—ă¦ăŹă ă•ă„。", + FailedToRetrieveLatestVersionErr: "ăăĽă‚¸ă§ăłć…ĺ ±ă®ĺŹ–ĺľ—ă«ĺ¤±ć•—ă—ăľă—ăź", + OnLatestVersionErr: "使用中ă®ăăĽă‚¸ă§ăłăŻćś€ć–°ă§ă™", + MajorVersionErr: "ć–°ăăĽă‚¸ă§ăł ({{.newVersion}}) ăŻçŹľĺś¨ă®ăăĽă‚¸ă§ăł ({{.currentVersion}}) ă¨ĺľŚć–ąäş’換性ăŚă‚りăľă›ă‚“。", + CouldNotFindBinaryErr: "{{.url}} ă«ăイăŠăŞăŚĺ­ĺś¨ă—ăľă›ă‚“ă§ă—ăźă€‚", + UpdateFailedErr: "更新失敗: {{.errMessage}}", + ConfirmQuitDuringUpdateTitle: "現在更新中", + ConfirmQuitDuringUpdate: "現在更新を実行中ă§ă™ă€‚終了ă—ăľă™ă‹?", + MergeToolTitle: "ăžăĽă‚¸ă„ăĽă«", + MergeToolPrompt: "`git mergetool`ă‚’é–‹ăŤăľă™ă€‚ă‚ろă—ă„ă§ă™ă‹?", + IntroPopupMessage: japaneseIntroPopupMessage, + // GitconfigParseErr: `Gogit failed to parse your gitconfig file due to the presence of unquoted '\' characters. Removing these should fix the issue.`, + LcEditFile: `ă•ァイă«ă‚’編集`, + LcOpenFile: `ă•ァイă«ă‚’é–‹ăŹ`, + LcIgnoreFile: `.gitignoreă«čż˝ĺŠ `, + LcRefreshFiles: `ă•ァイă«ă‚’ăŞă•ă¬ăă‚·ăĄ`, + LcMergeIntoCurrentBranch: `現在ă®ă–ă©ăłăă«ăžăĽă‚¸`, + ConfirmQuit: `終了ă—ăľă™ă€‚ă‚ろă—ă„ă§ă™ă‹?`, + SwitchRepo: `最近使用ă—ăźăŞăťă‚¸ăăŞă«ĺ‡ă‚Šć›żă`, + LcAllBranchesLogGraph: `ă™ăąă¦ă®ă–ă©ăłăă­ă‚°ă‚’表示`, + UnsupportedGitService: `サăťăĽăă•れă¦ă„ăŞă„GitサăĽă“スă§ă™ă€‚`, + LcCreatePullRequest: `Pull Requestを作ć`, + LcCopyPullRequestURL: `Pull Requestă®URLをクăŞăă—ăśăĽă‰ă«ă‚łă”ăĽ`, + NoBranchOnRemote: `ă–ă©ăłăăŚăŞă˘ăĽăă«ĺ­ĺś¨ă—ăľă›ă‚“。ăŞă˘ăĽăă«pushă—ă¦ăŹă ă•ă„。`, + LcFetch: `fetch`, + // NoAutomaticGitFetchTitle: `No automatic git fetch`, + // NoAutomaticGitFetchBody: `Lazygit can't use "git fetch" in a private repo; use 'f' in the files panel to run "git fetch" manually`, + // FileEnter: `stage individual hunks/lines for file, or collapse/expand for directory`, + // FileStagingRequirements: `Can only stage individual lines for tracked files`, + StageSelection: `é¸ćŠžčˇŚă‚’ă‚ąă†ăĽă‚¸/アăłă‚ąă†ăĽă‚¸`, + ResetSelection: `変更を削除 (git reset)`, + ToggleDragSelect: `範囲é¸ćŠžă‚’ĺ‡ă‚Šć›żă`, + ToggleSelectHunk: `hunké¸ćŠžă‚’ĺ‡ă‚Šć›żă`, + ToggleSelectionForPatch: `行をă‘ăăă«čż˝ĺŠ /削除`, + ToggleStagingPanel: `ă‘ăŤă«ă‚’ĺ‡ă‚Šć›żă`, + ReturnToFilesPanel: `ă•ァイă«ä¸€č¦§ă«ć»ă‚‹`, + // FastForward: `fast-forward this branch from its upstream`, + // Fetching: "fetching and fast-forwarding {{.from}} -> {{.to}} ...", + // FoundConflicts: "Conflicts! To abort press 'esc', otherwise press 'enter'", + // FoundConflictsTitle: "Auto-merge failed", + // PickHunk: "pick hunk", + // PickAllHunks: "pick all hunks", + // ViewMergeRebaseOptions: "view merge/rebase options", + // NotMergingOrRebasing: "You are currently neither rebasing nor merging", + RecentRepos: "最近使用ă—ăźăŞăťă‚¸ăăŞ", + // MergeOptionsTitle: "Merge Options", + // RebaseOptionsTitle: "Rebase Options", + CommitMessageTitle: "コăźăăăˇăă‚»ăĽă‚¸", + LocalBranchesTitle: "ă–ă©ăłă", + SearchTitle: "検索", + TagsTitle: "タグ", + MenuTitle: "ăˇă‹ăĄăĽ", + RemotesTitle: "ăŞă˘ăĽă", + RemoteBranchesTitle: "ăŞă˘ăĽăă–ă©ăłă", + PatchBuildingTitle: "ăˇă‚¤ăłă‘ăŤă« (Patch Building)", + InformationTitle: "Information", + SecondaryTitle: "Secondary", + ReflogCommitsTitle: "参照ă­ă‚°", + GlobalTitle: "ă‚°ă­ăĽăă«ă‚­ăĽăイăłă‰", + // ConflictsResolved: "all merge conflicts resolved. Continue?", + // RebasingTitle: "Rebasing", + // ConfirmRebase: "Are you sure you want to rebase '{{.checkedOutBranch}}' onto '{{.selectedBranch}}'?", + // ConfirmMerge: "Are you sure you want to merge '{{.selectedBranch}}' into '{{.checkedOutBranch}}'?", + // FwdNoUpstream: "Cannot fast-forward a branch with no upstream", + // FwdNoLocalUpstream: "Cannot fast-forward a branch whose remote is not registered locally", + // FwdCommitsToPush: "Cannot fast-forward a branch with commits to push", + ErrorOccurred: "エă©ăĽăŚç™şç”źă—ăľă—ăź! issueを作ćă—ă¦ăŹă ă•ă„: ", + // NoRoom: "Not enough room", + YouAreHere: "現在位置", + // LcRewordNotSupported: "rewording commits while interactively rebasing is not currently supported", + LcCherryPickCopy: "コăźăăをコă”㼠(cherry-pick)", + LcCherryPickCopyRange: "コăźăăを範囲コă”㼠(cherry-pick)", + LcPasteCommits: "コăźăăを貼りä»ă‘ (cherry-pick)", + // SureCherryPick: "Are you sure you want to cherry-pick the copied commits onto this branch?", + CherryPick: "Cherry-Pick", + // CannotRebaseOntoFirstCommit: "You cannot interactive rebase onto the first commit", + // CannotSquashOntoSecondCommit: "You cannot squash/fixup onto the second commit", + Donate: "支援", + AskQuestion: "質問", + PrevLine: "前ă®čˇŚă‚’é¸ćŠž", + NextLine: "次ă®čˇŚă‚’é¸ćŠž", + PrevHunk: "前ă®hunkă‚’é¸ćŠž", + NextHunk: "次ă®hunkă‚’é¸ćŠž", + PrevConflict: "前ă®ă‚łăłă•ăŞă‚Żăă‚’é¸ćŠž", + NextConflict: "次ă®ă‚łăłă•ăŞă‚Żăă‚’é¸ćŠž", + SelectPrevHunk: "前ă®hunkă‚’é¸ćŠž", + SelectNextHunk: "次ă®hunkă‚’é¸ćŠž", + ScrollDown: "下ă«ă‚ąă‚Żă­ăĽă«", + ScrollUp: "上ă«ă‚ąă‚Żă­ăĽă«", + LcScrollUpMainPanel: "ăˇă‚¤ăłă‘ăŤă«ă‚’上ă«ă‚ąă‚Żă­ăĽă«", + LcScrollDownMainPanel: "ăˇă‚¤ăłă‘ăŤă«ă‚’下ă«ă‚ąă‚Żă­ăĽă«", + AmendCommitTitle: "amendコăźăă", + AmendCommitPrompt: "スă†ăĽă‚¸ă•れăźă•ァイă«ă§çŹľĺś¨ă®ă‚łăźăăă‚’amendă—ăľă™ă€‚ă‚ろă—ă„ă§ă™ă‹?", + DeleteCommitTitle: "コăźăăを削除", + DeleteCommitPrompt: "é¸ćŠžă•れăźă‚łăźăăを削除ă—ăľă™ă€‚ă‚ろă—ă„ă§ă™ă‹?", + // SquashingStatus: "squashing", + // FixingStatus: "fixing up", + // DeletingStatus: "deleting", + // MovingStatus: "moving", + // RebasingStatus: "rebasing", + // AmendingStatus: "amending", + // CherryPickingStatus: "cherry-picking", + // UndoingStatus: "undoing", + // RedoingStatus: "redoing", + // CheckingOutStatus: "checking out", + // CommittingStatus: "committing", + CommitFiles: "Commit files", + SubCommitsDynamicTitle: "コăźăă (%s)", + CommitFilesDynamicTitle: "Diff files (%s)", + RemoteBranchesDynamicTitle: "ăŞă˘ăĽăă–ă©ăłă (%s)", + // LcViewItemFiles: "view selected item's files", + CommitFilesTitle: "コăźăăă•ァイă«", + // LcCheckoutCommitFile: "checkout file", + // LcDiscardOldFileChange: "discard this commit's changes to this file", + DiscardFileChangesTitle: "ă•ァイă«ă®ĺ¤‰ć›´ă‚’破棄", + // DiscardFileChangesPrompt: "Are you sure you want to discard this commit's changes to this file? If this file was created in this commit, it will be deleted", + // DisabledForGPG: "Feature not available for users using GPG", + CreateRepo: "GităŞăťă‚¸ăăŞă§ăŻă‚りăľă›ă‚“。ăŞăťă‚¸ăăŞă‚’作ćă—ăľă™ă‹? (y/n): ", + // AutoStashTitle: "Autostash?", + // AutoStashPrompt: "You must stash and pop your changes to bring them across. Do this automatically? (enter/esc)", + // StashPrefix: "Auto-stashing changes for ", + // LcViewDiscardOptions: "view 'discard changes' options", + LcCancel: "ă‚­ăŁăłă‚»ă«", + LcDiscardAllChanges: "ă™ăąă¦ă®ĺ¤‰ć›´ă‚’破棄", + // LcDiscardUnstagedChanges: "discard unstaged changes", + // LcDiscardAllChangesToAllFiles: "nuke working tree", + // LcDiscardAnyUnstagedChanges: "discard unstaged changes", + // LcDiscardUntrackedFiles: "discard untracked files", + LcHardReset: "hardăŞă‚»ăă", + // LcViewResetOptions: `view reset options`, + LcCreateFixupCommit: `ă“ă®ă‚łăźăăă«ĺŻľă™ă‚‹fixupコăźăăを作ć`, + // LcSquashAboveCommits: `squash all 'fixup!' commits above selected commit (autosquash)`, + // SquashAboveCommits: `Squash all 'fixup!' commits above selected commit (autosquash)`, + SureSquashAboveCommits: `{{.commit}}ă«ĺŻľă™ă‚‹ă™ăąă¦ă® fixup! コăźăăă‚’squashă—ăľă™ă€‚ă‚ろă—ă„ă§ă™ă‹?`, + CreateFixupCommit: `fixupコăźăăを作ć`, + SureCreateFixupCommit: `{{.commit}} ă«ĺŻľă™ă‚‹ fixup! コăźăăを作ćă—ăľă™ă€‚ă‚ろă—ă„ă§ă™ă‹?`, + LcExecuteCustomCommand: "カスタă ă‚łăžăłă‰ă‚’実行", + CustomCommand: "カスタă ă‚łăžăłă‰:", + LcCommitChangesWithoutHook: "pre-commită•ăクを実行ă›ăšă«ĺ¤‰ć›´ă‚’コăźăă", + // SkipHookPrefixNotConfigured: "You have not configured a commit message prefix for skipping hooks. Set `git.skipHookPrefix = 'WIP'` in your config", + // LcResetTo: `reset to`, + PressEnterToReturn: "Enterを入力ă—ă¦ăŹă ă•ă„", + // LcViewStashOptions: "view stash options", + LcStashAllChanges: "変更をstash", + // LcStashStagedChanges: "stash staged changes", + // LcStashOptions: "Stash options", + // NotARepository: "Error: must be run inside a git repository", + LcJump: "ă‘ăŤă«ă«ç§»ĺ‹•", + LcScrollLeftRight: "左右ă«ă‚ąă‚Żă­ăĽă«", + LcScrollLeft: "左スクă­ăĽă«", + LcScrollRight: "右スクă­ăĽă«", + DiscardPatch: "ă‘ăăを破棄", + // DiscardPatchConfirm: "You can only build a patch from one commit/stash-entry at a time. Discard current patch?", + // CantPatchWhileRebasingError: "You cannot build a patch or run patch commands while in a merging or rebasing state", + // LcToggleAddToPatch: "toggle file included in patch", + // LcToggleAllInPatch: "toggle all files included in patch", + // LcUpdatingPatch: "updating patch", + // ViewPatchOptions: "view custom patch options", + // PatchOptionsTitle: "Patch Options", + // NoPatchError: "No patch created yet. To start building a patch, use 'space' on a commit file or enter to add specific lines", + // LcEnterFile: "enter file to add selected lines to the patch (or toggle directory collapsed)", + // ExitCustomPatchBuilder: ``, + EnterUpstream: `' ' ă®ĺ˝˘ĺĽŹă§upstreamを入力`, + InvalidUpstream: "upstreamă®ĺ˝˘ĺĽŹăŚć­Łă—ăŹă‚りăľă›ă‚“。' ' ă®ĺ˝˘ĺĽŹă§ĺ…ĄĺŠ›ă—ă¦ăŹă ă•ă„。", + ReturnToRemotesList: `ăŞă˘ăĽă一覧ă«ć»ă‚‹`, + LcAddNewRemote: `ăŞă˘ăĽăを新規追加`, + LcNewRemoteName: `新規ăŞă˘ăĽăĺŤ:`, + LcNewRemoteUrl: `新規ăŞă˘ăĽăURL:`, + LcEditRemoteName: `{{.remoteName}} ă®ć–°ă—ă„ăŞă˘ăĽăĺŤă‚’入力:`, + LcEditRemoteUrl: `{{.remoteName}} ă®ć–°ă—ă„ăŞă˘ăĽăURLを入力:`, + LcRemoveRemote: `ăŞă˘ăĽăを削除`, + LcRemoveRemotePrompt: "ăŞă˘ăĽăを削除ă—ăľă™ă€‚ă‚ろă—ă„ă§ă™ă‹?", + DeleteRemoteBranch: "ăŞă˘ăĽăă–ă©ăłăを削除", + DeleteRemoteBranchMessage: "ăŞă˘ăĽăă–ă©ăłăを削除ă—ăľă™ă€‚ă‚ろă—ă„ă§ă™ă‹", + // LcSetUpstream: "set as upstream of checked-out branch", + // SetUpstreamTitle: "Set upstream branch", + // SetUpstreamMessage: "Are you sure you want to set the upstream branch of '{{.checkedOut}}' to '{{.selected}}'", + LcEditRemote: "ăŞă˘ăĽăを編集", + LcTagCommit: "タグを作ć", + TagMenuTitle: "タグを作ć", + TagNameTitle: "タグĺŤ:", + TagMessageTitle: "タグăˇăă‚»ăĽă‚¸: ", + LcAnnotatedTag: "注é‡ä»ăŤă‚żă‚°", + LcLightweightTag: "軽量タグ", + LcDeleteTag: "タグを削除", + DeleteTagTitle: "タグを削除", + DeleteTagPrompt: "タグ '{{.tagName}}' を削除ă—ăľă™ă€‚ă‚ろă—ă„ă§ă™ă‹?", + PushTagTitle: "ăŞă˘ăĽăă«ă‚żă‚° '{{.tagName}}' ă‚’push", + LcPushTag: "タグをpush", + LcCreateTag: "タグを作ć", + CreateTagTitle: "タグĺŤ:", + LcFetchRemote: "ăŞă˘ăĽăă‚’fetch", + FetchingRemoteStatus: "ăŞă˘ăĽăă‚’fetch", + LcCheckoutCommit: "コăźăăă‚’ăă‚§ăクアウă", + SureCheckoutThisCommit: "é¸ćŠžă•れăźă‚łăźăăă‚’ăă‚§ăクアウăă—ăľă™ă€‚ă‚ろă—ă„ă§ă™ă‹?", + // LcGitFlowOptions: "show git-flow options", + // NotAGitFlowBranch: "This does not seem to be a git flow branch", + // NewGitFlowBranchPrompt: "new {{.branchType}} name:", + // IgnoreTracked: "Ignore tracked file", + // IgnoreTrackedPrompt: "Are you sure you want to ignore a tracked file?", + // LcViewResetToUpstreamOptions: "view upstream reset options", + LcNextScreenMode: "次ă®ă‚ąă‚ŻăŞăĽăłă˘ăĽă‰ (normal/half/fullscreen)", + LcPrevScreenMode: "前ă®ă‚ąă‚ŻăŞăĽăłă˘ăĽă‰", + LcStartSearch: "検索を開始", + Panel: "ă‘ăŤă«", + Keybindings: "ă‚­ăĽăイăłă‰", + LcRenameBranch: "ă–ă©ăłăĺŤă‚’変更", + NewBranchNamePrompt: "ć–°ă—ă„ă–ă©ăłăĺŤă‚’入力", + // RenameBranchWarning: "This branch is tracking a remote. This action will only rename the local branch name, not the name of the remote branch. Continue?", + LcOpenMenu: "ăˇă‹ăĄăĽă‚’é–‹ăŹ", + // LcResetCherryPick: "reset cherry-picked (copied) commits selection", + LcNextTab: "次ă®ă‚żă–", + LcPrevTab: "前ă®ă‚żă–", + LcCantUndoWhileRebasing: "ăŞă™ăĽă‚ąä¸­ăŻă‚˘ăłă‰ă‚Ąă§ăŤăľă›ă‚“。", + LcCantRedoWhileRebasing: "ăŞă™ăĽă‚ąä¸­ăŻăŞă‰ă‚Ąă§ăŤăľă›ă‚“。", + // MustStashWarning: "Pulling a patch out into the index requires stashing and unstashing your changes. If something goes wrong, you'll be able to access your files from the stash. Continue?", + // MustStashTitle: "Must stash", + ConfirmationTitle: "確認ă‘ăŤă«", + LcPrevPage: "前ă®ăšăĽă‚¸", + LcNextPage: "次ă®ăšăĽă‚¸", + LcGotoTop: "最上é¨ăľă§ă‚ąă‚Żă­ăĽă«", + LcGotoBottom: "最下é¨ăľă§ă‚ąă‚Żă­ăĽă«", + // LcFilteringBy: "filtering by", + // ResetInParentheses: "(reset)", + // LcOpenFilteringMenu: "view filter-by-path options", + // LcFilterBy: "filter by", + // LcExitFilterMode: "stop filtering by path", + // LcFilterPathOption: "enter path to filter by", + // EnterFileName: "Enter path:", + // FilteringMenuTitle: "Filtering", + // MustExitFilterModeTitle: "Command not available", + // MustExitFilterModePrompt: "Command not available in filtered mode. Exit filtered mode?", + LcDiff: "ĺ·®ĺ†", + // LcEnterRefToDiff: "enter ref to diff", + LcEnteRefName: "参照を入力:", + LcExitDiffMode: "ĺ·®ĺ†ă˘ăĽă‰ă‚’終了", + DiffingMenuTitle: "ĺ·®ĺ†", + // LcSwapDiff: "reverse diff direction", + LcOpenDiffingMenu: "ĺ·®ĺ†ăˇă‹ăĄăĽă‚’é–‹ăŹ", + // // the actual view is the extras view which I intend to give more tabs in future but for now we'll only mention the command log part + LcOpenExtrasMenu: "コăžăłă‰ă­ă‚°ăˇă‹ăĄăĽă‚’é–‹ăŹ", + // LcShowingGitDiff: "showing output for:", + LcCommitDiff: "コăźăăă®ĺ·®ĺ†", + LcCopyCommitShaToClipboard: "コăźăăă®SHAをクăŞăă—ăśăĽă‰ă«ă‚łă”ăĽ", + LcCommitSha: "コăźăăă®SHA", + LcCommitURL: "コăźăăă®URL", + LcCopyCommitMessageToClipboard: "コăźăăăˇăă‚»ăĽă‚¸ă‚’クăŞăă—ăśăĽă‰ă«ă‚łă”ăĽ", + LcCommitMessage: "コăźăăăˇăă‚»ăĽă‚¸", + LcCommitAuthor: "コăźăăă®ä˝ść者ĺŤ", + LcCopyCommitAttributeToClipboard: "コăźăăă®ć…報をコă”ăĽ", + LcCopyBranchNameToClipboard: "ă–ă©ăłăĺŤă‚’クăŞăă—ăśăĽă‰ă«ă‚łă”ăĽ", + LcCopyFileNameToClipboard: "ă•ァイă«ĺŤă‚’クăŞăă—ăśăĽă‰ă«ă‚łă”ăĽ", + LcCopyCommitFileNameToClipboard: "コăźăăă•れăźă•ァイă«ĺŤă‚’クăŞăă—ăśăĽă‰ă«ă‚łă”ăĽ", + LcCopySelectedTexToClipboard: "é¸ćŠžă•れăźă†ă‚­ă‚ąăをクăŞăă—ăśăĽă‰ă«ă‚łă”ăĽ", + // LcCommitPrefixPatternError: "Error in commitPrefix pattern", + NoFilesStagedTitle: "ă•ァイă«ăŚă‚ąă†ăĽă‚¸ă•れă¦ă„ăľă›ă‚“", + NoFilesStagedPrompt: "ă•ァイă«ăŚă‚ąă†ăĽă‚¸ă•れă¦ă„ăľă›ă‚“。ă™ăąă¦ă®ĺ¤‰ć›´ă‚’コăźăăă—ăľă™ă‹?", + BranchNotFoundTitle: "ă–ă©ăłăăŚč¦‹ă¤ă‹ă‚Šăľă›ă‚“ă§ă—ăźă€‚", + BranchNotFoundPrompt: "ă–ă©ăłăăŚč¦‹ă¤ă‹ă‚Šăľă›ă‚“ă§ă—ăźă€‚ć–°ă—ăŹă–ă©ăłăを作ćă—ăľă™ ", + UnstageLinesTitle: "é¸ćŠžčˇŚă‚’ă‚˘ăłă‚ąă†ăĽă‚¸", + UnstageLinesPrompt: "é¸ćŠžă•れăźčˇŚă‚’削除 (git reset) ă—ăľă™ă€‚ă‚ろă—ă„ă§ă™ă‹? ă“ă®ć“Ťä˝śăŻĺŹ–ă‚Šć¶ă›ăľă›ă‚“。\nă“ă®č­¦ĺ‘Šă‚’無効化ă™ă‚‹ă«ăŻč¨­ĺ®šă•ァイă«ă® 'gui.skipUnstageLineWarning' ă‚’ true ă«č¨­ĺ®šă—ă¦ăŹă ă•ă„。", + LcCreateNewBranchFromCommit: "コăźăăă«ă–ă©ăłăを作ć", + LcBuildingPatch: "ă‘ăăを構築", + LcViewCommits: "コăźăăを閲覧", + MinGitVersionError: "lazygită®ĺ®źčˇŚă«ăŻGit 2.0以降ă®ăăĽă‚¸ă§ăłăŚĺż…č¦ă§ă™ă€‚Gită‚’ć›´ć–°ă—ă¦ăŹă ă•ă„。もă—ăŹăŻă€lazygită®ĺľŚć–ąäş’換性を改善ă™ă‚‹ăźă‚ă« https://github.com/jesseduffield/lazygit/issues ă«issueを作ćă—ă¦ăŹă ă•ă„。", + LcRunningCustomCommandStatus: "カスタă ă‚łăžăłă‰ă‚’実行", + // LcSubmoduleStashAndReset: "stash uncommitted submodule changes and update", + // LcAndResetSubmodules: "and reset submodules", + LcEnterSubmodule: "サă–ă˘ă‚¸ăĄăĽă«ă‚’é–‹ăŹ", + LcCopySubmoduleNameToClipboard: "サă–ă˘ă‚¸ăĄăĽă«ĺŤă‚’クăŞăă—ăśăĽă‰ă«ă‚łă”ăĽ", + RemoveSubmodule: "サă–ă˘ă‚¸ăĄăĽă«ă‚’削除", + LcRemoveSubmodule: "サă–ă˘ă‚¸ăĄăĽă«ă‚’削除", + RemoveSubmodulePrompt: "サă–ă˘ă‚¸ăĄăĽă« '%s' ă¨ăťă®ă‡ă‚Łă¬ă‚ŻăăŞă‚’削除ă—ăľă™ă€‚ă‚ろă—ă„ă§ă™ă‹? ă“ă®ć“Ťä˝śăŻĺŹ–ă‚Šć¶ă›ăľă›ă‚“。", + LcResettingSubmoduleStatus: "サă–ă˘ă‚¸ăĄăĽă«ă‚’ăŞă‚»ăă", + LcNewSubmoduleName: "新規サă–ă˘ă‚¸ăĄăĽă«ĺŤ:", + LcNewSubmoduleUrl: "新規サă–ă˘ă‚¸ăĄăĽă«ă®URL:", + LcNewSubmodulePath: "新規サă–ă˘ă‚¸ăĄăĽă«ă®ă‘ス:", + LcAddSubmodule: "サă–ă˘ă‚¸ăĄăĽă«ă‚’新規追加", + LcAddingSubmoduleStatus: "サă–ă˘ă‚¸ăĄăĽă«ă‚’新規追加", + LcUpdateSubmoduleUrl: "サă–ă˘ă‚¸ăĄăĽă« '%s' ă®URLă‚’ć›´ć–°", + LcUpdatingSubmoduleUrlStatus: "URLă‚’ć›´ć–°", + LcEditSubmoduleUrl: "サă–ă˘ă‚¸ăĄăĽă«ă®URLă‚’ć›´ć–°", + LcInitializingSubmoduleStatus: "サă–ă˘ă‚¸ăĄăĽă«ă‚’ĺťćśźĺŚ–", + LcInitSubmodule: "サă–ă˘ă‚¸ăĄăĽă«ă‚’ĺťćśźĺŚ–", + LcSubmoduleUpdate: "サă–ă˘ă‚¸ăĄăĽă«ă‚’ć›´ć–°", + LcUpdatingSubmoduleStatus: "サă–ă˘ă‚¸ăĄăĽă«ă‚’ć›´ć–°", + LcBulkInitSubmodules: "サă–ă˘ă‚¸ăĄăĽă«ă‚’一括ĺťćśźĺŚ–", + LcBulkUpdateSubmodules: "サă–ă˘ă‚¸ăĄăĽă«ă‚’一括更新", + // LcBulkDeinitSubmodules: "bulk deinit submodules", + // LcViewBulkSubmoduleOptions: "view bulk submodule options", + // LcBulkSubmoduleOptions: "bulk submodule options", + // LcRunningCommand: "running command", + // SubCommitsTitle: "Sub-commits", + SubmodulesTitle: "サă–ă˘ă‚¸ăĄăĽă«", + NavigationTitle: "一覧ă‘ăŤă«ă®ć“Ťä˝ś", + // SuggestionsCheatsheetTitle: "Suggestions", + // SuggestionsTitle: "Suggestions (press %s to focus)", + ExtrasTitle: "コăžăłă‰ă­ă‚°", + // PushingTagStatus: "pushing tag", + PullRequestURLCopiedToClipboard: "pull requestă®URLăŚă‚ŻăŞăă—ăśăĽă‰ă«ă‚łă”ăĽă•れăľă—ăź", + CommitDiffCopiedToClipboard: "コăźăăă®ĺ·®ĺ†ăŚă‚ŻăŞăă—ăśăĽă‰ă«ă‚łă”ăĽă•れăľă—ăź", + CommitSHACopiedToClipboard: "コăźăăă®SHAăŚă‚ŻăŞăă—ăśăĽă‰ă«ă‚łă”ăĽă•れăľă—ăź", + CommitURLCopiedToClipboard: "コăźăăă®URLăŚă‚ŻăŞăă—ăśăĽă‰ă«ă‚łă”ăĽă•れăľă—ăź", + CommitMessageCopiedToClipboard: "コăźăăăˇăă‚»ăĽă‚¸ăŚă‚ŻăŞăă—ăśăĽă‰ă«ă‚łă”ăĽă•れăľă—ăź", + CommitAuthorCopiedToClipboard: "コăźăăă®ä˝ść者ĺŤăŚă‚ŻăŞăă—ăśăĽă‰ă«ă‚łă”ăĽă•れăľă—ăź", + LcCopiedToClipboard: "クăŞăă—ăśăĽă‰ă«ă‚łă”ăĽă•れăľă—ăź", + ErrCannotEditDirectory: "ă‡ă‚Łă¬ă‚ŻăăŞăŻç·¨é›†ă§ăŤăľă›ă‚“。", + ErrStageDirWithInlineMergeConflicts: "ăžăĽă‚¸ă‚łăłă•ăŞă‚Żăă®ç™şç”źă—ăźă•ァイă«ă‚’ĺ«ă‚€ă‡ă‚Łă¬ă‚ŻăăŞăŻă‚ąă†ăĽă‚¸/アăłă‚ąă†ăĽă‚¸ă§ăŤăľă›ă‚“。ăžăĽă‚¸ă‚łăłă•ăŞă‚Żăを解決ă—ă¦ăŹă ă•ă„。", + ErrRepositoryMovedOrDeleted: "ăŞăťă‚¸ăăŞăŚč¦‹ă¤ă‹ă‚Šăľă›ă‚“。ă™ă§ă«ĺ‰Šé™¤ă•れăźă‹ă€ç§»ĺ‹•ă•れăźĺŹŻč˝ć€§ăŚă‚りăľă™ ÂŻ\\_(ă„)_/ÂŻ", + CommandLog: "コăžăłă‰ă­ă‚°", + ToggleShowCommandLog: "コăžăłă‰ă­ă‚°ă®čˇ¨ç¤ş/非表示をĺ‡ă‚Šć›żă", + FocusCommandLog: "コăžăłă‰ă­ă‚°ă«ă•ă‚©ăĽă‚«ă‚ą", + CommandLogHeader: "コăžăłă‰ă­ă‚°ă®čˇ¨ç¤ş/非表示㯠'%s' ă§ĺ‡ă‚Šć›żăられăľă™ă€‚\n", + RandomTip: "ă©ăłă€ă Tips", + // SelectParentCommitForMerge: "Select parent commit for merge", + ToggleWhitespaceInDiffView: "空白文字ă®ĺ·®ĺ†ă®čˇ¨ç¤şćś‰ç„ˇă‚’ĺ‡ă‚Šć›żă", + IgnoringWhitespaceInDiffView: "空白文字ă®ĺ¤‰ć›´ăŻĺ·®ĺ†ç”»éť˘ă«čˇ¨ç¤şă•れăľă›ă‚“", + ShowingWhitespaceInDiffView: "空白文字ă®ĺ¤‰ć›´ăŻĺ·®ĺ†ç”»éť˘ă«čˇ¨ç¤şă•れăľă™", + // IncreaseContextInDiffView: "Increase the size of the context shown around changes in the diff view", + // DecreaseContextInDiffView: "Decrease the size of the context shown around changes in the diff view", + CreatePullRequest: "pull requestを作ć", + // CreatePullRequestOptions: "Create pull request options", + // LcCreatePullRequestOptions: "create pull request options", + LcDefaultBranch: "ă‡ă•ă‚©ă«ăă–ă©ăłă", + LcSelectBranch: "ă–ă©ăłăă‚’é¸ćŠž", + SelectConfigFile: "設定ă•ァイă«ă‚’é¸ćŠž", + NoConfigFileFoundErr: "設定ă•ァイă«ăŚč¦‹ă¤ă‹ă‚Šăľă›ă‚“ă§ă—ăźă€‚", + // LcLoadingFileSuggestions: "loading file suggestions", + // LcLoadingCommits: "loading commits", + // MustSpecifyOriginError: "Must specify a remote if specifying a branch", + // GitOutput: "Git output:", + // GitCommandFailed: "Git command failed. Check command log for details (open with %s)", + AbortTitle: "%sを中止", + AbortPrompt: "実施中ă®%sを中止ă—ăľă™ă€‚ă‚ろă—ă„ă§ă™ă‹?", + LcOpenLogMenu: "ă­ă‚°ăˇă‹ăĄăĽă‚’é–‹ăŹ", + LogMenuTitle: "コăźăăă­ă‚°ă‚Şă—ă‚·ă§ăł", + // ToggleShowGitGraphAll: "toggle show whole git graph (pass the `--all` flag to `git log`)", + ShowGitGraph: "コăźăăă‚°ă©ă•ă®čˇ¨ç¤ş", + SortCommits: "コăźăăă®čˇ¨ç¤şé †", + // CantChangeContextSizeError: "Cannot change context while in patch building mode because we were too lazy to support it when releasing the feature. If you really want it, please let us know!", + LcOpenCommitInBrowser: "ă–ă©ă‚¦ă‚¶ă§ă‚łăźăăă‚’é–‹ăŹ", + // LcViewBisectOptions: "view bisect options", + // ConfirmRevertCommit: "Are you sure you want to revert {{.selectedCommit}}?", + RewordInEditorTitle: "コăźăăăˇăă‚»ăĽă‚¸ă‚’エă‡ă‚Łă‚żă§ç·¨é›†", + // RewordInEditorPrompt: "Are you sure you want to reword this commit in your editor?", + // HardResetAutostashPrompt: "Are you sure you want to hard reset to '%s'? An auto-stash will be performed if necessary.", + // CheckoutPrompt: "Are you sure you want to checkout '%s'?", + // UpstreamGone: "(upstream gone)", + Actions: Actions{ + // TODO: combine this with the original keybinding descriptions (those are all in lowercase atm) + CheckoutCommit: "コăźăăă‚’ăă‚§ăクアウă", + CheckoutTag: "タグをăă‚§ăクアウă", + CheckoutBranch: "ă–ă©ăłăă‚’ăă‚§ăクアウă", + ForceCheckoutBranch: "ă–ă©ăłăを強ĺ¶çš„ă«ăă‚§ăクアウă", + DeleteBranch: "ă–ă©ăłăを削除", + Merge: "ăžăĽă‚¸", + // RebaseBranch: "Rebase branch", + RenameBranch: "ă–ă©ăłăĺŤă‚’変更", + CreateBranch: "ă–ă©ăłăを作ć", + // CherryPick: "(Cherry-pick) Paste commits", + CheckoutFile: "ă•ァイă«ă‚’ăă‚§ăクアウăs", + // DiscardOldFileChange: "Discard old file change", + // SquashCommitDown: "Squash commit down", + FixupCommit: "fixupコăźăă", + RewordCommit: "コăźăăăˇăă‚»ăĽă‚¸ă‚’変更", + DropCommit: "コăźăăを削除", + EditCommit: "コăźăăを編集", + AmendCommit: "amendコăźăă", + RevertCommit: "コăźăăă‚’revert", + CreateFixupCommit: "fixupコăźăăを作ć", + // SquashAllAboveFixupCommits: "Squash all above fixup commits", + CreateLightweightTag: "軽量タグを作ć", + CreateAnnotatedTag: "注é‡ä»ăŤă‚żă‚°ă‚’作ć", + CopyCommitMessageToClipboard: "コăźăăăˇăă‚»ăĽă‚¸ă‚’クăŞăă—ăśăĽă‰ă«ă‚łă”ăĽ", + CopyCommitDiffToClipboard: "コăźăăă®ĺ·®ĺ†ă‚’クăŞăă—ăśăĽă‰ă«ă‚łă”ăĽ", + CopyCommitSHAToClipboard: "コăźăăSHAをクăŞăă—ăśăĽă‰ă«ă‚łă”ăĽ", + CopyCommitURLToClipboard: "コăźăăă®URLをクăŞăă—ăśăĽă‰ă«ă‚łă”ăĽ", + CopyCommitAuthorToClipboard: "コăźăăă®ä˝ść者ĺŤă‚’クăŞăă—ăśăĽă‰ă«ă‚łă”ăĽ", + CopyCommitAttributeToClipboard: "クăŞăă—ăśăĽă‰ă«ă‚łă”ăĽ", + MoveCommitUp: "コăźăăを上ă«ç§»ĺ‹•", + MoveCommitDown: "コăźăăを下ă«ç§»ĺ‹•", + CustomCommand: "カスタă ă‚łăžăłă‰", + DiscardAllChangesInDirectory: "ă‡ă‚Łă¬ă‚ŻăăŞĺ†…ă®ă™ăąă¦ă®ĺ¤‰ć›´ă‚’破棄", + DiscardUnstagedChangesInDirectory: "ă‡ă‚Łă¬ă‚ŻăăŞĺ†…ă®ă™ăąă¦ă®ă‚ąă†ăĽă‚¸ă•れă¦ă„ăŞă„変更を破棄", + DiscardAllChangesInFile: "ă•ァイă«ĺ†…ă®ă™ăąă¦ă®ĺ¤‰ć›´ă‚’破棄", + DiscardAllUnstagedChangesInFile: "ă•ァイă«ĺ†…ă®ă™ăąă¦ă®ă‚ąă†ăĽă‚¸ă•れă¦ă„ăŞă„変更を破棄", + StageFile: "ă•ァイă«ă‚’スă†ăĽă‚¸", + StageResolvedFiles: "ăžăĽă‚¸ă‚łăłă•ăŞă‚ŻăăŚč§Łć±şă•れăźă™ăąă¦ă®ă•ァイă«ă‚’スă†ăĽă‚¸", + UnstageFile: "ă•ァイă«ă‚’アăłă‚ąă†ăĽă‚¸", + UnstageAllFiles: "ă™ăąă¦ă®ă•ァイă«ă‚’アăłă‚ąă†ăĽă‚¸", + StageAllFiles: "ă™ăąă¦ă®ă•ァイă«ă‚’スă†ăĽă‚¸", + LcIgnoreExcludeFile: "ă•ァイă«ă‚’ignore", + Commit: "コăźăă", + EditFile: "ă•ァイă«ă‚’編集", + Push: "Push", + Pull: "Pull", + OpenFile: "ă•ァイă«ă‚’é–‹ăŹ", + StashAllChanges: "ă™ăąă¦ă®ĺ¤‰ć›´ă‚’Stash", + StashStagedChanges: "スă†ăĽă‚¸ă•れăźĺ¤‰ć›´ă‚’Stash", + GitFlowFinish: "Git flow finish", + GitFlowStart: "Git Flow start", + CopyToClipboard: "クăŞăă—ăśăĽă‰ă«ă‚łă”ăĽ", + CopySelectedTextToClipboard: "é¸ćŠžă•れăźă†ă‚­ă‚ąăをクăŞăă—ăśăĽă‰ă«ă‚łă”ăĽ", + RemovePatchFromCommit: "ă‘ăăをコăźăăă‹ă‚‰ĺ‰Šé™¤", + MovePatchToSelectedCommit: "ă‘ăăă‚’é¸ćŠžă—ăźă‚łăźăăă«ç§»ĺ‹•", + MovePatchIntoIndex: "ă‘ăăă‚’indexă«ç§»ĺ‹•", + MovePatchIntoNewCommit: "ă‘ăăを次ă®ă‚łăźăăă«ç§»ĺ‹•", + DeleteRemoteBranch: "ăŞă˘ăĽăă–ă©ăłăを削除", + SetBranchUpstream: "upstreamă–ă©ăłăを設定", + AddRemote: "ăŞă˘ăĽăを追加", + RemoveRemote: "ăŞă˘ăĽăを削除", + UpdateRemote: "ăŞă˘ăĽăă‚’ć›´ć–°", + ApplyPatch: "ă‘ăăă‚’é©ç”¨", + Stash: "Stash", + RemoveSubmodule: "サă–ă˘ă‚¸ăĄăĽă«ă‚’削除", + ResetSubmodule: "サă–ă˘ă‚¸ăĄăĽă«ă‚’ăŞă‚»ăă", + AddSubmodule: "サă–ă˘ă‚¸ăĄăĽă«ă‚’追加", + UpdateSubmoduleUrl: "サă–ă˘ă‚¸ăĄăĽă«ă®URLă‚’ć›´ć–°", + InitialiseSubmodule: "サă–ă˘ă‚¸ăĄăĽă«ă‚’ĺťćśźĺŚ–", + BulkInitialiseSubmodules: "サă–ă˘ă‚¸ăĄăĽă«ă‚’一括ĺťćśźĺŚ–", + BulkUpdateSubmodules: "サă–ă˘ă‚¸ăĄăĽă«ă‚’一括更新", + // BulkDeinitialiseSubmodules: "Bulk deinitialise submodules", + UpdateSubmodule: "サă–ă˘ă‚¸ăĄăĽă«ă‚’ć›´ć–°", + DeleteTag: "タグを削除", + PushTag: "タグをpush", + // NukeWorkingTree: "Nuke working tree", + // DiscardUnstagedFileChanges: "Discard unstaged file changes", + // RemoveUntrackedFiles: "Remove untracked files", + SoftReset: "SoftăŞă‚»ăă", + MixedReset: "MixedăŞă‚»ăă", + HardReset: "HardăŞă‚»ăă", + FastForwardBranch: "ă–ă©ăłăă‚’fast forward", + Undo: "アăłă‰ă‚Ą", + Redo: "ăŞă‰ă‚Ą", + CopyPullRequestURL: "pull requestă®URLをコă”ăĽ", + OpenMergeTool: "ăžăĽă‚¸ă„ăĽă«ă‚’é–‹ăŹ", + OpenCommitInBrowser: "コăźăăă‚’ă–ă©ă‚¦ă‚¶ă§é–‹ăŹ", + OpenPullRequest: "pull requestă‚’ă–ă©ă‚¦ă‚¶ă§é–‹ăŹ", + StartBisect: "bisectă‚’é–‹ĺ§‹", + ResetBisect: "bisectă‚’ăŞă‚»ăă", + BisectSkip: "bisectをスキăă—", + BisectMark: "bisectă‚’ăžăĽă‚Ż", + }, + Bisect: Bisect{ + // Mark: "mark %s as %s", + // MarkStart: "mark %s as %s (start bisect)", + Skip: "%s をスキăă—ă™ă‚‹", + ResetTitle: "'git bisect' ă‚’ăŞă‚»ăă", + ResetPrompt: "'git bisect' ă‚’ăŞă‚»ăăă—ăľă™ă€‚ă‚ろă—ă„ă§ă™ă‹?", + ResetOption: "bisectă‚’ăŞă‚»ăă", + BisectMenuTitle: "bisect", + CompleteTitle: "Bisect完了", + // CompletePrompt: "Bisect complete! The following commit introduced the change:\n\n%s\n\nDo you want to reset 'git bisect' now?", + // CompletePromptIndeterminate: "Bisect complete! Some commits were skipped, so any of the following commits may have introduced the change:\n\n%s\n\nDo you want to reset 'git bisect' now?", + }, + } +} diff --git a/pkg/i18n/korean.go b/pkg/i18n/korean.go new file mode 100644 index 000000000..afda25c6d --- /dev/null +++ b/pkg/i18n/korean.go @@ -0,0 +1,607 @@ +package i18n + +const koreanIntroPopupMessage = ` +lazygit!를 이용해주셔서 ę°ě‚¬í•©ë‹ë‹¤. Seriously you rock. Three things to share with you: + + 1) lazygitěť ę¸°ëŠĄě— ëŚ€í•´ 알아보려면 다음 비디ě¤ëĄĽ 참조í•세요. + https://youtu.be/CPLdltN7wgE + + 2) 다음 사이트ě—서 최신 릴리스 노트를 읽어보세요.: + https://github.com/jesseduffield/lazygit/releases + + 3) ë§Śě•˝ 당신이 Gitěť„ 사용한다면, ę·¸ę˛ěť€ 당신을 프로그ëžë¨¸ëˇś 만들 ę˛ěž…ë‹ë‹¤! + ë‹ąě‹ ěť ëŹ„ě›€ěśĽëˇś 우리는 lazygitěť„ 더 좋게 만들 ě ěžěеë‹ë‹¤, ę·¸ëź¬ë‹ ę¸°ě—¬ěžę°€ ë는 ę˛ěť„ 고려해보세요. 그리고 ěž¬ëŻ¸ě— ě°¸ě—¬í•세요: + https://github.com/jesseduffield/lazygit + ë한 ě¤ëĄ¸ěŞ˝ í•ë‹¨ěť ę¸°ë¶€ 버튼을 í´ë¦­í•ě—¬ 저를 후ě›í•ęł  작업할 내용을 알려주실 ě ěžěеë‹ë‹¤. + ë는 ě €ěžĄě†Śě— ěŠ¤í€ëĄĽ ëŚëź¬ ě‚¬ëž‘ěť„ 공유할 ě도 ěžěеë‹ë‹¤! +` + +// exporting this so we can use it in tests +func koreanTranslationSet() TranslationSet { + return TranslationSet{ + NotEnoughSpace: "패ë„ěť„ ë ŚëŤ”ë§ í•  공간이 부족합ë‹ë‹¤.", + DiffTitle: "Diff", + FilesTitle: "파일", + BranchesTitle: "브랜ěą", + CommitsTitle: "커밋", + StashTitle: "Stash", + UnstagedChanges: `Stagedëě§€ 않은 변경 ë‚´ěš©`, + StagedChanges: `Stagedëś ëł€ę˛˝ ë‚´ěš©`, + MainTitle: "메인", + MergeConfirmTitle: "병합", + StagingTitle: "메인 íŚ¨ë„ (Staging)", + MergingTitle: "메인 íŚ¨ë„ (Merging)", + NormalTitle: "메인 íŚ¨ë„ (Normal)", + LogTitle: "로그", + CommitMessage: "커밋 메시지", + CredentialsUsername: "ě‚¬ěš©ěž ěť´ë¦„", + CredentialsPassword: "패스워드", + CredentialsPassphrase: "SSHí‚¤ěť passphrase ěž…ë Ą", + PassUnameWrong: "패스워드, passphrase ë는 ě‚¬ěš©ěž ěť´ë¦„ěť´ ěžëŞ»ëě—습ë‹ë‹¤.", + CommitChanges: "커밋 변경내용", + AmendLastCommit: "ë§ě§€ë§› 커밋 ěě •", + AmendLastCommitTitle: "ë§ě§€ë§‰ 커밋 ěě •", + SureToAmend: "ë§ě§€ë§‰ 커밋을 ěě •í•시겠습ë‹ęąŚ? 그런 다음 커밋 패ë„ě—서 커밋 메시지를 변경할 ě ěžěеë‹ë‹¤.", + NoCommitToAmend: "amend 가능한 커밋이 없습ë‹ë‹¤.", + CommitChangesWithEditor: "Git 편집기를 사용í•ě—¬ 변경 내용을 커밋합ë‹ë‹¤.", + StatusTitle: "ěíś", + LcNavigate: "이동", + LcMenu: "메뉴", + LcExecute: "실행", + LcToggleStaged: "Staged ě „í™", + LcToggleStagedAll: "모든 변경을 Staged/unstaged으로 ě „í™", + LcToggleTreeView: "파일 트리뷰로 ě „í™", + LcOpenMergeTool: "git mergetool를 열기", + LcRefresh: "ě로고침", + LcPush: "푸시", + LcPull: "업데이트", + LcScroll: "스í¬ëˇ¤", + MergeConflictsTitle: "병합 충돌 ë‚´ěš©", + LcCheckout: "체í¬ě•„ě›", + LcFileFilter: "파일을 í•„í„°í•기 (Staged/unstaged)", + FilterStagedFiles: "Stagedëś íŚŚěťĽë§Ś 표시", + FilterUnstagedFiles: "Stageëě§€ 않은 파일만 표시", + ResetCommitFilterState: "í•„í„° 리셋", + NoChangedFiles: "ëł€ę˛˝ëś íŚŚěťĽěť´ 없습ë‹ë‹¤.", + NoFilesDisplay: "표시할 파일이 없습ë‹ë‹¤", + NotAFile: "파일이 ě•„ë‹™ë‹ë‹¤.", + PullWait: "업데이트 중...", + PushWait: "푸시 중...", + FetchWait: "íŚ¨ěą ě¤‘...", + LcSoftReset: "소프트 리셋", + AlreadyCheckedOutBranch: "브랜ěąę°€ 이미 체í¬ě•„ě› ëě—습ë‹ë‹¤", + SureForceCheckout: "강제로 체í¬ě•„ě›í•시겠습ë‹ęąŚ? 모든 로컬 변경 사항을 ěžę˛Ś ë©ë‹ë‹¤.", + ForceCheckoutBranch: "ë¸Śëžśěą ę°•ě ś 체í¬ě•„ě›", + BranchName: "ë¸Śëžśěą ěť´ë¦„", + NewBranchNameBranchOff: "ě ë¸Śëžśěą ěť´ë¦„ (Branch is off of '{{.branchName}}')", + CantDeleteCheckOutBranch: "체í¬ě•„ě›í•는 브랜ěąëŠ” ě‚­ě śí•  ě 없습ë‹ë‹¤!", + DeleteBranch: "ë¸Śëžśěą ě‚­ě ś", + DeleteBranchMessage: "ě •ë§ëˇś ë¸Śëžśěą '{{.selectedBranchName}}' 를 ě‚­ě śí•시겠습ë‹ęąŚ?", + ForceDeleteBranchMessage: "'{{.selectedBranchName}}'는 ě™„ě „íž ëł‘í•©ëě§€ 않ě•습ë‹ë‹¤. ě •ë§ ě‚­ě śí•시겠습ë‹ęąŚ?", + LcRebaseBranch: "체í¬ě•„ě›ëś 브랜ěąëĄĽ ěť´ 브랜ěąě— 리베이스", + CantRebaseOntoSelf: "브랜ěąëĄĽ ěžę¸° ěžě‹ ě—게 리베이스할 ě는 없습ë‹ë‹¤.", + CantMergeBranchIntoItself: "브랜ěąëĄĽ ěžę¸° ěžě‹ ě—게 병합할 ě는 없습ë‹ë‹¤.", + LcForceCheckout: "ę°•ě ś 체í¬ě•„ě›", + LcCheckoutByName: "이름으로 체í¬ě•„ě›", + LcNewBranch: "ě ë¸Śëžśěą ěťě„±", + LcDeleteBranch: "ë¸Śëžśěą ě‚­ě ś", + NoBranchesThisRepo: "ě €ěžĄě†Śě— ë¸Śëžśěąę°€ 존재í•ě§€ 않습ë‹ë‹¤.", + CommitMessageConfirm: "{{.keyBindClose}}: 닫기, {{.keyBindNewLine}}: ę°śí–‰, {{.keyBindConfirm}}: 확인", + CommitWithoutMessageErr: "커밋 메시지를 ěž…ë Ąí•세요.", + CloseConfirm: "{{.keyBindClose}}: 닫기/취소, {{.keyBindConfirm}}: 확인", + LcClose: "닫기", + LcQuit: "종료", + LcSquashDown: "squash down", + LcFixupCommit: "fixup commit", + NoCommitsThisBranch: "ěť´ 브랜ěąě— 커밋이 없습ë‹ë‹¤.", + OnlySquashTopmostCommit: "Can only squash topmost commit", + YouNoCommitsToSquash: "You have no commits to squash with", + Fixup: "Fixup", + SureFixupThisCommit: "Are you sure you want to 'fixup' this commit? It will be merged into the commit below", + SureSquashThisCommit: "Are you sure you want to squash this commit into the commit below?", + Squash: "Squash", + LcPickCommit: "pick commit (when mid-rebase)", + LcRevertCommit: "커밋 ë돌리기", + LcRewordCommit: "커밋메시지 변경", + LcDeleteCommit: "커밋 ě‚­ě ś", + LcMoveDownCommit: "커밋을 1ę°ś ě•„ëžëˇś 이동", + LcMoveUpCommit: "커밋을 1ę°ś 위로 이동", + LcEditCommit: "커밋을 편집", + LcAmendToCommit: "amend commit with staged changes", + LcResetCommitAuthor: "reset commit author", + SureResetCommitAuthor: "The author field of this commit will be updated to match the configured user. This also renews the author timestamp. Continue?", + LcRenameCommitEditor: "ě—디터ě—서 커밋메시지 ěě •", + Error: "ě¤ëĄ", + LcSelectHunk: "hunk를 ě„ íť", + LcNavigateConflicts: "navigate conflicts", + LcPickHunk: "pick hunk", + LcPickAllHunks: "pick all hunks", + LcUndo: "ë돌리기", + LcUndoReflog: "ë돌리기 (reflog) (실í—ě )", + LcRedoReflog: "다시 실행 (reflog) (실í—ě )", + LcPop: "pop", + LcDrop: "drop", + LcApply: "ě ěš©", + NoStashEntries: "Stashę°€ 존재í•ě§€ 않습ë‹ë‹¤.", + StashDrop: "Stash를 ě‚­ě ś", + SureDropStashEntry: "ě •ë§ëˇś Stash를 ě‚­ě śí•시겠습ë‹ęąŚ?", + StashPop: "Stash를 pop", + SurePopStashEntry: "ě •ë§ëˇś Stash를 popí•시겠습ë‹ęąŚ?", + StashApply: "Stash ě ěš©", + SureApplyStashEntry: "ě •ë§ëˇś Stash를 ě ěš©í•시겠습ë‹ęąŚ?", + NoTrackedStagedFilesStash: "You have no tracked/staged files to stash", + StashChanges: "변경을 Stash", + OpenConfig: "설정 파일 열기", + EditConfig: "설정 파일 ěě •", + ForcePush: "ę°•ě ś 푸시", + ForcePushPrompt: "브랜ěąę°€ ě›ę˛© 브랜ěąě—서 분기í•ęł  ěžěеë‹ë‹¤. 'esc'를 ëŚëź¬ ě·¨ě†Śí•ę±°ë‚, 'enter'를 ëŚëź¬ ę°•ě śëˇś 푸시í•세요.", + ForcePushDisabled: "브랜ěąę°€ ě›ę˛© 브랜ěąě—서 분기í•ęł  ěžěеë‹ë‹¤. force pushę°€ 비활성화 ëě—습ë‹ë‹¤.", + UpdatesRejectedAndForcePushDisabled: "업데이트가 ę±°ë¶€ëě—으며 ę°•ě ś 푸시를 비활성화í–습ë‹ë‹¤.", + LcCheckForUpdate: "업데이트 확인", + CheckingForUpdates: "업데이트 확인 중...", + UpdateAvailableTitle: "ě로운 업데이트 사용가능!", + UpdateAvailable: "버전 {{.newVersion}} ěť„(를) 설ěąí•시겠습ë‹ęąŚ?", + UpdateInProgressWaitingStatus: "업데이트 중", + UpdateCompletedTitle: "업데이트 완료!", + UpdateCompleted: "업데이트 설ěąě— 성공í–습ë‹ë‹¤. lazygit를 재시작해주세요.", + FailedToRetrieveLatestVersionErr: "버전 정보를 받아ě¤ëŠ”ëŤ° 실패í–습ë‹ë‹¤.", + OnLatestVersionErr: "이미 최신 버전을 사용í•ęł  ěžěеë‹ë‹¤.", + MajorVersionErr: "ě 버전 ({{.newVersion}}) ě— í„재 버전({{.currentVersion}}) 과 ëą„ęµí•  때 í¸í™ëě§€ 않는 변경 사항이 ěžěеë‹ë‹¤.", + CouldNotFindBinaryErr: "{{.url}} ě—서 바이ë„리를 ě°ľěť„ ě 없습ë‹ë‹¤.", + UpdateFailedErr: "업데이트 실패: {{.errMessage}}", + ConfirmQuitDuringUpdateTitle: "í„재 업데이트 중입ë‹ë‹¤.", + ConfirmQuitDuringUpdate: "í„재 업데이트를 ě§„í–‰ 중입ë‹ë‹¤.종료í•시겠습ë‹ęąŚ?", + MergeToolTitle: "병합 도구", + MergeToolPrompt: "ě •ë§ëˇś `git mergetool`ěť„ 여시겠습ë‹ęąŚ?", + IntroPopupMessage: koreanIntroPopupMessage, + GitconfigParseErr: `ë”°ě´í‘śëˇś 묶이지 않은 '\' 문ěžę°€ ěžě–´ě„ś Gogitěť´ gitconfig 파일을 분석í•ě§€ 못í–습ë‹ë‹¤. 이를 ě śę±°í•ë©´ 문제가 해결ë©ë‹ë‹¤.`, + LcEditFile: `파일 편집`, + LcOpenFile: `파일 닫기`, + LcIgnoreFile: `.gitignoreě— ě¶”ę°€`, + LcRefreshFiles: `파일 ě로고침`, + LcMergeIntoCurrentBranch: `í„재 브랜ěąě— 병합`, + ConfirmQuit: `ě •ë§ëˇś 종료í•시겠습ë‹ęąŚ?`, + SwitchRepo: `ěµśę·Ľě— ě‚¬ěš©í•ś 저장소로 ě „í™`, + LcAllBranchesLogGraph: `모든 ë¸Śëžśěą ëˇśę·¸ 표시`, + UnsupportedGitService: `ě§€ě›ëě§€ 않는 Git 서비스입ë‹ë‹¤.`, + LcCreatePullRequest: `í’€ 리í€ěŠ¤íŠ¸ ěťě„±`, + LcCopyPullRequestURL: `í’€ 리í€ěŠ¤íŠ¸ URLěť„ í´ë¦˝ëł´ë“śě— 복사`, + NoBranchOnRemote: `브랜ěąę°€ ě›ę˛©ě— 없습ë‹ë‹¤. ě›ę˛©ě— 먼저 푸시해야합ë‹ë‹¤.`, + LcFetch: `fetch`, + NoAutomaticGitFetchTitle: `ěžëŹ™ git 업데이트) 없음`, + NoAutomaticGitFetchBody: `Lazygit은 private 저장소ě—서 "git fetch"를 사용할 ě 없습ë‹ë‹¤. 파일 패ë„ě—서 'f'를 사용í•ě—¬ "git fetch"를 ě동으로 실행í•세요.`, + FileEnter: `stage individual hunks/lines for file, or collapse/expand for directory`, + FileStagingRequirements: `ě¶”ě ëś íŚŚěťĽě— ëŚ€í•´ ę°śëł„ 라인만 stageí•  ě ěžěеë‹ë‹¤.`, + StageSelection: `ě„ íťí•ś 행을 staged / unstaged`, + ResetSelection: `변경을 ě‚­ě ś (git reset)`, + ToggleDragSelect: `드ëžę·¸ ě„ íť ě „í™`, + ToggleSelectHunk: `toggle select hunk`, + ToggleSelectionForPatch: `line(s)ěť„ 패ěąě— 추가/ě‚­ě ś`, + ToggleStagingPanel: `íŚ¨ë„ ě „í™`, + ReturnToFilesPanel: `파일 목록으로 돌아가기`, + FastForward: `fast-forward this branch from its upstream`, + Fetching: "fetching and fast-forwarding {{.from}} -> {{.to}} ...", + FoundConflicts: "Conflicts! To abort press 'esc', otherwise press 'enter'", + FoundConflictsTitle: "Auto-merge failed", + PickHunk: "pick hunk", + PickAllHunks: "pick all hunks", + ViewMergeRebaseOptions: "view merge/rebase options", + NotMergingOrRebasing: "You are currently neither rebasing nor merging", + RecentRepos: "ěµśę·Ľě— ě‚¬ěš©í•ś 저장소", + MergeOptionsTitle: "Merge Options", + RebaseOptionsTitle: "Rebase Options", + CommitMessageTitle: "커밋메시지", + LocalBranchesTitle: "브랜ěą", + SearchTitle: "검ě‰", + TagsTitle: "íśę·¸", + MenuTitle: "메뉴", + RemotesTitle: "ě›ę˛©", + RemoteBranchesTitle: "ě›ę˛© 브랜ěą", + PatchBuildingTitle: "메인 íŚ¨ë„ (Patch Building)", + InformationTitle: "ě •ëł´", + SecondaryTitle: "Secondary", + ReflogCommitsTitle: "Reflog", + GlobalTitle: "글로벌 키 바인딩", + ConflictsResolved: "모든 병합 충돌이 해결ëě—습ë‹ë‹¤. 계속 할까요?", + RebasingTitle: "리베이스 중", + ConfirmRebase: "ě •ë§ëˇś '{{.checkedOutBranch}}' ěť„(를) '{{.selectedBranch}}'ě— ë¦¬ë˛ ěť´ěŠ¤ í•시겠습ë‹ęąŚ?", + ConfirmMerge: "ě •ë§ëˇś '{{.selectedBranch}}' ěť„(를) '{{.checkedOutBranch}}'ě— ëł‘í•©í•시겠습ë‹ęąŚ?", + FwdNoUpstream: "Cannot fast-forward a branch with no upstream", + FwdNoLocalUpstream: "Cannot fast-forward a branch whose remote is not registered locally", + FwdCommitsToPush: "Cannot fast-forward a branch with commits to push", + ErrorOccurred: "ě¤ëĄę°€ ë°śěťí–습ë‹ë‹¤! issue를 작성해 주세요: ", + NoRoom: "Not enough room", + YouAreHere: "í„재 ěś„ěą", + LcRewordNotSupported: "rewording commits while interactively rebasing is not currently supported", + LcCherryPickCopy: "커밋을 복사 (cherry-pick)", + LcCherryPickCopyRange: "커밋을 범위로 복사 (cherry-pick)", + LcPasteCommits: "커밋을 붙여넣기 (cherry-pick)", + SureCherryPick: "ě •ë§ëˇś 복사한 커밋을 ěť´ 브랜ěąě— 체리픽í•시겠습ë‹ęąŚ?", + CherryPick: "체리픽", + CannotRebaseOntoFirstCommit: "첫 ë˛ě§¸ ě»¤ë°‹ě— ëŚ€í•´ 대화식으로 리베이스할 ě 없습ë‹ë‹¤.", + CannotSquashOntoSecondCommit: "ë‘ ë˛ě§¸ 커밋을 squash/fixupí•  ě 없습ë‹ë‹¤.", + Donate: "후ě›", + AskQuestion: "ě§ë¬¸í•기", + PrevLine: "ěť´ě „ 줄 ě„ íť", + NextLine: "다음 줄 ě„ íť", + PrevHunk: "ěť´ě „ hunk를 ě„ íť", + NextHunk: "다음 hunk를 ě„ íť", + PrevConflict: "ěť´ě „ 충돌을 ě„ íť", + NextConflict: "다음 충돌을 ě„ íť", + SelectPrevHunk: "ěť´ě „ hunk를 ě„ íť", + SelectNextHunk: "다음 hunk를 ě„ íť", + ScrollDown: "ě•„ëžëˇś 스í¬ëˇ¤", + ScrollUp: "위로 스í¬ëˇ¤", + LcScrollUpMainPanel: "메인 패ë„ěť„ 위로 스í¬ëˇ¤", + LcScrollDownMainPanel: "메인 패ë„ěť„ ě•„ëžëˇśëˇś 스í¬ëˇ¤", + AmendCommitTitle: "Amend Commit", + AmendCommitPrompt: "Are you sure you want to amend this commit with your staged files?", + DeleteCommitTitle: "커밋 ě‚­ě ś", + DeleteCommitPrompt: "ě •ë§ëˇś ě„ íťí•ś 커밋을 ě‚­ě śí•시겠습ë‹ęąŚ?", + SquashingStatus: "squashing", + FixingStatus: "fixing up", + DeletingStatus: "deleting", + MovingStatus: "moving", + RebasingStatus: "rebasing", + AmendingStatus: "amending", + CherryPickingStatus: "cherry-picking", + UndoingStatus: "undoing", + RedoingStatus: "redoing", + CheckingOutStatus: "checking out", + CommittingStatus: "committing", + CommitFiles: "Commit files", + SubCommitsDynamicTitle: "커밋 (%s)", + CommitFilesDynamicTitle: "Diff files (%s)", + RemoteBranchesDynamicTitle: "ě›ę˛©ë¸Śëžśěą (%s)", + LcViewItemFiles: "view selected item's files", + CommitFilesTitle: "커밋 파일", + LcCheckoutCommitFile: "checkout file", + LcDiscardOldFileChange: "discard this commit's changes to this file", + DiscardFileChangesTitle: "파일 변경 사항 버리기", + DiscardFileChangesPrompt: "Are you sure you want to discard this commit's changes to this file? If this file was created in this commit, it will be deleted", + DisabledForGPG: "Feature not available for users using GPG", + CreateRepo: "Git 저장소가 ě•„ë‹™ë‹ë‹¤. 저장소를 ěťě„±í•시겠습ë‹ęąŚ? (y/n): ", + AutoStashTitle: "Autostash?", + AutoStashPrompt: "You must stash and pop your changes to bring them across. Do this automatically? (enter/esc)", + StashPrefix: "Auto-stashing changes for ", + LcViewDiscardOptions: "view 'discard changes' options", + LcCancel: "취소", + LcDiscardAllChanges: "모든 변경사항 버리기", + LcDiscardUnstagedChanges: "discard unstaged changes", + LcDiscardAllChangesToAllFiles: "nuke working tree", + LcDiscardAnyUnstagedChanges: "discard unstaged changes", + LcDiscardUntrackedFiles: "discard untracked files", + LcHardReset: "hard reset", + LcViewResetOptions: `view reset options`, + LcCreateFixupCommit: `create fixup commit for this commit`, + LcSquashAboveCommits: `squash all 'fixup!' commits above selected commit (autosquash)`, + SquashAboveCommits: `Squash all 'fixup!' commits above selected commit (autosquash)`, + SureSquashAboveCommits: `Are you sure you want to squash all fixup! commits above {{.commit}}?`, + CreateFixupCommit: `Create fixup commit`, + SureCreateFixupCommit: `Are you sure you want to create a fixup! commit for commit {{.commit}}?`, + LcExecuteCustomCommand: "execute custom command", + CustomCommand: "Custom Command:", + LcCommitChangesWithoutHook: "commit changes without pre-commit hook", + SkipHookPrefixNotConfigured: "You have not configured a commit message prefix for skipping hooks. Set `git.skipHookPrefix = 'WIP'` in your config", + LcResetTo: `reset to`, + PressEnterToReturn: "엔터를 ëŚëź¬ lazygit으로 돌아갑ë‹ë‹¤.", + LcViewStashOptions: "Stash ěµě… 보기", + LcStashAllChanges: "변경사항을 Stash", + LcStashStagedChanges: "stash staged changes", + LcStashOptions: "Stash ěµě…", + NotARepository: "Error: must be run inside a git repository", + LcJump: "패ë„로 이동", + LcScrollLeftRight: "좌우로 스í¬ëˇ¤", + LcScrollLeft: "ěš° 스í¬ëˇ¤", + LcScrollRight: "좌 스í¬ëˇ¤", + DiscardPatch: "patch 버리기", + DiscardPatchConfirm: "You can only build a patch from one commit/stash-entry at a time. Discard current patch?", + CantPatchWhileRebasingError: "You cannot build a patch or run patch commands while in a merging or rebasing state", + LcToggleAddToPatch: "toggle file included in patch", + LcToggleAllInPatch: "toggle all files included in patch", + LcUpdatingPatch: "updating patch", + ViewPatchOptions: "커스텀 Patch ěµě… 보기", + PatchOptionsTitle: "Patch ěµě…", + NoPatchError: "No patch created yet. To start building a patch, use 'space' on a commit file or enter to add specific lines", + LcEnterFile: "enter file to add selected lines to the patch (or toggle directory collapsed)", + // ExitCustomPatchBuilder: ``, + EnterUpstream: `' '와 같은 í•식으로 ěž…ë Ąí•세요.`, + InvalidUpstream: "upstreaměť í•식이 ěžëŞ»ëě—습ë‹ë‹¤.' ' 와 같은 í•식으로 ěž…ë Ąí•세요.", + ReturnToRemotesList: `ě›ę˛©ëŞ©ëˇťěśĽëˇś 돌아가기`, + LcAddNewRemote: `ě로운 Remote 추가`, + LcNewRemoteName: `ě로운 Remote 이름:`, + LcNewRemoteUrl: `ě로운 Remote URL:`, + LcEditRemoteName: `{{.remoteName}} ěť ě로운 Remote 이름 ěž…ë Ą:`, + LcEditRemoteUrl: `{{.remoteName}} ěť ě로운 Remote URL ěž…ë Ą:`, + LcRemoveRemote: `Remote를 ě‚­ě ś`, + LcRemoveRemotePrompt: "ě •ë§ëˇś Remote를 ě‚­ě śí•시겠습ë‹ęąŚ?", + DeleteRemoteBranch: "ě›ę˛© 브랜ěąëĄĽ ě‚­ě ś", + DeleteRemoteBranchMessage: "ě •ë§ëˇś ě›ę˛© 브랜ěąëĄĽ ě‚­ě śí•시겠습ë‹ęąŚ?", + LcSetUpstream: "set as upstream of checked-out branch", + SetUpstreamTitle: "Set upstream branch", + SetUpstreamMessage: "Are you sure you want to set the upstream branch of '{{.checkedOut}}' to '{{.selected}}'", + LcEditRemote: "Remote를 ěě •", + LcTagCommit: "tag commit", + TagMenuTitle: "íśę·¸ 작성", + TagNameTitle: "íśę·¸ 이름:", + TagMessageTitle: "íśę·¸ 메시지: ", + LcAnnotatedTag: "annotated tag", + LcLightweightTag: "lightweight tag", + LcDeleteTag: "íśę·¸ ě‚­ě ś", + DeleteTagTitle: "íśę·¸ ě‚­ě ś", + DeleteTagPrompt: "ě •ë§ëˇś íśę·¸ '{{.tagName}}' 를 ě‚­ě śí•시겠습ë‹ęąŚ?", + PushTagTitle: "ě›ę˛©ě— íśę·¸ '{{.tagName}}' 를 푸시", + LcPushTag: "íśę·¸ëĄĽ push", + LcCreateTag: "íśę·¸ëĄĽ ěťě„±", + CreateTagTitle: "íśę·¸ 이름:", + LcFetchRemote: "ě›ę˛©ěť„ 업데이트", + FetchingRemoteStatus: "ě›ę˛©ěť„ 업데이트 중", + LcCheckoutCommit: "커밋을 체í¬ě•„ě›", + SureCheckoutThisCommit: "ě •ë§ëˇś ě„ íťí•ś 커밋을 체í¬ě•„ě› í•시겠습ë‹ęąŚ?", + LcGitFlowOptions: "git-flow ěµě… 보기", + NotAGitFlowBranch: "This does not seem to be a git flow branch", + NewGitFlowBranchPrompt: "new {{.branchType}} name:", + IgnoreTracked: "Ignore tracked file", + IgnoreTrackedPrompt: "Are you sure you want to ignore a tracked file?", + LcViewResetToUpstreamOptions: "view upstream reset options", + LcNextScreenMode: "다음 스í¬ë¦° 모드 (normal/half/fullscreen)", + LcPrevScreenMode: "ěť´ě „ 스í¬ë¦° 모드", + LcStartSearch: "ę˛€ě‰ ě‹śěž‘", + Panel: "패ë„", + Keybindings: "키 바인딩", + LcRenameBranch: "ë¸Śëžśěą ěť´ë¦„ 변경", + NewBranchNamePrompt: "ě로운 ë¸Śëžśěą ěť´ë¦„ ěž…ë Ą", + RenameBranchWarning: "This branch is tracking a remote. This action will only rename the local branch name, not the name of the remote branch. Continue?", + LcOpenMenu: "매뉴 열기", + LcResetCherryPick: "reset cherry-picked (copied) commits selection", + LcNextTab: "ěť´ě „ í­", + LcPrevTab: "다음 í­", + LcCantUndoWhileRebasing: "리베이스중ě—는 ë돌릴 ě 없습ë‹ë‹¤.", + LcCantRedoWhileRebasing: "리베이스중ě—는 다시 실행할 ě 없습ë‹ë‹¤.", + MustStashWarning: "Pulling a patch out into the index requires stashing and unstashing your changes. If something goes wrong, you'll be able to access your files from the stash. Continue?", + MustStashTitle: "Must stash", + ConfirmationTitle: "확인 패ë„", + LcPrevPage: "ěť´ě „ íŽěť´ě§€", + LcNextPage: "다음 íŽěť´ě§€", + LcGotoTop: "맨 위로 스í¬ëˇ¤ ", + LcGotoBottom: "맨 ě•„ëžëˇś 스í¬ëˇ¤ ", + LcFilteringBy: "filtering by", + ResetInParentheses: "(reset)", + LcOpenFilteringMenu: "view filter-by-path options", + LcFilterBy: "filter by", + LcExitFilterMode: "stop filtering by path", + LcFilterPathOption: "enter path to filter by", + EnterFileName: "Enter path:", + FilteringMenuTitle: "Filtering", + MustExitFilterModeTitle: "Command not available", + MustExitFilterModePrompt: "Command not available in filtered mode. Exit filtered mode?", + LcDiff: "Diff", + LcEnterRefToDiff: "enter ref to diff", + LcEnteRefName: "ref ěž…ë Ą:", + LcExitDiffMode: "Diff 모드 종료", + DiffingMenuTitle: "Diff", + LcSwapDiff: "reverse diff direction", + LcOpenDiffingMenu: "Diff 메뉴 열기", + // the actual view is the extras view which I intend to give more tabs in future but for now we'll only mention the command log part + LcOpenExtrasMenu: "명령어 로그 메뉴 열기", + LcShowingGitDiff: "showing output for:", + LcCommitDiff: "ě»¤ë°‹ěť iff", + LcCopyCommitShaToClipboard: "커밋 SHA를 í´ë¦˝ëł´ë“śě— 복사", + LcCommitSha: "커밋 SHA", + LcCommitURL: "커밋 URL", + LcCopyCommitMessageToClipboard: "커밋 메시지를 í´ë¦˝ëł´ë“śě— 복사", + LcCommitMessage: "커밋 메시지", + LcCommitAuthor: "커밋 작성ěž", + LcCopyCommitAttributeToClipboard: "커밋 attribute 복사", + LcCopyBranchNameToClipboard: "브랜ěąëŞ…ěť„ í´ë¦˝ëł´ë“śě— 복사", + LcCopyFileNameToClipboard: "파일명을 í´ë¦˝ëł´ë“śě— 복사", + LcCopyCommitFileNameToClipboard: "커밋한 파일명을 í´ë¦˝ëł´ë“śě— 복사", + LcCopySelectedTexToClipboard: "ě„ íťí•ś 텍스트를 í´ë¦˝ëł´ë“śě— 복사", + LcCommitPrefixPatternError: "Error in commitPrefix pattern", + NoFilesStagedTitle: "파일이 Staged ëě§€ 않ě•습ë‹ë‹¤.", + NoFilesStagedPrompt: "파일이 Staged ëě§€ 않ě•습ë‹ë‹¤. 모든 파일을 커밋í•시겠습ë‹ęąŚ?", + BranchNotFoundTitle: "브랜ěąëĄĽ ě°ľěť„ ě 없습ë‹ë‹¤.", + BranchNotFoundPrompt: "브랜ěąëĄĽ ě°ľěť„ ě 없습ë‹ë‹¤. ě로운 브랜ěąëĄĽ ěťě„±í•©ë‹ë‹¤.", + UnstageLinesTitle: "ě„ íťí•ś 라인을 unstaged", + UnstageLinesPrompt: "ě •ë§ëˇś ě„ íťí•ś 라인을 ě‚­ě ś (git reset) í•시겠습ë‹ęąŚ? ěť´ 조작은 취소할 ě 없습ë‹ë‹¤.\něť´ 경고를 비활성화 í•려면 설정 íŚŚěťĽěť 'gui.skipUnstageLineWarning' 를 true로 설정í•세요.", + LcCreateNewBranchFromCommit: "커밋ě—서 ě 브랜ěąëĄĽ ë§Śë“­ë‹ë‹¤.", + LcBuildingPatch: "building patch", + LcViewCommits: "커밋 보기", + MinGitVersionError: "lazygit 실행을 위해서는 Git 2.0 ěť´í›„ěť ë˛„ě „(2014ë…„ 이후ěť)ěť´ 필요합ë‹ë‹¤. Git를 업데이트 해주세요. ě•„ë‹ë©´ lazygitěť´ ěť´ě „ 버전과 더 ěž í¸í™ë도록 https://github.com/jesseduffield/lazygit/issues ě— issue를 작성해 주세요.", + LcRunningCustomCommandStatus: "커스텀 명령어 실행", + LcSubmoduleStashAndReset: "stash uncommitted submodule changes and update", + LcAndResetSubmodules: "and reset submodules", + LcEnterSubmodule: "ě„śë¸ŚëŞ¨ë“ ě—´ę¸°", + LcCopySubmoduleNameToClipboard: "ě„śë¸ŚëŞ¨ë“ ěť´ë¦„ěť„ í´ë¦˝ëł´ë“śě— 복사", + RemoveSubmodule: "ě„śë¸ŚëŞ¨ë“ ě‚­ě ś", + LcRemoveSubmodule: "ě„śë¸ŚëŞ¨ë“ ě‚­ě ś", + RemoveSubmodulePrompt: "ě •ë§ëˇś ě„śë¸ŚëŞ¨ë“ '%s'ë°Ź 해당 디렉토리를 ě śę±°í•시겠습ë‹ęąŚ? ěť´ę˛ěť€ ë돌릴 ě 없습ë‹ë‹¤.", + LcResettingSubmoduleStatus: "서브모ë“를 리셋", + LcNewSubmoduleName: "ě로운 서브모ë“이름 :", + LcNewSubmoduleUrl: "ě로운 서브모ë“ěť URL:", + LcNewSubmodulePath: "ě로운 서브모ë“ěť ę˛˝ëˇś", + LcAddSubmodule: "ě로운 ě„śë¸ŚëŞ¨ë“ ě¶”ę°€", + LcAddingSubmoduleStatus: "ě로운 ě„śë¸ŚëŞ¨ë“ ě¶”ę°€", + LcUpdateSubmoduleUrl: "ě„śë¸ŚëŞ¨ë“ '%s' ěť URLěť„ 업데이트", + LcUpdatingSubmoduleUrlStatus: "updating URL", + LcEditSubmoduleUrl: "서브모ë“ěť URLěť„ ěě •", + LcInitializingSubmoduleStatus: "ě„śë¸ŚëŞ¨ë“ ě´ę¸°í™”", + LcInitSubmodule: "ě„śë¸ŚëŞ¨ë“ ě´ę¸°í™”", + LcSubmoduleUpdate: "ě„śë¸ŚëŞ¨ë“ ě—…ëŤ°ěť´íŠ¸", + LcUpdatingSubmoduleStatus: "ě„śë¸ŚëŞ¨ë“ ě—…ëŤ°ěť´íŠ¸", + LcBulkInitSubmodules: "ě„śë¸ŚëŞ¨ë“ ěťĽę´„ ě´ę¸°í™”", + LcBulkUpdateSubmodules: "ě„śë¸ŚëŞ¨ë“ ěťĽę´„ 업데이트", + LcBulkDeinitSubmodules: "bulk deinit submodules", + LcViewBulkSubmoduleOptions: "view bulk submodule options", + LcBulkSubmoduleOptions: "bulk submodule options", + LcRunningCommand: "running command", + SubCommitsTitle: "Sub-commits", + SubmodulesTitle: "서브모ë“", + NavigationTitle: "List Panel Navigation", + SuggestionsCheatsheetTitle: "추천", + SuggestionsTitle: "추천 (press %s to focus)", + ExtrasTitle: "명령어 로그", + PushingTagStatus: "pushing tag", + PullRequestURLCopiedToClipboard: "í’€ 리í€ěŠ¤íŠ¸ěť URLěť„ í´ë¦˝ëł´ë“śě— 복사í–습ë‹ë‹¤.", + CommitDiffCopiedToClipboard: "ě»¤ë°‹ěť Diff를 í´ë¦˝ëł´ë“śě— 복사í–습ë‹ë‹¤.", + CommitSHACopiedToClipboard: "ě»¤ë°‹ěť SHA를 í´ë¦˝ëł´ë“śě— 복사í–습ë‹ë‹¤.", + CommitURLCopiedToClipboard: "ě»¤ë°‹ěť URL를 í´ë¦˝ëł´ë“śě— 복사í–습ë‹ë‹¤.", + CommitMessageCopiedToClipboard: "커밋 메시지를 í´ë¦˝ëł´ë“śě— 복사í–습ë‹ë‹¤.", + CommitAuthorCopiedToClipboard: "커밋 작성ěžëĄĽ í´ë¦˝ëł´ë“śě— 복사í–습ë‹ë‹¤.", + LcCopiedToClipboard: "í´ë¦˝ëł´ë“śě— 복사í–습ë‹ë‹¤.", + ErrCannotEditDirectory: "디렉토리는 편집할 ě 없습ë‹ë‹¤.", + ErrStageDirWithInlineMergeConflicts: "병합 충돌이 ë°śěťí•ś 파일을 포함í•는 디렉토리는 Staged/untagedí•  ě 없습ë‹ë‹¤. 병합 충돌을 먼저 해결í•세요.", + ErrRepositoryMovedOrDeleted: "저장소를 ě°ľěť„ ě 없습ë‹ë‹¤. 이미 ě‚­ě śëě—ę±°ë‚ ěť´ëŹ™ëě—ěť„ 가능성이 ěžěеë‹ë‹¤. ÂŻ\\_(ă„)_/ÂŻ", + CommandLog: "명령어 로그", + ToggleShowCommandLog: "명령어 로그 표시 여부 ě „í™", + FocusCommandLog: "명령어 ëˇśę·¸ě— íŹ¬ě»¤ěŠ¤", + CommandLogHeader: "명령어 로그표시 여부는 '%s' 으로 ě „í™í•  ě ěžěеë‹ë‹¤.\n", + RandomTip: "랜덤 Tip", + SelectParentCommitForMerge: "병합을 위한 ěěś„ 커밋 ě„ íť", + ToggleWhitespaceInDiffView: "공백문ěžëĄĽ Diff ë·°ě—서 표시 여부 ě „í™", + IgnoringWhitespaceInDiffView: "공백문ěžëĄĽ Diff ë·°ě—서 무시", + ShowingWhitespaceInDiffView: "공백문ěžëĄĽ Diff ë·°ě—서 표시", + IncreaseContextInDiffView: "diff ëł´ę¸°ěť ëł€ę˛˝ 사항 ěŁĽěś„ě— í‘śě‹śë는 ě»¨í…ŤěŠ¤íŠ¸ěť í¬ę¸°ëĄĽ ëŠë¦¬ę¸°", + DecreaseContextInDiffView: "diff ëł´ę¸°ěť ëł€ę˛˝ 사항 ěŁĽěś„ě— í‘śě‹śë는 컨텍스트 í¬ę¸° 줄이기", + CreatePullRequest: "í’€ 리í€ěŠ¤íŠ¸ ěťě„±", + CreatePullRequestOptions: "í’€ 리í€ěŠ¤íŠ¸ ěťě„± ěµě…", + LcCreatePullRequestOptions: "í’€ 리í€ěŠ¤íŠ¸ ěťě„± ěµě…", + LcDefaultBranch: "기본 브랜ěą", + LcSelectBranch: "브랜ěąëĄĽ ě„ íť", + SelectConfigFile: "설정파일 ě„ íť", + NoConfigFileFoundErr: "설정 파일을 ě°ľě§€ 못í–습ë‹ë‹¤.", + LcLoadingFileSuggestions: "파일 ě śě• ëˇśë”© 중", + LcLoadingCommits: "커밋 로딩", + MustSpecifyOriginError: "Must specify a remote if specifying a branch", + GitOutput: "Git output:", + GitCommandFailed: "Git command failed. Check command log for details (open with %s)", + AbortTitle: "%s 중지", + AbortPrompt: "ě •ë§ëˇś 실행중인 %s 를 중지할까요?", + LcOpenLogMenu: "로그 메뉴 열기", + LogMenuTitle: "커밋 로그 ěµě…", + ToggleShowGitGraphAll: "toggle show whole git graph (pass the `--all` flag to `git log`)", + ShowGitGraph: "커밋 ę·¸ëží”„ 표시", + SortCommits: "커밋 ě •ë ¬", + CantChangeContextSizeError: "Cannot change context while in patch building mode because we were too lazy to support it when releasing the feature. If you really want it, please let us know!", + LcOpenCommitInBrowser: "브라우저ě—서 커밋 열기", + LcViewBisectOptions: "bisect ěµě… 보기", + ConfirmRevertCommit: "Are you sure you want to revert {{.selectedCommit}}?", + RewordInEditorTitle: "커밋 메시지를 ě—디터ě—서 ěě •", + RewordInEditorPrompt: "Are you sure you want to reword this commit in your editor?", + HardResetAutostashPrompt: "Are you sure you want to hard reset to '%s'? An auto-stash will be performed if necessary.", + CheckoutPrompt: "Are you sure you want to checkout '%s'?", + UpstreamGone: "(upstream gone)", + Actions: Actions{ + // TODO: combine this with the original keybinding descriptions (those are all in lowercase atm) + CheckoutCommit: "커밋 체í¬ě•„ě›", + CheckoutTag: "íśę·¸ 체í¬ě•„ě›", + CheckoutBranch: "ë¸Śëžśěą ě˛´í¬ě•„ě›", + ForceCheckoutBranch: "ë¸Śëžśěą Force 체í¬ě•„ě›", + DeleteBranch: "ë¸Śëžśěą ě‚­ě ś", + Merge: "병합", + RebaseBranch: "ë¸Śëžśěą ë¦¬ë˛ ěť´ěŠ¤", + RenameBranch: "ë¸Śëžśěą ěť´ë¦„ 변경", + SetUnsetUpstream: "Set/unset upstream", + CreateBranch: "ë¸Śëžśěą ěťě„±", + CherryPick: "(Cherry-pick) 커밋 붙여넣기", + CheckoutFile: "체í¬ě•„ě› íŚŚěťĽ", + DiscardOldFileChange: "Discard old file change", + SquashCommitDown: "Squash commit down", + FixupCommit: "커밋 Fixup", + RewordCommit: "커밋 Reword", + DropCommit: "커밋 Drop", + EditCommit: "커밋 ěě •", + AmendCommit: "커밋 Amend", + ResetCommitAuthor: "커밋 ěž‘ě„±ěž Reset", + RevertCommit: "커밋 Revert", + CreateFixupCommit: "fixup 커밋 ěťě„±", + SquashAllAboveFixupCommits: "Squash all above fixup commits", + CreateLightweightTag: "Create lightweight tag", + CreateAnnotatedTag: "Create annotated tag", + CopyCommitMessageToClipboard: "커밋 메시지를 í´ë¦˝ëł´ë“śě— 복사", + CopyCommitDiffToClipboard: "커밋 diff를 í´ë¦˝ëł´ë“śě— 복사", + CopyCommitSHAToClipboard: "커밋 SHA를 í´ë¦˝ëł´ë“śě— 복사", + CopyCommitURLToClipboard: "커밋 URL를 í´ë¦˝ëł´ë“śě— 복사", + CopyCommitAuthorToClipboard: "커밋 작성ěžëĄĽ í´ë¦˝ëł´ë“śě— 복사", + CopyCommitAttributeToClipboard: "í´ë¦˝ëł´ë“śě— 복사", + MoveCommitUp: "Move commit up", + MoveCommitDown: "Move commit down", + CustomCommand: "Custom command", + DiscardAllChangesInDirectory: "Discard all changes in directory", + DiscardUnstagedChangesInDirectory: "Discard unstaged changes in directory", + DiscardAllChangesInFile: "Discard all changes in file", + DiscardAllUnstagedChangesInFile: "Discard all unstaged changes in file", + StageFile: "Stage file", + StageResolvedFiles: "Stage files whose merge conflicts were resolved", + UnstageFile: "Unstage file", + UnstageAllFiles: "Unstage all files", + StageAllFiles: "Stage all files", + LcIgnoreExcludeFile: "ignore file", + Commit: "커밋", + EditFile: "파일 ěě •", + Push: "푸시", + Pull: "업데이트(Pull)", + OpenFile: "파일 열기", + StashAllChanges: "Stash all changes", + StashAllChangesKeepIndex: "Stash all changes and keep index", + StashStagedChanges: "Stash staged changes", + StashUnstagedChanges: "Stash unstaged changes", + GitFlowFinish: "Git flow finish", + GitFlowStart: "Git Flow start", + CopyToClipboard: "Copy to clipboard", + CopySelectedTextToClipboard: "Copy selected text to clipboard", + RemovePatchFromCommit: "Remove patch from commit", + MovePatchToSelectedCommit: "Move patch to selected commit", + MovePatchIntoIndex: "Move patch into index", + MovePatchIntoNewCommit: "Move patch into new commit", + DeleteRemoteBranch: "Delete remote branch", + SetBranchUpstream: "Set branch upstream", + AddRemote: "Add remote", + RemoveRemote: "Remove remote", + UpdateRemote: "Update remote", + ApplyPatch: "Apply patch", + Stash: "Stash", + RemoveSubmodule: "ě„śë¸ŚëŞ¨ë“ ě‚­ě ś", + ResetSubmodule: "ě„śë¸ŚëŞ¨ë“ Reset", + AddSubmodule: "ě„śë¸ŚëŞ¨ë“ ě¶”ę°€", + UpdateSubmoduleUrl: "ě„śë¸ŚëŞ¨ë“ URL 업데이트", + InitialiseSubmodule: "ě„śë¸ŚëŞ¨ë“ ě´ę¸°í™”", + BulkInitialiseSubmodules: "Bulk initialise submodules", + BulkUpdateSubmodules: "Bulk update submodules", + BulkDeinitialiseSubmodules: "Bulk deinitialise submodules", + UpdateSubmodule: "ě„śë¸ŚëŞ¨ë“ ě—…ëŤ°ěť´íŠ¸", + DeleteTag: "íśę·¸ ě‚­ě ś", + PushTag: "íśę·¸ 푸시g", + NukeWorkingTree: "Nuke working tree", + DiscardUnstagedFileChanges: "unstaged 파일 변경사항 버리기", + RemoveUntrackedFiles: "untracked 파일 ě‚­ě ś", + RemoveStagedFiles: "staged 파일 ě‚­ě ś", + SoftReset: "Soft reset", + MixedReset: "Mixed reset", + HardReset: "Hard reset", + FastForwardBranch: "Fast forward branch", + Undo: "ë돌리기", + Redo: "다시 실행", + CopyPullRequestURL: "í’€ 리í€ěŠ¤íŠ¸ URL 복사", + OpenMergeTool: "병합 도구 열기", + OpenCommitInBrowser: "브라우저ě—서 커밋 열기", + OpenPullRequest: "브라우저ě—서 í’€ 리í€ěŠ¤íŠ¸ 열기", + StartBisect: "Start bisect", + ResetBisect: "Reset bisect", + BisectSkip: "Bisect skip", + BisectMark: "Bisect mark", + }, + Bisect: Bisect{ + Mark: "mark %s as %s", + MarkStart: "mark %s as %s (start bisect)", + Skip: "%s 를 스킵", + ResetTitle: "'git bisect' 를 리셋", + ResetPrompt: "ě •ë§ëˇś 'git bisect' 를 리셋í•시겠습ë‹ęąŚ?", + ResetOption: "bisect를 리셋", + BisectMenuTitle: "bisect", + CompleteTitle: "Bisect 완료", + CompletePrompt: "Bisect complete! The following commit introduced the change:\n\n%s\n\nDo you want to reset 'git bisect' now?", + CompletePromptIndeterminate: "Bisect complete! Some commits were skipped, so any of the following commits may have introduced the change:\n\n%s\n\nDo you want to reset 'git bisect' now?", + }, + } +} diff --git a/pkg/i18n/polish.go b/pkg/i18n/polish.go index 2eeecb61c..74ea00673 100644 --- a/pkg/i18n/polish.go +++ b/pkg/i18n/polish.go @@ -17,6 +17,7 @@ func polishTranslationSet() TranslationSet { PassUnameWrong: "NiewĹ‚aĹ›ciwe hasĹ‚o, fraza lub nazwa uĹĽytkownika", CommitChanges: "ZatwierdĹş zmiany", AmendLastCommit: "ZmieĹ„ ostatni commit", + AmendLastCommitTitle: "ZmieĹ„ Ostatni Commit", SureToAmend: "Czy na pewno chcesz zmienić ostatni commit? MoĹĽesz zmienić komunikat commitu z panelu commitĂłw.", NoCommitToAmend: "Brak commitĂłw do zmiany.", CommitChangesWithEditor: "ZatwierdĹş zmiany uĹĽywajÄ…c edytora", @@ -29,7 +30,6 @@ func polishTranslationSet() TranslationSet { LcToggleStagedAll: "przełącz stan poczekalni wszystkich", LcRefresh: "odĹ›wieĹĽ", LcScroll: "przewiĹ„", - LcCommitFileFilter: "Filtrowanie commitĂłw", FilterStagedFiles: "PokaĹĽ tylko pliki w poczekalni", FilterUnstagedFiles: "PokaĹĽ tylko pliki poza poczekalniÄ…", ResetCommitFilterState: "Resetuj filtr commitĂłw", @@ -61,7 +61,6 @@ func polishTranslationSet() TranslationSet { CloseConfirm: "{{.keyBindClose}}: zamknij, {{.keyBindConfirm}}: potwierdĹş", LcClose: "zamknij", LcSquashDown: "Ĺ›ciĹ›nij", - LcResetToThisCommit: "zresetuj do tego commita", LcFixupCommit: "napraw commit", NoCommitsThisBranch: "Brak commitĂłw dla tej gałęzi", OnlySquashTopmostCommit: "MoĹĽna tylko spĹ‚aszczyć najwyĹĽszy commit", @@ -84,7 +83,6 @@ func polishTranslationSet() TranslationSet { SureDropStashEntry: "JesteĹ› pewny, ĹĽe chcesz porzucić tÄ™ pozycjÄ™ w schowku?", NoTrackedStagedFilesStash: "Nie masz Ĺ›ledzonych/zatwierdzonych plikĂłw do przechowania", StashChanges: "Przechowaj zmiany", - MergeAborted: "Scalanie anulowane", OpenConfig: "otwĂłrz konfiguracjÄ™", EditConfig: "edytuj konfiguracjÄ™", ForcePush: "WymuĹ› wysĹ‚anie", @@ -176,7 +174,7 @@ func polishTranslationSet() TranslationSet { AmendingStatus: "poprawianie", CherryPickingStatus: "przebieranie", CommitFiles: "Pliki commita", - LcViewCommitFiles: "przeglÄ…daj pliki commita", + LcViewItemFiles: "przeglÄ…daj pliki commita", CommitFilesTitle: "Pliki commita", LcCheckoutCommitFile: "plik wybierania", LcDiscardOldFileChange: "porzuć zmiany commita dla tego pliku", @@ -210,11 +208,11 @@ func polishTranslationSet() TranslationSet { PressEnterToReturn: "WciĹ›nij enter ĹĽeby wrĂłcić do lazygit", LcViewStashOptions: "wyĹ›wietl opcje schowka", LcStashAllChanges: "przechowaj zmiany", - LcStashStagedChanges: "przechowaj zmiany z poczekalni", + LcStashAllChangesKeepIndex: "przechowaj zmiany z poczekalni", LcStashOptions: "Opcje schowka", NotARepository: "Błąd: nie jesteĹ› w repozytorium", LcJump: "przeskocz do panelu", - ExitLineByLineMode: `wyĹ›cie z trybu "linia po linii"`, + ExitCustomPatchBuilder: `wyĹ›cie z trybu "linia po linii"`, EnterUpstream: `Podaj gałąź nadrzÄ™dnÄ… jako ' '`, ReturnToRemotesList: `wróć do listy repozytoriĂłw zdalnych`, IgnoreTracked: "Ignoruj plik Ĺ›ledzony", diff --git a/pkg/integration/README.md b/pkg/integration/README.md new file mode 100644 index 000000000..ba2365403 --- /dev/null +++ b/pkg/integration/README.md @@ -0,0 +1,74 @@ +# Integration Tests + +The pkg/integration pacakge is for integration testing: that is, actually running a real lazygit session and having a robot pretend to be a human user and then making assertions that everything works as expected. + +## Writing tests + +The tests live in pkg/integration/tests. Each test has two important steps: the setup step and the run step. + +### Setup step + +In the setup step, we prepare a repo with shell commands, for example, creating a merge conflict that will need to be resolved upon opening lazygit. This is all done via the `shell` argument. + +### Run step + +The run step has four arguments passed in: + +1. `shell` +2. `input` +3. `assert` +4. `keys` + +`shell` we've already seen in the setup step. The reason it's passed into the run step is that we may want to emulate background events. For example, the user modifying a file outside of lazygit. + +`input` is for driving the gui by pressing certain keys, selecting list items, etc. + +`assert` is for asserting on the state of the lazygit session. When you call a method on `assert`, the assert struct will wait for the assertion to hold true and then continue (failing the test after a timeout). For this reason, assertions have two purposes: one is to ensure the test fails as soon as something unexpected happens, but another is to allow lazygit to process a keypress before you follow up with more keypresses. If you input a bunch of keypresses too quickly lazygit might get confused. + +### Tips + +Try to do as much setup work as possible in your setup step. For example, if all you're testing is that the user is able to resolve merge conflicts, create the merge conflicts in the setup step. On the other hand, if you're testing to see that lazygit can warn the user about merge conflicts after an attempted merge, it's fine to wait until the run step to actually create the conflicts. If the run step is focused on the thing you're trying to test, the test will run faster and its intent will be clearer. + +Use assertions to ensure that lazygit has processed all your keybindings so far. For example, if you press 'n' on a branch to create a new branch, assert that the confirmation view is now focused. + +If you find yourself doing something frequently in a test, consider making it a method in one of the helper arguments. For example, instead of calling `input.PressKey(keys.Universal.Confirm)` in 100 places, it's better to have a method `input.Confirm()`. This is not to say that everything should be made into a method on the input struct: just things that are particularly common in tests. + +## Running tests + +There are three ways to invoke a test: + +1. go run cmd/integration_test/main.go cli [...] +2. go run cmd/integration_test/main.go tui +3. go test pkg/integration/clients/go_test.go + +The first, the test runner, is for directly running a test from the command line. If you pass no arguments, it runs all tests. +The second, the TUI, is for running tests from a terminal UI where it's easier to find a test and run it without having to copy it's name and paste it into the terminal. This is the easiest approach by far. +The third, the go-test command, intended only for use in CI, to be run along with the other `go test` tests. This runs the tests in headless mode so there's no visual output. + +The name of a test is based on its path, so the name of the test at `pkg/integration/tests/commit/new_branch.go` is commit/new_branch. So to run it with our test runner you would run `go run cmd/integration_test/main.go cli commit/new_branch`. + +You can pass the KEY_PRESS_DELAY env var to the test runner in order to set a delay in milliseconds between keypresses, which helps for watching a test at a realistic speed to understand what it's doing. Or in the tui you can press 't' to run the test with a pre-set delay. + +### Snapshots + +At the moment (this is subject to change) each test has a snapshot repo created after running for the first time. These snapshots live in `test/integration_new`, in folders named 'expected' (alongside the 'actual' folders which contain the resulting repo from the last test run). Whenever you run a test, the resultant repo will be compared against the snapshot repo and if they're different, you'll be asked whether you want to update the snapshot. If you want to update a snapshot without being prompted you can pass MODE=update to the test runner. + +### Sandbox mode + +Say you want to do a manual test of how lazygit handles merge-conflicts, but you can't be bothered actually finding a way to create merge conflicts in a repo. To make your life easier, you can simply run a merge-conflicts test in sandbox mode, meaning the setup step is run for you, and then instead of the test driving the lazygit session, you're allowed to drive it yourself. + +To run a test in sandbox mode you can press 's' on a test in the test TUI or pass the env var MODE=sandbox to the test runner. + +## Migration process + +At the time of writing, most tests are created under an old approach, where you would record yourself in a lazygit session and then the test would replay the keybindings with the same timestamps. This old approach is great for writing tests quickly, but is much harder to maintain. It has to rely entirely on snapshots to determining if a test passes or fails, and can't do assertions along the way. It's also harder to grok what's the intention behind certain actions that take place within the test (e.g. was the recorder intentionally switching to another panel or was that just a misclick?). + +At the moment, all the deprecated test code lives in pkg/integration/deprecated. Hopefully in the very near future we migrate everything across so that we don't need to maintain two systems. + +We should never write any new tests under the old method, and if a given test breaks because of new functionality, it's best to simply rewrite it under the new approach. If you want to run a test for the sake of watching what it does so that you can transcribe it into the new approach, you can run: + +``` +go run pkg/integration/deprecated/cmd/tui/main.go +``` + +The tests in the old format live in test/integration. In the old format, test definitions are co-located with the snapshots. The setup step is done in a `setup.sh` shell script and the `recording.json` file contains the recorded keypresses to be replayed during the test. diff --git a/pkg/integration/clients/cli.go b/pkg/integration/clients/cli.go new file mode 100644 index 000000000..76f0c9549 --- /dev/null +++ b/pkg/integration/clients/cli.go @@ -0,0 +1,96 @@ +package clients + +import ( + "log" + "os" + "os/exec" + "strconv" + + "github.com/jesseduffield/lazygit/pkg/integration/components" + "github.com/jesseduffield/lazygit/pkg/integration/tests" +) + +// see pkg/integration/README.md + +// The purpose of this program is to run integration tests. It does this by +// building our injector program (in the sibling injector directory) and then for +// each test we're running, invoke the injector program with the test's name as +// an environment variable. Then the injector finds the test and passes it to +// the lazygit startup code. + +// If invoked directly, you can specify tests to run by passing their names as positional arguments + +func RunCLI(testNames []string) { + err := components.RunTests( + getTestsToRun(testNames), + log.Printf, + runCmdInTerminal, + runAndPrintError, + getModeFromEnv(), + tryConvert(os.Getenv("KEY_PRESS_DELAY"), 0), + ) + if err != nil { + log.Print(err.Error()) + } +} + +func runAndPrintError(test *components.IntegrationTest, f func() error) { + if err := f(); err != nil { + log.Print(err.Error()) + } +} + +func getTestsToRun(testNames []string) []*components.IntegrationTest { + var testsToRun []*components.IntegrationTest + + if len(testNames) == 0 { + return tests.Tests + } + +outer: + for _, testName := range testNames { + // check if our given test name actually exists + for _, test := range tests.Tests { + if test.Name() == testName { + testsToRun = append(testsToRun, test) + continue outer + } + } + log.Fatalf("test %s not found. Perhaps you forgot to add it to `pkg/integration/integration_tests/tests.go`?", testName) + } + + return testsToRun +} + +func runCmdInTerminal(cmd *exec.Cmd) error { + cmd.Stdout = os.Stdout + cmd.Stdin = os.Stdin + cmd.Stderr = os.Stderr + + return cmd.Run() +} + +func getModeFromEnv() components.Mode { + switch os.Getenv("MODE") { + case "", "ask": + return components.ASK_TO_UPDATE_SNAPSHOT + case "check": + return components.CHECK_SNAPSHOT + case "update": + return components.UPDATE_SNAPSHOT + case "sandbox": + return components.SANDBOX + default: + log.Fatalf("unknown test mode: %s, must be one of [ask, check, update, sandbox]", os.Getenv("MODE")) + panic("unreachable") + } +} + +func tryConvert(numStr string, defaultVal int) int { + num, err := strconv.Atoi(numStr) + if err != nil { + return defaultVal + } + + return num +} diff --git a/pkg/integration/clients/go_test.go b/pkg/integration/clients/go_test.go new file mode 100644 index 000000000..d52cd409a --- /dev/null +++ b/pkg/integration/clients/go_test.go @@ -0,0 +1,68 @@ +//go:build !windows +// +build !windows + +package clients + +// this is the new way of running tests. See pkg/integration/integration_tests/commit.go +// for an example + +import ( + "io" + "io/ioutil" + "os" + "os/exec" + "testing" + + "github.com/creack/pty" + "github.com/jesseduffield/lazygit/pkg/integration/components" + "github.com/jesseduffield/lazygit/pkg/integration/tests" + "github.com/stretchr/testify/assert" +) + +func TestIntegration(t *testing.T) { + if testing.Short() { + t.Skip("Skipping integration tests in short mode") + } + + parallelTotal := tryConvert(os.Getenv("PARALLEL_TOTAL"), 1) + parallelIndex := tryConvert(os.Getenv("PARALLEL_INDEX"), 0) + testNumber := 0 + + err := components.RunTests( + tests.Tests, + t.Logf, + runCmdHeadless, + func(test *components.IntegrationTest, f func() error) { + defer func() { testNumber += 1 }() + if testNumber%parallelTotal != parallelIndex { + return + } + + t.Run(test.Name(), func(t *testing.T) { + err := f() + assert.NoError(t, err) + }) + }, + components.CHECK_SNAPSHOT, + 0, + ) + + assert.NoError(t, err) +} + +func runCmdHeadless(cmd *exec.Cmd) error { + cmd.Env = append( + cmd.Env, + "HEADLESS=true", + "TERM=xterm", + ) + + f, err := pty.StartWithSize(cmd, &pty.Winsize{Rows: 100, Cols: 100}) + if err != nil { + return err + } + + _, _ = io.Copy(ioutil.Discard, f) + + return f.Close() +} diff --git a/pkg/integration/clients/injector/main.go b/pkg/integration/clients/injector/main.go new file mode 100644 index 000000000..263dba5da --- /dev/null +++ b/pkg/integration/clients/injector/main.go @@ -0,0 +1,62 @@ +package main + +import ( + "fmt" + "os" + + "github.com/jesseduffield/lazygit/pkg/app" + "github.com/jesseduffield/lazygit/pkg/app/daemon" + "github.com/jesseduffield/lazygit/pkg/integration/components" + "github.com/jesseduffield/lazygit/pkg/integration/tests" + integrationTypes "github.com/jesseduffield/lazygit/pkg/integration/types" +) + +// The purpose of this program is to run lazygit with an integration test passed in. +// We could have done the check on TEST_NAME in the root main.go but +// that would mean lazygit would be depending on integration test code which +// would bloat the binary. + +// You should not invoke this program directly. Instead you should go through +// go run cmd/integration_test/main.go + +func main() { + dummyBuildInfo := &app.BuildInfo{ + Commit: "", + Date: "", + Version: "", + BuildSource: "integration test", + } + + integrationTest := getIntegrationTest() + + app.Start(dummyBuildInfo, integrationTest) +} + +func getIntegrationTest() integrationTypes.IntegrationTest { + if daemon.InDaemonMode() { + // if we've invoked lazygit as a daemon from within lazygit, + // we don't want to pass a test to the rest of the code. + return nil + } + + if os.Getenv(components.SANDBOX_ENV_VAR) == "true" { + // when in sandbox mode we don't want the test controlling the gui + return nil + } + + integrationTestName := os.Getenv(components.TEST_NAME_ENV_VAR) + if integrationTestName == "" { + panic(fmt.Sprintf( + "expected %s environment variable to be set, given that we're running an integration test", + components.TEST_NAME_ENV_VAR, + )) + } + + for _, candidateTest := range tests.Tests { + if candidateTest.Name() == integrationTestName { + return candidateTest + } + } + + panic("Could not find integration test with name: " + integrationTestName) +} diff --git a/pkg/integration/clients/tui.go b/pkg/integration/clients/tui.go new file mode 100644 index 000000000..707e482ca --- /dev/null +++ b/pkg/integration/clients/tui.go @@ -0,0 +1,379 @@ +package clients + +import ( + "fmt" + "log" + "os" + "path/filepath" + "strings" + + "github.com/jesseduffield/generics/slices" + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/gui" + "github.com/jesseduffield/lazygit/pkg/gui/style" + "github.com/jesseduffield/lazygit/pkg/integration/components" + "github.com/jesseduffield/lazygit/pkg/integration/tests" + "github.com/jesseduffield/lazygit/pkg/secureexec" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +// This program lets you run integration tests from a TUI. See pkg/integration/README.md for more info. + +func RunTUI() { + rootDir := utils.GetLazygitRootDirectory() + testDir := filepath.Join(rootDir, "test", "integration") + + app := newApp(testDir) + app.loadTests() + + g, err := gocui.NewGui(gocui.OutputTrue, false, gocui.NORMAL, false, gui.RuneReplacements) + if err != nil { + log.Panicln(err) + } + + g.Cursor = false + + app.g = g + + g.SetManagerFunc(app.layout) + + if err := g.SetKeybinding("list", gocui.KeyArrowUp, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { + if app.itemIdx > 0 { + app.itemIdx-- + } + listView, err := g.View("list") + if err != nil { + return err + } + listView.FocusPoint(0, app.itemIdx) + return nil + }); err != nil { + log.Panicln(err) + } + + if err := g.SetKeybinding("list", gocui.KeyArrowDown, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { + if app.itemIdx < len(app.filteredTests)-1 { + app.itemIdx++ + } + + listView, err := g.View("list") + if err != nil { + return err + } + listView.FocusPoint(0, app.itemIdx) + return nil + }); err != nil { + log.Panicln(err) + } + + if err := g.SetKeybinding("list", gocui.KeyCtrlC, gocui.ModNone, quit); err != nil { + log.Panicln(err) + } + + if err := g.SetKeybinding("list", 'q', gocui.ModNone, quit); err != nil { + log.Panicln(err) + } + + if err := g.SetKeybinding("list", 's', gocui.ModNone, func(*gocui.Gui, *gocui.View) error { + currentTest := app.getCurrentTest() + if currentTest == nil { + return nil + } + + suspendAndRunTest(currentTest, components.SANDBOX, 0) + + return nil + }); err != nil { + log.Panicln(err) + } + + if err := g.SetKeybinding("list", gocui.KeyEnter, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { + currentTest := app.getCurrentTest() + if currentTest == nil { + return nil + } + + suspendAndRunTest(currentTest, components.ASK_TO_UPDATE_SNAPSHOT, 0) + + return nil + }); err != nil { + log.Panicln(err) + } + + if err := g.SetKeybinding("list", 't', gocui.ModNone, func(*gocui.Gui, *gocui.View) error { + currentTest := app.getCurrentTest() + if currentTest == nil { + return nil + } + + suspendAndRunTest(currentTest, components.ASK_TO_UPDATE_SNAPSHOT, 200) + + return nil + }); err != nil { + log.Panicln(err) + } + + if err := g.SetKeybinding("list", 'o', gocui.ModNone, func(*gocui.Gui, *gocui.View) error { + currentTest := app.getCurrentTest() + if currentTest == nil { + return nil + } + + cmd := secureexec.Command("sh", "-c", fmt.Sprintf("code -r pkg/integration/tests/%s", currentTest.Name())) + if err := cmd.Run(); err != nil { + return err + } + + return nil + }); err != nil { + log.Panicln(err) + } + + if err := g.SetKeybinding("list", 'O', gocui.ModNone, func(*gocui.Gui, *gocui.View) error { + currentTest := app.getCurrentTest() + if currentTest == nil { + return nil + } + + cmd := secureexec.Command("sh", "-c", fmt.Sprintf("code test/integration_new/%s", currentTest.Name())) + if err := cmd.Run(); err != nil { + return err + } + + return nil + }); err != nil { + log.Panicln(err) + } + + if err := g.SetKeybinding("list", '/', gocui.ModNone, func(*gocui.Gui, *gocui.View) error { + app.filtering = true + if _, err := g.SetCurrentView("editor"); err != nil { + return err + } + editorView, err := g.View("editor") + if err != nil { + return err + } + editorView.Clear() + + return nil + }); err != nil { + log.Panicln(err) + } + + // not using the editor yet, but will use it to help filter the list + if err := g.SetKeybinding("editor", gocui.KeyEsc, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { + app.filtering = false + if _, err := g.SetCurrentView("list"); err != nil { + return err + } + + app.filteredTests = tests.Tests + app.renderTests() + app.editorView.TextArea.Clear() + app.editorView.Clear() + app.editorView.Reset() + + return nil + }); err != nil { + log.Panicln(err) + } + + if err := g.SetKeybinding("editor", gocui.KeyEnter, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { + app.filtering = false + + if _, err := g.SetCurrentView("list"); err != nil { + return err + } + + app.renderTests() + + return nil + }); err != nil { + log.Panicln(err) + } + + err = g.MainLoop() + g.Close() + switch err { + case gocui.ErrQuit: + return + default: + log.Panicln(err) + } +} + +type app struct { + filteredTests []*components.IntegrationTest + itemIdx int + testDir string + filtering bool + g *gocui.Gui + listView *gocui.View + editorView *gocui.View +} + +func newApp(testDir string) *app { + return &app{testDir: testDir} +} + +func (self *app) getCurrentTest() *components.IntegrationTest { + self.adjustCursor() + if len(self.filteredTests) > 0 { + return self.filteredTests[self.itemIdx] + } + return nil +} + +func (self *app) loadTests() { + self.filteredTests = tests.Tests + + self.adjustCursor() +} + +func (self *app) adjustCursor() { + self.itemIdx = utils.Clamp(self.itemIdx, 0, len(self.filteredTests)-1) +} + +func (self *app) filterWithString(needle string) { + if needle == "" { + self.filteredTests = tests.Tests + } else { + self.filteredTests = slices.Filter(tests.Tests, func(test *components.IntegrationTest) bool { + return strings.Contains(test.Name(), needle) + }) + } + + self.renderTests() + self.g.Update(func(g *gocui.Gui) error { return nil }) +} + +func (self *app) renderTests() { + self.listView.Clear() + for _, test := range self.filteredTests { + fmt.Fprintln(self.listView, test.Name()) + } +} + +func (self *app) wrapEditor(f func(v *gocui.View, key gocui.Key, ch rune, mod gocui.Modifier) bool) func(v *gocui.View, key gocui.Key, ch rune, mod gocui.Modifier) bool { + return func(v *gocui.View, key gocui.Key, ch rune, mod gocui.Modifier) bool { + matched := f(v, key, ch, mod) + if matched { + self.filterWithString(v.TextArea.GetContent()) + } + return matched + } +} + +func suspendAndRunTest(test *components.IntegrationTest, mode components.Mode, keyPressDelay int) { + if err := gocui.Screen.Suspend(); err != nil { + panic(err) + } + + runTuiTest(test, mode, keyPressDelay) + + fmt.Fprintf(os.Stdout, "\n%s", style.FgGreen.Sprint("press enter to return")) + fmt.Scanln() // wait for enter press + + if err := gocui.Screen.Resume(); err != nil { + panic(err) + } +} + +func (self *app) layout(g *gocui.Gui) error { + maxX, maxY := g.Size() + descriptionViewHeight := 7 + keybindingsViewHeight := 3 + editorViewHeight := 3 + if !self.filtering { + editorViewHeight = 0 + } else { + descriptionViewHeight = 0 + keybindingsViewHeight = 0 + } + g.Cursor = self.filtering + g.FgColor = gocui.ColorGreen + listView, err := g.SetView("list", 0, 0, maxX-1, maxY-descriptionViewHeight-keybindingsViewHeight-editorViewHeight-1, 0) + if err != nil { + if err.Error() != "unknown view" { + return err + } + + if self.listView == nil { + self.listView = listView + } + + listView.Highlight = true + self.renderTests() + listView.Title = "Tests" + listView.FgColor = gocui.ColorDefault + if _, err := g.SetCurrentView("list"); err != nil { + return err + } + } + + descriptionView, err := g.SetViewBeneath("description", "list", descriptionViewHeight) + if err != nil { + if err.Error() != "unknown view" { + return err + } + descriptionView.Title = "Test description" + descriptionView.Wrap = true + descriptionView.FgColor = gocui.ColorDefault + } + + keybindingsView, err := g.SetViewBeneath("keybindings", "description", keybindingsViewHeight) + if err != nil { + if err.Error() != "unknown view" { + return err + } + keybindingsView.Title = "Keybindings" + keybindingsView.Wrap = true + keybindingsView.FgColor = gocui.ColorDefault + fmt.Fprintln(keybindingsView, "up/down: navigate, enter: run test, t: run test slow, s: sandbox, o: open test file, shift+o: open test snapshot directory, forward-slash: filter") + } + + editorView, err := g.SetViewBeneath("editor", "keybindings", editorViewHeight) + if err != nil { + if err.Error() != "unknown view" { + return err + } + + if self.editorView == nil { + self.editorView = editorView + } + + editorView.Title = "Filter" + editorView.FgColor = gocui.ColorDefault + editorView.Editable = true + editorView.Editor = gocui.EditorFunc(self.wrapEditor(gocui.SimpleEditor)) + } + + currentTest := self.getCurrentTest() + if currentTest == nil { + return nil + } + + descriptionView.Clear() + fmt.Fprint(descriptionView, currentTest.Description()) + + return nil +} + +func quit(g *gocui.Gui, v *gocui.View) error { + return gocui.ErrQuit +} + +func runTuiTest(test *components.IntegrationTest, mode components.Mode, keyPressDelay int) { + err := components.RunTests( + []*components.IntegrationTest{test}, + log.Printf, + runCmdInTerminal, + runAndPrintError, + mode, + keyPressDelay, + ) + if err != nil { + log.Println(err.Error()) + } +} diff --git a/pkg/integration/components/assert.go b/pkg/integration/components/assert.go new file mode 100644 index 000000000..584ad438b --- /dev/null +++ b/pkg/integration/components/assert.go @@ -0,0 +1,111 @@ +package components + +import ( + "fmt" + "strings" + "time" + + "github.com/jesseduffield/lazygit/pkg/gui/types" + integrationTypes "github.com/jesseduffield/lazygit/pkg/integration/types" +) + +// through this struct we assert on the state of the lazygit gui + +type Assert struct { + gui integrationTypes.GuiDriver +} + +func NewAssert(gui integrationTypes.GuiDriver) *Assert { + return &Assert{gui: gui} +} + +func (self *Assert) WorkingTreeFileCount(expectedCount int) { + self.assertWithRetries(func() (bool, string) { + actualCount := len(self.gui.Model().Files) + + return actualCount == expectedCount, fmt.Sprintf( + "Expected %d changed working tree files, but got %d", + expectedCount, actualCount, + ) + }) +} + +func (self *Assert) CommitCount(expectedCount int) { + self.assertWithRetries(func() (bool, string) { + actualCount := len(self.gui.Model().Commits) + + return actualCount == expectedCount, fmt.Sprintf( + "Expected %d commits present, but got %d", + expectedCount, actualCount, + ) + }) +} + +func (self *Assert) HeadCommitMessage(expectedMessage string) { + self.assertWithRetries(func() (bool, string) { + if len(self.gui.Model().Commits) == 0 { + return false, "Expected at least one commit to be present" + } + + headCommit := self.gui.Model().Commits[0] + if headCommit.Name != expectedMessage { + return false, fmt.Sprintf( + "Expected commit message to be '%s', but got '%s'", + expectedMessage, headCommit.Name, + ) + } + + return true, "" + }) +} + +func (self *Assert) CurrentViewName(expectedViewName string) { + self.assertWithRetries(func() (bool, string) { + actual := self.gui.CurrentContext().GetView().Name() + return actual == expectedViewName, fmt.Sprintf("Expected current view name to be '%s', but got '%s'", expectedViewName, actual) + }) +} + +func (self *Assert) CurrentBranchName(expectedViewName string) { + self.assertWithRetries(func() (bool, string) { + actual := self.gui.CheckedOutRef().Name + return actual == expectedViewName, fmt.Sprintf("Expected current branch name to be '%s', but got '%s'", expectedViewName, actual) + }) +} + +func (self *Assert) InListContext() { + self.assertWithRetries(func() (bool, string) { + currentContext := self.gui.CurrentContext() + _, ok := currentContext.(types.IListContext) + return ok, fmt.Sprintf("Expected current context to be a list context, but got %s", currentContext.GetKey()) + }) +} + +func (self *Assert) SelectedLineContains(text string) { + self.assertWithRetries(func() (bool, string) { + line := self.gui.CurrentContext().GetView().SelectedLine() + return strings.Contains(line, text), fmt.Sprintf("Expected selected line to contain '%s', but got '%s'", text, line) + }) +} + +func (self *Assert) assertWithRetries(test func() (bool, string)) { + waitTimes := []int{0, 1, 5, 10, 200, 500, 1000} + + var message string + for _, waitTime := range waitTimes { + time.Sleep(time.Duration(waitTime) * time.Millisecond) + + var ok bool + ok, message = test() + if ok { + return + } + } + + self.Fail(message) +} + +// for when you just want to fail the test yourself +func (self *Assert) Fail(message string) { + self.gui.Fail(message) +} diff --git a/pkg/integration/components/input.go b/pkg/integration/components/input.go new file mode 100644 index 000000000..d44b11830 --- /dev/null +++ b/pkg/integration/components/input.go @@ -0,0 +1,166 @@ +package components + +import ( + "fmt" + "strings" + "time" + + "github.com/jesseduffield/lazygit/pkg/config" + "github.com/jesseduffield/lazygit/pkg/gui/types" + integrationTypes "github.com/jesseduffield/lazygit/pkg/integration/types" +) + +type Input struct { + gui integrationTypes.GuiDriver + keys config.KeybindingConfig + assert *Assert + pushKeyDelay int +} + +func NewInput(gui integrationTypes.GuiDriver, keys config.KeybindingConfig, assert *Assert, pushKeyDelay int) *Input { + return &Input{ + gui: gui, + keys: keys, + assert: assert, + pushKeyDelay: pushKeyDelay, + } +} + +// key is something like 'w' or ''. It's best not to pass a direct value, +// but instead to go through the default user config to get a more meaningful key name +func (self *Input) PressKeys(keyStrs ...string) { + for _, keyStr := range keyStrs { + self.pressKey(keyStr) + } +} + +func (self *Input) pressKey(keyStr string) { + self.Wait(self.pushKeyDelay) + + self.gui.PressKey(keyStr) +} + +func (self *Input) SwitchToStatusWindow() { + self.pressKey(self.keys.Universal.JumpToBlock[0]) +} + +func (self *Input) SwitchToFilesWindow() { + self.pressKey(self.keys.Universal.JumpToBlock[1]) +} + +func (self *Input) SwitchToBranchesWindow() { + self.pressKey(self.keys.Universal.JumpToBlock[2]) +} + +func (self *Input) SwitchToCommitsWindow() { + self.pressKey(self.keys.Universal.JumpToBlock[3]) +} + +func (self *Input) SwitchToStashWindow() { + self.pressKey(self.keys.Universal.JumpToBlock[4]) +} + +func (self *Input) Type(content string) { + for _, char := range content { + self.pressKey(string(char)) + } +} + +// i.e. pressing enter +func (self *Input) Confirm() { + self.pressKey(self.keys.Universal.Confirm) +} + +// i.e. pressing escape +func (self *Input) Cancel() { + self.pressKey(self.keys.Universal.Return) +} + +// i.e. pressing space +func (self *Input) Select() { + self.pressKey(self.keys.Universal.Select) +} + +// i.e. pressing down arrow +func (self *Input) NextItem() { + self.pressKey(self.keys.Universal.NextItem) +} + +// i.e. pressing up arrow +func (self *Input) PreviousItem() { + self.pressKey(self.keys.Universal.PrevItem) +} + +func (self *Input) ContinueMerge() { + self.PressKeys(self.keys.Universal.CreateRebaseOptionsMenu) + self.assert.SelectedLineContains("continue") + self.Confirm() +} + +func (self *Input) ContinueRebase() { + self.ContinueMerge() +} + +// for when you want to allow lazygit to process something before continuing +func (self *Input) Wait(milliseconds int) { + time.Sleep(time.Duration(milliseconds) * time.Millisecond) +} + +func (self *Input) LogUI(message string) { + self.gui.LogUI(message) +} + +func (self *Input) Log(message string) { + self.gui.LogUI(message) +} + +// this will look for a list item in the current panel and if it finds it, it will +// enter the keypresses required to navigate to it. +// The test will fail if: +// - the user is not in a list item +// - no list item is found containing the given text +// - multiple list items are found containing the given text in the initial page of items +// +// NOTE: this currently assumes that ViewBufferLines returns all the lines that can be accessed. +// If this changes in future, we'll need to update this code to first attempt to find the item +// in the current page and failing that, jump to the top of the view and iterate through all of it, +// looking for the item. +func (self *Input) NavigateToListItemContainingText(text string) { + self.assert.InListContext() + + currentContext := self.gui.CurrentContext().(types.IListContext) + + view := currentContext.GetView() + + // first we look for a duplicate on the current screen. We won't bother looking beyond that though. + matchCount := 0 + matchIndex := -1 + for i, line := range view.ViewBufferLines() { + if strings.Contains(line, text) { + matchCount++ + matchIndex = i + } + } + if matchCount > 1 { + self.assert.Fail(fmt.Sprintf("Found %d matches for %s, expected only a single match", matchCount, text)) + } + if matchCount == 1 { + selectedLineIdx := view.SelectedLineIdx() + if selectedLineIdx == matchIndex { + return + } + if selectedLineIdx < matchIndex { + for i := selectedLineIdx; i < matchIndex; i++ { + self.NextItem() + } + return + } else { + for i := selectedLineIdx; i > matchIndex; i-- { + self.PreviousItem() + } + return + } + } + + self.assert.Fail(fmt.Sprintf("Could not find item containing text: %s", text)) +} diff --git a/pkg/integration/components/paths.go b/pkg/integration/components/paths.go new file mode 100644 index 000000000..d01b58437 --- /dev/null +++ b/pkg/integration/components/paths.go @@ -0,0 +1,43 @@ +package components + +import "path/filepath" + +// convenience struct for easily getting directories within our test directory. +// We have one test directory for each test, found in test/integration_new. +type Paths struct { + // e.g. test/integration/test_name + root string +} + +func NewPaths(root string) Paths { + return Paths{root: root} +} + +// when a test first runs, it's situated in a repo called 'repo' within this +// directory. In its setup step, the test is allowed to create other repos +// alongside the 'repo' repo in this directory, for example, creating remotes +// or repos to add as submodules. +func (self Paths) Actual() string { + return filepath.Join(self.root, "actual") +} + +// this is the 'repo' directory within the 'actual' directory, +// where a lazygit test will start within. +func (self Paths) ActualRepo() string { + return filepath.Join(self.Actual(), "repo") +} + +// When an integration test first runs, we copy everything in the 'actual' directory, +// and copy it into the 'expected' directory so that future runs can be compared +// against what we expect. +func (self Paths) Expected() string { + return filepath.Join(self.root, "expected") +} + +func (self Paths) Config() string { + return filepath.Join(self.root, "used_config") +} + +func (self Paths) Root() string { + return self.root +} diff --git a/pkg/integration/components/runner.go b/pkg/integration/components/runner.go new file mode 100644 index 000000000..5a5022c53 --- /dev/null +++ b/pkg/integration/components/runner.go @@ -0,0 +1,216 @@ +package components + +import ( + "fmt" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + + "github.com/jesseduffield/lazygit/pkg/commands/oscommands" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +// this is the integration runner for the new and improved integration interface + +const ( + TEST_NAME_ENV_VAR = "TEST_NAME" + SANDBOX_ENV_VAR = "SANDBOX" +) + +type Mode int + +const ( + // Default: if a snapshot test fails, the we'll be asked whether we want to update it + ASK_TO_UPDATE_SNAPSHOT Mode = iota + // fails the test if the snapshots don't match + CHECK_SNAPSHOT + // runs the test and updates the snapshot + UPDATE_SNAPSHOT + // This just makes use of the setup step of the test to get you into + // a lazygit session. Then you'll be able to do whatever you want. Useful + // when you want to test certain things without needing to manually set + // up the situation yourself. + // fails the test if the snapshots don't match + SANDBOX +) + +func RunTests( + tests []*IntegrationTest, + logf func(format string, formatArgs ...interface{}), + runCmd func(cmd *exec.Cmd) error, + testWrapper func(test *IntegrationTest, f func() error), + mode Mode, + keyPressDelay int, +) error { + projectRootDir := utils.GetLazygitRootDirectory() + err := os.Chdir(projectRootDir) + if err != nil { + return err + } + + testDir := filepath.Join(projectRootDir, "test", "integration_new") + + if err := buildLazygit(); err != nil { + return err + } + + for _, test := range tests { + test := test + + paths := NewPaths( + filepath.Join(testDir, test.Name()), + ) + + testWrapper(test, func() error { //nolint: thelper + return runTest(test, paths, projectRootDir, logf, runCmd, mode, keyPressDelay) + }) + } + + return nil +} + +func runTest( + test *IntegrationTest, + paths Paths, + projectRootDir string, + logf func(format string, formatArgs ...interface{}), + runCmd func(cmd *exec.Cmd) error, + mode Mode, + keyPressDelay int, +) error { + if test.Skip() { + logf("Skipping test %s", test.Name()) + return nil + } + + logf("path: %s", paths.Root()) + + if err := prepareTestDir(test, paths); err != nil { + return err + } + + cmd, err := getLazygitCommand(test, paths, projectRootDir, mode, keyPressDelay) + if err != nil { + return err + } + + err = runCmd(cmd) + if err != nil { + return err + } + + return HandleSnapshots(paths, logf, test, mode) +} + +func prepareTestDir( + test *IntegrationTest, + paths Paths, +) error { + findOrCreateDir(paths.Root()) + deleteAndRecreateEmptyDir(paths.Actual()) + + err := os.Mkdir(paths.ActualRepo(), 0o777) + if err != nil { + return err + } + + return createFixture(test, paths) +} + +func buildLazygit() error { + osCommand := oscommands.NewDummyOSCommand() + return osCommand.Cmd.New(fmt.Sprintf( + "go build -o %s pkg/integration/clients/injector/main.go", tempLazygitPath(), + )).Run() +} + +func createFixture(test *IntegrationTest, paths Paths) error { + originalDir, err := os.Getwd() + if err != nil { + return err + } + + if err := os.Chdir(paths.ActualRepo()); err != nil { + panic(err) + } + + shell := NewShell() + shell.RunCommand("git init") + shell.RunCommand(`git config user.email "CI@example.com"`) + shell.RunCommand(`git config user.name "CI"`) + + test.SetupRepo(shell) + + if err := os.Chdir(originalDir); err != nil { + panic(err) + } + + return nil +} + +func getLazygitCommand(test *IntegrationTest, paths Paths, rootDir string, mode Mode, keyPressDelay int) (*exec.Cmd, error) { + osCommand := oscommands.NewDummyOSCommand() + + templateConfigDir := filepath.Join(rootDir, "test", "default_test_config") + + err := os.RemoveAll(paths.Config()) + if err != nil { + return nil, err + } + err = oscommands.CopyDir(templateConfigDir, paths.Config()) + if err != nil { + return nil, err + } + + cmdStr := fmt.Sprintf("%s -debug --use-config-dir=%s --path=%s %s", tempLazygitPath(), paths.Config(), paths.ActualRepo(), test.ExtraCmdArgs()) + + cmdObj := osCommand.Cmd.New(cmdStr) + + cmdObj.AddEnvVars(fmt.Sprintf("%s=%s", TEST_NAME_ENV_VAR, test.Name())) + if mode == SANDBOX { + cmdObj.AddEnvVars(fmt.Sprintf("%s=%s", "SANDBOX", "true")) + } + + if keyPressDelay > 0 { + cmdObj.AddEnvVars(fmt.Sprintf("KEY_PRESS_DELAY=%d", keyPressDelay)) + } + + return cmdObj.GetCmd(), nil +} + +func tempLazygitPath() string { + return filepath.Join("/tmp", "lazygit", "test_lazygit") +} + +func findOrCreateDir(path string) { + _, err := os.Stat(path) + if err != nil { + if os.IsNotExist(err) { + err = os.MkdirAll(path, 0o777) + if err != nil { + panic(err) + } + } else { + panic(err) + } + } +} + +func deleteAndRecreateEmptyDir(path string) { + // remove contents of integration test directory + dir, err := ioutil.ReadDir(path) + if err != nil { + if os.IsNotExist(err) { + err = os.Mkdir(path, 0o777) + if err != nil { + panic(err) + } + } else { + panic(err) + } + } + for _, d := range dir { + os.RemoveAll(filepath.Join(path, d.Name())) + } +} diff --git a/pkg/integration/components/shell.go b/pkg/integration/components/shell.go new file mode 100644 index 000000000..ee57cf401 --- /dev/null +++ b/pkg/integration/components/shell.go @@ -0,0 +1,83 @@ +package components + +import ( + "fmt" + "io/ioutil" + "os" + + "github.com/jesseduffield/lazygit/pkg/secureexec" + "github.com/mgutz/str" +) + +// this is for running shell commands, mostly for the sake of setting up the repo +// but you can also run the commands from within lazygit to emulate things happening +// in the background. +type Shell struct{} + +func NewShell() *Shell { + return &Shell{} +} + +func (s *Shell) RunCommand(cmdStr string) *Shell { + args := str.ToArgv(cmdStr) + cmd := secureexec.Command(args[0], args[1:]...) + cmd.Env = os.Environ() + + output, err := cmd.CombinedOutput() + if err != nil { + panic(fmt.Sprintf("error running command: %s\n%s", cmdStr, string(output))) + } + + return s +} + +func (s *Shell) CreateFile(path string, content string) *Shell { + err := ioutil.WriteFile(path, []byte(content), 0o644) + if err != nil { + panic(fmt.Sprintf("error creating file: %s\n%s", path, err)) + } + + return s +} + +func (s *Shell) NewBranch(name string) *Shell { + return s.RunCommand("git checkout -b " + name) +} + +func (s *Shell) GitAdd(path string) *Shell { + return s.RunCommand(fmt.Sprintf("git add \"%s\"", path)) +} + +func (s *Shell) GitAddAll() *Shell { + return s.RunCommand("git add -A") +} + +func (s *Shell) Commit(message string) *Shell { + return s.RunCommand(fmt.Sprintf("git commit -m \"%s\"", message)) +} + +func (s *Shell) EmptyCommit(message string) *Shell { + return s.RunCommand(fmt.Sprintf("git commit --allow-empty -m \"%s\"", message)) +} + +// convenience method for creating a file and adding it +func (s *Shell) CreateFileAndAdd(fileName string, fileContents string) *Shell { + return s. + CreateFile(fileName, fileContents). + GitAdd(fileName) +} + +// creates commits 01, 02, 03, ..., n with a new file in each +// The reason for padding with zeroes is so that it's easier to do string +// matches on the commit messages when there are many of them +func (s *Shell) CreateNCommits(n int) *Shell { + for i := 1; i <= n; i++ { + s.CreateFileAndAdd( + fmt.Sprintf("file%02d.txt", i), + fmt.Sprintf("file%02d content", i), + ). + Commit(fmt.Sprintf("commit %02d", i)) + } + + return s +} diff --git a/pkg/integration/components/snapshot.go b/pkg/integration/components/snapshot.go new file mode 100644 index 000000000..b7efa0fb0 --- /dev/null +++ b/pkg/integration/components/snapshot.go @@ -0,0 +1,372 @@ +package components + +import ( + "errors" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "strings" + + "github.com/jesseduffield/generics/slices" + "github.com/jesseduffield/lazygit/pkg/commands/oscommands" + "github.com/stretchr/testify/assert" +) + +// This creates and compares integration test snapshots. + +type ( + logf func(format string, formatArgs ...interface{}) +) + +func HandleSnapshots(paths Paths, logf logf, test *IntegrationTest, mode Mode) error { + return NewSnapshotter(paths, logf, test, mode). + handleSnapshots() +} + +type Snapshotter struct { + paths Paths + logf logf + test *IntegrationTest + mode Mode +} + +func NewSnapshotter( + paths Paths, + logf logf, + test *IntegrationTest, + mode Mode, +) *Snapshotter { + return &Snapshotter{ + paths: paths, + logf: logf, + test: test, + mode: mode, + } +} + +func (self *Snapshotter) handleSnapshots() error { + switch self.mode { + case UPDATE_SNAPSHOT: + return self.handleUpdate() + case CHECK_SNAPSHOT: + return self.handleCheck() + case ASK_TO_UPDATE_SNAPSHOT: + return self.handleAskToUpdate() + case SANDBOX: + self.logf("Sandbox session exited") + } + return nil +} + +func (self *Snapshotter) handleUpdate() error { + if err := self.updateSnapshot(); err != nil { + return err + } + self.logf("Test passed: %s", self.test.Name()) + return nil +} + +func (self *Snapshotter) handleCheck() error { + self.logf("Comparing snapshots") + if err := self.compareSnapshots(); err != nil { + return err + } + self.logf("Test passed: %s", self.test.Name()) + return nil +} + +func (self *Snapshotter) handleAskToUpdate() error { + if _, err := os.Stat(self.paths.Expected()); os.IsNotExist(err) { + if err := self.updateSnapshot(); err != nil { + return err + } + self.logf("No existing snapshot found for %s. Created snapshot.", self.test.Name()) + + return nil + } + + self.logf("Comparing snapshots...") + if err := self.compareSnapshots(); err != nil { + self.logf("%s", err) + + // prompt user whether to update the snapshot (Y/N) + if promptUserToUpdateSnapshot() { + if err := self.updateSnapshot(); err != nil { + return err + } + self.logf("Snapshot updated: %s", self.test.Name()) + } else { + return err + } + } + + self.logf("Test passed: %s", self.test.Name()) + return nil +} + +func (self *Snapshotter) updateSnapshot() error { + // create/update snapshot + err := oscommands.CopyDir(self.paths.Actual(), self.paths.Expected()) + if err != nil { + return err + } + + if err := renameSpecialPaths(self.paths.Expected()); err != nil { + return err + } + + return nil +} + +func (self *Snapshotter) compareSnapshots() error { + // there are a couple of reasons we're not generating the snapshot in expectedDir directly: + // Firstly we don't want to have to revert our .git file back to .git_keep. + // Secondly, the act of calling git commands like 'git status' actually changes the index + // for some reason, and we don't want to leave your lazygit working tree dirty as a result. + expectedDirCopy := filepath.Join(os.TempDir(), "expected_dir_test", self.test.Name()) + err := oscommands.CopyDir(self.paths.Expected(), expectedDirCopy) + if err != nil { + return err + } + + defer func() { + err := os.RemoveAll(expectedDirCopy) + if err != nil { + panic(err) + } + }() + + if err := restoreSpecialPaths(expectedDirCopy); err != nil { + return err + } + + err = validateSameRepos(expectedDirCopy, self.paths.Actual()) + if err != nil { + return err + } + + // iterate through each repo in the expected dir and comparet to the corresponding repo in the actual dir + expectedFiles, err := ioutil.ReadDir(expectedDirCopy) + if err != nil { + return err + } + + for _, f := range expectedFiles { + if !f.IsDir() { + return errors.New("unexpected file (as opposed to directory) in integration test 'expected' directory") + } + + // get corresponding file name from actual dir + actualRepoPath := filepath.Join(self.paths.Actual(), f.Name()) + expectedRepoPath := filepath.Join(expectedDirCopy, f.Name()) + + actualRepo, expectedRepo, err := generateSnapshots(actualRepoPath, expectedRepoPath) + if err != nil { + return err + } + + if expectedRepo != actualRepo { + // get the log file and print it + bytes, err := ioutil.ReadFile(filepath.Join(self.paths.Config(), "development.log")) + if err != nil { + return err + } + self.logf("%s", string(bytes)) + + return errors.New(getDiff(f.Name(), actualRepo, expectedRepo)) + } + } + + return nil +} + +func promptUserToUpdateSnapshot() bool { + fmt.Println("Test failed. Update snapshot? (y/n)") + var input string + fmt.Scanln(&input) + return input == "y" +} + +func generateSnapshots(actualDir string, expectedDir string) (string, string, error) { + actual, err := generateSnapshot(actualDir) + if err != nil { + return "", "", err + } + + expected, err := generateSnapshot(expectedDir) + if err != nil { + return "", "", err + } + + return actual, expected, nil +} + +// note that we don't actually store this snapshot in the lazygit repo. +// Instead we store the whole expected git repo of our test, so that +// we can easily change what we want to compare without needing to regenerate +// snapshots for each test. +func generateSnapshot(dir string) (string, error) { + osCommand := oscommands.NewDummyOSCommand() + + _, err := os.Stat(filepath.Join(dir, ".git")) + if err != nil { + return "git directory not found", nil + } + + snapshot := "" + + cmdStrs := []string{ + `remote show -n origin`, // remote branches + // TODO: find a way to bring this back without breaking tests + // `ls-remote origin`, + `status`, // file tree + `log --pretty=%B|%an|%ae -p -1`, // log + `tag -n`, // tags + `stash list`, // stash + `submodule foreach 'git status'`, // submodule status + `submodule foreach 'git log --pretty=%B -p -1'`, // submodule log + `submodule foreach 'git tag -n'`, // submodule tags + `submodule foreach 'git stash list'`, // submodule stash + } + + for _, cmdStr := range cmdStrs { + // ignoring error for now. If there's an error it could be that there are no results + output, _ := osCommand.Cmd.New(fmt.Sprintf("git -C %s %s", dir, cmdStr)).RunWithOutput() + + snapshot += fmt.Sprintf("git %s:\n%s\n", cmdStr, output) + } + + snapshot += "files in repo:\n" + err = filepath.Walk(dir, func(path string, f os.FileInfo, err error) error { + if err != nil { + return err + } + + if f.IsDir() { + if f.Name() == ".git" { + return filepath.SkipDir + } + return nil + } + + bytes, err := ioutil.ReadFile(path) + if err != nil { + return err + } + + relativePath, err := filepath.Rel(dir, path) + if err != nil { + return err + } + snapshot += fmt.Sprintf("path: %s\ncontent:\n%s\n", relativePath, string(bytes)) + + return nil + }) + + if err != nil { + return "", err + } + + return snapshot, nil +} + +func getPathsToRename(dir string, needle string, contains string) []string { + pathsToRename := []string{} + + err := filepath.Walk(dir, func(path string, f os.FileInfo, err error) error { + if err != nil { + return err + } + + if f.Name() == needle && (contains == "" || strings.Contains(path, contains)) { + pathsToRename = append(pathsToRename, path) + } + + return nil + }) + if err != nil { + panic(err) + } + + return pathsToRename +} + +var specialPathMappings = []struct{ original, new, contains string }{ + // git refuses to track .git or .gitmodules in subdirectories so we need to rename them + {".git", ".git_keep", ""}, + {".gitmodules", ".gitmodules_keep", ""}, + // we also need git to ignore the contents of our test gitignore files so that + // we actually commit files that are ignored within the test. + {".gitignore", "lg_ignore_file", ""}, + // this is the .git/info/exclude file. We're being a little more specific here + // so that we don't accidentally mess with some other file named 'exclude' in the test. + {"exclude", "lg_exclude_file", ".git/info/exclude"}, +} + +func renameSpecialPaths(dir string) error { + for _, specialPath := range specialPathMappings { + for _, path := range getPathsToRename(dir, specialPath.original, specialPath.contains) { + err := os.Rename(path, filepath.Join(filepath.Dir(path), specialPath.new)) + if err != nil { + return err + } + } + } + + return nil +} + +func restoreSpecialPaths(dir string) error { + for _, specialPath := range specialPathMappings { + for _, path := range getPathsToRename(dir, specialPath.new, specialPath.contains) { + err := os.Rename(path, filepath.Join(filepath.Dir(path), specialPath.original)) + if err != nil { + return err + } + } + } + + return nil +} + +// validates that the actual and expected dirs have the same repo names (doesn't actually check the contents of the repos) +func validateSameRepos(expectedDir string, actualDir string) error { + // iterate through each repo in the expected dir and compare to the corresponding repo in the actual dir + expectedFiles, err := ioutil.ReadDir(expectedDir) + if err != nil { + return err + } + + var actualFiles []os.FileInfo + actualFiles, err = ioutil.ReadDir(actualDir) + if err != nil { + return err + } + + expectedFileNames := slices.Map(expectedFiles, getFileName) + actualFileNames := slices.Map(actualFiles, getFileName) + if !slices.Equal(expectedFileNames, actualFileNames) { + return fmt.Errorf("expected and actual repo dirs do not match: expected: %s, actual: %s", expectedFileNames, actualFileNames) + } + + return nil +} + +func getFileName(f os.FileInfo) string { + return f.Name() +} + +func getDiff(prefix string, expected string, actual string) string { + mockT := &MockTestingT{} + assert.Equal(mockT, expected, actual, fmt.Sprintf("Unexpected %s. Expected:\n%s\nActual:\n%s\n", prefix, expected, actual)) + return mockT.err +} + +type MockTestingT struct { + err string +} + +func (self *MockTestingT) Errorf(format string, args ...interface{}) { + self.err += fmt.Sprintf(format, args...) +} diff --git a/pkg/integration/components/test.go b/pkg/integration/components/test.go new file mode 100644 index 000000000..a5973c07a --- /dev/null +++ b/pkg/integration/components/test.go @@ -0,0 +1,129 @@ +package components + +import ( + "os" + "strconv" + "strings" + + "github.com/jesseduffield/lazygit/pkg/config" + integrationTypes "github.com/jesseduffield/lazygit/pkg/integration/types" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +// Test describes an integration tests that will be run against the lazygit gui. + +// our unit tests will use this description to avoid a panic caused by attempting +// to get the test's name via it's file's path. +const unitTestDescription = "test test" + +type IntegrationTest struct { + name string + description string + extraCmdArgs string + skip bool + setupRepo func(shell *Shell) + setupConfig func(config *config.AppConfig) + run func( + shell *Shell, + input *Input, + assert *Assert, + keys config.KeybindingConfig, + ) +} + +var _ integrationTypes.IntegrationTest = &IntegrationTest{} + +type NewIntegrationTestArgs struct { + // Briefly describes what happens in the test and what it's testing for + Description string + // prepares a repo for testing + SetupRepo func(shell *Shell) + // takes a config and mutates. The mutated context will end up being passed to the gui + SetupConfig func(config *config.AppConfig) + // runs the test + Run func(shell *Shell, input *Input, assert *Assert, keys config.KeybindingConfig) + // additional args passed to lazygit + ExtraCmdArgs string + // for when a test is flakey + Skip bool +} + +func NewIntegrationTest(args NewIntegrationTestArgs) *IntegrationTest { + name := "" + if args.Description != unitTestDescription { + // this panics if we're in a unit test for our integration tests, + // so we're using "test test" as a sentinel value + name = testNameFromFilePath() + } + + return &IntegrationTest{ + name: name, + description: args.Description, + extraCmdArgs: args.ExtraCmdArgs, + skip: args.Skip, + setupRepo: args.SetupRepo, + setupConfig: args.SetupConfig, + run: args.Run, + } +} + +func (self *IntegrationTest) Name() string { + return self.name +} + +func (self *IntegrationTest) Description() string { + return self.description +} + +func (self *IntegrationTest) ExtraCmdArgs() string { + return self.extraCmdArgs +} + +func (self *IntegrationTest) Skip() bool { + return self.skip +} + +func (self *IntegrationTest) SetupConfig(config *config.AppConfig) { + self.setupConfig(config) +} + +func (self *IntegrationTest) SetupRepo(shell *Shell) { + self.setupRepo(shell) +} + +// I want access to all contexts, the model, the ability to press a key, the ability to log, +func (self *IntegrationTest) Run(gui integrationTypes.GuiDriver) { + shell := NewShell() + assert := NewAssert(gui) + keys := gui.Keys() + input := NewInput(gui, keys, assert, KeyPressDelay()) + + self.run(shell, input, assert, keys) + + if KeyPressDelay() > 0 { + // the dev would want to see the final state if they're running in slow mode + input.Wait(2000) + } +} + +func testNameFromFilePath() string { + path := utils.FilePath(3) + name := strings.Split(path, "integration/tests/")[1] + + return name[:len(name)-len(".go")] +} + +// this is the delay in milliseconds between keypresses +// defaults to zero +func KeyPressDelay() int { + delayStr := os.Getenv("KEY_PRESS_DELAY") + if delayStr == "" { + return 0 + } + + delay, err := strconv.Atoi(delayStr) + if err != nil { + panic(err) + } + return delay +} diff --git a/pkg/integration/components/test_test.go b/pkg/integration/components/test_test.go new file mode 100644 index 000000000..de8dac8e4 --- /dev/null +++ b/pkg/integration/components/test_test.go @@ -0,0 +1,90 @@ +package components + +import ( + "testing" + + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/config" + "github.com/jesseduffield/lazygit/pkg/gui/types" + integrationTypes "github.com/jesseduffield/lazygit/pkg/integration/types" + "github.com/stretchr/testify/assert" +) + +type fakeGuiDriver struct { + failureMessage string + pressedKeys []string +} + +var _ integrationTypes.GuiDriver = &fakeGuiDriver{} + +func (self *fakeGuiDriver) PressKey(key string) { + self.pressedKeys = append(self.pressedKeys, key) +} + +func (self *fakeGuiDriver) Keys() config.KeybindingConfig { + return config.KeybindingConfig{} +} + +func (self *fakeGuiDriver) CurrentContext() types.Context { + return nil +} + +func (self *fakeGuiDriver) Model() *types.Model { + return &types.Model{Commits: []*models.Commit{}} +} + +func (self *fakeGuiDriver) Fail(message string) { + self.failureMessage = message +} + +func (self *fakeGuiDriver) Log(message string) { +} + +func (self *fakeGuiDriver) LogUI(message string) { +} + +func (self *fakeGuiDriver) CheckedOutRef() *models.Branch { + return nil +} + +func TestAssertionFailure(t *testing.T) { + test := NewIntegrationTest(NewIntegrationTestArgs{ + Description: unitTestDescription, + Run: func(shell *Shell, input *Input, assert *Assert, keys config.KeybindingConfig) { + input.PressKeys("a") + input.PressKeys("b") + assert.CommitCount(2) + }, + }) + driver := &fakeGuiDriver{} + test.Run(driver) + assert.EqualValues(t, []string{"a", "b"}, driver.pressedKeys) + assert.Equal(t, "Expected 2 commits present, but got 0", driver.failureMessage) +} + +func TestManualFailure(t *testing.T) { + test := NewIntegrationTest(NewIntegrationTestArgs{ + Description: unitTestDescription, + Run: func(shell *Shell, input *Input, assert *Assert, keys config.KeybindingConfig) { + assert.Fail("blah") + }, + }) + driver := &fakeGuiDriver{} + test.Run(driver) + assert.Equal(t, "blah", driver.failureMessage) +} + +func TestSuccess(t *testing.T) { + test := NewIntegrationTest(NewIntegrationTestArgs{ + Description: unitTestDescription, + Run: func(shell *Shell, input *Input, assert *Assert, keys config.KeybindingConfig) { + input.PressKeys("a") + input.PressKeys("b") + assert.CommitCount(0) + }, + }) + driver := &fakeGuiDriver{} + test.Run(driver) + assert.EqualValues(t, []string{"a", "b"}, driver.pressedKeys) + assert.Equal(t, "", driver.failureMessage) +} diff --git a/pkg/integration/deprecated/cmd/runner/main.go b/pkg/integration/deprecated/cmd/runner/main.go new file mode 100644 index 000000000..86f3c1f14 --- /dev/null +++ b/pkg/integration/deprecated/cmd/runner/main.go @@ -0,0 +1,65 @@ +package main + +import ( + "fmt" + "log" + "os" + "os/exec" + "testing" + + "github.com/jesseduffield/lazygit/pkg/integration/deprecated" + "github.com/stretchr/testify/assert" +) + +// Deprecated: This file is part of the old way of doing things. + +// see https://github.com/jesseduffield/lazygit/blob/master/pkg/integration/README.md +// This file can be invoked directly, but you might find it easier to go through +// test/lazyintegration/main.go, which provides a convenient gui wrapper to integration tests. +// +// If invoked directly, you can specify a test by passing it as the first argument. +// You can also specify that you want to record a test by passing MODE=record +// as an env var. + +func main() { + mode := deprecated.GetModeFromEnv() + speedEnv := os.Getenv("SPEED") + includeSkipped := os.Getenv("INCLUDE_SKIPPED") == "true" + selectedTestName := os.Args[1] + + err := deprecated.RunTests( + log.Printf, + runCmdInTerminal, + func(test *deprecated.IntegrationTest, f func(*testing.T) error) { + if selectedTestName != "" && test.Name != selectedTestName { + return + } + if err := f(nil); err != nil { + log.Print(err.Error()) + } + }, + mode, + speedEnv, + func(_t *testing.T, expected string, actual string, prefix string) { //nolint:thelper + assert.Equal(MockTestingT{}, expected, actual, fmt.Sprintf("Unexpected %s. Expected:\n%s\nActual:\n%s\n", prefix, expected, actual)) + }, + includeSkipped, + ) + if err != nil { + log.Print(err.Error()) + } +} + +type MockTestingT struct{} + +func (t MockTestingT) Errorf(format string, args ...interface{}) { + fmt.Printf(format, args...) +} + +func runCmdInTerminal(cmd *exec.Cmd) error { + cmd.Stdout = os.Stdout + cmd.Stdin = os.Stdin + cmd.Stderr = os.Stderr + + return cmd.Run() +} diff --git a/pkg/integration/deprecated/cmd/tui/main.go b/pkg/integration/deprecated/cmd/tui/main.go new file mode 100644 index 000000000..136ed29fe --- /dev/null +++ b/pkg/integration/deprecated/cmd/tui/main.go @@ -0,0 +1,421 @@ +package main + +import ( + "fmt" + "log" + "os" + "os/exec" + "path/filepath" + + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/gui" + "github.com/jesseduffield/lazygit/pkg/gui/style" + "github.com/jesseduffield/lazygit/pkg/integration/deprecated" + "github.com/jesseduffield/lazygit/pkg/secureexec" +) + +// Deprecated. See lazy_integration for the new approach. + +// this program lets you manage integration tests in a TUI. See https://github.com/jesseduffield/lazygit/blob/master/pkg/integration/README.md for more info. + +type App struct { + tests []*deprecated.IntegrationTest + itemIdx int + testDir string + editing bool + g *gocui.Gui +} + +func (app *App) getCurrentTest() *deprecated.IntegrationTest { + if len(app.tests) > 0 { + return app.tests[app.itemIdx] + } + return nil +} + +func (app *App) refreshTests() { + app.loadTests() + app.g.Update(func(*gocui.Gui) error { + listView, err := app.g.View("list") + if err != nil { + return err + } + + listView.Clear() + for _, test := range app.tests { + fmt.Fprintln(listView, test.Name) + } + + return nil + }) +} + +func (app *App) loadTests() { + tests, err := deprecated.LoadTests(app.testDir) + if err != nil { + log.Panicln(err) + } + + app.tests = tests + if app.itemIdx > len(app.tests)-1 { + app.itemIdx = len(app.tests) - 1 + } +} + +func main() { + rootDir := deprecated.GetRootDirectory() + testDir := filepath.Join(rootDir, "test", "integration") + + app := &App{testDir: testDir} + app.loadTests() + + g, err := gocui.NewGui(gocui.OutputTrue, false, gocui.NORMAL, false, gui.RuneReplacements) + if err != nil { + log.Panicln(err) + } + + g.Cursor = false + + app.g = g + + g.SetManagerFunc(app.layout) + + if err := g.SetKeybinding("list", gocui.KeyArrowUp, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { + if app.itemIdx > 0 { + app.itemIdx-- + } + listView, err := g.View("list") + if err != nil { + return err + } + listView.FocusPoint(0, app.itemIdx) + return nil + }); err != nil { + log.Panicln(err) + } + + if err := g.SetKeybinding("list", gocui.KeyCtrlC, gocui.ModNone, quit); err != nil { + log.Panicln(err) + } + + if err := g.SetKeybinding("list", 'q', gocui.ModNone, quit); err != nil { + log.Panicln(err) + } + + if err := g.SetKeybinding("list", 'r', gocui.ModNone, func(*gocui.Gui, *gocui.View) error { + currentTest := app.getCurrentTest() + if currentTest == nil { + return nil + } + + cmd := secureexec.Command("sh", "-c", fmt.Sprintf("INCLUDE_SKIPPED=true MODE=record go run pkg/integration/deprecated/cmd/runner/main.go %s", currentTest.Name)) + app.runSubprocess(cmd) + + return nil + }); err != nil { + log.Panicln(err) + } + + if err := g.SetKeybinding("list", 's', gocui.ModNone, func(*gocui.Gui, *gocui.View) error { + currentTest := app.getCurrentTest() + if currentTest == nil { + return nil + } + + cmd := secureexec.Command("sh", "-c", fmt.Sprintf("INCLUDE_SKIPPED=true MODE=sandbox go run pkg/integration/deprecated/cmd/runner/main.go %s", currentTest.Name)) + app.runSubprocess(cmd) + + return nil + }); err != nil { + log.Panicln(err) + } + + if err := g.SetKeybinding("list", gocui.KeyEnter, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { + currentTest := app.getCurrentTest() + if currentTest == nil { + return nil + } + + cmd := secureexec.Command("sh", "-c", fmt.Sprintf("INCLUDE_SKIPPED=true go run pkg/integration/deprecated/cmd/runner/main.go %s", currentTest.Name)) + app.runSubprocess(cmd) + + return nil + }); err != nil { + log.Panicln(err) + } + + if err := g.SetKeybinding("list", 'u', gocui.ModNone, func(*gocui.Gui, *gocui.View) error { + currentTest := app.getCurrentTest() + if currentTest == nil { + return nil + } + + cmd := secureexec.Command("sh", "-c", fmt.Sprintf("INCLUDE_SKIPPED=true MODE=updateSnapshot go run pkg/integration/deprecated/cmd/runner/main.go %s", currentTest.Name)) + app.runSubprocess(cmd) + + return nil + }); err != nil { + log.Panicln(err) + } + + if err := g.SetKeybinding("list", 't', gocui.ModNone, func(*gocui.Gui, *gocui.View) error { + currentTest := app.getCurrentTest() + if currentTest == nil { + return nil + } + + cmd := secureexec.Command("sh", "-c", fmt.Sprintf("INCLUDE_SKIPPED=true SPEED=1 go run pkg/integration/deprecated/cmd/runner/main.go %s", currentTest.Name)) + app.runSubprocess(cmd) + + return nil + }); err != nil { + log.Panicln(err) + } + + if err := g.SetKeybinding("list", 'o', gocui.ModNone, func(*gocui.Gui, *gocui.View) error { + currentTest := app.getCurrentTest() + if currentTest == nil { + return nil + } + + cmd := secureexec.Command("sh", "-c", fmt.Sprintf("code -r %s/%s/test.json", app.testDir, currentTest.Name)) + if err := cmd.Run(); err != nil { + return err + } + + return nil + }); err != nil { + log.Panicln(err) + } + + if err := g.SetKeybinding("list", 'n', gocui.ModNone, func(*gocui.Gui, *gocui.View) error { + currentTest := app.getCurrentTest() + if currentTest == nil { + return nil + } + + // need to duplicate that folder and then re-fetch our tests. + dir := app.testDir + "/" + app.getCurrentTest().Name + newDir := dir + "_Copy" + + cmd := secureexec.Command("sh", "-c", fmt.Sprintf("cp -r %s %s", dir, newDir)) + if err := cmd.Run(); err != nil { + return err + } + + app.loadTests() + + app.refreshTests() + return nil + }); err != nil { + log.Panicln(err) + } + + if err := g.SetKeybinding("list", 'm', gocui.ModNone, func(*gocui.Gui, *gocui.View) error { + currentTest := app.getCurrentTest() + if currentTest == nil { + return nil + } + + app.editing = true + if _, err := g.SetCurrentView("editor"); err != nil { + return err + } + editorView, err := g.View("editor") + if err != nil { + return err + } + editorView.Clear() + fmt.Fprint(editorView, currentTest.Name) + + return nil + }); err != nil { + log.Panicln(err) + } + + if err := g.SetKeybinding("list", 'd', gocui.ModNone, func(*gocui.Gui, *gocui.View) error { + currentTest := app.getCurrentTest() + if currentTest == nil { + return nil + } + + dir := app.testDir + "/" + app.getCurrentTest().Name + + cmd := secureexec.Command("sh", "-c", fmt.Sprintf("rm -rf %s", dir)) + if err := cmd.Run(); err != nil { + return err + } + + app.refreshTests() + + return nil + }); err != nil { + log.Panicln(err) + } + + if err := g.SetKeybinding("editor", gocui.KeyEnter, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { + currentTest := app.getCurrentTest() + if currentTest == nil { + return nil + } + + app.editing = false + if _, err := g.SetCurrentView("list"); err != nil { + return err + } + + editorView, err := g.View("editor") + if err != nil { + return err + } + + dir := app.testDir + "/" + app.getCurrentTest().Name + newDir := app.testDir + "/" + editorView.Buffer() + + cmd := secureexec.Command("sh", "-c", fmt.Sprintf("mv %s %s", dir, newDir)) + if err := cmd.Run(); err != nil { + return err + } + + editorView.Clear() + + app.refreshTests() + return nil + }); err != nil { + log.Panicln(err) + } + + if err := g.SetKeybinding("editor", gocui.KeyEsc, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { + app.editing = false + if _, err := g.SetCurrentView("list"); err != nil { + return err + } + + return nil + }); err != nil { + log.Panicln(err) + } + + err = g.MainLoop() + g.Close() + switch err { + case gocui.ErrQuit: + return + default: + log.Panicln(err) + } +} + +func (app *App) runSubprocess(cmd *exec.Cmd) { + if err := gocui.Screen.Suspend(); err != nil { + panic(err) + } + + cmd.Stdin = os.Stdin + cmd.Stderr = os.Stderr + cmd.Stdout = os.Stdout + if err := cmd.Run(); err != nil { + log.Println(err.Error()) + } + cmd.Stdin = nil + cmd.Stderr = nil + cmd.Stdout = nil + + fmt.Fprintf(os.Stdout, "\n%s", style.FgGreen.Sprint("press enter to return")) + fmt.Scanln() // wait for enter press + + if err := gocui.Screen.Resume(); err != nil { + panic(err) + } +} + +func (app *App) layout(g *gocui.Gui) error { + maxX, maxY := g.Size() + descriptionViewHeight := 7 + keybindingsViewHeight := 3 + editorViewHeight := 3 + if !app.editing { + editorViewHeight = 0 + } else { + descriptionViewHeight = 0 + keybindingsViewHeight = 0 + } + g.Cursor = app.editing + g.FgColor = gocui.ColorGreen + listView, err := g.SetView("list", 0, 0, maxX-1, maxY-descriptionViewHeight-keybindingsViewHeight-editorViewHeight-1, 0) + if err != nil { + if err.Error() != "unknown view" { + return err + } + listView.Highlight = true + listView.Clear() + for _, test := range app.tests { + fmt.Fprintln(listView, test.Name) + } + listView.Title = "Tests" + listView.FgColor = gocui.ColorDefault + if _, err := g.SetCurrentView("list"); err != nil { + return err + } + } + + descriptionView, err := g.SetViewBeneath("description", "list", descriptionViewHeight) + if err != nil { + if err.Error() != "unknown view" { + return err + } + descriptionView.Title = "Test description" + descriptionView.Wrap = true + descriptionView.FgColor = gocui.ColorDefault + } + + keybindingsView, err := g.SetViewBeneath("keybindings", "description", keybindingsViewHeight) + if err != nil { + if err.Error() != "unknown view" { + return err + } + keybindingsView.Title = "Keybindings" + keybindingsView.Wrap = true + keybindingsView.FgColor = gocui.ColorDefault + fmt.Fprintln(keybindingsView, "up/down: navigate, enter: run test, u: run test and update snapshots, r: record test, s: sandbox, o: open test config, n: duplicate test, m: rename test, d: delete test, t: run test at original speed") + } + + editorView, err := g.SetViewBeneath("editor", "keybindings", editorViewHeight) + if err != nil { + if err.Error() != "unknown view" { + return err + } + editorView.Title = "Enter Name" + editorView.FgColor = gocui.ColorDefault + editorView.Editable = true + } + + currentTest := app.getCurrentTest() + if currentTest == nil { + return nil + } + + descriptionView.Clear() + fmt.Fprintf(descriptionView, "Speed: %f. %s", currentTest.Speed, currentTest.Description) + + if err := g.SetKeybinding("list", gocui.KeyArrowDown, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { + if app.itemIdx < len(app.tests)-1 { + app.itemIdx++ + } + + listView, err := g.View("list") + if err != nil { + return err + } + listView.FocusPoint(0, app.itemIdx) + return nil + }); err != nil { + log.Panicln(err) + } + + return nil +} + +func quit(g *gocui.Gui, v *gocui.View) error { + return gocui.ErrQuit +} diff --git a/pkg/integration/deprecated/go_test.go b/pkg/integration/deprecated/go_test.go new file mode 100644 index 000000000..fbec34bd9 --- /dev/null +++ b/pkg/integration/deprecated/go_test.go @@ -0,0 +1,106 @@ +//go:build !windows +// +build !windows + +package deprecated + +import ( + "fmt" + "io" + "io/ioutil" + "os" + "os/exec" + "strconv" + "testing" + + "github.com/creack/pty" + "github.com/stretchr/testify/assert" +) + +// Deprecated. + +// This file is quite similar to integration/main.go. The main difference is that this file is +// run via `go test` whereas the other is run via `test/lazyintegration/main.go` which provides +// a convenient gui wrapper around our integration tests. The `go test` approach is better +// for CI and for running locally in the background to ensure you haven't broken +// anything while making changes. If you want to visually see what's happening when a test is run, +// you'll need to take the other approach +// +// As for this file, to run an integration test, e.g. for test 'commit', go: +// go test pkg/gui/old_gui_test.go -run /commit +// +// To update a snapshot for an integration test, pass UPDATE_SNAPSHOTS=true +// UPDATE_SNAPSHOTS=true go test pkg/gui/old_gui_test.go -run /commit +// +// integration tests are run in test/integration//actual and the final test does +// not clean up that directory so you can cd into it to see for yourself what +// happened when a test fails. +// +// To override speed, pass e.g. `SPEED=1` as an env var. Otherwise we start each test +// at a high speed and then drop down to lower speeds upon each failure until finally +// trying at the original playback speed (speed 1). A speed of 2 represents twice the +// original playback speed. Speed may be a decimal. + +func Test(t *testing.T) { + if testing.Short() { + t.Skip("Skipping integration tests in short mode") + } + + mode := GetModeFromEnv() + speedEnv := os.Getenv("SPEED") + includeSkipped := os.Getenv("INCLUDE_SKIPPED") != "" + + parallelTotal := tryConvert(os.Getenv("PARALLEL_TOTAL"), 1) + parallelIndex := tryConvert(os.Getenv("PARALLEL_INDEX"), 0) + testNumber := 0 + + err := RunTests( + t.Logf, + runCmdHeadless, + func(test *IntegrationTest, f func(*testing.T) error) { + defer func() { testNumber += 1 }() + if testNumber%parallelTotal != parallelIndex { + return + } + + t.Run(test.Name, func(t *testing.T) { + err := f(t) + assert.NoError(t, err) + }) + }, + mode, + speedEnv, + func(t *testing.T, expected string, actual string, prefix string) { + t.Helper() + assert.Equal(t, expected, actual, fmt.Sprintf("Unexpected %s. Expected:\n%s\nActual:\n%s\n", prefix, expected, actual)) + }, + includeSkipped, + ) + + assert.NoError(t, err) +} + +func tryConvert(numStr string, defaultVal int) int { + num, err := strconv.Atoi(numStr) + if err != nil { + return defaultVal + } + + return num +} + +func runCmdHeadless(cmd *exec.Cmd) error { + cmd.Env = append( + cmd.Env, + "HEADLESS=true", + "TERM=xterm", + ) + + f, err := pty.StartWithSize(cmd, &pty.Winsize{Rows: 100, Cols: 100}) + if err != nil { + return err + } + + _, _ = io.Copy(ioutil.Discard, f) + + return f.Close() +} diff --git a/pkg/integration/deprecated/integration.go b/pkg/integration/deprecated/integration.go new file mode 100644 index 000000000..b44fdb1b2 --- /dev/null +++ b/pkg/integration/deprecated/integration.go @@ -0,0 +1,564 @@ +package deprecated + +import ( + "encoding/json" + "errors" + "fmt" + "io/ioutil" + "log" + "os" + "os/exec" + "path/filepath" + "strconv" + "strings" + "testing" + + "github.com/jesseduffield/generics/slices" + "github.com/jesseduffield/lazygit/pkg/commands/oscommands" + "github.com/jesseduffield/lazygit/pkg/secureexec" +) + +// Deprecated: This file is part of the old way of doing things. See pkg/integration/integration.go for the new way + +// This package is for running our integration test suite. See https://github.com/jesseduffield/lazygit/blob/master/pkg/integration/README.md for more info. + +type IntegrationTest struct { + Name string `json:"name"` + Speed float64 `json:"speed"` + Description string `json:"description"` + ExtraCmdArgs string `json:"extraCmdArgs"` + Skip bool `json:"skip"` +} + +type Mode int + +const ( + // default: for when we're just running a test and comparing to the snapshot + TEST = iota + // for when we want to record a test and set the snapshot based on the result + RECORD + // when we just want to use the setup of the test for our own sandboxing purposes. + // This does not record the session and does not create/update snapshots + SANDBOX + // running a test but updating the snapshot + UPDATE_SNAPSHOT +) + +func GetModeFromEnv() Mode { + switch os.Getenv("MODE") { + case "record": + return RECORD + case "", "test": + return TEST + case "updateSnapshot": + return UPDATE_SNAPSHOT + case "sandbox": + return SANDBOX + default: + log.Fatalf("unknown test mode: %s, must be one of [test, record, updateSnapshot, sandbox]", os.Getenv("MODE")) + panic("unreachable") + } +} + +// this function is used by both `go test` and from our lazyintegration gui, but +// errors need to be handled differently in each (for example go test is always +// working with *testing.T) so we pass in any differences as args here. +func RunTests( + logf func(format string, formatArgs ...interface{}), + runCmd func(cmd *exec.Cmd) error, + fnWrapper func(test *IntegrationTest, f func(*testing.T) error), + mode Mode, + speedEnv string, + onFail func(t *testing.T, expected string, actual string, prefix string), + includeSkipped bool, +) error { + rootDir := GetRootDirectory() + err := os.Chdir(rootDir) + if err != nil { + return err + } + + testDir := filepath.Join(rootDir, "test", "integration") + + osCommand := oscommands.NewDummyOSCommand() + err = osCommand.Cmd.New("go build -o " + tempLazygitPath()).Run() + if err != nil { + return err + } + + tests, err := LoadTests(testDir) + if err != nil { + return err + } + + for _, test := range tests { + test := test + + fnWrapper(test, func(t *testing.T) error { //nolint: thelper + if test.Skip && !includeSkipped { + logf("skipping test: %s", test.Name) + return nil + } + + speeds := getTestSpeeds(test.Speed, mode, speedEnv) + testPath := filepath.Join(testDir, test.Name) + actualDir := filepath.Join(testPath, "actual") + expectedDir := filepath.Join(testPath, "expected") + actualRepoDir := filepath.Join(actualDir, "repo") + logf("path: %s", testPath) + + for i, speed := range speeds { + if mode != SANDBOX && mode != RECORD { + logf("%s: attempting test at speed %f\n", test.Name, speed) + } + + findOrCreateDir(testPath) + prepareIntegrationTestDir(actualDir) + findOrCreateDir(actualRepoDir) + err := createFixture(testPath, actualRepoDir) + if err != nil { + return err + } + + configDir := filepath.Join(testPath, "used_config") + + cmd, err := getLazygitCommand(testPath, rootDir, mode, speed, test.ExtraCmdArgs) + if err != nil { + return err + } + + err = runCmd(cmd) + if err != nil { + return err + } + + if mode == UPDATE_SNAPSHOT || mode == RECORD { + // create/update snapshot + err = oscommands.CopyDir(actualDir, expectedDir) + if err != nil { + return err + } + + if err := renameSpecialPaths(expectedDir); err != nil { + return err + } + + logf("%s", "updated snapshot") + } else { + if err := validateSameRepos(expectedDir, actualDir); err != nil { + return err + } + + // iterate through each repo in the expected dir and comparet to the corresponding repo in the actual dir + expectedFiles, err := ioutil.ReadDir(expectedDir) + if err != nil { + return err + } + + success := true + for _, f := range expectedFiles { + if !f.IsDir() { + return errors.New("unexpected file (as opposed to directory) in integration test 'expected' directory") + } + + // get corresponding file name from actual dir + actualRepoPath := filepath.Join(actualDir, f.Name()) + expectedRepoPath := filepath.Join(expectedDir, f.Name()) + + actualRepo, expectedRepo, err := generateSnapshots(actualRepoPath, expectedRepoPath) + if err != nil { + return err + } + + if expectedRepo != actualRepo { + success = false + // if the snapshot doesn't match and we haven't tried all playback speeds different we'll retry at a slower speed + if i < len(speeds)-1 { + break + } + + // get the log file and print it + bytes, err := ioutil.ReadFile(filepath.Join(configDir, "development.log")) + if err != nil { + return err + } + logf("%s", string(bytes)) + + onFail(t, expectedRepo, actualRepo, f.Name()) + } + } + + if success { + logf("%s: success at speed %f\n", test.Name, speed) + break + } + } + } + + return nil + }) + } + + return nil +} + +// validates that the actual and expected dirs have the same repo names (doesn't actually check the contents of the repos) +func validateSameRepos(expectedDir string, actualDir string) error { + // iterate through each repo in the expected dir and compare to the corresponding repo in the actual dir + expectedFiles, err := ioutil.ReadDir(expectedDir) + if err != nil { + return err + } + + var actualFiles []os.FileInfo + actualFiles, err = ioutil.ReadDir(actualDir) + if err != nil { + return err + } + + expectedFileNames := slices.Map(expectedFiles, getFileName) + actualFileNames := slices.Map(actualFiles, getFileName) + if !slices.Equal(expectedFileNames, actualFileNames) { + return fmt.Errorf("expected and actual repo dirs do not match: expected: %s, actual: %s", expectedFileNames, actualFileNames) + } + + return nil +} + +func getFileName(f os.FileInfo) string { + return f.Name() +} + +func prepareIntegrationTestDir(actualDir string) { + // remove contents of integration test directory + dir, err := ioutil.ReadDir(actualDir) + if err != nil { + if os.IsNotExist(err) { + err = os.Mkdir(actualDir, 0o777) + if err != nil { + panic(err) + } + } else { + panic(err) + } + } + for _, d := range dir { + os.RemoveAll(filepath.Join(actualDir, d.Name())) + } +} + +func GetRootDirectory() string { + path, err := os.Getwd() + if err != nil { + panic(err) + } + + for { + _, err := os.Stat(filepath.Join(path, ".git")) + + if err == nil { + return path + } + + if !os.IsNotExist(err) { + panic(err) + } + + path = filepath.Dir(path) + + if path == "/" { + log.Fatal("must run in lazygit folder or child folder") + } + } +} + +func createFixture(testPath, actualDir string) error { + bashScriptPath := filepath.Join(testPath, "setup.sh") + cmd := secureexec.Command("bash", bashScriptPath, actualDir) + + if output, err := cmd.CombinedOutput(); err != nil { + return errors.New(string(output)) + } + + return nil +} + +func tempLazygitPath() string { + return filepath.Join("/tmp", "lazygit", "test_lazygit") +} + +func getTestSpeeds(testStartSpeed float64, mode Mode, speedStr string) []float64 { + if mode != TEST { + // have to go at original speed if updating snapshots in case we go to fast and create a junk snapshot + return []float64{1.0} + } + + if speedStr != "" { + speed, err := strconv.ParseFloat(speedStr, 64) + if err != nil { + panic(err) + } + return []float64{speed} + } + + // default is 10, 5, 1 + startSpeed := 10.0 + if testStartSpeed != 0 { + startSpeed = testStartSpeed + } + speeds := []float64{startSpeed} + if startSpeed > 5 { + speeds = append(speeds, 5) + } + speeds = append(speeds, 1, 1) + + return speeds +} + +func LoadTests(testDir string) ([]*IntegrationTest, error) { + paths, err := filepath.Glob(filepath.Join(testDir, "/*/test.json")) + if err != nil { + return nil, err + } + + tests := make([]*IntegrationTest, len(paths)) + + for i, path := range paths { + data, err := ioutil.ReadFile(path) + if err != nil { + return nil, err + } + + test := &IntegrationTest{} + + err = json.Unmarshal(data, test) + if err != nil { + return nil, err + } + + test.Name = strings.TrimPrefix(filepath.Dir(path), testDir+"/") + + tests[i] = test + } + + return tests, nil +} + +func findOrCreateDir(path string) { + _, err := os.Stat(path) + if err != nil { + if os.IsNotExist(err) { + err = os.MkdirAll(path, 0o777) + if err != nil { + panic(err) + } + } else { + panic(err) + } + } +} + +// note that we don't actually store this snapshot in the lazygit repo. +// Instead we store the whole expected git repo of our test, so that +// we can easily change what we want to compare without needing to regenerate +// snapshots for each test. +func generateSnapshot(dir string) (string, error) { + osCommand := oscommands.NewDummyOSCommand() + + _, err := os.Stat(filepath.Join(dir, ".git")) + if err != nil { + return "git directory not found", nil + } + + snapshot := "" + + cmdStrs := []string{ + `remote show -n origin`, // remote branches + // TODO: find a way to bring this back without breaking tests + // `ls-remote origin`, + `status`, // file tree + `log --pretty=%B|%an|%ae -p -1`, // log + `tag -n`, // tags + `stash list`, // stash + `submodule foreach 'git status'`, // submodule status + `submodule foreach 'git log --pretty=%B -p -1'`, // submodule log + `submodule foreach 'git tag -n'`, // submodule tags + `submodule foreach 'git stash list'`, // submodule stash + } + + for _, cmdStr := range cmdStrs { + // ignoring error for now. If there's an error it could be that there are no results + output, _ := osCommand.Cmd.New(fmt.Sprintf("git -C %s %s", dir, cmdStr)).RunWithOutput() + + snapshot += fmt.Sprintf("git %s:\n%s\n", cmdStr, output) + } + + snapshot += "files in repo:\n" + err = filepath.Walk(dir, func(path string, f os.FileInfo, err error) error { + if err != nil { + return err + } + + if f.IsDir() { + if f.Name() == ".git" { + return filepath.SkipDir + } + return nil + } + + bytes, err := ioutil.ReadFile(path) + if err != nil { + return err + } + + relativePath, err := filepath.Rel(dir, path) + if err != nil { + return err + } + snapshot += fmt.Sprintf("path: %s\ncontent:\n%s\n", relativePath, string(bytes)) + + return nil + }) + + if err != nil { + return "", err + } + + return snapshot, nil +} + +func generateSnapshots(actualDir string, expectedDir string) (string, string, error) { + actual, err := generateSnapshot(actualDir) + if err != nil { + return "", "", err + } + + // there are a couple of reasons we're not generating the snapshot in expectedDir directly: + // Firstly we don't want to have to revert our .git file back to .git_keep. + // Secondly, the act of calling git commands like 'git status' actually changes the index + // for some reason, and we don't want to leave your lazygit working tree dirty as a result. + expectedDirCopyDir := filepath.Join(filepath.Dir(expectedDir), "expected_dir_test") + err = oscommands.CopyDir(expectedDir, expectedDirCopyDir) + if err != nil { + return "", "", err + } + + defer func() { + err := os.RemoveAll(expectedDirCopyDir) + if err != nil { + panic(err) + } + }() + + if err := restoreSpecialPaths(expectedDirCopyDir); err != nil { + return "", "", err + } + + expected, err := generateSnapshot(expectedDirCopyDir) + if err != nil { + return "", "", err + } + + return actual, expected, nil +} + +func getPathsToRename(dir string, needle string, contains string) []string { + pathsToRename := []string{} + + err := filepath.Walk(dir, func(path string, f os.FileInfo, err error) error { + if err != nil { + return err + } + + if f.Name() == needle && (contains == "" || strings.Contains(path, contains)) { + pathsToRename = append(pathsToRename, path) + } + + return nil + }) + if err != nil { + panic(err) + } + + return pathsToRename +} + +var specialPathMappings = []struct{ original, new, contains string }{ + // git refuses to track .git or .gitmodules in subdirectories so we need to rename them + {".git", ".git_keep", ""}, + {".gitmodules", ".gitmodules_keep", ""}, + // we also need git to ignore the contents of our test gitignore files so that + // we actually commit files that are ignored within the test. + {".gitignore", "lg_ignore_file", ""}, + // this is the .git/info/exclude file. We're being a little more specific here + // so that we don't accidentally mess with some other file named 'exclude' in the test. + {"exclude", "lg_exclude_file", ".git/info/exclude"}, +} + +func renameSpecialPaths(dir string) error { + for _, specialPath := range specialPathMappings { + for _, path := range getPathsToRename(dir, specialPath.original, specialPath.contains) { + err := os.Rename(path, filepath.Join(filepath.Dir(path), specialPath.new)) + if err != nil { + return err + } + } + } + + return nil +} + +func restoreSpecialPaths(dir string) error { + for _, specialPath := range specialPathMappings { + for _, path := range getPathsToRename(dir, specialPath.new, specialPath.contains) { + err := os.Rename(path, filepath.Join(filepath.Dir(path), specialPath.original)) + if err != nil { + return err + } + } + } + + return nil +} + +func getLazygitCommand(testPath string, rootDir string, mode Mode, speed float64, extraCmdArgs string) (*exec.Cmd, error) { + osCommand := oscommands.NewDummyOSCommand() + + replayPath := filepath.Join(testPath, "recording.json") + templateConfigDir := filepath.Join(rootDir, "test", "default_test_config") + actualRepoDir := filepath.Join(testPath, "actual", "repo") + + exists, err := osCommand.FileExists(filepath.Join(testPath, "config")) + if err != nil { + return nil, err + } + + if exists { + templateConfigDir = filepath.Join(testPath, "config") + } + + configDir := filepath.Join(testPath, "used_config") + + err = os.RemoveAll(configDir) + if err != nil { + return nil, err + } + err = oscommands.CopyDir(templateConfigDir, configDir) + if err != nil { + return nil, err + } + + cmdStr := fmt.Sprintf("%s -debug --use-config-dir=%s --path=%s %s", tempLazygitPath(), configDir, actualRepoDir, extraCmdArgs) + + cmdObj := osCommand.Cmd.New(cmdStr) + cmdObj.AddEnvVars(fmt.Sprintf("SPEED=%f", speed)) + + switch mode { + case RECORD: + cmdObj.AddEnvVars(fmt.Sprintf("RECORD_EVENTS_TO=%s", replayPath)) + case TEST, UPDATE_SNAPSHOT: + cmdObj.AddEnvVars(fmt.Sprintf("REPLAY_EVENTS_FROM=%s", replayPath)) + } + + return cmdObj.GetCmd(), nil +} diff --git a/pkg/integration/integration.go b/pkg/integration/integration.go deleted file mode 100644 index a55d460fe..000000000 --- a/pkg/integration/integration.go +++ /dev/null @@ -1,554 +0,0 @@ -package integration - -import ( - "encoding/json" - "errors" - "fmt" - "io/ioutil" - "log" - "os" - "os/exec" - "path/filepath" - "strconv" - "strings" - "testing" - - "github.com/jesseduffield/lazygit/pkg/commands/oscommands" - "github.com/jesseduffield/lazygit/pkg/secureexec" -) - -type Test struct { - Name string `json:"name"` - Speed float64 `json:"speed"` - Description string `json:"description"` - ExtraCmdArgs string `json:"extraCmdArgs"` - Skip bool `json:"skip"` -} - -type Mode int - -const ( - // default: for when we're just running a test and comparing to the snapshot - TEST = iota - // for when we want to record a test and set the snapshot based on the result - RECORD - // when we just want to use the setup of the test for our own sandboxing purposes. - // This does not record the session and does not create/update snapshots - SANDBOX - // running a test but updating the snapshot - UPDATE_SNAPSHOT -) - -func GetModeFromEnv() Mode { - switch os.Getenv("MODE") { - case "record": - return RECORD - case "", "test": - return TEST - case "updateSnapshot": - return UPDATE_SNAPSHOT - case "sandbox": - return SANDBOX - default: - log.Fatalf("unknown test mode: %s, must be one of [test, record, update, sandbox]", os.Getenv("MODE")) - panic("unreachable") - } -} - -// this function is used by both `go test` and from our lazyintegration gui, but -// errors need to be handled differently in each (for example go test is always -// working with *testing.T) so we pass in any differences as args here. -func RunTests( - logf func(format string, formatArgs ...interface{}), - runCmd func(cmd *exec.Cmd) error, - fnWrapper func(test *Test, f func(*testing.T) error), - mode Mode, - speedEnv string, - onFail func(t *testing.T, expected string, actual string, prefix string), - includeSkipped bool, -) error { - rootDir := GetRootDirectory() - err := os.Chdir(rootDir) - if err != nil { - return err - } - - testDir := filepath.Join(rootDir, "test", "integration") - - osCommand := oscommands.NewDummyOSCommand() - err = osCommand.Cmd.New("go build -o " + tempLazygitPath()).Run() - if err != nil { - return err - } - - tests, err := LoadTests(testDir) - if err != nil { - return err - } - - for _, test := range tests { - test := test - - if test.Skip && !includeSkipped { - logf("skipping test: %s", test.Name) - continue - } - - fnWrapper(test, func(t *testing.T) error { - speeds := getTestSpeeds(test.Speed, mode, speedEnv) - testPath := filepath.Join(testDir, test.Name) - actualRepoDir := filepath.Join(testPath, "actual") - expectedRepoDir := filepath.Join(testPath, "expected") - actualRemoteDir := filepath.Join(testPath, "actual_remote") - expectedRemoteDir := filepath.Join(testPath, "expected_remote") - otherRepoDir := filepath.Join(testPath, "other_repo") - logf("path: %s", testPath) - - for i, speed := range speeds { - if mode != SANDBOX && mode != RECORD { - logf("%s: attempting test at speed %f\n", test.Name, speed) - } - - findOrCreateDir(testPath) - prepareIntegrationTestDir(actualRepoDir) - removeDir(otherRepoDir) - removeDir(actualRemoteDir) - err := createFixture(testPath, actualRepoDir) - if err != nil { - return err - } - - configDir := filepath.Join(testPath, "used_config") - - cmd, err := getLazygitCommand(testPath, rootDir, mode, speed, test.ExtraCmdArgs) - if err != nil { - return err - } - - err = runCmd(cmd) - if err != nil { - return err - } - - // submodule tests currently make use of a repo called 'other_repo' but we don't want that - // to stick around. Long-term we should have an 'actual' folder which itself contains - // repos, and there we can put the 'repo' repo which is the main one, alongside - // any others that we use as part of the test (including remotes). Then we'll do snapshots for - // each of them. - removeDir(otherRepoDir) - - if mode == UPDATE_SNAPSHOT || mode == RECORD { - // create/update snapshot - err = oscommands.CopyDir(actualRepoDir, expectedRepoDir) - if err != nil { - return err - } - - if err := renameGitDirs(expectedRepoDir); err != nil { - return err - } - - // see if we have a remote dir and if so, copy it over. Otherwise, delete the expected dir because we have no remote folder. - if folderExists(actualRemoteDir) { - err = oscommands.CopyDir(actualRemoteDir, expectedRemoteDir) - if err != nil { - return err - } - } else { - removeDir(expectedRemoteDir) - } - - logf("%s", "updated snapshot") - } else { - // compare result to snapshot - actualRepo, expectedRepo, err := generateSnapshots(actualRepoDir, expectedRepoDir) - if err != nil { - return err - } - - actualRemote := "remote folder does not exist" - expectedRemote := "remote folder does not exist" - if folderExists(expectedRemoteDir) { - actualRemote, expectedRemote, err = generateSnapshotsForRemote(actualRemoteDir, expectedRemoteDir) - if err != nil { - return err - } - } else if folderExists(actualRemoteDir) { - actualRemote = "remote folder exists" - } - - if expectedRepo == actualRepo && expectedRemote == actualRemote { - logf("%s: success at speed %f\n", test.Name, speed) - break - } - - // if the snapshot doesn't match and we haven't tried all playback speeds different we'll retry at a slower speed - if i == len(speeds)-1 { - // get the log file and print that - bytes, err := ioutil.ReadFile(filepath.Join(configDir, "development.log")) - if err != nil { - return err - } - logf("%s", string(bytes)) - if expectedRepo != actualRepo { - onFail(t, expectedRepo, actualRepo, "repo") - } else { - onFail(t, expectedRemote, actualRemote, "remote") - } - } - } - } - - return nil - }) - } - - return nil -} - -func removeDir(dir string) { - err := os.RemoveAll(dir) - if err != nil { - panic(err) - } -} - -func prepareIntegrationTestDir(actualDir string) { - // remove contents of integration test directory - dir, err := ioutil.ReadDir(actualDir) - if err != nil { - if os.IsNotExist(err) { - err = os.Mkdir(actualDir, 0777) - if err != nil { - panic(err) - } - } else { - panic(err) - } - } - for _, d := range dir { - os.RemoveAll(filepath.Join(actualDir, d.Name())) - } -} - -func GetRootDirectory() string { - path, err := os.Getwd() - if err != nil { - panic(err) - } - - for { - _, err := os.Stat(filepath.Join(path, ".git")) - - if err == nil { - return path - } - - if !os.IsNotExist(err) { - panic(err) - } - - path = filepath.Dir(path) - - if path == "/" { - log.Fatal("must run in lazygit folder or child folder") - } - } -} - -func createFixture(testPath, actualDir string) error { - bashScriptPath := filepath.Join(testPath, "setup.sh") - cmd := secureexec.Command("bash", bashScriptPath, actualDir) - - if output, err := cmd.CombinedOutput(); err != nil { - return errors.New(string(output)) - } - - return nil -} - -func tempLazygitPath() string { - return filepath.Join("/tmp", "lazygit", "test_lazygit") -} - -func getTestSpeeds(testStartSpeed float64, mode Mode, speedStr string) []float64 { - if mode != TEST { - // have to go at original speed if updating snapshots in case we go to fast and create a junk snapshot - return []float64{1.0} - } - - if speedStr != "" { - speed, err := strconv.ParseFloat(speedStr, 64) - if err != nil { - panic(err) - } - return []float64{speed} - } - - // default is 10, 5, 1 - startSpeed := 10.0 - if testStartSpeed != 0 { - startSpeed = testStartSpeed - } - speeds := []float64{startSpeed} - if startSpeed > 5 { - speeds = append(speeds, 5) - } - speeds = append(speeds, 1, 1) - - return speeds -} - -func LoadTests(testDir string) ([]*Test, error) { - paths, err := filepath.Glob(filepath.Join(testDir, "/*/test.json")) - if err != nil { - return nil, err - } - - tests := make([]*Test, len(paths)) - - for i, path := range paths { - data, err := ioutil.ReadFile(path) - if err != nil { - return nil, err - } - - test := &Test{} - - err = json.Unmarshal(data, test) - if err != nil { - return nil, err - } - - test.Name = strings.TrimPrefix(filepath.Dir(path), testDir+"/") - - tests[i] = test - } - - return tests, nil -} - -func findOrCreateDir(path string) { - _, err := os.Stat(path) - if err != nil { - if os.IsNotExist(err) { - err = os.MkdirAll(path, 0777) - if err != nil { - panic(err) - } - } else { - panic(err) - } - } -} - -// note that we don't actually store this snapshot in the lazygit repo. -// Instead we store the whole expected git repo of our test, so that -// we can easily change what we want to compare without needing to regenerate -// snapshots for each test. -func generateSnapshot(dir string) (string, error) { - osCommand := oscommands.NewDummyOSCommand() - - _, err := os.Stat(filepath.Join(dir, ".git")) - if err != nil { - return "git directory not found", nil - } - - snapshot := "" - - cmdStrs := []string{ - `status`, // file tree - `log --pretty=%B -p -1`, // log - `tag -n`, // tags - `stash list`, // stash - `submodule foreach 'git status'`, // submodule status - `submodule foreach 'git log --pretty=%B -p -1'`, // submodule log - `submodule foreach 'git tag -n'`, // submodule tags - `submodule foreach 'git stash list'`, // submodule stash - } - - for _, cmdStr := range cmdStrs { - // ignoring error for now. If there's an error it could be that there are no results - output, _ := osCommand.Cmd.New(fmt.Sprintf("git -C %s %s", dir, cmdStr)).RunWithOutput() - - snapshot += fmt.Sprintf("git %s:\n%s\n", cmdStr, output) - } - - snapshot += "files in repo:\n" - err = filepath.Walk(dir, func(path string, f os.FileInfo, err error) error { - if err != nil { - return err - } - - if f.IsDir() { - if f.Name() == ".git" { - return filepath.SkipDir - } - return nil - } - - bytes, err := ioutil.ReadFile(path) - if err != nil { - return err - } - - relativePath, err := filepath.Rel(dir, path) - if err != nil { - return err - } - snapshot += fmt.Sprintf("path: %s\ncontent:\n%s\n", relativePath, string(bytes)) - - return nil - }) - - if err != nil { - return "", err - } - - return snapshot, nil -} - -func generateSnapshots(actualDir string, expectedDir string) (string, string, error) { - actual, err := generateSnapshot(actualDir) - if err != nil { - return "", "", err - } - - // there are a couple of reasons we're not generating the snapshot in expectedDir directly: - // Firstly we don't want to have to revert our .git file back to .git_keep. - // Secondly, the act of calling git commands like 'git status' actually changes the index - // for some reason, and we don't want to leave your lazygit working tree dirty as a result. - expectedDirCopyDir := filepath.Join(filepath.Dir(expectedDir), "expected_dir_test") - err = oscommands.CopyDir(expectedDir, expectedDirCopyDir) - if err != nil { - return "", "", err - } - - if err := restoreGitDirs(expectedDirCopyDir); err != nil { - return "", "", err - } - - expected, err := generateSnapshot(expectedDirCopyDir) - if err != nil { - return "", "", err - } - - err = os.RemoveAll(expectedDirCopyDir) - if err != nil { - return "", "", err - } - - return actual, expected, nil -} - -func getPathsToRename(dir string, needle string) []string { - pathsToRename := []string{} - - err := filepath.Walk(dir, func(path string, f os.FileInfo, err error) error { - if err != nil { - return err - } - - if f.Name() == needle { - pathsToRename = append(pathsToRename, path) - } - - return nil - }) - if err != nil { - panic(err) - } - - return pathsToRename -} - -// Git refuses to track .git and .gitmodules folders in subdirectories so we need to rename it -// to git_keep after running a test, and then change it back again -var untrackedGitDirs []string = []string{".git", ".gitmodules"} - -func renameGitDirs(dir string) error { - for _, untrackedGitDir := range untrackedGitDirs { - for _, path := range getPathsToRename(dir, untrackedGitDir) { - err := os.Rename(path, path+"_keep") - if err != nil { - return err - } - } - } - - return nil -} - -func restoreGitDirs(dir string) error { - for _, untrackedGitDir := range untrackedGitDirs { - for _, path := range getPathsToRename(dir, untrackedGitDir+"_keep") { - err := os.Rename(path, strings.TrimSuffix(path, "_keep")) - if err != nil { - return err - } - } - } - - return nil -} - -func generateSnapshotsForRemote(actualDir string, expectedDir string) (string, string, error) { - actual, err := generateSnapshot(actualDir) - if err != nil { - return "", "", err - } - - expected, err := generateSnapshot(expectedDir) - if err != nil { - return "", "", err - } - - return actual, expected, nil -} - -func getLazygitCommand(testPath string, rootDir string, mode Mode, speed float64, extraCmdArgs string) (*exec.Cmd, error) { - osCommand := oscommands.NewDummyOSCommand() - - replayPath := filepath.Join(testPath, "recording.json") - templateConfigDir := filepath.Join(rootDir, "test", "default_test_config") - actualDir := filepath.Join(testPath, "actual") - - exists, err := osCommand.FileExists(filepath.Join(testPath, "config")) - if err != nil { - return nil, err - } - - if exists { - templateConfigDir = filepath.Join(testPath, "config") - } - - configDir := filepath.Join(testPath, "used_config") - - err = os.RemoveAll(configDir) - if err != nil { - return nil, err - } - err = oscommands.CopyDir(templateConfigDir, configDir) - if err != nil { - return nil, err - } - - cmdStr := fmt.Sprintf("%s -debug --use-config-dir=%s --path=%s %s", tempLazygitPath(), configDir, actualDir, extraCmdArgs) - - cmdObj := osCommand.Cmd.New(cmdStr) - cmdObj.AddEnvVars(fmt.Sprintf("SPEED=%f", speed)) - - switch mode { - case RECORD: - cmdObj.AddEnvVars(fmt.Sprintf("RECORD_EVENTS_TO=%s", replayPath)) - case TEST, UPDATE_SNAPSHOT: - cmdObj.AddEnvVars(fmt.Sprintf("REPLAY_EVENTS_FROM=%s", replayPath)) - } - - return cmdObj.GetCmd(), nil -} - -func folderExists(path string) bool { - _, err := os.Stat(path) - return err == nil -} diff --git a/pkg/integration/tests/branch/suggestions.go b/pkg/integration/tests/branch/suggestions.go new file mode 100644 index 000000000..0d8269f1d --- /dev/null +++ b/pkg/integration/tests/branch/suggestions.go @@ -0,0 +1,41 @@ +package branch + +import ( + "github.com/jesseduffield/lazygit/pkg/config" + "github.com/jesseduffield/lazygit/pkg/integration/components" +) + +var Suggestions = components.NewIntegrationTest(components.NewIntegrationTestArgs{ + Description: "Checking out a branch with name suggestions", + ExtraCmdArgs: "", + Skip: false, + SetupConfig: func(config *config.AppConfig) {}, + SetupRepo: func(shell *components.Shell) { + shell. + EmptyCommit("my commit message"). + NewBranch("new-branch"). + NewBranch("new-branch-2"). + NewBranch("new-branch-3"). + NewBranch("branch-to-checkout"). + NewBranch("other-new-branch-2"). + NewBranch("other-new-branch-3") + }, + Run: func(shell *components.Shell, input *components.Input, assert *components.Assert, keys config.KeybindingConfig) { + input.SwitchToBranchesWindow() + assert.CurrentViewName("localBranches") + + input.PressKeys(keys.Branches.CheckoutBranchByName) + assert.CurrentViewName("confirmation") + + input.Type("branch-to") + + input.PressKeys(keys.Universal.TogglePanel) + assert.CurrentViewName("suggestions") + + // we expect the first suggestion to be the branch we want because it most + // closely matches what we typed in + input.Confirm() + + assert.CurrentBranchName("branch-to-checkout") + }, +}) diff --git a/pkg/integration/tests/commit/commit.go b/pkg/integration/tests/commit/commit.go new file mode 100644 index 000000000..12a68925d --- /dev/null +++ b/pkg/integration/tests/commit/commit.go @@ -0,0 +1,32 @@ +package commit + +import ( + "github.com/jesseduffield/lazygit/pkg/config" + "github.com/jesseduffield/lazygit/pkg/integration/components" +) + +var Commit = components.NewIntegrationTest(components.NewIntegrationTestArgs{ + Description: "Staging a couple files and committing", + ExtraCmdArgs: "", + Skip: false, + SetupConfig: func(config *config.AppConfig) {}, + SetupRepo: func(shell *components.Shell) { + shell.CreateFile("myfile", "myfile content") + shell.CreateFile("myfile2", "myfile2 content") + }, + Run: func(shell *components.Shell, input *components.Input, assert *components.Assert, keys config.KeybindingConfig) { + assert.CommitCount(0) + + input.Select() + input.NextItem() + input.Select() + input.PressKeys(keys.Files.CommitChanges) + + commitMessage := "my commit message" + input.Type(commitMessage) + input.Confirm() + + assert.CommitCount(1) + assert.HeadCommitMessage(commitMessage) + }, +}) diff --git a/pkg/integration/tests/commit/new_branch.go b/pkg/integration/tests/commit/new_branch.go new file mode 100644 index 000000000..ad96938f5 --- /dev/null +++ b/pkg/integration/tests/commit/new_branch.go @@ -0,0 +1,38 @@ +package commit + +import ( + "github.com/jesseduffield/lazygit/pkg/config" + "github.com/jesseduffield/lazygit/pkg/integration/components" +) + +var NewBranch = components.NewIntegrationTest(components.NewIntegrationTestArgs{ + Description: "Creating a new branch from a commit", + ExtraCmdArgs: "", + Skip: false, + SetupConfig: func(config *config.AppConfig) {}, + SetupRepo: func(shell *components.Shell) { + shell. + EmptyCommit("commit 1"). + EmptyCommit("commit 2"). + EmptyCommit("commit 3") + }, + Run: func(shell *components.Shell, input *components.Input, assert *components.Assert, keys config.KeybindingConfig) { + assert.CommitCount(3) + + input.SwitchToCommitsWindow() + assert.CurrentViewName("commits") + input.NextItem() + + input.PressKeys(keys.Universal.New) + + assert.CurrentViewName("confirmation") + + branchName := "my-branch-name" + input.Type(branchName) + input.Confirm() + + assert.CommitCount(2) + assert.HeadCommitMessage("commit 2") + assert.CurrentBranchName(branchName) + }, +}) diff --git a/pkg/integration/tests/interactive_rebase/one.go b/pkg/integration/tests/interactive_rebase/one.go new file mode 100644 index 000000000..3c785a727 --- /dev/null +++ b/pkg/integration/tests/interactive_rebase/one.go @@ -0,0 +1,41 @@ +package interactive_rebase + +import ( + "github.com/jesseduffield/lazygit/pkg/config" + "github.com/jesseduffield/lazygit/pkg/integration/components" +) + +var One = components.NewIntegrationTest(components.NewIntegrationTestArgs{ + Description: "Begins an interactive rebase, then fixups, drops, and squashes some commits", + ExtraCmdArgs: "", + Skip: false, + SetupConfig: func(config *config.AppConfig) {}, + SetupRepo: func(shell *components.Shell) { + shell. + CreateNCommits(5) // these will appears at commit 05, 04, 04, down to 01 + }, + Run: func(shell *components.Shell, input *components.Input, assert *components.Assert, keys config.KeybindingConfig) { + input.SwitchToCommitsWindow() + assert.CurrentViewName("commits") + + input.NavigateToListItemContainingText("commit 02") + input.PressKeys(keys.Universal.Edit) + assert.SelectedLineContains("YOU ARE HERE") + + input.PreviousItem() + input.PressKeys(keys.Commits.MarkCommitAsFixup) + assert.SelectedLineContains("fixup") + + input.PreviousItem() + input.PressKeys(keys.Universal.Remove) + assert.SelectedLineContains("drop") + + input.PreviousItem() + input.PressKeys(keys.Commits.SquashDown) + assert.SelectedLineContains("squash") + + input.ContinueRebase() + + assert.CommitCount(2) + }, +}) diff --git a/pkg/integration/tests/tests.go b/pkg/integration/tests/tests.go new file mode 100644 index 000000000..e9794169a --- /dev/null +++ b/pkg/integration/tests/tests.go @@ -0,0 +1,18 @@ +package tests + +import ( + "github.com/jesseduffield/lazygit/pkg/integration/components" + "github.com/jesseduffield/lazygit/pkg/integration/tests/branch" + "github.com/jesseduffield/lazygit/pkg/integration/tests/commit" + "github.com/jesseduffield/lazygit/pkg/integration/tests/interactive_rebase" +) + +// Here is where we lists the actual tests that will run. When you create a new test, +// be sure to add it to this list. + +var Tests = []*components.IntegrationTest{ + commit.Commit, + commit.NewBranch, + branch.Suggestions, + interactive_rebase.One, +} diff --git a/pkg/integration/types/types.go b/pkg/integration/types/types.go new file mode 100644 index 000000000..543212d59 --- /dev/null +++ b/pkg/integration/types/types.go @@ -0,0 +1,31 @@ +package types + +import ( + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/config" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +// these interfaces are used by the gui package so that it knows what it needs +// to provide to a test in order for the test to run. + +type IntegrationTest interface { + Run(GuiDriver) + SetupConfig(config *config.AppConfig) +} + +// this is the interface through which our integration tests interact with the lazygit gui +type GuiDriver interface { + PressKey(string) + Keys() config.KeybindingConfig + CurrentContext() types.Context + Model() *types.Model + Fail(message string) + // These two log methods are for the sake of debugging while testing. There's no need to actually + // commit any logging. + // logs to the normal place that you log to i.e. viewable with `lazygit --logs` + Log(message string) + // logs in the actual UI (in the commands panel) + LogUI(message string) + CheckedOutRef() *models.Branch +} diff --git a/pkg/logs/logs.go b/pkg/logs/logs.go new file mode 100644 index 000000000..a4fe94031 --- /dev/null +++ b/pkg/logs/logs.go @@ -0,0 +1,34 @@ +package logs + +import ( + "fmt" + "log" + "os" + + "github.com/aybabtme/humanlog" + "github.com/jesseduffield/lazygit/pkg/config" +) + +// TailLogs lets us run `lazygit --logs` to print the logs produced by other lazygit processes. +// This makes for easier debugging. +func TailLogs() { + logFilePath, err := config.LogPath() + if err != nil { + log.Fatal(err) + } + + fmt.Printf("Tailing log file %s\n\n", logFilePath) + + opts := humanlog.DefaultOptions + opts.Truncates = false + + _, err = os.Stat(logFilePath) + if err != nil { + if os.IsNotExist(err) { + log.Fatal("Log file does not exist. Run `lazygit --debug` first to create the log file") + } + log.Fatal(err) + } + + TailLogsForPlatform(logFilePath, opts) +} diff --git a/pkg/logs/logs_default.go b/pkg/logs/logs_default.go new file mode 100644 index 000000000..b4474720c --- /dev/null +++ b/pkg/logs/logs_default.go @@ -0,0 +1,31 @@ +//go:build !windows +// +build !windows + +package logs + +import ( + "log" + "os" + + "github.com/aybabtme/humanlog" + "github.com/jesseduffield/lazygit/pkg/secureexec" +) + +func TailLogsForPlatform(logFilePath string, opts *humanlog.HandlerOptions) { + cmd := secureexec.Command("tail", "-f", logFilePath) + + stdout, _ := cmd.StdoutPipe() + if err := cmd.Start(); err != nil { + log.Fatal(err) + } + + if err := humanlog.Scanner(stdout, os.Stdout, opts); err != nil { + log.Fatal(err) + } + + if err := cmd.Wait(); err != nil { + log.Fatal(err) + } + + os.Exit(0) +} diff --git a/pkg/logs/logs_windows.go b/pkg/logs/logs_windows.go new file mode 100644 index 000000000..7fa17db26 --- /dev/null +++ b/pkg/logs/logs_windows.go @@ -0,0 +1,73 @@ +//go:build windows +// +build windows + +package logs + +import ( + "bufio" + "log" + "os" + "strings" + "time" + + "github.com/aybabtme/humanlog" +) + +func TailLogsForPlatform(logFilePath string, opts *humanlog.HandlerOptions) { + var lastModified int64 = 0 + var lastOffset int64 = 0 + for { + stat, err := os.Stat(logFilePath) + if err != nil { + log.Fatal(err) + } + if stat.ModTime().Unix() > lastModified { + err = TailFrom(lastOffset, logFilePath, opts) + if err != nil { + log.Fatal(err) + } + } + lastOffset = stat.Size() + time.Sleep(1 * time.Second) + } +} + +func OpenAndSeek(filepath string, offset int64) (*os.File, error) { + file, err := os.Open(filepath) + if err != nil { + return nil, err + } + + _, err = file.Seek(offset, 0) + if err != nil { + _ = file.Close() + return nil, err + } + return file, nil +} + +func TailFrom(lastOffset int64, logFilePath string, opts *humanlog.HandlerOptions) error { + file, err := OpenAndSeek(logFilePath, lastOffset) + if err != nil { + return err + } + + fileScanner := bufio.NewScanner(file) + var lines []string + for fileScanner.Scan() { + lines = append(lines, fileScanner.Text()) + } + file.Close() + lineCount := len(lines) + lastTen := lines + if lineCount > 10 { + lastTen = lines[lineCount-10:] + } + for _, line := range lastTen { + reader := strings.NewReader(line) + if err := humanlog.Scanner(reader, os.Stdout, opts); err != nil { + log.Fatal(err) + } + } + return nil +} diff --git a/pkg/tasks/async_handler.go b/pkg/tasks/async_handler.go index 897efb0e2..c277a1184 100644 --- a/pkg/tasks/async_handler.go +++ b/pkg/tasks/async_handler.go @@ -1,9 +1,8 @@ package tasks import ( - "sync" - "github.com/jesseduffield/lazygit/pkg/utils" + "github.com/sasha-s/go-deadlock" ) // the purpose of an AsyncHandler is to ensure that if we have multiple long-running @@ -17,13 +16,13 @@ import ( type AsyncHandler struct { currentId int lastId int - mutex sync.Mutex + mutex deadlock.Mutex onReject func() } func NewAsyncHandler() *AsyncHandler { return &AsyncHandler{ - mutex: sync.Mutex{}, + mutex: deadlock.Mutex{}, } } diff --git a/pkg/tasks/tasks.go b/pkg/tasks/tasks.go index 4a987039c..448857fca 100644 --- a/pkg/tasks/tasks.go +++ b/pkg/tasks/tasks.go @@ -11,9 +11,18 @@ import ( "github.com/jesseduffield/lazygit/pkg/commands/oscommands" "github.com/jesseduffield/lazygit/pkg/utils" + "github.com/sasha-s/go-deadlock" "github.com/sirupsen/logrus" ) +// This file revolves around running commands that will be output to the main panel +// in the gui. If we're flicking through the commits panel, we want to invoke a +// `git show` command for each commit, but we don't want to read the entire output +// at once (because that would slow things down); we just want to fill the panel +// and then read more as the user scrolls down. We also want to ensure that we're only +// ever running one `git show` command at time, and that we only have one command +// writing its output to the main panel at a time. + const THROTTLE_TIME = time.Millisecond * 30 // we use this to check if the system is under stress right now. Hopefully this makes sense on other machines @@ -26,11 +35,10 @@ type ViewBufferManager struct { // this is what we write the output of the task to. It's typically a view writer io.Writer - // this is for when we wait to get - waitingMutex sync.Mutex - taskIDMutex sync.Mutex + waitingMutex deadlock.Mutex + taskIDMutex deadlock.Mutex Log *logrus.Entry - newTaskId int + newTaskID int readLines chan int taskKey string onNewKey func() @@ -70,14 +78,14 @@ func NewViewBufferManager( } } -func (m *ViewBufferManager) ReadLines(n int) { +func (self *ViewBufferManager) ReadLines(n int) { go utils.Safe(func() { - m.readLines <- n + self.readLines <- n }) } // note: onDone may be called twice -func (m *ViewBufferManager) NewCmdTask(start func() (*exec.Cmd, io.Reader), prefix string, linesToRead int, onDone func()) func(chan struct{}) error { +func (self *ViewBufferManager) NewCmdTask(start func() (*exec.Cmd, io.Reader), prefix string, linesToRead int, onDone func()) func(chan struct{}) error { return func(stop chan struct{}) error { var once sync.Once var onDoneWrapper func() @@ -85,8 +93,8 @@ func (m *ViewBufferManager) NewCmdTask(start func() (*exec.Cmd, io.Reader), pref onDoneWrapper = func() { once.Do(onDone) } } - if m.throttle { - m.Log.Info("throttling task") + if self.throttle { + self.Log.Info("throttling task") time.Sleep(THROTTLE_TIME) } @@ -106,10 +114,10 @@ func (m *ViewBufferManager) NewCmdTask(start func() (*exec.Cmd, io.Reader), pref // are running slow at the moment. This is admittedly a crude estimate, but // the point is that we only want to throttle when things are running slow // and the user is flicking through a bunch of items. - m.throttle = time.Since(startTime) < THROTTLE_TIME && timeToStart > COMMAND_START_THRESHOLD + self.throttle = time.Since(startTime) < THROTTLE_TIME && timeToStart > COMMAND_START_THRESHOLD if err := oscommands.Kill(cmd); err != nil { if !strings.Contains(err.Error(), "process already finished") { - m.Log.Errorf("error when running cmd task: %v", err) + self.Log.Errorf("error when running cmd task: %v", err) } } @@ -119,10 +127,10 @@ func (m *ViewBufferManager) NewCmdTask(start func() (*exec.Cmd, io.Reader), pref } }) - loadingMutex := sync.Mutex{} + loadingMutex := deadlock.Mutex{} // not sure if it's the right move to redefine this or not - m.readLines = make(chan int, 1024) + self.readLines = make(chan int, 1024) done := make(chan struct{}) @@ -140,9 +148,9 @@ func (m *ViewBufferManager) NewCmdTask(start func() (*exec.Cmd, io.Reader), pref case <-ticker.C: loadingMutex.Lock() if !loaded { - m.beforeStart() - _, _ = m.writer.Write([]byte("loading...")) - m.refreshView() + self.beforeStart() + _, _ = self.writer.Write([]byte("loading...")) + self.refreshView() } loadingMutex.Unlock() } @@ -154,7 +162,7 @@ func (m *ViewBufferManager) NewCmdTask(start func() (*exec.Cmd, io.Reader), pref select { case <-stop: break outer - case linesToRead := <-m.readLines: + case linesToRead := <-self.readLines: for i := 0; i < linesToRead; i++ { select { case <-stop: @@ -165,9 +173,9 @@ func (m *ViewBufferManager) NewCmdTask(start func() (*exec.Cmd, io.Reader), pref ok := scanner.Scan() loadingMutex.Lock() if !loaded { - m.beforeStart() + self.beforeStart() if prefix != "" { - _, _ = m.writer.Write([]byte(prefix)) + _, _ = self.writer.Write([]byte(prefix)) } loaded = true } @@ -176,21 +184,21 @@ func (m *ViewBufferManager) NewCmdTask(start func() (*exec.Cmd, io.Reader), pref if !ok { // if we're here then there's nothing left to scan from the source // so we're at the EOF and can flush the stale content - m.onEndOfInput() + self.onEndOfInput() break outer } - _, _ = m.writer.Write(append(scanner.Bytes(), '\n')) + _, _ = self.writer.Write(append(scanner.Bytes(), '\n')) } - m.refreshView() + self.refreshView() } } - m.refreshView() + self.refreshView() if err := cmd.Wait(); err != nil { // it's fine if we've killed this program ourselves if !strings.Contains(err.Error(), "signal: killed") { - m.Log.Error(err) + self.Log.Errorf("Unexpected error when running cmd task: %v", err) } } @@ -202,7 +210,7 @@ func (m *ViewBufferManager) NewCmdTask(start func() (*exec.Cmd, io.Reader), pref close(done) }) - m.readLines <- linesToRead + self.readLines <- linesToRead <-done @@ -211,15 +219,15 @@ func (m *ViewBufferManager) NewCmdTask(start func() (*exec.Cmd, io.Reader), pref } // Close closes the task manager, killing whatever task may currently be running -func (t *ViewBufferManager) Close() { - if t.stopCurrentTask == nil { +func (self *ViewBufferManager) Close() { + if self.stopCurrentTask == nil { return } c := make(chan struct{}) go utils.Safe(func() { - t.stopCurrentTask() + self.stopCurrentTask() c <- struct{}{} }) @@ -235,28 +243,28 @@ func (t *ViewBufferManager) Close() { // 1) command based, where the manager can be asked to read more lines, but the command can be killed // 2) string based, where the manager can also be asked to read more lines -func (m *ViewBufferManager) NewTask(f func(stop chan struct{}) error, key string) error { +func (self *ViewBufferManager) NewTask(f func(stop chan struct{}) error, key string) error { go utils.Safe(func() { - m.taskIDMutex.Lock() - m.newTaskId++ - taskID := m.newTaskId + self.taskIDMutex.Lock() + self.newTaskID++ + taskID := self.newTaskID - if m.GetTaskKey() != key && m.onNewKey != nil { - m.onNewKey() + if self.GetTaskKey() != key && self.onNewKey != nil { + self.onNewKey() } - m.taskKey = key + self.taskKey = key - m.taskIDMutex.Unlock() + self.taskIDMutex.Unlock() - m.waitingMutex.Lock() - defer m.waitingMutex.Unlock() + self.waitingMutex.Lock() + defer self.waitingMutex.Unlock() - if taskID < m.newTaskId { + if taskID < self.newTaskID { return } - if m.stopCurrentTask != nil { - m.stopCurrentTask() + if self.stopCurrentTask != nil { + self.stopCurrentTask() } stop := make(chan struct{}) @@ -268,11 +276,11 @@ func (m *ViewBufferManager) NewTask(f func(stop chan struct{}) error, key string <-notifyStopped } - m.stopCurrentTask = func() { once.Do(onStop) } + self.stopCurrentTask = func() { once.Do(onStop) } go utils.Safe(func() { if err := f(stop); err != nil { - m.Log.Error(err) // might need an onError callback + self.Log.Error(err) // might need an onError callback } close(notifyStopped) diff --git a/pkg/tasks/tasks_test.go b/pkg/tasks/tasks_test.go index d580c95f5..9bd552162 100644 --- a/pkg/tasks/tasks_test.go +++ b/pkg/tasks/tasks_test.go @@ -69,7 +69,7 @@ func TestNewCmdTaskInstantStop(t *testing.T) { expectedContent := "" actualContent := writer.String() if actualContent != expectedContent { - t.Errorf("expected writer to receive the following content: \n%s\n. But instead it recevied: %s", expectedContent, actualContent) + t.Errorf("expected writer to receive the following content: \n%s\n. But instead it received: %s", expectedContent, actualContent) } } @@ -131,6 +131,6 @@ func TestNewCmdTask(t *testing.T) { expectedContent := "prefix\ntest\n" actualContent := writer.String() if actualContent != expectedContent { - t.Errorf("expected writer to receive the following content: \n%s\n. But instead it recevied: %s", expectedContent, actualContent) + t.Errorf("expected writer to receive the following content: \n%s\n. But instead it received: %s", expectedContent, actualContent) } } diff --git a/pkg/test/log.go b/pkg/test/log.go index 3b166bb5d..32d79b987 100644 --- a/pkg/test/log.go +++ b/pkg/test/log.go @@ -8,9 +8,7 @@ import ( "github.com/stretchr/testify/assert" ) -var ( - _ logrus.FieldLogger = &FakeFieldLogger{} -) +var _ logrus.FieldLogger = &FakeFieldLogger{} // for now we're just tracking calls to the Error and Errorf methods type FakeFieldLogger struct { @@ -37,5 +35,6 @@ func (self *FakeFieldLogger) Errorf(format string, args ...interface{}) { } func (self *FakeFieldLogger) AssertErrors(t *testing.T, expectedErrors []string) { + t.Helper() assert.EqualValues(t, expectedErrors, self.loggedErrors) } diff --git a/pkg/test/test.go b/pkg/test/test.go deleted file mode 100644 index da476b95c..000000000 --- a/pkg/test/test.go +++ /dev/null @@ -1,32 +0,0 @@ -package test - -import ( - "os" - "path/filepath" - - "github.com/go-errors/errors" - - "github.com/jesseduffield/lazygit/pkg/secureexec" - "github.com/jesseduffield/lazygit/pkg/utils" -) - -// GenerateRepo generates a repo from test/repos and changes the directory to be -// inside the newly made repo -func GenerateRepo(filename string) error { - reposDir := "/test/repos/" - testPath := utils.GetProjectRoot() + reposDir - - // workaround for debian packaging - if _, err := os.Stat(testPath); os.IsNotExist(err) { - cwd, _ := os.Getwd() - testPath = filepath.Dir(filepath.Dir(cwd)) + reposDir - } - if err := os.Chdir(testPath); err != nil { - return err - } - if output, err := secureexec.Command("bash", filename).CombinedOutput(); err != nil { - return errors.New(string(output)) - } - - return os.Chdir(testPath + "repo") -} diff --git a/pkg/test/utils.go b/pkg/test/utils.go deleted file mode 100644 index 47f2c1146..000000000 --- a/pkg/test/utils.go +++ /dev/null @@ -1,59 +0,0 @@ -package test - -import ( - "fmt" - "os/exec" - "regexp" - "strings" - "testing" - - "github.com/jesseduffield/lazygit/pkg/secureexec" - "github.com/mgutz/str" - "github.com/stretchr/testify/assert" -) - -// CommandSwapper takes a command, verifies that it is what it's expected to be -// and then returns a replacement command that will actually be called by the os -type CommandSwapper struct { - Expect string - Replace string -} - -// SwapCommand verifies the command is what we expected, and swaps it out for a different command -func (i *CommandSwapper) SwapCommand(t *testing.T, cmd string, args []string) *exec.Cmd { - splitCmd := str.ToArgv(i.Expect) - assert.EqualValues(t, splitCmd[0], cmd, fmt.Sprintf("received command: %s %s", cmd, strings.Join(args, " "))) - if len(splitCmd) > 1 { - assert.EqualValues(t, splitCmd[1:], args, fmt.Sprintf("received command: %s %s", cmd, strings.Join(args, " "))) - } - - splitCmd = str.ToArgv(i.Replace) - return secureexec.Command(splitCmd[0], splitCmd[1:]...) -} - -// CreateMockCommand creates a command function that will verify its receiving the right sequence of commands from lazygit -func CreateMockCommand(t *testing.T, swappers []*CommandSwapper) func(cmd string, args ...string) *exec.Cmd { - commandIndex := 0 - - return func(cmd string, args ...string) *exec.Cmd { - var command *exec.Cmd - if commandIndex > len(swappers)-1 { - assert.Fail(t, fmt.Sprintf("too many commands run. This command was (%s %s)", cmd, strings.Join(args, " "))) - } - command = swappers[commandIndex].SwapCommand(t, cmd, args) - commandIndex++ - return command - } -} - -func AssertContainsMatch(t *testing.T, strs []string, pattern *regexp.Regexp, message string) { - t.Helper() - - for _, str := range strs { - if pattern.Match([]byte(str)) { - return - } - } - - assert.Fail(t, message) -} diff --git a/pkg/theme/theme.go b/pkg/theme/theme.go index c3e12fdcc..39347702a 100644 --- a/pkg/theme/theme.go +++ b/pkg/theme/theme.go @@ -39,6 +39,8 @@ var ( OptionsFgColor = style.New() DiffTerminalColor = style.FgMagenta + + UnstagedChangesColor = style.New() ) // UpdateTheme updates all theme variables @@ -52,6 +54,9 @@ func UpdateTheme(themeConfig config.ThemeConfig) { cherryPickedCommitFgTextStyle := GetTextStyle(themeConfig.CherryPickedCommitFgColor, false) CherryPickedCommitTextStyle = cherryPickedCommitBgTextStyle.MergeStyle(cherryPickedCommitFgTextStyle) + unstagedChangesTextStyle := GetTextStyle(themeConfig.UnstagedChangesColor, false) + UnstagedChangesColor = unstagedChangesTextStyle + GocuiSelectedLineBgColor = GetGocuiStyle(themeConfig.SelectedLineBgColor) OptionsColor = GetGocuiStyle(themeConfig.OptionsTextColor) OptionsFgColor = GetTextStyle(themeConfig.OptionsTextColor, false) diff --git a/pkg/updates/updates.go b/pkg/updates/updates.go index 1c52d0419..58c93fa7d 100644 --- a/pkg/updates/updates.go +++ b/pkg/updates/updates.go @@ -144,12 +144,10 @@ func (u *Updater) CheckForNewUpdate(onFinish func(string, error) error, userRequ return } - go utils.Safe(func() { - newVersion, err := u.checkForNewUpdate() - if err = onFinish(newVersion, err); err != nil { - u.Log.Error(err) - } - }) + newVersion, err := u.checkForNewUpdate() + if err = onFinish(newVersion, err); err != nil { + u.Log.Error(err) + } } func (u *Updater) skipUpdateCheck() bool { @@ -331,7 +329,6 @@ func (u *Updater) verifyResourceFound(rawUrl string) bool { } defer resp.Body.Close() u.Log.Info("Received status code ", resp.StatusCode) - // 403 means the resource is there (not going to bother adding extra request headers) - // 404 means its not - return resp.StatusCode == 403 + // OK (200) indicates that the resource is present. + return resp.StatusCode == http.StatusOK } diff --git a/pkg/utils/color.go b/pkg/utils/color.go index 37c60179a..a4ad578e0 100644 --- a/pkg/utils/color.go +++ b/pkg/utils/color.go @@ -6,10 +6,13 @@ import ( "github.com/gookit/color" "github.com/jesseduffield/lazygit/pkg/gui/style" + "github.com/samber/lo" ) -var decoloriseCache = make(map[string]string) -var decoloriseMutex sync.RWMutex +var ( + decoloriseCache = make(map[string]string) + decoloriseMutex sync.RWMutex +) // Decolorise strips a string of color func Decolorise(str string) string { @@ -53,10 +56,10 @@ func IsValidHexValue(v string) bool { } func SetCustomColors(customColors map[string]string) map[string]style.TextStyle { - colors := make(map[string]style.TextStyle) - for key, colorSequence := range customColors { - style := style.New().SetFg(style.NewRGBColor(color.HEX(colorSequence, false))) - colors[key] = style - } - return colors + return lo.MapValues(customColors, func(c string, key string) style.TextStyle { + if s, ok := style.ColorMap[c]; ok { + return s.Foreground + } + return style.New().SetFg(style.NewRGBColor(color.HEX(c, false))) + }) } diff --git a/pkg/utils/color_test.go b/pkg/utils/color_test.go index 37144e955..1440f946c 100644 --- a/pkg/utils/color_test.go +++ b/pkg/utils/color_test.go @@ -5,7 +5,7 @@ import ( ) func TestDecolorise(t *testing.T) { - var tests = []struct { + tests := []struct { input string output string }{ diff --git a/pkg/utils/date.go b/pkg/utils/date.go index 40165ecaa..2f9812b81 100644 --- a/pkg/utils/date.go +++ b/pkg/utils/date.go @@ -20,6 +20,6 @@ func UnixToTimeAgo(timestamp int64) string { return fmt.Sprintf("%dy", int(delta)) } -func UnixToDate(timestamp int64) string { - return time.Unix(timestamp, 0).Format(time.RFC822) +func UnixToDate(timestamp int64, timeFormat string) string { + return time.Unix(timestamp, 0).Format(timeFormat) } diff --git a/pkg/utils/formatting.go b/pkg/utils/formatting.go index d33028063..657d1d2eb 100644 --- a/pkg/utils/formatting.go +++ b/pkg/utils/formatting.go @@ -3,7 +3,9 @@ package utils import ( "strings" + "github.com/jesseduffield/generics/slices" "github.com/mattn/go-runewidth" + "github.com/samber/lo" ) // WithPadding pads a string as much as you want @@ -83,27 +85,20 @@ func getPaddedDisplayStrings(stringArrays [][]string, padWidths []int) string { } func getPadWidths(stringArrays [][]string) []int { - maxWidth := 0 - for _, stringArray := range stringArrays { - if len(stringArray) > maxWidth { - maxWidth = len(stringArray) - } - } + maxWidth := slices.MaxBy(stringArrays, func(stringArray []string) int { + return len(stringArray) + }) + if maxWidth-1 < 0 { return []int{} } - padWidths := make([]int, maxWidth-1) - for i := range padWidths { - for _, strings := range stringArrays { - uncoloredStr := Decolorise(strings[i]) + return slices.Map(lo.Range(maxWidth-1), func(i int) int { + return slices.MaxBy(stringArrays, func(stringArray []string) int { + uncoloredStr := Decolorise(stringArray[i]) - width := runewidth.StringWidth(uncoloredStr) - if width > padWidths[i] { - padWidths[i] = width - } - } - } - return padWidths + return runewidth.StringWidth(uncoloredStr) + }) + }) } // TruncateWithEllipsis returns a string, truncated to a certain length, with an ellipsis diff --git a/pkg/utils/fuzzy_search.go b/pkg/utils/fuzzy_search.go index 4199d6c8b..5fce3dde9 100644 --- a/pkg/utils/fuzzy_search.go +++ b/pkg/utils/fuzzy_search.go @@ -3,6 +3,7 @@ package utils import ( "sort" + "github.com/jesseduffield/generics/slices" "github.com/sahilm/fuzzy" ) @@ -14,10 +15,7 @@ func FuzzySearch(needle string, haystack []string) []string { matches := fuzzy.Find(needle, haystack) sort.Sort(matches) - result := make([]string, len(matches)) - for i, match := range matches { - result[i] = match.Str - } - - return result + return slices.Map(matches, func(match fuzzy.Match) string { + return match.Str + }) } diff --git a/pkg/utils/lines.go b/pkg/utils/lines.go index 9aea84bff..47d33e939 100644 --- a/pkg/utils/lines.go +++ b/pkg/utils/lines.go @@ -17,15 +17,6 @@ func SplitLines(multilineString string) []string { return lines } -// TrimTrailingNewline - Trims the trailing newline -// TODO: replace with `chomp` after refactor -func TrimTrailingNewline(str string) string { - if strings.HasSuffix(str, "\n") { - return str[:len(str)-1] - } - return str -} - // NormalizeLinefeeds - Removes all Windows and Mac style line feeds func NormalizeLinefeeds(str string) string { str = strings.Replace(str, "\r\n", "\n", -1) diff --git a/pkg/utils/lines_test.go b/pkg/utils/lines_test.go index 6069b8f93..361f0a510 100644 --- a/pkg/utils/lines_test.go +++ b/pkg/utils/lines_test.go @@ -36,36 +36,13 @@ func TestSplitLines(t *testing.T) { } } -// TestTrimTrailingNewline is a function. -func TestTrimTrailingNewline(t *testing.T) { - type scenario struct { - str string - expected string - } - - scenarios := []scenario{ - { - "hello world !\n", - "hello world !", - }, - { - "hello world !", - "hello world !", - }, - } - - for _, s := range scenarios { - assert.EqualValues(t, s.expected, TrimTrailingNewline(s.str)) - } -} - // TestNormalizeLinefeeds is a function. func TestNormalizeLinefeeds(t *testing.T) { type scenario struct { byteArray []byte expected []byte } - var scenarios = []scenario{ + scenarios := []scenario{ { // \r\n []byte{97, 115, 100, 102, 13, 10}, diff --git a/pkg/utils/once_writer.go b/pkg/utils/once_writer.go new file mode 100644 index 000000000..aecf20369 --- /dev/null +++ b/pkg/utils/once_writer.go @@ -0,0 +1,31 @@ +package utils + +import ( + "io" + "sync" +) + +// This wraps a writer and ensures that before we actually write anything we call a given function first + +type OnceWriter struct { + writer io.Writer + once sync.Once + f func() +} + +var _ io.Writer = &OnceWriter{} + +func NewOnceWriter(writer io.Writer, f func()) *OnceWriter { + return &OnceWriter{ + writer: writer, + f: f, + } +} + +func (self *OnceWriter) Write(p []byte) (n int, err error) { + self.once.Do(func() { + self.f() + }) + + return self.writer.Write(p) +} diff --git a/pkg/utils/once_writer_test.go b/pkg/utils/once_writer_test.go new file mode 100644 index 000000000..47f64bb61 --- /dev/null +++ b/pkg/utils/once_writer_test.go @@ -0,0 +1,19 @@ +package utils + +import ( + "bytes" + "testing" +) + +func TestOnceWriter(t *testing.T) { + innerWriter := bytes.NewBuffer(nil) + counter := 0 + onceWriter := NewOnceWriter(innerWriter, func() { + counter += 1 + }) + _, _ = onceWriter.Write([]byte("hello")) + _, _ = onceWriter.Write([]byte("hello")) + if counter != 1 { + t.Errorf("expected counter to be 1, got %d", counter) + } +} diff --git a/pkg/utils/slice.go b/pkg/utils/slice.go index 123fc7df9..2281d8a73 100644 --- a/pkg/utils/slice.go +++ b/pkg/utils/slice.go @@ -1,29 +1,5 @@ package utils -// IncludesString if the list contains the string -func IncludesString(list []string, a string) bool { - return IncludesStringFunc(list, func(b string) bool { return b == a }) -} - -func IncludesStringFunc(list []string, fn func(string) bool) bool { - for _, b := range list { - if fn(b) { - return true - } - } - return false -} - -// IncludesInt if the list contains the Int -func IncludesInt(list []int, a int) bool { - for _, b := range list { - if b == a { - return true - } - } - return false -} - // NextIndex returns the index of the element that comes after the given number func NextIndex(numbers []int, currentNumber int) int { for index, number := range numbers { @@ -45,44 +21,6 @@ func PrevIndex(numbers []int, currentNumber int) int { return 0 } -// UnionInt returns the union of two int arrays -func UnionInt(a, b []int) []int { - m := make(map[int]bool) - - for _, item := range a { - m[item] = true - } - - for _, item := range b { - if _, ok := m[item]; !ok { - // this does not mutate the original a slice - // though it does mutate the backing array I believe - // but that doesn't matter because if you later want to append to the - // original a it must see that the backing array has been changed - // and create a new one - a = append(a, item) - } - } - return a -} - -// DifferenceInt returns the difference of two int arrays -func DifferenceInt(a, b []int) []int { - result := []int{} - m := make(map[int]bool) - - for _, item := range b { - m[item] = true - } - - for _, item := range a { - if _, ok := m[item]; !ok { - result = append(result, item) - } - } - return result -} - // NextIntInCycle returns the next int in a slice, returning to the first index if we've reached the end func NextIntInCycle(sl []int, current int) int { for i, val := range sl { @@ -121,19 +59,6 @@ func StringArraysOverlap(strArrA []string, strArrB []string) bool { return false } -func Uniq(values []string) []string { - added := make(map[string]bool) - result := make([]string, 0, len(values)) - for _, value := range values { - if added[value] { - continue - } - added[value] = true - result = append(result, value) - } - return result -} - func Limit(values []string, limit int) []string { if len(values) > limit { return values[:limit] @@ -141,14 +66,6 @@ func Limit(values []string, limit int) []string { return values } -func Reverse(values []string) []string { - result := make([]string, len(values)) - for i, val := range values { - result[len(values)-i-1] = val - } - return result -} - func LimitStr(value string, limit int) string { n := 0 for i := range value { @@ -159,3 +76,19 @@ func LimitStr(value string, limit int) string { } return value } + +// Similar to a regular GroupBy, except that each item can be grouped under multiple keys, +// so the callback returns a slice of keys instead of just one key. +func MuiltiGroupBy[T any, K comparable](slice []T, f func(T) []K) map[K][]T { + result := map[K][]T{} + for _, item := range slice { + for _, key := range f(item) { + if _, ok := result[key]; !ok { + result[key] = []T{item} + } else { + result[key] = append(result[key], item) + } + } + } + return result +} diff --git a/pkg/utils/slice_test.go b/pkg/utils/slice_test.go index fc80a46d7..e66edcd61 100644 --- a/pkg/utils/slice_test.go +++ b/pkg/utils/slice_test.go @@ -6,42 +6,6 @@ import ( "github.com/stretchr/testify/assert" ) -// TestIncludesString is a function. -func TestIncludesString(t *testing.T) { - type scenario struct { - list []string - element string - expected bool - } - - scenarios := []scenario{ - { - []string{"a", "b"}, - "a", - true, - }, - { - []string{"a", "b"}, - "c", - false, - }, - { - []string{"a", "b"}, - "", - false, - }, - { - []string{""}, - "", - true, - }, - } - - for _, s := range scenarios { - assert.EqualValues(t, s.expected, IncludesString(s.list, s.element)) - } -} - func TestNextIndex(t *testing.T) { type scenario struct { testName string @@ -169,26 +133,6 @@ func TestEscapeSpecialChars(t *testing.T) { } } -func TestUniq(t *testing.T) { - for _, test := range []struct { - values []string - want []string - }{ - { - values: []string{"a", "b", "c"}, - want: []string{"a", "b", "c"}, - }, - { - values: []string{"a", "b", "a", "b", "c"}, - want: []string{"a", "b", "c"}, - }, - } { - if got := Uniq(test.values); !assert.EqualValues(t, got, test.want) { - t.Errorf("Uniq(%v) = %v; want %v", test.values, got, test.want) - } - } -} - func TestLimit(t *testing.T) { for _, test := range []struct { values []string @@ -232,26 +176,6 @@ func TestLimit(t *testing.T) { } } -func TestReverse(t *testing.T) { - for _, test := range []struct { - values []string - want []string - }{ - { - values: []string{"a", "b", "c"}, - want: []string{"c", "b", "a"}, - }, - { - values: []string{}, - want: []string{}, - }, - } { - if got := Reverse(test.values); !assert.EqualValues(t, got, test.want) { - t.Errorf("Reverse(%v) = %v; want %v", test.values, got, test.want) - } - } -} - func TestLimitStr(t *testing.T) { for _, test := range []struct { values string diff --git a/pkg/utils/string_stack.go b/pkg/utils/string_stack.go new file mode 100644 index 000000000..c2d18c70c --- /dev/null +++ b/pkg/utils/string_stack.go @@ -0,0 +1,27 @@ +package utils + +type StringStack struct { + stack []string +} + +func (self *StringStack) Push(s string) { + self.stack = append(self.stack, s) +} + +func (self *StringStack) Pop() string { + if len(self.stack) == 0 { + return "" + } + n := len(self.stack) - 1 + last := self.stack[n] + self.stack = self.stack[:n] + return last +} + +func (self *StringStack) IsEmpty() bool { + return len(self.stack) == 0 +} + +func (self *StringStack) Clear() { + self.stack = []string{} +} diff --git a/pkg/utils/utils.go b/pkg/utils/utils.go index c9d64c30e..9d6213c1d 100644 --- a/pkg/utils/utils.go +++ b/pkg/utils/utils.go @@ -59,6 +59,15 @@ func Max(x, y int) int { return y } +func Clamp(x int, min int, max int) int { + if x < min { + return min + } else if x > max { + return max + } + return x +} + func AsJson(i interface{}) string { bytes, _ := json.MarshalIndent(i, "", " ") return string(bytes) @@ -66,6 +75,10 @@ func AsJson(i interface{}) string { // used to keep a number n between 0 and max, allowing for wraparounds func ModuloWithWrap(n, max int) int { + if max == 0 { + return 0 + } + if n >= max { return n % max } else if n < 0 { @@ -115,3 +128,37 @@ func StackTrace() string { n := runtime.Stack(buf, false) return fmt.Sprintf("%s\n", buf[:n]) } + +// returns the path of the file that calls the function. +// 'skip' is the number of stack frames to skip. +func FilePath(skip int) string { + _, path, _, _ := runtime.Caller(skip) + return path +} + +// for our cheatsheet script and integration tests. Not to be confused with finding the +// root directory of _any_ random repo. +func GetLazygitRootDirectory() string { + path, err := os.Getwd() + if err != nil { + panic(err) + } + + for { + _, err := os.Stat(filepath.Join(path, ".git")) + + if err == nil { + return path + } + + if !os.IsNotExist(err) { + panic(err) + } + + path = filepath.Dir(path) + + if path == "/" { + log.Fatal("must run in lazygit folder or child folder") + } + } +} diff --git a/pkg/utils/utils_test.go b/pkg/utils/utils_test.go index 02aded559..4933cf073 100644 --- a/pkg/utils/utils_test.go +++ b/pkg/utils/utils_test.go @@ -87,3 +87,45 @@ func TestSafeTruncate(t *testing.T) { assert.EqualValues(t, s.expected, SafeTruncate(s.str, s.limit)) } } + +func TestModuloWithWrap(t *testing.T) { + type scenario struct { + n int + max int + expected int + } + + scenarios := []scenario{ + { + n: 0, + max: 0, + expected: 0, + }, + { + n: 0, + max: 1, + expected: 0, + }, + { + n: 1, + max: 0, + expected: 0, + }, + { + n: 3, + max: 2, + expected: 1, + }, + { + n: -1, + max: 2, + expected: 1, + }, + } + + for _, s := range scenarios { + if s.expected != ModuloWithWrap(s.n, s.max) { + t.Errorf("expected %d, got %d, for n: %d, max: %d", s.expected, ModuloWithWrap(s.n, s.max), s.n, s.max) + } + } +} diff --git a/scripts/bisect.sh b/scripts/bisect.sh index 0e5f404cb..a3bc5f19e 100755 --- a/scripts/bisect.sh +++ b/scripts/bisect.sh @@ -2,7 +2,7 @@ # How to use: # 1) find a commit that is working fine. -# 2) Create an integration test capturing the fact that it works (Don't commit it). See https://github.com/jesseduffield/lazygit/blob/master/docs/Integration_Tests.md +# 2) Create an integration test capturing the fact that it works (Don't commit it). See https://github.com/jesseduffield/lazygit/blob/master/pkg/integration/README.md # 3) checkout the commit that's known to be failing # 4) run this script supplying the commit sha / tag name that works and the name of the newly created test diff --git a/test.sh b/test.sh deleted file mode 100755 index 0a8d91e85..000000000 --- a/test.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env bash - -set -e -echo "" > coverage.txt - -export GOFLAGS=-mod=vendor - -use_go_test=false -if command -v gotest; then - use_go_test=true -fi - -for d in $( find ./* -maxdepth 10 ! -path "./vendor*" ! -path "./.git*" ! -path "./scripts*" -type d); do - if ls $d/*.go &> /dev/null; then - args="-race -coverprofile=profile.out -covermode=atomic $d" - if [ "$use_go_test" == true ]; then - gotest $args - else - go test $args - fi - if [ -f profile.out ]; then - cat profile.out >> coverage.txt - rm profile.out - fi - fi -done diff --git a/test/hooks/pre-push b/test/hooks/pre-push index b7cb2e87b..3b758c1b1 100644 --- a/test/hooks/pre-push +++ b/test/hooks/pre-push @@ -14,6 +14,8 @@ echo -n "Username for 'github': " read username echo -n "Password for 'github': " +# this will print the password to the log view but real git won't do that. +# We could use read -s but that's not POSIX compliant. read password if [ "$username" = "username" -a "$password" = "password" ]; then diff --git a/test/integration/bisect/expected/.git_keep/BISECT_ANCESTORS_OK b/test/integration/bisect/expected/repo/.git_keep/BISECT_ANCESTORS_OK similarity index 100% rename from test/integration/bisect/expected/.git_keep/BISECT_ANCESTORS_OK rename to test/integration/bisect/expected/repo/.git_keep/BISECT_ANCESTORS_OK diff --git a/test/integration/bisect/expected/.git_keep/BISECT_EXPECTED_REV b/test/integration/bisect/expected/repo/.git_keep/BISECT_EXPECTED_REV similarity index 100% rename from test/integration/bisect/expected/.git_keep/BISECT_EXPECTED_REV rename to test/integration/bisect/expected/repo/.git_keep/BISECT_EXPECTED_REV diff --git a/test/integration/bisect/expected/.git_keep/BISECT_LOG b/test/integration/bisect/expected/repo/.git_keep/BISECT_LOG similarity index 100% rename from test/integration/bisect/expected/.git_keep/BISECT_LOG rename to test/integration/bisect/expected/repo/.git_keep/BISECT_LOG diff --git a/test/integration/bisect/expected/.git_keep/BISECT_NAMES b/test/integration/bisect/expected/repo/.git_keep/BISECT_NAMES similarity index 100% rename from test/integration/bisect/expected/.git_keep/BISECT_NAMES rename to test/integration/bisect/expected/repo/.git_keep/BISECT_NAMES diff --git a/test/integration/bisect/expected/.git_keep/BISECT_START b/test/integration/bisect/expected/repo/.git_keep/BISECT_START similarity index 100% rename from test/integration/bisect/expected/.git_keep/BISECT_START rename to test/integration/bisect/expected/repo/.git_keep/BISECT_START diff --git a/test/integration/bisect/expected/.git_keep/BISECT_TERMS b/test/integration/bisect/expected/repo/.git_keep/BISECT_TERMS similarity index 100% rename from test/integration/bisect/expected/.git_keep/BISECT_TERMS rename to test/integration/bisect/expected/repo/.git_keep/BISECT_TERMS diff --git a/test/integration/bisect/expected/.git_keep/COMMIT_EDITMSG b/test/integration/bisect/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/bisect/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/bisect/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/bisect/expected/.git_keep/FETCH_HEAD b/test/integration/bisect/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/bisect/expected/.git_keep/FETCH_HEAD rename to test/integration/bisect/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/bisect/expected/.git_keep/HEAD b/test/integration/bisect/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/bisect/expected/.git_keep/HEAD rename to test/integration/bisect/expected/repo/.git_keep/HEAD diff --git a/test/integration/bisect/expected/.git_keep/config b/test/integration/bisect/expected/repo/.git_keep/config similarity index 100% rename from test/integration/bisect/expected/.git_keep/config rename to test/integration/bisect/expected/repo/.git_keep/config diff --git a/test/integration/bisect/expected/.git_keep/description b/test/integration/bisect/expected/repo/.git_keep/description similarity index 100% rename from test/integration/bisect/expected/.git_keep/description rename to test/integration/bisect/expected/repo/.git_keep/description diff --git a/test/integration/bisect/expected/.git_keep/index b/test/integration/bisect/expected/repo/.git_keep/index similarity index 100% rename from test/integration/bisect/expected/.git_keep/index rename to test/integration/bisect/expected/repo/.git_keep/index diff --git a/test/integration/bisect/expected/.git_keep/info/exclude b/test/integration/bisect/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/bisect/expected/.git_keep/info/exclude rename to test/integration/bisect/expected/repo/.git_keep/info/exclude diff --git a/test/integration/bisect/expected/.git_keep/logs/HEAD b/test/integration/bisect/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/bisect/expected/.git_keep/logs/HEAD rename to test/integration/bisect/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/bisect/expected/.git_keep/logs/refs/heads/master b/test/integration/bisect/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/bisect/expected/.git_keep/logs/refs/heads/master rename to test/integration/bisect/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/bisect/expected/.git_keep/logs/refs/heads/test b/test/integration/bisect/expected/repo/.git_keep/logs/refs/heads/test similarity index 100% rename from test/integration/bisect/expected/.git_keep/logs/refs/heads/test rename to test/integration/bisect/expected/repo/.git_keep/logs/refs/heads/test diff --git a/test/integration/bisect/expected/.git_keep/objects/00/5ca78c7fb8157683fa61158235b250d2316004 b/test/integration/bisect/expected/repo/.git_keep/objects/00/5ca78c7fb8157683fa61158235b250d2316004 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/00/5ca78c7fb8157683fa61158235b250d2316004 rename to test/integration/bisect/expected/repo/.git_keep/objects/00/5ca78c7fb8157683fa61158235b250d2316004 diff --git a/test/integration/bisect/expected/.git_keep/objects/00/750edc07d6415dcc07ae0351e9397b0222b7ba b/test/integration/bisect/expected/repo/.git_keep/objects/00/750edc07d6415dcc07ae0351e9397b0222b7ba similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/00/750edc07d6415dcc07ae0351e9397b0222b7ba rename to test/integration/bisect/expected/repo/.git_keep/objects/00/750edc07d6415dcc07ae0351e9397b0222b7ba diff --git a/test/integration/bisect/expected/.git_keep/objects/05/4bdf969fdcf1f90f1998666f628d40f72fde4f b/test/integration/bisect/expected/repo/.git_keep/objects/05/4bdf969fdcf1f90f1998666f628d40f72fde4f similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/05/4bdf969fdcf1f90f1998666f628d40f72fde4f rename to test/integration/bisect/expected/repo/.git_keep/objects/05/4bdf969fdcf1f90f1998666f628d40f72fde4f diff --git a/test/integration/bisect/expected/.git_keep/objects/07/552205114379b7c1abd7cb39575cb7a30a2e8c b/test/integration/bisect/expected/repo/.git_keep/objects/07/552205114379b7c1abd7cb39575cb7a30a2e8c similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/07/552205114379b7c1abd7cb39575cb7a30a2e8c rename to test/integration/bisect/expected/repo/.git_keep/objects/07/552205114379b7c1abd7cb39575cb7a30a2e8c diff --git a/test/integration/bisect/expected/.git_keep/objects/0c/fbf08886fca9a91cb753ec8734c84fcbe52c9f b/test/integration/bisect/expected/repo/.git_keep/objects/0c/fbf08886fca9a91cb753ec8734c84fcbe52c9f similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/0c/fbf08886fca9a91cb753ec8734c84fcbe52c9f rename to test/integration/bisect/expected/repo/.git_keep/objects/0c/fbf08886fca9a91cb753ec8734c84fcbe52c9f diff --git a/test/integration/bisect/expected/.git_keep/objects/11/0046b8d92b877def6cda61639cf8f37bc2829c b/test/integration/bisect/expected/repo/.git_keep/objects/11/0046b8d92b877def6cda61639cf8f37bc2829c similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/11/0046b8d92b877def6cda61639cf8f37bc2829c rename to test/integration/bisect/expected/repo/.git_keep/objects/11/0046b8d92b877def6cda61639cf8f37bc2829c diff --git a/test/integration/bisect/expected/.git_keep/objects/12/e46e3c37d1a43a26b909a346ecd2d97677c641 b/test/integration/bisect/expected/repo/.git_keep/objects/12/e46e3c37d1a43a26b909a346ecd2d97677c641 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/12/e46e3c37d1a43a26b909a346ecd2d97677c641 rename to test/integration/bisect/expected/repo/.git_keep/objects/12/e46e3c37d1a43a26b909a346ecd2d97677c641 diff --git a/test/integration/bisect/expected/.git_keep/objects/1b/01733c2b372c7b5544c7f2293c3b7341824112 b/test/integration/bisect/expected/repo/.git_keep/objects/1b/01733c2b372c7b5544c7f2293c3b7341824112 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/1b/01733c2b372c7b5544c7f2293c3b7341824112 rename to test/integration/bisect/expected/repo/.git_keep/objects/1b/01733c2b372c7b5544c7f2293c3b7341824112 diff --git a/test/integration/bisect/expected/.git_keep/objects/1e/8b314962144c26d5e0e50fd29d2ca327864913 b/test/integration/bisect/expected/repo/.git_keep/objects/1e/8b314962144c26d5e0e50fd29d2ca327864913 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/1e/8b314962144c26d5e0e50fd29d2ca327864913 rename to test/integration/bisect/expected/repo/.git_keep/objects/1e/8b314962144c26d5e0e50fd29d2ca327864913 diff --git a/test/integration/bisect/expected/.git_keep/objects/20/9e3ef4b6247ce746048d5711befda46206d235 b/test/integration/bisect/expected/repo/.git_keep/objects/20/9e3ef4b6247ce746048d5711befda46206d235 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/20/9e3ef4b6247ce746048d5711befda46206d235 rename to test/integration/bisect/expected/repo/.git_keep/objects/20/9e3ef4b6247ce746048d5711befda46206d235 diff --git a/test/integration/bisect/expected/.git_keep/objects/26/7465454f74736bbe5b493c7f69dd3d024e26e5 b/test/integration/bisect/expected/repo/.git_keep/objects/26/7465454f74736bbe5b493c7f69dd3d024e26e5 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/26/7465454f74736bbe5b493c7f69dd3d024e26e5 rename to test/integration/bisect/expected/repo/.git_keep/objects/26/7465454f74736bbe5b493c7f69dd3d024e26e5 diff --git a/test/integration/bisect/expected/.git_keep/objects/32/e7b0308424a817ed5aa5bba94b06b72a1b8ce5 b/test/integration/bisect/expected/repo/.git_keep/objects/32/e7b0308424a817ed5aa5bba94b06b72a1b8ce5 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/32/e7b0308424a817ed5aa5bba94b06b72a1b8ce5 rename to test/integration/bisect/expected/repo/.git_keep/objects/32/e7b0308424a817ed5aa5bba94b06b72a1b8ce5 diff --git a/test/integration/bisect/expected/.git_keep/objects/39/983ea412adebe6c5a3d4451a7673cf0962c472 b/test/integration/bisect/expected/repo/.git_keep/objects/39/983ea412adebe6c5a3d4451a7673cf0962c472 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/39/983ea412adebe6c5a3d4451a7673cf0962c472 rename to test/integration/bisect/expected/repo/.git_keep/objects/39/983ea412adebe6c5a3d4451a7673cf0962c472 diff --git a/test/integration/bisect/expected/.git_keep/objects/3c/032078a4a21c5c51d3c93d91717c1dabbb8cd0 b/test/integration/bisect/expected/repo/.git_keep/objects/3c/032078a4a21c5c51d3c93d91717c1dabbb8cd0 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/3c/032078a4a21c5c51d3c93d91717c1dabbb8cd0 rename to test/integration/bisect/expected/repo/.git_keep/objects/3c/032078a4a21c5c51d3c93d91717c1dabbb8cd0 diff --git a/test/integration/bisect/expected/.git_keep/objects/3e/02ce90348f3386128ebb2972515fb1a3788818 b/test/integration/bisect/expected/repo/.git_keep/objects/3e/02ce90348f3386128ebb2972515fb1a3788818 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/3e/02ce90348f3386128ebb2972515fb1a3788818 rename to test/integration/bisect/expected/repo/.git_keep/objects/3e/02ce90348f3386128ebb2972515fb1a3788818 diff --git a/test/integration/bisect/expected/.git_keep/objects/3f/f8b0f3820fd2eb3da53a5b803f94caf30dc2ab b/test/integration/bisect/expected/repo/.git_keep/objects/3f/f8b0f3820fd2eb3da53a5b803f94caf30dc2ab similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/3f/f8b0f3820fd2eb3da53a5b803f94caf30dc2ab rename to test/integration/bisect/expected/repo/.git_keep/objects/3f/f8b0f3820fd2eb3da53a5b803f94caf30dc2ab diff --git a/test/integration/bisect/expected/.git_keep/objects/43/78c740dfa0de7a973216b54b99c45a3c03f83c b/test/integration/bisect/expected/repo/.git_keep/objects/43/78c740dfa0de7a973216b54b99c45a3c03f83c similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/43/78c740dfa0de7a973216b54b99c45a3c03f83c rename to test/integration/bisect/expected/repo/.git_keep/objects/43/78c740dfa0de7a973216b54b99c45a3c03f83c diff --git a/test/integration/bisect/expected/.git_keep/objects/45/a4fb75db864000d01701c0f7a51864bd4daabf b/test/integration/bisect/expected/repo/.git_keep/objects/45/a4fb75db864000d01701c0f7a51864bd4daabf similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/45/a4fb75db864000d01701c0f7a51864bd4daabf rename to test/integration/bisect/expected/repo/.git_keep/objects/45/a4fb75db864000d01701c0f7a51864bd4daabf diff --git a/test/integration/bisect/expected/.git_keep/objects/47/8a007451b33c7a234c60f0d13b164561b29094 b/test/integration/bisect/expected/repo/.git_keep/objects/47/8a007451b33c7a234c60f0d13b164561b29094 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/47/8a007451b33c7a234c60f0d13b164561b29094 rename to test/integration/bisect/expected/repo/.git_keep/objects/47/8a007451b33c7a234c60f0d13b164561b29094 diff --git a/test/integration/bisect/expected/.git_keep/objects/48/082f72f087ce7e6fa75b9c41d7387daecd447b b/test/integration/bisect/expected/repo/.git_keep/objects/48/082f72f087ce7e6fa75b9c41d7387daecd447b similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/48/082f72f087ce7e6fa75b9c41d7387daecd447b rename to test/integration/bisect/expected/repo/.git_keep/objects/48/082f72f087ce7e6fa75b9c41d7387daecd447b diff --git a/test/integration/bisect/expected/.git_keep/objects/4b/65d66c089cd4f6bfa69dff2d7ba4c27337cd23 b/test/integration/bisect/expected/repo/.git_keep/objects/4b/65d66c089cd4f6bfa69dff2d7ba4c27337cd23 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/4b/65d66c089cd4f6bfa69dff2d7ba4c27337cd23 rename to test/integration/bisect/expected/repo/.git_keep/objects/4b/65d66c089cd4f6bfa69dff2d7ba4c27337cd23 diff --git a/test/integration/bisect/expected/.git_keep/objects/54/3c0ef66d928051f16f8b9d7d33d6c4ea1f4e4f b/test/integration/bisect/expected/repo/.git_keep/objects/54/3c0ef66d928051f16f8b9d7d33d6c4ea1f4e4f similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/54/3c0ef66d928051f16f8b9d7d33d6c4ea1f4e4f rename to test/integration/bisect/expected/repo/.git_keep/objects/54/3c0ef66d928051f16f8b9d7d33d6c4ea1f4e4f diff --git a/test/integration/bisect/expected/.git_keep/objects/5f/9397e5bcee1ac2a3fe6d834d42e36b74ef4ca8 b/test/integration/bisect/expected/repo/.git_keep/objects/5f/9397e5bcee1ac2a3fe6d834d42e36b74ef4ca8 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/5f/9397e5bcee1ac2a3fe6d834d42e36b74ef4ca8 rename to test/integration/bisect/expected/repo/.git_keep/objects/5f/9397e5bcee1ac2a3fe6d834d42e36b74ef4ca8 diff --git a/test/integration/bisect/expected/.git_keep/objects/60/d3b2f4a4cd5f1637eba020358bfe5ecb5edcf2 b/test/integration/bisect/expected/repo/.git_keep/objects/60/d3b2f4a4cd5f1637eba020358bfe5ecb5edcf2 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/60/d3b2f4a4cd5f1637eba020358bfe5ecb5edcf2 rename to test/integration/bisect/expected/repo/.git_keep/objects/60/d3b2f4a4cd5f1637eba020358bfe5ecb5edcf2 diff --git a/test/integration/bisect/expected/.git_keep/objects/66/19c0a1a3eb6449eb15ce6cd0916fec0e410c10 b/test/integration/bisect/expected/repo/.git_keep/objects/66/19c0a1a3eb6449eb15ce6cd0916fec0e410c10 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/66/19c0a1a3eb6449eb15ce6cd0916fec0e410c10 rename to test/integration/bisect/expected/repo/.git_keep/objects/66/19c0a1a3eb6449eb15ce6cd0916fec0e410c10 diff --git a/test/integration/bisect/expected/.git_keep/objects/67/fbfb3b74c2381ad1e058949231f2b4f0c8921f b/test/integration/bisect/expected/repo/.git_keep/objects/67/fbfb3b74c2381ad1e058949231f2b4f0c8921f similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/67/fbfb3b74c2381ad1e058949231f2b4f0c8921f rename to test/integration/bisect/expected/repo/.git_keep/objects/67/fbfb3b74c2381ad1e058949231f2b4f0c8921f diff --git a/test/integration/bisect/expected/.git_keep/objects/78/d41b2abbd2f52c1ebf2f496268a915d59eb27b b/test/integration/bisect/expected/repo/.git_keep/objects/78/d41b2abbd2f52c1ebf2f496268a915d59eb27b similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/78/d41b2abbd2f52c1ebf2f496268a915d59eb27b rename to test/integration/bisect/expected/repo/.git_keep/objects/78/d41b2abbd2f52c1ebf2f496268a915d59eb27b diff --git a/test/integration/bisect/expected/.git_keep/objects/7e/d6ff82de6bcc2a78243fc9c54d3ef5ac14da69 b/test/integration/bisect/expected/repo/.git_keep/objects/7e/d6ff82de6bcc2a78243fc9c54d3ef5ac14da69 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/7e/d6ff82de6bcc2a78243fc9c54d3ef5ac14da69 rename to test/integration/bisect/expected/repo/.git_keep/objects/7e/d6ff82de6bcc2a78243fc9c54d3ef5ac14da69 diff --git a/test/integration/bisect/expected/.git_keep/objects/7f/8f011eb73d6043d2e6db9d2c101195ae2801f2 b/test/integration/bisect/expected/repo/.git_keep/objects/7f/8f011eb73d6043d2e6db9d2c101195ae2801f2 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/7f/8f011eb73d6043d2e6db9d2c101195ae2801f2 rename to test/integration/bisect/expected/repo/.git_keep/objects/7f/8f011eb73d6043d2e6db9d2c101195ae2801f2 diff --git a/test/integration/bisect/expected/.git_keep/objects/80/eeef1a7c49b376f3373ea26c6ba44d69d90d9c b/test/integration/bisect/expected/repo/.git_keep/objects/80/eeef1a7c49b376f3373ea26c6ba44d69d90d9c similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/80/eeef1a7c49b376f3373ea26c6ba44d69d90d9c rename to test/integration/bisect/expected/repo/.git_keep/objects/80/eeef1a7c49b376f3373ea26c6ba44d69d90d9c diff --git a/test/integration/bisect/expected/.git_keep/objects/82/d721eb037f7045056023d0904989781ce1f526 b/test/integration/bisect/expected/repo/.git_keep/objects/82/d721eb037f7045056023d0904989781ce1f526 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/82/d721eb037f7045056023d0904989781ce1f526 rename to test/integration/bisect/expected/repo/.git_keep/objects/82/d721eb037f7045056023d0904989781ce1f526 diff --git a/test/integration/bisect/expected/.git_keep/objects/83/51c19397f4fcd5238d10034fa7fa384f14d580 b/test/integration/bisect/expected/repo/.git_keep/objects/83/51c19397f4fcd5238d10034fa7fa384f14d580 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/83/51c19397f4fcd5238d10034fa7fa384f14d580 rename to test/integration/bisect/expected/repo/.git_keep/objects/83/51c19397f4fcd5238d10034fa7fa384f14d580 diff --git a/test/integration/bisect/expected/.git_keep/objects/91/36f315e5952043f1e7ecdc0d28c208eaeaed71 b/test/integration/bisect/expected/repo/.git_keep/objects/91/36f315e5952043f1e7ecdc0d28c208eaeaed71 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/91/36f315e5952043f1e7ecdc0d28c208eaeaed71 rename to test/integration/bisect/expected/repo/.git_keep/objects/91/36f315e5952043f1e7ecdc0d28c208eaeaed71 diff --git a/test/integration/bisect/expected/.git_keep/objects/96/202a92c1d3bde1b20d6f3dec8e742d09732b4d b/test/integration/bisect/expected/repo/.git_keep/objects/96/202a92c1d3bde1b20d6f3dec8e742d09732b4d similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/96/202a92c1d3bde1b20d6f3dec8e742d09732b4d rename to test/integration/bisect/expected/repo/.git_keep/objects/96/202a92c1d3bde1b20d6f3dec8e742d09732b4d diff --git a/test/integration/bisect/expected/.git_keep/objects/98/d9bcb75a685dfbfd60f611c309410152935b3d b/test/integration/bisect/expected/repo/.git_keep/objects/98/d9bcb75a685dfbfd60f611c309410152935b3d similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/98/d9bcb75a685dfbfd60f611c309410152935b3d rename to test/integration/bisect/expected/repo/.git_keep/objects/98/d9bcb75a685dfbfd60f611c309410152935b3d diff --git a/test/integration/bisect/expected/.git_keep/objects/ae/95e9aa3b8881aedb7a526c86ec5d60f371ca6c b/test/integration/bisect/expected/repo/.git_keep/objects/ae/95e9aa3b8881aedb7a526c86ec5d60f371ca6c similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/ae/95e9aa3b8881aedb7a526c86ec5d60f371ca6c rename to test/integration/bisect/expected/repo/.git_keep/objects/ae/95e9aa3b8881aedb7a526c86ec5d60f371ca6c diff --git a/test/integration/bisect/expected/.git_keep/objects/af/f6316148f1524977997c486bcfe624c9094c4e b/test/integration/bisect/expected/repo/.git_keep/objects/af/f6316148f1524977997c486bcfe624c9094c4e similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/af/f6316148f1524977997c486bcfe624c9094c4e rename to test/integration/bisect/expected/repo/.git_keep/objects/af/f6316148f1524977997c486bcfe624c9094c4e diff --git a/test/integration/bisect/expected/.git_keep/objects/b1/bd38b62a0800a4f6a80c34e21c5acffae52c7e b/test/integration/bisect/expected/repo/.git_keep/objects/b1/bd38b62a0800a4f6a80c34e21c5acffae52c7e similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/b1/bd38b62a0800a4f6a80c34e21c5acffae52c7e rename to test/integration/bisect/expected/repo/.git_keep/objects/b1/bd38b62a0800a4f6a80c34e21c5acffae52c7e diff --git a/test/integration/bisect/expected/.git_keep/objects/b4/de3947675361a7770d29b8982c407b0ec6b2a0 b/test/integration/bisect/expected/repo/.git_keep/objects/b4/de3947675361a7770d29b8982c407b0ec6b2a0 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/b4/de3947675361a7770d29b8982c407b0ec6b2a0 rename to test/integration/bisect/expected/repo/.git_keep/objects/b4/de3947675361a7770d29b8982c407b0ec6b2a0 diff --git a/test/integration/bisect/expected/.git_keep/objects/b5/31696093a6482eca9ad4bcab63407172225b93 b/test/integration/bisect/expected/repo/.git_keep/objects/b5/31696093a6482eca9ad4bcab63407172225b93 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/b5/31696093a6482eca9ad4bcab63407172225b93 rename to test/integration/bisect/expected/repo/.git_keep/objects/b5/31696093a6482eca9ad4bcab63407172225b93 diff --git a/test/integration/bisect/expected/.git_keep/objects/b6/a7d89c68e0ca66e96a9a51892cc33db66fb8a3 b/test/integration/bisect/expected/repo/.git_keep/objects/b6/a7d89c68e0ca66e96a9a51892cc33db66fb8a3 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/b6/a7d89c68e0ca66e96a9a51892cc33db66fb8a3 rename to test/integration/bisect/expected/repo/.git_keep/objects/b6/a7d89c68e0ca66e96a9a51892cc33db66fb8a3 diff --git a/test/integration/bisect/expected/.git_keep/objects/b8/626c4cff2849624fb67f87cd0ad72b163671ad b/test/integration/bisect/expected/repo/.git_keep/objects/b8/626c4cff2849624fb67f87cd0ad72b163671ad similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/b8/626c4cff2849624fb67f87cd0ad72b163671ad rename to test/integration/bisect/expected/repo/.git_keep/objects/b8/626c4cff2849624fb67f87cd0ad72b163671ad diff --git a/test/integration/bisect/expected/.git_keep/objects/b9/7844c9437a4ab69c8165cadd97bc597b43135b b/test/integration/bisect/expected/repo/.git_keep/objects/b9/7844c9437a4ab69c8165cadd97bc597b43135b similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/b9/7844c9437a4ab69c8165cadd97bc597b43135b rename to test/integration/bisect/expected/repo/.git_keep/objects/b9/7844c9437a4ab69c8165cadd97bc597b43135b diff --git a/test/integration/bisect/expected/.git_keep/objects/ba/8e7277a0ee7cdf84cd5c6138057adb85947a90 b/test/integration/bisect/expected/repo/.git_keep/objects/ba/8e7277a0ee7cdf84cd5c6138057adb85947a90 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/ba/8e7277a0ee7cdf84cd5c6138057adb85947a90 rename to test/integration/bisect/expected/repo/.git_keep/objects/ba/8e7277a0ee7cdf84cd5c6138057adb85947a90 diff --git a/test/integration/bisect/expected/.git_keep/objects/bc/21c8fabc28201fab6c60503168ecda25ad8626 b/test/integration/bisect/expected/repo/.git_keep/objects/bc/21c8fabc28201fab6c60503168ecda25ad8626 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/bc/21c8fabc28201fab6c60503168ecda25ad8626 rename to test/integration/bisect/expected/repo/.git_keep/objects/bc/21c8fabc28201fab6c60503168ecda25ad8626 diff --git a/test/integration/bisect/expected/.git_keep/objects/d0/0491fd7e5bb6fa28c517a0bb32b8b506539d4d b/test/integration/bisect/expected/repo/.git_keep/objects/d0/0491fd7e5bb6fa28c517a0bb32b8b506539d4d similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/d0/0491fd7e5bb6fa28c517a0bb32b8b506539d4d rename to test/integration/bisect/expected/repo/.git_keep/objects/d0/0491fd7e5bb6fa28c517a0bb32b8b506539d4d diff --git a/test/integration/bisect/expected/.git_keep/objects/d1/f7a85555fe6f10dd44754d35459ae741cb107c b/test/integration/bisect/expected/repo/.git_keep/objects/d1/f7a85555fe6f10dd44754d35459ae741cb107c similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/d1/f7a85555fe6f10dd44754d35459ae741cb107c rename to test/integration/bisect/expected/repo/.git_keep/objects/d1/f7a85555fe6f10dd44754d35459ae741cb107c diff --git a/test/integration/bisect/expected/.git_keep/objects/d5/42aa84743f8ba1380358d4009408f03dbfb247 b/test/integration/bisect/expected/repo/.git_keep/objects/d5/42aa84743f8ba1380358d4009408f03dbfb247 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/d5/42aa84743f8ba1380358d4009408f03dbfb247 rename to test/integration/bisect/expected/repo/.git_keep/objects/d5/42aa84743f8ba1380358d4009408f03dbfb247 diff --git a/test/integration/bisect/expected/.git_keep/objects/d6/b24041cf04154f8f902651969675021f4d93a5 b/test/integration/bisect/expected/repo/.git_keep/objects/d6/b24041cf04154f8f902651969675021f4d93a5 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/d6/b24041cf04154f8f902651969675021f4d93a5 rename to test/integration/bisect/expected/repo/.git_keep/objects/d6/b24041cf04154f8f902651969675021f4d93a5 diff --git a/test/integration/bisect/expected/.git_keep/objects/d9/328d9b2c9536fdf01641dd03f4a254d2c86601 b/test/integration/bisect/expected/repo/.git_keep/objects/d9/328d9b2c9536fdf01641dd03f4a254d2c86601 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/d9/328d9b2c9536fdf01641dd03f4a254d2c86601 rename to test/integration/bisect/expected/repo/.git_keep/objects/d9/328d9b2c9536fdf01641dd03f4a254d2c86601 diff --git a/test/integration/bisect/expected/.git_keep/objects/d9/cc608eedd5d2cc63c262272b7a0f6ab6aed5dd b/test/integration/bisect/expected/repo/.git_keep/objects/d9/cc608eedd5d2cc63c262272b7a0f6ab6aed5dd similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/d9/cc608eedd5d2cc63c262272b7a0f6ab6aed5dd rename to test/integration/bisect/expected/repo/.git_keep/objects/d9/cc608eedd5d2cc63c262272b7a0f6ab6aed5dd diff --git a/test/integration/bisect/expected/.git_keep/objects/db/b21289ee21b2ff0f3de2bc7d00038b30c4e353 b/test/integration/bisect/expected/repo/.git_keep/objects/db/b21289ee21b2ff0f3de2bc7d00038b30c4e353 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/db/b21289ee21b2ff0f3de2bc7d00038b30c4e353 rename to test/integration/bisect/expected/repo/.git_keep/objects/db/b21289ee21b2ff0f3de2bc7d00038b30c4e353 diff --git a/test/integration/bisect/expected/.git_keep/objects/e5/9bbaffe94b06acaadab4245f30ff3e11c66e5b b/test/integration/bisect/expected/repo/.git_keep/objects/e5/9bbaffe94b06acaadab4245f30ff3e11c66e5b similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/e5/9bbaffe94b06acaadab4245f30ff3e11c66e5b rename to test/integration/bisect/expected/repo/.git_keep/objects/e5/9bbaffe94b06acaadab4245f30ff3e11c66e5b diff --git a/test/integration/bisect/expected/.git_keep/objects/e9/27f0f9467e772eea36f24053c9b534303b106a b/test/integration/bisect/expected/repo/.git_keep/objects/e9/27f0f9467e772eea36f24053c9b534303b106a similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/e9/27f0f9467e772eea36f24053c9b534303b106a rename to test/integration/bisect/expected/repo/.git_keep/objects/e9/27f0f9467e772eea36f24053c9b534303b106a diff --git a/test/integration/bisect/expected/.git_keep/objects/e9/d2f825e793bc9ac2be698348dbe669bad34cad b/test/integration/bisect/expected/repo/.git_keep/objects/e9/d2f825e793bc9ac2be698348dbe669bad34cad similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/e9/d2f825e793bc9ac2be698348dbe669bad34cad rename to test/integration/bisect/expected/repo/.git_keep/objects/e9/d2f825e793bc9ac2be698348dbe669bad34cad diff --git a/test/integration/bisect/expected/.git_keep/objects/ea/684d3f868c358400465f2ec16a640c319ea6a3 b/test/integration/bisect/expected/repo/.git_keep/objects/ea/684d3f868c358400465f2ec16a640c319ea6a3 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/ea/684d3f868c358400465f2ec16a640c319ea6a3 rename to test/integration/bisect/expected/repo/.git_keep/objects/ea/684d3f868c358400465f2ec16a640c319ea6a3 diff --git a/test/integration/bisect/expected/.git_keep/objects/eb/e59a71e9750e75fb983f241687cdf7f0c8ce94 b/test/integration/bisect/expected/repo/.git_keep/objects/eb/e59a71e9750e75fb983f241687cdf7f0c8ce94 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/eb/e59a71e9750e75fb983f241687cdf7f0c8ce94 rename to test/integration/bisect/expected/repo/.git_keep/objects/eb/e59a71e9750e75fb983f241687cdf7f0c8ce94 diff --git a/test/integration/bisect/expected/.git_keep/objects/ec/635144f60048986bc560c5576355344005e6e7 b/test/integration/bisect/expected/repo/.git_keep/objects/ec/635144f60048986bc560c5576355344005e6e7 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/ec/635144f60048986bc560c5576355344005e6e7 rename to test/integration/bisect/expected/repo/.git_keep/objects/ec/635144f60048986bc560c5576355344005e6e7 diff --git a/test/integration/bisect/expected/.git_keep/objects/f2/7c6ae26adb8396d3861976ba268f87ad8afa0b b/test/integration/bisect/expected/repo/.git_keep/objects/f2/7c6ae26adb8396d3861976ba268f87ad8afa0b similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/f2/7c6ae26adb8396d3861976ba268f87ad8afa0b rename to test/integration/bisect/expected/repo/.git_keep/objects/f2/7c6ae26adb8396d3861976ba268f87ad8afa0b diff --git a/test/integration/bisect/expected/.git_keep/objects/f5/99e28b8ab0d8c9c57a486c89c4a5132dcbd3b2 b/test/integration/bisect/expected/repo/.git_keep/objects/f5/99e28b8ab0d8c9c57a486c89c4a5132dcbd3b2 similarity index 100% rename from test/integration/bisect/expected/.git_keep/objects/f5/99e28b8ab0d8c9c57a486c89c4a5132dcbd3b2 rename to test/integration/bisect/expected/repo/.git_keep/objects/f5/99e28b8ab0d8c9c57a486c89c4a5132dcbd3b2 diff --git a/test/integration/bisect/expected/.git_keep/packed-refs b/test/integration/bisect/expected/repo/.git_keep/packed-refs similarity index 100% rename from test/integration/bisect/expected/.git_keep/packed-refs rename to test/integration/bisect/expected/repo/.git_keep/packed-refs diff --git a/test/integration/bisect/expected/.git_keep/refs/bisect/bad b/test/integration/bisect/expected/repo/.git_keep/refs/bisect/bad similarity index 100% rename from test/integration/bisect/expected/.git_keep/refs/bisect/bad rename to test/integration/bisect/expected/repo/.git_keep/refs/bisect/bad diff --git a/test/integration/bisect/expected/.git_keep/refs/bisect/good-39983ea412adebe6c5a3d4451a7673cf0962c472 b/test/integration/bisect/expected/repo/.git_keep/refs/bisect/good-39983ea412adebe6c5a3d4451a7673cf0962c472 similarity index 100% rename from test/integration/bisect/expected/.git_keep/refs/bisect/good-39983ea412adebe6c5a3d4451a7673cf0962c472 rename to test/integration/bisect/expected/repo/.git_keep/refs/bisect/good-39983ea412adebe6c5a3d4451a7673cf0962c472 diff --git a/test/integration/bisect/expected/.git_keep/refs/bisect/good-67fbfb3b74c2381ad1e058949231f2b4f0c8921f b/test/integration/bisect/expected/repo/.git_keep/refs/bisect/good-67fbfb3b74c2381ad1e058949231f2b4f0c8921f similarity index 100% rename from test/integration/bisect/expected/.git_keep/refs/bisect/good-67fbfb3b74c2381ad1e058949231f2b4f0c8921f rename to test/integration/bisect/expected/repo/.git_keep/refs/bisect/good-67fbfb3b74c2381ad1e058949231f2b4f0c8921f diff --git a/test/integration/bisect/expected/.git_keep/refs/bisect/good-e927f0f9467e772eea36f24053c9b534303b106a b/test/integration/bisect/expected/repo/.git_keep/refs/bisect/good-e927f0f9467e772eea36f24053c9b534303b106a similarity index 100% rename from test/integration/bisect/expected/.git_keep/refs/bisect/good-e927f0f9467e772eea36f24053c9b534303b106a rename to test/integration/bisect/expected/repo/.git_keep/refs/bisect/good-e927f0f9467e772eea36f24053c9b534303b106a diff --git a/test/integration/bisect/expected/.git_keep/refs/bisect/good-e9d2f825e793bc9ac2be698348dbe669bad34cad b/test/integration/bisect/expected/repo/.git_keep/refs/bisect/good-e9d2f825e793bc9ac2be698348dbe669bad34cad similarity index 100% rename from test/integration/bisect/expected/.git_keep/refs/bisect/good-e9d2f825e793bc9ac2be698348dbe669bad34cad rename to test/integration/bisect/expected/repo/.git_keep/refs/bisect/good-e9d2f825e793bc9ac2be698348dbe669bad34cad diff --git a/test/integration/bisect/expected/.git_keep/refs/bisect/skip-bc21c8fabc28201fab6c60503168ecda25ad8626 b/test/integration/bisect/expected/repo/.git_keep/refs/bisect/skip-bc21c8fabc28201fab6c60503168ecda25ad8626 similarity index 100% rename from test/integration/bisect/expected/.git_keep/refs/bisect/skip-bc21c8fabc28201fab6c60503168ecda25ad8626 rename to test/integration/bisect/expected/repo/.git_keep/refs/bisect/skip-bc21c8fabc28201fab6c60503168ecda25ad8626 diff --git a/test/integration/bisect/expected/.git_keep/refs/bisect/skip-d1f7a85555fe6f10dd44754d35459ae741cb107c b/test/integration/bisect/expected/repo/.git_keep/refs/bisect/skip-d1f7a85555fe6f10dd44754d35459ae741cb107c similarity index 100% rename from test/integration/bisect/expected/.git_keep/refs/bisect/skip-d1f7a85555fe6f10dd44754d35459ae741cb107c rename to test/integration/bisect/expected/repo/.git_keep/refs/bisect/skip-d1f7a85555fe6f10dd44754d35459ae741cb107c diff --git a/test/integration/bisect/expected/.git_keep/refs/heads/master b/test/integration/bisect/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/bisect/expected/.git_keep/refs/heads/master rename to test/integration/bisect/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/bisect/expected/.git_keep/refs/heads/test b/test/integration/bisect/expected/repo/.git_keep/refs/heads/test similarity index 100% rename from test/integration/bisect/expected/.git_keep/refs/heads/test rename to test/integration/bisect/expected/repo/.git_keep/refs/heads/test diff --git a/test/integration/bisect/expected/file b/test/integration/bisect/expected/repo/file similarity index 100% rename from test/integration/bisect/expected/file rename to test/integration/bisect/expected/repo/file diff --git a/test/integration/bisect/test.json b/test/integration/bisect/test.json index 2bf2b418b..58263936d 100644 --- a/test/integration/bisect/test.json +++ b/test/integration/bisect/test.json @@ -1,4 +1,5 @@ { "description": "Basic git bisect usage", - "speed": 5 + "speed": 5, + "skip": true } diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/BISECT_ANCESTORS_OK b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/BISECT_ANCESTORS_OK similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/BISECT_ANCESTORS_OK rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/BISECT_ANCESTORS_OK diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/BISECT_EXPECTED_REV b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/BISECT_EXPECTED_REV similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/BISECT_EXPECTED_REV rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/BISECT_EXPECTED_REV diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/BISECT_LOG b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/BISECT_LOG similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/BISECT_LOG rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/BISECT_LOG diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/BISECT_NAMES b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/BISECT_NAMES similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/BISECT_NAMES rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/BISECT_NAMES diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/BISECT_START b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/BISECT_START similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/BISECT_START rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/BISECT_START diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/BISECT_TERMS b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/BISECT_TERMS similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/BISECT_TERMS rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/BISECT_TERMS diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/COMMIT_EDITMSG b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/FETCH_HEAD b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/FETCH_HEAD rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/HEAD b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/HEAD rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/HEAD diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/config b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/config similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/config rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/config diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/description b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/description similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/description rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/description diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/index b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/index similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/index rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/index diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/info/exclude b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/info/exclude rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/info/exclude diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/logs/HEAD b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/logs/HEAD rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/logs/refs/heads/master b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/logs/refs/heads/master rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/logs/refs/heads/other b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/logs/refs/heads/other similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/logs/refs/heads/other rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/logs/refs/heads/other diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/logs/refs/heads/test b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/logs/refs/heads/test similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/logs/refs/heads/test rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/logs/refs/heads/test diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/00/750edc07d6415dcc07ae0351e9397b0222b7ba b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/00/750edc07d6415dcc07ae0351e9397b0222b7ba similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/00/750edc07d6415dcc07ae0351e9397b0222b7ba rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/00/750edc07d6415dcc07ae0351e9397b0222b7ba diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/03/ecdaa424af1fdaeab1bd1852319652b9518f11 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/03/ecdaa424af1fdaeab1bd1852319652b9518f11 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/03/ecdaa424af1fdaeab1bd1852319652b9518f11 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/03/ecdaa424af1fdaeab1bd1852319652b9518f11 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/04/a577be2858b8024716876aefe6b665a98e1e4f b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/04/a577be2858b8024716876aefe6b665a98e1e4f similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/04/a577be2858b8024716876aefe6b665a98e1e4f rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/04/a577be2858b8024716876aefe6b665a98e1e4f diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/05/57fc43da38567eae00831e9b385fd2cad22643 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/05/57fc43da38567eae00831e9b385fd2cad22643 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/05/57fc43da38567eae00831e9b385fd2cad22643 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/05/57fc43da38567eae00831e9b385fd2cad22643 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/0c/fbf08886fca9a91cb753ec8734c84fcbe52c9f b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/0c/fbf08886fca9a91cb753ec8734c84fcbe52c9f similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/0c/fbf08886fca9a91cb753ec8734c84fcbe52c9f rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/0c/fbf08886fca9a91cb753ec8734c84fcbe52c9f diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/0d/1bbe8d012c8c070167a006a4898b525cfbd930 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/0d/1bbe8d012c8c070167a006a4898b525cfbd930 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/0d/1bbe8d012c8c070167a006a4898b525cfbd930 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/0d/1bbe8d012c8c070167a006a4898b525cfbd930 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/0f/373801691c466240bd131d28b2168712b045ba b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/0f/373801691c466240bd131d28b2168712b045ba similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/0f/373801691c466240bd131d28b2168712b045ba rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/0f/373801691c466240bd131d28b2168712b045ba diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/10/e171beacb963e4f8a4dc1d80fd291c135902bb b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/10/e171beacb963e4f8a4dc1d80fd291c135902bb similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/10/e171beacb963e4f8a4dc1d80fd291c135902bb rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/10/e171beacb963e4f8a4dc1d80fd291c135902bb diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/11/e4fd4011c9ed3800bb33b85580dd1d09f6aefd b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/11/e4fd4011c9ed3800bb33b85580dd1d09f6aefd similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/11/e4fd4011c9ed3800bb33b85580dd1d09f6aefd rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/11/e4fd4011c9ed3800bb33b85580dd1d09f6aefd diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/15/d4c5b8608fe472fd224333e60d44ea826cc80e b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/15/d4c5b8608fe472fd224333e60d44ea826cc80e similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/15/d4c5b8608fe472fd224333e60d44ea826cc80e rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/15/d4c5b8608fe472fd224333e60d44ea826cc80e diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/1a/35564b85e24c96e647b477aaf8d35dcf0de84d b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/1a/35564b85e24c96e647b477aaf8d35dcf0de84d similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/1a/35564b85e24c96e647b477aaf8d35dcf0de84d rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/1a/35564b85e24c96e647b477aaf8d35dcf0de84d diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/1a/b342c03b4226cca1c751dba71fa2df0e7d82ee b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/1a/b342c03b4226cca1c751dba71fa2df0e7d82ee similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/1a/b342c03b4226cca1c751dba71fa2df0e7d82ee rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/1a/b342c03b4226cca1c751dba71fa2df0e7d82ee diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/1e/8b314962144c26d5e0e50fd29d2ca327864913 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/1e/8b314962144c26d5e0e50fd29d2ca327864913 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/1e/8b314962144c26d5e0e50fd29d2ca327864913 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/1e/8b314962144c26d5e0e50fd29d2ca327864913 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/20/9e3ef4b6247ce746048d5711befda46206d235 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/20/9e3ef4b6247ce746048d5711befda46206d235 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/20/9e3ef4b6247ce746048d5711befda46206d235 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/20/9e3ef4b6247ce746048d5711befda46206d235 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/26/661287266e53bda69d8daa3aac1f714650f13c b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/26/661287266e53bda69d8daa3aac1f714650f13c similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/26/661287266e53bda69d8daa3aac1f714650f13c rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/26/661287266e53bda69d8daa3aac1f714650f13c diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/30/68d0d730547aaa5b86dbfe638db83133ae1421 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/30/68d0d730547aaa5b86dbfe638db83133ae1421 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/30/68d0d730547aaa5b86dbfe638db83133ae1421 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/30/68d0d730547aaa5b86dbfe638db83133ae1421 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/31/df6c951dc82b75b11bc48836e780134a16e6ad b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/31/df6c951dc82b75b11bc48836e780134a16e6ad similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/31/df6c951dc82b75b11bc48836e780134a16e6ad rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/31/df6c951dc82b75b11bc48836e780134a16e6ad diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/33/3ff293caf2d3216edf22e3f1df64d43a7e1311 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/33/3ff293caf2d3216edf22e3f1df64d43a7e1311 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/33/3ff293caf2d3216edf22e3f1df64d43a7e1311 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/33/3ff293caf2d3216edf22e3f1df64d43a7e1311 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/36/903784186b1b8b4a150dc656eccd49f94e114e b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/36/903784186b1b8b4a150dc656eccd49f94e114e similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/36/903784186b1b8b4a150dc656eccd49f94e114e rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/36/903784186b1b8b4a150dc656eccd49f94e114e diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/38/242e5215bc35b3e418c1d6d63fd0291001e10b b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/38/242e5215bc35b3e418c1d6d63fd0291001e10b similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/38/242e5215bc35b3e418c1d6d63fd0291001e10b rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/38/242e5215bc35b3e418c1d6d63fd0291001e10b diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/3a/05ed1ca9671bc362c7197eb09bddff040c9110 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/3a/05ed1ca9671bc362c7197eb09bddff040c9110 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/3a/05ed1ca9671bc362c7197eb09bddff040c9110 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/3a/05ed1ca9671bc362c7197eb09bddff040c9110 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/3b/e94d6b1b1b3b63db9e412b2e788d08979bc176 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/3b/e94d6b1b1b3b63db9e412b2e788d08979bc176 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/3b/e94d6b1b1b3b63db9e412b2e788d08979bc176 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/3b/e94d6b1b1b3b63db9e412b2e788d08979bc176 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/3c/032078a4a21c5c51d3c93d91717c1dabbb8cd0 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/3c/032078a4a21c5c51d3c93d91717c1dabbb8cd0 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/3c/032078a4a21c5c51d3c93d91717c1dabbb8cd0 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/3c/032078a4a21c5c51d3c93d91717c1dabbb8cd0 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/3f/bb9e626d4b7d30e58346b3eefaa342b15ab776 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/3f/bb9e626d4b7d30e58346b3eefaa342b15ab776 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/3f/bb9e626d4b7d30e58346b3eefaa342b15ab776 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/3f/bb9e626d4b7d30e58346b3eefaa342b15ab776 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/3f/d9ad29c185eac6106cfa005a3aa594e21b9e06 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/3f/d9ad29c185eac6106cfa005a3aa594e21b9e06 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/3f/d9ad29c185eac6106cfa005a3aa594e21b9e06 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/3f/d9ad29c185eac6106cfa005a3aa594e21b9e06 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/43/99b07bd31d1f58a0ff10b5434d5ff4f36e38fb b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/43/99b07bd31d1f58a0ff10b5434d5ff4f36e38fb similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/43/99b07bd31d1f58a0ff10b5434d5ff4f36e38fb rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/43/99b07bd31d1f58a0ff10b5434d5ff4f36e38fb diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/45/a4fb75db864000d01701c0f7a51864bd4daabf b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/45/a4fb75db864000d01701c0f7a51864bd4daabf similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/45/a4fb75db864000d01701c0f7a51864bd4daabf rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/45/a4fb75db864000d01701c0f7a51864bd4daabf diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/48/082f72f087ce7e6fa75b9c41d7387daecd447b b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/48/082f72f087ce7e6fa75b9c41d7387daecd447b similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/48/082f72f087ce7e6fa75b9c41d7387daecd447b rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/48/082f72f087ce7e6fa75b9c41d7387daecd447b diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/4a/9e01012c736e5e0998b7184d9a54e8c610ed02 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/4a/9e01012c736e5e0998b7184d9a54e8c610ed02 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/4a/9e01012c736e5e0998b7184d9a54e8c610ed02 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/4a/9e01012c736e5e0998b7184d9a54e8c610ed02 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/54/93d27d38b9902cf28b1035c644bf470df76060 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/54/93d27d38b9902cf28b1035c644bf470df76060 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/54/93d27d38b9902cf28b1035c644bf470df76060 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/54/93d27d38b9902cf28b1035c644bf470df76060 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/60/d3b2f4a4cd5f1637eba020358bfe5ecb5edcf2 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/60/d3b2f4a4cd5f1637eba020358bfe5ecb5edcf2 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/60/d3b2f4a4cd5f1637eba020358bfe5ecb5edcf2 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/60/d3b2f4a4cd5f1637eba020358bfe5ecb5edcf2 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/6f/a769bf11bd9dc4ff4e85f4951950b0bc34326f b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/6f/a769bf11bd9dc4ff4e85f4951950b0bc34326f similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/6f/a769bf11bd9dc4ff4e85f4951950b0bc34326f rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/6f/a769bf11bd9dc4ff4e85f4951950b0bc34326f diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/74/cd0e856d938eb6b665284c5485c00f87e20dc5 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/74/cd0e856d938eb6b665284c5485c00f87e20dc5 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/74/cd0e856d938eb6b665284c5485c00f87e20dc5 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/74/cd0e856d938eb6b665284c5485c00f87e20dc5 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/7c/fd51ebd06287effcfdab241235305cb6439d40 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/7c/fd51ebd06287effcfdab241235305cb6439d40 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/7c/fd51ebd06287effcfdab241235305cb6439d40 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/7c/fd51ebd06287effcfdab241235305cb6439d40 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/7e/d6ff82de6bcc2a78243fc9c54d3ef5ac14da69 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/7e/d6ff82de6bcc2a78243fc9c54d3ef5ac14da69 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/7e/d6ff82de6bcc2a78243fc9c54d3ef5ac14da69 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/7e/d6ff82de6bcc2a78243fc9c54d3ef5ac14da69 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/7f/8f011eb73d6043d2e6db9d2c101195ae2801f2 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/7f/8f011eb73d6043d2e6db9d2c101195ae2801f2 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/7f/8f011eb73d6043d2e6db9d2c101195ae2801f2 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/7f/8f011eb73d6043d2e6db9d2c101195ae2801f2 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/83/51c19397f4fcd5238d10034fa7fa384f14d580 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/83/51c19397f4fcd5238d10034fa7fa384f14d580 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/83/51c19397f4fcd5238d10034fa7fa384f14d580 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/83/51c19397f4fcd5238d10034fa7fa384f14d580 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/88/8633a131a49f1b8981d70c13d666defed6ba15 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/88/8633a131a49f1b8981d70c13d666defed6ba15 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/88/8633a131a49f1b8981d70c13d666defed6ba15 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/88/8633a131a49f1b8981d70c13d666defed6ba15 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/8b/0156bd25a1ecd82ef7c4c53e9d6d312bb6d403 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/8b/0156bd25a1ecd82ef7c4c53e9d6d312bb6d403 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/8b/0156bd25a1ecd82ef7c4c53e9d6d312bb6d403 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/8b/0156bd25a1ecd82ef7c4c53e9d6d312bb6d403 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/90/dfebd90b0a89766c39928f22901b8c02b51fda b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/90/dfebd90b0a89766c39928f22901b8c02b51fda similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/90/dfebd90b0a89766c39928f22901b8c02b51fda rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/90/dfebd90b0a89766c39928f22901b8c02b51fda diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/98/d9bcb75a685dfbfd60f611c309410152935b3d b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/98/d9bcb75a685dfbfd60f611c309410152935b3d similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/98/d9bcb75a685dfbfd60f611c309410152935b3d rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/98/d9bcb75a685dfbfd60f611c309410152935b3d diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/9c/836a5c3f513818d300b410f8cb3a2e3bbd42a1 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/9c/836a5c3f513818d300b410f8cb3a2e3bbd42a1 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/9c/836a5c3f513818d300b410f8cb3a2e3bbd42a1 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/9c/836a5c3f513818d300b410f8cb3a2e3bbd42a1 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/9d/33ec0915534bf6401be9412203697791e40a04 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/9d/33ec0915534bf6401be9412203697791e40a04 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/9d/33ec0915534bf6401be9412203697791e40a04 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/9d/33ec0915534bf6401be9412203697791e40a04 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/b1/bd38b62a0800a4f6a80c34e21c5acffae52c7e b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/b1/bd38b62a0800a4f6a80c34e21c5acffae52c7e similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/b1/bd38b62a0800a4f6a80c34e21c5acffae52c7e rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/b1/bd38b62a0800a4f6a80c34e21c5acffae52c7e diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/b2/970eba9fd8dba8655094dc38fb4ee50b9bf23e b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/b2/970eba9fd8dba8655094dc38fb4ee50b9bf23e similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/b2/970eba9fd8dba8655094dc38fb4ee50b9bf23e rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/b2/970eba9fd8dba8655094dc38fb4ee50b9bf23e diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/b4/de3947675361a7770d29b8982c407b0ec6b2a0 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/b4/de3947675361a7770d29b8982c407b0ec6b2a0 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/b4/de3947675361a7770d29b8982c407b0ec6b2a0 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/b4/de3947675361a7770d29b8982c407b0ec6b2a0 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/b6/14152a335aabd8b5daa2c6abccc9425eb14177 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/b6/14152a335aabd8b5daa2c6abccc9425eb14177 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/b6/14152a335aabd8b5daa2c6abccc9425eb14177 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/b6/14152a335aabd8b5daa2c6abccc9425eb14177 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/b6/a7d89c68e0ca66e96a9a51892cc33db66fb8a3 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/b6/a7d89c68e0ca66e96a9a51892cc33db66fb8a3 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/b6/a7d89c68e0ca66e96a9a51892cc33db66fb8a3 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/b6/a7d89c68e0ca66e96a9a51892cc33db66fb8a3 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/b8/626c4cff2849624fb67f87cd0ad72b163671ad b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/b8/626c4cff2849624fb67f87cd0ad72b163671ad similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/b8/626c4cff2849624fb67f87cd0ad72b163671ad rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/b8/626c4cff2849624fb67f87cd0ad72b163671ad diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/cd/c58c0f95a2313ded9185e102bc35253f6a1bed b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/cd/c58c0f95a2313ded9185e102bc35253f6a1bed similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/cd/c58c0f95a2313ded9185e102bc35253f6a1bed rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/cd/c58c0f95a2313ded9185e102bc35253f6a1bed diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/d0/0491fd7e5bb6fa28c517a0bb32b8b506539d4d b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/d0/0491fd7e5bb6fa28c517a0bb32b8b506539d4d similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/d0/0491fd7e5bb6fa28c517a0bb32b8b506539d4d rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/d0/0491fd7e5bb6fa28c517a0bb32b8b506539d4d diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/d2/7a997859219951ecc95c351174c70ea0cf9d37 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/d2/7a997859219951ecc95c351174c70ea0cf9d37 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/d2/7a997859219951ecc95c351174c70ea0cf9d37 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/d2/7a997859219951ecc95c351174c70ea0cf9d37 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/d3/6e09d97bf2c1527118bde353ad64b157f8b269 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/d3/6e09d97bf2c1527118bde353ad64b157f8b269 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/d3/6e09d97bf2c1527118bde353ad64b157f8b269 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/d3/6e09d97bf2c1527118bde353ad64b157f8b269 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/d4/e982570808a24722649e852a92bda5cf54c9dd b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/d4/e982570808a24722649e852a92bda5cf54c9dd similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/d4/e982570808a24722649e852a92bda5cf54c9dd rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/d4/e982570808a24722649e852a92bda5cf54c9dd diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/d6/b24041cf04154f8f902651969675021f4d93a5 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/d6/b24041cf04154f8f902651969675021f4d93a5 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/d6/b24041cf04154f8f902651969675021f4d93a5 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/d6/b24041cf04154f8f902651969675021f4d93a5 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/d8/4e0684b1038552d5c8d86e67398d634f77ad3b b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/d8/4e0684b1038552d5c8d86e67398d634f77ad3b similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/d8/4e0684b1038552d5c8d86e67398d634f77ad3b rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/d8/4e0684b1038552d5c8d86e67398d634f77ad3b diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/da/8dacb2a073ebc2adeddceb3cc2b39b6c95c858 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/da/8dacb2a073ebc2adeddceb3cc2b39b6c95c858 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/da/8dacb2a073ebc2adeddceb3cc2b39b6c95c858 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/da/8dacb2a073ebc2adeddceb3cc2b39b6c95c858 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/db/76c03074879025735b647b825786a7b3fcfe7c b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/db/76c03074879025735b647b825786a7b3fcfe7c similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/db/76c03074879025735b647b825786a7b3fcfe7c rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/db/76c03074879025735b647b825786a7b3fcfe7c diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/e5/59f83c6e8dd11680de70b487725e37ff2e283f b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/e5/59f83c6e8dd11680de70b487725e37ff2e283f similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/e5/59f83c6e8dd11680de70b487725e37ff2e283f rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/e5/59f83c6e8dd11680de70b487725e37ff2e283f diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/ec/635144f60048986bc560c5576355344005e6e7 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/ec/635144f60048986bc560c5576355344005e6e7 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/ec/635144f60048986bc560c5576355344005e6e7 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/ec/635144f60048986bc560c5576355344005e6e7 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/f5/99e28b8ab0d8c9c57a486c89c4a5132dcbd3b2 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/f5/99e28b8ab0d8c9c57a486c89c4a5132dcbd3b2 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/f5/99e28b8ab0d8c9c57a486c89c4a5132dcbd3b2 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/f5/99e28b8ab0d8c9c57a486c89c4a5132dcbd3b2 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/objects/ff/231021500c7beb87de0d6d5edc29b6f9c000b1 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/ff/231021500c7beb87de0d6d5edc29b6f9c000b1 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/objects/ff/231021500c7beb87de0d6d5edc29b6f9c000b1 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/objects/ff/231021500c7beb87de0d6d5edc29b6f9c000b1 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/packed-refs b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/packed-refs similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/packed-refs rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/packed-refs diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/refs/bisect/bad b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/refs/bisect/bad similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/refs/bisect/bad rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/refs/bisect/bad diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/refs/bisect/good-38242e5215bc35b3e418c1d6d63fd0291001e10b b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/refs/bisect/good-38242e5215bc35b3e418c1d6d63fd0291001e10b similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/refs/bisect/good-38242e5215bc35b3e418c1d6d63fd0291001e10b rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/refs/bisect/good-38242e5215bc35b3e418c1d6d63fd0291001e10b diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/refs/bisect/good-3fbb9e626d4b7d30e58346b3eefaa342b15ab776 b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/refs/bisect/good-3fbb9e626d4b7d30e58346b3eefaa342b15ab776 similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/refs/bisect/good-3fbb9e626d4b7d30e58346b3eefaa342b15ab776 rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/refs/bisect/good-3fbb9e626d4b7d30e58346b3eefaa342b15ab776 diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/refs/heads/master b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/refs/heads/master rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/refs/heads/other b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/refs/heads/other similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/refs/heads/other rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/refs/heads/other diff --git a/test/integration/bisectFromOtherBranch/expected/.git_keep/refs/heads/test b/test/integration/bisectFromOtherBranch/expected/repo/.git_keep/refs/heads/test similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/.git_keep/refs/heads/test rename to test/integration/bisectFromOtherBranch/expected/repo/.git_keep/refs/heads/test diff --git a/test/integration/bisectFromOtherBranch/expected/myfile b/test/integration/bisectFromOtherBranch/expected/repo/myfile similarity index 100% rename from test/integration/bisectFromOtherBranch/expected/myfile rename to test/integration/bisectFromOtherBranch/expected/repo/myfile diff --git a/test/integration/branchAutocomplete/expected/.git_keep/COMMIT_EDITMSG b/test/integration/branchAutocomplete/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/branchAutocomplete/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/branchAutocomplete/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/branchAutocomplete/expected/.git_keep/FETCH_HEAD b/test/integration/branchAutocomplete/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/branchAutocomplete/expected/.git_keep/FETCH_HEAD rename to test/integration/branchAutocomplete/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/branchAutocomplete/expected/.git_keep/HEAD b/test/integration/branchAutocomplete/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/branchAutocomplete/expected/.git_keep/HEAD rename to test/integration/branchAutocomplete/expected/repo/.git_keep/HEAD diff --git a/test/integration/branchAutocomplete/expected/.git_keep/config b/test/integration/branchAutocomplete/expected/repo/.git_keep/config similarity index 100% rename from test/integration/branchAutocomplete/expected/.git_keep/config rename to test/integration/branchAutocomplete/expected/repo/.git_keep/config diff --git a/test/integration/branchAutocomplete/expected/.git_keep/description b/test/integration/branchAutocomplete/expected/repo/.git_keep/description similarity index 100% rename from test/integration/branchAutocomplete/expected/.git_keep/description rename to test/integration/branchAutocomplete/expected/repo/.git_keep/description diff --git a/test/integration/branchAutocomplete/expected/.git_keep/index b/test/integration/branchAutocomplete/expected/repo/.git_keep/index similarity index 100% rename from test/integration/branchAutocomplete/expected/.git_keep/index rename to test/integration/branchAutocomplete/expected/repo/.git_keep/index diff --git a/test/integration/branchAutocomplete/expected/.git_keep/info/exclude b/test/integration/branchAutocomplete/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/branchAutocomplete/expected/.git_keep/info/exclude rename to test/integration/branchAutocomplete/expected/repo/.git_keep/info/exclude diff --git a/test/integration/branchAutocomplete/expected/.git_keep/logs/HEAD b/test/integration/branchAutocomplete/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/branchAutocomplete/expected/.git_keep/logs/HEAD rename to test/integration/branchAutocomplete/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/branchAutocomplete/expected/.git_keep/logs/refs/heads/four b/test/integration/branchAutocomplete/expected/repo/.git_keep/logs/refs/heads/four similarity index 100% rename from test/integration/branchAutocomplete/expected/.git_keep/logs/refs/heads/four rename to test/integration/branchAutocomplete/expected/repo/.git_keep/logs/refs/heads/four diff --git a/test/integration/branchAutocomplete/expected/.git_keep/logs/refs/heads/master b/test/integration/branchAutocomplete/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/branchAutocomplete/expected/.git_keep/logs/refs/heads/master rename to test/integration/branchAutocomplete/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/branchAutocomplete/expected/.git_keep/logs/refs/heads/one b/test/integration/branchAutocomplete/expected/repo/.git_keep/logs/refs/heads/one similarity index 100% rename from test/integration/branchAutocomplete/expected/.git_keep/logs/refs/heads/one rename to test/integration/branchAutocomplete/expected/repo/.git_keep/logs/refs/heads/one diff --git a/test/integration/branchAutocomplete/expected/.git_keep/logs/refs/heads/three b/test/integration/branchAutocomplete/expected/repo/.git_keep/logs/refs/heads/three similarity index 100% rename from test/integration/branchAutocomplete/expected/.git_keep/logs/refs/heads/three rename to test/integration/branchAutocomplete/expected/repo/.git_keep/logs/refs/heads/three diff --git a/test/integration/branchAutocomplete/expected/.git_keep/logs/refs/heads/two b/test/integration/branchAutocomplete/expected/repo/.git_keep/logs/refs/heads/two similarity index 100% rename from test/integration/branchAutocomplete/expected/.git_keep/logs/refs/heads/two rename to test/integration/branchAutocomplete/expected/repo/.git_keep/logs/refs/heads/two diff --git a/test/integration/branchAutocomplete/expected/.git_keep/objects/b4/9fda1c7a9af6a4f0b6b07a2cb31aecb8c01a6c b/test/integration/branchAutocomplete/expected/repo/.git_keep/objects/b4/9fda1c7a9af6a4f0b6b07a2cb31aecb8c01a6c similarity index 100% rename from test/integration/branchAutocomplete/expected/.git_keep/objects/b4/9fda1c7a9af6a4f0b6b07a2cb31aecb8c01a6c rename to test/integration/branchAutocomplete/expected/repo/.git_keep/objects/b4/9fda1c7a9af6a4f0b6b07a2cb31aecb8c01a6c diff --git a/test/integration/branchAutocomplete/expected/.git_keep/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 b/test/integration/branchAutocomplete/expected/repo/.git_keep/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 similarity index 100% rename from test/integration/branchAutocomplete/expected/.git_keep/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 rename to test/integration/branchAutocomplete/expected/repo/.git_keep/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/test/integration/branchAutocomplete/expected/.git_keep/objects/f7/53f4dfc98d148a7e685c46c8d148bcac56707d b/test/integration/branchAutocomplete/expected/repo/.git_keep/objects/f7/53f4dfc98d148a7e685c46c8d148bcac56707d similarity index 100% rename from test/integration/branchAutocomplete/expected/.git_keep/objects/f7/53f4dfc98d148a7e685c46c8d148bcac56707d rename to test/integration/branchAutocomplete/expected/repo/.git_keep/objects/f7/53f4dfc98d148a7e685c46c8d148bcac56707d diff --git a/test/integration/branchAutocomplete/expected/.git_keep/refs/heads/four b/test/integration/branchAutocomplete/expected/repo/.git_keep/refs/heads/four similarity index 100% rename from test/integration/branchAutocomplete/expected/.git_keep/refs/heads/four rename to test/integration/branchAutocomplete/expected/repo/.git_keep/refs/heads/four diff --git a/test/integration/branchAutocomplete/expected/.git_keep/refs/heads/master b/test/integration/branchAutocomplete/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/branchAutocomplete/expected/.git_keep/refs/heads/master rename to test/integration/branchAutocomplete/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/branchAutocomplete/expected/.git_keep/refs/heads/one b/test/integration/branchAutocomplete/expected/repo/.git_keep/refs/heads/one similarity index 100% rename from test/integration/branchAutocomplete/expected/.git_keep/refs/heads/one rename to test/integration/branchAutocomplete/expected/repo/.git_keep/refs/heads/one diff --git a/test/integration/branchAutocomplete/expected/.git_keep/refs/heads/three b/test/integration/branchAutocomplete/expected/repo/.git_keep/refs/heads/three similarity index 100% rename from test/integration/branchAutocomplete/expected/.git_keep/refs/heads/three rename to test/integration/branchAutocomplete/expected/repo/.git_keep/refs/heads/three diff --git a/test/integration/branchAutocomplete/expected/.git_keep/refs/heads/two b/test/integration/branchAutocomplete/expected/repo/.git_keep/refs/heads/two similarity index 100% rename from test/integration/branchAutocomplete/expected/.git_keep/refs/heads/two rename to test/integration/branchAutocomplete/expected/repo/.git_keep/refs/heads/two diff --git a/test/integration/branchAutocomplete/expected/myfile.txt b/test/integration/branchAutocomplete/expected/repo/myfile.txt similarity index 100% rename from test/integration/branchAutocomplete/expected/myfile.txt rename to test/integration/branchAutocomplete/expected/repo/myfile.txt diff --git a/test/integration/branchDelete/expected/.git_keep/COMMIT_EDITMSG b/test/integration/branchDelete/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/branchDelete/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/branchDelete/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/branchDelete/expected/.git_keep/FETCH_HEAD b/test/integration/branchDelete/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/branchDelete/expected/.git_keep/FETCH_HEAD rename to test/integration/branchDelete/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/branchDelete/expected/.git_keep/HEAD b/test/integration/branchDelete/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/branchDelete/expected/.git_keep/HEAD rename to test/integration/branchDelete/expected/repo/.git_keep/HEAD diff --git a/test/integration/branchDelete/expected/.git_keep/config b/test/integration/branchDelete/expected/repo/.git_keep/config similarity index 100% rename from test/integration/branchDelete/expected/.git_keep/config rename to test/integration/branchDelete/expected/repo/.git_keep/config diff --git a/test/integration/branchDelete/expected/.git_keep/description b/test/integration/branchDelete/expected/repo/.git_keep/description similarity index 100% rename from test/integration/branchDelete/expected/.git_keep/description rename to test/integration/branchDelete/expected/repo/.git_keep/description diff --git a/test/integration/branchDelete/expected/.git_keep/index b/test/integration/branchDelete/expected/repo/.git_keep/index similarity index 100% rename from test/integration/branchDelete/expected/.git_keep/index rename to test/integration/branchDelete/expected/repo/.git_keep/index diff --git a/test/integration/branchDelete/expected/.git_keep/info/exclude b/test/integration/branchDelete/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/branchDelete/expected/.git_keep/info/exclude rename to test/integration/branchDelete/expected/repo/.git_keep/info/exclude diff --git a/test/integration/branchDelete/expected/.git_keep/logs/HEAD b/test/integration/branchDelete/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/branchDelete/expected/.git_keep/logs/HEAD rename to test/integration/branchDelete/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/branchDelete/expected/.git_keep/logs/refs/heads/master b/test/integration/branchDelete/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/branchDelete/expected/.git_keep/logs/refs/heads/master rename to test/integration/branchDelete/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/branchDelete/expected/.git_keep/logs/refs/heads/new-branch b/test/integration/branchDelete/expected/repo/.git_keep/logs/refs/heads/new-branch similarity index 100% rename from test/integration/branchDelete/expected/.git_keep/logs/refs/heads/new-branch rename to test/integration/branchDelete/expected/repo/.git_keep/logs/refs/heads/new-branch diff --git a/test/integration/branchDelete/expected/.git_keep/logs/refs/heads/new-branch-2 b/test/integration/branchDelete/expected/repo/.git_keep/logs/refs/heads/new-branch-2 similarity index 100% rename from test/integration/branchDelete/expected/.git_keep/logs/refs/heads/new-branch-2 rename to test/integration/branchDelete/expected/repo/.git_keep/logs/refs/heads/new-branch-2 diff --git a/test/integration/branchDelete/expected/.git_keep/logs/refs/heads/new-branch-3 b/test/integration/branchDelete/expected/repo/.git_keep/logs/refs/heads/new-branch-3 similarity index 100% rename from test/integration/branchDelete/expected/.git_keep/logs/refs/heads/new-branch-3 rename to test/integration/branchDelete/expected/repo/.git_keep/logs/refs/heads/new-branch-3 diff --git a/test/integration/branchDelete/expected/.git_keep/logs/refs/heads/old-branch b/test/integration/branchDelete/expected/repo/.git_keep/logs/refs/heads/old-branch similarity index 100% rename from test/integration/branchDelete/expected/.git_keep/logs/refs/heads/old-branch rename to test/integration/branchDelete/expected/repo/.git_keep/logs/refs/heads/old-branch diff --git a/test/integration/branchDelete/expected/.git_keep/logs/refs/heads/old-branch-3 b/test/integration/branchDelete/expected/repo/.git_keep/logs/refs/heads/old-branch-3 similarity index 100% rename from test/integration/branchDelete/expected/.git_keep/logs/refs/heads/old-branch-3 rename to test/integration/branchDelete/expected/repo/.git_keep/logs/refs/heads/old-branch-3 diff --git a/test/integration/branchDelete/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/branchDelete/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/branchDelete/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/branchDelete/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/branchDelete/expected/.git_keep/objects/21/b436d66d2c515ad17285e53d9e6380d599b044 b/test/integration/branchDelete/expected/repo/.git_keep/objects/21/b436d66d2c515ad17285e53d9e6380d599b044 similarity index 100% rename from test/integration/branchDelete/expected/.git_keep/objects/21/b436d66d2c515ad17285e53d9e6380d599b044 rename to test/integration/branchDelete/expected/repo/.git_keep/objects/21/b436d66d2c515ad17285e53d9e6380d599b044 diff --git a/test/integration/branchDelete/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/branchDelete/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/branchDelete/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/branchDelete/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/branchDelete/expected/.git_keep/refs/heads/master b/test/integration/branchDelete/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/branchDelete/expected/.git_keep/refs/heads/master rename to test/integration/branchDelete/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/branchDelete/expected/.git_keep/refs/heads/new-branch b/test/integration/branchDelete/expected/repo/.git_keep/refs/heads/new-branch similarity index 100% rename from test/integration/branchDelete/expected/.git_keep/refs/heads/new-branch rename to test/integration/branchDelete/expected/repo/.git_keep/refs/heads/new-branch diff --git a/test/integration/branchDelete/expected/.git_keep/refs/heads/new-branch-2 b/test/integration/branchDelete/expected/repo/.git_keep/refs/heads/new-branch-2 similarity index 100% rename from test/integration/branchDelete/expected/.git_keep/refs/heads/new-branch-2 rename to test/integration/branchDelete/expected/repo/.git_keep/refs/heads/new-branch-2 diff --git a/test/integration/branchDelete/expected/.git_keep/refs/heads/new-branch-3 b/test/integration/branchDelete/expected/repo/.git_keep/refs/heads/new-branch-3 similarity index 100% rename from test/integration/branchDelete/expected/.git_keep/refs/heads/new-branch-3 rename to test/integration/branchDelete/expected/repo/.git_keep/refs/heads/new-branch-3 diff --git a/test/integration/branchDelete/expected/.git_keep/refs/heads/old-branch b/test/integration/branchDelete/expected/repo/.git_keep/refs/heads/old-branch similarity index 100% rename from test/integration/branchDelete/expected/.git_keep/refs/heads/old-branch rename to test/integration/branchDelete/expected/repo/.git_keep/refs/heads/old-branch diff --git a/test/integration/branchDelete/expected/.git_keep/refs/heads/old-branch-3 b/test/integration/branchDelete/expected/repo/.git_keep/refs/heads/old-branch-3 similarity index 100% rename from test/integration/branchDelete/expected/.git_keep/refs/heads/old-branch-3 rename to test/integration/branchDelete/expected/repo/.git_keep/refs/heads/old-branch-3 diff --git a/test/integration/branchDelete/expected/file0 b/test/integration/branchDelete/expected/repo/file0 similarity index 100% rename from test/integration/branchDelete/expected/file0 rename to test/integration/branchDelete/expected/repo/file0 diff --git a/test/integration/branchRebase/expected/.git_keep/COMMIT_EDITMSG b/test/integration/branchRebase/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/branchRebase/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/branchRebase/expected/.git_keep/FETCH_HEAD b/test/integration/branchRebase/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/FETCH_HEAD rename to test/integration/branchRebase/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/branchRebase/expected/.git_keep/HEAD b/test/integration/branchRebase/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/HEAD rename to test/integration/branchRebase/expected/repo/.git_keep/HEAD diff --git a/test/integration/branchRebase/expected/.git_keep/ORIG_HEAD b/test/integration/branchRebase/expected/repo/.git_keep/ORIG_HEAD similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/ORIG_HEAD rename to test/integration/branchRebase/expected/repo/.git_keep/ORIG_HEAD diff --git a/test/integration/branchRebase/expected/.git_keep/config b/test/integration/branchRebase/expected/repo/.git_keep/config similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/config rename to test/integration/branchRebase/expected/repo/.git_keep/config diff --git a/test/integration/branchRebase/expected/.git_keep/description b/test/integration/branchRebase/expected/repo/.git_keep/description similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/description rename to test/integration/branchRebase/expected/repo/.git_keep/description diff --git a/test/integration/branchRebase/expected/.git_keep/index b/test/integration/branchRebase/expected/repo/.git_keep/index similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/index rename to test/integration/branchRebase/expected/repo/.git_keep/index diff --git a/test/integration/branchRebase/expected/.git_keep/info/exclude b/test/integration/branchRebase/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/info/exclude rename to test/integration/branchRebase/expected/repo/.git_keep/info/exclude diff --git a/test/integration/branchRebase/expected/.git_keep/logs/HEAD b/test/integration/branchRebase/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/logs/HEAD rename to test/integration/branchRebase/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/branchRebase/expected/.git_keep/logs/refs/heads/develop b/test/integration/branchRebase/expected/repo/.git_keep/logs/refs/heads/develop similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/logs/refs/heads/develop rename to test/integration/branchRebase/expected/repo/.git_keep/logs/refs/heads/develop diff --git a/test/integration/branchRebase/expected/.git_keep/logs/refs/heads/master b/test/integration/branchRebase/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/logs/refs/heads/master rename to test/integration/branchRebase/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/branchRebase/expected/.git_keep/objects/09/cbe8c6717c06a61876b7b641a46a62bf3c585d b/test/integration/branchRebase/expected/repo/.git_keep/objects/09/cbe8c6717c06a61876b7b641a46a62bf3c585d similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/09/cbe8c6717c06a61876b7b641a46a62bf3c585d rename to test/integration/branchRebase/expected/repo/.git_keep/objects/09/cbe8c6717c06a61876b7b641a46a62bf3c585d diff --git a/test/integration/branchRebase/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/branchRebase/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/branchRebase/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/branchRebase/expected/.git_keep/objects/1b/9ae5f5dff631baaa180a30afd9983f83dc27ca b/test/integration/branchRebase/expected/repo/.git_keep/objects/1b/9ae5f5dff631baaa180a30afd9983f83dc27ca similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/1b/9ae5f5dff631baaa180a30afd9983f83dc27ca rename to test/integration/branchRebase/expected/repo/.git_keep/objects/1b/9ae5f5dff631baaa180a30afd9983f83dc27ca diff --git a/test/integration/branchRebase/expected/.git_keep/objects/21/78af7503938665881174069be4d48fa483e4af b/test/integration/branchRebase/expected/repo/.git_keep/objects/21/78af7503938665881174069be4d48fa483e4af similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/21/78af7503938665881174069be4d48fa483e4af rename to test/integration/branchRebase/expected/repo/.git_keep/objects/21/78af7503938665881174069be4d48fa483e4af diff --git a/test/integration/branchRebase/expected/.git_keep/objects/2e/83133d8d6b88c588de66c3ff8405501b5215b4 b/test/integration/branchRebase/expected/repo/.git_keep/objects/2e/83133d8d6b88c588de66c3ff8405501b5215b4 similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/2e/83133d8d6b88c588de66c3ff8405501b5215b4 rename to test/integration/branchRebase/expected/repo/.git_keep/objects/2e/83133d8d6b88c588de66c3ff8405501b5215b4 diff --git a/test/integration/branchRebase/expected/.git_keep/objects/34/c74161eef968fc951cf170a011fa8abfeddbcd b/test/integration/branchRebase/expected/repo/.git_keep/objects/34/c74161eef968fc951cf170a011fa8abfeddbcd similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/34/c74161eef968fc951cf170a011fa8abfeddbcd rename to test/integration/branchRebase/expected/repo/.git_keep/objects/34/c74161eef968fc951cf170a011fa8abfeddbcd diff --git a/test/integration/branchRebase/expected/.git_keep/objects/36/27f93f3cc779dc2f99484fb8ffa49953e43b2f b/test/integration/branchRebase/expected/repo/.git_keep/objects/36/27f93f3cc779dc2f99484fb8ffa49953e43b2f similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/36/27f93f3cc779dc2f99484fb8ffa49953e43b2f rename to test/integration/branchRebase/expected/repo/.git_keep/objects/36/27f93f3cc779dc2f99484fb8ffa49953e43b2f diff --git a/test/integration/branchRebase/expected/.git_keep/objects/3e/1706cdf670f5641be0715178471abfc9ed1748 b/test/integration/branchRebase/expected/repo/.git_keep/objects/3e/1706cdf670f5641be0715178471abfc9ed1748 similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/3e/1706cdf670f5641be0715178471abfc9ed1748 rename to test/integration/branchRebase/expected/repo/.git_keep/objects/3e/1706cdf670f5641be0715178471abfc9ed1748 diff --git a/test/integration/branchRebase/expected/.git_keep/objects/42/1b29bba240f23ea39e216bb0873cd4012624b5 b/test/integration/branchRebase/expected/repo/.git_keep/objects/42/1b29bba240f23ea39e216bb0873cd4012624b5 similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/42/1b29bba240f23ea39e216bb0873cd4012624b5 rename to test/integration/branchRebase/expected/repo/.git_keep/objects/42/1b29bba240f23ea39e216bb0873cd4012624b5 diff --git a/test/integration/branchRebase/expected/.git_keep/objects/42/597904331c82f6d5c8c902755c8dfa5767ea95 b/test/integration/branchRebase/expected/repo/.git_keep/objects/42/597904331c82f6d5c8c902755c8dfa5767ea95 similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/42/597904331c82f6d5c8c902755c8dfa5767ea95 rename to test/integration/branchRebase/expected/repo/.git_keep/objects/42/597904331c82f6d5c8c902755c8dfa5767ea95 diff --git a/test/integration/branchRebase/expected/.git_keep/objects/4f/80ec0c7b09eeeb580d0c19947477c02bc88c25 b/test/integration/branchRebase/expected/repo/.git_keep/objects/4f/80ec0c7b09eeeb580d0c19947477c02bc88c25 similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/4f/80ec0c7b09eeeb580d0c19947477c02bc88c25 rename to test/integration/branchRebase/expected/repo/.git_keep/objects/4f/80ec0c7b09eeeb580d0c19947477c02bc88c25 diff --git a/test/integration/branchRebase/expected/.git_keep/objects/5d/874a902548f753e50944827e572a7470aa9731 b/test/integration/branchRebase/expected/repo/.git_keep/objects/5d/874a902548f753e50944827e572a7470aa9731 similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/5d/874a902548f753e50944827e572a7470aa9731 rename to test/integration/branchRebase/expected/repo/.git_keep/objects/5d/874a902548f753e50944827e572a7470aa9731 diff --git a/test/integration/branchRebase/expected/.git_keep/objects/5f/3e4598b46a912f0f95a4898743e979343c82f3 b/test/integration/branchRebase/expected/repo/.git_keep/objects/5f/3e4598b46a912f0f95a4898743e979343c82f3 similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/5f/3e4598b46a912f0f95a4898743e979343c82f3 rename to test/integration/branchRebase/expected/repo/.git_keep/objects/5f/3e4598b46a912f0f95a4898743e979343c82f3 diff --git a/test/integration/branchRebase/expected/.git_keep/objects/60/91d709b275e712111d016d9b3a4fb44e63f1f6 b/test/integration/branchRebase/expected/repo/.git_keep/objects/60/91d709b275e712111d016d9b3a4fb44e63f1f6 similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/60/91d709b275e712111d016d9b3a4fb44e63f1f6 rename to test/integration/branchRebase/expected/repo/.git_keep/objects/60/91d709b275e712111d016d9b3a4fb44e63f1f6 diff --git a/test/integration/branchRebase/expected/.git_keep/objects/69/f11ae88c8712fe38ffd0fe9ff9df05371500a6 b/test/integration/branchRebase/expected/repo/.git_keep/objects/69/f11ae88c8712fe38ffd0fe9ff9df05371500a6 similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/69/f11ae88c8712fe38ffd0fe9ff9df05371500a6 rename to test/integration/branchRebase/expected/repo/.git_keep/objects/69/f11ae88c8712fe38ffd0fe9ff9df05371500a6 diff --git a/test/integration/branchRebase/expected/.git_keep/objects/70/95508e3cd0fd40572f8e711170db38ef2342d7 b/test/integration/branchRebase/expected/repo/.git_keep/objects/70/95508e3cd0fd40572f8e711170db38ef2342d7 similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/70/95508e3cd0fd40572f8e711170db38ef2342d7 rename to test/integration/branchRebase/expected/repo/.git_keep/objects/70/95508e3cd0fd40572f8e711170db38ef2342d7 diff --git a/test/integration/branchRebase/expected/.git_keep/objects/7a/45b8933308e43f2597ee5d290862a62a9b46b3 b/test/integration/branchRebase/expected/repo/.git_keep/objects/7a/45b8933308e43f2597ee5d290862a62a9b46b3 similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/7a/45b8933308e43f2597ee5d290862a62a9b46b3 rename to test/integration/branchRebase/expected/repo/.git_keep/objects/7a/45b8933308e43f2597ee5d290862a62a9b46b3 diff --git a/test/integration/branchRebase/expected/.git_keep/objects/88/c39cdc29c995f8e1a63ccd48e7bbd6d96cb8b8 b/test/integration/branchRebase/expected/repo/.git_keep/objects/88/c39cdc29c995f8e1a63ccd48e7bbd6d96cb8b8 similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/88/c39cdc29c995f8e1a63ccd48e7bbd6d96cb8b8 rename to test/integration/branchRebase/expected/repo/.git_keep/objects/88/c39cdc29c995f8e1a63ccd48e7bbd6d96cb8b8 diff --git a/test/integration/branchRebase/expected/.git_keep/objects/8c/7a45270a95d66c8e3b843df3f466be5dc19960 b/test/integration/branchRebase/expected/repo/.git_keep/objects/8c/7a45270a95d66c8e3b843df3f466be5dc19960 similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/8c/7a45270a95d66c8e3b843df3f466be5dc19960 rename to test/integration/branchRebase/expected/repo/.git_keep/objects/8c/7a45270a95d66c8e3b843df3f466be5dc19960 diff --git a/test/integration/branchRebase/expected/.git_keep/objects/8d/3bd1cbd5560c759c78a948bc0d24acb9cfae73 b/test/integration/branchRebase/expected/repo/.git_keep/objects/8d/3bd1cbd5560c759c78a948bc0d24acb9cfae73 similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/8d/3bd1cbd5560c759c78a948bc0d24acb9cfae73 rename to test/integration/branchRebase/expected/repo/.git_keep/objects/8d/3bd1cbd5560c759c78a948bc0d24acb9cfae73 diff --git a/test/integration/branchRebase/expected/.git_keep/objects/9a/6521a3788b4d9e679b1709130ff8dc3f73ab18 b/test/integration/branchRebase/expected/repo/.git_keep/objects/9a/6521a3788b4d9e679b1709130ff8dc3f73ab18 similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/9a/6521a3788b4d9e679b1709130ff8dc3f73ab18 rename to test/integration/branchRebase/expected/repo/.git_keep/objects/9a/6521a3788b4d9e679b1709130ff8dc3f73ab18 diff --git a/test/integration/branchRebase/expected/.git_keep/objects/9d/e8260b738a34a74533df54f2e404276aa96242 b/test/integration/branchRebase/expected/repo/.git_keep/objects/9d/e8260b738a34a74533df54f2e404276aa96242 similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/9d/e8260b738a34a74533df54f2e404276aa96242 rename to test/integration/branchRebase/expected/repo/.git_keep/objects/9d/e8260b738a34a74533df54f2e404276aa96242 diff --git a/test/integration/branchRebase/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/branchRebase/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/branchRebase/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/branchRebase/expected/.git_keep/objects/a8/381c9130b03aef530b60b5a4546b93dc59ae12 b/test/integration/branchRebase/expected/repo/.git_keep/objects/a8/381c9130b03aef530b60b5a4546b93dc59ae12 similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/a8/381c9130b03aef530b60b5a4546b93dc59ae12 rename to test/integration/branchRebase/expected/repo/.git_keep/objects/a8/381c9130b03aef530b60b5a4546b93dc59ae12 diff --git a/test/integration/branchRebase/expected/.git_keep/objects/cb/289e645aed5251ce74fa2eaf0cd1145b9cb014 b/test/integration/branchRebase/expected/repo/.git_keep/objects/cb/289e645aed5251ce74fa2eaf0cd1145b9cb014 similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/cb/289e645aed5251ce74fa2eaf0cd1145b9cb014 rename to test/integration/branchRebase/expected/repo/.git_keep/objects/cb/289e645aed5251ce74fa2eaf0cd1145b9cb014 diff --git a/test/integration/branchRebase/expected/.git_keep/objects/cc/52f7d833c761b3b11a5fa1ae76ba9aba2edd6f b/test/integration/branchRebase/expected/repo/.git_keep/objects/cc/52f7d833c761b3b11a5fa1ae76ba9aba2edd6f similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/cc/52f7d833c761b3b11a5fa1ae76ba9aba2edd6f rename to test/integration/branchRebase/expected/repo/.git_keep/objects/cc/52f7d833c761b3b11a5fa1ae76ba9aba2edd6f diff --git a/test/integration/branchRebase/expected/.git_keep/objects/dc/d348507ba1da8f6479b9d964daa302b2fb9d9c b/test/integration/branchRebase/expected/repo/.git_keep/objects/dc/d348507ba1da8f6479b9d964daa302b2fb9d9c similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/dc/d348507ba1da8f6479b9d964daa302b2fb9d9c rename to test/integration/branchRebase/expected/repo/.git_keep/objects/dc/d348507ba1da8f6479b9d964daa302b2fb9d9c diff --git a/test/integration/branchRebase/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/branchRebase/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/branchRebase/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/branchRebase/expected/.git_keep/objects/e3/ae5c6d8407e8307b9bc77923be78c901408f6e b/test/integration/branchRebase/expected/repo/.git_keep/objects/e3/ae5c6d8407e8307b9bc77923be78c901408f6e similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/e3/ae5c6d8407e8307b9bc77923be78c901408f6e rename to test/integration/branchRebase/expected/repo/.git_keep/objects/e3/ae5c6d8407e8307b9bc77923be78c901408f6e diff --git a/test/integration/branchRebase/expected/.git_keep/objects/e4/666ba294866d5c16f9afebcacf8f4adfee7439 b/test/integration/branchRebase/expected/repo/.git_keep/objects/e4/666ba294866d5c16f9afebcacf8f4adfee7439 similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/e4/666ba294866d5c16f9afebcacf8f4adfee7439 rename to test/integration/branchRebase/expected/repo/.git_keep/objects/e4/666ba294866d5c16f9afebcacf8f4adfee7439 diff --git a/test/integration/branchRebase/expected/.git_keep/objects/e9/57aaf2eef0c03a9052b472d4862d9ee684c3e5 b/test/integration/branchRebase/expected/repo/.git_keep/objects/e9/57aaf2eef0c03a9052b472d4862d9ee684c3e5 similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/e9/57aaf2eef0c03a9052b472d4862d9ee684c3e5 rename to test/integration/branchRebase/expected/repo/.git_keep/objects/e9/57aaf2eef0c03a9052b472d4862d9ee684c3e5 diff --git a/test/integration/branchRebase/expected/.git_keep/objects/f3/f762af4429ae89fa0dae3d0a5b500ca11630c4 b/test/integration/branchRebase/expected/repo/.git_keep/objects/f3/f762af4429ae89fa0dae3d0a5b500ca11630c4 similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/f3/f762af4429ae89fa0dae3d0a5b500ca11630c4 rename to test/integration/branchRebase/expected/repo/.git_keep/objects/f3/f762af4429ae89fa0dae3d0a5b500ca11630c4 diff --git a/test/integration/branchRebase/expected/.git_keep/objects/f5/067da83b48f8588edce682fd2715a575f34373 b/test/integration/branchRebase/expected/repo/.git_keep/objects/f5/067da83b48f8588edce682fd2715a575f34373 similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/f5/067da83b48f8588edce682fd2715a575f34373 rename to test/integration/branchRebase/expected/repo/.git_keep/objects/f5/067da83b48f8588edce682fd2715a575f34373 diff --git a/test/integration/branchRebase/expected/.git_keep/objects/fe/427b52bbbe9dac81b463a162f37ab979ca772b b/test/integration/branchRebase/expected/repo/.git_keep/objects/fe/427b52bbbe9dac81b463a162f37ab979ca772b similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/objects/fe/427b52bbbe9dac81b463a162f37ab979ca772b rename to test/integration/branchRebase/expected/repo/.git_keep/objects/fe/427b52bbbe9dac81b463a162f37ab979ca772b diff --git a/test/integration/branchRebase/expected/.git_keep/refs/heads/develop b/test/integration/branchRebase/expected/repo/.git_keep/refs/heads/develop similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/refs/heads/develop rename to test/integration/branchRebase/expected/repo/.git_keep/refs/heads/develop diff --git a/test/integration/branchRebase/expected/.git_keep/refs/heads/master b/test/integration/branchRebase/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/branchRebase/expected/.git_keep/refs/heads/master rename to test/integration/branchRebase/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/branchRebase/expected/directory/file b/test/integration/branchRebase/expected/repo/directory/file similarity index 100% rename from test/integration/branchRebase/expected/directory/file rename to test/integration/branchRebase/expected/repo/directory/file diff --git a/test/integration/branchRebase/expected/directory/file2 b/test/integration/branchRebase/expected/repo/directory/file2 similarity index 100% rename from test/integration/branchRebase/expected/directory/file2 rename to test/integration/branchRebase/expected/repo/directory/file2 diff --git a/test/integration/branchRebase/expected/file1 b/test/integration/branchRebase/expected/repo/file1 similarity index 100% rename from test/integration/branchRebase/expected/file1 rename to test/integration/branchRebase/expected/repo/file1 diff --git a/test/integration/branchRebase/expected/file3 b/test/integration/branchRebase/expected/repo/file3 similarity index 100% rename from test/integration/branchRebase/expected/file3 rename to test/integration/branchRebase/expected/repo/file3 diff --git a/test/integration/branchRebase/expected/file4 b/test/integration/branchRebase/expected/repo/file4 similarity index 100% rename from test/integration/branchRebase/expected/file4 rename to test/integration/branchRebase/expected/repo/file4 diff --git a/test/integration/branchRebase/expected/file5 b/test/integration/branchRebase/expected/repo/file5 similarity index 100% rename from test/integration/branchRebase/expected/file5 rename to test/integration/branchRebase/expected/repo/file5 diff --git a/test/integration/branchReset/expected/.git_keep/COMMIT_EDITMSG b/test/integration/branchReset/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/branchReset/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/branchReset/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/branchReset/expected/.git_keep/FETCH_HEAD b/test/integration/branchReset/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/branchReset/expected/.git_keep/FETCH_HEAD rename to test/integration/branchReset/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/branchReset/expected/.git_keep/HEAD b/test/integration/branchReset/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/branchReset/expected/.git_keep/HEAD rename to test/integration/branchReset/expected/repo/.git_keep/HEAD diff --git a/test/integration/branchReset/expected/.git_keep/ORIG_HEAD b/test/integration/branchReset/expected/repo/.git_keep/ORIG_HEAD similarity index 100% rename from test/integration/branchReset/expected/.git_keep/ORIG_HEAD rename to test/integration/branchReset/expected/repo/.git_keep/ORIG_HEAD diff --git a/test/integration/branchReset/expected/.git_keep/config b/test/integration/branchReset/expected/repo/.git_keep/config similarity index 100% rename from test/integration/branchReset/expected/.git_keep/config rename to test/integration/branchReset/expected/repo/.git_keep/config diff --git a/test/integration/branchReset/expected/.git_keep/description b/test/integration/branchReset/expected/repo/.git_keep/description similarity index 100% rename from test/integration/branchReset/expected/.git_keep/description rename to test/integration/branchReset/expected/repo/.git_keep/description diff --git a/test/integration/branchReset/expected/.git_keep/index b/test/integration/branchReset/expected/repo/.git_keep/index similarity index 100% rename from test/integration/branchReset/expected/.git_keep/index rename to test/integration/branchReset/expected/repo/.git_keep/index diff --git a/test/integration/branchReset/expected/.git_keep/info/exclude b/test/integration/branchReset/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/branchReset/expected/.git_keep/info/exclude rename to test/integration/branchReset/expected/repo/.git_keep/info/exclude diff --git a/test/integration/branchReset/expected/.git_keep/logs/HEAD b/test/integration/branchReset/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/branchReset/expected/.git_keep/logs/HEAD rename to test/integration/branchReset/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/branchReset/expected/.git_keep/logs/refs/heads/develop b/test/integration/branchReset/expected/repo/.git_keep/logs/refs/heads/develop similarity index 100% rename from test/integration/branchReset/expected/.git_keep/logs/refs/heads/develop rename to test/integration/branchReset/expected/repo/.git_keep/logs/refs/heads/develop diff --git a/test/integration/branchReset/expected/.git_keep/logs/refs/heads/master b/test/integration/branchReset/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/branchReset/expected/.git_keep/logs/refs/heads/master rename to test/integration/branchReset/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/branchReset/expected/.git_keep/objects/09/cbe8c6717c06a61876b7b641a46a62bf3c585d b/test/integration/branchReset/expected/repo/.git_keep/objects/09/cbe8c6717c06a61876b7b641a46a62bf3c585d similarity index 100% rename from test/integration/branchReset/expected/.git_keep/objects/09/cbe8c6717c06a61876b7b641a46a62bf3c585d rename to test/integration/branchReset/expected/repo/.git_keep/objects/09/cbe8c6717c06a61876b7b641a46a62bf3c585d diff --git a/test/integration/branchReset/expected/.git_keep/objects/10/6606554f129e8b6e4b942908734deef5628dcd b/test/integration/branchReset/expected/repo/.git_keep/objects/10/6606554f129e8b6e4b942908734deef5628dcd similarity index 100% rename from test/integration/branchReset/expected/.git_keep/objects/10/6606554f129e8b6e4b942908734deef5628dcd rename to test/integration/branchReset/expected/repo/.git_keep/objects/10/6606554f129e8b6e4b942908734deef5628dcd diff --git a/test/integration/branchReset/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/branchReset/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/branchReset/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/branchReset/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/branchReset/expected/.git_keep/objects/1b/9ae5f5dff631baaa180a30afd9983f83dc27ca b/test/integration/branchReset/expected/repo/.git_keep/objects/1b/9ae5f5dff631baaa180a30afd9983f83dc27ca similarity index 100% rename from test/integration/branchReset/expected/.git_keep/objects/1b/9ae5f5dff631baaa180a30afd9983f83dc27ca rename to test/integration/branchReset/expected/repo/.git_keep/objects/1b/9ae5f5dff631baaa180a30afd9983f83dc27ca diff --git a/test/integration/branchReset/expected/.git_keep/objects/21/78af7503938665881174069be4d48fa483e4af b/test/integration/branchReset/expected/repo/.git_keep/objects/21/78af7503938665881174069be4d48fa483e4af similarity index 100% rename from test/integration/branchReset/expected/.git_keep/objects/21/78af7503938665881174069be4d48fa483e4af rename to test/integration/branchReset/expected/repo/.git_keep/objects/21/78af7503938665881174069be4d48fa483e4af diff --git a/test/integration/branchReset/expected/.git_keep/objects/27/ba706fa463253f9189b2f258430877d2b5ed4f b/test/integration/branchReset/expected/repo/.git_keep/objects/27/ba706fa463253f9189b2f258430877d2b5ed4f similarity index 100% rename from test/integration/branchReset/expected/.git_keep/objects/27/ba706fa463253f9189b2f258430877d2b5ed4f rename to test/integration/branchReset/expected/repo/.git_keep/objects/27/ba706fa463253f9189b2f258430877d2b5ed4f diff --git a/test/integration/branchReset/expected/.git_keep/objects/34/c74161eef968fc951cf170a011fa8abfeddbcd b/test/integration/branchReset/expected/repo/.git_keep/objects/34/c74161eef968fc951cf170a011fa8abfeddbcd similarity index 100% rename from test/integration/branchReset/expected/.git_keep/objects/34/c74161eef968fc951cf170a011fa8abfeddbcd rename to test/integration/branchReset/expected/repo/.git_keep/objects/34/c74161eef968fc951cf170a011fa8abfeddbcd diff --git a/test/integration/branchReset/expected/.git_keep/objects/37/14b55ba17f3d8b0233c6e5924a5e497eb09bb7 b/test/integration/branchReset/expected/repo/.git_keep/objects/37/14b55ba17f3d8b0233c6e5924a5e497eb09bb7 similarity index 100% rename from test/integration/branchReset/expected/.git_keep/objects/37/14b55ba17f3d8b0233c6e5924a5e497eb09bb7 rename to test/integration/branchReset/expected/repo/.git_keep/objects/37/14b55ba17f3d8b0233c6e5924a5e497eb09bb7 diff --git a/test/integration/branchReset/expected/.git_keep/objects/4f/80ec0c7b09eeeb580d0c19947477c02bc88c25 b/test/integration/branchReset/expected/repo/.git_keep/objects/4f/80ec0c7b09eeeb580d0c19947477c02bc88c25 similarity index 100% rename from test/integration/branchReset/expected/.git_keep/objects/4f/80ec0c7b09eeeb580d0c19947477c02bc88c25 rename to test/integration/branchReset/expected/repo/.git_keep/objects/4f/80ec0c7b09eeeb580d0c19947477c02bc88c25 diff --git a/test/integration/branchReset/expected/.git_keep/objects/5f/3e4598b46a912f0f95a4898743e979343c82f3 b/test/integration/branchReset/expected/repo/.git_keep/objects/5f/3e4598b46a912f0f95a4898743e979343c82f3 similarity index 100% rename from test/integration/branchReset/expected/.git_keep/objects/5f/3e4598b46a912f0f95a4898743e979343c82f3 rename to test/integration/branchReset/expected/repo/.git_keep/objects/5f/3e4598b46a912f0f95a4898743e979343c82f3 diff --git a/test/integration/branchReset/expected/.git_keep/objects/60/91d709b275e712111d016d9b3a4fb44e63f1f6 b/test/integration/branchReset/expected/repo/.git_keep/objects/60/91d709b275e712111d016d9b3a4fb44e63f1f6 similarity index 100% rename from test/integration/branchReset/expected/.git_keep/objects/60/91d709b275e712111d016d9b3a4fb44e63f1f6 rename to test/integration/branchReset/expected/repo/.git_keep/objects/60/91d709b275e712111d016d9b3a4fb44e63f1f6 diff --git a/test/integration/branchReset/expected/.git_keep/objects/7a/45b8933308e43f2597ee5d290862a62a9b46b3 b/test/integration/branchReset/expected/repo/.git_keep/objects/7a/45b8933308e43f2597ee5d290862a62a9b46b3 similarity index 100% rename from test/integration/branchReset/expected/.git_keep/objects/7a/45b8933308e43f2597ee5d290862a62a9b46b3 rename to test/integration/branchReset/expected/repo/.git_keep/objects/7a/45b8933308e43f2597ee5d290862a62a9b46b3 diff --git a/test/integration/branchReset/expected/.git_keep/objects/7c/d86f0c3e1894b4270d0bf9fa246c33568f9bf1 b/test/integration/branchReset/expected/repo/.git_keep/objects/7c/d86f0c3e1894b4270d0bf9fa246c33568f9bf1 similarity index 100% rename from test/integration/branchReset/expected/.git_keep/objects/7c/d86f0c3e1894b4270d0bf9fa246c33568f9bf1 rename to test/integration/branchReset/expected/repo/.git_keep/objects/7c/d86f0c3e1894b4270d0bf9fa246c33568f9bf1 diff --git a/test/integration/branchReset/expected/.git_keep/objects/88/c39cdc29c995f8e1a63ccd48e7bbd6d96cb8b8 b/test/integration/branchReset/expected/repo/.git_keep/objects/88/c39cdc29c995f8e1a63ccd48e7bbd6d96cb8b8 similarity index 100% rename from test/integration/branchReset/expected/.git_keep/objects/88/c39cdc29c995f8e1a63ccd48e7bbd6d96cb8b8 rename to test/integration/branchReset/expected/repo/.git_keep/objects/88/c39cdc29c995f8e1a63ccd48e7bbd6d96cb8b8 diff --git a/test/integration/branchReset/expected/.git_keep/objects/8b/24e74245461f6ad529c77c040fe17e415cf3da b/test/integration/branchReset/expected/repo/.git_keep/objects/8b/24e74245461f6ad529c77c040fe17e415cf3da similarity index 100% rename from test/integration/branchReset/expected/.git_keep/objects/8b/24e74245461f6ad529c77c040fe17e415cf3da rename to test/integration/branchReset/expected/repo/.git_keep/objects/8b/24e74245461f6ad529c77c040fe17e415cf3da diff --git a/test/integration/branchReset/expected/.git_keep/objects/8c/7a45270a95d66c8e3b843df3f466be5dc19960 b/test/integration/branchReset/expected/repo/.git_keep/objects/8c/7a45270a95d66c8e3b843df3f466be5dc19960 similarity index 100% rename from test/integration/branchReset/expected/.git_keep/objects/8c/7a45270a95d66c8e3b843df3f466be5dc19960 rename to test/integration/branchReset/expected/repo/.git_keep/objects/8c/7a45270a95d66c8e3b843df3f466be5dc19960 diff --git a/test/integration/branchReset/expected/.git_keep/objects/9d/e8260b738a34a74533df54f2e404276aa96242 b/test/integration/branchReset/expected/repo/.git_keep/objects/9d/e8260b738a34a74533df54f2e404276aa96242 similarity index 100% rename from test/integration/branchReset/expected/.git_keep/objects/9d/e8260b738a34a74533df54f2e404276aa96242 rename to test/integration/branchReset/expected/repo/.git_keep/objects/9d/e8260b738a34a74533df54f2e404276aa96242 diff --git a/test/integration/branchReset/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/branchReset/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/branchReset/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/branchReset/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/branchReset/expected/.git_keep/objects/a7/3e01f9d181ff16b3d821dd962e98accbd62936 b/test/integration/branchReset/expected/repo/.git_keep/objects/a7/3e01f9d181ff16b3d821dd962e98accbd62936 similarity index 100% rename from test/integration/branchReset/expected/.git_keep/objects/a7/3e01f9d181ff16b3d821dd962e98accbd62936 rename to test/integration/branchReset/expected/repo/.git_keep/objects/a7/3e01f9d181ff16b3d821dd962e98accbd62936 diff --git a/test/integration/branchReset/expected/.git_keep/objects/bd/8db1919bbbbd4509ad4d9fa3baf546460e17a2 b/test/integration/branchReset/expected/repo/.git_keep/objects/bd/8db1919bbbbd4509ad4d9fa3baf546460e17a2 similarity index 100% rename from test/integration/branchReset/expected/.git_keep/objects/bd/8db1919bbbbd4509ad4d9fa3baf546460e17a2 rename to test/integration/branchReset/expected/repo/.git_keep/objects/bd/8db1919bbbbd4509ad4d9fa3baf546460e17a2 diff --git a/test/integration/branchReset/expected/.git_keep/objects/c2/3c3e0496a9b3decc42344bfd94514f0834b93c b/test/integration/branchReset/expected/repo/.git_keep/objects/c2/3c3e0496a9b3decc42344bfd94514f0834b93c similarity index 100% rename from test/integration/branchReset/expected/.git_keep/objects/c2/3c3e0496a9b3decc42344bfd94514f0834b93c rename to test/integration/branchReset/expected/repo/.git_keep/objects/c2/3c3e0496a9b3decc42344bfd94514f0834b93c diff --git a/test/integration/branchReset/expected/.git_keep/objects/cb/289e645aed5251ce74fa2eaf0cd1145b9cb014 b/test/integration/branchReset/expected/repo/.git_keep/objects/cb/289e645aed5251ce74fa2eaf0cd1145b9cb014 similarity index 100% rename from test/integration/branchReset/expected/.git_keep/objects/cb/289e645aed5251ce74fa2eaf0cd1145b9cb014 rename to test/integration/branchReset/expected/repo/.git_keep/objects/cb/289e645aed5251ce74fa2eaf0cd1145b9cb014 diff --git a/test/integration/branchReset/expected/.git_keep/objects/dc/d348507ba1da8f6479b9d964daa302b2fb9d9c b/test/integration/branchReset/expected/repo/.git_keep/objects/dc/d348507ba1da8f6479b9d964daa302b2fb9d9c similarity index 100% rename from test/integration/branchReset/expected/.git_keep/objects/dc/d348507ba1da8f6479b9d964daa302b2fb9d9c rename to test/integration/branchReset/expected/repo/.git_keep/objects/dc/d348507ba1da8f6479b9d964daa302b2fb9d9c diff --git a/test/integration/branchReset/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/branchReset/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/branchReset/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/branchReset/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/branchReset/expected/.git_keep/objects/e3/ae5c6d8407e8307b9bc77923be78c901408f6e b/test/integration/branchReset/expected/repo/.git_keep/objects/e3/ae5c6d8407e8307b9bc77923be78c901408f6e similarity index 100% rename from test/integration/branchReset/expected/.git_keep/objects/e3/ae5c6d8407e8307b9bc77923be78c901408f6e rename to test/integration/branchReset/expected/repo/.git_keep/objects/e3/ae5c6d8407e8307b9bc77923be78c901408f6e diff --git a/test/integration/branchReset/expected/.git_keep/objects/e4/666ba294866d5c16f9afebcacf8f4adfee7439 b/test/integration/branchReset/expected/repo/.git_keep/objects/e4/666ba294866d5c16f9afebcacf8f4adfee7439 similarity index 100% rename from test/integration/branchReset/expected/.git_keep/objects/e4/666ba294866d5c16f9afebcacf8f4adfee7439 rename to test/integration/branchReset/expected/repo/.git_keep/objects/e4/666ba294866d5c16f9afebcacf8f4adfee7439 diff --git a/test/integration/branchReset/expected/.git_keep/objects/ee/a0cf47f42fe8d027b4cecaf534ecc0673f7981 b/test/integration/branchReset/expected/repo/.git_keep/objects/ee/a0cf47f42fe8d027b4cecaf534ecc0673f7981 similarity index 100% rename from test/integration/branchReset/expected/.git_keep/objects/ee/a0cf47f42fe8d027b4cecaf534ecc0673f7981 rename to test/integration/branchReset/expected/repo/.git_keep/objects/ee/a0cf47f42fe8d027b4cecaf534ecc0673f7981 diff --git a/test/integration/branchReset/expected/.git_keep/objects/f3/f762af4429ae89fa0dae3d0a5b500ca11630c4 b/test/integration/branchReset/expected/repo/.git_keep/objects/f3/f762af4429ae89fa0dae3d0a5b500ca11630c4 similarity index 100% rename from test/integration/branchReset/expected/.git_keep/objects/f3/f762af4429ae89fa0dae3d0a5b500ca11630c4 rename to test/integration/branchReset/expected/repo/.git_keep/objects/f3/f762af4429ae89fa0dae3d0a5b500ca11630c4 diff --git a/test/integration/branchReset/expected/.git_keep/objects/fe/427b52bbbe9dac81b463a162f37ab979ca772b b/test/integration/branchReset/expected/repo/.git_keep/objects/fe/427b52bbbe9dac81b463a162f37ab979ca772b similarity index 100% rename from test/integration/branchReset/expected/.git_keep/objects/fe/427b52bbbe9dac81b463a162f37ab979ca772b rename to test/integration/branchReset/expected/repo/.git_keep/objects/fe/427b52bbbe9dac81b463a162f37ab979ca772b diff --git a/test/integration/branchReset/expected/.git_keep/refs/heads/develop b/test/integration/branchReset/expected/repo/.git_keep/refs/heads/develop similarity index 100% rename from test/integration/branchReset/expected/.git_keep/refs/heads/develop rename to test/integration/branchReset/expected/repo/.git_keep/refs/heads/develop diff --git a/test/integration/branchReset/expected/.git_keep/refs/heads/master b/test/integration/branchReset/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/branchReset/expected/.git_keep/refs/heads/master rename to test/integration/branchReset/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/branchReset/expected/directory/file b/test/integration/branchReset/expected/repo/directory/file similarity index 100% rename from test/integration/branchReset/expected/directory/file rename to test/integration/branchReset/expected/repo/directory/file diff --git a/test/integration/branchReset/expected/directory/file2 b/test/integration/branchReset/expected/repo/directory/file2 similarity index 100% rename from test/integration/branchReset/expected/directory/file2 rename to test/integration/branchReset/expected/repo/directory/file2 diff --git a/test/integration/branchReset/expected/file1 b/test/integration/branchReset/expected/repo/file1 similarity index 100% rename from test/integration/branchReset/expected/file1 rename to test/integration/branchReset/expected/repo/file1 diff --git a/test/integration/branchReset/expected/file3 b/test/integration/branchReset/expected/repo/file3 similarity index 100% rename from test/integration/branchReset/expected/file3 rename to test/integration/branchReset/expected/repo/file3 diff --git a/test/integration/branchReset/expected/file4 b/test/integration/branchReset/expected/repo/file4 similarity index 100% rename from test/integration/branchReset/expected/file4 rename to test/integration/branchReset/expected/repo/file4 diff --git a/test/integration/branchReset/expected/file5 b/test/integration/branchReset/expected/repo/file5 similarity index 100% rename from test/integration/branchReset/expected/file5 rename to test/integration/branchReset/expected/repo/file5 diff --git a/test/integration/branchSuggestions/expected/.git_keep/HEAD b/test/integration/branchSuggestions/expected/.git_keep/HEAD deleted file mode 100644 index e2b7d4d2e..000000000 --- a/test/integration/branchSuggestions/expected/.git_keep/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/new-branch-3 diff --git a/test/integration/branchSuggestions/expected/.git_keep/index b/test/integration/branchSuggestions/expected/.git_keep/index deleted file mode 100644 index fbde0e92a..000000000 Binary files a/test/integration/branchSuggestions/expected/.git_keep/index and /dev/null differ diff --git a/test/integration/branchSuggestions/expected/.git_keep/logs/HEAD b/test/integration/branchSuggestions/expected/.git_keep/logs/HEAD deleted file mode 100644 index 4deacbbf3..000000000 --- a/test/integration/branchSuggestions/expected/.git_keep/logs/HEAD +++ /dev/null @@ -1,8 +0,0 @@ -0000000000000000000000000000000000000000 75e9e90a1d58c37d97d46a543dfbfd0f33fc52d8 CI 1617675445 +1000 commit (initial): file0 -75e9e90a1d58c37d97d46a543dfbfd0f33fc52d8 75e9e90a1d58c37d97d46a543dfbfd0f33fc52d8 CI 1617675445 +1000 checkout: moving from master to new-branch -75e9e90a1d58c37d97d46a543dfbfd0f33fc52d8 75e9e90a1d58c37d97d46a543dfbfd0f33fc52d8 CI 1617675445 +1000 checkout: moving from new-branch to new-branch-2 -75e9e90a1d58c37d97d46a543dfbfd0f33fc52d8 75e9e90a1d58c37d97d46a543dfbfd0f33fc52d8 CI 1617675445 +1000 checkout: moving from new-branch-2 to new-branch-3 -75e9e90a1d58c37d97d46a543dfbfd0f33fc52d8 75e9e90a1d58c37d97d46a543dfbfd0f33fc52d8 CI 1617675445 +1000 checkout: moving from new-branch-3 to old-branch -75e9e90a1d58c37d97d46a543dfbfd0f33fc52d8 75e9e90a1d58c37d97d46a543dfbfd0f33fc52d8 CI 1617675445 +1000 checkout: moving from old-branch to old-branch-2 -75e9e90a1d58c37d97d46a543dfbfd0f33fc52d8 75e9e90a1d58c37d97d46a543dfbfd0f33fc52d8 CI 1617675445 +1000 checkout: moving from old-branch-2 to old-branch-3 -75e9e90a1d58c37d97d46a543dfbfd0f33fc52d8 75e9e90a1d58c37d97d46a543dfbfd0f33fc52d8 CI 1617675450 +1000 checkout: moving from old-branch-3 to new-branch-3 diff --git a/test/integration/branchSuggestions/expected/.git_keep/logs/refs/heads/master b/test/integration/branchSuggestions/expected/.git_keep/logs/refs/heads/master deleted file mode 100644 index 8c6dabf38..000000000 --- a/test/integration/branchSuggestions/expected/.git_keep/logs/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 75e9e90a1d58c37d97d46a543dfbfd0f33fc52d8 CI 1617675445 +1000 commit (initial): file0 diff --git a/test/integration/branchSuggestions/expected/.git_keep/logs/refs/heads/new-branch b/test/integration/branchSuggestions/expected/.git_keep/logs/refs/heads/new-branch deleted file mode 100644 index 530a272f0..000000000 --- a/test/integration/branchSuggestions/expected/.git_keep/logs/refs/heads/new-branch +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 75e9e90a1d58c37d97d46a543dfbfd0f33fc52d8 CI 1617675445 +1000 branch: Created from HEAD diff --git a/test/integration/branchSuggestions/expected/.git_keep/logs/refs/heads/new-branch-2 b/test/integration/branchSuggestions/expected/.git_keep/logs/refs/heads/new-branch-2 deleted file mode 100644 index 530a272f0..000000000 --- a/test/integration/branchSuggestions/expected/.git_keep/logs/refs/heads/new-branch-2 +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 75e9e90a1d58c37d97d46a543dfbfd0f33fc52d8 CI 1617675445 +1000 branch: Created from HEAD diff --git a/test/integration/branchSuggestions/expected/.git_keep/logs/refs/heads/new-branch-3 b/test/integration/branchSuggestions/expected/.git_keep/logs/refs/heads/new-branch-3 deleted file mode 100644 index 530a272f0..000000000 --- a/test/integration/branchSuggestions/expected/.git_keep/logs/refs/heads/new-branch-3 +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 75e9e90a1d58c37d97d46a543dfbfd0f33fc52d8 CI 1617675445 +1000 branch: Created from HEAD diff --git a/test/integration/branchSuggestions/expected/.git_keep/logs/refs/heads/old-branch b/test/integration/branchSuggestions/expected/.git_keep/logs/refs/heads/old-branch deleted file mode 100644 index 530a272f0..000000000 --- a/test/integration/branchSuggestions/expected/.git_keep/logs/refs/heads/old-branch +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 75e9e90a1d58c37d97d46a543dfbfd0f33fc52d8 CI 1617675445 +1000 branch: Created from HEAD diff --git a/test/integration/branchSuggestions/expected/.git_keep/logs/refs/heads/old-branch-2 b/test/integration/branchSuggestions/expected/.git_keep/logs/refs/heads/old-branch-2 deleted file mode 100644 index 530a272f0..000000000 --- a/test/integration/branchSuggestions/expected/.git_keep/logs/refs/heads/old-branch-2 +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 75e9e90a1d58c37d97d46a543dfbfd0f33fc52d8 CI 1617675445 +1000 branch: Created from HEAD diff --git a/test/integration/branchSuggestions/expected/.git_keep/logs/refs/heads/old-branch-3 b/test/integration/branchSuggestions/expected/.git_keep/logs/refs/heads/old-branch-3 deleted file mode 100644 index 530a272f0..000000000 --- a/test/integration/branchSuggestions/expected/.git_keep/logs/refs/heads/old-branch-3 +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 75e9e90a1d58c37d97d46a543dfbfd0f33fc52d8 CI 1617675445 +1000 branch: Created from HEAD diff --git a/test/integration/branchSuggestions/expected/.git_keep/objects/75/e9e90a1d58c37d97d46a543dfbfd0f33fc52d8 b/test/integration/branchSuggestions/expected/.git_keep/objects/75/e9e90a1d58c37d97d46a543dfbfd0f33fc52d8 deleted file mode 100644 index 16270b9a6..000000000 --- a/test/integration/branchSuggestions/expected/.git_keep/objects/75/e9e90a1d58c37d97d46a543dfbfd0f33fc52d8 +++ /dev/null @@ -1,2 +0,0 @@ -xŤÍA -Â0Fa×9Ĺ왉“Ä€ĐUŹ‘4°Đ)<ľ=‚ŰÇoé­­Dő4v€WřcŚ%‹ >ř–«V¶ąTˇQŐšôŻľÓ4Ó}šźř¦öŢpYz{x >8UGgafsÔc2đ'7uÝŔćÜď+ö \ No newline at end of file diff --git a/test/integration/branchSuggestions/expected/.git_keep/refs/heads/master b/test/integration/branchSuggestions/expected/.git_keep/refs/heads/master deleted file mode 100644 index ae478b1c7..000000000 --- a/test/integration/branchSuggestions/expected/.git_keep/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -75e9e90a1d58c37d97d46a543dfbfd0f33fc52d8 diff --git a/test/integration/branchSuggestions/expected/.git_keep/refs/heads/new-branch b/test/integration/branchSuggestions/expected/.git_keep/refs/heads/new-branch deleted file mode 100644 index ae478b1c7..000000000 --- a/test/integration/branchSuggestions/expected/.git_keep/refs/heads/new-branch +++ /dev/null @@ -1 +0,0 @@ -75e9e90a1d58c37d97d46a543dfbfd0f33fc52d8 diff --git a/test/integration/branchSuggestions/expected/.git_keep/refs/heads/new-branch-2 b/test/integration/branchSuggestions/expected/.git_keep/refs/heads/new-branch-2 deleted file mode 100644 index ae478b1c7..000000000 --- a/test/integration/branchSuggestions/expected/.git_keep/refs/heads/new-branch-2 +++ /dev/null @@ -1 +0,0 @@ -75e9e90a1d58c37d97d46a543dfbfd0f33fc52d8 diff --git a/test/integration/branchSuggestions/expected/.git_keep/refs/heads/new-branch-3 b/test/integration/branchSuggestions/expected/.git_keep/refs/heads/new-branch-3 deleted file mode 100644 index ae478b1c7..000000000 --- a/test/integration/branchSuggestions/expected/.git_keep/refs/heads/new-branch-3 +++ /dev/null @@ -1 +0,0 @@ -75e9e90a1d58c37d97d46a543dfbfd0f33fc52d8 diff --git a/test/integration/branchSuggestions/expected/.git_keep/refs/heads/old-branch b/test/integration/branchSuggestions/expected/.git_keep/refs/heads/old-branch deleted file mode 100644 index ae478b1c7..000000000 --- a/test/integration/branchSuggestions/expected/.git_keep/refs/heads/old-branch +++ /dev/null @@ -1 +0,0 @@ -75e9e90a1d58c37d97d46a543dfbfd0f33fc52d8 diff --git a/test/integration/branchSuggestions/expected/.git_keep/refs/heads/old-branch-2 b/test/integration/branchSuggestions/expected/.git_keep/refs/heads/old-branch-2 deleted file mode 100644 index ae478b1c7..000000000 --- a/test/integration/branchSuggestions/expected/.git_keep/refs/heads/old-branch-2 +++ /dev/null @@ -1 +0,0 @@ -75e9e90a1d58c37d97d46a543dfbfd0f33fc52d8 diff --git a/test/integration/branchSuggestions/expected/.git_keep/refs/heads/old-branch-3 b/test/integration/branchSuggestions/expected/.git_keep/refs/heads/old-branch-3 deleted file mode 100644 index ae478b1c7..000000000 --- a/test/integration/branchSuggestions/expected/.git_keep/refs/heads/old-branch-3 +++ /dev/null @@ -1 +0,0 @@ -75e9e90a1d58c37d97d46a543dfbfd0f33fc52d8 diff --git a/test/integration/branchSuggestions/recording.json b/test/integration/branchSuggestions/recording.json deleted file mode 100644 index 207dbcb3f..000000000 --- a/test/integration/branchSuggestions/recording.json +++ /dev/null @@ -1 +0,0 @@ -{"KeyEvents":[{"Timestamp":639,"Mod":0,"Key":259,"Ch":0},{"Timestamp":1752,"Mod":0,"Key":256,"Ch":99},{"Timestamp":2183,"Mod":0,"Key":256,"Ch":110},{"Timestamp":2271,"Mod":0,"Key":256,"Ch":101},{"Timestamp":2327,"Mod":0,"Key":256,"Ch":119},{"Timestamp":2599,"Mod":0,"Key":256,"Ch":45},{"Timestamp":3583,"Mod":0,"Key":9,"Ch":9},{"Timestamp":3880,"Mod":0,"Key":258,"Ch":0},{"Timestamp":4175,"Mod":0,"Key":13,"Ch":13},{"Timestamp":4815,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":272,"Height":74}]} \ No newline at end of file diff --git a/test/integration/branchSuggestions/setup.sh b/test/integration/branchSuggestions/setup.sh deleted file mode 100644 index d67fa9291..000000000 --- a/test/integration/branchSuggestions/setup.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh - -set -e - -cd $1 - -git init - -git config user.email "CI@example.com" -git config user.name "CI" - -echo test0 > file0 -git add . -git commit -am file0 - -git checkout -b new-branch -git checkout -b new-branch-2 -git checkout -b new-branch-3 -git checkout -b old-branch -git checkout -b old-branch-2 -git checkout -b old-branch-3 diff --git a/test/integration/branchSuggestions/test.json b/test/integration/branchSuggestions/test.json deleted file mode 100644 index fafad1962..000000000 --- a/test/integration/branchSuggestions/test.json +++ /dev/null @@ -1 +0,0 @@ -{ "description": "Checking out a branch with name suggestions", "speed": 100 } diff --git a/test/integration/cherryPicking/expected/.git_keep/COMMIT_EDITMSG b/test/integration/cherryPicking/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/cherryPicking/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/branchSuggestions/expected/.git_keep/FETCH_HEAD b/test/integration/cherryPicking/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/branchSuggestions/expected/.git_keep/FETCH_HEAD rename to test/integration/cherryPicking/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/cherryPicking/expected/.git_keep/HEAD b/test/integration/cherryPicking/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/HEAD rename to test/integration/cherryPicking/expected/repo/.git_keep/HEAD diff --git a/test/integration/cherryPicking/expected/.git_keep/ORIG_HEAD b/test/integration/cherryPicking/expected/repo/.git_keep/ORIG_HEAD similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/ORIG_HEAD rename to test/integration/cherryPicking/expected/repo/.git_keep/ORIG_HEAD diff --git a/test/integration/cherryPicking/expected/.git_keep/REBASE_HEAD b/test/integration/cherryPicking/expected/repo/.git_keep/REBASE_HEAD similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/REBASE_HEAD rename to test/integration/cherryPicking/expected/repo/.git_keep/REBASE_HEAD diff --git a/test/integration/branchSuggestions/expected/.git_keep/config b/test/integration/cherryPicking/expected/repo/.git_keep/config similarity index 100% rename from test/integration/branchSuggestions/expected/.git_keep/config rename to test/integration/cherryPicking/expected/repo/.git_keep/config diff --git a/test/integration/branchSuggestions/expected/.git_keep/description b/test/integration/cherryPicking/expected/repo/.git_keep/description similarity index 100% rename from test/integration/branchSuggestions/expected/.git_keep/description rename to test/integration/cherryPicking/expected/repo/.git_keep/description diff --git a/test/integration/cherryPicking/expected/.git_keep/index b/test/integration/cherryPicking/expected/repo/.git_keep/index similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/index rename to test/integration/cherryPicking/expected/repo/.git_keep/index diff --git a/test/integration/branchSuggestions/expected/.git_keep/info/exclude b/test/integration/cherryPicking/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/branchSuggestions/expected/.git_keep/info/exclude rename to test/integration/cherryPicking/expected/repo/.git_keep/info/exclude diff --git a/test/integration/cherryPicking/expected/.git_keep/logs/HEAD b/test/integration/cherryPicking/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/logs/HEAD rename to test/integration/cherryPicking/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/cherryPicking/expected/.git_keep/logs/refs/heads/base_branch b/test/integration/cherryPicking/expected/repo/.git_keep/logs/refs/heads/base_branch similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/logs/refs/heads/base_branch rename to test/integration/cherryPicking/expected/repo/.git_keep/logs/refs/heads/base_branch diff --git a/test/integration/cherryPicking/expected/.git_keep/logs/refs/heads/develop b/test/integration/cherryPicking/expected/repo/.git_keep/logs/refs/heads/develop similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/logs/refs/heads/develop rename to test/integration/cherryPicking/expected/repo/.git_keep/logs/refs/heads/develop diff --git a/test/integration/cherryPicking/expected/.git_keep/logs/refs/heads/feature/cherry-picking b/test/integration/cherryPicking/expected/repo/.git_keep/logs/refs/heads/feature/cherry-picking similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/logs/refs/heads/feature/cherry-picking rename to test/integration/cherryPicking/expected/repo/.git_keep/logs/refs/heads/feature/cherry-picking diff --git a/test/integration/cherryPicking/expected/.git_keep/logs/refs/heads/master b/test/integration/cherryPicking/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/logs/refs/heads/master rename to test/integration/cherryPicking/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/cherryPicking/expected/.git_keep/logs/refs/heads/other_branch b/test/integration/cherryPicking/expected/repo/.git_keep/logs/refs/heads/other_branch similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/logs/refs/heads/other_branch rename to test/integration/cherryPicking/expected/repo/.git_keep/logs/refs/heads/other_branch diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/05/56e5da1cda4e150d6cc1182be6efdb061f59fe b/test/integration/cherryPicking/expected/repo/.git_keep/objects/05/56e5da1cda4e150d6cc1182be6efdb061f59fe similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/05/56e5da1cda4e150d6cc1182be6efdb061f59fe rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/05/56e5da1cda4e150d6cc1182be6efdb061f59fe diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/09/cbe8c6717c06a61876b7b641a46a62bf3c585d b/test/integration/cherryPicking/expected/repo/.git_keep/objects/09/cbe8c6717c06a61876b7b641a46a62bf3c585d similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/09/cbe8c6717c06a61876b7b641a46a62bf3c585d rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/09/cbe8c6717c06a61876b7b641a46a62bf3c585d diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/16/f2bcca6ce7bcc17277103a5555072a6c3322a2 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/16/f2bcca6ce7bcc17277103a5555072a6c3322a2 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/16/f2bcca6ce7bcc17277103a5555072a6c3322a2 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/16/f2bcca6ce7bcc17277103a5555072a6c3322a2 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/17/3a40ed58e33060166ccbfb7d0ccc0387be5f09 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/17/3a40ed58e33060166ccbfb7d0ccc0387be5f09 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/17/3a40ed58e33060166ccbfb7d0ccc0387be5f09 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/17/3a40ed58e33060166ccbfb7d0ccc0387be5f09 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/17/4a8c9444cfa700682d74059d9fa9be5749242c b/test/integration/cherryPicking/expected/repo/.git_keep/objects/17/4a8c9444cfa700682d74059d9fa9be5749242c similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/17/4a8c9444cfa700682d74059d9fa9be5749242c rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/17/4a8c9444cfa700682d74059d9fa9be5749242c diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/18/f469bc737f6c2a589205e2ddefceb32a7cc3a7 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/18/f469bc737f6c2a589205e2ddefceb32a7cc3a7 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/18/f469bc737f6c2a589205e2ddefceb32a7cc3a7 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/18/f469bc737f6c2a589205e2ddefceb32a7cc3a7 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/19/079c78db18112c5a2720896a040014a2d05f6d b/test/integration/cherryPicking/expected/repo/.git_keep/objects/19/079c78db18112c5a2720896a040014a2d05f6d similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/19/079c78db18112c5a2720896a040014a2d05f6d rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/19/079c78db18112c5a2720896a040014a2d05f6d diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/1b/9ae5f5dff631baaa180a30afd9983f83dc27ca b/test/integration/cherryPicking/expected/repo/.git_keep/objects/1b/9ae5f5dff631baaa180a30afd9983f83dc27ca similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/1b/9ae5f5dff631baaa180a30afd9983f83dc27ca rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/1b/9ae5f5dff631baaa180a30afd9983f83dc27ca diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/20/85c8dd0a80e95ed959e4db2ab98f66b970ad77 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/20/85c8dd0a80e95ed959e4db2ab98f66b970ad77 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/20/85c8dd0a80e95ed959e4db2ab98f66b970ad77 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/20/85c8dd0a80e95ed959e4db2ab98f66b970ad77 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/21/28c3c3def18d6e2a389957252fdb69ba85fce0 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/21/28c3c3def18d6e2a389957252fdb69ba85fce0 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/21/28c3c3def18d6e2a389957252fdb69ba85fce0 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/21/28c3c3def18d6e2a389957252fdb69ba85fce0 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/21/78af7503938665881174069be4d48fa483e4af b/test/integration/cherryPicking/expected/repo/.git_keep/objects/21/78af7503938665881174069be4d48fa483e4af similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/21/78af7503938665881174069be4d48fa483e4af rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/21/78af7503938665881174069be4d48fa483e4af diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/22/b0fd807dd5e428c2d818aef6a2311d7c11e885 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/22/b0fd807dd5e428c2d818aef6a2311d7c11e885 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/22/b0fd807dd5e428c2d818aef6a2311d7c11e885 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/22/b0fd807dd5e428c2d818aef6a2311d7c11e885 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/23/4e2fa9a01b8d7e849b0c2a1bbd550e788ea18d b/test/integration/cherryPicking/expected/repo/.git_keep/objects/23/4e2fa9a01b8d7e849b0c2a1bbd550e788ea18d similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/23/4e2fa9a01b8d7e849b0c2a1bbd550e788ea18d rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/23/4e2fa9a01b8d7e849b0c2a1bbd550e788ea18d diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/24/6f7487e08e6330ccbec4053e701145d53f64d4 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/24/6f7487e08e6330ccbec4053e701145d53f64d4 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/24/6f7487e08e6330ccbec4053e701145d53f64d4 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/24/6f7487e08e6330ccbec4053e701145d53f64d4 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/24/93c87610e0a9b8edfca592cb01a027f60ce587 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/24/93c87610e0a9b8edfca592cb01a027f60ce587 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/24/93c87610e0a9b8edfca592cb01a027f60ce587 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/24/93c87610e0a9b8edfca592cb01a027f60ce587 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/2c/f63d6da8c52131dd79622f8572b44a1267e420 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/2c/f63d6da8c52131dd79622f8572b44a1267e420 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/2c/f63d6da8c52131dd79622f8572b44a1267e420 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/2c/f63d6da8c52131dd79622f8572b44a1267e420 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/2e/cced19ece4424e0d3f26eb3ea2ccb6bfeafaa8 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/2e/cced19ece4424e0d3f26eb3ea2ccb6bfeafaa8 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/2e/cced19ece4424e0d3f26eb3ea2ccb6bfeafaa8 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/2e/cced19ece4424e0d3f26eb3ea2ccb6bfeafaa8 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/33/9e2d062760be9ecdb4bb90f97bdb0e634e7831 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/33/9e2d062760be9ecdb4bb90f97bdb0e634e7831 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/33/9e2d062760be9ecdb4bb90f97bdb0e634e7831 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/33/9e2d062760be9ecdb4bb90f97bdb0e634e7831 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/34/c74161eef968fc951cf170a011fa8abfeddbcd b/test/integration/cherryPicking/expected/repo/.git_keep/objects/34/c74161eef968fc951cf170a011fa8abfeddbcd similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/34/c74161eef968fc951cf170a011fa8abfeddbcd rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/34/c74161eef968fc951cf170a011fa8abfeddbcd diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/36/e0ef3e52c6e29e64980c71defbab6064d2da8c b/test/integration/cherryPicking/expected/repo/.git_keep/objects/36/e0ef3e52c6e29e64980c71defbab6064d2da8c similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/36/e0ef3e52c6e29e64980c71defbab6064d2da8c rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/36/e0ef3e52c6e29e64980c71defbab6064d2da8c diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/3e/0d4389ab458a8643281e494e3ebae7ce307eec b/test/integration/cherryPicking/expected/repo/.git_keep/objects/3e/0d4389ab458a8643281e494e3ebae7ce307eec similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/3e/0d4389ab458a8643281e494e3ebae7ce307eec rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/3e/0d4389ab458a8643281e494e3ebae7ce307eec diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/45/20f99d650662a3f597a200fea5f2599f528180 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/45/20f99d650662a3f597a200fea5f2599f528180 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/45/20f99d650662a3f597a200fea5f2599f528180 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/45/20f99d650662a3f597a200fea5f2599f528180 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/4f/80ec0c7b09eeeb580d0c19947477c02bc88c25 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/4f/80ec0c7b09eeeb580d0c19947477c02bc88c25 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/4f/80ec0c7b09eeeb580d0c19947477c02bc88c25 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/4f/80ec0c7b09eeeb580d0c19947477c02bc88c25 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/5d/2484f3cb6ce658e296526c48e1a376b2790dfc b/test/integration/cherryPicking/expected/repo/.git_keep/objects/5d/2484f3cb6ce658e296526c48e1a376b2790dfc similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/5d/2484f3cb6ce658e296526c48e1a376b2790dfc rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/5d/2484f3cb6ce658e296526c48e1a376b2790dfc diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/5d/a4d9200457542d875fe4def54ac98c16332db0 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/5d/a4d9200457542d875fe4def54ac98c16332db0 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/5d/a4d9200457542d875fe4def54ac98c16332db0 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/5d/a4d9200457542d875fe4def54ac98c16332db0 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/5f/3e4598b46a912f0f95a4898743e979343c82f3 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/5f/3e4598b46a912f0f95a4898743e979343c82f3 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/5f/3e4598b46a912f0f95a4898743e979343c82f3 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/5f/3e4598b46a912f0f95a4898743e979343c82f3 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/60/91d709b275e712111d016d9b3a4fb44e63f1f6 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/60/91d709b275e712111d016d9b3a4fb44e63f1f6 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/60/91d709b275e712111d016d9b3a4fb44e63f1f6 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/60/91d709b275e712111d016d9b3a4fb44e63f1f6 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/61/01e935461d4cd862ae4a720846e87880d198b9 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/61/01e935461d4cd862ae4a720846e87880d198b9 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/61/01e935461d4cd862ae4a720846e87880d198b9 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/61/01e935461d4cd862ae4a720846e87880d198b9 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/65/c0438e428cd1aa94588eaa52eb7ebad7ec62fd b/test/integration/cherryPicking/expected/repo/.git_keep/objects/65/c0438e428cd1aa94588eaa52eb7ebad7ec62fd similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/65/c0438e428cd1aa94588eaa52eb7ebad7ec62fd rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/65/c0438e428cd1aa94588eaa52eb7ebad7ec62fd diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/68/728b56ed31d03ca94496b9e2a45c62ba0f4e8f b/test/integration/cherryPicking/expected/repo/.git_keep/objects/68/728b56ed31d03ca94496b9e2a45c62ba0f4e8f similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/68/728b56ed31d03ca94496b9e2a45c62ba0f4e8f rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/68/728b56ed31d03ca94496b9e2a45c62ba0f4e8f diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/69/6a8fd43c580b3bed203977faab4566b052a4e4 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/69/6a8fd43c580b3bed203977faab4566b052a4e4 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/69/6a8fd43c580b3bed203977faab4566b052a4e4 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/69/6a8fd43c580b3bed203977faab4566b052a4e4 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/6b/6092c6840d05583489cc32a1260db0d5390a98 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/6b/6092c6840d05583489cc32a1260db0d5390a98 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/6b/6092c6840d05583489cc32a1260db0d5390a98 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/6b/6092c6840d05583489cc32a1260db0d5390a98 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/73/17cf7580efd92f974c8dfb3cde84eded8dafec b/test/integration/cherryPicking/expected/repo/.git_keep/objects/73/17cf7580efd92f974c8dfb3cde84eded8dafec similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/73/17cf7580efd92f974c8dfb3cde84eded8dafec rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/73/17cf7580efd92f974c8dfb3cde84eded8dafec diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/78/3666de4acbb22a9efc205197667f5136118c54 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/78/3666de4acbb22a9efc205197667f5136118c54 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/78/3666de4acbb22a9efc205197667f5136118c54 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/78/3666de4acbb22a9efc205197667f5136118c54 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/78/a5ec82970200538b70f5ac61c18acb45ccb8ee b/test/integration/cherryPicking/expected/repo/.git_keep/objects/78/a5ec82970200538b70f5ac61c18acb45ccb8ee similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/78/a5ec82970200538b70f5ac61c18acb45ccb8ee rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/78/a5ec82970200538b70f5ac61c18acb45ccb8ee diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/79/23e4a952f4b169373b0389be6a9db3cd929547 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/79/23e4a952f4b169373b0389be6a9db3cd929547 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/79/23e4a952f4b169373b0389be6a9db3cd929547 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/79/23e4a952f4b169373b0389be6a9db3cd929547 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/88/9b0fdfe5f2ae3d7df3066f3bc1e181fa712c8d b/test/integration/cherryPicking/expected/repo/.git_keep/objects/88/9b0fdfe5f2ae3d7df3066f3bc1e181fa712c8d similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/88/9b0fdfe5f2ae3d7df3066f3bc1e181fa712c8d rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/88/9b0fdfe5f2ae3d7df3066f3bc1e181fa712c8d diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/88/c39cdc29c995f8e1a63ccd48e7bbd6d96cb8b8 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/88/c39cdc29c995f8e1a63ccd48e7bbd6d96cb8b8 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/88/c39cdc29c995f8e1a63ccd48e7bbd6d96cb8b8 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/88/c39cdc29c995f8e1a63ccd48e7bbd6d96cb8b8 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/90/a84fd62f8033027fab3e567a81d5ed2a6a71cd b/test/integration/cherryPicking/expected/repo/.git_keep/objects/90/a84fd62f8033027fab3e567a81d5ed2a6a71cd similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/90/a84fd62f8033027fab3e567a81d5ed2a6a71cd rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/90/a84fd62f8033027fab3e567a81d5ed2a6a71cd diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/95/9d7a10da71acf97b17300b40a3b4f30903e09c b/test/integration/cherryPicking/expected/repo/.git_keep/objects/95/9d7a10da71acf97b17300b40a3b4f30903e09c similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/95/9d7a10da71acf97b17300b40a3b4f30903e09c rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/95/9d7a10da71acf97b17300b40a3b4f30903e09c diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/9b/b8cd97914c8e8a7b8a6ec6f94bca0b09fa0048 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/9b/b8cd97914c8e8a7b8a6ec6f94bca0b09fa0048 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/9b/b8cd97914c8e8a7b8a6ec6f94bca0b09fa0048 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/9b/b8cd97914c8e8a7b8a6ec6f94bca0b09fa0048 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/9d/e8260b738a34a74533df54f2e404276aa96242 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/9d/e8260b738a34a74533df54f2e404276aa96242 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/9d/e8260b738a34a74533df54f2e404276aa96242 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/9d/e8260b738a34a74533df54f2e404276aa96242 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/af/a76754c933269d7cd45630a7184a20849dbe9c b/test/integration/cherryPicking/expected/repo/.git_keep/objects/af/a76754c933269d7cd45630a7184a20849dbe9c similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/af/a76754c933269d7cd45630a7184a20849dbe9c rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/af/a76754c933269d7cd45630a7184a20849dbe9c diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/b4/121e2d6aa156227b6541431ddfb8594904b520 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/b4/121e2d6aa156227b6541431ddfb8594904b520 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/b4/121e2d6aa156227b6541431ddfb8594904b520 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/b4/121e2d6aa156227b6541431ddfb8594904b520 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/b8/ab98a9ab0599193a3f41a9cc5cb988283e6722 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/b8/ab98a9ab0599193a3f41a9cc5cb988283e6722 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/b8/ab98a9ab0599193a3f41a9cc5cb988283e6722 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/b8/ab98a9ab0599193a3f41a9cc5cb988283e6722 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/bd/6f34089ba29cbae102003bd973e9f37a235c2e b/test/integration/cherryPicking/expected/repo/.git_keep/objects/bd/6f34089ba29cbae102003bd973e9f37a235c2e similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/bd/6f34089ba29cbae102003bd973e9f37a235c2e rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/bd/6f34089ba29cbae102003bd973e9f37a235c2e diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/bf/cc5725cd2ef871ff804996f4e02beef3e4dec2 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/bf/cc5725cd2ef871ff804996f4e02beef3e4dec2 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/bf/cc5725cd2ef871ff804996f4e02beef3e4dec2 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/bf/cc5725cd2ef871ff804996f4e02beef3e4dec2 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/c1/dd146476a4a37fff75b88612a718281ea83b58 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/c1/dd146476a4a37fff75b88612a718281ea83b58 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/c1/dd146476a4a37fff75b88612a718281ea83b58 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/c1/dd146476a4a37fff75b88612a718281ea83b58 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/ce/ecbe69460104e09eb2cd7c865df520c5679a68 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/ce/ecbe69460104e09eb2cd7c865df520c5679a68 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/ce/ecbe69460104e09eb2cd7c865df520c5679a68 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/ce/ecbe69460104e09eb2cd7c865df520c5679a68 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/d0/60f7226715ca55b04e91fad2b8aca01badd993 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/d0/60f7226715ca55b04e91fad2b8aca01badd993 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/d0/60f7226715ca55b04e91fad2b8aca01badd993 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/d0/60f7226715ca55b04e91fad2b8aca01badd993 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/d8/a7c50dcab42b2b62e5c77cdcece620d3964bd4 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/d8/a7c50dcab42b2b62e5c77cdcece620d3964bd4 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/d8/a7c50dcab42b2b62e5c77cdcece620d3964bd4 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/d8/a7c50dcab42b2b62e5c77cdcece620d3964bd4 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/d8/e5ca46d2bbd7c115e5849e637efe2361203368 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/d8/e5ca46d2bbd7c115e5849e637efe2361203368 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/d8/e5ca46d2bbd7c115e5849e637efe2361203368 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/d8/e5ca46d2bbd7c115e5849e637efe2361203368 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/da/72a6dd6fbaaa4a2803a3c867437ab81a1a99a0 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/da/72a6dd6fbaaa4a2803a3c867437ab81a1a99a0 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/da/72a6dd6fbaaa4a2803a3c867437ab81a1a99a0 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/da/72a6dd6fbaaa4a2803a3c867437ab81a1a99a0 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/dc/d348507ba1da8f6479b9d964daa302b2fb9d9c b/test/integration/cherryPicking/expected/repo/.git_keep/objects/dc/d348507ba1da8f6479b9d964daa302b2fb9d9c similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/dc/d348507ba1da8f6479b9d964daa302b2fb9d9c rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/dc/d348507ba1da8f6479b9d964daa302b2fb9d9c diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/cherryPicking/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/e3/ae5c6d8407e8307b9bc77923be78c901408f6e b/test/integration/cherryPicking/expected/repo/.git_keep/objects/e3/ae5c6d8407e8307b9bc77923be78c901408f6e similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/e3/ae5c6d8407e8307b9bc77923be78c901408f6e rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/e3/ae5c6d8407e8307b9bc77923be78c901408f6e diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/e4/48ae5bf6371d80ebee24a22b6df341797a6511 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/e4/48ae5bf6371d80ebee24a22b6df341797a6511 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/e4/48ae5bf6371d80ebee24a22b6df341797a6511 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/e4/48ae5bf6371d80ebee24a22b6df341797a6511 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/e4/666ba294866d5c16f9afebcacf8f4adfee7439 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/e4/666ba294866d5c16f9afebcacf8f4adfee7439 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/e4/666ba294866d5c16f9afebcacf8f4adfee7439 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/e4/666ba294866d5c16f9afebcacf8f4adfee7439 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/e4/aa98b835d0a871d9ea02e6d286f0fbb2204cdc b/test/integration/cherryPicking/expected/repo/.git_keep/objects/e4/aa98b835d0a871d9ea02e6d286f0fbb2204cdc similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/e4/aa98b835d0a871d9ea02e6d286f0fbb2204cdc rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/e4/aa98b835d0a871d9ea02e6d286f0fbb2204cdc diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/ea/a48cb1e3d47e1b8b8df47bdc248e991207cc3d b/test/integration/cherryPicking/expected/repo/.git_keep/objects/ea/a48cb1e3d47e1b8b8df47bdc248e991207cc3d similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/ea/a48cb1e3d47e1b8b8df47bdc248e991207cc3d rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/ea/a48cb1e3d47e1b8b8df47bdc248e991207cc3d diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/eb/90e8d7b137a1d89480c9b22fd03199da77c9c7 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/eb/90e8d7b137a1d89480c9b22fd03199da77c9c7 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/eb/90e8d7b137a1d89480c9b22fd03199da77c9c7 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/eb/90e8d7b137a1d89480c9b22fd03199da77c9c7 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/ef/029771f117b5f31c972dfa546037662e243ca7 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/ef/029771f117b5f31c972dfa546037662e243ca7 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/ef/029771f117b5f31c972dfa546037662e243ca7 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/ef/029771f117b5f31c972dfa546037662e243ca7 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/f1/46c7f7b874778c1ad0cf9aebe45ec2427c7de2 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/f1/46c7f7b874778c1ad0cf9aebe45ec2427c7de2 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/f1/46c7f7b874778c1ad0cf9aebe45ec2427c7de2 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/f1/46c7f7b874778c1ad0cf9aebe45ec2427c7de2 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/f3/7d8713ef1390c277b45a084a08c0c142ff7ed9 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/f3/7d8713ef1390c277b45a084a08c0c142ff7ed9 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/f3/7d8713ef1390c277b45a084a08c0c142ff7ed9 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/f3/7d8713ef1390c277b45a084a08c0c142ff7ed9 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/f3/f762af4429ae89fa0dae3d0a5b500ca11630c4 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/f3/f762af4429ae89fa0dae3d0a5b500ca11630c4 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/f3/f762af4429ae89fa0dae3d0a5b500ca11630c4 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/f3/f762af4429ae89fa0dae3d0a5b500ca11630c4 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/f4/ffac820a371104fe611d81bc13a45b70a3ebb3 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/f4/ffac820a371104fe611d81bc13a45b70a3ebb3 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/f4/ffac820a371104fe611d81bc13a45b70a3ebb3 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/f4/ffac820a371104fe611d81bc13a45b70a3ebb3 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/fa/cb56c48e4718f71c08116153c93d87bc699671 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/fa/cb56c48e4718f71c08116153c93d87bc699671 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/fa/cb56c48e4718f71c08116153c93d87bc699671 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/fa/cb56c48e4718f71c08116153c93d87bc699671 diff --git a/test/integration/cherryPicking/expected/.git_keep/objects/fd/31cea7e0b6e8d334280be34db8dd86cdda3007 b/test/integration/cherryPicking/expected/repo/.git_keep/objects/fd/31cea7e0b6e8d334280be34db8dd86cdda3007 similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/objects/fd/31cea7e0b6e8d334280be34db8dd86cdda3007 rename to test/integration/cherryPicking/expected/repo/.git_keep/objects/fd/31cea7e0b6e8d334280be34db8dd86cdda3007 diff --git a/test/integration/cherryPicking/expected/.git_keep/refs/heads/base_branch b/test/integration/cherryPicking/expected/repo/.git_keep/refs/heads/base_branch similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/refs/heads/base_branch rename to test/integration/cherryPicking/expected/repo/.git_keep/refs/heads/base_branch diff --git a/test/integration/cherryPicking/expected/.git_keep/refs/heads/develop b/test/integration/cherryPicking/expected/repo/.git_keep/refs/heads/develop similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/refs/heads/develop rename to test/integration/cherryPicking/expected/repo/.git_keep/refs/heads/develop diff --git a/test/integration/cherryPicking/expected/.git_keep/refs/heads/feature/cherry-picking b/test/integration/cherryPicking/expected/repo/.git_keep/refs/heads/feature/cherry-picking similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/refs/heads/feature/cherry-picking rename to test/integration/cherryPicking/expected/repo/.git_keep/refs/heads/feature/cherry-picking diff --git a/test/integration/cherryPicking/expected/.git_keep/refs/heads/master b/test/integration/cherryPicking/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/refs/heads/master rename to test/integration/cherryPicking/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/cherryPicking/expected/.git_keep/refs/heads/other_branch b/test/integration/cherryPicking/expected/repo/.git_keep/refs/heads/other_branch similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/refs/heads/other_branch rename to test/integration/cherryPicking/expected/repo/.git_keep/refs/heads/other_branch diff --git a/test/integration/cherryPicking/expected/cherrypicking3 b/test/integration/cherryPicking/expected/repo/cherrypicking3 similarity index 100% rename from test/integration/cherryPicking/expected/cherrypicking3 rename to test/integration/cherryPicking/expected/repo/cherrypicking3 diff --git a/test/integration/cherryPicking/expected/cherrypicking4 b/test/integration/cherryPicking/expected/repo/cherrypicking4 similarity index 100% rename from test/integration/cherryPicking/expected/cherrypicking4 rename to test/integration/cherryPicking/expected/repo/cherrypicking4 diff --git a/test/integration/cherryPicking/expected/cherrypicking5 b/test/integration/cherryPicking/expected/repo/cherrypicking5 similarity index 100% rename from test/integration/cherryPicking/expected/cherrypicking5 rename to test/integration/cherryPicking/expected/repo/cherrypicking5 diff --git a/test/integration/cherryPicking/expected/directory/file b/test/integration/cherryPicking/expected/repo/directory/file similarity index 100% rename from test/integration/cherryPicking/expected/directory/file rename to test/integration/cherryPicking/expected/repo/directory/file diff --git a/test/integration/cherryPicking/expected/directory/file2 b/test/integration/cherryPicking/expected/repo/directory/file2 similarity index 100% rename from test/integration/cherryPicking/expected/directory/file2 rename to test/integration/cherryPicking/expected/repo/directory/file2 diff --git a/test/integration/cherryPicking/expected/file b/test/integration/cherryPicking/expected/repo/file similarity index 100% rename from test/integration/cherryPicking/expected/file rename to test/integration/cherryPicking/expected/repo/file diff --git a/test/integration/cherryPicking/expected/file1 b/test/integration/cherryPicking/expected/repo/file1 similarity index 100% rename from test/integration/cherryPicking/expected/file1 rename to test/integration/cherryPicking/expected/repo/file1 diff --git a/test/integration/cherryPicking/expected/file3 b/test/integration/cherryPicking/expected/repo/file3 similarity index 100% rename from test/integration/cherryPicking/expected/file3 rename to test/integration/cherryPicking/expected/repo/file3 diff --git a/test/integration/cherryPicking/expected/file4 b/test/integration/cherryPicking/expected/repo/file4 similarity index 100% rename from test/integration/cherryPicking/expected/file4 rename to test/integration/cherryPicking/expected/repo/file4 diff --git a/test/integration/cherryPicking/expected/file5 b/test/integration/cherryPicking/expected/repo/file5 similarity index 100% rename from test/integration/cherryPicking/expected/file5 rename to test/integration/cherryPicking/expected/repo/file5 diff --git a/test/integration/commit/expected/.git_keep/COMMIT_EDITMSG b/test/integration/commit/expected/.git_keep/COMMIT_EDITMSG deleted file mode 100644 index 01f9a2aac..000000000 --- a/test/integration/commit/expected/.git_keep/COMMIT_EDITMSG +++ /dev/null @@ -1 +0,0 @@ -commit diff --git a/test/integration/commit/expected/.git_keep/index b/test/integration/commit/expected/.git_keep/index deleted file mode 100644 index 6bda11a96..000000000 Binary files a/test/integration/commit/expected/.git_keep/index and /dev/null differ diff --git a/test/integration/commit/expected/.git_keep/logs/HEAD b/test/integration/commit/expected/.git_keep/logs/HEAD deleted file mode 100644 index 66475b1c1..000000000 --- a/test/integration/commit/expected/.git_keep/logs/HEAD +++ /dev/null @@ -1,5 +0,0 @@ -0000000000000000000000000000000000000000 3df3d8761bc0f0828596b11845aeac175b7b7393 CI 1617671339 +1000 commit (initial): myfile1 -3df3d8761bc0f0828596b11845aeac175b7b7393 a7d53cc21fd53100f955377be379423b0e386274 CI 1617671339 +1000 commit: myfile2 -a7d53cc21fd53100f955377be379423b0e386274 4ba4f1ed711a9081fab21bc222469aa5176a01f8 CI 1617671339 +1000 commit: myfile3 -4ba4f1ed711a9081fab21bc222469aa5176a01f8 1440bc6cc888a09dca2329d1060eec6de78d9d21 CI 1617671339 +1000 commit: myfile4 -1440bc6cc888a09dca2329d1060eec6de78d9d21 e7560e2cd4783a261ad32496cefed2d9f69a46e7 CI 1617671342 +1000 commit: commit diff --git a/test/integration/commit/expected/.git_keep/logs/refs/heads/master b/test/integration/commit/expected/.git_keep/logs/refs/heads/master deleted file mode 100644 index 66475b1c1..000000000 --- a/test/integration/commit/expected/.git_keep/logs/refs/heads/master +++ /dev/null @@ -1,5 +0,0 @@ -0000000000000000000000000000000000000000 3df3d8761bc0f0828596b11845aeac175b7b7393 CI 1617671339 +1000 commit (initial): myfile1 -3df3d8761bc0f0828596b11845aeac175b7b7393 a7d53cc21fd53100f955377be379423b0e386274 CI 1617671339 +1000 commit: myfile2 -a7d53cc21fd53100f955377be379423b0e386274 4ba4f1ed711a9081fab21bc222469aa5176a01f8 CI 1617671339 +1000 commit: myfile3 -4ba4f1ed711a9081fab21bc222469aa5176a01f8 1440bc6cc888a09dca2329d1060eec6de78d9d21 CI 1617671339 +1000 commit: myfile4 -1440bc6cc888a09dca2329d1060eec6de78d9d21 e7560e2cd4783a261ad32496cefed2d9f69a46e7 CI 1617671342 +1000 commit: commit diff --git a/test/integration/commit/expected/.git_keep/objects/14/40bc6cc888a09dca2329d1060eec6de78d9d21 b/test/integration/commit/expected/.git_keep/objects/14/40bc6cc888a09dca2329d1060eec6de78d9d21 deleted file mode 100644 index 0a95d28ba..000000000 Binary files a/test/integration/commit/expected/.git_keep/objects/14/40bc6cc888a09dca2329d1060eec6de78d9d21 and /dev/null differ diff --git a/test/integration/commit/expected/.git_keep/objects/3d/f3d8761bc0f0828596b11845aeac175b7b7393 b/test/integration/commit/expected/.git_keep/objects/3d/f3d8761bc0f0828596b11845aeac175b7b7393 deleted file mode 100644 index 9abdddbd3..000000000 --- a/test/integration/commit/expected/.git_keep/objects/3d/f3d8761bc0f0828596b11845aeac175b7b7393 +++ /dev/null @@ -1,3 +0,0 @@ -xŤÍA -Â0@Q×9Ĺě™iĆI -"BW=FšL°Đ!R"čííÜ~üÜĚÖÄrę»* J®d ŁĆ¬ĄDŐŔ ű"\Sľ.˝űłí0Íp›ć‡~’˝6˝äfw ˇ ĽáLčŽzLşţÉť}ëş)ą2r,Ď \ No newline at end of file diff --git a/test/integration/commit/expected/.git_keep/objects/4b/a4f1ed711a9081fab21bc222469aa5176a01f8 b/test/integration/commit/expected/.git_keep/objects/4b/a4f1ed711a9081fab21bc222469aa5176a01f8 deleted file mode 100644 index b67f58f76..000000000 Binary files a/test/integration/commit/expected/.git_keep/objects/4b/a4f1ed711a9081fab21bc222469aa5176a01f8 and /dev/null differ diff --git a/test/integration/commit/expected/.git_keep/objects/a7/d53cc21fd53100f955377be379423b0e386274 b/test/integration/commit/expected/.git_keep/objects/a7/d53cc21fd53100f955377be379423b0e386274 deleted file mode 100644 index 77d08ca03..000000000 Binary files a/test/integration/commit/expected/.git_keep/objects/a7/d53cc21fd53100f955377be379423b0e386274 and /dev/null differ diff --git a/test/integration/commit/expected/.git_keep/objects/e7/560e2cd4783a261ad32496cefed2d9f69a46e7 b/test/integration/commit/expected/.git_keep/objects/e7/560e2cd4783a261ad32496cefed2d9f69a46e7 deleted file mode 100644 index 9eb3492d1..000000000 Binary files a/test/integration/commit/expected/.git_keep/objects/e7/560e2cd4783a261ad32496cefed2d9f69a46e7 and /dev/null differ diff --git a/test/integration/commit/expected/.git_keep/refs/heads/master b/test/integration/commit/expected/.git_keep/refs/heads/master deleted file mode 100644 index c641d5ee6..000000000 --- a/test/integration/commit/expected/.git_keep/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -e7560e2cd4783a261ad32496cefed2d9f69a46e7 diff --git a/test/integration/commit/recording.json b/test/integration/commit/recording.json deleted file mode 100644 index eb45c9fde..000000000 --- a/test/integration/commit/recording.json +++ /dev/null @@ -1 +0,0 @@ -{"KeyEvents":[{"Timestamp":527,"Mod":0,"Key":256,"Ch":32},{"Timestamp":830,"Mod":0,"Key":256,"Ch":99},{"Timestamp":1127,"Mod":0,"Key":256,"Ch":99},{"Timestamp":1190,"Mod":0,"Key":256,"Ch":111},{"Timestamp":1335,"Mod":0,"Key":256,"Ch":109},{"Timestamp":1447,"Mod":0,"Key":256,"Ch":109},{"Timestamp":1583,"Mod":0,"Key":256,"Ch":105},{"Timestamp":1606,"Mod":0,"Key":256,"Ch":116},{"Timestamp":1935,"Mod":0,"Key":13,"Ch":13},{"Timestamp":2353,"Mod":0,"Key":27,"Ch":0}],"ResizeEvents":[{"Timestamp":0,"Width":127,"Height":35}]} diff --git a/test/integration/commitMultiline/expected/repo/.git_keep/COMMIT_EDITMSG b/test/integration/commitMultiline/expected/repo/.git_keep/COMMIT_EDITMSG new file mode 100644 index 000000000..bf8858b06 --- /dev/null +++ b/test/integration/commitMultiline/expected/repo/.git_keep/COMMIT_EDITMSG @@ -0,0 +1,3 @@ +first line + +third line diff --git a/test/integration/cherryPicking/expected/.git_keep/FETCH_HEAD b/test/integration/commitMultiline/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/FETCH_HEAD rename to test/integration/commitMultiline/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/commit/expected/.git_keep/HEAD b/test/integration/commitMultiline/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/commit/expected/.git_keep/HEAD rename to test/integration/commitMultiline/expected/repo/.git_keep/HEAD diff --git a/test/integration/cherryPicking/expected/.git_keep/config b/test/integration/commitMultiline/expected/repo/.git_keep/config similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/config rename to test/integration/commitMultiline/expected/repo/.git_keep/config diff --git a/test/integration/cherryPicking/expected/.git_keep/description b/test/integration/commitMultiline/expected/repo/.git_keep/description similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/description rename to test/integration/commitMultiline/expected/repo/.git_keep/description diff --git a/test/integration/commitMultiline/expected/repo/.git_keep/index b/test/integration/commitMultiline/expected/repo/.git_keep/index new file mode 100644 index 000000000..a08b4116e Binary files /dev/null and b/test/integration/commitMultiline/expected/repo/.git_keep/index differ diff --git a/test/integration/cherryPicking/expected/.git_keep/info/exclude b/test/integration/commitMultiline/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/cherryPicking/expected/.git_keep/info/exclude rename to test/integration/commitMultiline/expected/repo/.git_keep/info/exclude diff --git a/test/integration/commitMultiline/expected/repo/.git_keep/logs/HEAD b/test/integration/commitMultiline/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..88b99d1ab --- /dev/null +++ b/test/integration/commitMultiline/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,5 @@ +0000000000000000000000000000000000000000 176069f0ded1db43eecb3b629a6077dba6c68295 CI 1645602422 +1100 commit (initial): myfile1 +176069f0ded1db43eecb3b629a6077dba6c68295 9f1b5440546da24daad7014ccf3e1f4d81f9414b CI 1645602422 +1100 commit: myfile2 +9f1b5440546da24daad7014ccf3e1f4d81f9414b 3933a268c502712421b7bfa04888319d6f108574 CI 1645602422 +1100 commit: myfile3 +3933a268c502712421b7bfa04888319d6f108574 37128a3020849daa0847462d14c384cc74c42ae0 CI 1645602422 +1100 commit: myfile4 +37128a3020849daa0847462d14c384cc74c42ae0 574013716a7f007a27b647b90cdbc78d006d792b CI 1645602427 +1100 commit: first line diff --git a/test/integration/commitMultiline/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/commitMultiline/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..88b99d1ab --- /dev/null +++ b/test/integration/commitMultiline/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,5 @@ +0000000000000000000000000000000000000000 176069f0ded1db43eecb3b629a6077dba6c68295 CI 1645602422 +1100 commit (initial): myfile1 +176069f0ded1db43eecb3b629a6077dba6c68295 9f1b5440546da24daad7014ccf3e1f4d81f9414b CI 1645602422 +1100 commit: myfile2 +9f1b5440546da24daad7014ccf3e1f4d81f9414b 3933a268c502712421b7bfa04888319d6f108574 CI 1645602422 +1100 commit: myfile3 +3933a268c502712421b7bfa04888319d6f108574 37128a3020849daa0847462d14c384cc74c42ae0 CI 1645602422 +1100 commit: myfile4 +37128a3020849daa0847462d14c384cc74c42ae0 574013716a7f007a27b647b90cdbc78d006d792b CI 1645602427 +1100 commit: first line diff --git a/test/integration/commit/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/commitMultiline/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/commit/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/commitMultiline/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/commitMultiline/expected/repo/.git_keep/objects/17/6069f0ded1db43eecb3b629a6077dba6c68295 b/test/integration/commitMultiline/expected/repo/.git_keep/objects/17/6069f0ded1db43eecb3b629a6077dba6c68295 new file mode 100644 index 000000000..a7d01df20 --- /dev/null +++ b/test/integration/commitMultiline/expected/repo/.git_keep/objects/17/6069f0ded1db43eecb3b629a6077dba6c68295 @@ -0,0 +1,2 @@ +xŤÍA +0@Ń®sŠŮĘL:Ž))¸ň1™PÁ!")ŘŰ×#tűyđS5[ËĄíŞ€*©`”ąhČĚJAr ©ô<ó= —:ďâ§˝ëăĎqzém[ő–Ş @Âť gďáJ„čÎzNšţÉť}˲*ą.Ń,ą \ No newline at end of file diff --git a/test/integration/commit/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/commitMultiline/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/commit/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/commitMultiline/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/commit/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/commitMultiline/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/commit/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/commitMultiline/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/commit/expected/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 b/test/integration/commitMultiline/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 similarity index 100% rename from test/integration/commit/expected/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 rename to test/integration/commitMultiline/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 diff --git a/test/integration/commit/expected/.git_keep/objects/30/a1ca3481fdec3245b02aeacfb72ddfe2a433be b/test/integration/commitMultiline/expected/repo/.git_keep/objects/30/a1ca3481fdec3245b02aeacfb72ddfe2a433be similarity index 100% rename from test/integration/commit/expected/.git_keep/objects/30/a1ca3481fdec3245b02aeacfb72ddfe2a433be rename to test/integration/commitMultiline/expected/repo/.git_keep/objects/30/a1ca3481fdec3245b02aeacfb72ddfe2a433be diff --git a/test/integration/commitMultiline/expected/repo/.git_keep/objects/37/128a3020849daa0847462d14c384cc74c42ae0 b/test/integration/commitMultiline/expected/repo/.git_keep/objects/37/128a3020849daa0847462d14c384cc74c42ae0 new file mode 100644 index 000000000..b4dfbe20c Binary files /dev/null and b/test/integration/commitMultiline/expected/repo/.git_keep/objects/37/128a3020849daa0847462d14c384cc74c42ae0 differ diff --git a/test/integration/commitMultiline/expected/repo/.git_keep/objects/39/33a268c502712421b7bfa04888319d6f108574 b/test/integration/commitMultiline/expected/repo/.git_keep/objects/39/33a268c502712421b7bfa04888319d6f108574 new file mode 100644 index 000000000..4195b00e1 Binary files /dev/null and b/test/integration/commitMultiline/expected/repo/.git_keep/objects/39/33a268c502712421b7bfa04888319d6f108574 differ diff --git a/test/integration/commit/expected/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f b/test/integration/commitMultiline/expected/repo/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f similarity index 100% rename from test/integration/commit/expected/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f rename to test/integration/commitMultiline/expected/repo/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f diff --git a/test/integration/commitMultiline/expected/repo/.git_keep/objects/57/4013716a7f007a27b647b90cdbc78d006d792b b/test/integration/commitMultiline/expected/repo/.git_keep/objects/57/4013716a7f007a27b647b90cdbc78d006d792b new file mode 100644 index 000000000..d675c1840 --- /dev/null +++ b/test/integration/commitMultiline/expected/repo/.git_keep/objects/57/4013716a7f007a27b647b90cdbc78d006d792b @@ -0,0 +1,2 @@ +xŤŽK +Ă0 D»ö)Ľ/YVbJ)d•c(˛B ůáşĐă7Đ t5ĂcŚěëš«Eč.µ¨Zě„=E7%ŹÔŚ€¬,Ó0ĄI‘ÉűQÍÁE·j}pŮB¤.1ź¨ĹäH|$‘@B§†ßuŢ‹í{~x=˝Éľ>¬k©i ˝:`NzžŞúçÜLąĽŞ]ň¦ĆÔ9—ôë_ť!?’ \ No newline at end of file diff --git a/test/integration/commitMultiline/expected/repo/.git_keep/objects/9f/1b5440546da24daad7014ccf3e1f4d81f9414b b/test/integration/commitMultiline/expected/repo/.git_keep/objects/9f/1b5440546da24daad7014ccf3e1f4d81f9414b new file mode 100644 index 000000000..9ea933b39 Binary files /dev/null and b/test/integration/commitMultiline/expected/repo/.git_keep/objects/9f/1b5440546da24daad7014ccf3e1f4d81f9414b differ diff --git a/test/integration/commit/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/commitMultiline/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/commit/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/commitMultiline/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/commit/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/commitMultiline/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/commit/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/commitMultiline/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/commit/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/commitMultiline/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/commit/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/commitMultiline/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/commit/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/commitMultiline/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/commit/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/commitMultiline/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/commitMultiline/expected/repo/.git_keep/refs/heads/master b/test/integration/commitMultiline/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..c44ada3dd --- /dev/null +++ b/test/integration/commitMultiline/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +574013716a7f007a27b647b90cdbc78d006d792b diff --git a/test/integration/commit/expected/myfile1 b/test/integration/commitMultiline/expected/repo/myfile1 similarity index 100% rename from test/integration/commit/expected/myfile1 rename to test/integration/commitMultiline/expected/repo/myfile1 diff --git a/test/integration/commit/expected/myfile2 b/test/integration/commitMultiline/expected/repo/myfile2 similarity index 100% rename from test/integration/commit/expected/myfile2 rename to test/integration/commitMultiline/expected/repo/myfile2 diff --git a/test/integration/commit/expected/myfile3 b/test/integration/commitMultiline/expected/repo/myfile3 similarity index 100% rename from test/integration/commit/expected/myfile3 rename to test/integration/commitMultiline/expected/repo/myfile3 diff --git a/test/integration/commit/expected/myfile4 b/test/integration/commitMultiline/expected/repo/myfile4 similarity index 100% rename from test/integration/commit/expected/myfile4 rename to test/integration/commitMultiline/expected/repo/myfile4 diff --git a/test/integration/commit/expected/myfile5 b/test/integration/commitMultiline/expected/repo/myfile5 similarity index 100% rename from test/integration/commit/expected/myfile5 rename to test/integration/commitMultiline/expected/repo/myfile5 diff --git a/test/integration/commitMultiline/recording.json b/test/integration/commitMultiline/recording.json new file mode 100644 index 000000000..bb0d16af6 --- /dev/null +++ b/test/integration/commitMultiline/recording.json @@ -0,0 +1 @@ +{"KeyEvents":[{"Timestamp":931,"Mod":0,"Key":256,"Ch":32},{"Timestamp":1467,"Mod":0,"Key":256,"Ch":99},{"Timestamp":2035,"Mod":0,"Key":256,"Ch":102},{"Timestamp":2090,"Mod":0,"Key":256,"Ch":105},{"Timestamp":2162,"Mod":0,"Key":256,"Ch":114},{"Timestamp":2259,"Mod":0,"Key":256,"Ch":115},{"Timestamp":2314,"Mod":0,"Key":256,"Ch":116},{"Timestamp":2411,"Mod":0,"Key":256,"Ch":32},{"Timestamp":2546,"Mod":0,"Key":256,"Ch":108},{"Timestamp":2578,"Mod":0,"Key":256,"Ch":105},{"Timestamp":2627,"Mod":0,"Key":256,"Ch":110},{"Timestamp":2691,"Mod":0,"Key":256,"Ch":101},{"Timestamp":3358,"Mod":4,"Key":13,"Ch":13},{"Timestamp":3577,"Mod":4,"Key":13,"Ch":13},{"Timestamp":3810,"Mod":0,"Key":256,"Ch":116},{"Timestamp":3874,"Mod":0,"Key":256,"Ch":104},{"Timestamp":3914,"Mod":0,"Key":256,"Ch":105},{"Timestamp":3986,"Mod":0,"Key":256,"Ch":114},{"Timestamp":4107,"Mod":0,"Key":256,"Ch":100},{"Timestamp":4195,"Mod":0,"Key":256,"Ch":32},{"Timestamp":4291,"Mod":0,"Key":256,"Ch":108},{"Timestamp":4322,"Mod":0,"Key":256,"Ch":105},{"Timestamp":4370,"Mod":0,"Key":256,"Ch":110},{"Timestamp":4426,"Mod":0,"Key":256,"Ch":101},{"Timestamp":4603,"Mod":0,"Key":13,"Ch":13},{"Timestamp":5267,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":272,"Height":74}]} \ No newline at end of file diff --git a/test/integration/commit/setup.sh b/test/integration/commitMultiline/setup.sh similarity index 100% rename from test/integration/commit/setup.sh rename to test/integration/commitMultiline/setup.sh diff --git a/test/integration/commitMultiline/test.json b/test/integration/commitMultiline/test.json new file mode 100644 index 000000000..5ac0bb1f5 --- /dev/null +++ b/test/integration/commitMultiline/test.json @@ -0,0 +1,4 @@ +{ + "description": "stage a file and commit the change with a multiline commit message", + "speed": 15 +} diff --git a/test/integration/commitsNewBranch/expected/.git_keep/HEAD b/test/integration/commitsNewBranch/expected/.git_keep/HEAD deleted file mode 100644 index 78bc9f37b..000000000 --- a/test/integration/commitsNewBranch/expected/.git_keep/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/lol diff --git a/test/integration/commitsNewBranch/expected/.git_keep/index b/test/integration/commitsNewBranch/expected/.git_keep/index deleted file mode 100644 index 577a68b72..000000000 Binary files a/test/integration/commitsNewBranch/expected/.git_keep/index and /dev/null differ diff --git a/test/integration/commitsNewBranch/expected/.git_keep/logs/HEAD b/test/integration/commitsNewBranch/expected/.git_keep/logs/HEAD deleted file mode 100644 index 67065fbb9..000000000 --- a/test/integration/commitsNewBranch/expected/.git_keep/logs/HEAD +++ /dev/null @@ -1,4 +0,0 @@ -0000000000000000000000000000000000000000 9901fd9b7766be600bed07f55f1794a759527a98 CI 1617674232 +1000 commit (initial): file0 -9901fd9b7766be600bed07f55f1794a759527a98 0029f9bf66e346d47ede6a501abb5b82bee60096 CI 1617674232 +1000 commit: file1 -0029f9bf66e346d47ede6a501abb5b82bee60096 e1cb250774fb8606d33062518d0ae03831130249 CI 1617674232 +1000 commit: file2 -e1cb250774fb8606d33062518d0ae03831130249 0029f9bf66e346d47ede6a501abb5b82bee60096 CI 1617674249 +1000 checkout: moving from master to lol diff --git a/test/integration/commitsNewBranch/expected/.git_keep/logs/refs/heads/lol b/test/integration/commitsNewBranch/expected/.git_keep/logs/refs/heads/lol deleted file mode 100644 index 1202f15d1..000000000 --- a/test/integration/commitsNewBranch/expected/.git_keep/logs/refs/heads/lol +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 0029f9bf66e346d47ede6a501abb5b82bee60096 CI 1617674249 +1000 branch: Created from 0029f9bf66e346d47ede6a501abb5b82bee60096 diff --git a/test/integration/commitsNewBranch/expected/.git_keep/logs/refs/heads/master b/test/integration/commitsNewBranch/expected/.git_keep/logs/refs/heads/master deleted file mode 100644 index 5c02b3b2c..000000000 --- a/test/integration/commitsNewBranch/expected/.git_keep/logs/refs/heads/master +++ /dev/null @@ -1,3 +0,0 @@ -0000000000000000000000000000000000000000 9901fd9b7766be600bed07f55f1794a759527a98 CI 1617674232 +1000 commit (initial): file0 -9901fd9b7766be600bed07f55f1794a759527a98 0029f9bf66e346d47ede6a501abb5b82bee60096 CI 1617674232 +1000 commit: file1 -0029f9bf66e346d47ede6a501abb5b82bee60096 e1cb250774fb8606d33062518d0ae03831130249 CI 1617674232 +1000 commit: file2 diff --git a/test/integration/commitsNewBranch/expected/.git_keep/objects/00/29f9bf66e346d47ede6a501abb5b82bee60096 b/test/integration/commitsNewBranch/expected/.git_keep/objects/00/29f9bf66e346d47ede6a501abb5b82bee60096 deleted file mode 100644 index e5731eb1f..000000000 Binary files a/test/integration/commitsNewBranch/expected/.git_keep/objects/00/29f9bf66e346d47ede6a501abb5b82bee60096 and /dev/null differ diff --git a/test/integration/commitsNewBranch/expected/.git_keep/objects/99/01fd9b7766be600bed07f55f1794a759527a98 b/test/integration/commitsNewBranch/expected/.git_keep/objects/99/01fd9b7766be600bed07f55f1794a759527a98 deleted file mode 100644 index cd2e8264c..000000000 Binary files a/test/integration/commitsNewBranch/expected/.git_keep/objects/99/01fd9b7766be600bed07f55f1794a759527a98 and /dev/null differ diff --git a/test/integration/commitsNewBranch/expected/.git_keep/objects/e1/cb250774fb8606d33062518d0ae03831130249 b/test/integration/commitsNewBranch/expected/.git_keep/objects/e1/cb250774fb8606d33062518d0ae03831130249 deleted file mode 100644 index fc22897cc..000000000 Binary files a/test/integration/commitsNewBranch/expected/.git_keep/objects/e1/cb250774fb8606d33062518d0ae03831130249 and /dev/null differ diff --git a/test/integration/commitsNewBranch/expected/.git_keep/refs/heads/lol b/test/integration/commitsNewBranch/expected/.git_keep/refs/heads/lol deleted file mode 100644 index e92394760..000000000 --- a/test/integration/commitsNewBranch/expected/.git_keep/refs/heads/lol +++ /dev/null @@ -1 +0,0 @@ -0029f9bf66e346d47ede6a501abb5b82bee60096 diff --git a/test/integration/commitsNewBranch/expected/.git_keep/refs/heads/master b/test/integration/commitsNewBranch/expected/.git_keep/refs/heads/master deleted file mode 100644 index d5689ed85..000000000 --- a/test/integration/commitsNewBranch/expected/.git_keep/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -e1cb250774fb8606d33062518d0ae03831130249 diff --git a/test/integration/commitsNewBranch/recording.json b/test/integration/commitsNewBranch/recording.json deleted file mode 100644 index ca4d07a4a..000000000 --- a/test/integration/commitsNewBranch/recording.json +++ /dev/null @@ -1 +0,0 @@ -{"KeyEvents":[{"Timestamp":972,"Mod":0,"Key":259,"Ch":0},{"Timestamp":1243,"Mod":0,"Key":259,"Ch":0},{"Timestamp":1812,"Mod":0,"Key":256,"Ch":120},{"Timestamp":2683,"Mod":0,"Key":258,"Ch":0},{"Timestamp":3018,"Mod":0,"Key":258,"Ch":0},{"Timestamp":3033,"Mod":0,"Key":258,"Ch":0},{"Timestamp":3050,"Mod":0,"Key":258,"Ch":0},{"Timestamp":3067,"Mod":0,"Key":258,"Ch":0},{"Timestamp":3084,"Mod":0,"Key":258,"Ch":0},{"Timestamp":3100,"Mod":0,"Key":258,"Ch":0},{"Timestamp":3363,"Mod":0,"Key":258,"Ch":0},{"Timestamp":3499,"Mod":0,"Key":258,"Ch":0},{"Timestamp":3628,"Mod":0,"Key":258,"Ch":0},{"Timestamp":3771,"Mod":0,"Key":258,"Ch":0},{"Timestamp":3908,"Mod":0,"Key":258,"Ch":0},{"Timestamp":4051,"Mod":0,"Key":258,"Ch":0},{"Timestamp":4259,"Mod":0,"Key":258,"Ch":0},{"Timestamp":4883,"Mod":0,"Key":258,"Ch":0},{"Timestamp":5124,"Mod":0,"Key":258,"Ch":0},{"Timestamp":5355,"Mod":0,"Key":258,"Ch":0},{"Timestamp":6083,"Mod":0,"Key":258,"Ch":0},{"Timestamp":6563,"Mod":0,"Key":258,"Ch":0},{"Timestamp":7210,"Mod":0,"Key":258,"Ch":0},{"Timestamp":9475,"Mod":0,"Key":258,"Ch":0},{"Timestamp":10395,"Mod":0,"Key":258,"Ch":0},{"Timestamp":11019,"Mod":0,"Key":258,"Ch":0},{"Timestamp":11346,"Mod":0,"Key":258,"Ch":0},{"Timestamp":11587,"Mod":0,"Key":258,"Ch":0},{"Timestamp":11771,"Mod":0,"Key":258,"Ch":0},{"Timestamp":11883,"Mod":0,"Key":258,"Ch":0},{"Timestamp":12003,"Mod":0,"Key":258,"Ch":0},{"Timestamp":12132,"Mod":0,"Key":258,"Ch":0},{"Timestamp":12268,"Mod":0,"Key":258,"Ch":0},{"Timestamp":12395,"Mod":0,"Key":258,"Ch":0},{"Timestamp":12539,"Mod":0,"Key":258,"Ch":0},{"Timestamp":12667,"Mod":0,"Key":258,"Ch":0},{"Timestamp":12804,"Mod":0,"Key":258,"Ch":0},{"Timestamp":12947,"Mod":0,"Key":258,"Ch":0},{"Timestamp":13075,"Mod":0,"Key":258,"Ch":0},{"Timestamp":13211,"Mod":0,"Key":258,"Ch":0},{"Timestamp":13347,"Mod":0,"Key":258,"Ch":0},{"Timestamp":13475,"Mod":0,"Key":258,"Ch":0},{"Timestamp":13620,"Mod":0,"Key":258,"Ch":0},{"Timestamp":13771,"Mod":0,"Key":258,"Ch":0},{"Timestamp":13883,"Mod":0,"Key":258,"Ch":0},{"Timestamp":14027,"Mod":0,"Key":258,"Ch":0},{"Timestamp":14405,"Mod":0,"Key":27,"Ch":0},{"Timestamp":15540,"Mod":0,"Key":258,"Ch":0},{"Timestamp":15995,"Mod":0,"Key":256,"Ch":110},{"Timestamp":17267,"Mod":0,"Key":256,"Ch":108},{"Timestamp":17396,"Mod":0,"Key":256,"Ch":111},{"Timestamp":17547,"Mod":0,"Key":256,"Ch":108},{"Timestamp":17675,"Mod":0,"Key":13,"Ch":13},{"Timestamp":20195,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":272,"Height":74}]} \ No newline at end of file diff --git a/test/integration/commitsNewBranch/setup.sh b/test/integration/commitsNewBranch/setup.sh deleted file mode 100644 index 4e35cf543..000000000 --- a/test/integration/commitsNewBranch/setup.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh - -set -e - -cd $1 - -git init - -git config user.email "CI@example.com" -git config user.name "CI" - -echo test0 > file0 -git add . -git commit -am file0 - -echo test1 > file1 -git add . -git commit -am file1 - -echo test2 > file2 -git add . -git commit -am file2 diff --git a/test/integration/commitsNewBranch/test.json b/test/integration/commitsNewBranch/test.json deleted file mode 100644 index d760dcc6c..000000000 --- a/test/integration/commitsNewBranch/test.json +++ /dev/null @@ -1 +0,0 @@ -{ "description": "Reverting a commit. Note here that our snapshot test fails if the commit SHA is included in the message hence the renaming of the revert commit after creating it", "speed": 20 } diff --git a/test/integration/commitsRevert/expected/.git_keep/COMMIT_EDITMSG b/test/integration/commitsRevert/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/commitsRevert/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/commitsRevert/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/commit/expected/.git_keep/FETCH_HEAD b/test/integration/commitsRevert/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/commit/expected/.git_keep/FETCH_HEAD rename to test/integration/commitsRevert/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/commitsRevert/expected/.git_keep/HEAD b/test/integration/commitsRevert/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/commitsRevert/expected/.git_keep/HEAD rename to test/integration/commitsRevert/expected/repo/.git_keep/HEAD diff --git a/test/integration/commit/expected/.git_keep/config b/test/integration/commitsRevert/expected/repo/.git_keep/config similarity index 100% rename from test/integration/commit/expected/.git_keep/config rename to test/integration/commitsRevert/expected/repo/.git_keep/config diff --git a/test/integration/commit/expected/.git_keep/description b/test/integration/commitsRevert/expected/repo/.git_keep/description similarity index 100% rename from test/integration/commit/expected/.git_keep/description rename to test/integration/commitsRevert/expected/repo/.git_keep/description diff --git a/test/integration/commitsRevert/expected/.git_keep/index b/test/integration/commitsRevert/expected/repo/.git_keep/index similarity index 100% rename from test/integration/commitsRevert/expected/.git_keep/index rename to test/integration/commitsRevert/expected/repo/.git_keep/index diff --git a/test/integration/commit/expected/.git_keep/info/exclude b/test/integration/commitsRevert/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/commit/expected/.git_keep/info/exclude rename to test/integration/commitsRevert/expected/repo/.git_keep/info/exclude diff --git a/test/integration/commitsRevert/expected/.git_keep/logs/HEAD b/test/integration/commitsRevert/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/commitsRevert/expected/.git_keep/logs/HEAD rename to test/integration/commitsRevert/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/commitsRevert/expected/.git_keep/logs/refs/heads/master b/test/integration/commitsRevert/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/commitsRevert/expected/.git_keep/logs/refs/heads/master rename to test/integration/commitsRevert/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/commitsRevert/expected/.git_keep/objects/17/27eeb6864e52a8967a1a494099359dbdfcc235 b/test/integration/commitsRevert/expected/repo/.git_keep/objects/17/27eeb6864e52a8967a1a494099359dbdfcc235 similarity index 100% rename from test/integration/commitsRevert/expected/.git_keep/objects/17/27eeb6864e52a8967a1a494099359dbdfcc235 rename to test/integration/commitsRevert/expected/repo/.git_keep/objects/17/27eeb6864e52a8967a1a494099359dbdfcc235 diff --git a/test/integration/commitsNewBranch/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/commitsRevert/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/commitsNewBranch/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/commitsRevert/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/branchSuggestions/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/commitsRevert/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/branchSuggestions/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/commitsRevert/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/branchSuggestions/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/commitsRevert/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/branchSuggestions/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/commitsRevert/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/commitsRevert/expected/.git_keep/objects/3a/1ee58e5736049ad5b9266715d3642614816c1f b/test/integration/commitsRevert/expected/repo/.git_keep/objects/3a/1ee58e5736049ad5b9266715d3642614816c1f similarity index 100% rename from test/integration/commitsRevert/expected/.git_keep/objects/3a/1ee58e5736049ad5b9266715d3642614816c1f rename to test/integration/commitsRevert/expected/repo/.git_keep/objects/3a/1ee58e5736049ad5b9266715d3642614816c1f diff --git a/test/integration/commitsRevert/expected/.git_keep/objects/7e/03c9a9538a907c936de5c9a2154707b9ee541c b/test/integration/commitsRevert/expected/repo/.git_keep/objects/7e/03c9a9538a907c936de5c9a2154707b9ee541c similarity index 100% rename from test/integration/commitsRevert/expected/.git_keep/objects/7e/03c9a9538a907c936de5c9a2154707b9ee541c rename to test/integration/commitsRevert/expected/repo/.git_keep/objects/7e/03c9a9538a907c936de5c9a2154707b9ee541c diff --git a/test/integration/commitsNewBranch/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/commitsRevert/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c similarity index 100% rename from test/integration/commitsNewBranch/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c rename to test/integration/commitsRevert/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c diff --git a/test/integration/commitsRevert/expected/.git_keep/objects/9e/aae8f342ca71c060b760870a715a6303905935 b/test/integration/commitsRevert/expected/repo/.git_keep/objects/9e/aae8f342ca71c060b760870a715a6303905935 similarity index 100% rename from test/integration/commitsRevert/expected/.git_keep/objects/9e/aae8f342ca71c060b760870a715a6303905935 rename to test/integration/commitsRevert/expected/repo/.git_keep/objects/9e/aae8f342ca71c060b760870a715a6303905935 diff --git a/test/integration/commitsNewBranch/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/commitsRevert/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/commitsNewBranch/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/commitsRevert/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/commitsRevert/expected/.git_keep/objects/ab/15072795e72a2061bc40060494c3ca2138b297 b/test/integration/commitsRevert/expected/repo/.git_keep/objects/ab/15072795e72a2061bc40060494c3ca2138b297 similarity index 100% rename from test/integration/commitsRevert/expected/.git_keep/objects/ab/15072795e72a2061bc40060494c3ca2138b297 rename to test/integration/commitsRevert/expected/repo/.git_keep/objects/ab/15072795e72a2061bc40060494c3ca2138b297 diff --git a/test/integration/commitsRevert/expected/.git_keep/objects/b7/81ffd3aa940dde39f73c9149b67e2b128de085 b/test/integration/commitsRevert/expected/repo/.git_keep/objects/b7/81ffd3aa940dde39f73c9149b67e2b128de085 similarity index 100% rename from test/integration/commitsRevert/expected/.git_keep/objects/b7/81ffd3aa940dde39f73c9149b67e2b128de085 rename to test/integration/commitsRevert/expected/repo/.git_keep/objects/b7/81ffd3aa940dde39f73c9149b67e2b128de085 diff --git a/test/integration/commitsNewBranch/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/commitsRevert/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 similarity index 100% rename from test/integration/commitsNewBranch/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 rename to test/integration/commitsRevert/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 diff --git a/test/integration/commitsRevert/expected/.git_keep/refs/heads/master b/test/integration/commitsRevert/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/commitsRevert/expected/.git_keep/refs/heads/master rename to test/integration/commitsRevert/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/branchSuggestions/expected/file0 b/test/integration/commitsRevert/expected/repo/file0 similarity index 100% rename from test/integration/branchSuggestions/expected/file0 rename to test/integration/commitsRevert/expected/repo/file0 diff --git a/test/integration/commitsRevert/expected/file2 b/test/integration/commitsRevert/expected/repo/file2 similarity index 100% rename from test/integration/commitsRevert/expected/file2 rename to test/integration/commitsRevert/expected/repo/file2 diff --git a/test/integration/confirmQuit/expected/.git_keep/COMMIT_EDITMSG b/test/integration/confirmQuit/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/confirmQuit/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/confirmQuit/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/commitsNewBranch/expected/.git_keep/FETCH_HEAD b/test/integration/confirmQuit/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/commitsNewBranch/expected/.git_keep/FETCH_HEAD rename to test/integration/confirmQuit/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/confirmQuit/expected/.git_keep/HEAD b/test/integration/confirmQuit/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/confirmQuit/expected/.git_keep/HEAD rename to test/integration/confirmQuit/expected/repo/.git_keep/HEAD diff --git a/test/integration/commitsNewBranch/expected/.git_keep/config b/test/integration/confirmQuit/expected/repo/.git_keep/config similarity index 100% rename from test/integration/commitsNewBranch/expected/.git_keep/config rename to test/integration/confirmQuit/expected/repo/.git_keep/config diff --git a/test/integration/commitsNewBranch/expected/.git_keep/description b/test/integration/confirmQuit/expected/repo/.git_keep/description similarity index 100% rename from test/integration/commitsNewBranch/expected/.git_keep/description rename to test/integration/confirmQuit/expected/repo/.git_keep/description diff --git a/test/integration/confirmQuit/expected/.git_keep/index b/test/integration/confirmQuit/expected/repo/.git_keep/index similarity index 100% rename from test/integration/confirmQuit/expected/.git_keep/index rename to test/integration/confirmQuit/expected/repo/.git_keep/index diff --git a/test/integration/commitsNewBranch/expected/.git_keep/info/exclude b/test/integration/confirmQuit/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/commitsNewBranch/expected/.git_keep/info/exclude rename to test/integration/confirmQuit/expected/repo/.git_keep/info/exclude diff --git a/test/integration/confirmQuit/expected/.git_keep/logs/HEAD b/test/integration/confirmQuit/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/confirmQuit/expected/.git_keep/logs/HEAD rename to test/integration/confirmQuit/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/confirmQuit/expected/.git_keep/logs/refs/heads/master b/test/integration/confirmQuit/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/confirmQuit/expected/.git_keep/logs/refs/heads/master rename to test/integration/confirmQuit/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/confirmQuit/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/confirmQuit/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/confirmQuit/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/confirmQuit/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/confirmQuit/expected/.git_keep/objects/54/4efed4e669ec3bd64b44799175bffac95035f5 b/test/integration/confirmQuit/expected/repo/.git_keep/objects/54/4efed4e669ec3bd64b44799175bffac95035f5 similarity index 100% rename from test/integration/confirmQuit/expected/.git_keep/objects/54/4efed4e669ec3bd64b44799175bffac95035f5 rename to test/integration/confirmQuit/expected/repo/.git_keep/objects/54/4efed4e669ec3bd64b44799175bffac95035f5 diff --git a/test/integration/commitsRevert/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/confirmQuit/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/commitsRevert/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/confirmQuit/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/confirmQuit/expected/.git_keep/refs/heads/master b/test/integration/confirmQuit/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/confirmQuit/expected/.git_keep/refs/heads/master rename to test/integration/confirmQuit/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/confirmQuit/expected/myfile1 b/test/integration/confirmQuit/expected/repo/myfile1 similarity index 100% rename from test/integration/confirmQuit/expected/myfile1 rename to test/integration/confirmQuit/expected/repo/myfile1 diff --git a/test/integration/customCommands/expected/.git_keep/COMMIT_EDITMSG b/test/integration/customCommands/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/customCommands/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/customCommands/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/commitsRevert/expected/.git_keep/FETCH_HEAD b/test/integration/customCommands/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/commitsRevert/expected/.git_keep/FETCH_HEAD rename to test/integration/customCommands/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/customCommands/expected/.git_keep/HEAD b/test/integration/customCommands/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/customCommands/expected/.git_keep/HEAD rename to test/integration/customCommands/expected/repo/.git_keep/HEAD diff --git a/test/integration/commitsRevert/expected/.git_keep/config b/test/integration/customCommands/expected/repo/.git_keep/config similarity index 100% rename from test/integration/commitsRevert/expected/.git_keep/config rename to test/integration/customCommands/expected/repo/.git_keep/config diff --git a/test/integration/commitsRevert/expected/.git_keep/description b/test/integration/customCommands/expected/repo/.git_keep/description similarity index 100% rename from test/integration/commitsRevert/expected/.git_keep/description rename to test/integration/customCommands/expected/repo/.git_keep/description diff --git a/test/integration/customCommands/expected/.git_keep/index b/test/integration/customCommands/expected/repo/.git_keep/index similarity index 100% rename from test/integration/customCommands/expected/.git_keep/index rename to test/integration/customCommands/expected/repo/.git_keep/index diff --git a/test/integration/commitsRevert/expected/.git_keep/info/exclude b/test/integration/customCommands/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/commitsRevert/expected/.git_keep/info/exclude rename to test/integration/customCommands/expected/repo/.git_keep/info/exclude diff --git a/test/integration/customCommands/expected/.git_keep/logs/HEAD b/test/integration/customCommands/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/customCommands/expected/.git_keep/logs/HEAD rename to test/integration/customCommands/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/customCommands/expected/.git_keep/logs/refs/heads/master b/test/integration/customCommands/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/customCommands/expected/.git_keep/logs/refs/heads/master rename to test/integration/customCommands/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/customCommands/expected/.git_keep/objects/15/bdb2c31c825116ad5af06ee25517d90b24f13b b/test/integration/customCommands/expected/repo/.git_keep/objects/15/bdb2c31c825116ad5af06ee25517d90b24f13b similarity index 100% rename from test/integration/customCommands/expected/.git_keep/objects/15/bdb2c31c825116ad5af06ee25517d90b24f13b rename to test/integration/customCommands/expected/repo/.git_keep/objects/15/bdb2c31c825116ad5af06ee25517d90b24f13b diff --git a/test/integration/customCommands/expected/.git_keep/objects/20/f11a5545b04a86ca81f7a9967d5207349052d7 b/test/integration/customCommands/expected/repo/.git_keep/objects/20/f11a5545b04a86ca81f7a9967d5207349052d7 similarity index 100% rename from test/integration/customCommands/expected/.git_keep/objects/20/f11a5545b04a86ca81f7a9967d5207349052d7 rename to test/integration/customCommands/expected/repo/.git_keep/objects/20/f11a5545b04a86ca81f7a9967d5207349052d7 diff --git a/test/integration/customCommands/expected/.git_keep/objects/8a/2e45643093ea7cf7b06382e38470034c24e812 b/test/integration/customCommands/expected/repo/.git_keep/objects/8a/2e45643093ea7cf7b06382e38470034c24e812 similarity index 100% rename from test/integration/customCommands/expected/.git_keep/objects/8a/2e45643093ea7cf7b06382e38470034c24e812 rename to test/integration/customCommands/expected/repo/.git_keep/objects/8a/2e45643093ea7cf7b06382e38470034c24e812 diff --git a/test/integration/customCommands/expected/.git_keep/refs/heads/master b/test/integration/customCommands/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/customCommands/expected/.git_keep/refs/heads/master rename to test/integration/customCommands/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/customCommands/expected/blah b/test/integration/customCommands/expected/repo/blah similarity index 100% rename from test/integration/customCommands/expected/blah rename to test/integration/customCommands/expected/repo/blah diff --git a/test/integration/customCommandsComplex/expected/.git_keep/COMMIT_EDITMSG b/test/integration/customCommandsComplex/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/customCommandsComplex/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/customCommandsComplex/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/confirmQuit/expected/.git_keep/FETCH_HEAD b/test/integration/customCommandsComplex/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/confirmQuit/expected/.git_keep/FETCH_HEAD rename to test/integration/customCommandsComplex/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/customCommandsComplex/expected/.git_keep/HEAD b/test/integration/customCommandsComplex/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/customCommandsComplex/expected/.git_keep/HEAD rename to test/integration/customCommandsComplex/expected/repo/.git_keep/HEAD diff --git a/test/integration/confirmQuit/expected/.git_keep/config b/test/integration/customCommandsComplex/expected/repo/.git_keep/config similarity index 100% rename from test/integration/confirmQuit/expected/.git_keep/config rename to test/integration/customCommandsComplex/expected/repo/.git_keep/config diff --git a/test/integration/confirmQuit/expected/.git_keep/description b/test/integration/customCommandsComplex/expected/repo/.git_keep/description similarity index 100% rename from test/integration/confirmQuit/expected/.git_keep/description rename to test/integration/customCommandsComplex/expected/repo/.git_keep/description diff --git a/test/integration/customCommandsComplex/expected/.git_keep/index b/test/integration/customCommandsComplex/expected/repo/.git_keep/index similarity index 100% rename from test/integration/customCommandsComplex/expected/.git_keep/index rename to test/integration/customCommandsComplex/expected/repo/.git_keep/index diff --git a/test/integration/confirmQuit/expected/.git_keep/info/exclude b/test/integration/customCommandsComplex/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/confirmQuit/expected/.git_keep/info/exclude rename to test/integration/customCommandsComplex/expected/repo/.git_keep/info/exclude diff --git a/test/integration/customCommandsComplex/expected/.git_keep/logs/HEAD b/test/integration/customCommandsComplex/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/customCommandsComplex/expected/.git_keep/logs/HEAD rename to test/integration/customCommandsComplex/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/customCommandsComplex/expected/.git_keep/logs/refs/heads/master b/test/integration/customCommandsComplex/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/customCommandsComplex/expected/.git_keep/logs/refs/heads/master rename to test/integration/customCommandsComplex/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/customCommandsComplex/expected/.git_keep/objects/05/3cf208ac3728c36c6ed86f2a03a1fb72a8e6bc b/test/integration/customCommandsComplex/expected/repo/.git_keep/objects/05/3cf208ac3728c36c6ed86f2a03a1fb72a8e6bc similarity index 100% rename from test/integration/customCommandsComplex/expected/.git_keep/objects/05/3cf208ac3728c36c6ed86f2a03a1fb72a8e6bc rename to test/integration/customCommandsComplex/expected/repo/.git_keep/objects/05/3cf208ac3728c36c6ed86f2a03a1fb72a8e6bc diff --git a/test/integration/customCommandsComplex/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/customCommandsComplex/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/customCommandsComplex/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/customCommandsComplex/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/commitsRevert/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/customCommandsComplex/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/commitsRevert/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/customCommandsComplex/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/customCommandsComplex/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/customCommandsComplex/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/customCommandsComplex/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/customCommandsComplex/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/customCommandsComplex/expected/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 b/test/integration/customCommandsComplex/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 similarity index 100% rename from test/integration/customCommandsComplex/expected/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 rename to test/integration/customCommandsComplex/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 diff --git a/test/integration/customCommandsComplex/expected/.git_keep/objects/4f/dfedfd9d406506be8b02f5b863dbc08d43cc9f b/test/integration/customCommandsComplex/expected/repo/.git_keep/objects/4f/dfedfd9d406506be8b02f5b863dbc08d43cc9f similarity index 100% rename from test/integration/customCommandsComplex/expected/.git_keep/objects/4f/dfedfd9d406506be8b02f5b863dbc08d43cc9f rename to test/integration/customCommandsComplex/expected/repo/.git_keep/objects/4f/dfedfd9d406506be8b02f5b863dbc08d43cc9f diff --git a/test/integration/customCommandsComplex/expected/.git_keep/objects/54/28838691c97ac192c8b8e1c3f573d8541a94b6 b/test/integration/customCommandsComplex/expected/repo/.git_keep/objects/54/28838691c97ac192c8b8e1c3f573d8541a94b6 similarity index 100% rename from test/integration/customCommandsComplex/expected/.git_keep/objects/54/28838691c97ac192c8b8e1c3f573d8541a94b6 rename to test/integration/customCommandsComplex/expected/repo/.git_keep/objects/54/28838691c97ac192c8b8e1c3f573d8541a94b6 diff --git a/test/integration/customCommandsComplex/expected/.git_keep/objects/7d/b446a082f8c10183f1f27178698f07f3750b6b b/test/integration/customCommandsComplex/expected/repo/.git_keep/objects/7d/b446a082f8c10183f1f27178698f07f3750b6b similarity index 100% rename from test/integration/customCommandsComplex/expected/.git_keep/objects/7d/b446a082f8c10183f1f27178698f07f3750b6b rename to test/integration/customCommandsComplex/expected/repo/.git_keep/objects/7d/b446a082f8c10183f1f27178698f07f3750b6b diff --git a/test/integration/customCommandsComplex/expected/.git_keep/objects/7d/d93a4be3d27d40fbe791d6d77e0d2fedc4d785 b/test/integration/customCommandsComplex/expected/repo/.git_keep/objects/7d/d93a4be3d27d40fbe791d6d77e0d2fedc4d785 similarity index 100% rename from test/integration/customCommandsComplex/expected/.git_keep/objects/7d/d93a4be3d27d40fbe791d6d77e0d2fedc4d785 rename to test/integration/customCommandsComplex/expected/repo/.git_keep/objects/7d/d93a4be3d27d40fbe791d6d77e0d2fedc4d785 diff --git a/test/integration/confirmQuit/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/customCommandsComplex/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/confirmQuit/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/customCommandsComplex/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/customCommandsComplex/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/customCommandsComplex/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/customCommandsComplex/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/customCommandsComplex/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/customCommandsComplex/expected/.git_keep/objects/ab/38b1ca116f77648925d952e731f419db360cdb b/test/integration/customCommandsComplex/expected/repo/.git_keep/objects/ab/38b1ca116f77648925d952e731f419db360cdb similarity index 100% rename from test/integration/customCommandsComplex/expected/.git_keep/objects/ab/38b1ca116f77648925d952e731f419db360cdb rename to test/integration/customCommandsComplex/expected/repo/.git_keep/objects/ab/38b1ca116f77648925d952e731f419db360cdb diff --git a/test/integration/customCommandsComplex/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/customCommandsComplex/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/customCommandsComplex/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/customCommandsComplex/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/customCommandsComplex/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/customCommandsComplex/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/customCommandsComplex/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/customCommandsComplex/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/customCommandsComplex/expected/.git_keep/objects/f7/08d3e3819470a69f6c8562ff1e68eef02f8cac b/test/integration/customCommandsComplex/expected/repo/.git_keep/objects/f7/08d3e3819470a69f6c8562ff1e68eef02f8cac similarity index 100% rename from test/integration/customCommandsComplex/expected/.git_keep/objects/f7/08d3e3819470a69f6c8562ff1e68eef02f8cac rename to test/integration/customCommandsComplex/expected/repo/.git_keep/objects/f7/08d3e3819470a69f6c8562ff1e68eef02f8cac diff --git a/test/integration/customCommandsComplex/expected/.git_keep/refs/heads/master b/test/integration/customCommandsComplex/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/customCommandsComplex/expected/.git_keep/refs/heads/master rename to test/integration/customCommandsComplex/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/customCommandsComplex/expected/myfile1 b/test/integration/customCommandsComplex/expected/repo/myfile1 similarity index 100% rename from test/integration/customCommandsComplex/expected/myfile1 rename to test/integration/customCommandsComplex/expected/repo/myfile1 diff --git a/test/integration/customCommandsComplex/expected/myfile2 b/test/integration/customCommandsComplex/expected/repo/myfile2 similarity index 100% rename from test/integration/customCommandsComplex/expected/myfile2 rename to test/integration/customCommandsComplex/expected/repo/myfile2 diff --git a/test/integration/customCommandsComplex/expected/myfile3 b/test/integration/customCommandsComplex/expected/repo/myfile3 similarity index 100% rename from test/integration/customCommandsComplex/expected/myfile3 rename to test/integration/customCommandsComplex/expected/repo/myfile3 diff --git a/test/integration/customCommandsComplex/expected/myfile4 b/test/integration/customCommandsComplex/expected/repo/myfile4 similarity index 100% rename from test/integration/customCommandsComplex/expected/myfile4 rename to test/integration/customCommandsComplex/expected/repo/myfile4 diff --git a/test/integration/customCommandsComplex/expected/output.txt b/test/integration/customCommandsComplex/expected/repo/output.txt similarity index 100% rename from test/integration/customCommandsComplex/expected/output.txt rename to test/integration/customCommandsComplex/expected/repo/output.txt diff --git a/test/integration/diffing/expected/.git_keep/COMMIT_EDITMSG b/test/integration/diffing/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/diffing/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/diffing/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/customCommands/expected/.git_keep/FETCH_HEAD b/test/integration/diffing/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/customCommands/expected/.git_keep/FETCH_HEAD rename to test/integration/diffing/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/diffing/expected/.git_keep/HEAD b/test/integration/diffing/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/diffing/expected/.git_keep/HEAD rename to test/integration/diffing/expected/repo/.git_keep/HEAD diff --git a/test/integration/customCommands/expected/.git_keep/config b/test/integration/diffing/expected/repo/.git_keep/config similarity index 100% rename from test/integration/customCommands/expected/.git_keep/config rename to test/integration/diffing/expected/repo/.git_keep/config diff --git a/test/integration/customCommands/expected/.git_keep/description b/test/integration/diffing/expected/repo/.git_keep/description similarity index 100% rename from test/integration/customCommands/expected/.git_keep/description rename to test/integration/diffing/expected/repo/.git_keep/description diff --git a/test/integration/diffing/expected/.git_keep/index b/test/integration/diffing/expected/repo/.git_keep/index similarity index 100% rename from test/integration/diffing/expected/.git_keep/index rename to test/integration/diffing/expected/repo/.git_keep/index diff --git a/test/integration/customCommands/expected/.git_keep/info/exclude b/test/integration/diffing/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/customCommands/expected/.git_keep/info/exclude rename to test/integration/diffing/expected/repo/.git_keep/info/exclude diff --git a/test/integration/diffing/expected/.git_keep/logs/HEAD b/test/integration/diffing/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/diffing/expected/.git_keep/logs/HEAD rename to test/integration/diffing/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/diffing/expected/.git_keep/logs/refs/heads/branch2 b/test/integration/diffing/expected/repo/.git_keep/logs/refs/heads/branch2 similarity index 100% rename from test/integration/diffing/expected/.git_keep/logs/refs/heads/branch2 rename to test/integration/diffing/expected/repo/.git_keep/logs/refs/heads/branch2 diff --git a/test/integration/diffing/expected/.git_keep/logs/refs/heads/master b/test/integration/diffing/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/diffing/expected/.git_keep/logs/refs/heads/master rename to test/integration/diffing/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/diffing/expected/.git_keep/objects/05/19814b4923f4639f1a47348b1539e3c5c54904 b/test/integration/diffing/expected/repo/.git_keep/objects/05/19814b4923f4639f1a47348b1539e3c5c54904 similarity index 100% rename from test/integration/diffing/expected/.git_keep/objects/05/19814b4923f4639f1a47348b1539e3c5c54904 rename to test/integration/diffing/expected/repo/.git_keep/objects/05/19814b4923f4639f1a47348b1539e3c5c54904 diff --git a/test/integration/diffing/expected/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 b/test/integration/diffing/expected/repo/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 similarity index 100% rename from test/integration/diffing/expected/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 rename to test/integration/diffing/expected/repo/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 diff --git a/test/integration/diffing/expected/.git_keep/objects/14/4da8a531224129210249f43dded86056891506 b/test/integration/diffing/expected/repo/.git_keep/objects/14/4da8a531224129210249f43dded86056891506 similarity index 100% rename from test/integration/diffing/expected/.git_keep/objects/14/4da8a531224129210249f43dded86056891506 rename to test/integration/diffing/expected/repo/.git_keep/objects/14/4da8a531224129210249f43dded86056891506 diff --git a/test/integration/customCommandsComplex/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/diffing/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/customCommandsComplex/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/diffing/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/commitsNewBranch/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/diffing/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/commitsNewBranch/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/diffing/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/diffing/expected/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 b/test/integration/diffing/expected/repo/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 similarity index 100% rename from test/integration/diffing/expected/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 rename to test/integration/diffing/expected/repo/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 diff --git a/test/integration/commitsNewBranch/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/diffing/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/commitsNewBranch/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/diffing/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/diffing/expected/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a b/test/integration/diffing/expected/repo/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a similarity index 100% rename from test/integration/diffing/expected/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a rename to test/integration/diffing/expected/repo/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a diff --git a/test/integration/diffing/expected/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b b/test/integration/diffing/expected/repo/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b similarity index 100% rename from test/integration/diffing/expected/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b rename to test/integration/diffing/expected/repo/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b diff --git a/test/integration/diffing/expected/.git_keep/objects/57/51731b38a36f8eb54a4bb304522ca539e04522 b/test/integration/diffing/expected/repo/.git_keep/objects/57/51731b38a36f8eb54a4bb304522ca539e04522 similarity index 100% rename from test/integration/diffing/expected/.git_keep/objects/57/51731b38a36f8eb54a4bb304522ca539e04522 rename to test/integration/diffing/expected/repo/.git_keep/objects/57/51731b38a36f8eb54a4bb304522ca539e04522 diff --git a/test/integration/diffing/expected/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 b/test/integration/diffing/expected/repo/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 similarity index 100% rename from test/integration/diffing/expected/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 rename to test/integration/diffing/expected/repo/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 diff --git a/test/integration/diffing/expected/.git_keep/objects/75/b31f81dd4387724638dbd3aff7380155c672cd b/test/integration/diffing/expected/repo/.git_keep/objects/75/b31f81dd4387724638dbd3aff7380155c672cd similarity index 100% rename from test/integration/diffing/expected/.git_keep/objects/75/b31f81dd4387724638dbd3aff7380155c672cd rename to test/integration/diffing/expected/repo/.git_keep/objects/75/b31f81dd4387724638dbd3aff7380155c672cd diff --git a/test/integration/diffing/expected/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 b/test/integration/diffing/expected/repo/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 similarity index 100% rename from test/integration/diffing/expected/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 rename to test/integration/diffing/expected/repo/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 diff --git a/test/integration/diffing/expected/.git_keep/objects/96/a6d041bbb131df0e74d179c3adcd2ace0e7f9c b/test/integration/diffing/expected/repo/.git_keep/objects/96/a6d041bbb131df0e74d179c3adcd2ace0e7f9c similarity index 100% rename from test/integration/diffing/expected/.git_keep/objects/96/a6d041bbb131df0e74d179c3adcd2ace0e7f9c rename to test/integration/diffing/expected/repo/.git_keep/objects/96/a6d041bbb131df0e74d179c3adcd2ace0e7f9c diff --git a/test/integration/commitsRevert/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/diffing/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c similarity index 100% rename from test/integration/commitsRevert/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c rename to test/integration/diffing/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c diff --git a/test/integration/diffing/expected/.git_keep/objects/a1/00b407f33fd2e97a3cb6f62b68ed6b7cc6c676 b/test/integration/diffing/expected/repo/.git_keep/objects/a1/00b407f33fd2e97a3cb6f62b68ed6b7cc6c676 similarity index 100% rename from test/integration/diffing/expected/.git_keep/objects/a1/00b407f33fd2e97a3cb6f62b68ed6b7cc6c676 rename to test/integration/diffing/expected/repo/.git_keep/objects/a1/00b407f33fd2e97a3cb6f62b68ed6b7cc6c676 diff --git a/test/integration/customCommandsComplex/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/diffing/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/customCommandsComplex/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/diffing/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/commitsRevert/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/diffing/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 similarity index 100% rename from test/integration/commitsRevert/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 rename to test/integration/diffing/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 diff --git a/test/integration/diffing/expected/.git_keep/objects/d1/5e253139400c94b42fc266641d1698720d4ecf b/test/integration/diffing/expected/repo/.git_keep/objects/d1/5e253139400c94b42fc266641d1698720d4ecf similarity index 100% rename from test/integration/diffing/expected/.git_keep/objects/d1/5e253139400c94b42fc266641d1698720d4ecf rename to test/integration/diffing/expected/repo/.git_keep/objects/d1/5e253139400c94b42fc266641d1698720d4ecf diff --git a/test/integration/diffing/expected/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 b/test/integration/diffing/expected/repo/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 similarity index 100% rename from test/integration/diffing/expected/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 rename to test/integration/diffing/expected/repo/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 diff --git a/test/integration/diffing/expected/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a b/test/integration/diffing/expected/repo/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a similarity index 100% rename from test/integration/diffing/expected/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a rename to test/integration/diffing/expected/repo/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a diff --git a/test/integration/diffing/expected/.git_keep/objects/f6/77ef8a14ca2770e48129cc13acfa1c369908cc b/test/integration/diffing/expected/repo/.git_keep/objects/f6/77ef8a14ca2770e48129cc13acfa1c369908cc similarity index 100% rename from test/integration/diffing/expected/.git_keep/objects/f6/77ef8a14ca2770e48129cc13acfa1c369908cc rename to test/integration/diffing/expected/repo/.git_keep/objects/f6/77ef8a14ca2770e48129cc13acfa1c369908cc diff --git a/test/integration/diffing/expected/.git_keep/refs/heads/branch2 b/test/integration/diffing/expected/repo/.git_keep/refs/heads/branch2 similarity index 100% rename from test/integration/diffing/expected/.git_keep/refs/heads/branch2 rename to test/integration/diffing/expected/repo/.git_keep/refs/heads/branch2 diff --git a/test/integration/diffing/expected/.git_keep/refs/heads/master b/test/integration/diffing/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/diffing/expected/.git_keep/refs/heads/master rename to test/integration/diffing/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/commitsNewBranch/expected/file0 b/test/integration/diffing/expected/repo/file0 similarity index 100% rename from test/integration/commitsNewBranch/expected/file0 rename to test/integration/diffing/expected/repo/file0 diff --git a/test/integration/commitsNewBranch/expected/file1 b/test/integration/diffing/expected/repo/file1 similarity index 100% rename from test/integration/commitsNewBranch/expected/file1 rename to test/integration/diffing/expected/repo/file1 diff --git a/test/integration/diffing/expected/file2 b/test/integration/diffing/expected/repo/file2 similarity index 100% rename from test/integration/diffing/expected/file2 rename to test/integration/diffing/expected/repo/file2 diff --git a/test/integration/diffing/expected/file4 b/test/integration/diffing/expected/repo/file4 similarity index 100% rename from test/integration/diffing/expected/file4 rename to test/integration/diffing/expected/repo/file4 diff --git a/test/integration/diffing2/expected/.git_keep/COMMIT_EDITMSG b/test/integration/diffing2/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/diffing2/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/diffing2/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/customCommandsComplex/expected/.git_keep/FETCH_HEAD b/test/integration/diffing2/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/customCommandsComplex/expected/.git_keep/FETCH_HEAD rename to test/integration/diffing2/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/diffing2/expected/.git_keep/HEAD b/test/integration/diffing2/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/diffing2/expected/.git_keep/HEAD rename to test/integration/diffing2/expected/repo/.git_keep/HEAD diff --git a/test/integration/customCommandsComplex/expected/.git_keep/config b/test/integration/diffing2/expected/repo/.git_keep/config similarity index 100% rename from test/integration/customCommandsComplex/expected/.git_keep/config rename to test/integration/diffing2/expected/repo/.git_keep/config diff --git a/test/integration/customCommandsComplex/expected/.git_keep/description b/test/integration/diffing2/expected/repo/.git_keep/description similarity index 100% rename from test/integration/customCommandsComplex/expected/.git_keep/description rename to test/integration/diffing2/expected/repo/.git_keep/description diff --git a/test/integration/diffing2/expected/.git_keep/index b/test/integration/diffing2/expected/repo/.git_keep/index similarity index 100% rename from test/integration/diffing2/expected/.git_keep/index rename to test/integration/diffing2/expected/repo/.git_keep/index diff --git a/test/integration/customCommandsComplex/expected/.git_keep/info/exclude b/test/integration/diffing2/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/customCommandsComplex/expected/.git_keep/info/exclude rename to test/integration/diffing2/expected/repo/.git_keep/info/exclude diff --git a/test/integration/diffing2/expected/.git_keep/logs/HEAD b/test/integration/diffing2/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/diffing2/expected/.git_keep/logs/HEAD rename to test/integration/diffing2/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/diffing2/expected/.git_keep/logs/refs/heads/branch2 b/test/integration/diffing2/expected/repo/.git_keep/logs/refs/heads/branch2 similarity index 100% rename from test/integration/diffing2/expected/.git_keep/logs/refs/heads/branch2 rename to test/integration/diffing2/expected/repo/.git_keep/logs/refs/heads/branch2 diff --git a/test/integration/diffing2/expected/.git_keep/logs/refs/heads/master b/test/integration/diffing2/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/diffing2/expected/.git_keep/logs/refs/heads/master rename to test/integration/diffing2/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/diffing2/expected/.git_keep/objects/06/da465196938ea235323950ee451ffb36a431cf b/test/integration/diffing2/expected/repo/.git_keep/objects/06/da465196938ea235323950ee451ffb36a431cf similarity index 100% rename from test/integration/diffing2/expected/.git_keep/objects/06/da465196938ea235323950ee451ffb36a431cf rename to test/integration/diffing2/expected/repo/.git_keep/objects/06/da465196938ea235323950ee451ffb36a431cf diff --git a/test/integration/diffing2/expected/.git_keep/objects/08/04f2069f5af172770da3d231be982ca320bf8b b/test/integration/diffing2/expected/repo/.git_keep/objects/08/04f2069f5af172770da3d231be982ca320bf8b similarity index 100% rename from test/integration/diffing2/expected/.git_keep/objects/08/04f2069f5af172770da3d231be982ca320bf8b rename to test/integration/diffing2/expected/repo/.git_keep/objects/08/04f2069f5af172770da3d231be982ca320bf8b diff --git a/test/integration/diffing2/expected/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 b/test/integration/diffing2/expected/repo/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 similarity index 100% rename from test/integration/diffing2/expected/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 rename to test/integration/diffing2/expected/repo/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 diff --git a/test/integration/diffing/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/diffing2/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/diffing/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/diffing2/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/diffing2/expected/.git_keep/objects/1b/74d64fe4055d4502ac600072586068b27d4aa7 b/test/integration/diffing2/expected/repo/.git_keep/objects/1b/74d64fe4055d4502ac600072586068b27d4aa7 similarity index 100% rename from test/integration/diffing2/expected/.git_keep/objects/1b/74d64fe4055d4502ac600072586068b27d4aa7 rename to test/integration/diffing2/expected/repo/.git_keep/objects/1b/74d64fe4055d4502ac600072586068b27d4aa7 diff --git a/test/integration/commitsRevert/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/diffing2/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/commitsRevert/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/diffing2/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/diffing2/expected/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 b/test/integration/diffing2/expected/repo/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 similarity index 100% rename from test/integration/diffing2/expected/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 rename to test/integration/diffing2/expected/repo/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 diff --git a/test/integration/commitsRevert/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/diffing2/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/commitsRevert/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/diffing2/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/diffing2/expected/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a b/test/integration/diffing2/expected/repo/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a similarity index 100% rename from test/integration/diffing2/expected/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a rename to test/integration/diffing2/expected/repo/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a diff --git a/test/integration/diffing2/expected/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b b/test/integration/diffing2/expected/repo/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b similarity index 100% rename from test/integration/diffing2/expected/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b rename to test/integration/diffing2/expected/repo/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b diff --git a/test/integration/diffing2/expected/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 b/test/integration/diffing2/expected/repo/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 similarity index 100% rename from test/integration/diffing2/expected/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 rename to test/integration/diffing2/expected/repo/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 diff --git a/test/integration/diffing2/expected/.git_keep/objects/6d/04f5ed53b383c0a4c63cac168df557b6df1e44 b/test/integration/diffing2/expected/repo/.git_keep/objects/6d/04f5ed53b383c0a4c63cac168df557b6df1e44 similarity index 100% rename from test/integration/diffing2/expected/.git_keep/objects/6d/04f5ed53b383c0a4c63cac168df557b6df1e44 rename to test/integration/diffing2/expected/repo/.git_keep/objects/6d/04f5ed53b383c0a4c63cac168df557b6df1e44 diff --git a/test/integration/diffing2/expected/.git_keep/objects/7b/f3d13079ced18f5b00e29c48c777e23f687d0a b/test/integration/diffing2/expected/repo/.git_keep/objects/7b/f3d13079ced18f5b00e29c48c777e23f687d0a similarity index 100% rename from test/integration/diffing2/expected/.git_keep/objects/7b/f3d13079ced18f5b00e29c48c777e23f687d0a rename to test/integration/diffing2/expected/repo/.git_keep/objects/7b/f3d13079ced18f5b00e29c48c777e23f687d0a diff --git a/test/integration/diffing2/expected/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 b/test/integration/diffing2/expected/repo/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 similarity index 100% rename from test/integration/diffing2/expected/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 rename to test/integration/diffing2/expected/repo/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 diff --git a/test/integration/diffing/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/diffing2/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c similarity index 100% rename from test/integration/diffing/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c rename to test/integration/diffing2/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c diff --git a/test/integration/diffing2/expected/.git_keep/objects/a1/1d868e88adb55a48fc55ee1377b3255c0cd329 b/test/integration/diffing2/expected/repo/.git_keep/objects/a1/1d868e88adb55a48fc55ee1377b3255c0cd329 similarity index 100% rename from test/integration/diffing2/expected/.git_keep/objects/a1/1d868e88adb55a48fc55ee1377b3255c0cd329 rename to test/integration/diffing2/expected/repo/.git_keep/objects/a1/1d868e88adb55a48fc55ee1377b3255c0cd329 diff --git a/test/integration/diffing/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/diffing2/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/diffing/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/diffing2/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/diffing2/expected/.git_keep/objects/c6/756882cc166f52b096a5e4fb9e4f5d507870c8 b/test/integration/diffing2/expected/repo/.git_keep/objects/c6/756882cc166f52b096a5e4fb9e4f5d507870c8 similarity index 100% rename from test/integration/diffing2/expected/.git_keep/objects/c6/756882cc166f52b096a5e4fb9e4f5d507870c8 rename to test/integration/diffing2/expected/repo/.git_keep/objects/c6/756882cc166f52b096a5e4fb9e4f5d507870c8 diff --git a/test/integration/diffing/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/diffing2/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 similarity index 100% rename from test/integration/diffing/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 rename to test/integration/diffing2/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 diff --git a/test/integration/diffing2/expected/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 b/test/integration/diffing2/expected/repo/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 similarity index 100% rename from test/integration/diffing2/expected/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 rename to test/integration/diffing2/expected/repo/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 diff --git a/test/integration/diffing2/expected/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a b/test/integration/diffing2/expected/repo/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a similarity index 100% rename from test/integration/diffing2/expected/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a rename to test/integration/diffing2/expected/repo/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a diff --git a/test/integration/diffing2/expected/.git_keep/objects/e8/76c3dfe2826621bea1bd3c87c2b9e2be88e69e b/test/integration/diffing2/expected/repo/.git_keep/objects/e8/76c3dfe2826621bea1bd3c87c2b9e2be88e69e similarity index 100% rename from test/integration/diffing2/expected/.git_keep/objects/e8/76c3dfe2826621bea1bd3c87c2b9e2be88e69e rename to test/integration/diffing2/expected/repo/.git_keep/objects/e8/76c3dfe2826621bea1bd3c87c2b9e2be88e69e diff --git a/test/integration/diffing2/expected/.git_keep/refs/heads/branch2 b/test/integration/diffing2/expected/repo/.git_keep/refs/heads/branch2 similarity index 100% rename from test/integration/diffing2/expected/.git_keep/refs/heads/branch2 rename to test/integration/diffing2/expected/repo/.git_keep/refs/heads/branch2 diff --git a/test/integration/diffing2/expected/.git_keep/refs/heads/master b/test/integration/diffing2/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/diffing2/expected/.git_keep/refs/heads/master rename to test/integration/diffing2/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/commitsRevert/expected/file0 b/test/integration/diffing2/expected/repo/file0 similarity index 100% rename from test/integration/commitsRevert/expected/file0 rename to test/integration/diffing2/expected/repo/file0 diff --git a/test/integration/diffing/expected/file1 b/test/integration/diffing2/expected/repo/file1 similarity index 100% rename from test/integration/diffing/expected/file1 rename to test/integration/diffing2/expected/repo/file1 diff --git a/test/integration/diffing2/expected/file2 b/test/integration/diffing2/expected/repo/file2 similarity index 100% rename from test/integration/diffing2/expected/file2 rename to test/integration/diffing2/expected/repo/file2 diff --git a/test/integration/diffing2/expected/file4 b/test/integration/diffing2/expected/repo/file4 similarity index 100% rename from test/integration/diffing2/expected/file4 rename to test/integration/diffing2/expected/repo/file4 diff --git a/test/integration/diffing3/expected/.git_keep/COMMIT_EDITMSG b/test/integration/diffing3/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/diffing3/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/diffing3/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/diffing/expected/.git_keep/FETCH_HEAD b/test/integration/diffing3/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/diffing/expected/.git_keep/FETCH_HEAD rename to test/integration/diffing3/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/diffing3/expected/.git_keep/HEAD b/test/integration/diffing3/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/diffing3/expected/.git_keep/HEAD rename to test/integration/diffing3/expected/repo/.git_keep/HEAD diff --git a/test/integration/diffing/expected/.git_keep/config b/test/integration/diffing3/expected/repo/.git_keep/config similarity index 100% rename from test/integration/diffing/expected/.git_keep/config rename to test/integration/diffing3/expected/repo/.git_keep/config diff --git a/test/integration/diffing/expected/.git_keep/description b/test/integration/diffing3/expected/repo/.git_keep/description similarity index 100% rename from test/integration/diffing/expected/.git_keep/description rename to test/integration/diffing3/expected/repo/.git_keep/description diff --git a/test/integration/diffing3/expected/.git_keep/index b/test/integration/diffing3/expected/repo/.git_keep/index similarity index 100% rename from test/integration/diffing3/expected/.git_keep/index rename to test/integration/diffing3/expected/repo/.git_keep/index diff --git a/test/integration/diffing/expected/.git_keep/info/exclude b/test/integration/diffing3/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/diffing/expected/.git_keep/info/exclude rename to test/integration/diffing3/expected/repo/.git_keep/info/exclude diff --git a/test/integration/diffing3/expected/.git_keep/logs/HEAD b/test/integration/diffing3/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/diffing3/expected/.git_keep/logs/HEAD rename to test/integration/diffing3/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/diffing3/expected/.git_keep/logs/refs/heads/branch2 b/test/integration/diffing3/expected/repo/.git_keep/logs/refs/heads/branch2 similarity index 100% rename from test/integration/diffing3/expected/.git_keep/logs/refs/heads/branch2 rename to test/integration/diffing3/expected/repo/.git_keep/logs/refs/heads/branch2 diff --git a/test/integration/diffing3/expected/.git_keep/logs/refs/heads/master b/test/integration/diffing3/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/diffing3/expected/.git_keep/logs/refs/heads/master rename to test/integration/diffing3/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/diffing3/expected/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 b/test/integration/diffing3/expected/repo/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 similarity index 100% rename from test/integration/diffing3/expected/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 rename to test/integration/diffing3/expected/repo/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 diff --git a/test/integration/diffing3/expected/.git_keep/objects/13/d8ce6d541ffd4b323376e2530ccdd3bcc7b8d5 b/test/integration/diffing3/expected/repo/.git_keep/objects/13/d8ce6d541ffd4b323376e2530ccdd3bcc7b8d5 similarity index 100% rename from test/integration/diffing3/expected/.git_keep/objects/13/d8ce6d541ffd4b323376e2530ccdd3bcc7b8d5 rename to test/integration/diffing3/expected/repo/.git_keep/objects/13/d8ce6d541ffd4b323376e2530ccdd3bcc7b8d5 diff --git a/test/integration/diffing2/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/diffing3/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/diffing2/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/diffing3/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/diffing/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/diffing3/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/diffing/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/diffing3/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/diffing3/expected/.git_keep/objects/1e/dd26fd03ee6243bd1513788874c6c57ef1d41a b/test/integration/diffing3/expected/repo/.git_keep/objects/1e/dd26fd03ee6243bd1513788874c6c57ef1d41a similarity index 100% rename from test/integration/diffing3/expected/.git_keep/objects/1e/dd26fd03ee6243bd1513788874c6c57ef1d41a rename to test/integration/diffing3/expected/repo/.git_keep/objects/1e/dd26fd03ee6243bd1513788874c6c57ef1d41a diff --git a/test/integration/diffing3/expected/.git_keep/objects/27/5e6a821120c07a9068a9701ed14a82eeed3117 b/test/integration/diffing3/expected/repo/.git_keep/objects/27/5e6a821120c07a9068a9701ed14a82eeed3117 similarity index 100% rename from test/integration/diffing3/expected/.git_keep/objects/27/5e6a821120c07a9068a9701ed14a82eeed3117 rename to test/integration/diffing3/expected/repo/.git_keep/objects/27/5e6a821120c07a9068a9701ed14a82eeed3117 diff --git a/test/integration/diffing3/expected/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 b/test/integration/diffing3/expected/repo/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 similarity index 100% rename from test/integration/diffing3/expected/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 rename to test/integration/diffing3/expected/repo/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 diff --git a/test/integration/diffing/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/diffing3/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/diffing/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/diffing3/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/diffing3/expected/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a b/test/integration/diffing3/expected/repo/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a similarity index 100% rename from test/integration/diffing3/expected/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a rename to test/integration/diffing3/expected/repo/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a diff --git a/test/integration/diffing3/expected/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b b/test/integration/diffing3/expected/repo/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b similarity index 100% rename from test/integration/diffing3/expected/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b rename to test/integration/diffing3/expected/repo/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b diff --git a/test/integration/diffing3/expected/.git_keep/objects/4e/2d07409901af28a47f5d3b126953a5fb8b36ee b/test/integration/diffing3/expected/repo/.git_keep/objects/4e/2d07409901af28a47f5d3b126953a5fb8b36ee similarity index 100% rename from test/integration/diffing3/expected/.git_keep/objects/4e/2d07409901af28a47f5d3b126953a5fb8b36ee rename to test/integration/diffing3/expected/repo/.git_keep/objects/4e/2d07409901af28a47f5d3b126953a5fb8b36ee diff --git a/test/integration/diffing3/expected/.git_keep/objects/57/695899c35539821690c4c132bd0e872a01c192 b/test/integration/diffing3/expected/repo/.git_keep/objects/57/695899c35539821690c4c132bd0e872a01c192 similarity index 100% rename from test/integration/diffing3/expected/.git_keep/objects/57/695899c35539821690c4c132bd0e872a01c192 rename to test/integration/diffing3/expected/repo/.git_keep/objects/57/695899c35539821690c4c132bd0e872a01c192 diff --git a/test/integration/diffing3/expected/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 b/test/integration/diffing3/expected/repo/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 similarity index 100% rename from test/integration/diffing3/expected/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 rename to test/integration/diffing3/expected/repo/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 diff --git a/test/integration/diffing3/expected/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 b/test/integration/diffing3/expected/repo/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 similarity index 100% rename from test/integration/diffing3/expected/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 rename to test/integration/diffing3/expected/repo/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 diff --git a/test/integration/diffing3/expected/.git_keep/objects/93/b73046d6820607f1da09399b55a145d5389ab8 b/test/integration/diffing3/expected/repo/.git_keep/objects/93/b73046d6820607f1da09399b55a145d5389ab8 similarity index 100% rename from test/integration/diffing3/expected/.git_keep/objects/93/b73046d6820607f1da09399b55a145d5389ab8 rename to test/integration/diffing3/expected/repo/.git_keep/objects/93/b73046d6820607f1da09399b55a145d5389ab8 diff --git a/test/integration/diffing2/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/diffing3/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c similarity index 100% rename from test/integration/diffing2/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c rename to test/integration/diffing3/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c diff --git a/test/integration/diffing2/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/diffing3/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/diffing2/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/diffing3/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/diffing3/expected/.git_keep/objects/b2/5b8446022fb5fcded2bab1ed2b02828a5c4d0b b/test/integration/diffing3/expected/repo/.git_keep/objects/b2/5b8446022fb5fcded2bab1ed2b02828a5c4d0b similarity index 100% rename from test/integration/diffing3/expected/.git_keep/objects/b2/5b8446022fb5fcded2bab1ed2b02828a5c4d0b rename to test/integration/diffing3/expected/repo/.git_keep/objects/b2/5b8446022fb5fcded2bab1ed2b02828a5c4d0b diff --git a/test/integration/diffing2/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/diffing3/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 similarity index 100% rename from test/integration/diffing2/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 rename to test/integration/diffing3/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 diff --git a/test/integration/diffing3/expected/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 b/test/integration/diffing3/expected/repo/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 similarity index 100% rename from test/integration/diffing3/expected/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 rename to test/integration/diffing3/expected/repo/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 diff --git a/test/integration/diffing3/expected/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a b/test/integration/diffing3/expected/repo/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a similarity index 100% rename from test/integration/diffing3/expected/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a rename to test/integration/diffing3/expected/repo/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a diff --git a/test/integration/diffing3/expected/.git_keep/objects/ff/b13702e6bc59e2806bc3a5f93500e46925b131 b/test/integration/diffing3/expected/repo/.git_keep/objects/ff/b13702e6bc59e2806bc3a5f93500e46925b131 similarity index 100% rename from test/integration/diffing3/expected/.git_keep/objects/ff/b13702e6bc59e2806bc3a5f93500e46925b131 rename to test/integration/diffing3/expected/repo/.git_keep/objects/ff/b13702e6bc59e2806bc3a5f93500e46925b131 diff --git a/test/integration/diffing3/expected/.git_keep/refs/heads/branch2 b/test/integration/diffing3/expected/repo/.git_keep/refs/heads/branch2 similarity index 100% rename from test/integration/diffing3/expected/.git_keep/refs/heads/branch2 rename to test/integration/diffing3/expected/repo/.git_keep/refs/heads/branch2 diff --git a/test/integration/diffing3/expected/.git_keep/refs/heads/master b/test/integration/diffing3/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/diffing3/expected/.git_keep/refs/heads/master rename to test/integration/diffing3/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/diffing/expected/file0 b/test/integration/diffing3/expected/repo/file0 similarity index 100% rename from test/integration/diffing/expected/file0 rename to test/integration/diffing3/expected/repo/file0 diff --git a/test/integration/diffing2/expected/file1 b/test/integration/diffing3/expected/repo/file1 similarity index 100% rename from test/integration/diffing2/expected/file1 rename to test/integration/diffing3/expected/repo/file1 diff --git a/test/integration/diffing3/expected/file2 b/test/integration/diffing3/expected/repo/file2 similarity index 100% rename from test/integration/diffing3/expected/file2 rename to test/integration/diffing3/expected/repo/file2 diff --git a/test/integration/discardFileChanges/expected/.git_keep/COMMIT_EDITMSG b/test/integration/discardFileChanges/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/discardFileChanges/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/diffing2/expected/.git_keep/FETCH_HEAD b/test/integration/discardFileChanges/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/diffing2/expected/.git_keep/FETCH_HEAD rename to test/integration/discardFileChanges/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/discardFileChanges/expected/.git_keep/HEAD b/test/integration/discardFileChanges/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/HEAD rename to test/integration/discardFileChanges/expected/repo/.git_keep/HEAD diff --git a/test/integration/discardFileChanges/expected/.git_keep/ORIG_HEAD b/test/integration/discardFileChanges/expected/repo/.git_keep/ORIG_HEAD similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/ORIG_HEAD rename to test/integration/discardFileChanges/expected/repo/.git_keep/ORIG_HEAD diff --git a/test/integration/diffing2/expected/.git_keep/config b/test/integration/discardFileChanges/expected/repo/.git_keep/config similarity index 100% rename from test/integration/diffing2/expected/.git_keep/config rename to test/integration/discardFileChanges/expected/repo/.git_keep/config diff --git a/test/integration/diffing2/expected/.git_keep/description b/test/integration/discardFileChanges/expected/repo/.git_keep/description similarity index 100% rename from test/integration/diffing2/expected/.git_keep/description rename to test/integration/discardFileChanges/expected/repo/.git_keep/description diff --git a/test/integration/discardFileChanges/expected/.git_keep/index b/test/integration/discardFileChanges/expected/repo/.git_keep/index similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/index rename to test/integration/discardFileChanges/expected/repo/.git_keep/index diff --git a/test/integration/diffing2/expected/.git_keep/info/exclude b/test/integration/discardFileChanges/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/diffing2/expected/.git_keep/info/exclude rename to test/integration/discardFileChanges/expected/repo/.git_keep/info/exclude diff --git a/test/integration/discardFileChanges/expected/.git_keep/logs/HEAD b/test/integration/discardFileChanges/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/logs/HEAD rename to test/integration/discardFileChanges/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/discardFileChanges/expected/.git_keep/logs/refs/heads/conflict b/test/integration/discardFileChanges/expected/repo/.git_keep/logs/refs/heads/conflict similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/logs/refs/heads/conflict rename to test/integration/discardFileChanges/expected/repo/.git_keep/logs/refs/heads/conflict diff --git a/test/integration/discardFileChanges/expected/.git_keep/logs/refs/heads/conflict_second b/test/integration/discardFileChanges/expected/repo/.git_keep/logs/refs/heads/conflict_second similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/logs/refs/heads/conflict_second rename to test/integration/discardFileChanges/expected/repo/.git_keep/logs/refs/heads/conflict_second diff --git a/test/integration/discardFileChanges/expected/.git_keep/objects/11/bdfc142c42c6ffaa904890ab61ec76262ec9ca b/test/integration/discardFileChanges/expected/repo/.git_keep/objects/11/bdfc142c42c6ffaa904890ab61ec76262ec9ca similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/objects/11/bdfc142c42c6ffaa904890ab61ec76262ec9ca rename to test/integration/discardFileChanges/expected/repo/.git_keep/objects/11/bdfc142c42c6ffaa904890ab61ec76262ec9ca diff --git a/test/integration/discardFileChanges/expected/.git_keep/objects/15/fe7f43604da957ffb663b4db95b60d0af66469 b/test/integration/discardFileChanges/expected/repo/.git_keep/objects/15/fe7f43604da957ffb663b4db95b60d0af66469 similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/objects/15/fe7f43604da957ffb663b4db95b60d0af66469 rename to test/integration/discardFileChanges/expected/repo/.git_keep/objects/15/fe7f43604da957ffb663b4db95b60d0af66469 diff --git a/test/integration/discardFileChanges/expected/.git_keep/objects/1c/9488b0e1b8abd1ec8645b3345bdac91290b464 b/test/integration/discardFileChanges/expected/repo/.git_keep/objects/1c/9488b0e1b8abd1ec8645b3345bdac91290b464 similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/objects/1c/9488b0e1b8abd1ec8645b3345bdac91290b464 rename to test/integration/discardFileChanges/expected/repo/.git_keep/objects/1c/9488b0e1b8abd1ec8645b3345bdac91290b464 diff --git a/test/integration/discardFileChanges/expected/.git_keep/objects/26/80cfddbd9fa03c059ac60d2bec5e59a1c34281 b/test/integration/discardFileChanges/expected/repo/.git_keep/objects/26/80cfddbd9fa03c059ac60d2bec5e59a1c34281 similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/objects/26/80cfddbd9fa03c059ac60d2bec5e59a1c34281 rename to test/integration/discardFileChanges/expected/repo/.git_keep/objects/26/80cfddbd9fa03c059ac60d2bec5e59a1c34281 diff --git a/test/integration/discardFileChanges/expected/.git_keep/objects/2c/e75e2a24f7d6841a504cf3616ef5a59edb3a2d b/test/integration/discardFileChanges/expected/repo/.git_keep/objects/2c/e75e2a24f7d6841a504cf3616ef5a59edb3a2d similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/objects/2c/e75e2a24f7d6841a504cf3616ef5a59edb3a2d rename to test/integration/discardFileChanges/expected/repo/.git_keep/objects/2c/e75e2a24f7d6841a504cf3616ef5a59edb3a2d diff --git a/test/integration/discardFileChanges/expected/.git_keep/objects/30/07c9c07bf80aaa72b1f1f704e7fea622446678 b/test/integration/discardFileChanges/expected/repo/.git_keep/objects/30/07c9c07bf80aaa72b1f1f704e7fea622446678 similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/objects/30/07c9c07bf80aaa72b1f1f704e7fea622446678 rename to test/integration/discardFileChanges/expected/repo/.git_keep/objects/30/07c9c07bf80aaa72b1f1f704e7fea622446678 diff --git a/test/integration/discardFileChanges/expected/.git_keep/objects/3f/7bd8f68987d4e16b8f6fa7f6b0738b42180d1f b/test/integration/discardFileChanges/expected/repo/.git_keep/objects/3f/7bd8f68987d4e16b8f6fa7f6b0738b42180d1f similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/objects/3f/7bd8f68987d4e16b8f6fa7f6b0738b42180d1f rename to test/integration/discardFileChanges/expected/repo/.git_keep/objects/3f/7bd8f68987d4e16b8f6fa7f6b0738b42180d1f diff --git a/test/integration/discardFileChanges/expected/.git_keep/objects/47/966dcaa8ee736e89279b895faf8707de898e04 b/test/integration/discardFileChanges/expected/repo/.git_keep/objects/47/966dcaa8ee736e89279b895faf8707de898e04 similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/objects/47/966dcaa8ee736e89279b895faf8707de898e04 rename to test/integration/discardFileChanges/expected/repo/.git_keep/objects/47/966dcaa8ee736e89279b895faf8707de898e04 diff --git a/test/integration/discardFileChanges/expected/.git_keep/objects/48/f9387742d3cc3017c1a7e292c9187e35321753 b/test/integration/discardFileChanges/expected/repo/.git_keep/objects/48/f9387742d3cc3017c1a7e292c9187e35321753 similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/objects/48/f9387742d3cc3017c1a7e292c9187e35321753 rename to test/integration/discardFileChanges/expected/repo/.git_keep/objects/48/f9387742d3cc3017c1a7e292c9187e35321753 diff --git a/test/integration/discardFileChanges/expected/.git_keep/objects/4d/8452fc76beed0c7b15e40e45d06922bf746c5f b/test/integration/discardFileChanges/expected/repo/.git_keep/objects/4d/8452fc76beed0c7b15e40e45d06922bf746c5f similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/objects/4d/8452fc76beed0c7b15e40e45d06922bf746c5f rename to test/integration/discardFileChanges/expected/repo/.git_keep/objects/4d/8452fc76beed0c7b15e40e45d06922bf746c5f diff --git a/test/integration/discardFileChanges/expected/.git_keep/objects/59/cf7b78af9aab84813bcb0bc8be27fdd9216b2b b/test/integration/discardFileChanges/expected/repo/.git_keep/objects/59/cf7b78af9aab84813bcb0bc8be27fdd9216b2b similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/objects/59/cf7b78af9aab84813bcb0bc8be27fdd9216b2b rename to test/integration/discardFileChanges/expected/repo/.git_keep/objects/59/cf7b78af9aab84813bcb0bc8be27fdd9216b2b diff --git a/test/integration/discardFileChanges/expected/.git_keep/objects/5a/d28e22767f979da2c198dc6c1003b25964e3da b/test/integration/discardFileChanges/expected/repo/.git_keep/objects/5a/d28e22767f979da2c198dc6c1003b25964e3da similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/objects/5a/d28e22767f979da2c198dc6c1003b25964e3da rename to test/integration/discardFileChanges/expected/repo/.git_keep/objects/5a/d28e22767f979da2c198dc6c1003b25964e3da diff --git a/test/integration/discardFileChanges/expected/.git_keep/objects/5b/e4a414b32cf4204f889469942986d3d783da84 b/test/integration/discardFileChanges/expected/repo/.git_keep/objects/5b/e4a414b32cf4204f889469942986d3d783da84 similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/objects/5b/e4a414b32cf4204f889469942986d3d783da84 rename to test/integration/discardFileChanges/expected/repo/.git_keep/objects/5b/e4a414b32cf4204f889469942986d3d783da84 diff --git a/test/integration/discardFileChanges/expected/.git_keep/objects/7a/22af9d1908d85e3c4b6d916a9b6c733c55c990 b/test/integration/discardFileChanges/expected/repo/.git_keep/objects/7a/22af9d1908d85e3c4b6d916a9b6c733c55c990 similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/objects/7a/22af9d1908d85e3c4b6d916a9b6c733c55c990 rename to test/integration/discardFileChanges/expected/repo/.git_keep/objects/7a/22af9d1908d85e3c4b6d916a9b6c733c55c990 diff --git a/test/integration/discardFileChanges/expected/.git_keep/objects/85/4f08fa802293e0679d07771547fe9fe5d159e8 b/test/integration/discardFileChanges/expected/repo/.git_keep/objects/85/4f08fa802293e0679d07771547fe9fe5d159e8 similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/objects/85/4f08fa802293e0679d07771547fe9fe5d159e8 rename to test/integration/discardFileChanges/expected/repo/.git_keep/objects/85/4f08fa802293e0679d07771547fe9fe5d159e8 diff --git a/test/integration/discardFileChanges/expected/.git_keep/objects/89/44a13fdfc597e4cf1d23797df51977680f8e77 b/test/integration/discardFileChanges/expected/repo/.git_keep/objects/89/44a13fdfc597e4cf1d23797df51977680f8e77 similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/objects/89/44a13fdfc597e4cf1d23797df51977680f8e77 rename to test/integration/discardFileChanges/expected/repo/.git_keep/objects/89/44a13fdfc597e4cf1d23797df51977680f8e77 diff --git a/test/integration/discardFileChanges/expected/.git_keep/objects/8c/82faa1358ce6cddba19d59b2924cbcc5ef1c8e b/test/integration/discardFileChanges/expected/repo/.git_keep/objects/8c/82faa1358ce6cddba19d59b2924cbcc5ef1c8e similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/objects/8c/82faa1358ce6cddba19d59b2924cbcc5ef1c8e rename to test/integration/discardFileChanges/expected/repo/.git_keep/objects/8c/82faa1358ce6cddba19d59b2924cbcc5ef1c8e diff --git a/test/integration/discardFileChanges/expected/.git_keep/objects/90/7b308167f0880fb2a5c0e1614bb0c7620f9dc3 b/test/integration/discardFileChanges/expected/repo/.git_keep/objects/90/7b308167f0880fb2a5c0e1614bb0c7620f9dc3 similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/objects/90/7b308167f0880fb2a5c0e1614bb0c7620f9dc3 rename to test/integration/discardFileChanges/expected/repo/.git_keep/objects/90/7b308167f0880fb2a5c0e1614bb0c7620f9dc3 diff --git a/test/integration/discardFileChanges/expected/.git_keep/objects/90/be1f3056c4f471f977a28497b8d4b392c55a02 b/test/integration/discardFileChanges/expected/repo/.git_keep/objects/90/be1f3056c4f471f977a28497b8d4b392c55a02 similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/objects/90/be1f3056c4f471f977a28497b8d4b392c55a02 rename to test/integration/discardFileChanges/expected/repo/.git_keep/objects/90/be1f3056c4f471f977a28497b8d4b392c55a02 diff --git a/test/integration/discardFileChanges/expected/.git_keep/objects/98/e834e9cdae1191de7fafb2b6f334bddd0793e8 b/test/integration/discardFileChanges/expected/repo/.git_keep/objects/98/e834e9cdae1191de7fafb2b6f334bddd0793e8 similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/objects/98/e834e9cdae1191de7fafb2b6f334bddd0793e8 rename to test/integration/discardFileChanges/expected/repo/.git_keep/objects/98/e834e9cdae1191de7fafb2b6f334bddd0793e8 diff --git a/test/integration/discardFileChanges/expected/.git_keep/objects/99/76d7948def8b082e9d20135d6a04624d711752 b/test/integration/discardFileChanges/expected/repo/.git_keep/objects/99/76d7948def8b082e9d20135d6a04624d711752 similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/objects/99/76d7948def8b082e9d20135d6a04624d711752 rename to test/integration/discardFileChanges/expected/repo/.git_keep/objects/99/76d7948def8b082e9d20135d6a04624d711752 diff --git a/test/integration/discardFileChanges/expected/.git_keep/objects/9d/aeafb9864cf43055ae93beb0afd6c7d144bfa4 b/test/integration/discardFileChanges/expected/repo/.git_keep/objects/9d/aeafb9864cf43055ae93beb0afd6c7d144bfa4 similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/objects/9d/aeafb9864cf43055ae93beb0afd6c7d144bfa4 rename to test/integration/discardFileChanges/expected/repo/.git_keep/objects/9d/aeafb9864cf43055ae93beb0afd6c7d144bfa4 diff --git a/test/integration/discardFileChanges/expected/.git_keep/objects/9f/5118ee216a6e44728305f90633b0c0e2ad235c b/test/integration/discardFileChanges/expected/repo/.git_keep/objects/9f/5118ee216a6e44728305f90633b0c0e2ad235c similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/objects/9f/5118ee216a6e44728305f90633b0c0e2ad235c rename to test/integration/discardFileChanges/expected/repo/.git_keep/objects/9f/5118ee216a6e44728305f90633b0c0e2ad235c diff --git a/test/integration/discardFileChanges/expected/.git_keep/objects/a1/be04124078e38a592c153942bf75edf210f1ed b/test/integration/discardFileChanges/expected/repo/.git_keep/objects/a1/be04124078e38a592c153942bf75edf210f1ed similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/objects/a1/be04124078e38a592c153942bf75edf210f1ed rename to test/integration/discardFileChanges/expected/repo/.git_keep/objects/a1/be04124078e38a592c153942bf75edf210f1ed diff --git a/test/integration/discardFileChanges/expected/.git_keep/objects/a1/e09c2fda67b9f8d4440073c0c33f6e45689b7c b/test/integration/discardFileChanges/expected/repo/.git_keep/objects/a1/e09c2fda67b9f8d4440073c0c33f6e45689b7c similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/objects/a1/e09c2fda67b9f8d4440073c0c33f6e45689b7c rename to test/integration/discardFileChanges/expected/repo/.git_keep/objects/a1/e09c2fda67b9f8d4440073c0c33f6e45689b7c diff --git a/test/integration/discardFileChanges/expected/.git_keep/objects/ab/addc0b9edd523c69166a2c9f3a9e31a4c873e3 b/test/integration/discardFileChanges/expected/repo/.git_keep/objects/ab/addc0b9edd523c69166a2c9f3a9e31a4c873e3 similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/objects/ab/addc0b9edd523c69166a2c9f3a9e31a4c873e3 rename to test/integration/discardFileChanges/expected/repo/.git_keep/objects/ab/addc0b9edd523c69166a2c9f3a9e31a4c873e3 diff --git a/test/integration/discardFileChanges/expected/.git_keep/objects/c9/1b3b139ea108475c19839fcda3a4e33db4ccc9 b/test/integration/discardFileChanges/expected/repo/.git_keep/objects/c9/1b3b139ea108475c19839fcda3a4e33db4ccc9 similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/objects/c9/1b3b139ea108475c19839fcda3a4e33db4ccc9 rename to test/integration/discardFileChanges/expected/repo/.git_keep/objects/c9/1b3b139ea108475c19839fcda3a4e33db4ccc9 diff --git a/test/integration/discardFileChanges/expected/.git_keep/objects/ce/e08babc6b109f011f42eaba5f79e6e693c09e7 b/test/integration/discardFileChanges/expected/repo/.git_keep/objects/ce/e08babc6b109f011f42eaba5f79e6e693c09e7 similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/objects/ce/e08babc6b109f011f42eaba5f79e6e693c09e7 rename to test/integration/discardFileChanges/expected/repo/.git_keep/objects/ce/e08babc6b109f011f42eaba5f79e6e693c09e7 diff --git a/test/integration/discardFileChanges/expected/.git_keep/objects/d4/d1b67951582a751c12ff7ea29ede7d37fd9ee8 b/test/integration/discardFileChanges/expected/repo/.git_keep/objects/d4/d1b67951582a751c12ff7ea29ede7d37fd9ee8 similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/objects/d4/d1b67951582a751c12ff7ea29ede7d37fd9ee8 rename to test/integration/discardFileChanges/expected/repo/.git_keep/objects/d4/d1b67951582a751c12ff7ea29ede7d37fd9ee8 diff --git a/test/integration/discardFileChanges/expected/.git_keep/objects/d7/98b86744c3997c186e0f0dc666f02943c797a7 b/test/integration/discardFileChanges/expected/repo/.git_keep/objects/d7/98b86744c3997c186e0f0dc666f02943c797a7 similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/objects/d7/98b86744c3997c186e0f0dc666f02943c797a7 rename to test/integration/discardFileChanges/expected/repo/.git_keep/objects/d7/98b86744c3997c186e0f0dc666f02943c797a7 diff --git a/test/integration/discardFileChanges/expected/.git_keep/objects/e9/55de60e73263440d4651e79e947ec8b2902373 b/test/integration/discardFileChanges/expected/repo/.git_keep/objects/e9/55de60e73263440d4651e79e947ec8b2902373 similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/objects/e9/55de60e73263440d4651e79e947ec8b2902373 rename to test/integration/discardFileChanges/expected/repo/.git_keep/objects/e9/55de60e73263440d4651e79e947ec8b2902373 diff --git a/test/integration/discardFileChanges/expected/.git_keep/objects/fa/938d99f6ee5cc562cd0f33fa64fd68d78ce2e9 b/test/integration/discardFileChanges/expected/repo/.git_keep/objects/fa/938d99f6ee5cc562cd0f33fa64fd68d78ce2e9 similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/objects/fa/938d99f6ee5cc562cd0f33fa64fd68d78ce2e9 rename to test/integration/discardFileChanges/expected/repo/.git_keep/objects/fa/938d99f6ee5cc562cd0f33fa64fd68d78ce2e9 diff --git a/test/integration/discardFileChanges/expected/.git_keep/refs/heads/conflict b/test/integration/discardFileChanges/expected/repo/.git_keep/refs/heads/conflict similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/refs/heads/conflict rename to test/integration/discardFileChanges/expected/repo/.git_keep/refs/heads/conflict diff --git a/test/integration/discardFileChanges/expected/.git_keep/refs/heads/conflict_second b/test/integration/discardFileChanges/expected/repo/.git_keep/refs/heads/conflict_second similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/refs/heads/conflict_second rename to test/integration/discardFileChanges/expected/repo/.git_keep/refs/heads/conflict_second diff --git a/test/integration/discardFileChanges/expected/both-added.txt b/test/integration/discardFileChanges/expected/repo/both-added.txt similarity index 100% rename from test/integration/discardFileChanges/expected/both-added.txt rename to test/integration/discardFileChanges/expected/repo/both-added.txt diff --git a/test/integration/discardFileChanges/expected/both-modded.txt b/test/integration/discardFileChanges/expected/repo/both-modded.txt similarity index 100% rename from test/integration/discardFileChanges/expected/both-modded.txt rename to test/integration/discardFileChanges/expected/repo/both-modded.txt diff --git a/test/integration/discardFileChanges/expected/change-delete.txt b/test/integration/discardFileChanges/expected/repo/change-delete.txt similarity index 100% rename from test/integration/discardFileChanges/expected/change-delete.txt rename to test/integration/discardFileChanges/expected/repo/change-delete.txt diff --git a/test/integration/discardFileChanges/expected/changed-them-added-us.txt b/test/integration/discardFileChanges/expected/repo/changed-them-added-us.txt similarity index 100% rename from test/integration/discardFileChanges/expected/changed-them-added-us.txt rename to test/integration/discardFileChanges/expected/repo/changed-them-added-us.txt diff --git a/test/integration/discardFileChanges/expected/delete-change.txt b/test/integration/discardFileChanges/expected/repo/delete-change.txt similarity index 100% rename from test/integration/discardFileChanges/expected/delete-change.txt rename to test/integration/discardFileChanges/expected/repo/delete-change.txt diff --git a/test/integration/discardFileChanges/expected/deleted-staged.txt b/test/integration/discardFileChanges/expected/repo/deleted-staged.txt similarity index 100% rename from test/integration/discardFileChanges/expected/deleted-staged.txt rename to test/integration/discardFileChanges/expected/repo/deleted-staged.txt diff --git a/test/integration/discardFileChanges/expected/deleted-them.txt b/test/integration/discardFileChanges/expected/repo/deleted-them.txt similarity index 100% rename from test/integration/discardFileChanges/expected/deleted-them.txt rename to test/integration/discardFileChanges/expected/repo/deleted-them.txt diff --git a/test/integration/discardFileChanges/expected/deleted.txt b/test/integration/discardFileChanges/expected/repo/deleted.txt similarity index 100% rename from test/integration/discardFileChanges/expected/deleted.txt rename to test/integration/discardFileChanges/expected/repo/deleted.txt diff --git a/test/integration/discardFileChanges/expected/double-modded.txt b/test/integration/discardFileChanges/expected/repo/double-modded.txt similarity index 100% rename from test/integration/discardFileChanges/expected/double-modded.txt rename to test/integration/discardFileChanges/expected/repo/double-modded.txt diff --git a/test/integration/discardFileChanges/expected/modded-staged.txt b/test/integration/discardFileChanges/expected/repo/modded-staged.txt similarity index 100% rename from test/integration/discardFileChanges/expected/modded-staged.txt rename to test/integration/discardFileChanges/expected/repo/modded-staged.txt diff --git a/test/integration/discardFileChanges/expected/modded.txt b/test/integration/discardFileChanges/expected/repo/modded.txt similarity index 100% rename from test/integration/discardFileChanges/expected/modded.txt rename to test/integration/discardFileChanges/expected/repo/modded.txt diff --git a/test/integration/discardFileChanges/expected/renamed.txt b/test/integration/discardFileChanges/expected/repo/renamed.txt similarity index 100% rename from test/integration/discardFileChanges/expected/renamed.txt rename to test/integration/discardFileChanges/expected/repo/renamed.txt diff --git a/test/integration/discardFileChanges/setup.sh b/test/integration/discardFileChanges/setup.sh index 82fa59475..ac9573e82 100644 --- a/test/integration/discardFileChanges/setup.sh +++ b/test/integration/discardFileChanges/setup.sh @@ -1,6 +1,7 @@ #!/bin/sh -set -e +# expecting an error so we're not setting this +# set -e cd $1 diff --git a/test/integration/discardOldFileChanges/expected/.git_keep/COMMIT_EDITMSG b/test/integration/discardOldFileChanges/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/discardOldFileChanges/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/discardOldFileChanges/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/diffing3/expected/.git_keep/FETCH_HEAD b/test/integration/discardOldFileChanges/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/diffing3/expected/.git_keep/FETCH_HEAD rename to test/integration/discardOldFileChanges/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/discardOldFileChanges/expected/.git_keep/HEAD b/test/integration/discardOldFileChanges/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/discardOldFileChanges/expected/.git_keep/HEAD rename to test/integration/discardOldFileChanges/expected/repo/.git_keep/HEAD diff --git a/test/integration/discardOldFileChanges/expected/.git_keep/ORIG_HEAD b/test/integration/discardOldFileChanges/expected/repo/.git_keep/ORIG_HEAD similarity index 100% rename from test/integration/discardOldFileChanges/expected/.git_keep/ORIG_HEAD rename to test/integration/discardOldFileChanges/expected/repo/.git_keep/ORIG_HEAD diff --git a/test/integration/diffing3/expected/.git_keep/config b/test/integration/discardOldFileChanges/expected/repo/.git_keep/config similarity index 100% rename from test/integration/diffing3/expected/.git_keep/config rename to test/integration/discardOldFileChanges/expected/repo/.git_keep/config diff --git a/test/integration/diffing3/expected/.git_keep/description b/test/integration/discardOldFileChanges/expected/repo/.git_keep/description similarity index 100% rename from test/integration/diffing3/expected/.git_keep/description rename to test/integration/discardOldFileChanges/expected/repo/.git_keep/description diff --git a/test/integration/discardOldFileChanges/expected/.git_keep/index b/test/integration/discardOldFileChanges/expected/repo/.git_keep/index similarity index 100% rename from test/integration/discardOldFileChanges/expected/.git_keep/index rename to test/integration/discardOldFileChanges/expected/repo/.git_keep/index diff --git a/test/integration/diffing3/expected/.git_keep/info/exclude b/test/integration/discardOldFileChanges/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/diffing3/expected/.git_keep/info/exclude rename to test/integration/discardOldFileChanges/expected/repo/.git_keep/info/exclude diff --git a/test/integration/discardOldFileChanges/expected/.git_keep/logs/HEAD b/test/integration/discardOldFileChanges/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/discardOldFileChanges/expected/.git_keep/logs/HEAD rename to test/integration/discardOldFileChanges/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/discardOldFileChanges/expected/.git_keep/logs/refs/heads/master b/test/integration/discardOldFileChanges/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/discardOldFileChanges/expected/.git_keep/logs/refs/heads/master rename to test/integration/discardOldFileChanges/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/discardOldFileChanges/expected/.git_keep/objects/00/cbccfd35a05ef9373bba9d5633cf6e67f83dd5 b/test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/00/cbccfd35a05ef9373bba9d5633cf6e67f83dd5 similarity index 100% rename from test/integration/discardOldFileChanges/expected/.git_keep/objects/00/cbccfd35a05ef9373bba9d5633cf6e67f83dd5 rename to test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/00/cbccfd35a05ef9373bba9d5633cf6e67f83dd5 diff --git a/test/integration/discardOldFileChanges/expected/.git_keep/objects/0a/91dcf3772f7fd7409b3df04eb6ef177219303a b/test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/0a/91dcf3772f7fd7409b3df04eb6ef177219303a similarity index 100% rename from test/integration/discardOldFileChanges/expected/.git_keep/objects/0a/91dcf3772f7fd7409b3df04eb6ef177219303a rename to test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/0a/91dcf3772f7fd7409b3df04eb6ef177219303a diff --git a/test/integration/discardOldFileChanges/expected/.git_keep/objects/0c/db6daba7e25b6d6d10da326e0ab74401021370 b/test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/0c/db6daba7e25b6d6d10da326e0ab74401021370 similarity index 100% rename from test/integration/discardOldFileChanges/expected/.git_keep/objects/0c/db6daba7e25b6d6d10da326e0ab74401021370 rename to test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/0c/db6daba7e25b6d6d10da326e0ab74401021370 diff --git a/test/integration/diffing3/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/diffing3/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/discardOldFileChanges/expected/.git_keep/objects/18/e987d34afb121659724591cd709e2a789184fc b/test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/18/e987d34afb121659724591cd709e2a789184fc similarity index 100% rename from test/integration/discardOldFileChanges/expected/.git_keep/objects/18/e987d34afb121659724591cd709e2a789184fc rename to test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/18/e987d34afb121659724591cd709e2a789184fc diff --git a/test/integration/diffing2/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/diffing2/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/discardOldFileChanges/expected/.git_keep/objects/22/5ad83faa797c1831a2bc956a21e2d472f21443 b/test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/22/5ad83faa797c1831a2bc956a21e2d472f21443 similarity index 100% rename from test/integration/discardOldFileChanges/expected/.git_keep/objects/22/5ad83faa797c1831a2bc956a21e2d472f21443 rename to test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/22/5ad83faa797c1831a2bc956a21e2d472f21443 diff --git a/test/integration/diffing2/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/diffing2/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/discardOldFileChanges/expected/.git_keep/objects/42/786aead9ca20a3427c38e5e5262fa787ce9868 b/test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/42/786aead9ca20a3427c38e5e5262fa787ce9868 similarity index 100% rename from test/integration/discardOldFileChanges/expected/.git_keep/objects/42/786aead9ca20a3427c38e5e5262fa787ce9868 rename to test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/42/786aead9ca20a3427c38e5e5262fa787ce9868 diff --git a/test/integration/discardOldFileChanges/expected/.git_keep/objects/78/80a9728615a4d196df39600a0c8c71b40d96d6 b/test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/78/80a9728615a4d196df39600a0c8c71b40d96d6 similarity index 100% rename from test/integration/discardOldFileChanges/expected/.git_keep/objects/78/80a9728615a4d196df39600a0c8c71b40d96d6 rename to test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/78/80a9728615a4d196df39600a0c8c71b40d96d6 diff --git a/test/integration/discardOldFileChanges/expected/.git_keep/objects/7b/8a8396be4352039598acb43acaadc1c380551f b/test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/7b/8a8396be4352039598acb43acaadc1c380551f similarity index 100% rename from test/integration/discardOldFileChanges/expected/.git_keep/objects/7b/8a8396be4352039598acb43acaadc1c380551f rename to test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/7b/8a8396be4352039598acb43acaadc1c380551f diff --git a/test/integration/diffing3/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c similarity index 100% rename from test/integration/diffing3/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c rename to test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c diff --git a/test/integration/diffing3/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/diffing3/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/discardOldFileChanges/expected/.git_keep/objects/af/6725ba23f43a286deff0747476d7874113df1e b/test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/af/6725ba23f43a286deff0747476d7874113df1e similarity index 100% rename from test/integration/discardOldFileChanges/expected/.git_keep/objects/af/6725ba23f43a286deff0747476d7874113df1e rename to test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/af/6725ba23f43a286deff0747476d7874113df1e diff --git a/test/integration/discardOldFileChanges/expected/.git_keep/objects/b7/a702b642978f2a9b1af9c1c67b22127af78c92 b/test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/b7/a702b642978f2a9b1af9c1c67b22127af78c92 similarity index 100% rename from test/integration/discardOldFileChanges/expected/.git_keep/objects/b7/a702b642978f2a9b1af9c1c67b22127af78c92 rename to test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/b7/a702b642978f2a9b1af9c1c67b22127af78c92 diff --git a/test/integration/diffing3/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 similarity index 100% rename from test/integration/diffing3/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 rename to test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 diff --git a/test/integration/discardOldFileChanges/expected/.git_keep/objects/d1/4505f281a54cda96fc5fb8cd4b4ee14bae6264 b/test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/d1/4505f281a54cda96fc5fb8cd4b4ee14bae6264 similarity index 100% rename from test/integration/discardOldFileChanges/expected/.git_keep/objects/d1/4505f281a54cda96fc5fb8cd4b4ee14bae6264 rename to test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/d1/4505f281a54cda96fc5fb8cd4b4ee14bae6264 diff --git a/test/integration/discardOldFileChanges/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/discardOldFileChanges/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/discardOldFileChanges/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/discardOldFileChanges/expected/.git_keep/refs/heads/master b/test/integration/discardOldFileChanges/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/discardOldFileChanges/expected/.git_keep/refs/heads/master rename to test/integration/discardOldFileChanges/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/diffing2/expected/file0 b/test/integration/discardOldFileChanges/expected/repo/file0 similarity index 100% rename from test/integration/diffing2/expected/file0 rename to test/integration/discardOldFileChanges/expected/repo/file0 diff --git a/test/integration/diffing3/expected/file1 b/test/integration/discardOldFileChanges/expected/repo/file1 similarity index 100% rename from test/integration/diffing3/expected/file1 rename to test/integration/discardOldFileChanges/expected/repo/file1 diff --git a/test/integration/discardOldFileChanges/expected/file2 b/test/integration/discardOldFileChanges/expected/repo/file2 similarity index 100% rename from test/integration/discardOldFileChanges/expected/file2 rename to test/integration/discardOldFileChanges/expected/repo/file2 diff --git a/test/integration/discardOldFileChanges/expected/file3 b/test/integration/discardOldFileChanges/expected/repo/file3 similarity index 100% rename from test/integration/discardOldFileChanges/expected/file3 rename to test/integration/discardOldFileChanges/expected/repo/file3 diff --git a/test/integration/commitsNewBranch/expected/.git_keep/COMMIT_EDITMSG b/test/integration/discardStagedFiles/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/commitsNewBranch/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/discardStagedFiles/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/discardFileChanges/expected/.git_keep/FETCH_HEAD b/test/integration/discardStagedFiles/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/FETCH_HEAD rename to test/integration/discardStagedFiles/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/filterPath/expected/.git_keep/HEAD b/test/integration/discardStagedFiles/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/filterPath/expected/.git_keep/HEAD rename to test/integration/discardStagedFiles/expected/repo/.git_keep/HEAD diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/ORIG_HEAD b/test/integration/discardStagedFiles/expected/repo/.git_keep/ORIG_HEAD new file mode 100644 index 000000000..c3e34c41d --- /dev/null +++ b/test/integration/discardStagedFiles/expected/repo/.git_keep/ORIG_HEAD @@ -0,0 +1 @@ +02f629e46dbaa03b58196cced3df07b02c0daf22 diff --git a/test/integration/rememberCommitMessageAfterFail/expected/.git_keep/config b/test/integration/discardStagedFiles/expected/repo/.git_keep/config similarity index 100% rename from test/integration/rememberCommitMessageAfterFail/expected/.git_keep/config rename to test/integration/discardStagedFiles/expected/repo/.git_keep/config diff --git a/test/integration/discardFileChanges/expected/.git_keep/description b/test/integration/discardStagedFiles/expected/repo/.git_keep/description similarity index 100% rename from test/integration/discardFileChanges/expected/.git_keep/description rename to test/integration/discardStagedFiles/expected/repo/.git_keep/description diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/index b/test/integration/discardStagedFiles/expected/repo/.git_keep/index new file mode 100644 index 000000000..be47b0322 Binary files /dev/null and b/test/integration/discardStagedFiles/expected/repo/.git_keep/index differ diff --git a/test/integration/rememberCommitMessageAfterFail/expected/.git_keep/info/exclude b/test/integration/discardStagedFiles/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/rememberCommitMessageAfterFail/expected/.git_keep/info/exclude rename to test/integration/discardStagedFiles/expected/repo/.git_keep/info/exclude diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/logs/HEAD b/test/integration/discardStagedFiles/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..9afe44c14 --- /dev/null +++ b/test/integration/discardStagedFiles/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,5 @@ +0000000000000000000000000000000000000000 22f24c5fcc97c1ff826ecb66b60bdc01937f6052 CI 1652009263 +0200 commit (initial): file0 +22f24c5fcc97c1ff826ecb66b60bdc01937f6052 9e7ff93a5c67a0ef098e9e436961746f333edf98 CI 1652009263 +0200 commit: file1 +9e7ff93a5c67a0ef098e9e436961746f333edf98 02f629e46dbaa03b58196cced3df07b02c0daf22 CI 1652009263 +0200 commit: file2 +02f629e46dbaa03b58196cced3df07b02c0daf22 02f629e46dbaa03b58196cced3df07b02c0daf22 CI 1652009266 +0200 reset: moving to HEAD +02f629e46dbaa03b58196cced3df07b02c0daf22 02f629e46dbaa03b58196cced3df07b02c0daf22 CI 1652009266 +0200 reset: moving to HEAD diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/discardStagedFiles/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..e5e4b05c6 --- /dev/null +++ b/test/integration/discardStagedFiles/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 22f24c5fcc97c1ff826ecb66b60bdc01937f6052 CI 1652009263 +0200 commit (initial): file0 +22f24c5fcc97c1ff826ecb66b60bdc01937f6052 9e7ff93a5c67a0ef098e9e436961746f333edf98 CI 1652009263 +0200 commit: file1 +9e7ff93a5c67a0ef098e9e436961746f333edf98 02f629e46dbaa03b58196cced3df07b02c0daf22 CI 1652009263 +0200 commit: file2 diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/02/f629e46dbaa03b58196cced3df07b02c0daf22 b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/02/f629e46dbaa03b58196cced3df07b02c0daf22 new file mode 100644 index 000000000..5dd10885d Binary files /dev/null and b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/02/f629e46dbaa03b58196cced3df07b02c0daf22 differ diff --git a/test/integration/discardOldFileChanges/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/discardOldFileChanges/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/discardStagedFiles/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/diffing3/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/diffing3/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/discardStagedFiles/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/22/f24c5fcc97c1ff826ecb66b60bdc01937f6052 b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/22/f24c5fcc97c1ff826ecb66b60bdc01937f6052 new file mode 100644 index 000000000..f4e1952b1 --- /dev/null +++ b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/22/f24c5fcc97c1ff826ecb66b60bdc01937f6052 @@ -0,0 +1,3 @@ +xŤŤÁ +Â0=ç+ö.Č&ݦ.=ő3’ć )%‚źo>ÁŰ0 ĚZKŮY‘K;˛২Ş)Úqň!Y€ď1KfSv +Qg§˝ëIóBŹyyáʱă¶Öň$ëGǬÎtĺN¦Ű>iř37yŰÁćŮ2+ŕ \ No newline at end of file diff --git a/test/integration/diffing3/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/diffing3/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/discardStagedFiles/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/stash/expected/.git_keep/objects/5c/ef9afea6a37d89f925e24ebf71adecb63d1f07 b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/5c/ef9afea6a37d89f925e24ebf71adecb63d1f07 similarity index 100% rename from test/integration/stash/expected/.git_keep/objects/5c/ef9afea6a37d89f925e24ebf71adecb63d1f07 rename to test/integration/discardStagedFiles/expected/repo/.git_keep/objects/5c/ef9afea6a37d89f925e24ebf71adecb63d1f07 diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/5e/2f5743436bdc7602aa3486d5ff294940603c3d b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/5e/2f5743436bdc7602aa3486d5ff294940603c3d new file mode 100644 index 000000000..7aee98aa9 Binary files /dev/null and b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/5e/2f5743436bdc7602aa3486d5ff294940603c3d differ diff --git a/test/integration/stash/expected/.git_keep/objects/66/bbc809cdafd867cf9320bfb7484bb8fa898448 b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/66/bbc809cdafd867cf9320bfb7484bb8fa898448 similarity index 100% rename from test/integration/stash/expected/.git_keep/objects/66/bbc809cdafd867cf9320bfb7484bb8fa898448 rename to test/integration/discardStagedFiles/expected/repo/.git_keep/objects/66/bbc809cdafd867cf9320bfb7484bb8fa898448 diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/9d/b161bba78fbd20e7e4ae004be28e40d747726a b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/9d/b161bba78fbd20e7e4ae004be28e40d747726a new file mode 100644 index 000000000..c5c3d1d48 --- /dev/null +++ b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/9d/b161bba78fbd20e7e4ae004be28e40d747726a @@ -0,0 +1,2 @@ +xŤŽÁ +Â0D=ç+ö.Čv›n<ő3˛É ¦-5‚źo.Ţ˝ ĂĽáŵ”ąuăˇîŞŔ,úBNŽÇ}O(YFë¬ËÁyg­3[Řu©€”™ĽZNö2¸ÎsŚšú”q¤í‰Č„w}¬;Ü'¸Ü§›~BŮžzŠkąBÇ!zb†#¶dZۤŞţ97ó’ôë%ĽuţYAžźJć  BP \ No newline at end of file diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/9e/7ff93a5c67a0ef098e9e436961746f333edf98 b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/9e/7ff93a5c67a0ef098e9e436961746f333edf98 new file mode 100644 index 000000000..1c2077cd7 --- /dev/null +++ b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/9e/7ff93a5c67a0ef098e9e436961746f333edf98 @@ -0,0 +1,2 @@ +xŤŽA +Â0E]çŮ 2™$"BW=F2™Á‚µĄDđřćî>Ź÷ŕó¶®K·.ă©"¶A"ćĚ ąp)Ř 1657012812 +1000 commit (initial): Initial commit diff --git a/test/integration/excludeGitIgnore/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/excludeGitIgnore/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..bad114b22 --- /dev/null +++ b/test/integration/excludeGitIgnore/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 e976bc07c8784964cf239ac9fbdc3535df55269c CI 1657012812 +1000 commit (initial): Initial commit diff --git a/test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 b/test/integration/excludeGitIgnore/expected/repo/.git_keep/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 similarity index 100% rename from test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 rename to test/integration/excludeGitIgnore/expected/repo/.git_keep/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 diff --git a/test/integration/excludeGitIgnore/expected/repo/.git_keep/objects/e9/76bc07c8784964cf239ac9fbdc3535df55269c b/test/integration/excludeGitIgnore/expected/repo/.git_keep/objects/e9/76bc07c8784964cf239ac9fbdc3535df55269c new file mode 100644 index 000000000..9803ebd13 Binary files /dev/null and b/test/integration/excludeGitIgnore/expected/repo/.git_keep/objects/e9/76bc07c8784964cf239ac9fbdc3535df55269c differ diff --git a/test/integration/excludeGitIgnore/expected/repo/.git_keep/refs/heads/master b/test/integration/excludeGitIgnore/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..364cd7031 --- /dev/null +++ b/test/integration/excludeGitIgnore/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +e976bc07c8784964cf239ac9fbdc3535df55269c diff --git a/test/integration/filterPath2/expected/file1 b/test/integration/excludeGitIgnore/expected/repo/lg_ignore_file similarity index 100% rename from test/integration/filterPath2/expected/file1 rename to test/integration/excludeGitIgnore/expected/repo/lg_ignore_file diff --git a/test/integration/excludeGitIgnore/recording.json b/test/integration/excludeGitIgnore/recording.json new file mode 100644 index 000000000..9c332fe93 --- /dev/null +++ b/test/integration/excludeGitIgnore/recording.json @@ -0,0 +1 @@ +{"KeyEvents":[{"Timestamp":642,"Mod":0,"Key":256,"Ch":105},{"Timestamp":1529,"Mod":0,"Key":256,"Ch":101},{"Timestamp":2522,"Mod":0,"Key":27,"Ch":0},{"Timestamp":2962,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":238,"Height":61}]} \ No newline at end of file diff --git a/test/integration/excludeGitIgnore/setup.sh b/test/integration/excludeGitIgnore/setup.sh new file mode 100644 index 000000000..f0c6f3c8f --- /dev/null +++ b/test/integration/excludeGitIgnore/setup.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +set -e + +cd $1 + +git init + +git config user.email "CI@example.com" +git config user.name "CI" + +git commit --allow-empty -m "Initial commit" + +echo test1 > .gitignore + diff --git a/test/integration/excludeGitIgnore/test.json b/test/integration/excludeGitIgnore/test.json new file mode 100644 index 000000000..9c466ba11 --- /dev/null +++ b/test/integration/excludeGitIgnore/test.json @@ -0,0 +1,4 @@ +{ + "description": "In this test we attempt to add .gitignore to .git/info/exclude to ensure lazygit rejects the action", + "speed": 5 +} diff --git a/test/integration/excludeMenu/expected/repo/.git_keep/COMMIT_EDITMSG b/test/integration/excludeMenu/expected/repo/.git_keep/COMMIT_EDITMSG new file mode 100644 index 000000000..5852f4463 --- /dev/null +++ b/test/integration/excludeMenu/expected/repo/.git_keep/COMMIT_EDITMSG @@ -0,0 +1 @@ +Initial commit diff --git a/test/integration/filterPath/expected/.git_keep/FETCH_HEAD b/test/integration/excludeMenu/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/filterPath/expected/.git_keep/FETCH_HEAD rename to test/integration/excludeMenu/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/filterPath3/expected/.git_keep/HEAD b/test/integration/excludeMenu/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/filterPath3/expected/.git_keep/HEAD rename to test/integration/excludeMenu/expected/repo/.git_keep/HEAD diff --git a/test/integration/discardOldFileChanges/expected/.git_keep/config b/test/integration/excludeMenu/expected/repo/.git_keep/config similarity index 100% rename from test/integration/discardOldFileChanges/expected/.git_keep/config rename to test/integration/excludeMenu/expected/repo/.git_keep/config diff --git a/test/integration/filterPath/expected/.git_keep/description b/test/integration/excludeMenu/expected/repo/.git_keep/description similarity index 100% rename from test/integration/filterPath/expected/.git_keep/description rename to test/integration/excludeMenu/expected/repo/.git_keep/description diff --git a/test/integration/excludeMenu/expected/repo/.git_keep/index b/test/integration/excludeMenu/expected/repo/.git_keep/index new file mode 100644 index 000000000..65d675154 Binary files /dev/null and b/test/integration/excludeMenu/expected/repo/.git_keep/index differ diff --git a/test/integration/excludeMenu/expected/repo/.git_keep/info/exclude b/test/integration/excludeMenu/expected/repo/.git_keep/info/exclude new file mode 100644 index 000000000..f5a9a36c0 --- /dev/null +++ b/test/integration/excludeMenu/expected/repo/.git_keep/info/exclude @@ -0,0 +1,9 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ +.DS_Store + +myfile1 \ No newline at end of file diff --git a/test/integration/excludeMenu/expected/repo/.git_keep/logs/HEAD b/test/integration/excludeMenu/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..d4002669d --- /dev/null +++ b/test/integration/excludeMenu/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 129cdae0c4ccd050e8398bcb18b2ce1e4a5626f9 CI 1657012793 +1000 commit (initial): Initial commit diff --git a/test/integration/excludeMenu/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/excludeMenu/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..d4002669d --- /dev/null +++ b/test/integration/excludeMenu/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 129cdae0c4ccd050e8398bcb18b2ce1e4a5626f9 CI 1657012793 +1000 commit (initial): Initial commit diff --git a/test/integration/excludeMenu/expected/repo/.git_keep/objects/12/9cdae0c4ccd050e8398bcb18b2ce1e4a5626f9 b/test/integration/excludeMenu/expected/repo/.git_keep/objects/12/9cdae0c4ccd050e8398bcb18b2ce1e4a5626f9 new file mode 100644 index 000000000..ffa5ec652 Binary files /dev/null and b/test/integration/excludeMenu/expected/repo/.git_keep/objects/12/9cdae0c4ccd050e8398bcb18b2ce1e4a5626f9 differ diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 b/test/integration/excludeMenu/expected/repo/.git_keep/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 similarity index 100% rename from test/integration/pullRebaseConflict/expected/.git_keep/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 rename to test/integration/excludeMenu/expected/repo/.git_keep/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 diff --git a/test/integration/excludeMenu/expected/repo/.git_keep/refs/heads/master b/test/integration/excludeMenu/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..d255339cd --- /dev/null +++ b/test/integration/excludeMenu/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +129cdae0c4ccd050e8398bcb18b2ce1e4a5626f9 diff --git a/test/integration/forcePush/expected/myfile1 b/test/integration/excludeMenu/expected/repo/myfile1 similarity index 100% rename from test/integration/forcePush/expected/myfile1 rename to test/integration/excludeMenu/expected/repo/myfile1 diff --git a/test/integration/excludeMenu/recording.json b/test/integration/excludeMenu/recording.json new file mode 100644 index 000000000..d45736788 --- /dev/null +++ b/test/integration/excludeMenu/recording.json @@ -0,0 +1 @@ +{"KeyEvents":[{"Timestamp":788,"Mod":0,"Key":256,"Ch":105},{"Timestamp":2342,"Mod":0,"Key":256,"Ch":101},{"Timestamp":3429,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":238,"Height":61}]} \ No newline at end of file diff --git a/test/integration/excludeMenu/setup.sh b/test/integration/excludeMenu/setup.sh new file mode 100644 index 000000000..bd74671ea --- /dev/null +++ b/test/integration/excludeMenu/setup.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +set -e + +cd $1 + +git init + +git config user.email "CI@example.com" +git config user.name "CI" + +git commit --allow-empty -m "Initial commit" + +echo test1 > myfile1 + diff --git a/test/integration/excludeMenu/test.json b/test/integration/excludeMenu/test.json new file mode 100644 index 000000000..b2ef1f3f4 --- /dev/null +++ b/test/integration/excludeMenu/test.json @@ -0,0 +1,4 @@ +{ + "description": "In this test a file is added to .git/info/exclude using the ignore or exclude menu", + "speed": 5 +} \ No newline at end of file diff --git a/test/integration/fetchPrune/config/config.yml b/test/integration/fetchPrune/config/config.yml new file mode 100644 index 000000000..a77fb48ed --- /dev/null +++ b/test/integration/fetchPrune/config/config.yml @@ -0,0 +1,10 @@ +disableStartupPopups: true +git: + autoFetch: false +gui: + theme: + activeBorderColor: + - green + - bold + SelectedRangeBgcolor: + - reverse diff --git a/test/integration/forcePush/expected/.git_keep/HEAD b/test/integration/fetchPrune/expected/origin/HEAD similarity index 100% rename from test/integration/forcePush/expected/.git_keep/HEAD rename to test/integration/fetchPrune/expected/origin/HEAD diff --git a/test/integration/fetchPrune/expected/origin/config b/test/integration/fetchPrune/expected/origin/config new file mode 100644 index 000000000..4caf7663f --- /dev/null +++ b/test/integration/fetchPrune/expected/origin/config @@ -0,0 +1,8 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/fetchPrune/actual/./repo diff --git a/test/integration/filterPath2/expected/.git_keep/description b/test/integration/fetchPrune/expected/origin/description similarity index 100% rename from test/integration/filterPath2/expected/.git_keep/description rename to test/integration/fetchPrune/expected/origin/description diff --git a/test/integration/discardOldFileChanges/expected/.git_keep/info/exclude b/test/integration/fetchPrune/expected/origin/info/exclude similarity index 100% rename from test/integration/discardOldFileChanges/expected/.git_keep/info/exclude rename to test/integration/fetchPrune/expected/origin/info/exclude diff --git a/test/integration/forcePush/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/fetchPrune/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/forcePush/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/fetchPrune/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/fetchPrune/expected/origin/objects/75/f37fc5ae7e9967e9833b66beb2c9ee2f9f6c27 b/test/integration/fetchPrune/expected/origin/objects/75/f37fc5ae7e9967e9833b66beb2c9ee2f9f6c27 new file mode 100644 index 000000000..965fc5498 --- /dev/null +++ b/test/integration/fetchPrune/expected/origin/objects/75/f37fc5ae7e9967e9833b66beb2c9ee2f9f6c27 @@ -0,0 +1,3 @@ +xŤÍA +Â0@Q×9ĹěɤÓIˇ«cšL°Đ!R"čííÜ~üÜĚÖH|ę»*xĺ\˝đŻš +‘bâ’0ÖH …©J“w¶¦nÓüĐŹŘkÓKnvdJĂ"#ś˝wG=&]˙äÎľuÝÝ2Ž,Ď \ No newline at end of file diff --git a/test/integration/filterPath/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/fetchPrune/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/filterPath/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/fetchPrune/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/fetchPrune/expected/origin/packed-refs b/test/integration/fetchPrune/expected/origin/packed-refs new file mode 100644 index 000000000..37e4528a7 --- /dev/null +++ b/test/integration/fetchPrune/expected/origin/packed-refs @@ -0,0 +1,2 @@ +# pack-refs with: peeled fully-peeled sorted +75f37fc5ae7e9967e9833b66beb2c9ee2f9f6c27 refs/heads/master diff --git a/test/integration/fetchPrune/expected/repo/.git_keep/COMMIT_EDITMSG b/test/integration/fetchPrune/expected/repo/.git_keep/COMMIT_EDITMSG new file mode 100644 index 000000000..3829ab872 --- /dev/null +++ b/test/integration/fetchPrune/expected/repo/.git_keep/COMMIT_EDITMSG @@ -0,0 +1 @@ +myfile1 diff --git a/test/integration/fetchPrune/expected/repo/.git_keep/FETCH_HEAD b/test/integration/fetchPrune/expected/repo/.git_keep/FETCH_HEAD new file mode 100644 index 000000000..800c8511d --- /dev/null +++ b/test/integration/fetchPrune/expected/repo/.git_keep/FETCH_HEAD @@ -0,0 +1 @@ +75f37fc5ae7e9967e9833b66beb2c9ee2f9f6c27 branch 'master' of ../origin diff --git a/test/integration/forcePush/expected_remote/HEAD b/test/integration/fetchPrune/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/forcePush/expected_remote/HEAD rename to test/integration/fetchPrune/expected/repo/.git_keep/HEAD diff --git a/test/integration/fetchPrune/expected/repo/.git_keep/config b/test/integration/fetchPrune/expected/repo/.git_keep/config new file mode 100644 index 000000000..957eae48a --- /dev/null +++ b/test/integration/fetchPrune/expected/repo/.git_keep/config @@ -0,0 +1,21 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[user] + email = CI@example.com + name = CI +[fetch] + prune = true +[remote "origin"] + url = ../origin + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "master"] + remote = origin + merge = refs/heads/master +[branch "other_branch"] + remote = origin + merge = refs/heads/other_branch diff --git a/test/integration/filterPath3/expected/.git_keep/description b/test/integration/fetchPrune/expected/repo/.git_keep/description similarity index 100% rename from test/integration/filterPath3/expected/.git_keep/description rename to test/integration/fetchPrune/expected/repo/.git_keep/description diff --git a/test/integration/fetchPrune/expected/repo/.git_keep/index b/test/integration/fetchPrune/expected/repo/.git_keep/index new file mode 100644 index 000000000..6955ab197 Binary files /dev/null and b/test/integration/fetchPrune/expected/repo/.git_keep/index differ diff --git a/test/integration/filterPath/expected/.git_keep/info/exclude b/test/integration/fetchPrune/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/filterPath/expected/.git_keep/info/exclude rename to test/integration/fetchPrune/expected/repo/.git_keep/info/exclude diff --git a/test/integration/fetchPrune/expected/repo/.git_keep/logs/HEAD b/test/integration/fetchPrune/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..639cde24f --- /dev/null +++ b/test/integration/fetchPrune/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 75f37fc5ae7e9967e9833b66beb2c9ee2f9f6c27 CI 1648352761 +1100 commit (initial): myfile1 +75f37fc5ae7e9967e9833b66beb2c9ee2f9f6c27 75f37fc5ae7e9967e9833b66beb2c9ee2f9f6c27 CI 1648352761 +1100 checkout: moving from master to other_branch +75f37fc5ae7e9967e9833b66beb2c9ee2f9f6c27 75f37fc5ae7e9967e9833b66beb2c9ee2f9f6c27 CI 1648352761 +1100 checkout: moving from other_branch to master diff --git a/test/integration/fetchPrune/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/fetchPrune/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..f44229efe --- /dev/null +++ b/test/integration/fetchPrune/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 75f37fc5ae7e9967e9833b66beb2c9ee2f9f6c27 CI 1648352761 +1100 commit (initial): myfile1 diff --git a/test/integration/fetchPrune/expected/repo/.git_keep/logs/refs/heads/other_branch b/test/integration/fetchPrune/expected/repo/.git_keep/logs/refs/heads/other_branch new file mode 100644 index 000000000..01e383d7f --- /dev/null +++ b/test/integration/fetchPrune/expected/repo/.git_keep/logs/refs/heads/other_branch @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 75f37fc5ae7e9967e9833b66beb2c9ee2f9f6c27 CI 1648352761 +1100 branch: Created from HEAD diff --git a/test/integration/fetchPrune/expected/repo/.git_keep/logs/refs/remotes/origin/master b/test/integration/fetchPrune/expected/repo/.git_keep/logs/refs/remotes/origin/master new file mode 100644 index 000000000..7fe249171 --- /dev/null +++ b/test/integration/fetchPrune/expected/repo/.git_keep/logs/refs/remotes/origin/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 75f37fc5ae7e9967e9833b66beb2c9ee2f9f6c27 CI 1648352761 +1100 fetch origin: storing head diff --git a/test/integration/forcePush/expected_remote/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/fetchPrune/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/forcePush/expected_remote/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/fetchPrune/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/fetchPrune/expected/repo/.git_keep/objects/75/f37fc5ae7e9967e9833b66beb2c9ee2f9f6c27 b/test/integration/fetchPrune/expected/repo/.git_keep/objects/75/f37fc5ae7e9967e9833b66beb2c9ee2f9f6c27 new file mode 100644 index 000000000..965fc5498 --- /dev/null +++ b/test/integration/fetchPrune/expected/repo/.git_keep/objects/75/f37fc5ae7e9967e9833b66beb2c9ee2f9f6c27 @@ -0,0 +1,3 @@ +xŤÍA +Â0@Q×9ĹěɤÓIˇ«cšL°Đ!R"čííÜ~üÜĚÖH|ę»*xĺ\˝đŻš +‘bâ’0ÖH …©J“w¶¦nÓüĐŹŘkÓKnvdJĂ"#ś˝wG=&]˙äÎľuÝÝ2Ž,Ď \ No newline at end of file diff --git a/test/integration/filterPath2/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/fetchPrune/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/filterPath2/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/fetchPrune/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/tags/expected/.git_keep/packed-refs b/test/integration/fetchPrune/expected/repo/.git_keep/packed-refs similarity index 100% rename from test/integration/tags/expected/.git_keep/packed-refs rename to test/integration/fetchPrune/expected/repo/.git_keep/packed-refs diff --git a/test/integration/fetchPrune/expected/repo/.git_keep/refs/heads/master b/test/integration/fetchPrune/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..817ade7eb --- /dev/null +++ b/test/integration/fetchPrune/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +75f37fc5ae7e9967e9833b66beb2c9ee2f9f6c27 diff --git a/test/integration/fetchPrune/expected/repo/.git_keep/refs/heads/other_branch b/test/integration/fetchPrune/expected/repo/.git_keep/refs/heads/other_branch new file mode 100644 index 000000000..817ade7eb --- /dev/null +++ b/test/integration/fetchPrune/expected/repo/.git_keep/refs/heads/other_branch @@ -0,0 +1 @@ +75f37fc5ae7e9967e9833b66beb2c9ee2f9f6c27 diff --git a/test/integration/fetchPrune/expected/repo/.git_keep/refs/remotes/origin/master b/test/integration/fetchPrune/expected/repo/.git_keep/refs/remotes/origin/master new file mode 100644 index 000000000..817ade7eb --- /dev/null +++ b/test/integration/fetchPrune/expected/repo/.git_keep/refs/remotes/origin/master @@ -0,0 +1 @@ +75f37fc5ae7e9967e9833b66beb2c9ee2f9f6c27 diff --git a/test/integration/initialOpen/expected/myfile1 b/test/integration/fetchPrune/expected/repo/myfile1 similarity index 100% rename from test/integration/initialOpen/expected/myfile1 rename to test/integration/fetchPrune/expected/repo/myfile1 diff --git a/test/integration/fetchPrune/recording.json b/test/integration/fetchPrune/recording.json new file mode 100644 index 000000000..b24cbf0cb --- /dev/null +++ b/test/integration/fetchPrune/recording.json @@ -0,0 +1 @@ +{"KeyEvents":[{"Timestamp":608,"Mod":0,"Key":256,"Ch":102},{"Timestamp":1568,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":272,"Height":74}]} \ No newline at end of file diff --git a/test/integration/fetchPrune/setup.sh b/test/integration/fetchPrune/setup.sh new file mode 100644 index 000000000..87829a2e3 --- /dev/null +++ b/test/integration/fetchPrune/setup.sh @@ -0,0 +1,34 @@ +#!/bin/sh + +set -e + +cd $1 + +git init + +git config user.email "CI@example.com" +git config user.name "CI" + +# we're setting this to ensure that it's honoured by the fetch command +git config fetch.prune true + +echo test1 > myfile1 +git add . +git commit -am "myfile1" + +git checkout -b other_branch +git checkout master + +cd .. +git clone --bare ./repo origin + +cd repo + +git remote add origin ../origin +git fetch origin +git branch --set-upstream-to=origin/master master +git branch --set-upstream-to=origin/other_branch other_branch + +# unbenownst to our test repo we're removing the branch on the remote, so upon +# fetching with prune: true we expect git to realise the remote branch is gone +git -C ../origin branch -d other_branch diff --git a/test/integration/fetchPrune/test.json b/test/integration/fetchPrune/test.json new file mode 100644 index 000000000..3d696e153 --- /dev/null +++ b/test/integration/fetchPrune/test.json @@ -0,0 +1,4 @@ +{ + "description": "fetch from the remote with the 'prune' option set in the git config. Note this has a false positive until we find a way to show ls-remote origin in all tests when creating snapshots.", + "speed": 10 +} diff --git a/test/integration/initialOpen/expected/.git_keep/HEAD b/test/integration/fetchRemoteBranchWithNonmatchingName/expected/origin/HEAD similarity index 100% rename from test/integration/initialOpen/expected/.git_keep/HEAD rename to test/integration/fetchRemoteBranchWithNonmatchingName/expected/origin/HEAD diff --git a/test/integration/fetchRemoteBranchWithNonmatchingName/expected/origin/config b/test/integration/fetchRemoteBranchWithNonmatchingName/expected/origin/config new file mode 100644 index 000000000..ccf112f58 --- /dev/null +++ b/test/integration/fetchRemoteBranchWithNonmatchingName/expected/origin/config @@ -0,0 +1,6 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true +[remote "origin"] + url = /home/mark/Downloads/gits/lazygit/test/integration/fetchRemoteBranchWithNonmatchingName/actual/./repo diff --git a/test/integration/forcePush/expected/.git_keep/description b/test/integration/fetchRemoteBranchWithNonmatchingName/expected/origin/description similarity index 100% rename from test/integration/forcePush/expected/.git_keep/description rename to test/integration/fetchRemoteBranchWithNonmatchingName/expected/origin/description diff --git a/test/integration/switchTabFromMenu/expected/.git_keep/info/exclude b/test/integration/fetchRemoteBranchWithNonmatchingName/expected/origin/info/exclude similarity index 100% rename from test/integration/switchTabFromMenu/expected/.git_keep/info/exclude rename to test/integration/fetchRemoteBranchWithNonmatchingName/expected/origin/info/exclude diff --git a/test/integration/initialOpen/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/fetchRemoteBranchWithNonmatchingName/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/initialOpen/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/fetchRemoteBranchWithNonmatchingName/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/fetchRemoteBranchWithNonmatchingName/expected/origin/objects/12/d38e54cd419303587ba4613fb1194ec5c9d04f b/test/integration/fetchRemoteBranchWithNonmatchingName/expected/origin/objects/12/d38e54cd419303587ba4613fb1194ec5c9d04f new file mode 100644 index 000000000..f43085f4d Binary files /dev/null and b/test/integration/fetchRemoteBranchWithNonmatchingName/expected/origin/objects/12/d38e54cd419303587ba4613fb1194ec5c9d04f differ diff --git a/test/integration/filterPath/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/fetchRemoteBranchWithNonmatchingName/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/filterPath/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/fetchRemoteBranchWithNonmatchingName/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/forcePush/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/fetchRemoteBranchWithNonmatchingName/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/forcePush/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/fetchRemoteBranchWithNonmatchingName/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/pull/expected/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 b/test/integration/fetchRemoteBranchWithNonmatchingName/expected/origin/objects/2f/6174050380438f14b16658a356e762435ca591 similarity index 100% rename from test/integration/pull/expected/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 rename to test/integration/fetchRemoteBranchWithNonmatchingName/expected/origin/objects/2f/6174050380438f14b16658a356e762435ca591 diff --git a/test/integration/fetchRemoteBranchWithNonmatchingName/expected/origin/objects/3e/5a250f3b6d2ea4ea93b3006aaceeb75bb8d0b6 b/test/integration/fetchRemoteBranchWithNonmatchingName/expected/origin/objects/3e/5a250f3b6d2ea4ea93b3006aaceeb75bb8d0b6 new file mode 100644 index 000000000..0b97b6ff4 --- /dev/null +++ b/test/integration/fetchRemoteBranchWithNonmatchingName/expected/origin/objects/3e/5a250f3b6d2ea4ea93b3006aaceeb75bb8d0b6 @@ -0,0 +1,3 @@ +xŤÍA +Â0@Q×9Ĺ왉ÓI +"BW=FšL°Đ!R"čííÜ~üÜĚÖÄrę»* J®d ŁĆ¬ĄDň‰jŕ…ŻE¸¦ 1654108479 +0200 commit (initial): myfile1 +3e5a250f3b6d2ea4ea93b3006aaceeb75bb8d0b6 12d38e54cd419303587ba4613fb1194ec5c9d04f CI 1654108479 +0200 commit: myfile2 +12d38e54cd419303587ba4613fb1194ec5c9d04f 72ee6cc86de71389b9c70e24c7d8c8837e7d3566 CI 1654108479 +0200 commit: myfile3 +72ee6cc86de71389b9c70e24c7d8c8837e7d3566 b090d7f0029e74de260f7458721b8edd1e618edc CI 1654108479 +0200 commit: myfile4 +b090d7f0029e74de260f7458721b8edd1e618edc 12d38e54cd419303587ba4613fb1194ec5c9d04f CI 1654108479 +0200 reset: moving to HEAD~2 +12d38e54cd419303587ba4613fb1194ec5c9d04f 0000000000000000000000000000000000000000 CI 1654108482 +0200 Branch: renamed refs/heads/master to refs/heads/master-local +0000000000000000000000000000000000000000 12d38e54cd419303587ba4613fb1194ec5c9d04f CI 1654108482 +0200 Branch: renamed refs/heads/master to refs/heads/master-local +12d38e54cd419303587ba4613fb1194ec5c9d04f b090d7f0029e74de260f7458721b8edd1e618edc CI 1654108482 +0200 pull --no-edit --ff-only origin master: Fast-forward diff --git a/test/integration/fetchRemoteBranchWithNonmatchingName/expected/repo/.git_keep/logs/refs/heads/master-local b/test/integration/fetchRemoteBranchWithNonmatchingName/expected/repo/.git_keep/logs/refs/heads/master-local new file mode 100644 index 000000000..b930bd5b6 --- /dev/null +++ b/test/integration/fetchRemoteBranchWithNonmatchingName/expected/repo/.git_keep/logs/refs/heads/master-local @@ -0,0 +1,7 @@ +0000000000000000000000000000000000000000 3e5a250f3b6d2ea4ea93b3006aaceeb75bb8d0b6 CI 1654108479 +0200 commit (initial): myfile1 +3e5a250f3b6d2ea4ea93b3006aaceeb75bb8d0b6 12d38e54cd419303587ba4613fb1194ec5c9d04f CI 1654108479 +0200 commit: myfile2 +12d38e54cd419303587ba4613fb1194ec5c9d04f 72ee6cc86de71389b9c70e24c7d8c8837e7d3566 CI 1654108479 +0200 commit: myfile3 +72ee6cc86de71389b9c70e24c7d8c8837e7d3566 b090d7f0029e74de260f7458721b8edd1e618edc CI 1654108479 +0200 commit: myfile4 +b090d7f0029e74de260f7458721b8edd1e618edc 12d38e54cd419303587ba4613fb1194ec5c9d04f CI 1654108479 +0200 reset: moving to HEAD~2 +12d38e54cd419303587ba4613fb1194ec5c9d04f 12d38e54cd419303587ba4613fb1194ec5c9d04f CI 1654108482 +0200 Branch: renamed refs/heads/master to refs/heads/master-local +12d38e54cd419303587ba4613fb1194ec5c9d04f b090d7f0029e74de260f7458721b8edd1e618edc CI 1654108482 +0200 pull --no-edit --ff-only origin master: Fast-forward diff --git a/test/integration/fetchRemoteBranchWithNonmatchingName/expected/repo/.git_keep/logs/refs/remotes/origin/master b/test/integration/fetchRemoteBranchWithNonmatchingName/expected/repo/.git_keep/logs/refs/remotes/origin/master new file mode 100644 index 000000000..3cb40d7d3 --- /dev/null +++ b/test/integration/fetchRemoteBranchWithNonmatchingName/expected/repo/.git_keep/logs/refs/remotes/origin/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 b090d7f0029e74de260f7458721b8edd1e618edc CI 1654108479 +0200 fetch origin: storing head diff --git a/test/integration/patchBuilding/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/fetchRemoteBranchWithNonmatchingName/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/patchBuilding/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/fetchRemoteBranchWithNonmatchingName/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/fetchRemoteBranchWithNonmatchingName/expected/repo/.git_keep/objects/12/d38e54cd419303587ba4613fb1194ec5c9d04f b/test/integration/fetchRemoteBranchWithNonmatchingName/expected/repo/.git_keep/objects/12/d38e54cd419303587ba4613fb1194ec5c9d04f new file mode 100644 index 000000000..f43085f4d Binary files /dev/null and b/test/integration/fetchRemoteBranchWithNonmatchingName/expected/repo/.git_keep/objects/12/d38e54cd419303587ba4613fb1194ec5c9d04f differ diff --git a/test/integration/filterPath2/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/fetchRemoteBranchWithNonmatchingName/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/filterPath2/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/fetchRemoteBranchWithNonmatchingName/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/forcePush/expected_remote/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/fetchRemoteBranchWithNonmatchingName/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/forcePush/expected_remote/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/fetchRemoteBranchWithNonmatchingName/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/pull/expected_remote/objects/2f/6174050380438f14b16658a356e762435ca591 b/test/integration/fetchRemoteBranchWithNonmatchingName/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 similarity index 100% rename from test/integration/pull/expected_remote/objects/2f/6174050380438f14b16658a356e762435ca591 rename to test/integration/fetchRemoteBranchWithNonmatchingName/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 diff --git a/test/integration/fetchRemoteBranchWithNonmatchingName/expected/repo/.git_keep/objects/3e/5a250f3b6d2ea4ea93b3006aaceeb75bb8d0b6 b/test/integration/fetchRemoteBranchWithNonmatchingName/expected/repo/.git_keep/objects/3e/5a250f3b6d2ea4ea93b3006aaceeb75bb8d0b6 new file mode 100644 index 000000000..0b97b6ff4 --- /dev/null +++ b/test/integration/fetchRemoteBranchWithNonmatchingName/expected/repo/.git_keep/objects/3e/5a250f3b6d2ea4ea93b3006aaceeb75bb8d0b6 @@ -0,0 +1,3 @@ +xŤÍA +Â0@Q×9Ĺ왉ÓI +"BW=FšL°Đ!R"čííÜ~üÜĚÖÄrę»* J®d ŁĆ¬ĄDň‰jŕ…ŻE¸¦ myfile1 +git add . +git commit -am "myfile1" +echo test2 > myfile2 +git add . +git commit -am "myfile2" +echo test3 > myfile3 +git add . +git commit -am "myfile3" +echo test4 > myfile4 +git add . +git commit -am "myfile4" + +cd .. +git clone --bare ./repo origin + +cd repo + +git reset --hard HEAD~2 +git remote add origin ../origin +git fetch origin +git branch --set-upstream-to=origin/master + diff --git a/test/integration/fetchRemoteBranchWithNonmatchingName/test.json b/test/integration/fetchRemoteBranchWithNonmatchingName/test.json new file mode 100644 index 000000000..dffe129cd --- /dev/null +++ b/test/integration/fetchRemoteBranchWithNonmatchingName/test.json @@ -0,0 +1 @@ +{ "description": "allow unsetting the upstream of the current branch", "speed": 10 } diff --git a/test/integration/filterPath/expected/.git_keep/COMMIT_EDITMSG b/test/integration/filterPath/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/filterPath/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/filterPath/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/filterPath2/expected/.git_keep/FETCH_HEAD b/test/integration/filterPath/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/filterPath2/expected/.git_keep/FETCH_HEAD rename to test/integration/filterPath/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/patchBuilding/expected/.git_keep/HEAD b/test/integration/filterPath/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/patchBuilding/expected/.git_keep/HEAD rename to test/integration/filterPath/expected/repo/.git_keep/HEAD diff --git a/test/integration/filterPath/expected/.git_keep/config b/test/integration/filterPath/expected/repo/.git_keep/config similarity index 100% rename from test/integration/filterPath/expected/.git_keep/config rename to test/integration/filterPath/expected/repo/.git_keep/config diff --git a/test/integration/initialOpen/expected/.git_keep/description b/test/integration/filterPath/expected/repo/.git_keep/description similarity index 100% rename from test/integration/initialOpen/expected/.git_keep/description rename to test/integration/filterPath/expected/repo/.git_keep/description diff --git a/test/integration/filterPath/expected/.git_keep/index b/test/integration/filterPath/expected/repo/.git_keep/index similarity index 100% rename from test/integration/filterPath/expected/.git_keep/index rename to test/integration/filterPath/expected/repo/.git_keep/index diff --git a/test/integration/filterPath2/expected/.git_keep/info/exclude b/test/integration/filterPath/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/filterPath2/expected/.git_keep/info/exclude rename to test/integration/filterPath/expected/repo/.git_keep/info/exclude diff --git a/test/integration/filterPath/expected/.git_keep/logs/HEAD b/test/integration/filterPath/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/filterPath/expected/.git_keep/logs/HEAD rename to test/integration/filterPath/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/filterPath/expected/.git_keep/logs/refs/heads/master b/test/integration/filterPath/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/filterPath/expected/.git_keep/logs/refs/heads/master rename to test/integration/filterPath/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/filterPath3/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/filterPath/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/filterPath3/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/filterPath/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/discardOldFileChanges/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/filterPath/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/discardOldFileChanges/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/filterPath/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/filterPath/expected/.git_keep/objects/22/adc4567aba3d1a0acf28b4cef312922d516aeb b/test/integration/filterPath/expected/repo/.git_keep/objects/22/adc4567aba3d1a0acf28b4cef312922d516aeb similarity index 100% rename from test/integration/filterPath/expected/.git_keep/objects/22/adc4567aba3d1a0acf28b4cef312922d516aeb rename to test/integration/filterPath/expected/repo/.git_keep/objects/22/adc4567aba3d1a0acf28b4cef312922d516aeb diff --git a/test/integration/filterPath/expected/.git_keep/objects/2e/a97a56215f6adbe991eaf0dcf61c7086880ea5 b/test/integration/filterPath/expected/repo/.git_keep/objects/2e/a97a56215f6adbe991eaf0dcf61c7086880ea5 similarity index 100% rename from test/integration/filterPath/expected/.git_keep/objects/2e/a97a56215f6adbe991eaf0dcf61c7086880ea5 rename to test/integration/filterPath/expected/repo/.git_keep/objects/2e/a97a56215f6adbe991eaf0dcf61c7086880ea5 diff --git a/test/integration/discardOldFileChanges/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/filterPath/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/discardOldFileChanges/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/filterPath/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/filterPath/expected/.git_keep/objects/4b/9d1f9f9fc76b123a5c90cd8396390cac41a3e3 b/test/integration/filterPath/expected/repo/.git_keep/objects/4b/9d1f9f9fc76b123a5c90cd8396390cac41a3e3 similarity index 100% rename from test/integration/filterPath/expected/.git_keep/objects/4b/9d1f9f9fc76b123a5c90cd8396390cac41a3e3 rename to test/integration/filterPath/expected/repo/.git_keep/objects/4b/9d1f9f9fc76b123a5c90cd8396390cac41a3e3 diff --git a/test/integration/filterPath/expected/.git_keep/objects/77/9de836a10ac879fa919f48d5dc4f4ce11528e2 b/test/integration/filterPath/expected/repo/.git_keep/objects/77/9de836a10ac879fa919f48d5dc4f4ce11528e2 similarity index 100% rename from test/integration/filterPath/expected/.git_keep/objects/77/9de836a10ac879fa919f48d5dc4f4ce11528e2 rename to test/integration/filterPath/expected/repo/.git_keep/objects/77/9de836a10ac879fa919f48d5dc4f4ce11528e2 diff --git a/test/integration/filterPath/expected/.git_keep/objects/84/b823dc5fc92fcf08eb8c8545716232ce49bd45 b/test/integration/filterPath/expected/repo/.git_keep/objects/84/b823dc5fc92fcf08eb8c8545716232ce49bd45 similarity index 100% rename from test/integration/filterPath/expected/.git_keep/objects/84/b823dc5fc92fcf08eb8c8545716232ce49bd45 rename to test/integration/filterPath/expected/repo/.git_keep/objects/84/b823dc5fc92fcf08eb8c8545716232ce49bd45 diff --git a/test/integration/filterPath/expected/.git_keep/objects/8b/476a1094290d7251c56305e199eb2a203d8682 b/test/integration/filterPath/expected/repo/.git_keep/objects/8b/476a1094290d7251c56305e199eb2a203d8682 similarity index 100% rename from test/integration/filterPath/expected/.git_keep/objects/8b/476a1094290d7251c56305e199eb2a203d8682 rename to test/integration/filterPath/expected/repo/.git_keep/objects/8b/476a1094290d7251c56305e199eb2a203d8682 diff --git a/test/integration/filterPath/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/filterPath/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c similarity index 100% rename from test/integration/filterPath/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c rename to test/integration/filterPath/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c diff --git a/test/integration/forcePush/expected_remote/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/filterPath/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/forcePush/expected_remote/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/filterPath/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/filterPath/expected/.git_keep/objects/af/3ef564e968dbe92fb4e08a67dd5f835f43d4e8 b/test/integration/filterPath/expected/repo/.git_keep/objects/af/3ef564e968dbe92fb4e08a67dd5f835f43d4e8 similarity index 100% rename from test/integration/filterPath/expected/.git_keep/objects/af/3ef564e968dbe92fb4e08a67dd5f835f43d4e8 rename to test/integration/filterPath/expected/repo/.git_keep/objects/af/3ef564e968dbe92fb4e08a67dd5f835f43d4e8 diff --git a/test/integration/filterPath/expected/.git_keep/objects/b7/c728d5b4e9dfc210ec19f0549f25c94b766e4e b/test/integration/filterPath/expected/repo/.git_keep/objects/b7/c728d5b4e9dfc210ec19f0549f25c94b766e4e similarity index 100% rename from test/integration/filterPath/expected/.git_keep/objects/b7/c728d5b4e9dfc210ec19f0549f25c94b766e4e rename to test/integration/filterPath/expected/repo/.git_keep/objects/b7/c728d5b4e9dfc210ec19f0549f25c94b766e4e diff --git a/test/integration/filterPath/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/filterPath/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 similarity index 100% rename from test/integration/filterPath/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 rename to test/integration/filterPath/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 diff --git a/test/integration/filterPath3/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/filterPath/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/filterPath3/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/filterPath/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/filterPath/expected/.git_keep/objects/d7/236d5f85ad303f5f23141661e4c8959610b70b b/test/integration/filterPath/expected/repo/.git_keep/objects/d7/236d5f85ad303f5f23141661e4c8959610b70b similarity index 100% rename from test/integration/filterPath/expected/.git_keep/objects/d7/236d5f85ad303f5f23141661e4c8959610b70b rename to test/integration/filterPath/expected/repo/.git_keep/objects/d7/236d5f85ad303f5f23141661e4c8959610b70b diff --git a/test/integration/filterPath3/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/filterPath/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/filterPath3/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/filterPath/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/filterPath/expected/.git_keep/objects/f2/4812da035a21812bc4c73018349ac2f0a6ec39 b/test/integration/filterPath/expected/repo/.git_keep/objects/f2/4812da035a21812bc4c73018349ac2f0a6ec39 similarity index 100% rename from test/integration/filterPath/expected/.git_keep/objects/f2/4812da035a21812bc4c73018349ac2f0a6ec39 rename to test/integration/filterPath/expected/repo/.git_keep/objects/f2/4812da035a21812bc4c73018349ac2f0a6ec39 diff --git a/test/integration/filterPath/expected/.git_keep/objects/f3/d94fa1d4be39b8daae35b82525bf357aa712de b/test/integration/filterPath/expected/repo/.git_keep/objects/f3/d94fa1d4be39b8daae35b82525bf357aa712de similarity index 100% rename from test/integration/filterPath/expected/.git_keep/objects/f3/d94fa1d4be39b8daae35b82525bf357aa712de rename to test/integration/filterPath/expected/repo/.git_keep/objects/f3/d94fa1d4be39b8daae35b82525bf357aa712de diff --git a/test/integration/filterPath/expected/.git_keep/refs/heads/master b/test/integration/filterPath/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/filterPath/expected/.git_keep/refs/heads/master rename to test/integration/filterPath/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/filterPath/expected/file b/test/integration/filterPath/expected/repo/file similarity index 100% rename from test/integration/filterPath/expected/file rename to test/integration/filterPath/expected/repo/file diff --git a/test/integration/discardOldFileChanges/expected/file0 b/test/integration/filterPath/expected/repo/file0 similarity index 100% rename from test/integration/discardOldFileChanges/expected/file0 rename to test/integration/filterPath/expected/repo/file0 diff --git a/test/integration/filterPath/expected/file2 b/test/integration/filterPath/expected/repo/file2 similarity index 100% rename from test/integration/filterPath/expected/file2 rename to test/integration/filterPath/expected/repo/file2 diff --git a/test/integration/filterPath2/expected/.git_keep/COMMIT_EDITMSG b/test/integration/filterPath2/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/filterPath2/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/filterPath2/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/filterPath3/expected/.git_keep/FETCH_HEAD b/test/integration/filterPath2/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/filterPath3/expected/.git_keep/FETCH_HEAD rename to test/integration/filterPath2/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/patchBuilding2/expected/.git_keep/HEAD b/test/integration/filterPath2/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/patchBuilding2/expected/.git_keep/HEAD rename to test/integration/filterPath2/expected/repo/.git_keep/HEAD diff --git a/test/integration/filterPath2/expected/.git_keep/config b/test/integration/filterPath2/expected/repo/.git_keep/config similarity index 100% rename from test/integration/filterPath2/expected/.git_keep/config rename to test/integration/filterPath2/expected/repo/.git_keep/config diff --git a/test/integration/mergeConflictRevert/expected/.git_keep/description b/test/integration/filterPath2/expected/repo/.git_keep/description similarity index 100% rename from test/integration/mergeConflictRevert/expected/.git_keep/description rename to test/integration/filterPath2/expected/repo/.git_keep/description diff --git a/test/integration/filterPath2/expected/.git_keep/index b/test/integration/filterPath2/expected/repo/.git_keep/index similarity index 100% rename from test/integration/filterPath2/expected/.git_keep/index rename to test/integration/filterPath2/expected/repo/.git_keep/index diff --git a/test/integration/filterPath3/expected/.git_keep/info/exclude b/test/integration/filterPath2/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/filterPath3/expected/.git_keep/info/exclude rename to test/integration/filterPath2/expected/repo/.git_keep/info/exclude diff --git a/test/integration/filterPath2/expected/.git_keep/logs/HEAD b/test/integration/filterPath2/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/filterPath2/expected/.git_keep/logs/HEAD rename to test/integration/filterPath2/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/filterPath2/expected/.git_keep/logs/refs/heads/master b/test/integration/filterPath2/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/filterPath2/expected/.git_keep/logs/refs/heads/master rename to test/integration/filterPath2/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/forcePush/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/filterPath2/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/forcePush/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/filterPath2/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/filterPath/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/filterPath2/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/filterPath/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/filterPath2/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/filterPath/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/filterPath2/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/filterPath/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/filterPath2/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/filterPath2/expected/.git_keep/objects/6c/dce80c062ba2c8f8758879834a936b84ead78c b/test/integration/filterPath2/expected/repo/.git_keep/objects/6c/dce80c062ba2c8f8758879834a936b84ead78c similarity index 100% rename from test/integration/filterPath2/expected/.git_keep/objects/6c/dce80c062ba2c8f8758879834a936b84ead78c rename to test/integration/filterPath2/expected/repo/.git_keep/objects/6c/dce80c062ba2c8f8758879834a936b84ead78c diff --git a/test/integration/filterPath2/expected/.git_keep/objects/70/3f7069185227287623aaba7cdb0e56ae7a6c60 b/test/integration/filterPath2/expected/repo/.git_keep/objects/70/3f7069185227287623aaba7cdb0e56ae7a6c60 similarity index 100% rename from test/integration/filterPath2/expected/.git_keep/objects/70/3f7069185227287623aaba7cdb0e56ae7a6c60 rename to test/integration/filterPath2/expected/repo/.git_keep/objects/70/3f7069185227287623aaba7cdb0e56ae7a6c60 diff --git a/test/integration/filterPath2/expected/.git_keep/objects/77/9de836a10ac879fa919f48d5dc4f4ce11528e2 b/test/integration/filterPath2/expected/repo/.git_keep/objects/77/9de836a10ac879fa919f48d5dc4f4ce11528e2 similarity index 100% rename from test/integration/filterPath2/expected/.git_keep/objects/77/9de836a10ac879fa919f48d5dc4f4ce11528e2 rename to test/integration/filterPath2/expected/repo/.git_keep/objects/77/9de836a10ac879fa919f48d5dc4f4ce11528e2 diff --git a/test/integration/filterPath2/expected/.git_keep/objects/84/b823dc5fc92fcf08eb8c8545716232ce49bd45 b/test/integration/filterPath2/expected/repo/.git_keep/objects/84/b823dc5fc92fcf08eb8c8545716232ce49bd45 similarity index 100% rename from test/integration/filterPath2/expected/.git_keep/objects/84/b823dc5fc92fcf08eb8c8545716232ce49bd45 rename to test/integration/filterPath2/expected/repo/.git_keep/objects/84/b823dc5fc92fcf08eb8c8545716232ce49bd45 diff --git a/test/integration/filterPath2/expected/.git_keep/objects/92/ec47058a2894afbbbd69c5f79bff20c503e686 b/test/integration/filterPath2/expected/repo/.git_keep/objects/92/ec47058a2894afbbbd69c5f79bff20c503e686 similarity index 100% rename from test/integration/filterPath2/expected/.git_keep/objects/92/ec47058a2894afbbbd69c5f79bff20c503e686 rename to test/integration/filterPath2/expected/repo/.git_keep/objects/92/ec47058a2894afbbbd69c5f79bff20c503e686 diff --git a/test/integration/filterPath2/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/filterPath2/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c similarity index 100% rename from test/integration/filterPath2/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c rename to test/integration/filterPath2/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c diff --git a/test/integration/initialOpen/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/filterPath2/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/initialOpen/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/filterPath2/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/filterPath2/expected/.git_keep/objects/a5/c053a7a46bce2775edb371a9aa97424b542ab7 b/test/integration/filterPath2/expected/repo/.git_keep/objects/a5/c053a7a46bce2775edb371a9aa97424b542ab7 similarity index 100% rename from test/integration/filterPath2/expected/.git_keep/objects/a5/c053a7a46bce2775edb371a9aa97424b542ab7 rename to test/integration/filterPath2/expected/repo/.git_keep/objects/a5/c053a7a46bce2775edb371a9aa97424b542ab7 diff --git a/test/integration/filterPath2/expected/.git_keep/objects/c5/f9a8793f15aa0db816944424adb4303eb036a8 b/test/integration/filterPath2/expected/repo/.git_keep/objects/c5/f9a8793f15aa0db816944424adb4303eb036a8 similarity index 100% rename from test/integration/filterPath2/expected/.git_keep/objects/c5/f9a8793f15aa0db816944424adb4303eb036a8 rename to test/integration/filterPath2/expected/repo/.git_keep/objects/c5/f9a8793f15aa0db816944424adb4303eb036a8 diff --git a/test/integration/filterPath2/expected/.git_keep/objects/c8/68546458601b9c71b76b893f9020ecf7405528 b/test/integration/filterPath2/expected/repo/.git_keep/objects/c8/68546458601b9c71b76b893f9020ecf7405528 similarity index 100% rename from test/integration/filterPath2/expected/.git_keep/objects/c8/68546458601b9c71b76b893f9020ecf7405528 rename to test/integration/filterPath2/expected/repo/.git_keep/objects/c8/68546458601b9c71b76b893f9020ecf7405528 diff --git a/test/integration/filterPath2/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/filterPath2/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 similarity index 100% rename from test/integration/filterPath2/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 rename to test/integration/filterPath2/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 diff --git a/test/integration/forcePush/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/filterPath2/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/forcePush/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/filterPath2/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/forcePush/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/filterPath2/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/forcePush/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/filterPath2/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/filterPath2/expected/.git_keep/objects/e7/c2bd00356720683d5bc4362ef5b92655fa8914 b/test/integration/filterPath2/expected/repo/.git_keep/objects/e7/c2bd00356720683d5bc4362ef5b92655fa8914 similarity index 100% rename from test/integration/filterPath2/expected/.git_keep/objects/e7/c2bd00356720683d5bc4362ef5b92655fa8914 rename to test/integration/filterPath2/expected/repo/.git_keep/objects/e7/c2bd00356720683d5bc4362ef5b92655fa8914 diff --git a/test/integration/filterPath2/expected/.git_keep/refs/heads/master b/test/integration/filterPath2/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/filterPath2/expected/.git_keep/refs/heads/master rename to test/integration/filterPath2/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/filterPath2/expected/file b/test/integration/filterPath2/expected/repo/file similarity index 100% rename from test/integration/filterPath2/expected/file rename to test/integration/filterPath2/expected/repo/file diff --git a/test/integration/filterPath/expected/file0 b/test/integration/filterPath2/expected/repo/file0 similarity index 100% rename from test/integration/filterPath/expected/file0 rename to test/integration/filterPath2/expected/repo/file0 diff --git a/test/integration/filterPath3/expected/file1 b/test/integration/filterPath2/expected/repo/file1 similarity index 100% rename from test/integration/filterPath3/expected/file1 rename to test/integration/filterPath2/expected/repo/file1 diff --git a/test/integration/filterPath2/expected/file2 b/test/integration/filterPath2/expected/repo/file2 similarity index 100% rename from test/integration/filterPath2/expected/file2 rename to test/integration/filterPath2/expected/repo/file2 diff --git a/test/integration/filterPath3/expected/.git_keep/COMMIT_EDITMSG b/test/integration/filterPath3/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/filterPath3/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/filterPath3/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/initialOpen/expected/.git_keep/FETCH_HEAD b/test/integration/filterPath3/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/initialOpen/expected/.git_keep/FETCH_HEAD rename to test/integration/filterPath3/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/patchBuildingWithFiletree/expected/.git_keep/HEAD b/test/integration/filterPath3/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/patchBuildingWithFiletree/expected/.git_keep/HEAD rename to test/integration/filterPath3/expected/repo/.git_keep/HEAD diff --git a/test/integration/filterPath3/expected/.git_keep/config b/test/integration/filterPath3/expected/repo/.git_keep/config similarity index 100% rename from test/integration/filterPath3/expected/.git_keep/config rename to test/integration/filterPath3/expected/repo/.git_keep/config diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/description b/test/integration/filterPath3/expected/repo/.git_keep/description similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/description rename to test/integration/filterPath3/expected/repo/.git_keep/description diff --git a/test/integration/filterPath3/expected/.git_keep/index b/test/integration/filterPath3/expected/repo/.git_keep/index similarity index 100% rename from test/integration/filterPath3/expected/.git_keep/index rename to test/integration/filterPath3/expected/repo/.git_keep/index diff --git a/test/integration/forcePush/expected/.git_keep/info/exclude b/test/integration/filterPath3/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/forcePush/expected/.git_keep/info/exclude rename to test/integration/filterPath3/expected/repo/.git_keep/info/exclude diff --git a/test/integration/filterPath3/expected/.git_keep/logs/HEAD b/test/integration/filterPath3/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/filterPath3/expected/.git_keep/logs/HEAD rename to test/integration/filterPath3/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/filterPath3/expected/.git_keep/logs/refs/heads/master b/test/integration/filterPath3/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/filterPath3/expected/.git_keep/logs/refs/heads/master rename to test/integration/filterPath3/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/forcePush/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/filterPath3/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/forcePush/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/filterPath3/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/filterPath2/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/filterPath3/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/filterPath2/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/filterPath3/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/filterPath3/expected/.git_keep/objects/23/1410172e8f51138f06d8dff963898fb1e97b30 b/test/integration/filterPath3/expected/repo/.git_keep/objects/23/1410172e8f51138f06d8dff963898fb1e97b30 similarity index 100% rename from test/integration/filterPath3/expected/.git_keep/objects/23/1410172e8f51138f06d8dff963898fb1e97b30 rename to test/integration/filterPath3/expected/repo/.git_keep/objects/23/1410172e8f51138f06d8dff963898fb1e97b30 diff --git a/test/integration/filterPath2/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/filterPath3/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/filterPath2/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/filterPath3/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/filterPath3/expected/.git_keep/objects/72/226d27a85fff688d32c134a22ebe650d6c2e41 b/test/integration/filterPath3/expected/repo/.git_keep/objects/72/226d27a85fff688d32c134a22ebe650d6c2e41 similarity index 100% rename from test/integration/filterPath3/expected/.git_keep/objects/72/226d27a85fff688d32c134a22ebe650d6c2e41 rename to test/integration/filterPath3/expected/repo/.git_keep/objects/72/226d27a85fff688d32c134a22ebe650d6c2e41 diff --git a/test/integration/filterPath3/expected/.git_keep/objects/77/9de836a10ac879fa919f48d5dc4f4ce11528e2 b/test/integration/filterPath3/expected/repo/.git_keep/objects/77/9de836a10ac879fa919f48d5dc4f4ce11528e2 similarity index 100% rename from test/integration/filterPath3/expected/.git_keep/objects/77/9de836a10ac879fa919f48d5dc4f4ce11528e2 rename to test/integration/filterPath3/expected/repo/.git_keep/objects/77/9de836a10ac879fa919f48d5dc4f4ce11528e2 diff --git a/test/integration/filterPath3/expected/.git_keep/objects/84/b823dc5fc92fcf08eb8c8545716232ce49bd45 b/test/integration/filterPath3/expected/repo/.git_keep/objects/84/b823dc5fc92fcf08eb8c8545716232ce49bd45 similarity index 100% rename from test/integration/filterPath3/expected/.git_keep/objects/84/b823dc5fc92fcf08eb8c8545716232ce49bd45 rename to test/integration/filterPath3/expected/repo/.git_keep/objects/84/b823dc5fc92fcf08eb8c8545716232ce49bd45 diff --git a/test/integration/filterPath3/expected/.git_keep/objects/8e/d4f7b4eae8cc97d9add459348cc95e936b8f25 b/test/integration/filterPath3/expected/repo/.git_keep/objects/8e/d4f7b4eae8cc97d9add459348cc95e936b8f25 similarity index 100% rename from test/integration/filterPath3/expected/.git_keep/objects/8e/d4f7b4eae8cc97d9add459348cc95e936b8f25 rename to test/integration/filterPath3/expected/repo/.git_keep/objects/8e/d4f7b4eae8cc97d9add459348cc95e936b8f25 diff --git a/test/integration/filterPath3/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/filterPath3/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c similarity index 100% rename from test/integration/filterPath3/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c rename to test/integration/filterPath3/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/filterPath3/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/filterPath3/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/filterPath3/expected/.git_keep/objects/b3/5d7fa77c939890020952987eeb461f410297d8 b/test/integration/filterPath3/expected/repo/.git_keep/objects/b3/5d7fa77c939890020952987eeb461f410297d8 similarity index 100% rename from test/integration/filterPath3/expected/.git_keep/objects/b3/5d7fa77c939890020952987eeb461f410297d8 rename to test/integration/filterPath3/expected/repo/.git_keep/objects/b3/5d7fa77c939890020952987eeb461f410297d8 diff --git a/test/integration/filterPath3/expected/.git_keep/objects/c1/a1ba9d2873d7163606bb5fdf46e50975db042b b/test/integration/filterPath3/expected/repo/.git_keep/objects/c1/a1ba9d2873d7163606bb5fdf46e50975db042b similarity index 100% rename from test/integration/filterPath3/expected/.git_keep/objects/c1/a1ba9d2873d7163606bb5fdf46e50975db042b rename to test/integration/filterPath3/expected/repo/.git_keep/objects/c1/a1ba9d2873d7163606bb5fdf46e50975db042b diff --git a/test/integration/filterPath3/expected/.git_keep/objects/c8/68546458601b9c71b76b893f9020ecf7405528 b/test/integration/filterPath3/expected/repo/.git_keep/objects/c8/68546458601b9c71b76b893f9020ecf7405528 similarity index 100% rename from test/integration/filterPath3/expected/.git_keep/objects/c8/68546458601b9c71b76b893f9020ecf7405528 rename to test/integration/filterPath3/expected/repo/.git_keep/objects/c8/68546458601b9c71b76b893f9020ecf7405528 diff --git a/test/integration/filterPath3/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/filterPath3/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 similarity index 100% rename from test/integration/filterPath3/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 rename to test/integration/filterPath3/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 diff --git a/test/integration/forcePush/expected_remote/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/filterPath3/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/forcePush/expected_remote/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/filterPath3/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/filterPath3/expected/.git_keep/objects/db/6681a3e9fb9fb6ef524771cdc763904dd2b54d b/test/integration/filterPath3/expected/repo/.git_keep/objects/db/6681a3e9fb9fb6ef524771cdc763904dd2b54d similarity index 100% rename from test/integration/filterPath3/expected/.git_keep/objects/db/6681a3e9fb9fb6ef524771cdc763904dd2b54d rename to test/integration/filterPath3/expected/repo/.git_keep/objects/db/6681a3e9fb9fb6ef524771cdc763904dd2b54d diff --git a/test/integration/forcePush/expected_remote/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/filterPath3/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/forcePush/expected_remote/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/filterPath3/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/filterPath3/expected/.git_keep/refs/heads/master b/test/integration/filterPath3/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/filterPath3/expected/.git_keep/refs/heads/master rename to test/integration/filterPath3/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/filterPath3/expected/file b/test/integration/filterPath3/expected/repo/file similarity index 100% rename from test/integration/filterPath3/expected/file rename to test/integration/filterPath3/expected/repo/file diff --git a/test/integration/filterPath2/expected/file0 b/test/integration/filterPath3/expected/repo/file0 similarity index 100% rename from test/integration/filterPath2/expected/file0 rename to test/integration/filterPath3/expected/repo/file0 diff --git a/test/integration/rebase/expected/file1 b/test/integration/filterPath3/expected/repo/file1 similarity index 100% rename from test/integration/rebase/expected/file1 rename to test/integration/filterPath3/expected/repo/file1 diff --git a/test/integration/filterPath3/expected/file2 b/test/integration/filterPath3/expected/repo/file2 similarity index 100% rename from test/integration/filterPath3/expected/file2 rename to test/integration/filterPath3/expected/repo/file2 diff --git a/test/integration/forcePush/expected/.git_keep/FETCH_HEAD b/test/integration/forcePush/expected/.git_keep/FETCH_HEAD deleted file mode 100644 index 8997b0d11..000000000 --- a/test/integration/forcePush/expected/.git_keep/FETCH_HEAD +++ /dev/null @@ -1 +0,0 @@ -a9848fd98935937cd7d3909023ed1b588ccd4bfb branch 'master' of ../actual_remote diff --git a/test/integration/forcePush/expected/.git_keep/ORIG_HEAD b/test/integration/forcePush/expected/.git_keep/ORIG_HEAD deleted file mode 100644 index c081af82f..000000000 --- a/test/integration/forcePush/expected/.git_keep/ORIG_HEAD +++ /dev/null @@ -1 +0,0 @@ -a9848fd98935937cd7d3909023ed1b588ccd4bfb diff --git a/test/integration/forcePush/expected/.git_keep/config b/test/integration/forcePush/expected/.git_keep/config deleted file mode 100644 index 821803a3e..000000000 --- a/test/integration/forcePush/expected/.git_keep/config +++ /dev/null @@ -1,16 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true - precomposeunicode = true -[user] - email = CI@example.com - name = CI -[remote "origin"] - url = ../actual_remote - fetch = +refs/heads/*:refs/remotes/origin/* -[branch "master"] - remote = origin - merge = refs/heads/master diff --git a/test/integration/forcePush/expected/.git_keep/index b/test/integration/forcePush/expected/.git_keep/index deleted file mode 100644 index 84d23c3f4..000000000 Binary files a/test/integration/forcePush/expected/.git_keep/index and /dev/null differ diff --git a/test/integration/forcePush/expected/.git_keep/logs/HEAD b/test/integration/forcePush/expected/.git_keep/logs/HEAD deleted file mode 100644 index 9cef8b360..000000000 --- a/test/integration/forcePush/expected/.git_keep/logs/HEAD +++ /dev/null @@ -1,5 +0,0 @@ -0000000000000000000000000000000000000000 1fe60e6b7023a1b9751850f83ac5bda49ddd9278 CI 1634897551 +1100 commit (initial): myfile1 -1fe60e6b7023a1b9751850f83ac5bda49ddd9278 66bd8d357f6226ec264478db3606bc1c4be87e63 CI 1634897551 +1100 commit: myfile2 -66bd8d357f6226ec264478db3606bc1c4be87e63 a9848fd98935937cd7d3909023ed1b588ccd4bfb CI 1634897551 +1100 commit: myfile3 -a9848fd98935937cd7d3909023ed1b588ccd4bfb 66bd8d357f6226ec264478db3606bc1c4be87e63 CI 1634897551 +1100 reset: moving to HEAD^ -66bd8d357f6226ec264478db3606bc1c4be87e63 aed1af42535c9c6a27b9f660119452328fddd7cd CI 1634897551 +1100 commit: myfile4 diff --git a/test/integration/forcePush/expected/.git_keep/logs/refs/heads/master b/test/integration/forcePush/expected/.git_keep/logs/refs/heads/master deleted file mode 100644 index 9cef8b360..000000000 --- a/test/integration/forcePush/expected/.git_keep/logs/refs/heads/master +++ /dev/null @@ -1,5 +0,0 @@ -0000000000000000000000000000000000000000 1fe60e6b7023a1b9751850f83ac5bda49ddd9278 CI 1634897551 +1100 commit (initial): myfile1 -1fe60e6b7023a1b9751850f83ac5bda49ddd9278 66bd8d357f6226ec264478db3606bc1c4be87e63 CI 1634897551 +1100 commit: myfile2 -66bd8d357f6226ec264478db3606bc1c4be87e63 a9848fd98935937cd7d3909023ed1b588ccd4bfb CI 1634897551 +1100 commit: myfile3 -a9848fd98935937cd7d3909023ed1b588ccd4bfb 66bd8d357f6226ec264478db3606bc1c4be87e63 CI 1634897551 +1100 reset: moving to HEAD^ -66bd8d357f6226ec264478db3606bc1c4be87e63 aed1af42535c9c6a27b9f660119452328fddd7cd CI 1634897551 +1100 commit: myfile4 diff --git a/test/integration/forcePush/expected/.git_keep/logs/refs/remotes/origin/master b/test/integration/forcePush/expected/.git_keep/logs/refs/remotes/origin/master deleted file mode 100644 index 9ba3d77f4..000000000 --- a/test/integration/forcePush/expected/.git_keep/logs/refs/remotes/origin/master +++ /dev/null @@ -1,3 +0,0 @@ -0000000000000000000000000000000000000000 66bd8d357f6226ec264478db3606bc1c4be87e63 CI 1634897551 +1100 fetch origin: storing head -66bd8d357f6226ec264478db3606bc1c4be87e63 a9848fd98935937cd7d3909023ed1b588ccd4bfb CI 1634897551 +1100 update by push -a9848fd98935937cd7d3909023ed1b588ccd4bfb aed1af42535c9c6a27b9f660119452328fddd7cd CI 1634897553 +1100 update by push diff --git a/test/integration/forcePush/expected/.git_keep/objects/1f/e60e6b7023a1b9751850f83ac5bda49ddd9278 b/test/integration/forcePush/expected/.git_keep/objects/1f/e60e6b7023a1b9751850f83ac5bda49ddd9278 deleted file mode 100644 index 3c2c7f4e4..000000000 --- a/test/integration/forcePush/expected/.git_keep/objects/1f/e60e6b7023a1b9751850f83ac5bda49ddd9278 +++ /dev/null @@ -1,5 +0,0 @@ -xŤÍA -0@Ń®sŠŮJF'“E -®ţâËÚÚŇ:ő]Dm˘Ńzň9Ç^stRB©sfć2¨ÔĚÉly×W‡CjŞ>Ä™ťcÇD1ŐâŮr*š˘˛7ůÝëă×qşë'·í©YŰ =Ą!†€pF´ÖzLuý37í;/O%óÜ):e \ No newline at end of file diff --git a/test/integration/forcePush/expected/.git_keep/refs/heads/master b/test/integration/forcePush/expected/.git_keep/refs/heads/master deleted file mode 100644 index eaa7bcba3..000000000 --- a/test/integration/forcePush/expected/.git_keep/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -aed1af42535c9c6a27b9f660119452328fddd7cd diff --git a/test/integration/forcePush/expected/.git_keep/refs/remotes/origin/master b/test/integration/forcePush/expected/.git_keep/refs/remotes/origin/master deleted file mode 100644 index eaa7bcba3..000000000 --- a/test/integration/forcePush/expected/.git_keep/refs/remotes/origin/master +++ /dev/null @@ -1 +0,0 @@ -aed1af42535c9c6a27b9f660119452328fddd7cd diff --git a/test/integration/pull/expected/.git_keep/HEAD b/test/integration/forcePush/expected/origin/HEAD similarity index 100% rename from test/integration/pull/expected/.git_keep/HEAD rename to test/integration/forcePush/expected/origin/HEAD diff --git a/test/integration/forcePush/expected/origin/config b/test/integration/forcePush/expected/origin/config new file mode 100644 index 000000000..5b015dc91 --- /dev/null +++ b/test/integration/forcePush/expected/origin/config @@ -0,0 +1,8 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/forcePush/actual/./repo diff --git a/test/integration/mergeConflicts/expected/.git_keep/description b/test/integration/forcePush/expected/origin/description similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/description rename to test/integration/forcePush/expected/origin/description diff --git a/test/integration/forcePush/expected_remote/info/exclude b/test/integration/forcePush/expected/origin/info/exclude similarity index 100% rename from test/integration/forcePush/expected_remote/info/exclude rename to test/integration/forcePush/expected/origin/info/exclude diff --git a/test/integration/patchBuilding2/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/forcePush/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/patchBuilding2/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/forcePush/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/forcePush/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/forcePush/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/pull/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/forcePush/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/pull/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/forcePush/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/forcePush/expected/origin/objects/55/58e3589b913d8280499a5f9bf698971a83c5bd b/test/integration/forcePush/expected/origin/objects/55/58e3589b913d8280499a5f9bf698971a83c5bd new file mode 100644 index 000000000..901f43002 Binary files /dev/null and b/test/integration/forcePush/expected/origin/objects/55/58e3589b913d8280499a5f9bf698971a83c5bd differ diff --git a/test/integration/forcePush/expected/origin/objects/77/ead8cf99f5fa1084e9ffa40eb18f37157b22c8 b/test/integration/forcePush/expected/origin/objects/77/ead8cf99f5fa1084e9ffa40eb18f37157b22c8 new file mode 100644 index 000000000..6df2d79c3 --- /dev/null +++ b/test/integration/forcePush/expected/origin/objects/77/ead8cf99f5fa1084e9ffa40eb18f37157b22c8 @@ -0,0 +1,2 @@ +xŤÎA +Â0@Q×9Eö‚d’ĚtD„®zڤ™`ÁŘR"čííÜ~ŢâĎkkK· ńÔwU›†!ˇTWŠj%©™±'*ŢgW}2[ÚőŐ-"˛dɡ°gEVÉ•„e€ÄaĆ\Lz÷ÇşŰq˛×qşë'µí©—ym7 9 wNěŔ9sÔcŞëźÜ´o]žęÍz9‹ \ No newline at end of file diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/forcePush/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/forcePush/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/pull/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/forcePush/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/pull/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/forcePush/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/forcePush/expected/origin/objects/b8/568c2ecaef7e2f47647057ad47b040e8c5df53 b/test/integration/forcePush/expected/origin/objects/b8/568c2ecaef7e2f47647057ad47b040e8c5df53 new file mode 100644 index 000000000..f83e70de7 --- /dev/null +++ b/test/integration/forcePush/expected/origin/objects/b8/568c2ecaef7e2f47647057ad47b040e8c5df53 @@ -0,0 +1,2 @@ +xŤŽA +Â0E]çŮ ’ɤÍD„®zŚd:cK‰ ·7Gpőáń|Ţj]›…Ní±ľ@D¦ šŞćPÉ1ĎC_łçC^ÍĆ(y!Ö”tĐ Ž‚¤^'H1‹÷L&żŰc;ě4Űë4ßĺ“ëţ” oőfa „w.Ů3€s¦Ó~ŞÉźş©_]ź‚će-;7 \ No newline at end of file diff --git a/test/integration/forcePush/expected/.git_keep/objects/ce/0848710343a75263ea72cb5bdfa666b9ecda68 b/test/integration/forcePush/expected/origin/objects/ce/0848710343a75263ea72cb5bdfa666b9ecda68 similarity index 100% rename from test/integration/forcePush/expected/.git_keep/objects/ce/0848710343a75263ea72cb5bdfa666b9ecda68 rename to test/integration/forcePush/expected/origin/objects/ce/0848710343a75263ea72cb5bdfa666b9ecda68 diff --git a/test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/forcePush/expected/origin/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/forcePush/expected/origin/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/forcePush/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/forcePush/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/forcePush/expected/origin/objects/e3/8b0dbe9634034957d8ebe0088587abd9ae938d b/test/integration/forcePush/expected/origin/objects/e3/8b0dbe9634034957d8ebe0088587abd9ae938d new file mode 100644 index 000000000..5b7d7cee7 Binary files /dev/null and b/test/integration/forcePush/expected/origin/objects/e3/8b0dbe9634034957d8ebe0088587abd9ae938d differ diff --git a/test/integration/forcePush/expected/origin/packed-refs b/test/integration/forcePush/expected/origin/packed-refs new file mode 100644 index 000000000..c6dbf6df8 --- /dev/null +++ b/test/integration/forcePush/expected/origin/packed-refs @@ -0,0 +1,2 @@ +# pack-refs with: peeled fully-peeled sorted +77ead8cf99f5fa1084e9ffa40eb18f37157b22c8 refs/heads/master diff --git a/test/integration/forcePush/expected/origin/refs/heads/master b/test/integration/forcePush/expected/origin/refs/heads/master new file mode 100644 index 000000000..3b1a8881f --- /dev/null +++ b/test/integration/forcePush/expected/origin/refs/heads/master @@ -0,0 +1 @@ +e38b0dbe9634034957d8ebe0088587abd9ae938d diff --git a/test/integration/pull/expected/.git_keep/COMMIT_EDITMSG b/test/integration/forcePush/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/pull/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/forcePush/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/forcePush/expected/repo/.git_keep/FETCH_HEAD b/test/integration/forcePush/expected/repo/.git_keep/FETCH_HEAD new file mode 100644 index 000000000..e065d2487 --- /dev/null +++ b/test/integration/forcePush/expected/repo/.git_keep/FETCH_HEAD @@ -0,0 +1 @@ +b8568c2ecaef7e2f47647057ad47b040e8c5df53 branch 'master' of ../origin diff --git a/test/integration/pull/expected_remote/HEAD b/test/integration/forcePush/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/pull/expected_remote/HEAD rename to test/integration/forcePush/expected/repo/.git_keep/HEAD diff --git a/test/integration/forcePush/expected/repo/.git_keep/ORIG_HEAD b/test/integration/forcePush/expected/repo/.git_keep/ORIG_HEAD new file mode 100644 index 000000000..54eb7c04b --- /dev/null +++ b/test/integration/forcePush/expected/repo/.git_keep/ORIG_HEAD @@ -0,0 +1 @@ +b8568c2ecaef7e2f47647057ad47b040e8c5df53 diff --git a/test/integration/forcePush/expected/repo/.git_keep/config b/test/integration/forcePush/expected/repo/.git_keep/config new file mode 100644 index 000000000..7721ae814 --- /dev/null +++ b/test/integration/forcePush/expected/repo/.git_keep/config @@ -0,0 +1,16 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[user] + email = CI@example.com + name = CI +[remote "origin"] + url = ../origin + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "master"] + remote = origin + merge = refs/heads/master diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/description b/test/integration/forcePush/expected/repo/.git_keep/description similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/description rename to test/integration/forcePush/expected/repo/.git_keep/description diff --git a/test/integration/forcePush/expected/repo/.git_keep/index b/test/integration/forcePush/expected/repo/.git_keep/index new file mode 100644 index 000000000..0638abdb5 Binary files /dev/null and b/test/integration/forcePush/expected/repo/.git_keep/index differ diff --git a/test/integration/initialOpen/expected/.git_keep/info/exclude b/test/integration/forcePush/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/initialOpen/expected/.git_keep/info/exclude rename to test/integration/forcePush/expected/repo/.git_keep/info/exclude diff --git a/test/integration/forcePush/expected/repo/.git_keep/logs/HEAD b/test/integration/forcePush/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..bccf225e5 --- /dev/null +++ b/test/integration/forcePush/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,5 @@ +0000000000000000000000000000000000000000 5558e3589b913d8280499a5f9bf698971a83c5bd CI 1648352009 +1100 commit (initial): myfile1 +5558e3589b913d8280499a5f9bf698971a83c5bd 77ead8cf99f5fa1084e9ffa40eb18f37157b22c8 CI 1648352009 +1100 commit: myfile2 +77ead8cf99f5fa1084e9ffa40eb18f37157b22c8 b8568c2ecaef7e2f47647057ad47b040e8c5df53 CI 1648352009 +1100 commit: myfile3 +b8568c2ecaef7e2f47647057ad47b040e8c5df53 77ead8cf99f5fa1084e9ffa40eb18f37157b22c8 CI 1648352009 +1100 reset: moving to HEAD^ +77ead8cf99f5fa1084e9ffa40eb18f37157b22c8 e38b0dbe9634034957d8ebe0088587abd9ae938d CI 1648352009 +1100 commit: myfile4 diff --git a/test/integration/forcePush/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/forcePush/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..bccf225e5 --- /dev/null +++ b/test/integration/forcePush/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,5 @@ +0000000000000000000000000000000000000000 5558e3589b913d8280499a5f9bf698971a83c5bd CI 1648352009 +1100 commit (initial): myfile1 +5558e3589b913d8280499a5f9bf698971a83c5bd 77ead8cf99f5fa1084e9ffa40eb18f37157b22c8 CI 1648352009 +1100 commit: myfile2 +77ead8cf99f5fa1084e9ffa40eb18f37157b22c8 b8568c2ecaef7e2f47647057ad47b040e8c5df53 CI 1648352009 +1100 commit: myfile3 +b8568c2ecaef7e2f47647057ad47b040e8c5df53 77ead8cf99f5fa1084e9ffa40eb18f37157b22c8 CI 1648352009 +1100 reset: moving to HEAD^ +77ead8cf99f5fa1084e9ffa40eb18f37157b22c8 e38b0dbe9634034957d8ebe0088587abd9ae938d CI 1648352009 +1100 commit: myfile4 diff --git a/test/integration/forcePush/expected/repo/.git_keep/logs/refs/remotes/origin/master b/test/integration/forcePush/expected/repo/.git_keep/logs/refs/remotes/origin/master new file mode 100644 index 000000000..006c9dee8 --- /dev/null +++ b/test/integration/forcePush/expected/repo/.git_keep/logs/refs/remotes/origin/master @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 77ead8cf99f5fa1084e9ffa40eb18f37157b22c8 CI 1648352009 +1100 fetch origin: storing head +77ead8cf99f5fa1084e9ffa40eb18f37157b22c8 b8568c2ecaef7e2f47647057ad47b040e8c5df53 CI 1648352009 +1100 update by push +b8568c2ecaef7e2f47647057ad47b040e8c5df53 e38b0dbe9634034957d8ebe0088587abd9ae938d CI 1648352011 +1100 update by push diff --git a/test/integration/pull/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/forcePush/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/pull/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/forcePush/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/forcePush/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/forcePush/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/pull/expected_remote/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/forcePush/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/pull/expected_remote/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/forcePush/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/forcePush/expected/repo/.git_keep/objects/55/58e3589b913d8280499a5f9bf698971a83c5bd b/test/integration/forcePush/expected/repo/.git_keep/objects/55/58e3589b913d8280499a5f9bf698971a83c5bd new file mode 100644 index 000000000..901f43002 Binary files /dev/null and b/test/integration/forcePush/expected/repo/.git_keep/objects/55/58e3589b913d8280499a5f9bf698971a83c5bd differ diff --git a/test/integration/forcePush/expected/repo/.git_keep/objects/77/ead8cf99f5fa1084e9ffa40eb18f37157b22c8 b/test/integration/forcePush/expected/repo/.git_keep/objects/77/ead8cf99f5fa1084e9ffa40eb18f37157b22c8 new file mode 100644 index 000000000..6df2d79c3 --- /dev/null +++ b/test/integration/forcePush/expected/repo/.git_keep/objects/77/ead8cf99f5fa1084e9ffa40eb18f37157b22c8 @@ -0,0 +1,2 @@ +xŤÎA +Â0@Q×9Eö‚d’ĚtD„®zڤ™`ÁŘR"čííÜ~ŢâĎkkK· ńÔwU›†!ˇTWŠj%©™±'*ŢgW}2[ÚőŐ-"˛dɡ°gEVÉ•„e€ÄaĆ\Lz÷ÇşŰq˛×qşë'µí©—ym7 9 wNěŔ9sÔcŞëźÜ´o]žęÍz9‹ \ No newline at end of file diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/forcePush/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/forcePush/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/pull/expected_remote/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/forcePush/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/pull/expected_remote/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/forcePush/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/forcePush/expected/repo/.git_keep/objects/b8/568c2ecaef7e2f47647057ad47b040e8c5df53 b/test/integration/forcePush/expected/repo/.git_keep/objects/b8/568c2ecaef7e2f47647057ad47b040e8c5df53 new file mode 100644 index 000000000..f83e70de7 --- /dev/null +++ b/test/integration/forcePush/expected/repo/.git_keep/objects/b8/568c2ecaef7e2f47647057ad47b040e8c5df53 @@ -0,0 +1,2 @@ +xŤŽA +Â0E]çŮ ’ɤÍD„®zŚd:cK‰ ·7Gpőáń|Ţj]›…Ní±ľ@D¦ šŞćPÉ1ĎC_łçC^ÍĆ(y!Ö”tĐ Ž‚¤^'H1‹÷L&żŰc;ě4Űë4ßĺ“ëţ” oőfa „w.Ů3€s¦Ó~ŞÉźş©_]ź‚će-;7 \ No newline at end of file diff --git a/test/integration/forcePush/expected_remote/objects/ce/0848710343a75263ea72cb5bdfa666b9ecda68 b/test/integration/forcePush/expected/repo/.git_keep/objects/ce/0848710343a75263ea72cb5bdfa666b9ecda68 similarity index 100% rename from test/integration/forcePush/expected_remote/objects/ce/0848710343a75263ea72cb5bdfa666b9ecda68 rename to test/integration/forcePush/expected/repo/.git_keep/objects/ce/0848710343a75263ea72cb5bdfa666b9ecda68 diff --git a/test/integration/pull/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/forcePush/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/pull/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/forcePush/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/forcePush/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/forcePush/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/forcePush/expected/repo/.git_keep/objects/e3/8b0dbe9634034957d8ebe0088587abd9ae938d b/test/integration/forcePush/expected/repo/.git_keep/objects/e3/8b0dbe9634034957d8ebe0088587abd9ae938d new file mode 100644 index 000000000..5b7d7cee7 Binary files /dev/null and b/test/integration/forcePush/expected/repo/.git_keep/objects/e3/8b0dbe9634034957d8ebe0088587abd9ae938d differ diff --git a/test/integration/forcePush/expected/repo/.git_keep/refs/heads/master b/test/integration/forcePush/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..3b1a8881f --- /dev/null +++ b/test/integration/forcePush/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +e38b0dbe9634034957d8ebe0088587abd9ae938d diff --git a/test/integration/forcePush/expected/repo/.git_keep/refs/remotes/origin/master b/test/integration/forcePush/expected/repo/.git_keep/refs/remotes/origin/master new file mode 100644 index 000000000..3b1a8881f --- /dev/null +++ b/test/integration/forcePush/expected/repo/.git_keep/refs/remotes/origin/master @@ -0,0 +1 @@ +e38b0dbe9634034957d8ebe0088587abd9ae938d diff --git a/test/integration/patchBuilding2/expected/myfile1 b/test/integration/forcePush/expected/repo/myfile1 similarity index 100% rename from test/integration/patchBuilding2/expected/myfile1 rename to test/integration/forcePush/expected/repo/myfile1 diff --git a/test/integration/pull/expected/myfile2 b/test/integration/forcePush/expected/repo/myfile2 similarity index 100% rename from test/integration/pull/expected/myfile2 rename to test/integration/forcePush/expected/repo/myfile2 diff --git a/test/integration/pull/expected/myfile4 b/test/integration/forcePush/expected/repo/myfile4 similarity index 100% rename from test/integration/pull/expected/myfile4 rename to test/integration/forcePush/expected/repo/myfile4 diff --git a/test/integration/forcePush/expected_remote/config b/test/integration/forcePush/expected_remote/config deleted file mode 100644 index ea4d9033b..000000000 --- a/test/integration/forcePush/expected_remote/config +++ /dev/null @@ -1,8 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = true - ignorecase = true - precomposeunicode = true -[remote "origin"] - url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/forcePush/./actual diff --git a/test/integration/forcePush/expected_remote/objects/1f/e60e6b7023a1b9751850f83ac5bda49ddd9278 b/test/integration/forcePush/expected_remote/objects/1f/e60e6b7023a1b9751850f83ac5bda49ddd9278 deleted file mode 100644 index 3c2c7f4e4..000000000 --- a/test/integration/forcePush/expected_remote/objects/1f/e60e6b7023a1b9751850f83ac5bda49ddd9278 +++ /dev/null @@ -1,5 +0,0 @@ -xŤÍA -0@Ń®sŠŮJF'“E -®ţâËÚÚŇ:ő]Dm˘Ńzň9Ç^stRB©sfć2¨ÔĚÉly×W‡CjŞ>Ä™ťcÇD1ŐâŮr*š˘˛7ůÝëă×qşë'·í©YŰ =Ą!†€pF´ÖzLuý37í;/O%óÜ):e \ No newline at end of file diff --git a/test/integration/forcePush/expected_remote/packed-refs b/test/integration/forcePush/expected_remote/packed-refs deleted file mode 100644 index 7a7114a0a..000000000 --- a/test/integration/forcePush/expected_remote/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# pack-refs with: peeled fully-peeled sorted -66bd8d357f6226ec264478db3606bc1c4be87e63 refs/heads/master diff --git a/test/integration/forcePush/expected_remote/refs/heads/master b/test/integration/forcePush/expected_remote/refs/heads/master deleted file mode 100644 index eaa7bcba3..000000000 --- a/test/integration/forcePush/expected_remote/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -aed1af42535c9c6a27b9f660119452328fddd7cd diff --git a/test/integration/forcePush/setup.sh b/test/integration/forcePush/setup.sh index 74192c316..2856859ca 100644 --- a/test/integration/forcePush/setup.sh +++ b/test/integration/forcePush/setup.sh @@ -19,11 +19,11 @@ git add . git commit -am "myfile2" cd .. -git clone --bare ./actual actual_remote +git clone --bare ./repo origin -cd actual +cd repo -git remote add origin ../actual_remote +git remote add origin ../origin git fetch origin git branch --set-upstream-to=origin/master master diff --git a/test/integration/pullAndSetUpstream/expected/.git_keep/HEAD b/test/integration/forcePushMultipleMatching/expected/origin/HEAD similarity index 100% rename from test/integration/pullAndSetUpstream/expected/.git_keep/HEAD rename to test/integration/forcePushMultipleMatching/expected/origin/HEAD diff --git a/test/integration/forcePushMultipleMatching/expected/origin/config b/test/integration/forcePushMultipleMatching/expected/origin/config new file mode 100644 index 000000000..41711784a --- /dev/null +++ b/test/integration/forcePushMultipleMatching/expected/origin/config @@ -0,0 +1,8 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/forcePushMultiple/actual/./repo diff --git a/test/integration/mergeConflictsResolvedExternally/expected/.git_keep/description b/test/integration/forcePushMultipleMatching/expected/origin/description similarity index 100% rename from test/integration/mergeConflictsResolvedExternally/expected/.git_keep/description rename to test/integration/forcePushMultipleMatching/expected/origin/description diff --git a/test/integration/mergeConflictRevert/expected/.git_keep/info/exclude b/test/integration/forcePushMultipleMatching/expected/origin/info/exclude similarity index 100% rename from test/integration/mergeConflictRevert/expected/.git_keep/info/exclude rename to test/integration/forcePushMultipleMatching/expected/origin/info/exclude diff --git a/test/integration/pull/expected_remote/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/forcePushMultipleMatching/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/pull/expected_remote/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/forcePushMultipleMatching/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/forcePushMultipleMatching/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/forcePushMultipleMatching/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/pullAndSetUpstream/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/forcePushMultipleMatching/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/pullAndSetUpstream/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/forcePushMultipleMatching/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/forcePushMultipleMatching/expected/origin/objects/7a/35f0bb6bd8dc18ae462465e51f02362ba6babe b/test/integration/forcePushMultipleMatching/expected/origin/objects/7a/35f0bb6bd8dc18ae462465e51f02362ba6babe new file mode 100644 index 000000000..c58bcbe9b --- /dev/null +++ b/test/integration/forcePushMultipleMatching/expected/origin/objects/7a/35f0bb6bd8dc18ae462465e51f02362ba6babe @@ -0,0 +1,2 @@ +xŤÍA +0@Ń®sŠŮJ&NÇĄ\yŚ1™PÁ!ERĐŰ×#tűyđS5[ ńĄmŞŕ•SńÂs?hĚDŠ‘sÄ Xzš©ËLEŇ=8ů¶wÝ`śŕ1N/ÝĹ>«ŢRµ' Sěh €pEôŢťőś4ý“;;ʲ*ş2K,Í \ No newline at end of file diff --git a/test/integration/patchBuilding/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/forcePushMultipleMatching/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/patchBuilding/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/forcePushMultipleMatching/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/pullAndSetUpstream/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/forcePushMultipleMatching/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/pullAndSetUpstream/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/forcePushMultipleMatching/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/forcePushMultipleMatching/expected/origin/objects/bd/739fb752ed02ccd49422196e31599c87ff90ad b/test/integration/forcePushMultipleMatching/expected/origin/objects/bd/739fb752ed02ccd49422196e31599c87ff90ad new file mode 100644 index 000000000..fcaa0a878 Binary files /dev/null and b/test/integration/forcePushMultipleMatching/expected/origin/objects/bd/739fb752ed02ccd49422196e31599c87ff90ad differ diff --git a/test/integration/pullMerge/expected/.git_keep/objects/ce/0848710343a75263ea72cb5bdfa666b9ecda68 b/test/integration/forcePushMultipleMatching/expected/origin/objects/ce/0848710343a75263ea72cb5bdfa666b9ecda68 similarity index 100% rename from test/integration/pullMerge/expected/.git_keep/objects/ce/0848710343a75263ea72cb5bdfa666b9ecda68 rename to test/integration/forcePushMultipleMatching/expected/origin/objects/ce/0848710343a75263ea72cb5bdfa666b9ecda68 diff --git a/test/integration/pull/expected_remote/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/forcePushMultipleMatching/expected/origin/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/pull/expected_remote/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/forcePushMultipleMatching/expected/origin/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/forcePushMultipleMatching/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/forcePushMultipleMatching/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/forcePushMultipleMatching/expected/origin/objects/e6/7f344f42afdb79c87a590f22537160241d8d61 b/test/integration/forcePushMultipleMatching/expected/origin/objects/e6/7f344f42afdb79c87a590f22537160241d8d61 new file mode 100644 index 000000000..e1d86f23c Binary files /dev/null and b/test/integration/forcePushMultipleMatching/expected/origin/objects/e6/7f344f42afdb79c87a590f22537160241d8d61 differ diff --git a/test/integration/forcePushMultipleMatching/expected/origin/objects/fe/67c3eaf819025990d3688d5f147a064e669ca5 b/test/integration/forcePushMultipleMatching/expected/origin/objects/fe/67c3eaf819025990d3688d5f147a064e669ca5 new file mode 100644 index 000000000..114e72ec5 Binary files /dev/null and b/test/integration/forcePushMultipleMatching/expected/origin/objects/fe/67c3eaf819025990d3688d5f147a064e669ca5 differ diff --git a/test/integration/forcePushMultipleMatching/expected/origin/packed-refs b/test/integration/forcePushMultipleMatching/expected/origin/packed-refs new file mode 100644 index 000000000..970c0dc0b --- /dev/null +++ b/test/integration/forcePushMultipleMatching/expected/origin/packed-refs @@ -0,0 +1,3 @@ +# pack-refs with: peeled fully-peeled sorted +e67f344f42afdb79c87a590f22537160241d8d61 refs/heads/master +e67f344f42afdb79c87a590f22537160241d8d61 refs/heads/other_branch diff --git a/test/integration/forcePushMultipleMatching/expected/origin/refs/heads/master b/test/integration/forcePushMultipleMatching/expected/origin/refs/heads/master new file mode 100644 index 000000000..51eb490a4 --- /dev/null +++ b/test/integration/forcePushMultipleMatching/expected/origin/refs/heads/master @@ -0,0 +1 @@ +e67f344f42afdb79c87a590f22537160241d8d61 diff --git a/test/integration/forcePushMultipleMatching/expected/origin/refs/heads/other_branch b/test/integration/forcePushMultipleMatching/expected/origin/refs/heads/other_branch new file mode 100644 index 000000000..51eb490a4 --- /dev/null +++ b/test/integration/forcePushMultipleMatching/expected/origin/refs/heads/other_branch @@ -0,0 +1 @@ +e67f344f42afdb79c87a590f22537160241d8d61 diff --git a/test/integration/pullAndSetUpstream/expected/.git_keep/COMMIT_EDITMSG b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/pullAndSetUpstream/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/forcePushMultipleMatching/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/FETCH_HEAD b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/FETCH_HEAD new file mode 100644 index 000000000..0a4e5da7e --- /dev/null +++ b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/FETCH_HEAD @@ -0,0 +1,2 @@ +bd739fb752ed02ccd49422196e31599c87ff90ad branch 'master' of ../origin +fe67c3eaf819025990d3688d5f147a064e669ca5 not-for-merge branch 'other_branch' of ../origin diff --git a/test/integration/pullAndSetUpstream/expected_remote/HEAD b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/pullAndSetUpstream/expected_remote/HEAD rename to test/integration/forcePushMultipleMatching/expected/repo/.git_keep/HEAD diff --git a/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/ORIG_HEAD b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/ORIG_HEAD new file mode 100644 index 000000000..e7aee65c4 --- /dev/null +++ b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/ORIG_HEAD @@ -0,0 +1 @@ +fe67c3eaf819025990d3688d5f147a064e669ca5 diff --git a/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/config b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/config new file mode 100644 index 000000000..2be68507e --- /dev/null +++ b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/config @@ -0,0 +1,21 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[user] + email = CI@example.com + name = CI +[push] + default = matching +[remote "origin"] + url = ../origin + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "master"] + remote = origin + merge = refs/heads/master +[branch "other_branch"] + remote = origin + merge = refs/heads/other_branch diff --git a/test/integration/patchBuilding/expected/.git_keep/description b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/description similarity index 100% rename from test/integration/patchBuilding/expected/.git_keep/description rename to test/integration/forcePushMultipleMatching/expected/repo/.git_keep/description diff --git a/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/index b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/index new file mode 100644 index 000000000..5c83b42dc Binary files /dev/null and b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/index differ diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/info/exclude b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/info/exclude rename to test/integration/forcePushMultipleMatching/expected/repo/.git_keep/info/exclude diff --git a/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/logs/HEAD b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..fa818156f --- /dev/null +++ b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,10 @@ +0000000000000000000000000000000000000000 7a35f0bb6bd8dc18ae462465e51f02362ba6babe CI 1648349421 +1100 commit (initial): myfile1 +7a35f0bb6bd8dc18ae462465e51f02362ba6babe e67f344f42afdb79c87a590f22537160241d8d61 CI 1648349421 +1100 commit: myfile2 +e67f344f42afdb79c87a590f22537160241d8d61 e67f344f42afdb79c87a590f22537160241d8d61 CI 1648349421 +1100 checkout: moving from master to other_branch +e67f344f42afdb79c87a590f22537160241d8d61 e67f344f42afdb79c87a590f22537160241d8d61 CI 1648349421 +1100 checkout: moving from other_branch to master +e67f344f42afdb79c87a590f22537160241d8d61 bd739fb752ed02ccd49422196e31599c87ff90ad CI 1648349421 +1100 commit: myfile3 +bd739fb752ed02ccd49422196e31599c87ff90ad e67f344f42afdb79c87a590f22537160241d8d61 CI 1648349421 +1100 reset: moving to HEAD^ +e67f344f42afdb79c87a590f22537160241d8d61 e67f344f42afdb79c87a590f22537160241d8d61 CI 1648349421 +1100 checkout: moving from master to other_branch +e67f344f42afdb79c87a590f22537160241d8d61 fe67c3eaf819025990d3688d5f147a064e669ca5 CI 1648349421 +1100 commit: myfile4 +fe67c3eaf819025990d3688d5f147a064e669ca5 e67f344f42afdb79c87a590f22537160241d8d61 CI 1648349422 +1100 reset: moving to HEAD^ +e67f344f42afdb79c87a590f22537160241d8d61 e67f344f42afdb79c87a590f22537160241d8d61 CI 1648349422 +1100 checkout: moving from other_branch to master diff --git a/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..7c4a7732c --- /dev/null +++ b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,4 @@ +0000000000000000000000000000000000000000 7a35f0bb6bd8dc18ae462465e51f02362ba6babe CI 1648349421 +1100 commit (initial): myfile1 +7a35f0bb6bd8dc18ae462465e51f02362ba6babe e67f344f42afdb79c87a590f22537160241d8d61 CI 1648349421 +1100 commit: myfile2 +e67f344f42afdb79c87a590f22537160241d8d61 bd739fb752ed02ccd49422196e31599c87ff90ad CI 1648349421 +1100 commit: myfile3 +bd739fb752ed02ccd49422196e31599c87ff90ad e67f344f42afdb79c87a590f22537160241d8d61 CI 1648349421 +1100 reset: moving to HEAD^ diff --git a/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/logs/refs/heads/other_branch b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/logs/refs/heads/other_branch new file mode 100644 index 000000000..76c0be40c --- /dev/null +++ b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/logs/refs/heads/other_branch @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 e67f344f42afdb79c87a590f22537160241d8d61 CI 1648349421 +1100 branch: Created from HEAD +e67f344f42afdb79c87a590f22537160241d8d61 fe67c3eaf819025990d3688d5f147a064e669ca5 CI 1648349421 +1100 commit: myfile4 +fe67c3eaf819025990d3688d5f147a064e669ca5 e67f344f42afdb79c87a590f22537160241d8d61 CI 1648349422 +1100 reset: moving to HEAD^ diff --git a/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/logs/refs/remotes/origin/master b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/logs/refs/remotes/origin/master new file mode 100644 index 000000000..f6e6b60bd --- /dev/null +++ b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/logs/refs/remotes/origin/master @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 e67f344f42afdb79c87a590f22537160241d8d61 CI 1648349421 +1100 fetch origin: storing head +e67f344f42afdb79c87a590f22537160241d8d61 bd739fb752ed02ccd49422196e31599c87ff90ad CI 1648349421 +1100 update by push +bd739fb752ed02ccd49422196e31599c87ff90ad e67f344f42afdb79c87a590f22537160241d8d61 CI 1648349423 +1100 update by push diff --git a/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/logs/refs/remotes/origin/other_branch b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/logs/refs/remotes/origin/other_branch new file mode 100644 index 000000000..5672ee50e --- /dev/null +++ b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/logs/refs/remotes/origin/other_branch @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 e67f344f42afdb79c87a590f22537160241d8d61 CI 1648349421 +1100 fetch origin: storing head +e67f344f42afdb79c87a590f22537160241d8d61 fe67c3eaf819025990d3688d5f147a064e669ca5 CI 1648349421 +1100 update by push +fe67c3eaf819025990d3688d5f147a064e669ca5 e67f344f42afdb79c87a590f22537160241d8d61 CI 1648349423 +1100 update by push diff --git a/test/integration/pullAndSetUpstream/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/pullAndSetUpstream/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/forcePushMultipleMatching/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/forcePushMultipleMatching/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/pullAndSetUpstream/expected_remote/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/pullAndSetUpstream/expected_remote/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/forcePushMultipleMatching/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/objects/7a/35f0bb6bd8dc18ae462465e51f02362ba6babe b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/objects/7a/35f0bb6bd8dc18ae462465e51f02362ba6babe new file mode 100644 index 000000000..c58bcbe9b --- /dev/null +++ b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/objects/7a/35f0bb6bd8dc18ae462465e51f02362ba6babe @@ -0,0 +1,2 @@ +xŤÍA +0@Ń®sŠŮJ&NÇĄ\yŚ1™PÁ!ERĐŰ×#tűyđS5[ ńĄmŞŕ•SńÂs?hĚDŠ‘sÄ Xzš©ËLEŇ=8ů¶wÝ`śŕ1N/ÝĹ>«ŢRµ' Sěh €pEôŢťőś4ý“;;ʲ*ş2K,Í \ No newline at end of file diff --git a/test/integration/patchBuilding2/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/patchBuilding2/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/forcePushMultipleMatching/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/pullAndSetUpstream/expected_remote/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/pullAndSetUpstream/expected_remote/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/forcePushMultipleMatching/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/objects/bd/739fb752ed02ccd49422196e31599c87ff90ad b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/objects/bd/739fb752ed02ccd49422196e31599c87ff90ad new file mode 100644 index 000000000..fcaa0a878 Binary files /dev/null and b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/objects/bd/739fb752ed02ccd49422196e31599c87ff90ad differ diff --git a/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/objects/ce/0848710343a75263ea72cb5bdfa666b9ecda68 b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/objects/ce/0848710343a75263ea72cb5bdfa666b9ecda68 new file mode 100644 index 000000000..5e9361d35 Binary files /dev/null and b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/objects/ce/0848710343a75263ea72cb5bdfa666b9ecda68 differ diff --git a/test/integration/pullAndSetUpstream/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/pullAndSetUpstream/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/forcePushMultipleMatching/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/patchBuilding/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/patchBuilding/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/forcePushMultipleMatching/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/objects/e6/7f344f42afdb79c87a590f22537160241d8d61 b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/objects/e6/7f344f42afdb79c87a590f22537160241d8d61 new file mode 100644 index 000000000..e1d86f23c Binary files /dev/null and b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/objects/e6/7f344f42afdb79c87a590f22537160241d8d61 differ diff --git a/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/objects/fe/67c3eaf819025990d3688d5f147a064e669ca5 b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/objects/fe/67c3eaf819025990d3688d5f147a064e669ca5 new file mode 100644 index 000000000..114e72ec5 Binary files /dev/null and b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/objects/fe/67c3eaf819025990d3688d5f147a064e669ca5 differ diff --git a/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/refs/heads/master b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..51eb490a4 --- /dev/null +++ b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +e67f344f42afdb79c87a590f22537160241d8d61 diff --git a/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/refs/heads/other_branch b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/refs/heads/other_branch new file mode 100644 index 000000000..51eb490a4 --- /dev/null +++ b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/refs/heads/other_branch @@ -0,0 +1 @@ +e67f344f42afdb79c87a590f22537160241d8d61 diff --git a/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/refs/remotes/origin/master b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/refs/remotes/origin/master new file mode 100644 index 000000000..51eb490a4 --- /dev/null +++ b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/refs/remotes/origin/master @@ -0,0 +1 @@ +e67f344f42afdb79c87a590f22537160241d8d61 diff --git a/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/refs/remotes/origin/other_branch b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/refs/remotes/origin/other_branch new file mode 100644 index 000000000..51eb490a4 --- /dev/null +++ b/test/integration/forcePushMultipleMatching/expected/repo/.git_keep/refs/remotes/origin/other_branch @@ -0,0 +1 @@ +e67f344f42afdb79c87a590f22537160241d8d61 diff --git a/test/integration/pull/expected/myfile1 b/test/integration/forcePushMultipleMatching/expected/repo/myfile1 similarity index 100% rename from test/integration/pull/expected/myfile1 rename to test/integration/forcePushMultipleMatching/expected/repo/myfile1 diff --git a/test/integration/pullAndSetUpstream/expected/myfile2 b/test/integration/forcePushMultipleMatching/expected/repo/myfile2 similarity index 100% rename from test/integration/pullAndSetUpstream/expected/myfile2 rename to test/integration/forcePushMultipleMatching/expected/repo/myfile2 diff --git a/test/integration/forcePushMultipleMatching/recording.json b/test/integration/forcePushMultipleMatching/recording.json new file mode 100644 index 000000000..ae367f16d --- /dev/null +++ b/test/integration/forcePushMultipleMatching/recording.json @@ -0,0 +1 @@ +{"KeyEvents":[{"Timestamp":892,"Mod":0,"Key":256,"Ch":80},{"Timestamp":1379,"Mod":0,"Key":13,"Ch":13},{"Timestamp":2132,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":135,"Height":36}]} \ No newline at end of file diff --git a/test/integration/forcePushMultipleMatching/setup.sh b/test/integration/forcePushMultipleMatching/setup.sh new file mode 100644 index 000000000..185ea46e9 --- /dev/null +++ b/test/integration/forcePushMultipleMatching/setup.sh @@ -0,0 +1,54 @@ +#!/bin/sh + +set -e + +set -e + +cd $1 + +git init + +git config user.email "CI@example.com" +git config user.name "CI" +git config push.default matching + +echo test1 > myfile1 +git add . +git commit -am "myfile1" +echo test2 > myfile2 +git add . +git commit -am "myfile2" + +git checkout -b other_branch +git checkout master + +cd .. +git clone --bare ./repo origin + +cd repo + +git remote add origin ../origin +git fetch origin +git branch --set-upstream-to=origin/master master +git branch --set-upstream-to=origin/other_branch other_branch + +echo test3 > myfile3 +git add . +git commit -am "myfile3" + +git push origin master +git reset --hard HEAD^ + +git checkout other_branch + +echo test4 > myfile4 +git add . +git commit -am "myfile4" + +git push origin other_branch +git reset --hard HEAD^ + +git checkout master + +# at this point, both branches have diverged from their remote counterparts, meaning if you +# attempt to push either, it'll ask if you want to force push. diff --git a/test/integration/forcePushMultipleMatching/test.json b/test/integration/forcePushMultipleMatching/test.json new file mode 100644 index 000000000..e62caa40f --- /dev/null +++ b/test/integration/forcePushMultipleMatching/test.json @@ -0,0 +1,4 @@ +{ + "description": "Force push to multiple branches because the user has push.default matching", + "speed": 10 +} diff --git a/test/integration/pullMerge/expected/.git_keep/HEAD b/test/integration/forcePushMultipleUpstream/expected/origin/HEAD similarity index 100% rename from test/integration/pullMerge/expected/.git_keep/HEAD rename to test/integration/forcePushMultipleUpstream/expected/origin/HEAD diff --git a/test/integration/forcePushMultipleUpstream/expected/origin/config b/test/integration/forcePushMultipleUpstream/expected/origin/config new file mode 100644 index 000000000..6504f87b4 --- /dev/null +++ b/test/integration/forcePushMultipleUpstream/expected/origin/config @@ -0,0 +1,8 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/forcePushMultipleUpstream/actual/./repo diff --git a/test/integration/patchBuilding2/expected/.git_keep/description b/test/integration/forcePushMultipleUpstream/expected/origin/description similarity index 100% rename from test/integration/patchBuilding2/expected/.git_keep/description rename to test/integration/forcePushMultipleUpstream/expected/origin/description diff --git a/test/integration/mergeConflicts/expected/.git_keep/info/exclude b/test/integration/forcePushMultipleUpstream/expected/origin/info/exclude similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/info/exclude rename to test/integration/forcePushMultipleUpstream/expected/origin/info/exclude diff --git a/test/integration/pullAndSetUpstream/expected_remote/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/forcePushMultipleUpstream/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/pullAndSetUpstream/expected_remote/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/forcePushMultipleUpstream/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/pull/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/forcePushMultipleUpstream/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/pull/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/forcePushMultipleUpstream/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/pullMerge/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/forcePushMultipleUpstream/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/pullMerge/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/forcePushMultipleUpstream/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/forcePushMultipleUpstream/expected/origin/objects/48/6301f318c84045827013a3c3246b8c6a319eb8 b/test/integration/forcePushMultipleUpstream/expected/origin/objects/48/6301f318c84045827013a3c3246b8c6a319eb8 new file mode 100644 index 000000000..c1564b80f Binary files /dev/null and b/test/integration/forcePushMultipleUpstream/expected/origin/objects/48/6301f318c84045827013a3c3246b8c6a319eb8 differ diff --git a/test/integration/forcePushMultipleUpstream/expected/origin/objects/49/ea44f3ec1792142714930c8e4c3073f137936c b/test/integration/forcePushMultipleUpstream/expected/origin/objects/49/ea44f3ec1792142714930c8e4c3073f137936c new file mode 100644 index 000000000..52bacd105 Binary files /dev/null and b/test/integration/forcePushMultipleUpstream/expected/origin/objects/49/ea44f3ec1792142714930c8e4c3073f137936c differ diff --git a/test/integration/forcePushMultipleUpstream/expected/origin/objects/81/bdc116083cd4b4655333f4eb94dc0320197082 b/test/integration/forcePushMultipleUpstream/expected/origin/objects/81/bdc116083cd4b4655333f4eb94dc0320197082 new file mode 100644 index 000000000..b9233622d --- /dev/null +++ b/test/integration/forcePushMultipleUpstream/expected/origin/objects/81/bdc116083cd4b4655333f4eb94dc0320197082 @@ -0,0 +1,3 @@ +xŤÍA +0@Ń®sŠŮJ&Žc„R +®<ĆL¨ŕ‘ÚŰ×#tűyđS5[ ńĄŞŕ•SńÂË0jĚDŠ‘sÄ XZ¨ËLERśĽŰ«0Ípźć§~ÄöMo©Ú)v4öŕŠč˝;ë9iú'wö-ë¦č~3—,Ő \ No newline at end of file diff --git a/test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/forcePushMultipleUpstream/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/forcePushMultipleUpstream/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/pullMerge/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/forcePushMultipleUpstream/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/pullMerge/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/forcePushMultipleUpstream/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/forcePushMultipleUpstream/expected/origin/objects/c8/4375dda9d81c1f2103defe4384e31f859dac86 b/test/integration/forcePushMultipleUpstream/expected/origin/objects/c8/4375dda9d81c1f2103defe4384e31f859dac86 new file mode 100644 index 000000000..3054cb14b --- /dev/null +++ b/test/integration/forcePushMultipleUpstream/expected/origin/objects/c8/4375dda9d81c1f2103defe4384e31f859dac86 @@ -0,0 +1,5 @@ +xŤÎM +0@á®sŠě %“óR +®<Ć8N¨`ŞH +ííëş}|‹'[­KłéŇU+ęĄ 9v> rô2uÓ\8„0e•™C2;új–˛2QAŮů”ŃIRt `ĚÄđ»=·ĂŁí‡ńˇ®űŞ7ŮęÝB „”;ňö +ŕś9ë9ŐôOnę·,«’ů‚ 9— \ No newline at end of file diff --git a/test/integration/forcePushMultipleUpstream/expected/origin/objects/ce/0848710343a75263ea72cb5bdfa666b9ecda68 b/test/integration/forcePushMultipleUpstream/expected/origin/objects/ce/0848710343a75263ea72cb5bdfa666b9ecda68 new file mode 100644 index 000000000..5e9361d35 Binary files /dev/null and b/test/integration/forcePushMultipleUpstream/expected/origin/objects/ce/0848710343a75263ea72cb5bdfa666b9ecda68 differ diff --git a/test/integration/pullAndSetUpstream/expected_remote/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/forcePushMultipleUpstream/expected/origin/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/pullAndSetUpstream/expected_remote/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/forcePushMultipleUpstream/expected/origin/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/patchBuilding2/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/forcePushMultipleUpstream/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/patchBuilding2/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/forcePushMultipleUpstream/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/forcePushMultipleUpstream/expected/origin/packed-refs b/test/integration/forcePushMultipleUpstream/expected/origin/packed-refs new file mode 100644 index 000000000..06b105db2 --- /dev/null +++ b/test/integration/forcePushMultipleUpstream/expected/origin/packed-refs @@ -0,0 +1,3 @@ +# pack-refs with: peeled fully-peeled sorted +49ea44f3ec1792142714930c8e4c3073f137936c refs/heads/master +49ea44f3ec1792142714930c8e4c3073f137936c refs/heads/other_branch diff --git a/test/integration/forcePushMultipleUpstream/expected/origin/refs/heads/master b/test/integration/forcePushMultipleUpstream/expected/origin/refs/heads/master new file mode 100644 index 000000000..f29b96944 --- /dev/null +++ b/test/integration/forcePushMultipleUpstream/expected/origin/refs/heads/master @@ -0,0 +1 @@ +49ea44f3ec1792142714930c8e4c3073f137936c diff --git a/test/integration/forcePushMultipleUpstream/expected/origin/refs/heads/other_branch b/test/integration/forcePushMultipleUpstream/expected/origin/refs/heads/other_branch new file mode 100644 index 000000000..7c9ad8321 --- /dev/null +++ b/test/integration/forcePushMultipleUpstream/expected/origin/refs/heads/other_branch @@ -0,0 +1 @@ +c84375dda9d81c1f2103defe4384e31f859dac86 diff --git a/test/integration/pullMerge/expected/.git_keep/COMMIT_EDITMSG b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/pullMerge/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/FETCH_HEAD b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/FETCH_HEAD new file mode 100644 index 000000000..e799afa43 --- /dev/null +++ b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/FETCH_HEAD @@ -0,0 +1,2 @@ +486301f318c84045827013a3c3246b8c6a319eb8 branch 'master' of ../origin +c84375dda9d81c1f2103defe4384e31f859dac86 not-for-merge branch 'other_branch' of ../origin diff --git a/test/integration/pullMerge/expected_remote/HEAD b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/pullMerge/expected_remote/HEAD rename to test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/HEAD diff --git a/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/ORIG_HEAD b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/ORIG_HEAD new file mode 100644 index 000000000..7c9ad8321 --- /dev/null +++ b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/ORIG_HEAD @@ -0,0 +1 @@ +c84375dda9d81c1f2103defe4384e31f859dac86 diff --git a/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/config b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/config new file mode 100644 index 000000000..3d6ea6c8d --- /dev/null +++ b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/config @@ -0,0 +1,21 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[user] + email = CI@example.com + name = CI +[push] + default = upstream +[remote "origin"] + url = ../origin + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "master"] + remote = origin + merge = refs/heads/master +[branch "other_branch"] + remote = origin + merge = refs/heads/other_branch diff --git a/test/integration/patchBuildingWithFiletree/expected/.git_keep/description b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/description similarity index 100% rename from test/integration/patchBuildingWithFiletree/expected/.git_keep/description rename to test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/description diff --git a/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/index b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/index new file mode 100644 index 000000000..9ec36686f Binary files /dev/null and b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/index differ diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/info/exclude b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/info/exclude rename to test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/info/exclude diff --git a/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/logs/HEAD b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..e6ba4297a --- /dev/null +++ b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,10 @@ +0000000000000000000000000000000000000000 81bdc116083cd4b4655333f4eb94dc0320197082 CI 1648349542 +1100 commit (initial): myfile1 +81bdc116083cd4b4655333f4eb94dc0320197082 49ea44f3ec1792142714930c8e4c3073f137936c CI 1648349542 +1100 commit: myfile2 +49ea44f3ec1792142714930c8e4c3073f137936c 49ea44f3ec1792142714930c8e4c3073f137936c CI 1648349542 +1100 checkout: moving from master to other_branch +49ea44f3ec1792142714930c8e4c3073f137936c 49ea44f3ec1792142714930c8e4c3073f137936c CI 1648349542 +1100 checkout: moving from other_branch to master +49ea44f3ec1792142714930c8e4c3073f137936c 486301f318c84045827013a3c3246b8c6a319eb8 CI 1648349542 +1100 commit: myfile3 +486301f318c84045827013a3c3246b8c6a319eb8 49ea44f3ec1792142714930c8e4c3073f137936c CI 1648349542 +1100 reset: moving to HEAD^ +49ea44f3ec1792142714930c8e4c3073f137936c 49ea44f3ec1792142714930c8e4c3073f137936c CI 1648349542 +1100 checkout: moving from master to other_branch +49ea44f3ec1792142714930c8e4c3073f137936c c84375dda9d81c1f2103defe4384e31f859dac86 CI 1648349542 +1100 commit: myfile4 +c84375dda9d81c1f2103defe4384e31f859dac86 49ea44f3ec1792142714930c8e4c3073f137936c CI 1648349542 +1100 reset: moving to HEAD^ +49ea44f3ec1792142714930c8e4c3073f137936c 49ea44f3ec1792142714930c8e4c3073f137936c CI 1648349542 +1100 checkout: moving from other_branch to master diff --git a/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..4e2739b8e --- /dev/null +++ b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,4 @@ +0000000000000000000000000000000000000000 81bdc116083cd4b4655333f4eb94dc0320197082 CI 1648349542 +1100 commit (initial): myfile1 +81bdc116083cd4b4655333f4eb94dc0320197082 49ea44f3ec1792142714930c8e4c3073f137936c CI 1648349542 +1100 commit: myfile2 +49ea44f3ec1792142714930c8e4c3073f137936c 486301f318c84045827013a3c3246b8c6a319eb8 CI 1648349542 +1100 commit: myfile3 +486301f318c84045827013a3c3246b8c6a319eb8 49ea44f3ec1792142714930c8e4c3073f137936c CI 1648349542 +1100 reset: moving to HEAD^ diff --git a/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/logs/refs/heads/other_branch b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/logs/refs/heads/other_branch new file mode 100644 index 000000000..efd57e6fd --- /dev/null +++ b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/logs/refs/heads/other_branch @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 49ea44f3ec1792142714930c8e4c3073f137936c CI 1648349542 +1100 branch: Created from HEAD +49ea44f3ec1792142714930c8e4c3073f137936c c84375dda9d81c1f2103defe4384e31f859dac86 CI 1648349542 +1100 commit: myfile4 +c84375dda9d81c1f2103defe4384e31f859dac86 49ea44f3ec1792142714930c8e4c3073f137936c CI 1648349542 +1100 reset: moving to HEAD^ diff --git a/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/logs/refs/remotes/origin/master b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/logs/refs/remotes/origin/master new file mode 100644 index 000000000..c08c7c66b --- /dev/null +++ b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/logs/refs/remotes/origin/master @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 49ea44f3ec1792142714930c8e4c3073f137936c CI 1648349542 +1100 fetch origin: storing head +49ea44f3ec1792142714930c8e4c3073f137936c 486301f318c84045827013a3c3246b8c6a319eb8 CI 1648349542 +1100 update by push +486301f318c84045827013a3c3246b8c6a319eb8 49ea44f3ec1792142714930c8e4c3073f137936c CI 1648349543 +1100 update by push diff --git a/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/logs/refs/remotes/origin/other_branch b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/logs/refs/remotes/origin/other_branch new file mode 100644 index 000000000..fd6564f9b --- /dev/null +++ b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/logs/refs/remotes/origin/other_branch @@ -0,0 +1,2 @@ +0000000000000000000000000000000000000000 49ea44f3ec1792142714930c8e4c3073f137936c CI 1648349542 +1100 fetch origin: storing head +49ea44f3ec1792142714930c8e4c3073f137936c c84375dda9d81c1f2103defe4384e31f859dac86 CI 1648349542 +1100 update by push diff --git a/test/integration/pullMerge/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/pullMerge/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/pull/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/pull/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/pullMerge/expected_remote/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/pullMerge/expected_remote/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/objects/48/6301f318c84045827013a3c3246b8c6a319eb8 b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/objects/48/6301f318c84045827013a3c3246b8c6a319eb8 new file mode 100644 index 000000000..c1564b80f Binary files /dev/null and b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/objects/48/6301f318c84045827013a3c3246b8c6a319eb8 differ diff --git a/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/objects/49/ea44f3ec1792142714930c8e4c3073f137936c b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/objects/49/ea44f3ec1792142714930c8e4c3073f137936c new file mode 100644 index 000000000..52bacd105 Binary files /dev/null and b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/objects/49/ea44f3ec1792142714930c8e4c3073f137936c differ diff --git a/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/objects/81/bdc116083cd4b4655333f4eb94dc0320197082 b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/objects/81/bdc116083cd4b4655333f4eb94dc0320197082 new file mode 100644 index 000000000..b9233622d --- /dev/null +++ b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/objects/81/bdc116083cd4b4655333f4eb94dc0320197082 @@ -0,0 +1,3 @@ +xŤÍA +0@Ń®sŠŮJ&Žc„R +®<ĆL¨ŕ‘ÚŰ×#tűyđS5[ ńĄŞŕ•SńÂË0jĚDŠ‘sÄ XZ¨ËLERśĽŰ«0Ípźć§~ÄöMo©Ú)v4öŕŠč˝;ë9iú'wö-ë¦č~3—,Ő \ No newline at end of file diff --git a/test/integration/pull/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/pull/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/pullMerge/expected_remote/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/pullMerge/expected_remote/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/objects/c8/4375dda9d81c1f2103defe4384e31f859dac86 b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/objects/c8/4375dda9d81c1f2103defe4384e31f859dac86 new file mode 100644 index 000000000..3054cb14b --- /dev/null +++ b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/objects/c8/4375dda9d81c1f2103defe4384e31f859dac86 @@ -0,0 +1,5 @@ +xŤÎM +0@á®sŠě %“óR +®<Ć8N¨`ŞH +ííëş}|‹'[­KłéŇU+ęĄ 9v> rô2uÓ\8„0e•™C2;új–˛2QAŮů”ŃIRt `ĚÄđ»=·ĂŁí‡ńˇ®űŞ7ŮęÝB „”;ňö +ŕś9ë9ŐôOnę·,«’ů‚ 9— \ No newline at end of file diff --git a/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/objects/ce/0848710343a75263ea72cb5bdfa666b9ecda68 b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/objects/ce/0848710343a75263ea72cb5bdfa666b9ecda68 new file mode 100644 index 000000000..5e9361d35 Binary files /dev/null and b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/objects/ce/0848710343a75263ea72cb5bdfa666b9ecda68 differ diff --git a/test/integration/pullMerge/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/pullMerge/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/refs/heads/master b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..f29b96944 --- /dev/null +++ b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +49ea44f3ec1792142714930c8e4c3073f137936c diff --git a/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/refs/heads/other_branch b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/refs/heads/other_branch new file mode 100644 index 000000000..f29b96944 --- /dev/null +++ b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/refs/heads/other_branch @@ -0,0 +1 @@ +49ea44f3ec1792142714930c8e4c3073f137936c diff --git a/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/refs/remotes/origin/master b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/refs/remotes/origin/master new file mode 100644 index 000000000..f29b96944 --- /dev/null +++ b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/refs/remotes/origin/master @@ -0,0 +1 @@ +49ea44f3ec1792142714930c8e4c3073f137936c diff --git a/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/refs/remotes/origin/other_branch b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/refs/remotes/origin/other_branch new file mode 100644 index 000000000..7c9ad8321 --- /dev/null +++ b/test/integration/forcePushMultipleUpstream/expected/repo/.git_keep/refs/remotes/origin/other_branch @@ -0,0 +1 @@ +c84375dda9d81c1f2103defe4384e31f859dac86 diff --git a/test/integration/pullAndSetUpstream/expected/myfile1 b/test/integration/forcePushMultipleUpstream/expected/repo/myfile1 similarity index 100% rename from test/integration/pullAndSetUpstream/expected/myfile1 rename to test/integration/forcePushMultipleUpstream/expected/repo/myfile1 diff --git a/test/integration/pullMerge/expected/myfile2 b/test/integration/forcePushMultipleUpstream/expected/repo/myfile2 similarity index 100% rename from test/integration/pullMerge/expected/myfile2 rename to test/integration/forcePushMultipleUpstream/expected/repo/myfile2 diff --git a/test/integration/forcePushMultipleUpstream/recording.json b/test/integration/forcePushMultipleUpstream/recording.json new file mode 100644 index 000000000..ae367f16d --- /dev/null +++ b/test/integration/forcePushMultipleUpstream/recording.json @@ -0,0 +1 @@ +{"KeyEvents":[{"Timestamp":892,"Mod":0,"Key":256,"Ch":80},{"Timestamp":1379,"Mod":0,"Key":13,"Ch":13},{"Timestamp":2132,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":135,"Height":36}]} \ No newline at end of file diff --git a/test/integration/forcePushMultipleUpstream/setup.sh b/test/integration/forcePushMultipleUpstream/setup.sh new file mode 100644 index 000000000..f31f24041 --- /dev/null +++ b/test/integration/forcePushMultipleUpstream/setup.sh @@ -0,0 +1,54 @@ +#!/bin/sh + +set -e + +set -e + +cd $1 + +git init + +git config user.email "CI@example.com" +git config user.name "CI" +git config push.default upstream + +echo test1 > myfile1 +git add . +git commit -am "myfile1" +echo test2 > myfile2 +git add . +git commit -am "myfile2" + +git checkout -b other_branch +git checkout master + +cd .. +git clone --bare ./repo origin + +cd repo + +git remote add origin ../origin +git fetch origin +git branch --set-upstream-to=origin/master master +git branch --set-upstream-to=origin/other_branch other_branch + +echo test3 > myfile3 +git add . +git commit -am "myfile3" + +git push origin master +git reset --hard HEAD^ + +git checkout other_branch + +echo test4 > myfile4 +git add . +git commit -am "myfile4" + +git push origin other_branch +git reset --hard HEAD^ + +git checkout master + +# at this point, both branches have diverged from their remote counterparts, meaning if you +# attempt to push either, it'll ask if you want to force push. diff --git a/test/integration/forcePushMultipleUpstream/test.json b/test/integration/forcePushMultipleUpstream/test.json new file mode 100644 index 000000000..4569d3cc9 --- /dev/null +++ b/test/integration/forcePushMultipleUpstream/test.json @@ -0,0 +1,4 @@ +{ + "description": "Force push to only one branch because the user has push.default upstream", + "speed": 10 +} diff --git a/test/integration/gitArg/expected/repo/.git_keep/COMMIT_EDITMSG b/test/integration/gitArg/expected/repo/.git_keep/COMMIT_EDITMSG new file mode 100644 index 000000000..907b30816 --- /dev/null +++ b/test/integration/gitArg/expected/repo/.git_keep/COMMIT_EDITMSG @@ -0,0 +1 @@ +blah diff --git a/test/integration/mergeConflictRevert/expected/.git_keep/FETCH_HEAD b/test/integration/gitArg/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/mergeConflictRevert/expected/.git_keep/FETCH_HEAD rename to test/integration/gitArg/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/pullMergeConflict/expected/.git_keep/HEAD b/test/integration/gitArg/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/pullMergeConflict/expected/.git_keep/HEAD rename to test/integration/gitArg/expected/repo/.git_keep/HEAD diff --git a/test/integration/initialOpen/expected/.git_keep/config b/test/integration/gitArg/expected/repo/.git_keep/config similarity index 100% rename from test/integration/initialOpen/expected/.git_keep/config rename to test/integration/gitArg/expected/repo/.git_keep/config diff --git a/test/integration/pull/expected/.git_keep/description b/test/integration/gitArg/expected/repo/.git_keep/description similarity index 100% rename from test/integration/pull/expected/.git_keep/description rename to test/integration/gitArg/expected/repo/.git_keep/description diff --git a/test/integration/gitArg/expected/repo/.git_keep/index b/test/integration/gitArg/expected/repo/.git_keep/index new file mode 100644 index 000000000..65d675154 Binary files /dev/null and b/test/integration/gitArg/expected/repo/.git_keep/index differ diff --git a/test/integration/mergeConflictsResolvedExternally/expected/.git_keep/info/exclude b/test/integration/gitArg/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/mergeConflictsResolvedExternally/expected/.git_keep/info/exclude rename to test/integration/gitArg/expected/repo/.git_keep/info/exclude diff --git a/test/integration/gitArg/expected/repo/.git_keep/logs/HEAD b/test/integration/gitArg/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..eaac3a34d --- /dev/null +++ b/test/integration/gitArg/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 45fe0608335366a31a1ad6dacbdcc6b17d31a5b6 CI 1654768290 +1000 commit (initial): blah +45fe0608335366a31a1ad6dacbdcc6b17d31a5b6 45fe0608335366a31a1ad6dacbdcc6b17d31a5b6 CI 1654768290 +1000 checkout: moving from master to other +45fe0608335366a31a1ad6dacbdcc6b17d31a5b6 45fe0608335366a31a1ad6dacbdcc6b17d31a5b6 CI 1654768291 +1000 checkout: moving from other to master diff --git a/test/integration/gitArg/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/gitArg/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..12b2c7ee4 --- /dev/null +++ b/test/integration/gitArg/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 45fe0608335366a31a1ad6dacbdcc6b17d31a5b6 CI 1654768290 +1000 commit (initial): blah diff --git a/test/integration/gitArg/expected/repo/.git_keep/logs/refs/heads/other b/test/integration/gitArg/expected/repo/.git_keep/logs/refs/heads/other new file mode 100644 index 000000000..d1b9aa145 --- /dev/null +++ b/test/integration/gitArg/expected/repo/.git_keep/logs/refs/heads/other @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 45fe0608335366a31a1ad6dacbdcc6b17d31a5b6 CI 1654768290 +1000 branch: Created from HEAD diff --git a/test/integration/gitArg/expected/repo/.git_keep/objects/45/fe0608335366a31a1ad6dacbdcc6b17d31a5b6 b/test/integration/gitArg/expected/repo/.git_keep/objects/45/fe0608335366a31a1ad6dacbdcc6b17d31a5b6 new file mode 100644 index 000000000..3171fbc5a Binary files /dev/null and b/test/integration/gitArg/expected/repo/.git_keep/objects/45/fe0608335366a31a1ad6dacbdcc6b17d31a5b6 differ diff --git a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 b/test/integration/gitArg/expected/repo/.git_keep/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/modules/other_repo/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 rename to test/integration/gitArg/expected/repo/.git_keep/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 diff --git a/test/integration/gitArg/expected/repo/.git_keep/refs/heads/master b/test/integration/gitArg/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..86a280f52 --- /dev/null +++ b/test/integration/gitArg/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +45fe0608335366a31a1ad6dacbdcc6b17d31a5b6 diff --git a/test/integration/gitArg/expected/repo/.git_keep/refs/heads/other b/test/integration/gitArg/expected/repo/.git_keep/refs/heads/other new file mode 100644 index 000000000..86a280f52 --- /dev/null +++ b/test/integration/gitArg/expected/repo/.git_keep/refs/heads/other @@ -0,0 +1 @@ +45fe0608335366a31a1ad6dacbdcc6b17d31a5b6 diff --git a/test/integration/gitArg/recording.json b/test/integration/gitArg/recording.json new file mode 100644 index 000000000..0a42da3cf --- /dev/null +++ b/test/integration/gitArg/recording.json @@ -0,0 +1 @@ +{"KeyEvents":[{"Timestamp":620,"Mod":0,"Key":258,"Ch":0},{"Timestamp":995,"Mod":0,"Key":256,"Ch":32},{"Timestamp":1865,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":272,"Height":74}]} \ No newline at end of file diff --git a/test/integration/gitArg/setup.sh b/test/integration/gitArg/setup.sh new file mode 100644 index 000000000..d71cc83e4 --- /dev/null +++ b/test/integration/gitArg/setup.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +set -e + +cd $1 + +git init + +git config user.email "CI@example.com" +git config user.name "CI" + +git commit --allow-empty -m "blah" + +git checkout -b other diff --git a/test/integration/gitArg/test.json b/test/integration/gitArg/test.json new file mode 100644 index 000000000..0261df3ea --- /dev/null +++ b/test/integration/gitArg/test.json @@ -0,0 +1,5 @@ +{ + "description": "Open lazygit to the branches panel", + "speed": 10, + "extraCmdArgs": "branch" +} diff --git a/test/integration/gitignoreMenu/expected/repo/.git_keep/COMMIT_EDITMSG b/test/integration/gitignoreMenu/expected/repo/.git_keep/COMMIT_EDITMSG new file mode 100644 index 000000000..5852f4463 --- /dev/null +++ b/test/integration/gitignoreMenu/expected/repo/.git_keep/COMMIT_EDITMSG @@ -0,0 +1 @@ +Initial commit diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/FETCH_HEAD b/test/integration/gitignoreMenu/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/FETCH_HEAD rename to test/integration/gitignoreMenu/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/pullMergeConflict/expected_remote/HEAD b/test/integration/gitignoreMenu/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/pullMergeConflict/expected_remote/HEAD rename to test/integration/gitignoreMenu/expected/repo/.git_keep/HEAD diff --git a/test/integration/switchTabFromMenu/expected/.git_keep/config b/test/integration/gitignoreMenu/expected/repo/.git_keep/config similarity index 100% rename from test/integration/switchTabFromMenu/expected/.git_keep/config rename to test/integration/gitignoreMenu/expected/repo/.git_keep/config diff --git a/test/integration/pull/expected_remote/description b/test/integration/gitignoreMenu/expected/repo/.git_keep/description similarity index 100% rename from test/integration/pull/expected_remote/description rename to test/integration/gitignoreMenu/expected/repo/.git_keep/description diff --git a/test/integration/gitignoreMenu/expected/repo/.git_keep/index b/test/integration/gitignoreMenu/expected/repo/.git_keep/index new file mode 100644 index 000000000..65d675154 Binary files /dev/null and b/test/integration/gitignoreMenu/expected/repo/.git_keep/index differ diff --git a/test/integration/gitignoreMenu/expected/repo/.git_keep/info/exclude b/test/integration/gitignoreMenu/expected/repo/.git_keep/info/exclude new file mode 100644 index 000000000..a5196d1be --- /dev/null +++ b/test/integration/gitignoreMenu/expected/repo/.git_keep/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/test/integration/gitignoreMenu/expected/repo/.git_keep/logs/HEAD b/test/integration/gitignoreMenu/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..329f08e98 --- /dev/null +++ b/test/integration/gitignoreMenu/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 04535177acab8a81c84b0b1b44ee3aea76b0e36e CI 1659528492 +0200 commit (initial): Initial commit diff --git a/test/integration/gitignoreMenu/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/gitignoreMenu/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..329f08e98 --- /dev/null +++ b/test/integration/gitignoreMenu/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 04535177acab8a81c84b0b1b44ee3aea76b0e36e CI 1659528492 +0200 commit (initial): Initial commit diff --git a/test/integration/gitignoreMenu/expected/repo/.git_keep/objects/04/535177acab8a81c84b0b1b44ee3aea76b0e36e b/test/integration/gitignoreMenu/expected/repo/.git_keep/objects/04/535177acab8a81c84b0b1b44ee3aea76b0e36e new file mode 100644 index 000000000..ff7e7bc39 Binary files /dev/null and b/test/integration/gitignoreMenu/expected/repo/.git_keep/objects/04/535177acab8a81c84b0b1b44ee3aea76b0e36e differ diff --git a/test/integration/gitignoreMenu/expected/repo/.git_keep/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 b/test/integration/gitignoreMenu/expected/repo/.git_keep/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 new file mode 100644 index 000000000..adf64119a Binary files /dev/null and b/test/integration/gitignoreMenu/expected/repo/.git_keep/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 differ diff --git a/test/integration/gitignoreMenu/expected/repo/.git_keep/refs/heads/master b/test/integration/gitignoreMenu/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..4725f5182 --- /dev/null +++ b/test/integration/gitignoreMenu/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +04535177acab8a81c84b0b1b44ee3aea76b0e36e diff --git a/test/integration/gitignoreMenu/expected/repo/lg_ignore_file b/test/integration/gitignoreMenu/expected/repo/lg_ignore_file new file mode 100644 index 000000000..3829ab872 --- /dev/null +++ b/test/integration/gitignoreMenu/expected/repo/lg_ignore_file @@ -0,0 +1 @@ +myfile1 diff --git a/test/integration/pullMerge/expected/myfile1 b/test/integration/gitignoreMenu/expected/repo/myfile1 similarity index 100% rename from test/integration/pullMerge/expected/myfile1 rename to test/integration/gitignoreMenu/expected/repo/myfile1 diff --git a/test/integration/gitignoreMenu/recording.json b/test/integration/gitignoreMenu/recording.json new file mode 100644 index 000000000..c1078e842 --- /dev/null +++ b/test/integration/gitignoreMenu/recording.json @@ -0,0 +1 @@ +{"KeyEvents":[{"Timestamp":1133,"Mod":0,"Key":256,"Ch":105},{"Timestamp":1927,"Mod":0,"Key":13,"Ch":13},{"Timestamp":2735,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":238,"Height":61}]} \ No newline at end of file diff --git a/test/integration/gitignoreMenu/setup.sh b/test/integration/gitignoreMenu/setup.sh new file mode 100644 index 000000000..2fb4f86bc --- /dev/null +++ b/test/integration/gitignoreMenu/setup.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +set -e + +cd $1 + +git init + +git config user.email "CI@example.com" +git config user.name "CI" + +git commit --allow-empty -m "Initial commit" + +echo test1 > myfile1 diff --git a/test/integration/gitignoreMenu/test.json b/test/integration/gitignoreMenu/test.json new file mode 100644 index 000000000..de26df98c --- /dev/null +++ b/test/integration/gitignoreMenu/test.json @@ -0,0 +1,4 @@ +{ + "description": "In this test a file is added to .gitingnore using the ignore or exclude menu", + "speed": 5 +} \ No newline at end of file diff --git a/test/integration/initialOpen/expected/.git_keep/COMMIT_EDITMSG b/test/integration/initialOpen/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/initialOpen/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/initialOpen/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/mergeConflicts/expected/.git_keep/FETCH_HEAD b/test/integration/initialOpen/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/FETCH_HEAD rename to test/integration/initialOpen/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/pullRebase/expected/.git_keep/HEAD b/test/integration/initialOpen/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/pullRebase/expected/.git_keep/HEAD rename to test/integration/initialOpen/expected/repo/.git_keep/HEAD diff --git a/test/integration/mergeConflictRevert/expected/.git_keep/config b/test/integration/initialOpen/expected/repo/.git_keep/config similarity index 100% rename from test/integration/mergeConflictRevert/expected/.git_keep/config rename to test/integration/initialOpen/expected/repo/.git_keep/config diff --git a/test/integration/pullAndSetUpstream/expected/.git_keep/description b/test/integration/initialOpen/expected/repo/.git_keep/description similarity index 100% rename from test/integration/pullAndSetUpstream/expected/.git_keep/description rename to test/integration/initialOpen/expected/repo/.git_keep/description diff --git a/test/integration/initialOpen/expected/.git_keep/index b/test/integration/initialOpen/expected/repo/.git_keep/index similarity index 100% rename from test/integration/initialOpen/expected/.git_keep/index rename to test/integration/initialOpen/expected/repo/.git_keep/index diff --git a/test/integration/patchBuilding/expected/.git_keep/info/exclude b/test/integration/initialOpen/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/patchBuilding/expected/.git_keep/info/exclude rename to test/integration/initialOpen/expected/repo/.git_keep/info/exclude diff --git a/test/integration/initialOpen/expected/.git_keep/logs/HEAD b/test/integration/initialOpen/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/initialOpen/expected/.git_keep/logs/HEAD rename to test/integration/initialOpen/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/initialOpen/expected/.git_keep/logs/refs/heads/master b/test/integration/initialOpen/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/initialOpen/expected/.git_keep/logs/refs/heads/master rename to test/integration/initialOpen/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/pullMerge/expected_remote/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/initialOpen/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/pullMerge/expected_remote/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/initialOpen/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/initialOpen/expected/.git_keep/objects/46/f86259c48ec60496e43d9c962e32f40e7cdefb b/test/integration/initialOpen/expected/repo/.git_keep/objects/46/f86259c48ec60496e43d9c962e32f40e7cdefb similarity index 100% rename from test/integration/initialOpen/expected/.git_keep/objects/46/f86259c48ec60496e43d9c962e32f40e7cdefb rename to test/integration/initialOpen/expected/repo/.git_keep/objects/46/f86259c48ec60496e43d9c962e32f40e7cdefb diff --git a/test/integration/initialOpen/expected/.git_keep/objects/62/b35f5751dd871e0908247223d276b5efeb4cb4 b/test/integration/initialOpen/expected/repo/.git_keep/objects/62/b35f5751dd871e0908247223d276b5efeb4cb4 similarity index 100% rename from test/integration/initialOpen/expected/.git_keep/objects/62/b35f5751dd871e0908247223d276b5efeb4cb4 rename to test/integration/initialOpen/expected/repo/.git_keep/objects/62/b35f5751dd871e0908247223d276b5efeb4cb4 diff --git a/test/integration/pull/expected_remote/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/initialOpen/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/pull/expected_remote/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/initialOpen/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/initialOpen/expected/.git_keep/objects/e4/776798a2a73374b45e6321b60b5578b9fb590c b/test/integration/initialOpen/expected/repo/.git_keep/objects/e4/776798a2a73374b45e6321b60b5578b9fb590c similarity index 100% rename from test/integration/initialOpen/expected/.git_keep/objects/e4/776798a2a73374b45e6321b60b5578b9fb590c rename to test/integration/initialOpen/expected/repo/.git_keep/objects/e4/776798a2a73374b45e6321b60b5578b9fb590c diff --git a/test/integration/initialOpen/expected/.git_keep/refs/heads/master b/test/integration/initialOpen/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/initialOpen/expected/.git_keep/refs/heads/master rename to test/integration/initialOpen/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/pullMergeConflict/expected/myfile1 b/test/integration/initialOpen/expected/repo/myfile1 similarity index 100% rename from test/integration/pullMergeConflict/expected/myfile1 rename to test/integration/initialOpen/expected/repo/myfile1 diff --git a/test/integration/initialOpen/expected/myfile2 b/test/integration/initialOpen/expected/repo/myfile2 similarity index 100% rename from test/integration/initialOpen/expected/myfile2 rename to test/integration/initialOpen/expected/repo/myfile2 diff --git a/test/integration/mergeConflictRevert/expected/.git_keep/COMMIT_EDITMSG b/test/integration/mergeConflictRevert/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/mergeConflictRevert/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/mergeConflictRevert/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/FETCH_HEAD b/test/integration/mergeConflictRevert/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/FETCH_HEAD rename to test/integration/mergeConflictRevert/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/mergeConflictRevert/expected/.git_keep/HEAD b/test/integration/mergeConflictRevert/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/mergeConflictRevert/expected/.git_keep/HEAD rename to test/integration/mergeConflictRevert/expected/repo/.git_keep/HEAD diff --git a/test/integration/mergeConflictRevert/expected/.git_keep/ORIG_HEAD b/test/integration/mergeConflictRevert/expected/repo/.git_keep/ORIG_HEAD similarity index 100% rename from test/integration/mergeConflictRevert/expected/.git_keep/ORIG_HEAD rename to test/integration/mergeConflictRevert/expected/repo/.git_keep/ORIG_HEAD diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/config b/test/integration/mergeConflictRevert/expected/repo/.git_keep/config similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/config rename to test/integration/mergeConflictRevert/expected/repo/.git_keep/config diff --git a/test/integration/pullAndSetUpstream/expected_remote/description b/test/integration/mergeConflictRevert/expected/repo/.git_keep/description similarity index 100% rename from test/integration/pullAndSetUpstream/expected_remote/description rename to test/integration/mergeConflictRevert/expected/repo/.git_keep/description diff --git a/test/integration/mergeConflictRevert/expected/.git_keep/index b/test/integration/mergeConflictRevert/expected/repo/.git_keep/index similarity index 100% rename from test/integration/mergeConflictRevert/expected/.git_keep/index rename to test/integration/mergeConflictRevert/expected/repo/.git_keep/index diff --git a/test/integration/patchBuilding2/expected/.git_keep/info/exclude b/test/integration/mergeConflictRevert/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/patchBuilding2/expected/.git_keep/info/exclude rename to test/integration/mergeConflictRevert/expected/repo/.git_keep/info/exclude diff --git a/test/integration/mergeConflictRevert/expected/.git_keep/logs/HEAD b/test/integration/mergeConflictRevert/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/mergeConflictRevert/expected/.git_keep/logs/HEAD rename to test/integration/mergeConflictRevert/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/mergeConflictRevert/expected/.git_keep/logs/refs/heads/another b/test/integration/mergeConflictRevert/expected/repo/.git_keep/logs/refs/heads/another similarity index 100% rename from test/integration/mergeConflictRevert/expected/.git_keep/logs/refs/heads/another rename to test/integration/mergeConflictRevert/expected/repo/.git_keep/logs/refs/heads/another diff --git a/test/integration/mergeConflictRevert/expected/.git_keep/logs/refs/heads/master b/test/integration/mergeConflictRevert/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/mergeConflictRevert/expected/.git_keep/logs/refs/heads/master rename to test/integration/mergeConflictRevert/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/mergeConflictRevert/expected/.git_keep/logs/refs/heads/other b/test/integration/mergeConflictRevert/expected/repo/.git_keep/logs/refs/heads/other similarity index 100% rename from test/integration/mergeConflictRevert/expected/.git_keep/logs/refs/heads/other rename to test/integration/mergeConflictRevert/expected/repo/.git_keep/logs/refs/heads/other diff --git a/test/integration/mergeConflictRevert/expected/.git_keep/objects/1e/7d643e0db24ebee10f92aa2f8099d50dbe0f0f b/test/integration/mergeConflictRevert/expected/repo/.git_keep/objects/1e/7d643e0db24ebee10f92aa2f8099d50dbe0f0f similarity index 100% rename from test/integration/mergeConflictRevert/expected/.git_keep/objects/1e/7d643e0db24ebee10f92aa2f8099d50dbe0f0f rename to test/integration/mergeConflictRevert/expected/repo/.git_keep/objects/1e/7d643e0db24ebee10f92aa2f8099d50dbe0f0f diff --git a/test/integration/mergeConflictRevert/expected/.git_keep/objects/3c/3594b2fd655fb7ffe36077ee8a9c3f79fb5fc6 b/test/integration/mergeConflictRevert/expected/repo/.git_keep/objects/3c/3594b2fd655fb7ffe36077ee8a9c3f79fb5fc6 similarity index 100% rename from test/integration/mergeConflictRevert/expected/.git_keep/objects/3c/3594b2fd655fb7ffe36077ee8a9c3f79fb5fc6 rename to test/integration/mergeConflictRevert/expected/repo/.git_keep/objects/3c/3594b2fd655fb7ffe36077ee8a9c3f79fb5fc6 diff --git a/test/integration/mergeConflictRevert/expected/.git_keep/objects/41/bed9f222cc54e68d7846dc010bea6d23bea33e b/test/integration/mergeConflictRevert/expected/repo/.git_keep/objects/41/bed9f222cc54e68d7846dc010bea6d23bea33e similarity index 100% rename from test/integration/mergeConflictRevert/expected/.git_keep/objects/41/bed9f222cc54e68d7846dc010bea6d23bea33e rename to test/integration/mergeConflictRevert/expected/repo/.git_keep/objects/41/bed9f222cc54e68d7846dc010bea6d23bea33e diff --git a/test/integration/mergeConflictRevert/expected/.git_keep/objects/61/3e54e7fd6e080d53ef44c18ecd33c545ac0e08 b/test/integration/mergeConflictRevert/expected/repo/.git_keep/objects/61/3e54e7fd6e080d53ef44c18ecd33c545ac0e08 similarity index 100% rename from test/integration/mergeConflictRevert/expected/.git_keep/objects/61/3e54e7fd6e080d53ef44c18ecd33c545ac0e08 rename to test/integration/mergeConflictRevert/expected/repo/.git_keep/objects/61/3e54e7fd6e080d53ef44c18ecd33c545ac0e08 diff --git a/test/integration/mergeConflictRevert/expected/.git_keep/objects/89/8618af3fef6edf472d0f4a483ed8010d7bcfbb b/test/integration/mergeConflictRevert/expected/repo/.git_keep/objects/89/8618af3fef6edf472d0f4a483ed8010d7bcfbb similarity index 100% rename from test/integration/mergeConflictRevert/expected/.git_keep/objects/89/8618af3fef6edf472d0f4a483ed8010d7bcfbb rename to test/integration/mergeConflictRevert/expected/repo/.git_keep/objects/89/8618af3fef6edf472d0f4a483ed8010d7bcfbb diff --git a/test/integration/mergeConflictRevert/expected/.git_keep/objects/98/f656b294e5f3b447e3fd66814a80d0d4080627 b/test/integration/mergeConflictRevert/expected/repo/.git_keep/objects/98/f656b294e5f3b447e3fd66814a80d0d4080627 similarity index 100% rename from test/integration/mergeConflictRevert/expected/.git_keep/objects/98/f656b294e5f3b447e3fd66814a80d0d4080627 rename to test/integration/mergeConflictRevert/expected/repo/.git_keep/objects/98/f656b294e5f3b447e3fd66814a80d0d4080627 diff --git a/test/integration/mergeConflictRevert/expected/.git_keep/objects/9d/aeafb9864cf43055ae93beb0afd6c7d144bfa4 b/test/integration/mergeConflictRevert/expected/repo/.git_keep/objects/9d/aeafb9864cf43055ae93beb0afd6c7d144bfa4 similarity index 100% rename from test/integration/mergeConflictRevert/expected/.git_keep/objects/9d/aeafb9864cf43055ae93beb0afd6c7d144bfa4 rename to test/integration/mergeConflictRevert/expected/repo/.git_keep/objects/9d/aeafb9864cf43055ae93beb0afd6c7d144bfa4 diff --git a/test/integration/mergeConflictRevert/expected/.git_keep/objects/a4/942a576eec3a1a15fb790c942b6860331bee32 b/test/integration/mergeConflictRevert/expected/repo/.git_keep/objects/a4/942a576eec3a1a15fb790c942b6860331bee32 similarity index 100% rename from test/integration/mergeConflictRevert/expected/.git_keep/objects/a4/942a576eec3a1a15fb790c942b6860331bee32 rename to test/integration/mergeConflictRevert/expected/repo/.git_keep/objects/a4/942a576eec3a1a15fb790c942b6860331bee32 diff --git a/test/integration/mergeConflictRevert/expected/.git_keep/objects/a7/fd052c52f174943cdea637f2d11f5ab7d090cd b/test/integration/mergeConflictRevert/expected/repo/.git_keep/objects/a7/fd052c52f174943cdea637f2d11f5ab7d090cd similarity index 100% rename from test/integration/mergeConflictRevert/expected/.git_keep/objects/a7/fd052c52f174943cdea637f2d11f5ab7d090cd rename to test/integration/mergeConflictRevert/expected/repo/.git_keep/objects/a7/fd052c52f174943cdea637f2d11f5ab7d090cd diff --git a/test/integration/mergeConflictRevert/expected/.git_keep/objects/ba/4581dc53b5b2ff56803651dfd79245203d546b b/test/integration/mergeConflictRevert/expected/repo/.git_keep/objects/ba/4581dc53b5b2ff56803651dfd79245203d546b similarity index 100% rename from test/integration/mergeConflictRevert/expected/.git_keep/objects/ba/4581dc53b5b2ff56803651dfd79245203d546b rename to test/integration/mergeConflictRevert/expected/repo/.git_keep/objects/ba/4581dc53b5b2ff56803651dfd79245203d546b diff --git a/test/integration/mergeConflictRevert/expected/.git_keep/objects/be/5b46b808c9c808be26710daeb2ce9ed2c7a070 b/test/integration/mergeConflictRevert/expected/repo/.git_keep/objects/be/5b46b808c9c808be26710daeb2ce9ed2c7a070 similarity index 100% rename from test/integration/mergeConflictRevert/expected/.git_keep/objects/be/5b46b808c9c808be26710daeb2ce9ed2c7a070 rename to test/integration/mergeConflictRevert/expected/repo/.git_keep/objects/be/5b46b808c9c808be26710daeb2ce9ed2c7a070 diff --git a/test/integration/mergeConflictRevert/expected/.git_keep/objects/c5/af43f6cc1d51ebb3ab4800347595541f81799c b/test/integration/mergeConflictRevert/expected/repo/.git_keep/objects/c5/af43f6cc1d51ebb3ab4800347595541f81799c similarity index 100% rename from test/integration/mergeConflictRevert/expected/.git_keep/objects/c5/af43f6cc1d51ebb3ab4800347595541f81799c rename to test/integration/mergeConflictRevert/expected/repo/.git_keep/objects/c5/af43f6cc1d51ebb3ab4800347595541f81799c diff --git a/test/integration/mergeConflictRevert/expected/.git_keep/objects/d3/b35176a575d48743900b1f0863cefbc198f84c b/test/integration/mergeConflictRevert/expected/repo/.git_keep/objects/d3/b35176a575d48743900b1f0863cefbc198f84c similarity index 100% rename from test/integration/mergeConflictRevert/expected/.git_keep/objects/d3/b35176a575d48743900b1f0863cefbc198f84c rename to test/integration/mergeConflictRevert/expected/repo/.git_keep/objects/d3/b35176a575d48743900b1f0863cefbc198f84c diff --git a/test/integration/mergeConflictRevert/expected/.git_keep/objects/dd/ad764e9e78b555cd41e5e81f8ce969cfa3972c b/test/integration/mergeConflictRevert/expected/repo/.git_keep/objects/dd/ad764e9e78b555cd41e5e81f8ce969cfa3972c similarity index 100% rename from test/integration/mergeConflictRevert/expected/.git_keep/objects/dd/ad764e9e78b555cd41e5e81f8ce969cfa3972c rename to test/integration/mergeConflictRevert/expected/repo/.git_keep/objects/dd/ad764e9e78b555cd41e5e81f8ce969cfa3972c diff --git a/test/integration/mergeConflictRevert/expected/.git_keep/objects/e5/265503c8aea2860fc4754c1025e4597530ce0e b/test/integration/mergeConflictRevert/expected/repo/.git_keep/objects/e5/265503c8aea2860fc4754c1025e4597530ce0e similarity index 100% rename from test/integration/mergeConflictRevert/expected/.git_keep/objects/e5/265503c8aea2860fc4754c1025e4597530ce0e rename to test/integration/mergeConflictRevert/expected/repo/.git_keep/objects/e5/265503c8aea2860fc4754c1025e4597530ce0e diff --git a/test/integration/mergeConflictRevert/expected/.git_keep/objects/fa/0b6bf64815f57729716334319596c926b6564a b/test/integration/mergeConflictRevert/expected/repo/.git_keep/objects/fa/0b6bf64815f57729716334319596c926b6564a similarity index 100% rename from test/integration/mergeConflictRevert/expected/.git_keep/objects/fa/0b6bf64815f57729716334319596c926b6564a rename to test/integration/mergeConflictRevert/expected/repo/.git_keep/objects/fa/0b6bf64815f57729716334319596c926b6564a diff --git a/test/integration/mergeConflictRevert/expected/.git_keep/refs/heads/another b/test/integration/mergeConflictRevert/expected/repo/.git_keep/refs/heads/another similarity index 100% rename from test/integration/mergeConflictRevert/expected/.git_keep/refs/heads/another rename to test/integration/mergeConflictRevert/expected/repo/.git_keep/refs/heads/another diff --git a/test/integration/mergeConflictRevert/expected/.git_keep/refs/heads/master b/test/integration/mergeConflictRevert/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/mergeConflictRevert/expected/.git_keep/refs/heads/master rename to test/integration/mergeConflictRevert/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/mergeConflictRevert/expected/.git_keep/refs/heads/other b/test/integration/mergeConflictRevert/expected/repo/.git_keep/refs/heads/other similarity index 100% rename from test/integration/mergeConflictRevert/expected/.git_keep/refs/heads/other rename to test/integration/mergeConflictRevert/expected/repo/.git_keep/refs/heads/other diff --git a/test/integration/mergeConflictRevert/expected/file1 b/test/integration/mergeConflictRevert/expected/repo/file1 similarity index 100% rename from test/integration/mergeConflictRevert/expected/file1 rename to test/integration/mergeConflictRevert/expected/repo/file1 diff --git a/test/integration/mergeConflictRevert/expected/file2 b/test/integration/mergeConflictRevert/expected/repo/file2 similarity index 100% rename from test/integration/mergeConflictRevert/expected/file2 rename to test/integration/mergeConflictRevert/expected/repo/file2 diff --git a/test/integration/mergeConflictRevert/expected/file4 b/test/integration/mergeConflictRevert/expected/repo/file4 similarity index 100% rename from test/integration/mergeConflictRevert/expected/file4 rename to test/integration/mergeConflictRevert/expected/repo/file4 diff --git a/test/integration/mergeConflictRevert/expected/file5 b/test/integration/mergeConflictRevert/expected/repo/file5 similarity index 100% rename from test/integration/mergeConflictRevert/expected/file5 rename to test/integration/mergeConflictRevert/expected/repo/file5 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/COMMIT_EDITMSG b/test/integration/mergeConflictUndo/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/mergeConflictsResolvedExternally/expected/.git_keep/FETCH_HEAD b/test/integration/mergeConflictUndo/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/mergeConflictsResolvedExternally/expected/.git_keep/FETCH_HEAD rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/HEAD b/test/integration/mergeConflictUndo/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/HEAD rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/HEAD diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/MERGE_HEAD b/test/integration/mergeConflictUndo/expected/repo/.git_keep/MERGE_HEAD similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/MERGE_HEAD rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/MERGE_HEAD diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/MERGE_MODE b/test/integration/mergeConflictUndo/expected/repo/.git_keep/MERGE_MODE similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/MERGE_MODE rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/MERGE_MODE diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/MERGE_MSG b/test/integration/mergeConflictUndo/expected/repo/.git_keep/MERGE_MSG similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/MERGE_MSG rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/MERGE_MSG diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/ORIG_HEAD b/test/integration/mergeConflictUndo/expected/repo/.git_keep/ORIG_HEAD similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/ORIG_HEAD rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/ORIG_HEAD diff --git a/test/integration/mergeConflicts/expected/.git_keep/config b/test/integration/mergeConflictUndo/expected/repo/.git_keep/config similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/config rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/config diff --git a/test/integration/pullMerge/expected/.git_keep/description b/test/integration/mergeConflictUndo/expected/repo/.git_keep/description similarity index 100% rename from test/integration/pullMerge/expected/.git_keep/description rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/description diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/index b/test/integration/mergeConflictUndo/expected/repo/.git_keep/index similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/index rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/index diff --git a/test/integration/patchBuildingWithFiletree/expected/.git_keep/info/exclude b/test/integration/mergeConflictUndo/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/patchBuildingWithFiletree/expected/.git_keep/info/exclude rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/info/exclude diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/logs/HEAD b/test/integration/mergeConflictUndo/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/logs/HEAD rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/logs/refs/heads/base_branch b/test/integration/mergeConflictUndo/expected/repo/.git_keep/logs/refs/heads/base_branch similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/logs/refs/heads/base_branch rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/logs/refs/heads/base_branch diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/logs/refs/heads/develop b/test/integration/mergeConflictUndo/expected/repo/.git_keep/logs/refs/heads/develop similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/logs/refs/heads/develop rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/logs/refs/heads/develop diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/logs/refs/heads/feature/cherry-picking b/test/integration/mergeConflictUndo/expected/repo/.git_keep/logs/refs/heads/feature/cherry-picking similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/logs/refs/heads/feature/cherry-picking rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/logs/refs/heads/feature/cherry-picking diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/logs/refs/heads/master b/test/integration/mergeConflictUndo/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/logs/refs/heads/master rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/logs/refs/heads/other_branch b/test/integration/mergeConflictUndo/expected/repo/.git_keep/logs/refs/heads/other_branch similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/logs/refs/heads/other_branch rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/logs/refs/heads/other_branch diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/08/e2576bb7cd0dd9be54f9a523c4bedea0643557 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/08/e2576bb7cd0dd9be54f9a523c4bedea0643557 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/08/e2576bb7cd0dd9be54f9a523c4bedea0643557 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/08/e2576bb7cd0dd9be54f9a523c4bedea0643557 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/09/cbe8c6717c06a61876b7b641a46a62bf3c585d b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/09/cbe8c6717c06a61876b7b641a46a62bf3c585d similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/09/cbe8c6717c06a61876b7b641a46a62bf3c585d rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/09/cbe8c6717c06a61876b7b641a46a62bf3c585d diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/17/3a40ed58e33060166ccbfb7d0ccc0387be5f09 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/17/3a40ed58e33060166ccbfb7d0ccc0387be5f09 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/17/3a40ed58e33060166ccbfb7d0ccc0387be5f09 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/17/3a40ed58e33060166ccbfb7d0ccc0387be5f09 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/17/4a8c9444cfa700682d74059d9fa9be5749242c b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/17/4a8c9444cfa700682d74059d9fa9be5749242c similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/17/4a8c9444cfa700682d74059d9fa9be5749242c rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/17/4a8c9444cfa700682d74059d9fa9be5749242c diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/17/dc45dd142947e06cf7e635d62f2c0acbb86da7 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/17/dc45dd142947e06cf7e635d62f2c0acbb86da7 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/17/dc45dd142947e06cf7e635d62f2c0acbb86da7 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/17/dc45dd142947e06cf7e635d62f2c0acbb86da7 diff --git a/test/integration/pullAndSetUpstream/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/pullAndSetUpstream/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/18/c07ac9568c564ececb199f78f64babc92214cb b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/18/c07ac9568c564ececb199f78f64babc92214cb similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/18/c07ac9568c564ececb199f78f64babc92214cb rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/18/c07ac9568c564ececb199f78f64babc92214cb diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/18/f469bc737f6c2a589205e2ddefceb32a7cc3a7 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/18/f469bc737f6c2a589205e2ddefceb32a7cc3a7 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/18/f469bc737f6c2a589205e2ddefceb32a7cc3a7 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/18/f469bc737f6c2a589205e2ddefceb32a7cc3a7 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/1b/9ae5f5dff631baaa180a30afd9983f83dc27ca b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/1b/9ae5f5dff631baaa180a30afd9983f83dc27ca similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/1b/9ae5f5dff631baaa180a30afd9983f83dc27ca rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/1b/9ae5f5dff631baaa180a30afd9983f83dc27ca diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/20/85c8dd0a80e95ed959e4db2ab98f66b970ad77 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/20/85c8dd0a80e95ed959e4db2ab98f66b970ad77 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/20/85c8dd0a80e95ed959e4db2ab98f66b970ad77 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/20/85c8dd0a80e95ed959e4db2ab98f66b970ad77 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/21/78af7503938665881174069be4d48fa483e4af b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/21/78af7503938665881174069be4d48fa483e4af similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/21/78af7503938665881174069be4d48fa483e4af rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/21/78af7503938665881174069be4d48fa483e4af diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/22/b0fd807dd5e428c2d818aef6a2311d7c11e885 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/22/b0fd807dd5e428c2d818aef6a2311d7c11e885 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/22/b0fd807dd5e428c2d818aef6a2311d7c11e885 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/22/b0fd807dd5e428c2d818aef6a2311d7c11e885 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/24/10ee12b940bade9d9e99413732faa6dc60adb1 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/24/10ee12b940bade9d9e99413732faa6dc60adb1 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/24/10ee12b940bade9d9e99413732faa6dc60adb1 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/24/10ee12b940bade9d9e99413732faa6dc60adb1 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/24/6f7487e08e6330ccbec4053e701145d53f64d4 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/24/6f7487e08e6330ccbec4053e701145d53f64d4 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/24/6f7487e08e6330ccbec4053e701145d53f64d4 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/24/6f7487e08e6330ccbec4053e701145d53f64d4 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/27/94411aa7b73b44f533fb862cdb9dbfd13c5d92 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/27/94411aa7b73b44f533fb862cdb9dbfd13c5d92 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/27/94411aa7b73b44f533fb862cdb9dbfd13c5d92 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/27/94411aa7b73b44f533fb862cdb9dbfd13c5d92 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/27/9f068805e089660f7ddd17ff32f66100e0dca5 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/27/9f068805e089660f7ddd17ff32f66100e0dca5 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/27/9f068805e089660f7ddd17ff32f66100e0dca5 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/27/9f068805e089660f7ddd17ff32f66100e0dca5 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/2e/cced19ece4424e0d3f26eb3ea2ccb6bfeafaa8 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/2e/cced19ece4424e0d3f26eb3ea2ccb6bfeafaa8 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/2e/cced19ece4424e0d3f26eb3ea2ccb6bfeafaa8 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/2e/cced19ece4424e0d3f26eb3ea2ccb6bfeafaa8 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/31/f2a971f823279ba1ef877be7599da288f6e24b b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/31/f2a971f823279ba1ef877be7599da288f6e24b similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/31/f2a971f823279ba1ef877be7599da288f6e24b rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/31/f2a971f823279ba1ef877be7599da288f6e24b diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/32/d15fd4451b6693a93d6420c8af6cfc99348e71 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/32/d15fd4451b6693a93d6420c8af6cfc99348e71 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/32/d15fd4451b6693a93d6420c8af6cfc99348e71 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/32/d15fd4451b6693a93d6420c8af6cfc99348e71 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/34/c74161eef968fc951cf170a011fa8abfeddbcd b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/34/c74161eef968fc951cf170a011fa8abfeddbcd similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/34/c74161eef968fc951cf170a011fa8abfeddbcd rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/34/c74161eef968fc951cf170a011fa8abfeddbcd diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/36/e0ef3e52c6e29e64980c71defbab6064d2da8c b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/36/e0ef3e52c6e29e64980c71defbab6064d2da8c similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/36/e0ef3e52c6e29e64980c71defbab6064d2da8c rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/36/e0ef3e52c6e29e64980c71defbab6064d2da8c diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/38/08a710b52a152bb73805fe274e0d877cf61800 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/38/08a710b52a152bb73805fe274e0d877cf61800 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/38/08a710b52a152bb73805fe274e0d877cf61800 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/38/08a710b52a152bb73805fe274e0d877cf61800 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/3d/1213374cd86b841f034768571d0b5f2c870a16 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/3d/1213374cd86b841f034768571d0b5f2c870a16 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/3d/1213374cd86b841f034768571d0b5f2c870a16 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/3d/1213374cd86b841f034768571d0b5f2c870a16 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/44/2a53c1b023b4816085fdc4eaa85d0c5fd897e2 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/44/2a53c1b023b4816085fdc4eaa85d0c5fd897e2 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/44/2a53c1b023b4816085fdc4eaa85d0c5fd897e2 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/44/2a53c1b023b4816085fdc4eaa85d0c5fd897e2 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/4e/5d3ae0b6e865073bcbd79531a75c55bf7bfcb4 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/4e/5d3ae0b6e865073bcbd79531a75c55bf7bfcb4 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/4e/5d3ae0b6e865073bcbd79531a75c55bf7bfcb4 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/4e/5d3ae0b6e865073bcbd79531a75c55bf7bfcb4 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/4f/80ec0c7b09eeeb580d0c19947477c02bc88c25 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/4f/80ec0c7b09eeeb580d0c19947477c02bc88c25 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/4f/80ec0c7b09eeeb580d0c19947477c02bc88c25 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/4f/80ec0c7b09eeeb580d0c19947477c02bc88c25 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/5d/874a902548f753e50944827e572a7470aa9731 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/5d/874a902548f753e50944827e572a7470aa9731 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/5d/874a902548f753e50944827e572a7470aa9731 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/5d/874a902548f753e50944827e572a7470aa9731 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/5d/a4d9200457542d875fe4def54ac98c16332db0 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/5d/a4d9200457542d875fe4def54ac98c16332db0 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/5d/a4d9200457542d875fe4def54ac98c16332db0 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/5d/a4d9200457542d875fe4def54ac98c16332db0 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/5d/c2e019349371e9b3e4f1be99754ba70094cad6 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/5d/c2e019349371e9b3e4f1be99754ba70094cad6 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/5d/c2e019349371e9b3e4f1be99754ba70094cad6 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/5d/c2e019349371e9b3e4f1be99754ba70094cad6 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/5f/3e4598b46a912f0f95a4898743e979343c82f3 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/5f/3e4598b46a912f0f95a4898743e979343c82f3 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/5f/3e4598b46a912f0f95a4898743e979343c82f3 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/5f/3e4598b46a912f0f95a4898743e979343c82f3 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/60/91d709b275e712111d016d9b3a4fb44e63f1f6 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/60/91d709b275e712111d016d9b3a4fb44e63f1f6 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/60/91d709b275e712111d016d9b3a4fb44e63f1f6 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/60/91d709b275e712111d016d9b3a4fb44e63f1f6 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/61/01e935461d4cd862ae4a720846e87880d198b9 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/61/01e935461d4cd862ae4a720846e87880d198b9 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/61/01e935461d4cd862ae4a720846e87880d198b9 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/61/01e935461d4cd862ae4a720846e87880d198b9 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/68/7ff9526e0d56fafe1445ee4c182a83afc3cc35 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/68/7ff9526e0d56fafe1445ee4c182a83afc3cc35 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/68/7ff9526e0d56fafe1445ee4c182a83afc3cc35 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/68/7ff9526e0d56fafe1445ee4c182a83afc3cc35 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/6d/fbfa4bd19cb38608681df40ebb3a78bd13a824 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/6d/fbfa4bd19cb38608681df40ebb3a78bd13a824 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/6d/fbfa4bd19cb38608681df40ebb3a78bd13a824 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/6d/fbfa4bd19cb38608681df40ebb3a78bd13a824 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/78/3666de4acbb22a9efc205197667f5136118c54 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/78/3666de4acbb22a9efc205197667f5136118c54 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/78/3666de4acbb22a9efc205197667f5136118c54 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/78/3666de4acbb22a9efc205197667f5136118c54 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/7b/c178be031c4645110e9accb4accf16902d2d7f b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/7b/c178be031c4645110e9accb4accf16902d2d7f similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/7b/c178be031c4645110e9accb4accf16902d2d7f rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/7b/c178be031c4645110e9accb4accf16902d2d7f diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/82/db6d0e4502f489719ea0f3dbe7e14413c6d28a b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/82/db6d0e4502f489719ea0f3dbe7e14413c6d28a similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/82/db6d0e4502f489719ea0f3dbe7e14413c6d28a rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/82/db6d0e4502f489719ea0f3dbe7e14413c6d28a diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/88/9b0fdfe5f2ae3d7df3066f3bc1e181fa712c8d b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/88/9b0fdfe5f2ae3d7df3066f3bc1e181fa712c8d similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/88/9b0fdfe5f2ae3d7df3066f3bc1e181fa712c8d rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/88/9b0fdfe5f2ae3d7df3066f3bc1e181fa712c8d diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/88/c39cdc29c995f8e1a63ccd48e7bbd6d96cb8b8 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/88/c39cdc29c995f8e1a63ccd48e7bbd6d96cb8b8 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/88/c39cdc29c995f8e1a63ccd48e7bbd6d96cb8b8 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/88/c39cdc29c995f8e1a63ccd48e7bbd6d96cb8b8 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/8c/d762c119834784fdbf97e9bb3b4c15e804ebaa b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/8c/d762c119834784fdbf97e9bb3b4c15e804ebaa similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/8c/d762c119834784fdbf97e9bb3b4c15e804ebaa rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/8c/d762c119834784fdbf97e9bb3b4c15e804ebaa diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/90/a84fd62f8033027fab3e567a81d5ed2a6a71cd b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/90/a84fd62f8033027fab3e567a81d5ed2a6a71cd similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/90/a84fd62f8033027fab3e567a81d5ed2a6a71cd rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/90/a84fd62f8033027fab3e567a81d5ed2a6a71cd diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/91/65a12a95d3b2b9b8a0374de787af169b2c339e b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/91/65a12a95d3b2b9b8a0374de787af169b2c339e similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/91/65a12a95d3b2b9b8a0374de787af169b2c339e rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/91/65a12a95d3b2b9b8a0374de787af169b2c339e diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/95/9d7a10da71acf97b17300b40a3b4f30903e09c b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/95/9d7a10da71acf97b17300b40a3b4f30903e09c similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/95/9d7a10da71acf97b17300b40a3b4f30903e09c rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/95/9d7a10da71acf97b17300b40a3b4f30903e09c diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/9d/e8260b738a34a74533df54f2e404276aa96242 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/9d/e8260b738a34a74533df54f2e404276aa96242 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/9d/e8260b738a34a74533df54f2e404276aa96242 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/9d/e8260b738a34a74533df54f2e404276aa96242 diff --git a/test/integration/pullAndSetUpstream/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/pullAndSetUpstream/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/af/a76754c933269d7cd45630a7184a20849dbe9c b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/af/a76754c933269d7cd45630a7184a20849dbe9c similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/af/a76754c933269d7cd45630a7184a20849dbe9c rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/af/a76754c933269d7cd45630a7184a20849dbe9c diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/b4/121e2d6aa156227b6541431ddfb8594904b520 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/b4/121e2d6aa156227b6541431ddfb8594904b520 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/b4/121e2d6aa156227b6541431ddfb8594904b520 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/b4/121e2d6aa156227b6541431ddfb8594904b520 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/c1/dd146476a4a37fff75b88612a718281ea83b58 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/c1/dd146476a4a37fff75b88612a718281ea83b58 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/c1/dd146476a4a37fff75b88612a718281ea83b58 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/c1/dd146476a4a37fff75b88612a718281ea83b58 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/c2/7ef6b4964209a875191eca7e56605c8efa5eee b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/c2/7ef6b4964209a875191eca7e56605c8efa5eee similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/c2/7ef6b4964209a875191eca7e56605c8efa5eee rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/c2/7ef6b4964209a875191eca7e56605c8efa5eee diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/c5/0f7e1375a30118c2886d4b31318579f3419231 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/c5/0f7e1375a30118c2886d4b31318579f3419231 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/c5/0f7e1375a30118c2886d4b31318579f3419231 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/c5/0f7e1375a30118c2886d4b31318579f3419231 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/c9/b473bec307b18fd94a913658f4d759be63ca47 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/c9/b473bec307b18fd94a913658f4d759be63ca47 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/c9/b473bec307b18fd94a913658f4d759be63ca47 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/c9/b473bec307b18fd94a913658f4d759be63ca47 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/ce/d01df5f1a270490c1b9d4efe5ceb0c53626279 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/ce/d01df5f1a270490c1b9d4efe5ceb0c53626279 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/ce/d01df5f1a270490c1b9d4efe5ceb0c53626279 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/ce/d01df5f1a270490c1b9d4efe5ceb0c53626279 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/d0/60f7226715ca55b04e91fad2b8aca01badd993 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/d0/60f7226715ca55b04e91fad2b8aca01badd993 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/d0/60f7226715ca55b04e91fad2b8aca01badd993 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/d0/60f7226715ca55b04e91fad2b8aca01badd993 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/d2/5721fffa7dc911ff2a9102bef201db225e2f16 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/d2/5721fffa7dc911ff2a9102bef201db225e2f16 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/d2/5721fffa7dc911ff2a9102bef201db225e2f16 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/d2/5721fffa7dc911ff2a9102bef201db225e2f16 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/d8/a7c50dcab42b2b62e5c77cdcece620d3964bd4 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/d8/a7c50dcab42b2b62e5c77cdcece620d3964bd4 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/d8/a7c50dcab42b2b62e5c77cdcece620d3964bd4 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/d8/a7c50dcab42b2b62e5c77cdcece620d3964bd4 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/da/72a6dd6fbaaa4a2803a3c867437ab81a1a99a0 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/da/72a6dd6fbaaa4a2803a3c867437ab81a1a99a0 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/da/72a6dd6fbaaa4a2803a3c867437ab81a1a99a0 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/da/72a6dd6fbaaa4a2803a3c867437ab81a1a99a0 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/db/f5ab9a4fa3f976d266f3be50670aa83121b420 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/db/f5ab9a4fa3f976d266f3be50670aa83121b420 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/db/f5ab9a4fa3f976d266f3be50670aa83121b420 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/db/f5ab9a4fa3f976d266f3be50670aa83121b420 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/dc/d348507ba1da8f6479b9d964daa302b2fb9d9c b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/dc/d348507ba1da8f6479b9d964daa302b2fb9d9c similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/dc/d348507ba1da8f6479b9d964daa302b2fb9d9c rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/dc/d348507ba1da8f6479b9d964daa302b2fb9d9c diff --git a/test/integration/pull/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/pull/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/e3/ae5c6d8407e8307b9bc77923be78c901408f6e b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/e3/ae5c6d8407e8307b9bc77923be78c901408f6e similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/e3/ae5c6d8407e8307b9bc77923be78c901408f6e rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/e3/ae5c6d8407e8307b9bc77923be78c901408f6e diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/e4/48ae5bf6371d80ebee24a22b6df341797a6511 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/e4/48ae5bf6371d80ebee24a22b6df341797a6511 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/e4/48ae5bf6371d80ebee24a22b6df341797a6511 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/e4/48ae5bf6371d80ebee24a22b6df341797a6511 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/e4/666ba294866d5c16f9afebcacf8f4adfee7439 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/e4/666ba294866d5c16f9afebcacf8f4adfee7439 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/e4/666ba294866d5c16f9afebcacf8f4adfee7439 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/e4/666ba294866d5c16f9afebcacf8f4adfee7439 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/ea/a48cb1e3d47e1b8b8df47bdc248e991207cc3d b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/ea/a48cb1e3d47e1b8b8df47bdc248e991207cc3d similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/ea/a48cb1e3d47e1b8b8df47bdc248e991207cc3d rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/ea/a48cb1e3d47e1b8b8df47bdc248e991207cc3d diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/eb/90e8d7b137a1d89480c9b22fd03199da77c9c7 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/eb/90e8d7b137a1d89480c9b22fd03199da77c9c7 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/eb/90e8d7b137a1d89480c9b22fd03199da77c9c7 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/eb/90e8d7b137a1d89480c9b22fd03199da77c9c7 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/f1/46c7f7b874778c1ad0cf9aebe45ec2427c7de2 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/f1/46c7f7b874778c1ad0cf9aebe45ec2427c7de2 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/f1/46c7f7b874778c1ad0cf9aebe45ec2427c7de2 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/f1/46c7f7b874778c1ad0cf9aebe45ec2427c7de2 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/f3/f762af4429ae89fa0dae3d0a5b500ca11630c4 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/f3/f762af4429ae89fa0dae3d0a5b500ca11630c4 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/f3/f762af4429ae89fa0dae3d0a5b500ca11630c4 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/f3/f762af4429ae89fa0dae3d0a5b500ca11630c4 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/objects/fd/31cea7e0b6e8d334280be34db8dd86cdda3007 b/test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/fd/31cea7e0b6e8d334280be34db8dd86cdda3007 similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/objects/fd/31cea7e0b6e8d334280be34db8dd86cdda3007 rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/objects/fd/31cea7e0b6e8d334280be34db8dd86cdda3007 diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/refs/heads/base_branch b/test/integration/mergeConflictUndo/expected/repo/.git_keep/refs/heads/base_branch similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/refs/heads/base_branch rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/refs/heads/base_branch diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/refs/heads/develop b/test/integration/mergeConflictUndo/expected/repo/.git_keep/refs/heads/develop similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/refs/heads/develop rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/refs/heads/develop diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/refs/heads/feature/cherry-picking b/test/integration/mergeConflictUndo/expected/repo/.git_keep/refs/heads/feature/cherry-picking similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/refs/heads/feature/cherry-picking rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/refs/heads/feature/cherry-picking diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/refs/heads/master b/test/integration/mergeConflictUndo/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/refs/heads/master rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/mergeConflictUndo/expected/.git_keep/refs/heads/other_branch b/test/integration/mergeConflictUndo/expected/repo/.git_keep/refs/heads/other_branch similarity index 100% rename from test/integration/mergeConflictUndo/expected/.git_keep/refs/heads/other_branch rename to test/integration/mergeConflictUndo/expected/repo/.git_keep/refs/heads/other_branch diff --git a/test/integration/mergeConflictUndo/expected/cherrypicking1 b/test/integration/mergeConflictUndo/expected/repo/cherrypicking1 similarity index 100% rename from test/integration/mergeConflictUndo/expected/cherrypicking1 rename to test/integration/mergeConflictUndo/expected/repo/cherrypicking1 diff --git a/test/integration/mergeConflictUndo/expected/cherrypicking2 b/test/integration/mergeConflictUndo/expected/repo/cherrypicking2 similarity index 100% rename from test/integration/mergeConflictUndo/expected/cherrypicking2 rename to test/integration/mergeConflictUndo/expected/repo/cherrypicking2 diff --git a/test/integration/mergeConflictUndo/expected/cherrypicking3 b/test/integration/mergeConflictUndo/expected/repo/cherrypicking3 similarity index 100% rename from test/integration/mergeConflictUndo/expected/cherrypicking3 rename to test/integration/mergeConflictUndo/expected/repo/cherrypicking3 diff --git a/test/integration/mergeConflictUndo/expected/cherrypicking4 b/test/integration/mergeConflictUndo/expected/repo/cherrypicking4 similarity index 100% rename from test/integration/mergeConflictUndo/expected/cherrypicking4 rename to test/integration/mergeConflictUndo/expected/repo/cherrypicking4 diff --git a/test/integration/mergeConflictUndo/expected/cherrypicking5 b/test/integration/mergeConflictUndo/expected/repo/cherrypicking5 similarity index 100% rename from test/integration/mergeConflictUndo/expected/cherrypicking5 rename to test/integration/mergeConflictUndo/expected/repo/cherrypicking5 diff --git a/test/integration/mergeConflictUndo/expected/cherrypicking6 b/test/integration/mergeConflictUndo/expected/repo/cherrypicking6 similarity index 100% rename from test/integration/mergeConflictUndo/expected/cherrypicking6 rename to test/integration/mergeConflictUndo/expected/repo/cherrypicking6 diff --git a/test/integration/mergeConflictUndo/expected/cherrypicking7 b/test/integration/mergeConflictUndo/expected/repo/cherrypicking7 similarity index 100% rename from test/integration/mergeConflictUndo/expected/cherrypicking7 rename to test/integration/mergeConflictUndo/expected/repo/cherrypicking7 diff --git a/test/integration/mergeConflictUndo/expected/cherrypicking8 b/test/integration/mergeConflictUndo/expected/repo/cherrypicking8 similarity index 100% rename from test/integration/mergeConflictUndo/expected/cherrypicking8 rename to test/integration/mergeConflictUndo/expected/repo/cherrypicking8 diff --git a/test/integration/mergeConflictUndo/expected/cherrypicking9 b/test/integration/mergeConflictUndo/expected/repo/cherrypicking9 similarity index 100% rename from test/integration/mergeConflictUndo/expected/cherrypicking9 rename to test/integration/mergeConflictUndo/expected/repo/cherrypicking9 diff --git a/test/integration/mergeConflictUndo/expected/directory/file b/test/integration/mergeConflictUndo/expected/repo/directory/file similarity index 100% rename from test/integration/mergeConflictUndo/expected/directory/file rename to test/integration/mergeConflictUndo/expected/repo/directory/file diff --git a/test/integration/mergeConflictUndo/expected/directory/file2 b/test/integration/mergeConflictUndo/expected/repo/directory/file2 similarity index 100% rename from test/integration/mergeConflictUndo/expected/directory/file2 rename to test/integration/mergeConflictUndo/expected/repo/directory/file2 diff --git a/test/integration/mergeConflictUndo/expected/file b/test/integration/mergeConflictUndo/expected/repo/file similarity index 100% rename from test/integration/mergeConflictUndo/expected/file rename to test/integration/mergeConflictUndo/expected/repo/file diff --git a/test/integration/mergeConflictUndo/expected/file1 b/test/integration/mergeConflictUndo/expected/repo/file1 similarity index 100% rename from test/integration/mergeConflictUndo/expected/file1 rename to test/integration/mergeConflictUndo/expected/repo/file1 diff --git a/test/integration/mergeConflictUndo/expected/file3 b/test/integration/mergeConflictUndo/expected/repo/file3 similarity index 100% rename from test/integration/mergeConflictUndo/expected/file3 rename to test/integration/mergeConflictUndo/expected/repo/file3 diff --git a/test/integration/mergeConflictUndo/expected/file4 b/test/integration/mergeConflictUndo/expected/repo/file4 similarity index 100% rename from test/integration/mergeConflictUndo/expected/file4 rename to test/integration/mergeConflictUndo/expected/repo/file4 diff --git a/test/integration/mergeConflictUndo/expected/file5 b/test/integration/mergeConflictUndo/expected/repo/file5 similarity index 100% rename from test/integration/mergeConflictUndo/expected/file5 rename to test/integration/mergeConflictUndo/expected/repo/file5 diff --git a/test/integration/mergeConflicts/expected/.git_keep/COMMIT_EDITMSG b/test/integration/mergeConflicts/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/mergeConflicts/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/patchBuilding/expected/.git_keep/FETCH_HEAD b/test/integration/mergeConflicts/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/patchBuilding/expected/.git_keep/FETCH_HEAD rename to test/integration/mergeConflicts/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/mergeConflicts/expected/.git_keep/HEAD b/test/integration/mergeConflicts/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/HEAD rename to test/integration/mergeConflicts/expected/repo/.git_keep/HEAD diff --git a/test/integration/mergeConflicts/expected/.git_keep/ORIG_HEAD b/test/integration/mergeConflicts/expected/repo/.git_keep/ORIG_HEAD similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/ORIG_HEAD rename to test/integration/mergeConflicts/expected/repo/.git_keep/ORIG_HEAD diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/config b/test/integration/mergeConflicts/expected/repo/.git_keep/config similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/config rename to test/integration/mergeConflicts/expected/repo/.git_keep/config diff --git a/test/integration/pullMerge/expected_remote/description b/test/integration/mergeConflicts/expected/repo/.git_keep/description similarity index 100% rename from test/integration/pullMerge/expected_remote/description rename to test/integration/mergeConflicts/expected/repo/.git_keep/description diff --git a/test/integration/mergeConflicts/expected/.git_keep/index b/test/integration/mergeConflicts/expected/repo/.git_keep/index similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/index rename to test/integration/mergeConflicts/expected/repo/.git_keep/index diff --git a/test/integration/pull/expected/.git_keep/info/exclude b/test/integration/mergeConflicts/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/pull/expected/.git_keep/info/exclude rename to test/integration/mergeConflicts/expected/repo/.git_keep/info/exclude diff --git a/test/integration/mergeConflicts/expected/.git_keep/logs/HEAD b/test/integration/mergeConflicts/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/logs/HEAD rename to test/integration/mergeConflicts/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/mergeConflicts/expected/.git_keep/logs/refs/heads/base_branch b/test/integration/mergeConflicts/expected/repo/.git_keep/logs/refs/heads/base_branch similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/logs/refs/heads/base_branch rename to test/integration/mergeConflicts/expected/repo/.git_keep/logs/refs/heads/base_branch diff --git a/test/integration/mergeConflicts/expected/.git_keep/logs/refs/heads/develop b/test/integration/mergeConflicts/expected/repo/.git_keep/logs/refs/heads/develop similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/logs/refs/heads/develop rename to test/integration/mergeConflicts/expected/repo/.git_keep/logs/refs/heads/develop diff --git a/test/integration/mergeConflicts/expected/.git_keep/logs/refs/heads/feature/cherry-picking b/test/integration/mergeConflicts/expected/repo/.git_keep/logs/refs/heads/feature/cherry-picking similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/logs/refs/heads/feature/cherry-picking rename to test/integration/mergeConflicts/expected/repo/.git_keep/logs/refs/heads/feature/cherry-picking diff --git a/test/integration/mergeConflicts/expected/.git_keep/logs/refs/heads/master b/test/integration/mergeConflicts/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/logs/refs/heads/master rename to test/integration/mergeConflicts/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/mergeConflicts/expected/.git_keep/logs/refs/heads/other_branch b/test/integration/mergeConflicts/expected/repo/.git_keep/logs/refs/heads/other_branch similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/logs/refs/heads/other_branch rename to test/integration/mergeConflicts/expected/repo/.git_keep/logs/refs/heads/other_branch diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/09/cbe8c6717c06a61876b7b641a46a62bf3c585d b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/09/cbe8c6717c06a61876b7b641a46a62bf3c585d similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/09/cbe8c6717c06a61876b7b641a46a62bf3c585d rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/09/cbe8c6717c06a61876b7b641a46a62bf3c585d diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/0b/2387a3f67ec050f6d4e08f379e3cbb0a9913f1 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/0b/2387a3f67ec050f6d4e08f379e3cbb0a9913f1 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/0b/2387a3f67ec050f6d4e08f379e3cbb0a9913f1 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/0b/2387a3f67ec050f6d4e08f379e3cbb0a9913f1 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/16/18ce1085acb41fd710e279ac38911aadfb0a09 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/16/18ce1085acb41fd710e279ac38911aadfb0a09 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/16/18ce1085acb41fd710e279ac38911aadfb0a09 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/16/18ce1085acb41fd710e279ac38911aadfb0a09 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/17/3a40ed58e33060166ccbfb7d0ccc0387be5f09 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/17/3a40ed58e33060166ccbfb7d0ccc0387be5f09 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/17/3a40ed58e33060166ccbfb7d0ccc0387be5f09 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/17/3a40ed58e33060166ccbfb7d0ccc0387be5f09 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/17/4a8c9444cfa700682d74059d9fa9be5749242c b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/17/4a8c9444cfa700682d74059d9fa9be5749242c similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/17/4a8c9444cfa700682d74059d9fa9be5749242c rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/17/4a8c9444cfa700682d74059d9fa9be5749242c diff --git a/test/integration/pullAndSetUpstream/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/pullAndSetUpstream/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/18/f469bc737f6c2a589205e2ddefceb32a7cc3a7 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/18/f469bc737f6c2a589205e2ddefceb32a7cc3a7 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/18/f469bc737f6c2a589205e2ddefceb32a7cc3a7 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/18/f469bc737f6c2a589205e2ddefceb32a7cc3a7 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/1b/9ae5f5dff631baaa180a30afd9983f83dc27ca b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/1b/9ae5f5dff631baaa180a30afd9983f83dc27ca similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/1b/9ae5f5dff631baaa180a30afd9983f83dc27ca rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/1b/9ae5f5dff631baaa180a30afd9983f83dc27ca diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/1f/bc3eb4b11cb89b204a593572c2e01462ca5a89 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/1f/bc3eb4b11cb89b204a593572c2e01462ca5a89 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/1f/bc3eb4b11cb89b204a593572c2e01462ca5a89 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/1f/bc3eb4b11cb89b204a593572c2e01462ca5a89 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/20/85c8dd0a80e95ed959e4db2ab98f66b970ad77 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/20/85c8dd0a80e95ed959e4db2ab98f66b970ad77 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/20/85c8dd0a80e95ed959e4db2ab98f66b970ad77 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/20/85c8dd0a80e95ed959e4db2ab98f66b970ad77 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/21/78af7503938665881174069be4d48fa483e4af b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/21/78af7503938665881174069be4d48fa483e4af similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/21/78af7503938665881174069be4d48fa483e4af rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/21/78af7503938665881174069be4d48fa483e4af diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/22/b0fd807dd5e428c2d818aef6a2311d7c11e885 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/22/b0fd807dd5e428c2d818aef6a2311d7c11e885 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/22/b0fd807dd5e428c2d818aef6a2311d7c11e885 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/22/b0fd807dd5e428c2d818aef6a2311d7c11e885 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/24/10ee12b940bade9d9e99413732faa6dc60adb1 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/24/10ee12b940bade9d9e99413732faa6dc60adb1 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/24/10ee12b940bade9d9e99413732faa6dc60adb1 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/24/10ee12b940bade9d9e99413732faa6dc60adb1 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/24/6f7487e08e6330ccbec4053e701145d53f64d4 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/24/6f7487e08e6330ccbec4053e701145d53f64d4 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/24/6f7487e08e6330ccbec4053e701145d53f64d4 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/24/6f7487e08e6330ccbec4053e701145d53f64d4 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/27/94411aa7b73b44f533fb862cdb9dbfd13c5d92 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/27/94411aa7b73b44f533fb862cdb9dbfd13c5d92 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/27/94411aa7b73b44f533fb862cdb9dbfd13c5d92 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/27/94411aa7b73b44f533fb862cdb9dbfd13c5d92 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/2e/cced19ece4424e0d3f26eb3ea2ccb6bfeafaa8 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/2e/cced19ece4424e0d3f26eb3ea2ccb6bfeafaa8 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/2e/cced19ece4424e0d3f26eb3ea2ccb6bfeafaa8 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/2e/cced19ece4424e0d3f26eb3ea2ccb6bfeafaa8 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/32/d15fd4451b6693a93d6420c8af6cfc99348e71 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/32/d15fd4451b6693a93d6420c8af6cfc99348e71 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/32/d15fd4451b6693a93d6420c8af6cfc99348e71 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/32/d15fd4451b6693a93d6420c8af6cfc99348e71 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/34/1cf8213827614a274c750cd7dec4307eb41de7 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/34/1cf8213827614a274c750cd7dec4307eb41de7 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/34/1cf8213827614a274c750cd7dec4307eb41de7 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/34/1cf8213827614a274c750cd7dec4307eb41de7 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/34/c74161eef968fc951cf170a011fa8abfeddbcd b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/34/c74161eef968fc951cf170a011fa8abfeddbcd similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/34/c74161eef968fc951cf170a011fa8abfeddbcd rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/34/c74161eef968fc951cf170a011fa8abfeddbcd diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/36/e0ef3e52c6e29e64980c71defbab6064d2da8c b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/36/e0ef3e52c6e29e64980c71defbab6064d2da8c similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/36/e0ef3e52c6e29e64980c71defbab6064d2da8c rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/36/e0ef3e52c6e29e64980c71defbab6064d2da8c diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/38/08a710b52a152bb73805fe274e0d877cf61800 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/38/08a710b52a152bb73805fe274e0d877cf61800 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/38/08a710b52a152bb73805fe274e0d877cf61800 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/38/08a710b52a152bb73805fe274e0d877cf61800 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/49/7b1e236588f0e2674c9a5787abeb226abf3680 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/49/7b1e236588f0e2674c9a5787abeb226abf3680 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/49/7b1e236588f0e2674c9a5787abeb226abf3680 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/49/7b1e236588f0e2674c9a5787abeb226abf3680 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/4f/80ec0c7b09eeeb580d0c19947477c02bc88c25 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/4f/80ec0c7b09eeeb580d0c19947477c02bc88c25 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/4f/80ec0c7b09eeeb580d0c19947477c02bc88c25 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/4f/80ec0c7b09eeeb580d0c19947477c02bc88c25 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/55/9043765dc6c32c943b6278b4abbff1e6f52839 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/55/9043765dc6c32c943b6278b4abbff1e6f52839 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/55/9043765dc6c32c943b6278b4abbff1e6f52839 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/55/9043765dc6c32c943b6278b4abbff1e6f52839 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/55/f688e6b47b7a5ca8ffc4e25b77c1af6222b503 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/55/f688e6b47b7a5ca8ffc4e25b77c1af6222b503 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/55/f688e6b47b7a5ca8ffc4e25b77c1af6222b503 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/55/f688e6b47b7a5ca8ffc4e25b77c1af6222b503 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/56/2af0640203fb5a6e92c090d8d1ded26806d2c4 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/56/2af0640203fb5a6e92c090d8d1ded26806d2c4 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/56/2af0640203fb5a6e92c090d8d1ded26806d2c4 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/56/2af0640203fb5a6e92c090d8d1ded26806d2c4 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/5d/874a902548f753e50944827e572a7470aa9731 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/5d/874a902548f753e50944827e572a7470aa9731 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/5d/874a902548f753e50944827e572a7470aa9731 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/5d/874a902548f753e50944827e572a7470aa9731 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/5d/a4d9200457542d875fe4def54ac98c16332db0 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/5d/a4d9200457542d875fe4def54ac98c16332db0 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/5d/a4d9200457542d875fe4def54ac98c16332db0 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/5d/a4d9200457542d875fe4def54ac98c16332db0 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/5f/3e4598b46a912f0f95a4898743e979343c82f3 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/5f/3e4598b46a912f0f95a4898743e979343c82f3 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/5f/3e4598b46a912f0f95a4898743e979343c82f3 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/5f/3e4598b46a912f0f95a4898743e979343c82f3 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/60/91d709b275e712111d016d9b3a4fb44e63f1f6 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/60/91d709b275e712111d016d9b3a4fb44e63f1f6 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/60/91d709b275e712111d016d9b3a4fb44e63f1f6 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/60/91d709b275e712111d016d9b3a4fb44e63f1f6 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/61/01e935461d4cd862ae4a720846e87880d198b9 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/61/01e935461d4cd862ae4a720846e87880d198b9 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/61/01e935461d4cd862ae4a720846e87880d198b9 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/61/01e935461d4cd862ae4a720846e87880d198b9 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/61/db24350a92fa37b2fe35f13eb3dd3f7655f6cf b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/61/db24350a92fa37b2fe35f13eb3dd3f7655f6cf similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/61/db24350a92fa37b2fe35f13eb3dd3f7655f6cf rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/61/db24350a92fa37b2fe35f13eb3dd3f7655f6cf diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/78/3666de4acbb22a9efc205197667f5136118c54 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/78/3666de4acbb22a9efc205197667f5136118c54 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/78/3666de4acbb22a9efc205197667f5136118c54 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/78/3666de4acbb22a9efc205197667f5136118c54 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/88/9b0fdfe5f2ae3d7df3066f3bc1e181fa712c8d b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/88/9b0fdfe5f2ae3d7df3066f3bc1e181fa712c8d similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/88/9b0fdfe5f2ae3d7df3066f3bc1e181fa712c8d rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/88/9b0fdfe5f2ae3d7df3066f3bc1e181fa712c8d diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/88/c39cdc29c995f8e1a63ccd48e7bbd6d96cb8b8 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/88/c39cdc29c995f8e1a63ccd48e7bbd6d96cb8b8 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/88/c39cdc29c995f8e1a63ccd48e7bbd6d96cb8b8 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/88/c39cdc29c995f8e1a63ccd48e7bbd6d96cb8b8 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/90/a84fd62f8033027fab3e567a81d5ed2a6a71cd b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/90/a84fd62f8033027fab3e567a81d5ed2a6a71cd similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/90/a84fd62f8033027fab3e567a81d5ed2a6a71cd rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/90/a84fd62f8033027fab3e567a81d5ed2a6a71cd diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/91/65a12a95d3b2b9b8a0374de787af169b2c339e b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/91/65a12a95d3b2b9b8a0374de787af169b2c339e similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/91/65a12a95d3b2b9b8a0374de787af169b2c339e rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/91/65a12a95d3b2b9b8a0374de787af169b2c339e diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/95/9d7a10da71acf97b17300b40a3b4f30903e09c b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/95/9d7a10da71acf97b17300b40a3b4f30903e09c similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/95/9d7a10da71acf97b17300b40a3b4f30903e09c rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/95/9d7a10da71acf97b17300b40a3b4f30903e09c diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/9d/e8260b738a34a74533df54f2e404276aa96242 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/9d/e8260b738a34a74533df54f2e404276aa96242 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/9d/e8260b738a34a74533df54f2e404276aa96242 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/9d/e8260b738a34a74533df54f2e404276aa96242 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/a1/9ec0b99e516795f349033f09383f87be0b74e9 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/a1/9ec0b99e516795f349033f09383f87be0b74e9 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/a1/9ec0b99e516795f349033f09383f87be0b74e9 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/a1/9ec0b99e516795f349033f09383f87be0b74e9 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/a1/e00cd67130c6f7e2b9bb7f23f0cda2b37eb30b b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/a1/e00cd67130c6f7e2b9bb7f23f0cda2b37eb30b similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/a1/e00cd67130c6f7e2b9bb7f23f0cda2b37eb30b rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/a1/e00cd67130c6f7e2b9bb7f23f0cda2b37eb30b diff --git a/test/integration/pullAndSetUpstream/expected_remote/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/pullAndSetUpstream/expected_remote/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/af/a76754c933269d7cd45630a7184a20849dbe9c b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/af/a76754c933269d7cd45630a7184a20849dbe9c similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/af/a76754c933269d7cd45630a7184a20849dbe9c rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/af/a76754c933269d7cd45630a7184a20849dbe9c diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/b0/753bdba91b84e3f406e21dbc7deba8e98f1fc8 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/b0/753bdba91b84e3f406e21dbc7deba8e98f1fc8 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/b0/753bdba91b84e3f406e21dbc7deba8e98f1fc8 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/b0/753bdba91b84e3f406e21dbc7deba8e98f1fc8 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/b2/d5312a06a9c56e9ada21c48a12f57ce8dd4c4a b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/b2/d5312a06a9c56e9ada21c48a12f57ce8dd4c4a similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/b2/d5312a06a9c56e9ada21c48a12f57ce8dd4c4a rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/b2/d5312a06a9c56e9ada21c48a12f57ce8dd4c4a diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/b4/121e2d6aa156227b6541431ddfb8594904b520 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/b4/121e2d6aa156227b6541431ddfb8594904b520 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/b4/121e2d6aa156227b6541431ddfb8594904b520 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/b4/121e2d6aa156227b6541431ddfb8594904b520 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/c1/dd146476a4a37fff75b88612a718281ea83b58 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/c1/dd146476a4a37fff75b88612a718281ea83b58 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/c1/dd146476a4a37fff75b88612a718281ea83b58 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/c1/dd146476a4a37fff75b88612a718281ea83b58 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/cc/19bee93215b6c20ab129fb2c006762d4ae1497 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/cc/19bee93215b6c20ab129fb2c006762d4ae1497 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/cc/19bee93215b6c20ab129fb2c006762d4ae1497 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/cc/19bee93215b6c20ab129fb2c006762d4ae1497 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/d0/60f7226715ca55b04e91fad2b8aca01badd993 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/d0/60f7226715ca55b04e91fad2b8aca01badd993 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/d0/60f7226715ca55b04e91fad2b8aca01badd993 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/d0/60f7226715ca55b04e91fad2b8aca01badd993 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/d3/e2708327280097b5e1f8ab69309934b24f8b64 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/d3/e2708327280097b5e1f8ab69309934b24f8b64 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/d3/e2708327280097b5e1f8ab69309934b24f8b64 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/d3/e2708327280097b5e1f8ab69309934b24f8b64 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/d8/a7c50dcab42b2b62e5c77cdcece620d3964bd4 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/d8/a7c50dcab42b2b62e5c77cdcece620d3964bd4 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/d8/a7c50dcab42b2b62e5c77cdcece620d3964bd4 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/d8/a7c50dcab42b2b62e5c77cdcece620d3964bd4 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/da/72a6dd6fbaaa4a2803a3c867437ab81a1a99a0 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/da/72a6dd6fbaaa4a2803a3c867437ab81a1a99a0 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/da/72a6dd6fbaaa4a2803a3c867437ab81a1a99a0 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/da/72a6dd6fbaaa4a2803a3c867437ab81a1a99a0 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/dc/d348507ba1da8f6479b9d964daa302b2fb9d9c b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/dc/d348507ba1da8f6479b9d964daa302b2fb9d9c similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/dc/d348507ba1da8f6479b9d964daa302b2fb9d9c rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/dc/d348507ba1da8f6479b9d964daa302b2fb9d9c diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/dd/259e90c3748e269bdf1ee3ce537a006d2394aa b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/dd/259e90c3748e269bdf1ee3ce537a006d2394aa similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/dd/259e90c3748e269bdf1ee3ce537a006d2394aa rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/dd/259e90c3748e269bdf1ee3ce537a006d2394aa diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/df/2c0daa40dcba0dded361a25ff7806b13db59a6 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/df/2c0daa40dcba0dded361a25ff7806b13db59a6 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/df/2c0daa40dcba0dded361a25ff7806b13db59a6 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/df/2c0daa40dcba0dded361a25ff7806b13db59a6 diff --git a/test/integration/pull/expected_remote/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/pull/expected_remote/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/e3/ae5c6d8407e8307b9bc77923be78c901408f6e b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/e3/ae5c6d8407e8307b9bc77923be78c901408f6e similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/e3/ae5c6d8407e8307b9bc77923be78c901408f6e rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/e3/ae5c6d8407e8307b9bc77923be78c901408f6e diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/e4/48ae5bf6371d80ebee24a22b6df341797a6511 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/e4/48ae5bf6371d80ebee24a22b6df341797a6511 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/e4/48ae5bf6371d80ebee24a22b6df341797a6511 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/e4/48ae5bf6371d80ebee24a22b6df341797a6511 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/e4/666ba294866d5c16f9afebcacf8f4adfee7439 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/e4/666ba294866d5c16f9afebcacf8f4adfee7439 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/e4/666ba294866d5c16f9afebcacf8f4adfee7439 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/e4/666ba294866d5c16f9afebcacf8f4adfee7439 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/e5/63585cb87cc39b553ca421902d631ea8890118 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/e5/63585cb87cc39b553ca421902d631ea8890118 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/e5/63585cb87cc39b553ca421902d631ea8890118 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/e5/63585cb87cc39b553ca421902d631ea8890118 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/ea/a48cb1e3d47e1b8b8df47bdc248e991207cc3d b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/ea/a48cb1e3d47e1b8b8df47bdc248e991207cc3d similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/ea/a48cb1e3d47e1b8b8df47bdc248e991207cc3d rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/ea/a48cb1e3d47e1b8b8df47bdc248e991207cc3d diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/eb/90e8d7b137a1d89480c9b22fd03199da77c9c7 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/eb/90e8d7b137a1d89480c9b22fd03199da77c9c7 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/eb/90e8d7b137a1d89480c9b22fd03199da77c9c7 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/eb/90e8d7b137a1d89480c9b22fd03199da77c9c7 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/ed/d4e2e50eb82125428b045c540a9194d934e180 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/ed/d4e2e50eb82125428b045c540a9194d934e180 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/ed/d4e2e50eb82125428b045c540a9194d934e180 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/ed/d4e2e50eb82125428b045c540a9194d934e180 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/f1/46c7f7b874778c1ad0cf9aebe45ec2427c7de2 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/f1/46c7f7b874778c1ad0cf9aebe45ec2427c7de2 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/f1/46c7f7b874778c1ad0cf9aebe45ec2427c7de2 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/f1/46c7f7b874778c1ad0cf9aebe45ec2427c7de2 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/f3/f762af4429ae89fa0dae3d0a5b500ca11630c4 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/f3/f762af4429ae89fa0dae3d0a5b500ca11630c4 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/f3/f762af4429ae89fa0dae3d0a5b500ca11630c4 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/f3/f762af4429ae89fa0dae3d0a5b500ca11630c4 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/f7/f30ea7f84d4521d3ce9cc08b780c7a1bf7cc5e b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/f7/f30ea7f84d4521d3ce9cc08b780c7a1bf7cc5e similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/f7/f30ea7f84d4521d3ce9cc08b780c7a1bf7cc5e rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/f7/f30ea7f84d4521d3ce9cc08b780c7a1bf7cc5e diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/f8/9097f0bd23eda6d8977c0edfae7f913ffc5db3 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/f8/9097f0bd23eda6d8977c0edfae7f913ffc5db3 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/f8/9097f0bd23eda6d8977c0edfae7f913ffc5db3 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/f8/9097f0bd23eda6d8977c0edfae7f913ffc5db3 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/f8/dd12b796f400be7f59d9471670c3080f9c90a1 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/f8/dd12b796f400be7f59d9471670c3080f9c90a1 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/f8/dd12b796f400be7f59d9471670c3080f9c90a1 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/f8/dd12b796f400be7f59d9471670c3080f9c90a1 diff --git a/test/integration/mergeConflicts/expected/.git_keep/objects/fd/31cea7e0b6e8d334280be34db8dd86cdda3007 b/test/integration/mergeConflicts/expected/repo/.git_keep/objects/fd/31cea7e0b6e8d334280be34db8dd86cdda3007 similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/objects/fd/31cea7e0b6e8d334280be34db8dd86cdda3007 rename to test/integration/mergeConflicts/expected/repo/.git_keep/objects/fd/31cea7e0b6e8d334280be34db8dd86cdda3007 diff --git a/test/integration/mergeConflicts/expected/.git_keep/refs/heads/base_branch b/test/integration/mergeConflicts/expected/repo/.git_keep/refs/heads/base_branch similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/refs/heads/base_branch rename to test/integration/mergeConflicts/expected/repo/.git_keep/refs/heads/base_branch diff --git a/test/integration/mergeConflicts/expected/.git_keep/refs/heads/develop b/test/integration/mergeConflicts/expected/repo/.git_keep/refs/heads/develop similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/refs/heads/develop rename to test/integration/mergeConflicts/expected/repo/.git_keep/refs/heads/develop diff --git a/test/integration/mergeConflicts/expected/.git_keep/refs/heads/feature/cherry-picking b/test/integration/mergeConflicts/expected/repo/.git_keep/refs/heads/feature/cherry-picking similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/refs/heads/feature/cherry-picking rename to test/integration/mergeConflicts/expected/repo/.git_keep/refs/heads/feature/cherry-picking diff --git a/test/integration/mergeConflicts/expected/.git_keep/refs/heads/master b/test/integration/mergeConflicts/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/refs/heads/master rename to test/integration/mergeConflicts/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/mergeConflicts/expected/.git_keep/refs/heads/other_branch b/test/integration/mergeConflicts/expected/repo/.git_keep/refs/heads/other_branch similarity index 100% rename from test/integration/mergeConflicts/expected/.git_keep/refs/heads/other_branch rename to test/integration/mergeConflicts/expected/repo/.git_keep/refs/heads/other_branch diff --git a/test/integration/mergeConflicts/expected/cherrypicking1 b/test/integration/mergeConflicts/expected/repo/cherrypicking1 similarity index 100% rename from test/integration/mergeConflicts/expected/cherrypicking1 rename to test/integration/mergeConflicts/expected/repo/cherrypicking1 diff --git a/test/integration/mergeConflicts/expected/cherrypicking2 b/test/integration/mergeConflicts/expected/repo/cherrypicking2 similarity index 100% rename from test/integration/mergeConflicts/expected/cherrypicking2 rename to test/integration/mergeConflicts/expected/repo/cherrypicking2 diff --git a/test/integration/mergeConflicts/expected/cherrypicking3 b/test/integration/mergeConflicts/expected/repo/cherrypicking3 similarity index 100% rename from test/integration/mergeConflicts/expected/cherrypicking3 rename to test/integration/mergeConflicts/expected/repo/cherrypicking3 diff --git a/test/integration/mergeConflicts/expected/cherrypicking4 b/test/integration/mergeConflicts/expected/repo/cherrypicking4 similarity index 100% rename from test/integration/mergeConflicts/expected/cherrypicking4 rename to test/integration/mergeConflicts/expected/repo/cherrypicking4 diff --git a/test/integration/mergeConflicts/expected/cherrypicking5 b/test/integration/mergeConflicts/expected/repo/cherrypicking5 similarity index 100% rename from test/integration/mergeConflicts/expected/cherrypicking5 rename to test/integration/mergeConflicts/expected/repo/cherrypicking5 diff --git a/test/integration/mergeConflicts/expected/cherrypicking6 b/test/integration/mergeConflicts/expected/repo/cherrypicking6 similarity index 100% rename from test/integration/mergeConflicts/expected/cherrypicking6 rename to test/integration/mergeConflicts/expected/repo/cherrypicking6 diff --git a/test/integration/mergeConflicts/expected/cherrypicking7 b/test/integration/mergeConflicts/expected/repo/cherrypicking7 similarity index 100% rename from test/integration/mergeConflicts/expected/cherrypicking7 rename to test/integration/mergeConflicts/expected/repo/cherrypicking7 diff --git a/test/integration/mergeConflicts/expected/cherrypicking8 b/test/integration/mergeConflicts/expected/repo/cherrypicking8 similarity index 100% rename from test/integration/mergeConflicts/expected/cherrypicking8 rename to test/integration/mergeConflicts/expected/repo/cherrypicking8 diff --git a/test/integration/mergeConflicts/expected/cherrypicking9 b/test/integration/mergeConflicts/expected/repo/cherrypicking9 similarity index 100% rename from test/integration/mergeConflicts/expected/cherrypicking9 rename to test/integration/mergeConflicts/expected/repo/cherrypicking9 diff --git a/test/integration/mergeConflicts/expected/directory/file b/test/integration/mergeConflicts/expected/repo/directory/file similarity index 100% rename from test/integration/mergeConflicts/expected/directory/file rename to test/integration/mergeConflicts/expected/repo/directory/file diff --git a/test/integration/mergeConflicts/expected/directory/file2 b/test/integration/mergeConflicts/expected/repo/directory/file2 similarity index 100% rename from test/integration/mergeConflicts/expected/directory/file2 rename to test/integration/mergeConflicts/expected/repo/directory/file2 diff --git a/test/integration/mergeConflicts/expected/file b/test/integration/mergeConflicts/expected/repo/file similarity index 100% rename from test/integration/mergeConflicts/expected/file rename to test/integration/mergeConflicts/expected/repo/file diff --git a/test/integration/mergeConflicts/expected/file1 b/test/integration/mergeConflicts/expected/repo/file1 similarity index 100% rename from test/integration/mergeConflicts/expected/file1 rename to test/integration/mergeConflicts/expected/repo/file1 diff --git a/test/integration/mergeConflicts/expected/file3 b/test/integration/mergeConflicts/expected/repo/file3 similarity index 100% rename from test/integration/mergeConflicts/expected/file3 rename to test/integration/mergeConflicts/expected/repo/file3 diff --git a/test/integration/mergeConflicts/expected/file4 b/test/integration/mergeConflicts/expected/repo/file4 similarity index 100% rename from test/integration/mergeConflicts/expected/file4 rename to test/integration/mergeConflicts/expected/repo/file4 diff --git a/test/integration/mergeConflicts/expected/file5 b/test/integration/mergeConflicts/expected/repo/file5 similarity index 100% rename from test/integration/mergeConflicts/expected/file5 rename to test/integration/mergeConflicts/expected/repo/file5 diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/COMMIT_EDITMSG b/test/integration/mergeConflictsFiltered/expected/.git_keep/COMMIT_EDITMSG deleted file mode 100644 index 80977d9d1..000000000 --- a/test/integration/mergeConflictsFiltered/expected/.git_keep/COMMIT_EDITMSG +++ /dev/null @@ -1,40 +0,0 @@ -Merge branch 'develop' into other_branch - -# Conflicts: -# directory/file -# directory/file2 -# file1 -# file3 -# file4 -# file5 -# -# It looks like you may be committing a merge. -# If this is not correct, please remove the file -# /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/mergeConflictsFiltered/actual/.git/MERGE_HEAD -# and try again. - - -# Please enter the commit message for your changes. Lines starting -# with '#' will be ignored, and an empty message aborts the commit. -# -# On branch other_branch -# All conflicts fixed but you are still merging. -# -# Changes to be committed: -# new file: cherrypicking1 -# new file: cherrypicking2 -# new file: cherrypicking3 -# new file: cherrypicking4 -# new file: cherrypicking5 -# new file: cherrypicking7 -# new file: cherrypicking8 -# new file: cherrypicking9 -# modified: directory/file -# modified: directory/file2 -# modified: file1 -# modified: file4 -# modified: file5 -# -# Untracked files: -# cherrypicking6 -# diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/ORIG_HEAD b/test/integration/mergeConflictsFiltered/expected/.git_keep/ORIG_HEAD deleted file mode 100644 index 84de0034b..000000000 --- a/test/integration/mergeConflictsFiltered/expected/.git_keep/ORIG_HEAD +++ /dev/null @@ -1 +0,0 @@ -ab7ecb7891c5f56480fba1ed3a6e0fa8e989efab diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/index b/test/integration/mergeConflictsFiltered/expected/.git_keep/index deleted file mode 100644 index f455a20fa..000000000 Binary files a/test/integration/mergeConflictsFiltered/expected/.git_keep/index and /dev/null differ diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/logs/HEAD b/test/integration/mergeConflictsFiltered/expected/.git_keep/logs/HEAD deleted file mode 100644 index 8d64a77dd..000000000 --- a/test/integration/mergeConflictsFiltered/expected/.git_keep/logs/HEAD +++ /dev/null @@ -1,33 +0,0 @@ -0000000000000000000000000000000000000000 416ca3083a0651e1c8be3ad7e0dbe8547a62be8a CI 1643188552 +1100 commit (initial): first commit -416ca3083a0651e1c8be3ad7e0dbe8547a62be8a 416ca3083a0651e1c8be3ad7e0dbe8547a62be8a CI 1643188552 +1100 checkout: moving from master to feature/cherry-picking -416ca3083a0651e1c8be3ad7e0dbe8547a62be8a f47cc13dc21c72755ff2d96d0805837dbb028951 CI 1643188552 +1100 commit: first commit freshman year -f47cc13dc21c72755ff2d96d0805837dbb028951 34850e31f804a946d014b14443cf7387546877b0 CI 1643188552 +1100 commit: second commit subway eat fresh -34850e31f804a946d014b14443cf7387546877b0 66340a9343a65aec523bfc57bd5a870eb4e05959 CI 1643188552 +1100 commit: third commit fresh -66340a9343a65aec523bfc57bd5a870eb4e05959 f9c5f8e0789c2eb9a6e37ba82a5b34be739989ec CI 1643188552 +1100 commit: fourth commit cool -f9c5f8e0789c2eb9a6e37ba82a5b34be739989ec 4abe915d16bbc10f38b578390ff74c9ae62bf503 CI 1643188552 +1100 commit: fifth commit nice -4abe915d16bbc10f38b578390ff74c9ae62bf503 93d727583328b5ce8f717380d014b87bd7893222 CI 1643188552 +1100 commit: sixth commit haha -93d727583328b5ce8f717380d014b87bd7893222 951a2354eb5856644b0f1db74becc04c908beaa3 CI 1643188552 +1100 commit: seventh commit yeah -951a2354eb5856644b0f1db74becc04c908beaa3 1fb30058516518ac1579a8df132b0e4dade8e51d CI 1643188552 +1100 commit: eighth commit woo -1fb30058516518ac1579a8df132b0e4dade8e51d 1fb30058516518ac1579a8df132b0e4dade8e51d CI 1643188552 +1100 checkout: moving from feature/cherry-picking to develop -1fb30058516518ac1579a8df132b0e4dade8e51d 40844e90419651d425c0845ec6f7c64ff63ebf03 CI 1643188552 +1100 commit: first commit on develop -40844e90419651d425c0845ec6f7c64ff63ebf03 416ca3083a0651e1c8be3ad7e0dbe8547a62be8a CI 1643188552 +1100 checkout: moving from develop to master -416ca3083a0651e1c8be3ad7e0dbe8547a62be8a 165a3cfaf6a1d3d757fb7b1c509598a395108079 CI 1643188552 +1100 commit: first commit on master -165a3cfaf6a1d3d757fb7b1c509598a395108079 40844e90419651d425c0845ec6f7c64ff63ebf03 CI 1643188552 +1100 checkout: moving from master to develop -40844e90419651d425c0845ec6f7c64ff63ebf03 9c59217622ae74189d18f2992121f97dd28e966b CI 1643188552 +1100 commit: second commit on develop -9c59217622ae74189d18f2992121f97dd28e966b 165a3cfaf6a1d3d757fb7b1c509598a395108079 CI 1643188552 +1100 checkout: moving from develop to master -165a3cfaf6a1d3d757fb7b1c509598a395108079 454b176d9e82bc3e0b5d5fd93fa5ad3a58b7db5f CI 1643188552 +1100 commit: second commit on master -454b176d9e82bc3e0b5d5fd93fa5ad3a58b7db5f 9c59217622ae74189d18f2992121f97dd28e966b CI 1643188552 +1100 checkout: moving from master to develop -9c59217622ae74189d18f2992121f97dd28e966b ba211bf3464f9c0429483a83963c1c69e1f53d4e CI 1643188552 +1100 commit: third commit on develop -ba211bf3464f9c0429483a83963c1c69e1f53d4e 454b176d9e82bc3e0b5d5fd93fa5ad3a58b7db5f CI 1643188552 +1100 checkout: moving from develop to master -454b176d9e82bc3e0b5d5fd93fa5ad3a58b7db5f a83aac98467d005729bc9d80fe98abba47d41495 CI 1643188552 +1100 commit: third commit on master -a83aac98467d005729bc9d80fe98abba47d41495 ba211bf3464f9c0429483a83963c1c69e1f53d4e CI 1643188552 +1100 checkout: moving from master to develop -ba211bf3464f9c0429483a83963c1c69e1f53d4e 85aba0ff0b6e7c0a7f6180f9f6e7e8cdcb71ee3b CI 1643188552 +1100 commit: fourth commit on develop -85aba0ff0b6e7c0a7f6180f9f6e7e8cdcb71ee3b a83aac98467d005729bc9d80fe98abba47d41495 CI 1643188552 +1100 checkout: moving from develop to master -a83aac98467d005729bc9d80fe98abba47d41495 cd97d8e8ca03000f761f0e041cea0b6039923e70 CI 1643188552 +1100 commit: fourth commit on master -cd97d8e8ca03000f761f0e041cea0b6039923e70 cd97d8e8ca03000f761f0e041cea0b6039923e70 CI 1643188552 +1100 checkout: moving from master to base_branch -cd97d8e8ca03000f761f0e041cea0b6039923e70 ab7ecb7891c5f56480fba1ed3a6e0fa8e989efab CI 1643188552 +1100 commit: file -ab7ecb7891c5f56480fba1ed3a6e0fa8e989efab ab7ecb7891c5f56480fba1ed3a6e0fa8e989efab CI 1643188552 +1100 checkout: moving from base_branch to other_branch -ab7ecb7891c5f56480fba1ed3a6e0fa8e989efab ab7ecb7891c5f56480fba1ed3a6e0fa8e989efab CI 1643188552 +1100 checkout: moving from other_branch to base_branch -ab7ecb7891c5f56480fba1ed3a6e0fa8e989efab 06d48b81c12e9c1a3cc2704c0db337639a8cdf85 CI 1643188552 +1100 commit: file changed -06d48b81c12e9c1a3cc2704c0db337639a8cdf85 ab7ecb7891c5f56480fba1ed3a6e0fa8e989efab CI 1643188552 +1100 checkout: moving from base_branch to other_branch -ab7ecb7891c5f56480fba1ed3a6e0fa8e989efab 4c1db169d59c4345aba213cb79934f4e38222f02 CI 1643188579 +1100 commit (merge): Merge branch 'develop' into other_branch diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/logs/refs/heads/base_branch b/test/integration/mergeConflictsFiltered/expected/.git_keep/logs/refs/heads/base_branch deleted file mode 100644 index 1d7992ef4..000000000 --- a/test/integration/mergeConflictsFiltered/expected/.git_keep/logs/refs/heads/base_branch +++ /dev/null @@ -1,3 +0,0 @@ -0000000000000000000000000000000000000000 cd97d8e8ca03000f761f0e041cea0b6039923e70 CI 1643188552 +1100 branch: Created from HEAD -cd97d8e8ca03000f761f0e041cea0b6039923e70 ab7ecb7891c5f56480fba1ed3a6e0fa8e989efab CI 1643188552 +1100 commit: file -ab7ecb7891c5f56480fba1ed3a6e0fa8e989efab 06d48b81c12e9c1a3cc2704c0db337639a8cdf85 CI 1643188552 +1100 commit: file changed diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/logs/refs/heads/develop b/test/integration/mergeConflictsFiltered/expected/.git_keep/logs/refs/heads/develop deleted file mode 100644 index 52fde82d1..000000000 --- a/test/integration/mergeConflictsFiltered/expected/.git_keep/logs/refs/heads/develop +++ /dev/null @@ -1,5 +0,0 @@ -0000000000000000000000000000000000000000 1fb30058516518ac1579a8df132b0e4dade8e51d CI 1643188552 +1100 branch: Created from HEAD -1fb30058516518ac1579a8df132b0e4dade8e51d 40844e90419651d425c0845ec6f7c64ff63ebf03 CI 1643188552 +1100 commit: first commit on develop -40844e90419651d425c0845ec6f7c64ff63ebf03 9c59217622ae74189d18f2992121f97dd28e966b CI 1643188552 +1100 commit: second commit on develop -9c59217622ae74189d18f2992121f97dd28e966b ba211bf3464f9c0429483a83963c1c69e1f53d4e CI 1643188552 +1100 commit: third commit on develop -ba211bf3464f9c0429483a83963c1c69e1f53d4e 85aba0ff0b6e7c0a7f6180f9f6e7e8cdcb71ee3b CI 1643188552 +1100 commit: fourth commit on develop diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/logs/refs/heads/feature/cherry-picking b/test/integration/mergeConflictsFiltered/expected/.git_keep/logs/refs/heads/feature/cherry-picking deleted file mode 100644 index a77478ee9..000000000 --- a/test/integration/mergeConflictsFiltered/expected/.git_keep/logs/refs/heads/feature/cherry-picking +++ /dev/null @@ -1,9 +0,0 @@ -0000000000000000000000000000000000000000 416ca3083a0651e1c8be3ad7e0dbe8547a62be8a CI 1643188552 +1100 branch: Created from HEAD -416ca3083a0651e1c8be3ad7e0dbe8547a62be8a f47cc13dc21c72755ff2d96d0805837dbb028951 CI 1643188552 +1100 commit: first commit freshman year -f47cc13dc21c72755ff2d96d0805837dbb028951 34850e31f804a946d014b14443cf7387546877b0 CI 1643188552 +1100 commit: second commit subway eat fresh -34850e31f804a946d014b14443cf7387546877b0 66340a9343a65aec523bfc57bd5a870eb4e05959 CI 1643188552 +1100 commit: third commit fresh -66340a9343a65aec523bfc57bd5a870eb4e05959 f9c5f8e0789c2eb9a6e37ba82a5b34be739989ec CI 1643188552 +1100 commit: fourth commit cool -f9c5f8e0789c2eb9a6e37ba82a5b34be739989ec 4abe915d16bbc10f38b578390ff74c9ae62bf503 CI 1643188552 +1100 commit: fifth commit nice -4abe915d16bbc10f38b578390ff74c9ae62bf503 93d727583328b5ce8f717380d014b87bd7893222 CI 1643188552 +1100 commit: sixth commit haha -93d727583328b5ce8f717380d014b87bd7893222 951a2354eb5856644b0f1db74becc04c908beaa3 CI 1643188552 +1100 commit: seventh commit yeah -951a2354eb5856644b0f1db74becc04c908beaa3 1fb30058516518ac1579a8df132b0e4dade8e51d CI 1643188552 +1100 commit: eighth commit woo diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/logs/refs/heads/master b/test/integration/mergeConflictsFiltered/expected/.git_keep/logs/refs/heads/master deleted file mode 100644 index 7f0b5ea9c..000000000 --- a/test/integration/mergeConflictsFiltered/expected/.git_keep/logs/refs/heads/master +++ /dev/null @@ -1,5 +0,0 @@ -0000000000000000000000000000000000000000 416ca3083a0651e1c8be3ad7e0dbe8547a62be8a CI 1643188552 +1100 commit (initial): first commit -416ca3083a0651e1c8be3ad7e0dbe8547a62be8a 165a3cfaf6a1d3d757fb7b1c509598a395108079 CI 1643188552 +1100 commit: first commit on master -165a3cfaf6a1d3d757fb7b1c509598a395108079 454b176d9e82bc3e0b5d5fd93fa5ad3a58b7db5f CI 1643188552 +1100 commit: second commit on master -454b176d9e82bc3e0b5d5fd93fa5ad3a58b7db5f a83aac98467d005729bc9d80fe98abba47d41495 CI 1643188552 +1100 commit: third commit on master -a83aac98467d005729bc9d80fe98abba47d41495 cd97d8e8ca03000f761f0e041cea0b6039923e70 CI 1643188552 +1100 commit: fourth commit on master diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/logs/refs/heads/other_branch b/test/integration/mergeConflictsFiltered/expected/.git_keep/logs/refs/heads/other_branch deleted file mode 100644 index 2534238d7..000000000 --- a/test/integration/mergeConflictsFiltered/expected/.git_keep/logs/refs/heads/other_branch +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 ab7ecb7891c5f56480fba1ed3a6e0fa8e989efab CI 1643188552 +1100 branch: Created from HEAD -ab7ecb7891c5f56480fba1ed3a6e0fa8e989efab 4c1db169d59c4345aba213cb79934f4e38222f02 CI 1643188579 +1100 commit (merge): Merge branch 'develop' into other_branch diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/06/d48b81c12e9c1a3cc2704c0db337639a8cdf85 b/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/06/d48b81c12e9c1a3cc2704c0db337639a8cdf85 deleted file mode 100644 index 984eeda3b..000000000 Binary files a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/06/d48b81c12e9c1a3cc2704c0db337639a8cdf85 and /dev/null differ diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/16/5a3cfaf6a1d3d757fb7b1c509598a395108079 b/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/16/5a3cfaf6a1d3d757fb7b1c509598a395108079 deleted file mode 100644 index 56bdc0b18..000000000 --- a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/16/5a3cfaf6a1d3d757fb7b1c509598a395108079 +++ /dev/null @@ -1,2 +0,0 @@ -xŤŽM -Â0F]çł$Éäg"BW=Ć4ť`ÁŘŇFđřĽ€»ŹÇ{đĺµÖĄŐéÔvđĹůD“ śŚ-ş$ĎŽE‡’bB‡™lAµń.Ż΄̨ YoÄdšyŽ˘çIČ»ČÁöÁŠßí±î0ŚpĆ»|¸nOąäµŢŔ‡†Č{ gc´VťöSMţÔUYöŁÁŻ‚ő•Ź«/+?Ž \ No newline at end of file diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/1f/b30058516518ac1579a8df132b0e4dade8e51d b/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/1f/b30058516518ac1579a8df132b0e4dade8e51d deleted file mode 100644 index 82cc46d1c..000000000 Binary files a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/1f/b30058516518ac1579a8df132b0e4dade8e51d and /dev/null differ diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/20/8e708af0dc73a41a09e79a7198ce56aef3df05 b/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/20/8e708af0dc73a41a09e79a7198ce56aef3df05 deleted file mode 100644 index 01e88b75d..000000000 Binary files a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/20/8e708af0dc73a41a09e79a7198ce56aef3df05 and /dev/null differ diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/34/850e31f804a946d014b14443cf7387546877b0 b/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/34/850e31f804a946d014b14443cf7387546877b0 deleted file mode 100644 index 5d4a913e6..000000000 Binary files a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/34/850e31f804a946d014b14443cf7387546877b0 and /dev/null differ diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/40/844e90419651d425c0845ec6f7c64ff63ebf03 b/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/40/844e90419651d425c0845ec6f7c64ff63ebf03 deleted file mode 100644 index cca824fa4..000000000 Binary files a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/40/844e90419651d425c0845ec6f7c64ff63ebf03 and /dev/null differ diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/41/6ca3083a0651e1c8be3ad7e0dbe8547a62be8a b/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/41/6ca3083a0651e1c8be3ad7e0dbe8547a62be8a deleted file mode 100644 index 4f8246e30..000000000 Binary files a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/41/6ca3083a0651e1c8be3ad7e0dbe8547a62be8a and /dev/null differ diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/45/4b176d9e82bc3e0b5d5fd93fa5ad3a58b7db5f b/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/45/4b176d9e82bc3e0b5d5fd93fa5ad3a58b7db5f deleted file mode 100644 index a334cf498..000000000 --- a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/45/4b176d9e82bc3e0b5d5fd93fa5ad3a58b7db5f +++ /dev/null @@ -1,2 +0,0 @@ -xŤŽM -Â0…]çł$Ótň"BW=Ćd’˘`šŇFđřĽ€Ë÷řľÇ“ZĘłÁ€úÔöśA‰Ů‹učD[¶čťŤ.Úyěq‹ň”ÔĆ{^ %6˛đb“IŽÜŇqŇ‚gµ×.(~·GÝašá:Í÷üᲽňEjąőŤŃ ÷DśµV˝í§ZţWG–ş&řiPW(|t[}i>?Ď \ No newline at end of file diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/4a/be915d16bbc10f38b578390ff74c9ae62bf503 b/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/4a/be915d16bbc10f38b578390ff74c9ae62bf503 deleted file mode 100644 index 8854dbe4e..000000000 Binary files a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/4a/be915d16bbc10f38b578390ff74c9ae62bf503 and /dev/null differ diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/4c/1db169d59c4345aba213cb79934f4e38222f02 b/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/4c/1db169d59c4345aba213cb79934f4e38222f02 deleted file mode 100644 index 5e63d0027..000000000 Binary files a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/4c/1db169d59c4345aba213cb79934f4e38222f02 and /dev/null differ diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/66/340a9343a65aec523bfc57bd5a870eb4e05959 b/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/66/340a9343a65aec523bfc57bd5a870eb4e05959 deleted file mode 100644 index e319e7eda..000000000 --- a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/66/340a9343a65aec523bfc57bd5a870eb4e05959 +++ /dev/null @@ -1,2 +0,0 @@ -xŤŽK -Â0@]çłd’L>ˇ«#™LiÁŘ#x| ^Ŕíă=xĽŐşv0čN˝‰@‰)°ĂÂ)“É&{#ŽCŕÂÂâ ;xĘ…Ôžš<;XŠĹę9"Ą|AMY‘ĺ9ŘůBF•Ţ}ŮŚ\Çé.źT÷‡\x«7Đž¬ŽŃ9g­ŐAŹ©.ęŞ/k+đ«`nňZÔjc> \ No newline at end of file diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/85/aba0ff0b6e7c0a7f6180f9f6e7e8cdcb71ee3b b/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/85/aba0ff0b6e7c0a7f6180f9f6e7e8cdcb71ee3b deleted file mode 100644 index bdc31c789..000000000 --- a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/85/aba0ff0b6e7c0a7f6180f9f6e7e8cdcb71ee3b +++ /dev/null @@ -1,3 +0,0 @@ -xŤŽA -Ă E»öł/G'Fˇ”BV9†Ž#)$1Szüzn˙}×ey50—¶‹€ÄHžŠÍÔ &ź|.ԧ̆Ľ„€F÷Ě6«-î˛6HńTS±ä¨Ödy˝ Î2˛ ‚Ą;ŻDĹŁMu‡a„ű0>ĺ—m–×ĺčȢ÷]g੨µ:éŐäĎą*őŘŰ? ę -YŢ2×M}OĆA7 \ No newline at end of file diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/93/d727583328b5ce8f717380d014b87bd7893222 b/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/93/d727583328b5ce8f717380d014b87bd7893222 deleted file mode 100644 index 4eb870a9e..000000000 --- a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/93/d727583328b5ce8f717380d014b87bd7893222 +++ /dev/null @@ -1,3 +0,0 @@ -xŤŽK -Â0@]çł$“ďD„®zŚI:!‚±ĄFčń-x·Ź÷ŕ奵GŁÝ©o"qžŃ;¶±”}" -h8"Ba˛É“Zy“WÇIô3†”2ęb)ůHvĐGčňŔL*^[Ĺź^— Ć ®ăt—ťŰú”K^Ú 08‹DŢ8#j­zLuůSWďÇŢ+ü*¨\Y}°=í \ No newline at end of file diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/95/1a2354eb5856644b0f1db74becc04c908beaa3 b/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/95/1a2354eb5856644b0f1db74becc04c908beaa3 deleted file mode 100644 index 27ac335e9..000000000 Binary files a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/95/1a2354eb5856644b0f1db74becc04c908beaa3 and /dev/null differ diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/9c/59217622ae74189d18f2992121f97dd28e966b b/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/9c/59217622ae74189d18f2992121f97dd28e966b deleted file mode 100644 index 174b52052..000000000 Binary files a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/9c/59217622ae74189d18f2992121f97dd28e966b and /dev/null differ diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/a8/3aac98467d005729bc9d80fe98abba47d41495 b/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/a8/3aac98467d005729bc9d80fe98abba47d41495 deleted file mode 100644 index 20ba8aaf2..000000000 Binary files a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/a8/3aac98467d005729bc9d80fe98abba47d41495 and /dev/null differ diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/ab/7ecb7891c5f56480fba1ed3a6e0fa8e989efab b/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/ab/7ecb7891c5f56480fba1ed3a6e0fa8e989efab deleted file mode 100644 index 92e71009c..000000000 --- a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/ab/7ecb7891c5f56480fba1ed3a6e0fa8e989efab +++ /dev/null @@ -1,2 +0,0 @@ -xŤÎA -Ă @Ń®=…űB™Ń¨3PJ!«cÔ‘’& =~s„n?oń˶®s·Čx釪u@ˇP­ ĘA+Öˇf'™©Ĺ9Ô”Ě.‡ľ»-•S%Ą"ŕ Ą ,*#xfç5‘Om‡'{§§~eÝ˝•m}XŚG˘ś˝"łžS]˙ä¦Í‹š>"94 \ No newline at end of file diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/ba/211bf3464f9c0429483a83963c1c69e1f53d4e b/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/ba/211bf3464f9c0429483a83963c1c69e1f53d4e deleted file mode 100644 index b97085682..000000000 Binary files a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/ba/211bf3464f9c0429483a83963c1c69e1f53d4e and /dev/null differ diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/cd/97d8e8ca03000f761f0e041cea0b6039923e70 b/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/cd/97d8e8ca03000f761f0e041cea0b6039923e70 deleted file mode 100644 index a14b07295..000000000 Binary files a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/cd/97d8e8ca03000f761f0e041cea0b6039923e70 and /dev/null differ diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/f4/7cc13dc21c72755ff2d96d0805837dbb028951 b/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/f4/7cc13dc21c72755ff2d96d0805837dbb028951 deleted file mode 100644 index 9be5e4363..000000000 --- a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/f4/7cc13dc21c72755ff2d96d0805837dbb028951 +++ /dev/null @@ -1,2 +0,0 @@ -xŤŽA -1=çs$“dcaOűŚÉlăJŚ żwÁxkŠ*h]j˝vrě7˝ä Š™P„ŕěě‹‹ČâTsĚRD’yHĂ˝Sŕ¨âmňbăŔ`M^ćýf¤!ě%şu‘Wż,ŤĆ‰ŽătĆ[ę㆝.őD甆ÁŃ–ŮZłŇőTÇźş)×öěô«¨4 1643618835 +1100 commit (initial): first commit +f37ec566036d715d6995f55dbc82a4fb3cf56f2f f37ec566036d715d6995f55dbc82a4fb3cf56f2f CI 1643618835 +1100 checkout: moving from master to feature/cherry-picking +f37ec566036d715d6995f55dbc82a4fb3cf56f2f 21730e75ee0eec374cc54eb1140d24e03db834fc CI 1643618835 +1100 commit: first commit freshman year +21730e75ee0eec374cc54eb1140d24e03db834fc 0f8c9b8f1cac20c63e92e8df34f6d8b3fa74accd CI 1643618835 +1100 commit: second commit subway eat fresh +0f8c9b8f1cac20c63e92e8df34f6d8b3fa74accd 72c9bf1e687e81778850d517953c64f03adbaa1b CI 1643618835 +1100 commit: third commit fresh +72c9bf1e687e81778850d517953c64f03adbaa1b 67b2eea3191ca9a6efc8c1685aadd8e6dbae2b45 CI 1643618835 +1100 commit: fourth commit cool +67b2eea3191ca9a6efc8c1685aadd8e6dbae2b45 4b6f90d670c40e5ac78d9c405a5bc40932a0980b CI 1643618835 +1100 commit: fifth commit nice +4b6f90d670c40e5ac78d9c405a5bc40932a0980b 796a5a2670ccb2d08db89b9cfcaa07e9be5358e6 CI 1643618835 +1100 commit: sixth commit haha +796a5a2670ccb2d08db89b9cfcaa07e9be5358e6 41893d444283aa0c46aa7b5ee01811522cca473d CI 1643618835 +1100 commit: seventh commit yeah +41893d444283aa0c46aa7b5ee01811522cca473d d88617710499a59992caf98d6df1b5f981c58ab1 CI 1643618835 +1100 commit: eighth commit woo +d88617710499a59992caf98d6df1b5f981c58ab1 d88617710499a59992caf98d6df1b5f981c58ab1 CI 1643618835 +1100 checkout: moving from feature/cherry-picking to develop +d88617710499a59992caf98d6df1b5f981c58ab1 fa5c5dac095b577173e47b4a0c139525eced009f CI 1643618835 +1100 commit: first commit on develop +fa5c5dac095b577173e47b4a0c139525eced009f f37ec566036d715d6995f55dbc82a4fb3cf56f2f CI 1643618835 +1100 checkout: moving from develop to master +f37ec566036d715d6995f55dbc82a4fb3cf56f2f abdaa06b758aa198cc4afb9c406c87c5690d0ca0 CI 1643618835 +1100 commit: first commit on master +abdaa06b758aa198cc4afb9c406c87c5690d0ca0 fa5c5dac095b577173e47b4a0c139525eced009f CI 1643618835 +1100 checkout: moving from master to develop +fa5c5dac095b577173e47b4a0c139525eced009f 6c590c6a21f4e6d335528b5ecf6c52993b914996 CI 1643618835 +1100 commit: second commit on develop +6c590c6a21f4e6d335528b5ecf6c52993b914996 abdaa06b758aa198cc4afb9c406c87c5690d0ca0 CI 1643618835 +1100 checkout: moving from develop to master +abdaa06b758aa198cc4afb9c406c87c5690d0ca0 dd401e3ee3d58b648207cee7f737364a37139bea CI 1643618835 +1100 commit: second commit on master +dd401e3ee3d58b648207cee7f737364a37139bea 6c590c6a21f4e6d335528b5ecf6c52993b914996 CI 1643618835 +1100 checkout: moving from master to develop +6c590c6a21f4e6d335528b5ecf6c52993b914996 b2afb2548f2d143fdd691058f2283b03933a1749 CI 1643618835 +1100 commit: third commit on develop +b2afb2548f2d143fdd691058f2283b03933a1749 dd401e3ee3d58b648207cee7f737364a37139bea CI 1643618835 +1100 checkout: moving from develop to master +dd401e3ee3d58b648207cee7f737364a37139bea 34d20faa891d1857610dce8f790a35b702ebd7ee CI 1643618835 +1100 commit: third commit on master +34d20faa891d1857610dce8f790a35b702ebd7ee b2afb2548f2d143fdd691058f2283b03933a1749 CI 1643618835 +1100 checkout: moving from master to develop +b2afb2548f2d143fdd691058f2283b03933a1749 9a92a03fdc6eb492ea1ac7acf4fdb04962092f81 CI 1643618835 +1100 commit: fourth commit on develop +9a92a03fdc6eb492ea1ac7acf4fdb04962092f81 34d20faa891d1857610dce8f790a35b702ebd7ee CI 1643618835 +1100 checkout: moving from develop to master +34d20faa891d1857610dce8f790a35b702ebd7ee d4f8ef9f7c7602e92d2b2c7228bdaf3c7314d802 CI 1643618835 +1100 commit: fourth commit on master +d4f8ef9f7c7602e92d2b2c7228bdaf3c7314d802 d4f8ef9f7c7602e92d2b2c7228bdaf3c7314d802 CI 1643618835 +1100 checkout: moving from master to base_branch +d4f8ef9f7c7602e92d2b2c7228bdaf3c7314d802 c62b5bc94e327ddb9b545213ff77b207ade48aba CI 1643618835 +1100 commit: file +c62b5bc94e327ddb9b545213ff77b207ade48aba c62b5bc94e327ddb9b545213ff77b207ade48aba CI 1643618835 +1100 checkout: moving from base_branch to other_branch +c62b5bc94e327ddb9b545213ff77b207ade48aba c62b5bc94e327ddb9b545213ff77b207ade48aba CI 1643618835 +1100 checkout: moving from other_branch to base_branch +c62b5bc94e327ddb9b545213ff77b207ade48aba a51a44d96e13555215619b32065d0a22d95b8476 CI 1643618835 +1100 commit: file changed +a51a44d96e13555215619b32065d0a22d95b8476 c62b5bc94e327ddb9b545213ff77b207ade48aba CI 1643618835 +1100 checkout: moving from base_branch to other_branch +c62b5bc94e327ddb9b545213ff77b207ade48aba d7d52ecd690fe82c7d820ddb437e82d78b0fa7b2 CI 1643618855 +1100 commit (merge): Merge branch 'develop' into other_branch diff --git a/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/logs/refs/heads/base_branch b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/logs/refs/heads/base_branch new file mode 100644 index 000000000..9b14238c0 --- /dev/null +++ b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/logs/refs/heads/base_branch @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 d4f8ef9f7c7602e92d2b2c7228bdaf3c7314d802 CI 1643618835 +1100 branch: Created from HEAD +d4f8ef9f7c7602e92d2b2c7228bdaf3c7314d802 c62b5bc94e327ddb9b545213ff77b207ade48aba CI 1643618835 +1100 commit: file +c62b5bc94e327ddb9b545213ff77b207ade48aba a51a44d96e13555215619b32065d0a22d95b8476 CI 1643618835 +1100 commit: file changed diff --git a/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/logs/refs/heads/develop b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/logs/refs/heads/develop new file mode 100644 index 000000000..59e1aede7 --- /dev/null +++ b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/logs/refs/heads/develop @@ -0,0 +1,5 @@ +0000000000000000000000000000000000000000 d88617710499a59992caf98d6df1b5f981c58ab1 CI 1643618835 +1100 branch: Created from HEAD +d88617710499a59992caf98d6df1b5f981c58ab1 fa5c5dac095b577173e47b4a0c139525eced009f CI 1643618835 +1100 commit: first commit on develop +fa5c5dac095b577173e47b4a0c139525eced009f 6c590c6a21f4e6d335528b5ecf6c52993b914996 CI 1643618835 +1100 commit: second commit on develop +6c590c6a21f4e6d335528b5ecf6c52993b914996 b2afb2548f2d143fdd691058f2283b03933a1749 CI 1643618835 +1100 commit: third commit on develop +b2afb2548f2d143fdd691058f2283b03933a1749 9a92a03fdc6eb492ea1ac7acf4fdb04962092f81 CI 1643618835 +1100 commit: fourth commit on develop diff --git a/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/logs/refs/heads/feature/cherry-picking b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/logs/refs/heads/feature/cherry-picking new file mode 100644 index 000000000..752d03eb6 --- /dev/null +++ b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/logs/refs/heads/feature/cherry-picking @@ -0,0 +1,9 @@ +0000000000000000000000000000000000000000 f37ec566036d715d6995f55dbc82a4fb3cf56f2f CI 1643618835 +1100 branch: Created from HEAD +f37ec566036d715d6995f55dbc82a4fb3cf56f2f 21730e75ee0eec374cc54eb1140d24e03db834fc CI 1643618835 +1100 commit: first commit freshman year +21730e75ee0eec374cc54eb1140d24e03db834fc 0f8c9b8f1cac20c63e92e8df34f6d8b3fa74accd CI 1643618835 +1100 commit: second commit subway eat fresh +0f8c9b8f1cac20c63e92e8df34f6d8b3fa74accd 72c9bf1e687e81778850d517953c64f03adbaa1b CI 1643618835 +1100 commit: third commit fresh +72c9bf1e687e81778850d517953c64f03adbaa1b 67b2eea3191ca9a6efc8c1685aadd8e6dbae2b45 CI 1643618835 +1100 commit: fourth commit cool +67b2eea3191ca9a6efc8c1685aadd8e6dbae2b45 4b6f90d670c40e5ac78d9c405a5bc40932a0980b CI 1643618835 +1100 commit: fifth commit nice +4b6f90d670c40e5ac78d9c405a5bc40932a0980b 796a5a2670ccb2d08db89b9cfcaa07e9be5358e6 CI 1643618835 +1100 commit: sixth commit haha +796a5a2670ccb2d08db89b9cfcaa07e9be5358e6 41893d444283aa0c46aa7b5ee01811522cca473d CI 1643618835 +1100 commit: seventh commit yeah +41893d444283aa0c46aa7b5ee01811522cca473d d88617710499a59992caf98d6df1b5f981c58ab1 CI 1643618835 +1100 commit: eighth commit woo diff --git a/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..d27b9c51b --- /dev/null +++ b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,5 @@ +0000000000000000000000000000000000000000 f37ec566036d715d6995f55dbc82a4fb3cf56f2f CI 1643618835 +1100 commit (initial): first commit +f37ec566036d715d6995f55dbc82a4fb3cf56f2f abdaa06b758aa198cc4afb9c406c87c5690d0ca0 CI 1643618835 +1100 commit: first commit on master +abdaa06b758aa198cc4afb9c406c87c5690d0ca0 dd401e3ee3d58b648207cee7f737364a37139bea CI 1643618835 +1100 commit: second commit on master +dd401e3ee3d58b648207cee7f737364a37139bea 34d20faa891d1857610dce8f790a35b702ebd7ee CI 1643618835 +1100 commit: third commit on master +34d20faa891d1857610dce8f790a35b702ebd7ee d4f8ef9f7c7602e92d2b2c7228bdaf3c7314d802 CI 1643618835 +1100 commit: fourth commit on master diff --git a/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/logs/refs/heads/other_branch b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/logs/refs/heads/other_branch new file mode 100644 index 000000000..5842c42d8 --- /dev/null +++ b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/logs/refs/heads/other_branch @@ -0,0 +1,2 @@ +0000000000000000000000000000000000000000 c62b5bc94e327ddb9b545213ff77b207ade48aba CI 1643618835 +1100 branch: Created from HEAD +c62b5bc94e327ddb9b545213ff77b207ade48aba d7d52ecd690fe82c7d820ddb437e82d78b0fa7b2 CI 1643618855 +1100 commit (merge): Merge branch 'develop' into other_branch diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/09/cbe8c6717c06a61876b7b641a46a62bf3c585d b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/09/cbe8c6717c06a61876b7b641a46a62bf3c585d similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/objects/09/cbe8c6717c06a61876b7b641a46a62bf3c585d rename to test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/09/cbe8c6717c06a61876b7b641a46a62bf3c585d diff --git a/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/0f/8c9b8f1cac20c63e92e8df34f6d8b3fa74accd b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/0f/8c9b8f1cac20c63e92e8df34f6d8b3fa74accd new file mode 100644 index 000000000..aa6525a94 Binary files /dev/null and b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/0f/8c9b8f1cac20c63e92e8df34f6d8b3fa74accd differ diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/17/3a40ed58e33060166ccbfb7d0ccc0387be5f09 b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/17/3a40ed58e33060166ccbfb7d0ccc0387be5f09 similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/objects/17/3a40ed58e33060166ccbfb7d0ccc0387be5f09 rename to test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/17/3a40ed58e33060166ccbfb7d0ccc0387be5f09 diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/17/4a8c9444cfa700682d74059d9fa9be5749242c b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/17/4a8c9444cfa700682d74059d9fa9be5749242c similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/objects/17/4a8c9444cfa700682d74059d9fa9be5749242c rename to test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/17/4a8c9444cfa700682d74059d9fa9be5749242c diff --git a/test/integration/pullMerge/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/pullMerge/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/18/f469bc737f6c2a589205e2ddefceb32a7cc3a7 b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/18/f469bc737f6c2a589205e2ddefceb32a7cc3a7 similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/objects/18/f469bc737f6c2a589205e2ddefceb32a7cc3a7 rename to test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/18/f469bc737f6c2a589205e2ddefceb32a7cc3a7 diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/1b/9ae5f5dff631baaa180a30afd9983f83dc27ca b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/1b/9ae5f5dff631baaa180a30afd9983f83dc27ca similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/objects/1b/9ae5f5dff631baaa180a30afd9983f83dc27ca rename to test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/1b/9ae5f5dff631baaa180a30afd9983f83dc27ca diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/20/85c8dd0a80e95ed959e4db2ab98f66b970ad77 b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/20/85c8dd0a80e95ed959e4db2ab98f66b970ad77 similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/objects/20/85c8dd0a80e95ed959e4db2ab98f66b970ad77 rename to test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/20/85c8dd0a80e95ed959e4db2ab98f66b970ad77 diff --git a/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/21/730e75ee0eec374cc54eb1140d24e03db834fc b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/21/730e75ee0eec374cc54eb1140d24e03db834fc new file mode 100644 index 000000000..8d46c2d8b --- /dev/null +++ b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/21/730e75ee0eec374cc54eb1140d24e03db834fc @@ -0,0 +1 @@ +xŤŽKj1˝Ö)zŁ_{L0ĚjŽŃj˝ĆËcdśŰÇ d[TAéŢÚuPđń0:@ި~"Ą0ŐhQ"$¨.1‘Ů=¤ă>Čâš™§ČőčsĺeÉ–s-:IV˘Zf ćä{\öNëF§u;ă%íqçîí‹<§Č~žc¦ď§É˝é{jŕźşłkú«Č:ž—&wút÷ äBCą \ No newline at end of file diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/21/78af7503938665881174069be4d48fa483e4af b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/21/78af7503938665881174069be4d48fa483e4af similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/objects/21/78af7503938665881174069be4d48fa483e4af rename to test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/21/78af7503938665881174069be4d48fa483e4af diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/22/b0fd807dd5e428c2d818aef6a2311d7c11e885 b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/22/b0fd807dd5e428c2d818aef6a2311d7c11e885 similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/objects/22/b0fd807dd5e428c2d818aef6a2311d7c11e885 rename to test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/22/b0fd807dd5e428c2d818aef6a2311d7c11e885 diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/24/6f7487e08e6330ccbec4053e701145d53f64d4 b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/24/6f7487e08e6330ccbec4053e701145d53f64d4 similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/objects/24/6f7487e08e6330ccbec4053e701145d53f64d4 rename to test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/24/6f7487e08e6330ccbec4053e701145d53f64d4 diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/2e/cced19ece4424e0d3f26eb3ea2ccb6bfeafaa8 b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/2e/cced19ece4424e0d3f26eb3ea2ccb6bfeafaa8 similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/objects/2e/cced19ece4424e0d3f26eb3ea2ccb6bfeafaa8 rename to test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/2e/cced19ece4424e0d3f26eb3ea2ccb6bfeafaa8 diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/32/d15fd4451b6693a93d6420c8af6cfc99348e71 b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/32/d15fd4451b6693a93d6420c8af6cfc99348e71 similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/objects/32/d15fd4451b6693a93d6420c8af6cfc99348e71 rename to test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/32/d15fd4451b6693a93d6420c8af6cfc99348e71 diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/34/c74161eef968fc951cf170a011fa8abfeddbcd b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/34/c74161eef968fc951cf170a011fa8abfeddbcd similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/objects/34/c74161eef968fc951cf170a011fa8abfeddbcd rename to test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/34/c74161eef968fc951cf170a011fa8abfeddbcd diff --git a/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/34/d20faa891d1857610dce8f790a35b702ebd7ee b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/34/d20faa891d1857610dce8f790a35b702ebd7ee new file mode 100644 index 000000000..d729e28f3 --- /dev/null +++ b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/34/d20faa891d1857610dce8f790a35b702ebd7ee @@ -0,0 +1,3 @@ +xŤÎA +Â0…a×9ĹěÉt¦ÉD„®zŚi3ĄcKŚŕń-x·Ź˙7m9Żßťj1Łč[OI­bdşŃ8±ĚĘBĆ:»]‹=+¤ÄŤĚ(µ2–ĆÇÉ,Α"VŠH‡U§ďşlú®ýp·Źćýa—iË7ŔŔP„Z8#zďŽő8UíĎÜŐe- ~ +¶'d}Ř}Îç?+ \ No newline at end of file diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/36/e0ef3e52c6e29e64980c71defbab6064d2da8c b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/36/e0ef3e52c6e29e64980c71defbab6064d2da8c similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/objects/36/e0ef3e52c6e29e64980c71defbab6064d2da8c rename to test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/36/e0ef3e52c6e29e64980c71defbab6064d2da8c diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/38/08a710b52a152bb73805fe274e0d877cf61800 b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/38/08a710b52a152bb73805fe274e0d877cf61800 similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/objects/38/08a710b52a152bb73805fe274e0d877cf61800 rename to test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/38/08a710b52a152bb73805fe274e0d877cf61800 diff --git a/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/41/893d444283aa0c46aa7b5ee01811522cca473d b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/41/893d444283aa0c46aa7b5ee01811522cca473d new file mode 100644 index 000000000..9e653599d --- /dev/null +++ b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/41/893d444283aa0c46aa7b5ee01811522cca473d @@ -0,0 +1,3 @@ +xŤŽK +Â0@]çłd’]ő“É” +Ć–EooŔ ¸}ĽŹ—ZŻ ú]ŰD  Ç)ăvLÎeÇÎČ»MëNĂH·a|ŕ#ËöÄE×ĺNŽc`—Rččěśµć ÇTĂźş©smý*zÍ +ó!»?· \ No newline at end of file diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/4f/80ec0c7b09eeeb580d0c19947477c02bc88c25 b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/4f/80ec0c7b09eeeb580d0c19947477c02bc88c25 similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/objects/4f/80ec0c7b09eeeb580d0c19947477c02bc88c25 rename to test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/4f/80ec0c7b09eeeb580d0c19947477c02bc88c25 diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/5d/a4d9200457542d875fe4def54ac98c16332db0 b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/5d/a4d9200457542d875fe4def54ac98c16332db0 similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/objects/5d/a4d9200457542d875fe4def54ac98c16332db0 rename to test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/5d/a4d9200457542d875fe4def54ac98c16332db0 diff --git a/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/5e/66799d4a5a3fed89757f3df445a962c9ce2d4f b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/5e/66799d4a5a3fed89757f3df445a962c9ce2d4f new file mode 100644 index 000000000..807874f1c Binary files /dev/null and b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/5e/66799d4a5a3fed89757f3df445a962c9ce2d4f differ diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/5f/3e4598b46a912f0f95a4898743e979343c82f3 b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/5f/3e4598b46a912f0f95a4898743e979343c82f3 similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/objects/5f/3e4598b46a912f0f95a4898743e979343c82f3 rename to test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/5f/3e4598b46a912f0f95a4898743e979343c82f3 diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/60/91d709b275e712111d016d9b3a4fb44e63f1f6 b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/60/91d709b275e712111d016d9b3a4fb44e63f1f6 similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/objects/60/91d709b275e712111d016d9b3a4fb44e63f1f6 rename to test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/60/91d709b275e712111d016d9b3a4fb44e63f1f6 diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/61/01e935461d4cd862ae4a720846e87880d198b9 b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/61/01e935461d4cd862ae4a720846e87880d198b9 similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/objects/61/01e935461d4cd862ae4a720846e87880d198b9 rename to test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/61/01e935461d4cd862ae4a720846e87880d198b9 diff --git a/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/67/b2eea3191ca9a6efc8c1685aadd8e6dbae2b45 b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/67/b2eea3191ca9a6efc8c1685aadd8e6dbae2b45 new file mode 100644 index 000000000..8bd1d7993 Binary files /dev/null and b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/67/b2eea3191ca9a6efc8c1685aadd8e6dbae2b45 differ diff --git a/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/6c/590c6a21f4e6d335528b5ecf6c52993b914996 b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/6c/590c6a21f4e6d335528b5ecf6c52993b914996 new file mode 100644 index 000000000..5400b19fc Binary files /dev/null and b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/6c/590c6a21f4e6d335528b5ecf6c52993b914996 differ diff --git a/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/72/c9bf1e687e81778850d517953c64f03adbaa1b b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/72/c9bf1e687e81778850d517953c64f03adbaa1b new file mode 100644 index 000000000..8a19f046d --- /dev/null +++ b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/72/c9bf1e687e81778850d517953c64f03adbaa1b @@ -0,0 +1,2 @@ +xŤŽK +Â0@]çł$˙¤ "tŐcLf&´`m‰<ľ/ŕöń<ÚÖué`u8ő&ś1QĐLXĽ-¶D+R"&!‰Vł˘/ěŐŽMžtÍ4”\ !YMŃÉ`%suľFÎĹUL‰Xá»Ď[q‚ë8Ýĺëţ më Lô.šś]€ł1Z«S]ţÔUź—Ćđ« 6yÍę ¨ô@” \ No newline at end of file diff --git a/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/72/df4fceb0be99deb091ece3f501ef80b39a876a b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/72/df4fceb0be99deb091ece3f501ef80b39a876a new file mode 100644 index 000000000..19670ff5a Binary files /dev/null and b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/72/df4fceb0be99deb091ece3f501ef80b39a876a differ diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/78/3666de4acbb22a9efc205197667f5136118c54 b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/78/3666de4acbb22a9efc205197667f5136118c54 similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/objects/78/3666de4acbb22a9efc205197667f5136118c54 rename to test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/78/3666de4acbb22a9efc205197667f5136118c54 diff --git a/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/79/6a5a2670ccb2d08db89b9cfcaa07e9be5358e6 b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/79/6a5a2670ccb2d08db89b9cfcaa07e9be5358e6 new file mode 100644 index 000000000..5701fff23 --- /dev/null +++ b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/79/6a5a2670ccb2d08db89b9cfcaa07e9be5358e6 @@ -0,0 +1,2 @@ +xŤŽK +1D]ç˝$ťołšct~D0Î0Făđ®ŞxÔŠkkŹJšSßs†)ˇqĆ;6¬})ĹŰ@äP±GR„™IKbă=ż:ŕĘ$“ó2™-GOiŐ˛ #&­XN$ŕOŻëó×yąçŰöĚ—¸¶ 3Ú!‘¶pF”R :Nőüç\ĽGŻđł reńá†=‰ \ No newline at end of file diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/88/9b0fdfe5f2ae3d7df3066f3bc1e181fa712c8d b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/88/9b0fdfe5f2ae3d7df3066f3bc1e181fa712c8d similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/objects/88/9b0fdfe5f2ae3d7df3066f3bc1e181fa712c8d rename to test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/88/9b0fdfe5f2ae3d7df3066f3bc1e181fa712c8d diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/88/c39cdc29c995f8e1a63ccd48e7bbd6d96cb8b8 b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/88/c39cdc29c995f8e1a63ccd48e7bbd6d96cb8b8 similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/objects/88/c39cdc29c995f8e1a63ccd48e7bbd6d96cb8b8 rename to test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/88/c39cdc29c995f8e1a63ccd48e7bbd6d96cb8b8 diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/90/a84fd62f8033027fab3e567a81d5ed2a6a71cd b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/90/a84fd62f8033027fab3e567a81d5ed2a6a71cd similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/objects/90/a84fd62f8033027fab3e567a81d5ed2a6a71cd rename to test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/90/a84fd62f8033027fab3e567a81d5ed2a6a71cd diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/91/65a12a95d3b2b9b8a0374de787af169b2c339e b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/91/65a12a95d3b2b9b8a0374de787af169b2c339e similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/objects/91/65a12a95d3b2b9b8a0374de787af169b2c339e rename to test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/91/65a12a95d3b2b9b8a0374de787af169b2c339e diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/95/9d7a10da71acf97b17300b40a3b4f30903e09c b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/95/9d7a10da71acf97b17300b40a3b4f30903e09c similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/objects/95/9d7a10da71acf97b17300b40a3b4f30903e09c rename to test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/95/9d7a10da71acf97b17300b40a3b4f30903e09c diff --git a/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/9a/92a03fdc6eb492ea1ac7acf4fdb04962092f81 b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/9a/92a03fdc6eb492ea1ac7acf4fdb04962092f81 new file mode 100644 index 000000000..03e4507e8 Binary files /dev/null and b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/9a/92a03fdc6eb492ea1ac7acf4fdb04962092f81 differ diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/9d/e8260b738a34a74533df54f2e404276aa96242 b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/9d/e8260b738a34a74533df54f2e404276aa96242 similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/objects/9d/e8260b738a34a74533df54f2e404276aa96242 rename to test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/9d/e8260b738a34a74533df54f2e404276aa96242 diff --git a/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/a5/1a44d96e13555215619b32065d0a22d95b8476 b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/a5/1a44d96e13555215619b32065d0a22d95b8476 new file mode 100644 index 000000000..9d703767e --- /dev/null +++ b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/a5/1a44d96e13555215619b32065d0a22d95b8476 @@ -0,0 +1,2 @@ +xŤÎK +Â0€a×9Eö‚dňšD„®zŚÉdb öA‰ŕńíÜţ|‹ź·e™»†ś/ýŃ |dlXzÄÄ@ŐpË$E|¶Ţ"c«v:d횣-ˇpöâ,ÖZr >Xp­!kŞřD…}ú´ző}źňĄeËŤ·ĺˇ!z!%ôŔuÖsŞËź\µů-š'Z_RŐ­Ë=K \ No newline at end of file diff --git a/test/integration/pullMerge/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/pullMerge/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/ab/daa06b758aa198cc4afb9c406c87c5690d0ca0 b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/ab/daa06b758aa198cc4afb9c406c87c5690d0ca0 new file mode 100644 index 000000000..e58f89e99 Binary files /dev/null and b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/ab/daa06b758aa198cc4afb9c406c87c5690d0ca0 differ diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/af/a76754c933269d7cd45630a7184a20849dbe9c b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/af/a76754c933269d7cd45630a7184a20849dbe9c similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/objects/af/a76754c933269d7cd45630a7184a20849dbe9c rename to test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/af/a76754c933269d7cd45630a7184a20849dbe9c diff --git a/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/b2/afb2548f2d143fdd691058f2283b03933a1749 b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/b2/afb2548f2d143fdd691058f2283b03933a1749 new file mode 100644 index 000000000..88f896a17 --- /dev/null +++ b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/b2/afb2548f2d143fdd691058f2283b03933a1749 @@ -0,0 +1,4 @@ +xŤŽM +0F»Î)f_(3N(ĄŕĘcägDAŤHZzü +˝@·ß{ľTÖu®Đ^ęˇ +â$·0‡–BĄŤÔ2b´8Ú‘Q%™=şUđÉ &­úĚě\ÓE§ihďýCö.™”qÖǨ]Q„WÔă×qşó'”}ĺK¬ĺhHtNi8#J)zśęü§.ňŇž~Ô ży­»ř[? \ No newline at end of file diff --git a/test/integration/mergeConflictsFiltered/expected/.git_keep/objects/fd/31cea7e0b6e8d334280be34db8dd86cdda3007 b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/fd/31cea7e0b6e8d334280be34db8dd86cdda3007 similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/.git_keep/objects/fd/31cea7e0b6e8d334280be34db8dd86cdda3007 rename to test/integration/mergeConflictsFiltered/expected/repo/.git_keep/objects/fd/31cea7e0b6e8d334280be34db8dd86cdda3007 diff --git a/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/refs/heads/base_branch b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/refs/heads/base_branch new file mode 100644 index 000000000..504dbe400 --- /dev/null +++ b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/refs/heads/base_branch @@ -0,0 +1 @@ +a51a44d96e13555215619b32065d0a22d95b8476 diff --git a/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/refs/heads/develop b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/refs/heads/develop new file mode 100644 index 000000000..a63801a54 --- /dev/null +++ b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/refs/heads/develop @@ -0,0 +1 @@ +9a92a03fdc6eb492ea1ac7acf4fdb04962092f81 diff --git a/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/refs/heads/feature/cherry-picking b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/refs/heads/feature/cherry-picking new file mode 100644 index 000000000..d09c7755e --- /dev/null +++ b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/refs/heads/feature/cherry-picking @@ -0,0 +1 @@ +d88617710499a59992caf98d6df1b5f981c58ab1 diff --git a/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/refs/heads/master b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..7a24b5e07 --- /dev/null +++ b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +d4f8ef9f7c7602e92d2b2c7228bdaf3c7314d802 diff --git a/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/refs/heads/other_branch b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/refs/heads/other_branch new file mode 100644 index 000000000..1e24c496e --- /dev/null +++ b/test/integration/mergeConflictsFiltered/expected/repo/.git_keep/refs/heads/other_branch @@ -0,0 +1 @@ +d7d52ecd690fe82c7d820ddb437e82d78b0fa7b2 diff --git a/test/integration/mergeConflictsFiltered/expected/cherrypicking1 b/test/integration/mergeConflictsFiltered/expected/repo/cherrypicking1 similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/cherrypicking1 rename to test/integration/mergeConflictsFiltered/expected/repo/cherrypicking1 diff --git a/test/integration/mergeConflictsFiltered/expected/cherrypicking2 b/test/integration/mergeConflictsFiltered/expected/repo/cherrypicking2 similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/cherrypicking2 rename to test/integration/mergeConflictsFiltered/expected/repo/cherrypicking2 diff --git a/test/integration/mergeConflictsFiltered/expected/cherrypicking3 b/test/integration/mergeConflictsFiltered/expected/repo/cherrypicking3 similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/cherrypicking3 rename to test/integration/mergeConflictsFiltered/expected/repo/cherrypicking3 diff --git a/test/integration/mergeConflictsFiltered/expected/cherrypicking4 b/test/integration/mergeConflictsFiltered/expected/repo/cherrypicking4 similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/cherrypicking4 rename to test/integration/mergeConflictsFiltered/expected/repo/cherrypicking4 diff --git a/test/integration/mergeConflictsFiltered/expected/cherrypicking5 b/test/integration/mergeConflictsFiltered/expected/repo/cherrypicking5 similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/cherrypicking5 rename to test/integration/mergeConflictsFiltered/expected/repo/cherrypicking5 diff --git a/test/integration/mergeConflictsFiltered/expected/cherrypicking6 b/test/integration/mergeConflictsFiltered/expected/repo/cherrypicking6 similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/cherrypicking6 rename to test/integration/mergeConflictsFiltered/expected/repo/cherrypicking6 diff --git a/test/integration/mergeConflictsFiltered/expected/cherrypicking7 b/test/integration/mergeConflictsFiltered/expected/repo/cherrypicking7 similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/cherrypicking7 rename to test/integration/mergeConflictsFiltered/expected/repo/cherrypicking7 diff --git a/test/integration/mergeConflictsFiltered/expected/cherrypicking8 b/test/integration/mergeConflictsFiltered/expected/repo/cherrypicking8 similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/cherrypicking8 rename to test/integration/mergeConflictsFiltered/expected/repo/cherrypicking8 diff --git a/test/integration/mergeConflictsFiltered/expected/cherrypicking9 b/test/integration/mergeConflictsFiltered/expected/repo/cherrypicking9 similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/cherrypicking9 rename to test/integration/mergeConflictsFiltered/expected/repo/cherrypicking9 diff --git a/test/integration/mergeConflictsFiltered/expected/directory/file b/test/integration/mergeConflictsFiltered/expected/repo/directory/file similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/directory/file rename to test/integration/mergeConflictsFiltered/expected/repo/directory/file diff --git a/test/integration/patchBuilding2/expected/myfile3 b/test/integration/mergeConflictsFiltered/expected/repo/directory/file2 similarity index 100% rename from test/integration/patchBuilding2/expected/myfile3 rename to test/integration/mergeConflictsFiltered/expected/repo/directory/file2 diff --git a/test/integration/mergeConflictsFiltered/expected/file b/test/integration/mergeConflictsFiltered/expected/repo/file similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/file rename to test/integration/mergeConflictsFiltered/expected/repo/file diff --git a/test/integration/mergeConflictsFiltered/expected/repo/file1 b/test/integration/mergeConflictsFiltered/expected/repo/file1 new file mode 100644 index 000000000..dcd348507 --- /dev/null +++ b/test/integration/mergeConflictsFiltered/expected/repo/file1 @@ -0,0 +1,63 @@ +Here is a story that has been told throuhg the ages +once upon a time there was a cat +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +once upon a time there was another cat diff --git a/test/integration/mergeConflictsFiltered/expected/file4 b/test/integration/mergeConflictsFiltered/expected/repo/file3 similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/file4 rename to test/integration/mergeConflictsFiltered/expected/repo/file3 diff --git a/test/integration/mergeConflictsFiltered/expected/file5 b/test/integration/mergeConflictsFiltered/expected/repo/file4 similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/file5 rename to test/integration/mergeConflictsFiltered/expected/repo/file4 diff --git a/test/integration/mergeConflictsFiltered/expected/file3 b/test/integration/mergeConflictsFiltered/expected/repo/file5 similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/file3 rename to test/integration/mergeConflictsFiltered/expected/repo/file5 diff --git a/test/integration/mergeConflictsFiltered/recording.json b/test/integration/mergeConflictsFiltered/recording.json index 2a7ab1ab3..6d620e9e3 100644 --- a/test/integration/mergeConflictsFiltered/recording.json +++ b/test/integration/mergeConflictsFiltered/recording.json @@ -1 +1 @@ -{"KeyEvents":[{"Timestamp":626,"Mod":0,"Key":259,"Ch":0},{"Timestamp":930,"Mod":0,"Key":258,"Ch":0},{"Timestamp":1065,"Mod":0,"Key":258,"Ch":0},{"Timestamp":1202,"Mod":0,"Key":258,"Ch":0},{"Timestamp":1818,"Mod":0,"Key":256,"Ch":77},{"Timestamp":2234,"Mod":0,"Key":13,"Ch":13},{"Timestamp":2929,"Mod":0,"Key":13,"Ch":13},{"Timestamp":3474,"Mod":0,"Key":258,"Ch":0},{"Timestamp":3739,"Mod":0,"Key":258,"Ch":0},{"Timestamp":3890,"Mod":0,"Key":258,"Ch":0},{"Timestamp":4401,"Mod":0,"Key":256,"Ch":32},{"Timestamp":4714,"Mod":0,"Key":256,"Ch":32},{"Timestamp":5681,"Mod":0,"Key":256,"Ch":32},{"Timestamp":6003,"Mod":0,"Key":258,"Ch":0},{"Timestamp":6226,"Mod":0,"Key":256,"Ch":32},{"Timestamp":8394,"Mod":2,"Key":2,"Ch":2},{"Timestamp":9194,"Mod":0,"Key":13,"Ch":13},{"Timestamp":9691,"Mod":0,"Key":258,"Ch":0},{"Timestamp":9842,"Mod":0,"Key":258,"Ch":0},{"Timestamp":10041,"Mod":0,"Key":256,"Ch":32},{"Timestamp":10322,"Mod":0,"Key":258,"Ch":0},{"Timestamp":10610,"Mod":0,"Key":256,"Ch":32},{"Timestamp":11682,"Mod":2,"Key":2,"Ch":2},{"Timestamp":12113,"Mod":0,"Key":258,"Ch":0},{"Timestamp":12458,"Mod":0,"Key":13,"Ch":13},{"Timestamp":12994,"Mod":0,"Key":257,"Ch":0},{"Timestamp":13210,"Mod":0,"Key":256,"Ch":32},{"Timestamp":13842,"Mod":2,"Key":2,"Ch":2},{"Timestamp":15075,"Mod":0,"Key":258,"Ch":0},{"Timestamp":15290,"Mod":0,"Key":258,"Ch":0},{"Timestamp":15890,"Mod":0,"Key":256,"Ch":32},{"Timestamp":16778,"Mod":0,"Key":257,"Ch":0},{"Timestamp":17130,"Mod":0,"Key":256,"Ch":32},{"Timestamp":17546,"Mod":0,"Key":256,"Ch":32},{"Timestamp":18250,"Mod":0,"Key":256,"Ch":32},{"Timestamp":18626,"Mod":0,"Key":257,"Ch":0},{"Timestamp":18882,"Mod":0,"Key":256,"Ch":32},{"Timestamp":19210,"Mod":0,"Key":256,"Ch":32},{"Timestamp":19762,"Mod":0,"Key":257,"Ch":0},{"Timestamp":20002,"Mod":0,"Key":256,"Ch":32},{"Timestamp":20322,"Mod":0,"Key":256,"Ch":32},{"Timestamp":20746,"Mod":0,"Key":256,"Ch":32},{"Timestamp":21138,"Mod":0,"Key":256,"Ch":32},{"Timestamp":22724,"Mod":0,"Key":27,"Ch":0},{"Timestamp":24410,"Mod":0,"Key":256,"Ch":77},{"Timestamp":25725,"Mod":0,"Key":27,"Ch":0},{"Timestamp":26017,"Mod":0,"Key":256,"Ch":109},{"Timestamp":26745,"Mod":0,"Key":13,"Ch":13},{"Timestamp":27826,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":272,"Height":74}]} \ No newline at end of file +{"KeyEvents":[{"Timestamp":682,"Mod":0,"Key":259,"Ch":0},{"Timestamp":929,"Mod":0,"Key":258,"Ch":0},{"Timestamp":1104,"Mod":0,"Key":258,"Ch":0},{"Timestamp":1417,"Mod":0,"Key":258,"Ch":0},{"Timestamp":1953,"Mod":0,"Key":256,"Ch":77},{"Timestamp":2241,"Mod":0,"Key":13,"Ch":13},{"Timestamp":2729,"Mod":0,"Key":13,"Ch":13},{"Timestamp":3233,"Mod":0,"Key":258,"Ch":0},{"Timestamp":3489,"Mod":0,"Key":256,"Ch":32},{"Timestamp":4048,"Mod":0,"Key":256,"Ch":32},{"Timestamp":4353,"Mod":0,"Key":258,"Ch":0},{"Timestamp":4673,"Mod":0,"Key":256,"Ch":32},{"Timestamp":4992,"Mod":0,"Key":258,"Ch":0},{"Timestamp":5208,"Mod":0,"Key":256,"Ch":32},{"Timestamp":6408,"Mod":2,"Key":2,"Ch":2},{"Timestamp":7145,"Mod":0,"Key":13,"Ch":13},{"Timestamp":7625,"Mod":0,"Key":258,"Ch":0},{"Timestamp":7841,"Mod":0,"Key":258,"Ch":0},{"Timestamp":8056,"Mod":0,"Key":258,"Ch":0},{"Timestamp":8520,"Mod":0,"Key":256,"Ch":32},{"Timestamp":8897,"Mod":0,"Key":256,"Ch":32},{"Timestamp":9233,"Mod":0,"Key":256,"Ch":32},{"Timestamp":9633,"Mod":2,"Key":2,"Ch":2},{"Timestamp":10016,"Mod":0,"Key":258,"Ch":0},{"Timestamp":10393,"Mod":0,"Key":13,"Ch":13},{"Timestamp":10881,"Mod":0,"Key":258,"Ch":0},{"Timestamp":11137,"Mod":0,"Key":258,"Ch":0},{"Timestamp":11473,"Mod":0,"Key":258,"Ch":0},{"Timestamp":11809,"Mod":0,"Key":258,"Ch":0},{"Timestamp":12056,"Mod":0,"Key":256,"Ch":32},{"Timestamp":12354,"Mod":0,"Key":256,"Ch":32},{"Timestamp":12921,"Mod":2,"Key":2,"Ch":2},{"Timestamp":13481,"Mod":0,"Key":258,"Ch":0},{"Timestamp":13681,"Mod":0,"Key":258,"Ch":0},{"Timestamp":13945,"Mod":0,"Key":13,"Ch":13},{"Timestamp":14992,"Mod":0,"Key":256,"Ch":32},{"Timestamp":15408,"Mod":0,"Key":256,"Ch":32},{"Timestamp":15929,"Mod":0,"Key":256,"Ch":32},{"Timestamp":16185,"Mod":0,"Key":257,"Ch":0},{"Timestamp":16401,"Mod":0,"Key":256,"Ch":32},{"Timestamp":16753,"Mod":0,"Key":256,"Ch":32},{"Timestamp":17353,"Mod":0,"Key":256,"Ch":32},{"Timestamp":17640,"Mod":0,"Key":258,"Ch":0},{"Timestamp":17825,"Mod":0,"Key":256,"Ch":32},{"Timestamp":18249,"Mod":0,"Key":256,"Ch":32},{"Timestamp":18457,"Mod":0,"Key":257,"Ch":0},{"Timestamp":18673,"Mod":0,"Key":256,"Ch":32},{"Timestamp":19593,"Mod":0,"Key":13,"Ch":13},{"Timestamp":20641,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":272,"Height":74}]} \ No newline at end of file diff --git a/test/integration/mergeConflictsFiltered/test.json b/test/integration/mergeConflictsFiltered/test.json index 7d6d3b9ca..7402aede2 100644 --- a/test/integration/mergeConflictsFiltered/test.json +++ b/test/integration/mergeConflictsFiltered/test.json @@ -1,4 +1,4 @@ { "description": "Verify that when we get merge conflicts we filter out any non-conflicted files", - "speed": 20 + "speed": 5 } diff --git a/test/integration/mergeConflictsResolvedExternally/expected/.git_keep/COMMIT_EDITMSG b/test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/mergeConflictsResolvedExternally/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/patchBuildingWithFiletree/expected/.git_keep/FETCH_HEAD b/test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/patchBuildingWithFiletree/expected/.git_keep/FETCH_HEAD rename to test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/mergeConflictsResolvedExternally/expected/.git_keep/HEAD b/test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/mergeConflictsResolvedExternally/expected/.git_keep/HEAD rename to test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/HEAD diff --git a/test/integration/mergeConflictsResolvedExternally/expected/.git_keep/ORIG_HEAD b/test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/ORIG_HEAD similarity index 100% rename from test/integration/mergeConflictsResolvedExternally/expected/.git_keep/ORIG_HEAD rename to test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/ORIG_HEAD diff --git a/test/integration/patchBuilding/expected/.git_keep/config b/test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/config similarity index 100% rename from test/integration/patchBuilding/expected/.git_keep/config rename to test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/config diff --git a/test/integration/pullMergeConflict/expected_remote/description b/test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/description similarity index 100% rename from test/integration/pullMergeConflict/expected_remote/description rename to test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/description diff --git a/test/integration/mergeConflictsResolvedExternally/expected/.git_keep/index b/test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/index similarity index 100% rename from test/integration/mergeConflictsResolvedExternally/expected/.git_keep/index rename to test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/index diff --git a/test/integration/pullAndSetUpstream/expected/.git_keep/info/exclude b/test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/pullAndSetUpstream/expected/.git_keep/info/exclude rename to test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/info/exclude diff --git a/test/integration/mergeConflictsResolvedExternally/expected/.git_keep/logs/HEAD b/test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/mergeConflictsResolvedExternally/expected/.git_keep/logs/HEAD rename to test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/mergeConflictsResolvedExternally/expected/.git_keep/logs/refs/heads/master b/test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/mergeConflictsResolvedExternally/expected/.git_keep/logs/refs/heads/master rename to test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/mergeConflictsResolvedExternally/expected/.git_keep/logs/refs/heads/other b/test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/logs/refs/heads/other similarity index 100% rename from test/integration/mergeConflictsResolvedExternally/expected/.git_keep/logs/refs/heads/other rename to test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/logs/refs/heads/other diff --git a/test/integration/mergeConflictsResolvedExternally/expected/.git_keep/objects/03/959db9f70fcb4a8f0931e4ad64e1c9ec1016a4 b/test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/objects/03/959db9f70fcb4a8f0931e4ad64e1c9ec1016a4 similarity index 100% rename from test/integration/mergeConflictsResolvedExternally/expected/.git_keep/objects/03/959db9f70fcb4a8f0931e4ad64e1c9ec1016a4 rename to test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/objects/03/959db9f70fcb4a8f0931e4ad64e1c9ec1016a4 diff --git a/test/integration/mergeConflictsResolvedExternally/expected/.git_keep/objects/08/84a47e04257f4c85435a8b10ff4f15fffa63fc b/test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/objects/08/84a47e04257f4c85435a8b10ff4f15fffa63fc similarity index 100% rename from test/integration/mergeConflictsResolvedExternally/expected/.git_keep/objects/08/84a47e04257f4c85435a8b10ff4f15fffa63fc rename to test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/objects/08/84a47e04257f4c85435a8b10ff4f15fffa63fc diff --git a/test/integration/mergeConflictsResolvedExternally/expected/.git_keep/objects/0b/e6e80a67f6276c5ede28dd6b8fa8873f1b23c5 b/test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/objects/0b/e6e80a67f6276c5ede28dd6b8fa8873f1b23c5 similarity index 100% rename from test/integration/mergeConflictsResolvedExternally/expected/.git_keep/objects/0b/e6e80a67f6276c5ede28dd6b8fa8873f1b23c5 rename to test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/objects/0b/e6e80a67f6276c5ede28dd6b8fa8873f1b23c5 diff --git a/test/integration/mergeConflictsResolvedExternally/expected/.git_keep/objects/2d/8021ed8803ed6142d31b331850ef46246391a7 b/test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/objects/2d/8021ed8803ed6142d31b331850ef46246391a7 similarity index 100% rename from test/integration/mergeConflictsResolvedExternally/expected/.git_keep/objects/2d/8021ed8803ed6142d31b331850ef46246391a7 rename to test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/objects/2d/8021ed8803ed6142d31b331850ef46246391a7 diff --git a/test/integration/mergeConflictsResolvedExternally/expected/.git_keep/objects/53/502c7023f80c046a1b00b45614d5ffef8977d9 b/test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/objects/53/502c7023f80c046a1b00b45614d5ffef8977d9 similarity index 100% rename from test/integration/mergeConflictsResolvedExternally/expected/.git_keep/objects/53/502c7023f80c046a1b00b45614d5ffef8977d9 rename to test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/objects/53/502c7023f80c046a1b00b45614d5ffef8977d9 diff --git a/test/integration/mergeConflictsResolvedExternally/expected/.git_keep/objects/69/1ee9e9d9c654c81214f56c514ff725f46cb9e4 b/test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/objects/69/1ee9e9d9c654c81214f56c514ff725f46cb9e4 similarity index 100% rename from test/integration/mergeConflictsResolvedExternally/expected/.git_keep/objects/69/1ee9e9d9c654c81214f56c514ff725f46cb9e4 rename to test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/objects/69/1ee9e9d9c654c81214f56c514ff725f46cb9e4 diff --git a/test/integration/mergeConflictsResolvedExternally/expected/.git_keep/objects/6b/03bc7537ecf00b48a0ea57ce1edf388ed3f1ad b/test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/objects/6b/03bc7537ecf00b48a0ea57ce1edf388ed3f1ad similarity index 100% rename from test/integration/mergeConflictsResolvedExternally/expected/.git_keep/objects/6b/03bc7537ecf00b48a0ea57ce1edf388ed3f1ad rename to test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/objects/6b/03bc7537ecf00b48a0ea57ce1edf388ed3f1ad diff --git a/test/integration/mergeConflictsResolvedExternally/expected/.git_keep/objects/76/9c8b8d89700f6f196b8331159150746a839662 b/test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/objects/76/9c8b8d89700f6f196b8331159150746a839662 similarity index 100% rename from test/integration/mergeConflictsResolvedExternally/expected/.git_keep/objects/76/9c8b8d89700f6f196b8331159150746a839662 rename to test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/objects/76/9c8b8d89700f6f196b8331159150746a839662 diff --git a/test/integration/mergeConflictsResolvedExternally/expected/.git_keep/objects/bd/2b32f02abf86a2bb79a12ab09758e44b204b34 b/test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/objects/bd/2b32f02abf86a2bb79a12ab09758e44b204b34 similarity index 100% rename from test/integration/mergeConflictsResolvedExternally/expected/.git_keep/objects/bd/2b32f02abf86a2bb79a12ab09758e44b204b34 rename to test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/objects/bd/2b32f02abf86a2bb79a12ab09758e44b204b34 diff --git a/test/integration/mergeConflictsResolvedExternally/expected/.git_keep/objects/c0/565d7cfcf1039c969105f2e1c86ca5eff64381 b/test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/objects/c0/565d7cfcf1039c969105f2e1c86ca5eff64381 similarity index 100% rename from test/integration/mergeConflictsResolvedExternally/expected/.git_keep/objects/c0/565d7cfcf1039c969105f2e1c86ca5eff64381 rename to test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/objects/c0/565d7cfcf1039c969105f2e1c86ca5eff64381 diff --git a/test/integration/mergeConflictsResolvedExternally/expected/.git_keep/objects/f2/df244fb87b6ba1d2ab484d76c66baba168a867 b/test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/objects/f2/df244fb87b6ba1d2ab484d76c66baba168a867 similarity index 100% rename from test/integration/mergeConflictsResolvedExternally/expected/.git_keep/objects/f2/df244fb87b6ba1d2ab484d76c66baba168a867 rename to test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/objects/f2/df244fb87b6ba1d2ab484d76c66baba168a867 diff --git a/test/integration/mergeConflictsResolvedExternally/expected/.git_keep/refs/heads/master b/test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/mergeConflictsResolvedExternally/expected/.git_keep/refs/heads/master rename to test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/mergeConflictsResolvedExternally/expected/.git_keep/refs/heads/other b/test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/refs/heads/other similarity index 100% rename from test/integration/mergeConflictsResolvedExternally/expected/.git_keep/refs/heads/other rename to test/integration/mergeConflictsResolvedExternally/expected/repo/.git_keep/refs/heads/other diff --git a/test/integration/mergeConflictsResolvedExternally/expected/file b/test/integration/mergeConflictsResolvedExternally/expected/repo/file similarity index 100% rename from test/integration/mergeConflictsResolvedExternally/expected/file rename to test/integration/mergeConflictsResolvedExternally/expected/repo/file diff --git a/test/integration/patchBuilding/expected/.git_keep/COMMIT_EDITMSG b/test/integration/patchBuilding/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/patchBuilding/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/patchBuilding/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/rebase/expected/.git_keep/FETCH_HEAD b/test/integration/patchBuilding/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/rebase/expected/.git_keep/FETCH_HEAD rename to test/integration/patchBuilding/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/pullRebase/expected_remote/HEAD b/test/integration/patchBuilding/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/pullRebase/expected_remote/HEAD rename to test/integration/patchBuilding/expected/repo/.git_keep/HEAD diff --git a/test/integration/patchBuilding/expected/.git_keep/ORIG_HEAD b/test/integration/patchBuilding/expected/repo/.git_keep/ORIG_HEAD similarity index 100% rename from test/integration/patchBuilding/expected/.git_keep/ORIG_HEAD rename to test/integration/patchBuilding/expected/repo/.git_keep/ORIG_HEAD diff --git a/test/integration/patchBuilding2/expected/.git_keep/config b/test/integration/patchBuilding/expected/repo/.git_keep/config similarity index 100% rename from test/integration/patchBuilding2/expected/.git_keep/config rename to test/integration/patchBuilding/expected/repo/.git_keep/config diff --git a/test/integration/pullRebase/expected/.git_keep/description b/test/integration/patchBuilding/expected/repo/.git_keep/description similarity index 100% rename from test/integration/pullRebase/expected/.git_keep/description rename to test/integration/patchBuilding/expected/repo/.git_keep/description diff --git a/test/integration/patchBuilding/expected/.git_keep/index b/test/integration/patchBuilding/expected/repo/.git_keep/index similarity index 100% rename from test/integration/patchBuilding/expected/.git_keep/index rename to test/integration/patchBuilding/expected/repo/.git_keep/index diff --git a/test/integration/pullAndSetUpstream/expected_remote/info/exclude b/test/integration/patchBuilding/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/pullAndSetUpstream/expected_remote/info/exclude rename to test/integration/patchBuilding/expected/repo/.git_keep/info/exclude diff --git a/test/integration/patchBuilding/expected/.git_keep/logs/HEAD b/test/integration/patchBuilding/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/patchBuilding/expected/.git_keep/logs/HEAD rename to test/integration/patchBuilding/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/patchBuilding/expected/.git_keep/logs/refs/heads/master b/test/integration/patchBuilding/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/patchBuilding/expected/.git_keep/logs/refs/heads/master rename to test/integration/patchBuilding/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/patchBuilding/expected/.git_keep/objects/01/5689313279311c9356ea3fd3628f73ca4ea797 b/test/integration/patchBuilding/expected/repo/.git_keep/objects/01/5689313279311c9356ea3fd3628f73ca4ea797 similarity index 100% rename from test/integration/patchBuilding/expected/.git_keep/objects/01/5689313279311c9356ea3fd3628f73ca4ea797 rename to test/integration/patchBuilding/expected/repo/.git_keep/objects/01/5689313279311c9356ea3fd3628f73ca4ea797 diff --git a/test/integration/patchBuilding/expected/.git_keep/objects/01/ed22faef05591076721466e07fb10962642887 b/test/integration/patchBuilding/expected/repo/.git_keep/objects/01/ed22faef05591076721466e07fb10962642887 similarity index 100% rename from test/integration/patchBuilding/expected/.git_keep/objects/01/ed22faef05591076721466e07fb10962642887 rename to test/integration/patchBuilding/expected/repo/.git_keep/objects/01/ed22faef05591076721466e07fb10962642887 diff --git a/test/integration/pullMergeConflict/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/patchBuilding/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/pullMergeConflict/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/patchBuilding/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/patchBuilding/expected/.git_keep/objects/24/4cec6fa9704d5dc61fc5e60faba4125dfe3baa b/test/integration/patchBuilding/expected/repo/.git_keep/objects/24/4cec6fa9704d5dc61fc5e60faba4125dfe3baa similarity index 100% rename from test/integration/patchBuilding/expected/.git_keep/objects/24/4cec6fa9704d5dc61fc5e60faba4125dfe3baa rename to test/integration/patchBuilding/expected/repo/.git_keep/objects/24/4cec6fa9704d5dc61fc5e60faba4125dfe3baa diff --git a/test/integration/patchBuilding/expected/.git_keep/objects/24/79abfe7bd6b64a753d3c3797f614bbb422f627 b/test/integration/patchBuilding/expected/repo/.git_keep/objects/24/79abfe7bd6b64a753d3c3797f614bbb422f627 similarity index 100% rename from test/integration/patchBuilding/expected/.git_keep/objects/24/79abfe7bd6b64a753d3c3797f614bbb422f627 rename to test/integration/patchBuilding/expected/repo/.git_keep/objects/24/79abfe7bd6b64a753d3c3797f614bbb422f627 diff --git a/test/integration/patchBuilding/expected/.git_keep/objects/47/5a06b7978eef6509efdd2a86e341992d9f2908 b/test/integration/patchBuilding/expected/repo/.git_keep/objects/47/5a06b7978eef6509efdd2a86e341992d9f2908 similarity index 100% rename from test/integration/patchBuilding/expected/.git_keep/objects/47/5a06b7978eef6509efdd2a86e341992d9f2908 rename to test/integration/patchBuilding/expected/repo/.git_keep/objects/47/5a06b7978eef6509efdd2a86e341992d9f2908 diff --git a/test/integration/patchBuilding/expected/.git_keep/objects/52/863675692b53d9e34dd72da8c35a72bf0a5b51 b/test/integration/patchBuilding/expected/repo/.git_keep/objects/52/863675692b53d9e34dd72da8c35a72bf0a5b51 similarity index 100% rename from test/integration/patchBuilding/expected/.git_keep/objects/52/863675692b53d9e34dd72da8c35a72bf0a5b51 rename to test/integration/patchBuilding/expected/repo/.git_keep/objects/52/863675692b53d9e34dd72da8c35a72bf0a5b51 diff --git a/test/integration/patchBuilding/expected/.git_keep/objects/7a/40dadc0814bf7f1418d005eae184848a9f1c94 b/test/integration/patchBuilding/expected/repo/.git_keep/objects/7a/40dadc0814bf7f1418d005eae184848a9f1c94 similarity index 100% rename from test/integration/patchBuilding/expected/.git_keep/objects/7a/40dadc0814bf7f1418d005eae184848a9f1c94 rename to test/integration/patchBuilding/expected/repo/.git_keep/objects/7a/40dadc0814bf7f1418d005eae184848a9f1c94 diff --git a/test/integration/patchBuilding/expected/.git_keep/objects/92/2fc2ed1965fe8436ce7837c634379f14faf3c3 b/test/integration/patchBuilding/expected/repo/.git_keep/objects/92/2fc2ed1965fe8436ce7837c634379f14faf3c3 similarity index 100% rename from test/integration/patchBuilding/expected/.git_keep/objects/92/2fc2ed1965fe8436ce7837c634379f14faf3c3 rename to test/integration/patchBuilding/expected/repo/.git_keep/objects/92/2fc2ed1965fe8436ce7837c634379f14faf3c3 diff --git a/test/integration/patchBuilding/expected/.git_keep/objects/92/571130f37c70766612048271f1d4dca63ef0b5 b/test/integration/patchBuilding/expected/repo/.git_keep/objects/92/571130f37c70766612048271f1d4dca63ef0b5 similarity index 100% rename from test/integration/patchBuilding/expected/.git_keep/objects/92/571130f37c70766612048271f1d4dca63ef0b5 rename to test/integration/patchBuilding/expected/repo/.git_keep/objects/92/571130f37c70766612048271f1d4dca63ef0b5 diff --git a/test/integration/patchBuilding/expected/.git_keep/objects/93/96d8d0c471661257f6c16c1957452912c0c6f5 b/test/integration/patchBuilding/expected/repo/.git_keep/objects/93/96d8d0c471661257f6c16c1957452912c0c6f5 similarity index 100% rename from test/integration/patchBuilding/expected/.git_keep/objects/93/96d8d0c471661257f6c16c1957452912c0c6f5 rename to test/integration/patchBuilding/expected/repo/.git_keep/objects/93/96d8d0c471661257f6c16c1957452912c0c6f5 diff --git a/test/integration/patchBuilding/expected/.git_keep/objects/a3/2f90adf7ee0f14ae300e49cdf8779507746c27 b/test/integration/patchBuilding/expected/repo/.git_keep/objects/a3/2f90adf7ee0f14ae300e49cdf8779507746c27 similarity index 100% rename from test/integration/patchBuilding/expected/.git_keep/objects/a3/2f90adf7ee0f14ae300e49cdf8779507746c27 rename to test/integration/patchBuilding/expected/repo/.git_keep/objects/a3/2f90adf7ee0f14ae300e49cdf8779507746c27 diff --git a/test/integration/pullMerge/expected_remote/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/patchBuilding/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/pullMerge/expected_remote/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/patchBuilding/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/patchBuilding/expected/.git_keep/objects/ad/e030587c8ae5d240ad7669bff9030b24bd6385 b/test/integration/patchBuilding/expected/repo/.git_keep/objects/ad/e030587c8ae5d240ad7669bff9030b24bd6385 similarity index 100% rename from test/integration/patchBuilding/expected/.git_keep/objects/ad/e030587c8ae5d240ad7669bff9030b24bd6385 rename to test/integration/patchBuilding/expected/repo/.git_keep/objects/ad/e030587c8ae5d240ad7669bff9030b24bd6385 diff --git a/test/integration/patchBuilding/expected/.git_keep/objects/c6/9e35e8cae5688bbfcf8278c20ab43c1b8dbae3 b/test/integration/patchBuilding/expected/repo/.git_keep/objects/c6/9e35e8cae5688bbfcf8278c20ab43c1b8dbae3 similarity index 100% rename from test/integration/patchBuilding/expected/.git_keep/objects/c6/9e35e8cae5688bbfcf8278c20ab43c1b8dbae3 rename to test/integration/patchBuilding/expected/repo/.git_keep/objects/c6/9e35e8cae5688bbfcf8278c20ab43c1b8dbae3 diff --git a/test/integration/patchBuilding/expected/.git_keep/objects/ce/024fc694fd464cfb5b43cb7702f0bd7345d882 b/test/integration/patchBuilding/expected/repo/.git_keep/objects/ce/024fc694fd464cfb5b43cb7702f0bd7345d882 similarity index 100% rename from test/integration/patchBuilding/expected/.git_keep/objects/ce/024fc694fd464cfb5b43cb7702f0bd7345d882 rename to test/integration/patchBuilding/expected/repo/.git_keep/objects/ce/024fc694fd464cfb5b43cb7702f0bd7345d882 diff --git a/test/integration/pullAndSetUpstream/expected_remote/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/patchBuilding/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/pullAndSetUpstream/expected_remote/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/patchBuilding/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/patchBuilding/expected/.git_keep/objects/e3/31050363ceb0b12d9d042e37879d892d867ea0 b/test/integration/patchBuilding/expected/repo/.git_keep/objects/e3/31050363ceb0b12d9d042e37879d892d867ea0 similarity index 100% rename from test/integration/patchBuilding/expected/.git_keep/objects/e3/31050363ceb0b12d9d042e37879d892d867ea0 rename to test/integration/patchBuilding/expected/repo/.git_keep/objects/e3/31050363ceb0b12d9d042e37879d892d867ea0 diff --git a/test/integration/patchBuilding/expected/.git_keep/objects/f3/c8a074e65b02d1bc364caf0b4c1516abf9eb5a b/test/integration/patchBuilding/expected/repo/.git_keep/objects/f3/c8a074e65b02d1bc364caf0b4c1516abf9eb5a similarity index 100% rename from test/integration/patchBuilding/expected/.git_keep/objects/f3/c8a074e65b02d1bc364caf0b4c1516abf9eb5a rename to test/integration/patchBuilding/expected/repo/.git_keep/objects/f3/c8a074e65b02d1bc364caf0b4c1516abf9eb5a diff --git a/test/integration/patchBuilding/expected/.git_keep/refs/heads/master b/test/integration/patchBuilding/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/patchBuilding/expected/.git_keep/refs/heads/master rename to test/integration/patchBuilding/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/pullRebase/expected/myfile1 b/test/integration/patchBuilding/expected/repo/myfile1 similarity index 100% rename from test/integration/pullRebase/expected/myfile1 rename to test/integration/patchBuilding/expected/repo/myfile1 diff --git a/test/integration/patchBuilding/expected/myfile2 b/test/integration/patchBuilding/expected/repo/myfile2 similarity index 100% rename from test/integration/patchBuilding/expected/myfile2 rename to test/integration/patchBuilding/expected/repo/myfile2 diff --git a/test/integration/pull/expected/myfile3 b/test/integration/patchBuilding/expected/repo/myfile3 similarity index 100% rename from test/integration/pull/expected/myfile3 rename to test/integration/patchBuilding/expected/repo/myfile3 diff --git a/test/integration/patchBuilding2/expected/.git_keep/COMMIT_EDITMSG b/test/integration/patchBuilding2/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/patchBuilding2/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/patchBuilding2/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/rebase2/expected/.git_keep/FETCH_HEAD b/test/integration/patchBuilding2/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/rebase2/expected/.git_keep/FETCH_HEAD rename to test/integration/patchBuilding2/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/HEAD b/test/integration/patchBuilding2/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/pullRebaseConflict/expected/.git_keep/HEAD rename to test/integration/patchBuilding2/expected/repo/.git_keep/HEAD diff --git a/test/integration/patchBuilding2/expected/.git_keep/ORIG_HEAD b/test/integration/patchBuilding2/expected/repo/.git_keep/ORIG_HEAD similarity index 100% rename from test/integration/patchBuilding2/expected/.git_keep/ORIG_HEAD rename to test/integration/patchBuilding2/expected/repo/.git_keep/ORIG_HEAD diff --git a/test/integration/patchBuildingWithFiletree/expected/.git_keep/config b/test/integration/patchBuilding2/expected/repo/.git_keep/config similarity index 100% rename from test/integration/patchBuildingWithFiletree/expected/.git_keep/config rename to test/integration/patchBuilding2/expected/repo/.git_keep/config diff --git a/test/integration/pullRebase/expected_remote/description b/test/integration/patchBuilding2/expected/repo/.git_keep/description similarity index 100% rename from test/integration/pullRebase/expected_remote/description rename to test/integration/patchBuilding2/expected/repo/.git_keep/description diff --git a/test/integration/patchBuilding2/expected/.git_keep/index b/test/integration/patchBuilding2/expected/repo/.git_keep/index similarity index 100% rename from test/integration/patchBuilding2/expected/.git_keep/index rename to test/integration/patchBuilding2/expected/repo/.git_keep/index diff --git a/test/integration/pullMerge/expected/.git_keep/info/exclude b/test/integration/patchBuilding2/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/pullMerge/expected/.git_keep/info/exclude rename to test/integration/patchBuilding2/expected/repo/.git_keep/info/exclude diff --git a/test/integration/patchBuilding2/expected/.git_keep/logs/HEAD b/test/integration/patchBuilding2/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/patchBuilding2/expected/.git_keep/logs/HEAD rename to test/integration/patchBuilding2/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/patchBuilding2/expected/.git_keep/logs/refs/heads/master b/test/integration/patchBuilding2/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/patchBuilding2/expected/.git_keep/logs/refs/heads/master rename to test/integration/patchBuilding2/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/patchBuilding2/expected/.git_keep/logs/refs/stash b/test/integration/patchBuilding2/expected/repo/.git_keep/logs/refs/stash similarity index 100% rename from test/integration/patchBuilding2/expected/.git_keep/logs/refs/stash rename to test/integration/patchBuilding2/expected/repo/.git_keep/logs/refs/stash diff --git a/test/integration/pullMergeConflict/expected_remote/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/patchBuilding2/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/pullMergeConflict/expected_remote/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/patchBuilding2/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/patchBuilding2/expected/.git_keep/objects/1a/b6a62ed874b19c1191ba2b0106741ca4ca4b50 b/test/integration/patchBuilding2/expected/repo/.git_keep/objects/1a/b6a62ed874b19c1191ba2b0106741ca4ca4b50 similarity index 100% rename from test/integration/patchBuilding2/expected/.git_keep/objects/1a/b6a62ed874b19c1191ba2b0106741ca4ca4b50 rename to test/integration/patchBuilding2/expected/repo/.git_keep/objects/1a/b6a62ed874b19c1191ba2b0106741ca4ca4b50 diff --git a/test/integration/patchBuilding2/expected/.git_keep/objects/2c/60d208ba3ec966b77ca756237843af7584cf93 b/test/integration/patchBuilding2/expected/repo/.git_keep/objects/2c/60d208ba3ec966b77ca756237843af7584cf93 similarity index 100% rename from test/integration/patchBuilding2/expected/.git_keep/objects/2c/60d208ba3ec966b77ca756237843af7584cf93 rename to test/integration/patchBuilding2/expected/repo/.git_keep/objects/2c/60d208ba3ec966b77ca756237843af7584cf93 diff --git a/test/integration/patchBuilding2/expected/.git_keep/objects/47/5a06b7978eef6509efdd2a86e341992d9f2908 b/test/integration/patchBuilding2/expected/repo/.git_keep/objects/47/5a06b7978eef6509efdd2a86e341992d9f2908 similarity index 100% rename from test/integration/patchBuilding2/expected/.git_keep/objects/47/5a06b7978eef6509efdd2a86e341992d9f2908 rename to test/integration/patchBuilding2/expected/repo/.git_keep/objects/47/5a06b7978eef6509efdd2a86e341992d9f2908 diff --git a/test/integration/patchBuilding2/expected/.git_keep/objects/50/63202049f1980e035c390732a7e6da8783357f b/test/integration/patchBuilding2/expected/repo/.git_keep/objects/50/63202049f1980e035c390732a7e6da8783357f similarity index 100% rename from test/integration/patchBuilding2/expected/.git_keep/objects/50/63202049f1980e035c390732a7e6da8783357f rename to test/integration/patchBuilding2/expected/repo/.git_keep/objects/50/63202049f1980e035c390732a7e6da8783357f diff --git a/test/integration/patchBuilding2/expected/.git_keep/objects/52/863675692b53d9e34dd72da8c35a72bf0a5b51 b/test/integration/patchBuilding2/expected/repo/.git_keep/objects/52/863675692b53d9e34dd72da8c35a72bf0a5b51 similarity index 100% rename from test/integration/patchBuilding2/expected/.git_keep/objects/52/863675692b53d9e34dd72da8c35a72bf0a5b51 rename to test/integration/patchBuilding2/expected/repo/.git_keep/objects/52/863675692b53d9e34dd72da8c35a72bf0a5b51 diff --git a/test/integration/patchBuilding2/expected/.git_keep/objects/9a/939087472cfaf305396d4b177ee888ced193d9 b/test/integration/patchBuilding2/expected/repo/.git_keep/objects/9a/939087472cfaf305396d4b177ee888ced193d9 similarity index 100% rename from test/integration/patchBuilding2/expected/.git_keep/objects/9a/939087472cfaf305396d4b177ee888ced193d9 rename to test/integration/patchBuilding2/expected/repo/.git_keep/objects/9a/939087472cfaf305396d4b177ee888ced193d9 diff --git a/test/integration/patchBuilding2/expected/.git_keep/objects/a3/2f90adf7ee0f14ae300e49cdf8779507746c27 b/test/integration/patchBuilding2/expected/repo/.git_keep/objects/a3/2f90adf7ee0f14ae300e49cdf8779507746c27 similarity index 100% rename from test/integration/patchBuilding2/expected/.git_keep/objects/a3/2f90adf7ee0f14ae300e49cdf8779507746c27 rename to test/integration/patchBuilding2/expected/repo/.git_keep/objects/a3/2f90adf7ee0f14ae300e49cdf8779507746c27 diff --git a/test/integration/pullMergeConflict/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/patchBuilding2/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/pullMergeConflict/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/patchBuilding2/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/patchBuilding2/expected/.git_keep/objects/ad/27dd25048bff07da92d2d9d829e4dd75472da4 b/test/integration/patchBuilding2/expected/repo/.git_keep/objects/ad/27dd25048bff07da92d2d9d829e4dd75472da4 similarity index 100% rename from test/integration/patchBuilding2/expected/.git_keep/objects/ad/27dd25048bff07da92d2d9d829e4dd75472da4 rename to test/integration/patchBuilding2/expected/repo/.git_keep/objects/ad/27dd25048bff07da92d2d9d829e4dd75472da4 diff --git a/test/integration/patchBuilding2/expected/.git_keep/objects/ad/e030587c8ae5d240ad7669bff9030b24bd6385 b/test/integration/patchBuilding2/expected/repo/.git_keep/objects/ad/e030587c8ae5d240ad7669bff9030b24bd6385 similarity index 100% rename from test/integration/patchBuilding2/expected/.git_keep/objects/ad/e030587c8ae5d240ad7669bff9030b24bd6385 rename to test/integration/patchBuilding2/expected/repo/.git_keep/objects/ad/e030587c8ae5d240ad7669bff9030b24bd6385 diff --git a/test/integration/patchBuilding2/expected/.git_keep/objects/ce/024fc694fd464cfb5b43cb7702f0bd7345d882 b/test/integration/patchBuilding2/expected/repo/.git_keep/objects/ce/024fc694fd464cfb5b43cb7702f0bd7345d882 similarity index 100% rename from test/integration/patchBuilding2/expected/.git_keep/objects/ce/024fc694fd464cfb5b43cb7702f0bd7345d882 rename to test/integration/patchBuilding2/expected/repo/.git_keep/objects/ce/024fc694fd464cfb5b43cb7702f0bd7345d882 diff --git a/test/integration/patchBuilding2/expected/.git_keep/objects/d0/ec73019f9c5e426c9b37fa58757855367580a5 b/test/integration/patchBuilding2/expected/repo/.git_keep/objects/d0/ec73019f9c5e426c9b37fa58757855367580a5 similarity index 100% rename from test/integration/patchBuilding2/expected/.git_keep/objects/d0/ec73019f9c5e426c9b37fa58757855367580a5 rename to test/integration/patchBuilding2/expected/repo/.git_keep/objects/d0/ec73019f9c5e426c9b37fa58757855367580a5 diff --git a/test/integration/patchBuilding2/expected/.git_keep/objects/d3/4fc4a9c0c675a5cb11d848e5afef4c89160dc0 b/test/integration/patchBuilding2/expected/repo/.git_keep/objects/d3/4fc4a9c0c675a5cb11d848e5afef4c89160dc0 similarity index 100% rename from test/integration/patchBuilding2/expected/.git_keep/objects/d3/4fc4a9c0c675a5cb11d848e5afef4c89160dc0 rename to test/integration/patchBuilding2/expected/repo/.git_keep/objects/d3/4fc4a9c0c675a5cb11d848e5afef4c89160dc0 diff --git a/test/integration/pullMerge/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/patchBuilding2/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/pullMerge/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/patchBuilding2/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/patchBuilding2/expected/.git_keep/objects/e3/31050363ceb0b12d9d042e37879d892d867ea0 b/test/integration/patchBuilding2/expected/repo/.git_keep/objects/e3/31050363ceb0b12d9d042e37879d892d867ea0 similarity index 100% rename from test/integration/patchBuilding2/expected/.git_keep/objects/e3/31050363ceb0b12d9d042e37879d892d867ea0 rename to test/integration/patchBuilding2/expected/repo/.git_keep/objects/e3/31050363ceb0b12d9d042e37879d892d867ea0 diff --git a/test/integration/patchBuilding2/expected/.git_keep/objects/e4/74bc2d1712ed5fdf14fb7223392f1b0dcc8d37 b/test/integration/patchBuilding2/expected/repo/.git_keep/objects/e4/74bc2d1712ed5fdf14fb7223392f1b0dcc8d37 similarity index 100% rename from test/integration/patchBuilding2/expected/.git_keep/objects/e4/74bc2d1712ed5fdf14fb7223392f1b0dcc8d37 rename to test/integration/patchBuilding2/expected/repo/.git_keep/objects/e4/74bc2d1712ed5fdf14fb7223392f1b0dcc8d37 diff --git a/test/integration/patchBuilding2/expected/.git_keep/objects/f3/c8a074e65b02d1bc364caf0b4c1516abf9eb5a b/test/integration/patchBuilding2/expected/repo/.git_keep/objects/f3/c8a074e65b02d1bc364caf0b4c1516abf9eb5a similarity index 100% rename from test/integration/patchBuilding2/expected/.git_keep/objects/f3/c8a074e65b02d1bc364caf0b4c1516abf9eb5a rename to test/integration/patchBuilding2/expected/repo/.git_keep/objects/f3/c8a074e65b02d1bc364caf0b4c1516abf9eb5a diff --git a/test/integration/patchBuilding2/expected/.git_keep/refs/heads/master b/test/integration/patchBuilding2/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/patchBuilding2/expected/.git_keep/refs/heads/master rename to test/integration/patchBuilding2/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/patchBuilding2/expected/.git_keep/refs/stash b/test/integration/patchBuilding2/expected/repo/.git_keep/refs/stash similarity index 100% rename from test/integration/patchBuilding2/expected/.git_keep/refs/stash rename to test/integration/patchBuilding2/expected/repo/.git_keep/refs/stash diff --git a/test/integration/pullRebaseConflict/expected/myfile1 b/test/integration/patchBuilding2/expected/repo/myfile1 similarity index 100% rename from test/integration/pullRebaseConflict/expected/myfile1 rename to test/integration/patchBuilding2/expected/repo/myfile1 diff --git a/test/integration/patchBuilding2/expected/myfile2 b/test/integration/patchBuilding2/expected/repo/myfile2 similarity index 100% rename from test/integration/patchBuilding2/expected/myfile2 rename to test/integration/patchBuilding2/expected/repo/myfile2 diff --git a/test/integration/pullAndSetUpstream/expected/myfile3 b/test/integration/patchBuilding2/expected/repo/myfile3 similarity index 100% rename from test/integration/pullAndSetUpstream/expected/myfile3 rename to test/integration/patchBuilding2/expected/repo/myfile3 diff --git a/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/COMMIT_EDITMSG b/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/COMMIT_EDITMSG new file mode 100644 index 000000000..907b30816 --- /dev/null +++ b/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/COMMIT_EDITMSG @@ -0,0 +1 @@ +blah diff --git a/test/integration/rebase3/expected/.git_keep/FETCH_HEAD b/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/rebase3/expected/.git_keep/FETCH_HEAD rename to test/integration/patchBuildingToggleAll/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/pullRebaseConflict/expected_remote/HEAD b/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/pullRebaseConflict/expected_remote/HEAD rename to test/integration/patchBuildingToggleAll/expected/repo/.git_keep/HEAD diff --git a/test/integration/rebase/expected/.git_keep/config b/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/config similarity index 100% rename from test/integration/rebase/expected/.git_keep/config rename to test/integration/patchBuildingToggleAll/expected/repo/.git_keep/config diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/description b/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/description similarity index 100% rename from test/integration/pullRebaseConflict/expected/.git_keep/description rename to test/integration/patchBuildingToggleAll/expected/repo/.git_keep/description diff --git a/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/index b/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/index new file mode 100644 index 000000000..291d34ebe Binary files /dev/null and b/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/index differ diff --git a/test/integration/pullMerge/expected_remote/info/exclude b/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/pullMerge/expected_remote/info/exclude rename to test/integration/patchBuildingToggleAll/expected/repo/.git_keep/info/exclude diff --git a/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/logs/HEAD b/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..30dd712e1 --- /dev/null +++ b/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,2 @@ +0000000000000000000000000000000000000000 7028eaec19b2723b62690974057c92ba7d8c1b11 CI 1648038005 +1100 commit (initial): first commit +7028eaec19b2723b62690974057c92ba7d8c1b11 cf149a94a18c990b2c5cdd0cf15ec4880f51c8b0 CI 1648038005 +1100 commit: blah diff --git a/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..30dd712e1 --- /dev/null +++ b/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,2 @@ +0000000000000000000000000000000000000000 7028eaec19b2723b62690974057c92ba7d8c1b11 CI 1648038005 +1100 commit (initial): first commit +7028eaec19b2723b62690974057c92ba7d8c1b11 cf149a94a18c990b2c5cdd0cf15ec4880f51c8b0 CI 1648038005 +1100 commit: blah diff --git a/test/integration/pullMerge/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/pullMerge/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/patchBuildingToggleAll/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/41/05b6da4ccc191a4abd24b1ffac6a2031534c0b b/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/objects/41/05b6da4ccc191a4abd24b1ffac6a2031534c0b similarity index 100% rename from test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/41/05b6da4ccc191a4abd24b1ffac6a2031534c0b rename to test/integration/patchBuildingToggleAll/expected/repo/.git_keep/objects/41/05b6da4ccc191a4abd24b1ffac6a2031534c0b diff --git a/test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/44/eb4bd0e7419049a8e4176945786c20dae60d7c b/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/objects/44/eb4bd0e7419049a8e4176945786c20dae60d7c similarity index 100% rename from test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/44/eb4bd0e7419049a8e4176945786c20dae60d7c rename to test/integration/patchBuildingToggleAll/expected/repo/.git_keep/objects/44/eb4bd0e7419049a8e4176945786c20dae60d7c diff --git a/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 b/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 new file mode 100644 index 000000000..adf64119a Binary files /dev/null and b/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 differ diff --git a/test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f b/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f similarity index 100% rename from test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f rename to test/integration/patchBuildingToggleAll/expected/repo/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f diff --git a/test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/68/bbd52379d849022495dcfd11b13f2fb3103d37 b/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/objects/68/bbd52379d849022495dcfd11b13f2fb3103d37 similarity index 100% rename from test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/68/bbd52379d849022495dcfd11b13f2fb3103d37 rename to test/integration/patchBuildingToggleAll/expected/repo/.git_keep/objects/68/bbd52379d849022495dcfd11b13f2fb3103d37 diff --git a/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/objects/70/28eaec19b2723b62690974057c92ba7d8c1b11 b/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/objects/70/28eaec19b2723b62690974057c92ba7d8c1b11 new file mode 100644 index 000000000..a3f20d2e9 Binary files /dev/null and b/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/objects/70/28eaec19b2723b62690974057c92ba7d8c1b11 differ diff --git a/test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/83/90c32b5e687b97e242da46498b574ace0e1eb5 b/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/objects/83/90c32b5e687b97e242da46498b574ace0e1eb5 similarity index 100% rename from test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/83/90c32b5e687b97e242da46498b574ace0e1eb5 rename to test/integration/patchBuildingToggleAll/expected/repo/.git_keep/objects/83/90c32b5e687b97e242da46498b574ace0e1eb5 diff --git a/test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/98/1651deb012f8e684dd306c1f5bf8edd5c3db67 b/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/objects/98/1651deb012f8e684dd306c1f5bf8edd5c3db67 similarity index 100% rename from test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/98/1651deb012f8e684dd306c1f5bf8edd5c3db67 rename to test/integration/patchBuildingToggleAll/expected/repo/.git_keep/objects/98/1651deb012f8e684dd306c1f5bf8edd5c3db67 diff --git a/test/integration/pullMergeConflict/expected_remote/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/pullMergeConflict/expected_remote/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/patchBuildingToggleAll/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/objects/cf/149a94a18c990b2c5cdd0cf15ec4880f51c8b0 b/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/objects/cf/149a94a18c990b2c5cdd0cf15ec4880f51c8b0 new file mode 100644 index 000000000..5d9dcc080 --- /dev/null +++ b/test/integration/patchBuildingToggleAll/expected/repo/.git_keep/objects/cf/149a94a18c990b2c5cdd0cf15ec4880f51c8b0 @@ -0,0 +1,4 @@ +xŤÎM +Â@ @a×sŠŮ ’ĚADčŞÇHŇ” +[Ęß9‚ŰÇ·x˛×újĽ´SŐ„Či¦ "=R ž]`\’D one/two/three/file1 +echo test2 > one/two/three/file2 +echo test3 > one/two/three/file3 +echo test4 > one/two/three/file4 +echo test5 > one/two/file1 +echo test6 > one/two/file2 + +git add . +git commit -m "blah" diff --git a/test/integration/patchBuildingToggleAll/test.json b/test/integration/patchBuildingToggleAll/test.json new file mode 100644 index 000000000..1804ea8aa --- /dev/null +++ b/test/integration/patchBuildingToggleAll/test.json @@ -0,0 +1 @@ +{ "description": "messing with our patch building flow in both flat and tree view", "speed": 10 } diff --git a/test/integration/patchBuildingWithFiletree/expected/.git_keep/COMMIT_EDITMSG b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/patchBuildingWithFiletree/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/FETCH_HEAD b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/FETCH_HEAD rename to test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/HEAD b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/pullRebaseInteractive/expected/.git_keep/HEAD rename to test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/HEAD diff --git a/test/integration/rebase2/expected/.git_keep/config b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/config similarity index 100% rename from test/integration/rebase2/expected/.git_keep/config rename to test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/config diff --git a/test/integration/pullRebaseConflict/expected_remote/description b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/description similarity index 100% rename from test/integration/pullRebaseConflict/expected_remote/description rename to test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/description diff --git a/test/integration/patchBuildingWithFiletree/expected/.git_keep/index b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/index similarity index 100% rename from test/integration/patchBuildingWithFiletree/expected/.git_keep/index rename to test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/index diff --git a/test/integration/pullMergeConflict/expected/.git_keep/info/exclude b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/pullMergeConflict/expected/.git_keep/info/exclude rename to test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/info/exclude diff --git a/test/integration/patchBuildingWithFiletree/expected/.git_keep/logs/HEAD b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/patchBuildingWithFiletree/expected/.git_keep/logs/HEAD rename to test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/patchBuildingWithFiletree/expected/.git_keep/logs/refs/heads/master b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/patchBuildingWithFiletree/expected/.git_keep/logs/refs/heads/master rename to test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/pullMergeConflict/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/pullMergeConflict/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/41/05b6da4ccc191a4abd24b1ffac6a2031534c0b b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/41/05b6da4ccc191a4abd24b1ffac6a2031534c0b new file mode 100644 index 000000000..a35700d0e Binary files /dev/null and b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/41/05b6da4ccc191a4abd24b1ffac6a2031534c0b differ diff --git a/test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/43/9a6f2a3c627cd37ba1c5eda6a49c26a85ad610 b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/43/9a6f2a3c627cd37ba1c5eda6a49c26a85ad610 similarity index 100% rename from test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/43/9a6f2a3c627cd37ba1c5eda6a49c26a85ad610 rename to test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/43/9a6f2a3c627cd37ba1c5eda6a49c26a85ad610 diff --git a/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/44/eb4bd0e7419049a8e4176945786c20dae60d7c b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/44/eb4bd0e7419049a8e4176945786c20dae60d7c new file mode 100644 index 000000000..3a7adb136 Binary files /dev/null and b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/44/eb4bd0e7419049a8e4176945786c20dae60d7c differ diff --git a/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 new file mode 100644 index 000000000..adf64119a Binary files /dev/null and b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 differ diff --git a/test/integration/rebase2/expected/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f similarity index 100% rename from test/integration/rebase2/expected/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f rename to test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f diff --git a/test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/54/57a1e78421c0c1bf9eb3bcc89f6c0996b9f89e b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/54/57a1e78421c0c1bf9eb3bcc89f6c0996b9f89e similarity index 100% rename from test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/54/57a1e78421c0c1bf9eb3bcc89f6c0996b9f89e rename to test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/54/57a1e78421c0c1bf9eb3bcc89f6c0996b9f89e diff --git a/test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/5a/abb4aaf3d6cc113fec7f7a3c0a880988085c23 b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/5a/abb4aaf3d6cc113fec7f7a3c0a880988085c23 similarity index 100% rename from test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/5a/abb4aaf3d6cc113fec7f7a3c0a880988085c23 rename to test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/5a/abb4aaf3d6cc113fec7f7a3c0a880988085c23 diff --git a/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/68/bbd52379d849022495dcfd11b13f2fb3103d37 b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/68/bbd52379d849022495dcfd11b13f2fb3103d37 new file mode 100644 index 000000000..15e2a131e Binary files /dev/null and b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/68/bbd52379d849022495dcfd11b13f2fb3103d37 differ diff --git a/test/integration/rebaseFixups/expected/.git_keep/objects/83/90c32b5e687b97e242da46498b574ace0e1eb5 b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/83/90c32b5e687b97e242da46498b574ace0e1eb5 similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/objects/83/90c32b5e687b97e242da46498b574ace0e1eb5 rename to test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/83/90c32b5e687b97e242da46498b574ace0e1eb5 diff --git a/test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/88/981dbb0664057b766113679127284f69f4fb69 b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/88/981dbb0664057b766113679127284f69f4fb69 similarity index 100% rename from test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/88/981dbb0664057b766113679127284f69f4fb69 rename to test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/88/981dbb0664057b766113679127284f69f4fb69 diff --git a/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/98/1651deb012f8e684dd306c1f5bf8edd5c3db67 b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/98/1651deb012f8e684dd306c1f5bf8edd5c3db67 new file mode 100644 index 000000000..0db8d9831 Binary files /dev/null and b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/98/1651deb012f8e684dd306c1f5bf8edd5c3db67 differ diff --git a/test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/9f/aac09750995930a5d55eccf91ad6f802e8c66b b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/9f/aac09750995930a5d55eccf91ad6f802e8c66b similarity index 100% rename from test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/9f/aac09750995930a5d55eccf91ad6f802e8c66b rename to test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/9f/aac09750995930a5d55eccf91ad6f802e8c66b diff --git a/test/integration/pullRebase/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/pullRebase/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/b5/e8fb99b011265d28065d0d545ff6b0245b1fa1 b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/b5/e8fb99b011265d28065d0d545ff6b0245b1fa1 similarity index 100% rename from test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/b5/e8fb99b011265d28065d0d545ff6b0245b1fa1 rename to test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/b5/e8fb99b011265d28065d0d545ff6b0245b1fa1 diff --git a/test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/c1/7dc7400fbb649385064c27544ba1e6c4751566 b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/c1/7dc7400fbb649385064c27544ba1e6c4751566 similarity index 100% rename from test/integration/patchBuildingWithFiletree/expected/.git_keep/objects/c1/7dc7400fbb649385064c27544ba1e6c4751566 rename to test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/c1/7dc7400fbb649385064c27544ba1e6c4751566 diff --git a/test/integration/pullMergeConflict/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/pullMergeConflict/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/pullMergeConflict/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/pullMergeConflict/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/patchBuildingWithFiletree/expected/.git_keep/refs/heads/master b/test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/patchBuildingWithFiletree/expected/.git_keep/refs/heads/master rename to test/integration/patchBuildingWithFiletree/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/patchBuildingWithFiletree/expected/one/two/file2 b/test/integration/patchBuildingWithFiletree/expected/repo/one/two/file2 similarity index 100% rename from test/integration/patchBuildingWithFiletree/expected/one/two/file2 rename to test/integration/patchBuildingWithFiletree/expected/repo/one/two/file2 diff --git a/test/integration/rebaseRewordLastCommit/expected/file3 b/test/integration/patchBuildingWithFiletree/expected/repo/one/two/three/file3 similarity index 100% rename from test/integration/rebaseRewordLastCommit/expected/file3 rename to test/integration/patchBuildingWithFiletree/expected/repo/one/two/three/file3 diff --git a/test/integration/popupFocus/expected/repo/.git_keep/COMMIT_EDITMSG b/test/integration/popupFocus/expected/repo/.git_keep/COMMIT_EDITMSG new file mode 100644 index 000000000..00d7bdd40 --- /dev/null +++ b/test/integration/popupFocus/expected/repo/.git_keep/COMMIT_EDITMSG @@ -0,0 +1 @@ +WIP diff --git a/test/integration/rebaseFixups/expected/.git_keep/FETCH_HEAD b/test/integration/popupFocus/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/FETCH_HEAD rename to test/integration/popupFocus/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/pullRebaseInteractive/expected_remote/HEAD b/test/integration/popupFocus/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/pullRebaseInteractive/expected_remote/HEAD rename to test/integration/popupFocus/expected/repo/.git_keep/HEAD diff --git a/test/integration/rebase3/expected/.git_keep/config b/test/integration/popupFocus/expected/repo/.git_keep/config similarity index 100% rename from test/integration/rebase3/expected/.git_keep/config rename to test/integration/popupFocus/expected/repo/.git_keep/config diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/description b/test/integration/popupFocus/expected/repo/.git_keep/description similarity index 100% rename from test/integration/pullRebaseInteractive/expected/.git_keep/description rename to test/integration/popupFocus/expected/repo/.git_keep/description diff --git a/test/integration/popupFocus/expected/repo/.git_keep/index b/test/integration/popupFocus/expected/repo/.git_keep/index new file mode 100644 index 000000000..d74d35efa Binary files /dev/null and b/test/integration/popupFocus/expected/repo/.git_keep/index differ diff --git a/test/integration/pullMergeConflict/expected_remote/info/exclude b/test/integration/popupFocus/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/pullMergeConflict/expected_remote/info/exclude rename to test/integration/popupFocus/expected/repo/.git_keep/info/exclude diff --git a/test/integration/popupFocus/expected/repo/.git_keep/logs/HEAD b/test/integration/popupFocus/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..03b354937 --- /dev/null +++ b/test/integration/popupFocus/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 353cce986c61f361452f43522426c120b4ee9461 CI 1659355870 +1000 commit (initial): myfile1 +353cce986c61f361452f43522426c120b4ee9461 6ecdae79ff53548670039abee9008b6bb36cdf4f CI 1659355870 +1000 commit: myfile2 +6ecdae79ff53548670039abee9008b6bb36cdf4f 0478d727ea0ebf57ed9ca85acef9e60a324d86f0 CI 1659355876 +1000 commit: WIP diff --git a/test/integration/popupFocus/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/popupFocus/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..03b354937 --- /dev/null +++ b/test/integration/popupFocus/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 353cce986c61f361452f43522426c120b4ee9461 CI 1659355870 +1000 commit (initial): myfile1 +353cce986c61f361452f43522426c120b4ee9461 6ecdae79ff53548670039abee9008b6bb36cdf4f CI 1659355870 +1000 commit: myfile2 +6ecdae79ff53548670039abee9008b6bb36cdf4f 0478d727ea0ebf57ed9ca85acef9e60a324d86f0 CI 1659355876 +1000 commit: WIP diff --git a/test/integration/popupFocus/expected/repo/.git_keep/objects/04/78d727ea0ebf57ed9ca85acef9e60a324d86f0 b/test/integration/popupFocus/expected/repo/.git_keep/objects/04/78d727ea0ebf57ed9ca85acef9e60a324d86f0 new file mode 100644 index 000000000..1a59d8559 --- /dev/null +++ b/test/integration/popupFocus/expected/repo/.git_keep/objects/04/78d727ea0ebf57ed9ca85acef9e60a324d86f0 @@ -0,0 +1,3 @@ +xŤŽË +Â0E]ç+f/ȤӼ@DčŞ;w®“é +Ć–ÁĎ7źŕęÂáp¸ĽÖúl`Ú.C±8z»čH¤y$ŐĽXŇ Ů]_łĺ]Ţ Ľđ’%$UGnŚ> RĘE$!ĆâK!Ď=Ą&ÚcÝašá<ÍWůćş˝äÄk˝€ő.‘s1x8ZD4ťöSMţÔÍ}ľ™‚—9ł \ No newline at end of file diff --git a/test/integration/pullRebase/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/popupFocus/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/pullRebase/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/popupFocus/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/pullMergeConflict/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/popupFocus/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/pullMergeConflict/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/popupFocus/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/pullMergeConflict/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/popupFocus/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/pullMergeConflict/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/popupFocus/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/popupFocus/expected/repo/.git_keep/objects/35/3cce986c61f361452f43522426c120b4ee9461 b/test/integration/popupFocus/expected/repo/.git_keep/objects/35/3cce986c61f361452f43522426c120b4ee9461 new file mode 100644 index 000000000..a3e9d66fe --- /dev/null +++ b/test/integration/popupFocus/expected/repo/.git_keep/objects/35/3cce986c61f361452f43522426c120b4ee9461 @@ -0,0 +1,3 @@ +xŤÍA +0@Ń®sŠŮĘŚN&Š\yŚL¨`H +ööőÝ~üXKYË­Ş€*1cĹ ęł’—ä© ”/Ü'á˘íLř´w=`šá9Í/=CŮ7}ÄZF ±Co­wwBDsŐkŇôOnĘ7Ż›’ů4],Ů \ No newline at end of file diff --git a/test/integration/popupFocus/expected/repo/.git_keep/objects/6e/cdae79ff53548670039abee9008b6bb36cdf4f b/test/integration/popupFocus/expected/repo/.git_keep/objects/6e/cdae79ff53548670039abee9008b6bb36cdf4f new file mode 100644 index 000000000..a23afd560 --- /dev/null +++ b/test/integration/popupFocus/expected/repo/.git_keep/objects/6e/cdae79ff53548670039abee9008b6bb36cdf4f @@ -0,0 +1,2 @@ +xŤÎM +Â0@a×9Eö‚d~2í€ĐUŹ‘¦,[J˝˝=‚ŰÇ·xy­ui”Om7ó©#†µ„y6+*j˘e’EfÄ)d·ĄÝ^ÍS¤śM{É…8baŠŚ’ĂÄfĘ.˝ŰcÝý0úë0Ţí“ęö´K^ëÍDĄű.ř3„ÜQŹ©frWżeyş\+9> \ No newline at end of file diff --git a/test/integration/pullRebase/expected_remote/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/popupFocus/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/pullRebase/expected_remote/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/popupFocus/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/pullMergeConflict/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/popupFocus/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/pullMergeConflict/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/popupFocus/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/pullMergeConflict/expected_remote/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/popupFocus/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/pullMergeConflict/expected_remote/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/popupFocus/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/popupFocus/expected/repo/.git_keep/refs/heads/master b/test/integration/popupFocus/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..6ffdf61da --- /dev/null +++ b/test/integration/popupFocus/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +0478d727ea0ebf57ed9ca85acef9e60a324d86f0 diff --git a/test/integration/pullRebaseInteractive/expected/myfile1 b/test/integration/popupFocus/expected/repo/myfile1 similarity index 100% rename from test/integration/pullRebaseInteractive/expected/myfile1 rename to test/integration/popupFocus/expected/repo/myfile1 diff --git a/test/integration/pullMergeConflict/expected/myfile2 b/test/integration/popupFocus/expected/repo/myfile2 similarity index 100% rename from test/integration/pullMergeConflict/expected/myfile2 rename to test/integration/popupFocus/expected/repo/myfile2 diff --git a/test/integration/pullMerge/expected/myfile3 b/test/integration/popupFocus/expected/repo/myfile3 similarity index 100% rename from test/integration/pullMerge/expected/myfile3 rename to test/integration/popupFocus/expected/repo/myfile3 diff --git a/test/integration/popupFocus/recording.json b/test/integration/popupFocus/recording.json new file mode 100644 index 000000000..e7f4f9d53 --- /dev/null +++ b/test/integration/popupFocus/recording.json @@ -0,0 +1 @@ +{"KeyEvents":[{"Timestamp":607,"Mod":0,"Key":259,"Ch":0},{"Timestamp":745,"Mod":0,"Key":259,"Ch":0},{"Timestamp":1304,"Mod":0,"Key":256,"Ch":82},{"Timestamp":2087,"Mod":2,"Key":18,"Ch":18},{"Timestamp":2894,"Mod":0,"Key":27,"Ch":0},{"Timestamp":3553,"Mod":0,"Key":260,"Ch":0},{"Timestamp":3697,"Mod":0,"Key":260,"Ch":0},{"Timestamp":4064,"Mod":0,"Key":256,"Ch":32},{"Timestamp":4376,"Mod":0,"Key":256,"Ch":119},{"Timestamp":4745,"Mod":0,"Key":13,"Ch":13},{"Timestamp":5200,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":238,"Height":61}]} \ No newline at end of file diff --git a/test/integration/popupFocus/setup.sh b/test/integration/popupFocus/setup.sh new file mode 100644 index 000000000..b22a9c241 --- /dev/null +++ b/test/integration/popupFocus/setup.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +set -e + +cd $1 + +git init + +git config user.email "CI@example.com" +git config user.name "CI" + +echo test1 > myfile1 +git add . +git commit -am "myfile1" +echo test2 > myfile2 +git add . +git commit -am "myfile2" +echo test3 > myfile3 diff --git a/test/integration/commit/test.json b/test/integration/popupFocus/test.json similarity index 100% rename from test/integration/commit/test.json rename to test/integration/popupFocus/test.json diff --git a/test/integration/pull/expected/.git_keep/FETCH_HEAD b/test/integration/pull/expected/.git_keep/FETCH_HEAD deleted file mode 100644 index d13b7c7d7..000000000 --- a/test/integration/pull/expected/.git_keep/FETCH_HEAD +++ /dev/null @@ -1 +0,0 @@ -6ad6c42187d356f4eab4f004cca17863746adec1 branch 'master' of ../actual_remote diff --git a/test/integration/pull/expected/.git_keep/ORIG_HEAD b/test/integration/pull/expected/.git_keep/ORIG_HEAD deleted file mode 100644 index 22c16cf39..000000000 --- a/test/integration/pull/expected/.git_keep/ORIG_HEAD +++ /dev/null @@ -1 +0,0 @@ -0c0f210a4e5ff3b58e4190501c2b755695f439fa diff --git a/test/integration/pull/expected/.git_keep/config b/test/integration/pull/expected/.git_keep/config deleted file mode 100644 index 821803a3e..000000000 --- a/test/integration/pull/expected/.git_keep/config +++ /dev/null @@ -1,16 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true - precomposeunicode = true -[user] - email = CI@example.com - name = CI -[remote "origin"] - url = ../actual_remote - fetch = +refs/heads/*:refs/remotes/origin/* -[branch "master"] - remote = origin - merge = refs/heads/master diff --git a/test/integration/pull/expected/.git_keep/index b/test/integration/pull/expected/.git_keep/index deleted file mode 100644 index 97b142556..000000000 Binary files a/test/integration/pull/expected/.git_keep/index and /dev/null differ diff --git a/test/integration/pull/expected/.git_keep/logs/HEAD b/test/integration/pull/expected/.git_keep/logs/HEAD deleted file mode 100644 index f15401d8d..000000000 --- a/test/integration/pull/expected/.git_keep/logs/HEAD +++ /dev/null @@ -1,6 +0,0 @@ -0000000000000000000000000000000000000000 003527daa0801470151d8f93140a02fc306fea00 CI 1634896904 +1100 commit (initial): myfile1 -003527daa0801470151d8f93140a02fc306fea00 0c0f210a4e5ff3b58e4190501c2b755695f439fa CI 1634896904 +1100 commit: myfile2 -0c0f210a4e5ff3b58e4190501c2b755695f439fa 336826e035e431ac94eca7f3cb6dd3fb072f7a5a CI 1634896904 +1100 commit: myfile3 -336826e035e431ac94eca7f3cb6dd3fb072f7a5a 6ad6c42187d356f4eab4f004cca17863746adec1 CI 1634896904 +1100 commit: myfile4 -6ad6c42187d356f4eab4f004cca17863746adec1 0c0f210a4e5ff3b58e4190501c2b755695f439fa CI 1634896904 +1100 reset: moving to head^^ -0c0f210a4e5ff3b58e4190501c2b755695f439fa 6ad6c42187d356f4eab4f004cca17863746adec1 CI 1634896905 +1100 pull --no-edit: Fast-forward diff --git a/test/integration/pull/expected/.git_keep/logs/refs/heads/master b/test/integration/pull/expected/.git_keep/logs/refs/heads/master deleted file mode 100644 index f15401d8d..000000000 --- a/test/integration/pull/expected/.git_keep/logs/refs/heads/master +++ /dev/null @@ -1,6 +0,0 @@ -0000000000000000000000000000000000000000 003527daa0801470151d8f93140a02fc306fea00 CI 1634896904 +1100 commit (initial): myfile1 -003527daa0801470151d8f93140a02fc306fea00 0c0f210a4e5ff3b58e4190501c2b755695f439fa CI 1634896904 +1100 commit: myfile2 -0c0f210a4e5ff3b58e4190501c2b755695f439fa 336826e035e431ac94eca7f3cb6dd3fb072f7a5a CI 1634896904 +1100 commit: myfile3 -336826e035e431ac94eca7f3cb6dd3fb072f7a5a 6ad6c42187d356f4eab4f004cca17863746adec1 CI 1634896904 +1100 commit: myfile4 -6ad6c42187d356f4eab4f004cca17863746adec1 0c0f210a4e5ff3b58e4190501c2b755695f439fa CI 1634896904 +1100 reset: moving to head^^ -0c0f210a4e5ff3b58e4190501c2b755695f439fa 6ad6c42187d356f4eab4f004cca17863746adec1 CI 1634896905 +1100 pull --no-edit: Fast-forward diff --git a/test/integration/pull/expected/.git_keep/logs/refs/remotes/origin/master b/test/integration/pull/expected/.git_keep/logs/refs/remotes/origin/master deleted file mode 100644 index b254fcd0d..000000000 --- a/test/integration/pull/expected/.git_keep/logs/refs/remotes/origin/master +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 6ad6c42187d356f4eab4f004cca17863746adec1 CI 1634896904 +1100 fetch origin: storing head diff --git a/test/integration/pull/expected/.git_keep/objects/00/3527daa0801470151d8f93140a02fc306fea00 b/test/integration/pull/expected/.git_keep/objects/00/3527daa0801470151d8f93140a02fc306fea00 deleted file mode 100644 index 0ed3c76d8..000000000 --- a/test/integration/pull/expected/.git_keep/objects/00/3527daa0801470151d8f93140a02fc306fea00 +++ /dev/null @@ -1,2 +0,0 @@ -xŤÍA -0@Ń®sŠŮĘŚNÇJ\yŚL¨ŕ")´·×#tűyđS5[ËĄíŞ€*©`”eę3ł’—ě©‹T^¸ĎÂ%¦{çâ§˝ęÓ Źiőí˝é-U{IĎ>H@†+˘;ë9iú'wö+ë¦ä4í,Ý \ No newline at end of file diff --git a/test/integration/pull/expected/.git_keep/objects/0c/0f210a4e5ff3b58e4190501c2b755695f439fa b/test/integration/pull/expected/.git_keep/objects/0c/0f210a4e5ff3b58e4190501c2b755695f439fa deleted file mode 100644 index a89fa981c..000000000 Binary files a/test/integration/pull/expected/.git_keep/objects/0c/0f210a4e5ff3b58e4190501c2b755695f439fa and /dev/null differ diff --git a/test/integration/pull/expected/.git_keep/objects/33/6826e035e431ac94eca7f3cb6dd3fb072f7a5a b/test/integration/pull/expected/.git_keep/objects/33/6826e035e431ac94eca7f3cb6dd3fb072f7a5a deleted file mode 100644 index 2b7ab37ad..000000000 Binary files a/test/integration/pull/expected/.git_keep/objects/33/6826e035e431ac94eca7f3cb6dd3fb072f7a5a and /dev/null differ diff --git a/test/integration/pull/expected/.git_keep/objects/6a/d6c42187d356f4eab4f004cca17863746adec1 b/test/integration/pull/expected/.git_keep/objects/6a/d6c42187d356f4eab4f004cca17863746adec1 deleted file mode 100644 index 335077711..000000000 --- a/test/integration/pull/expected/.git_keep/objects/6a/d6c42187d356f4eab4f004cca17863746adec1 +++ /dev/null @@ -1,2 +0,0 @@ -xŤÎA -Â0@Q×9Eö‚d2“I"BW=Ć4ť`ÁŘR"čííÜ~Ţâ—µµĄ[Čt껪ő•!’ “#LhćkdOŠ„ f“]_Ý"rň¬‚”LZ$V,Ď3ÖÉE_Ł1ňîŹu·ĂhŻĂx׏´í©—˛¶›FJ™ł#{pÎőęú'7í[—§’ůôâ90 \ No newline at end of file diff --git a/test/integration/pull/expected/.git_keep/refs/heads/master b/test/integration/pull/expected/.git_keep/refs/heads/master deleted file mode 100644 index 120f0043b..000000000 --- a/test/integration/pull/expected/.git_keep/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -6ad6c42187d356f4eab4f004cca17863746adec1 diff --git a/test/integration/pull/expected/.git_keep/refs/remotes/origin/master b/test/integration/pull/expected/.git_keep/refs/remotes/origin/master deleted file mode 100644 index 120f0043b..000000000 --- a/test/integration/pull/expected/.git_keep/refs/remotes/origin/master +++ /dev/null @@ -1 +0,0 @@ -6ad6c42187d356f4eab4f004cca17863746adec1 diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/HEAD b/test/integration/pull/expected/origin/HEAD similarity index 100% rename from test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/HEAD rename to test/integration/pull/expected/origin/HEAD diff --git a/test/integration/pull/expected/origin/config b/test/integration/pull/expected/origin/config new file mode 100644 index 000000000..e92bfb417 --- /dev/null +++ b/test/integration/pull/expected/origin/config @@ -0,0 +1,8 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/pull/actual/./repo diff --git a/test/integration/pullRebaseInteractive/expected_remote/description b/test/integration/pull/expected/origin/description similarity index 100% rename from test/integration/pullRebaseInteractive/expected_remote/description rename to test/integration/pull/expected/origin/description diff --git a/test/integration/pullRebase/expected/.git_keep/info/exclude b/test/integration/pull/expected/origin/info/exclude similarity index 100% rename from test/integration/pullRebase/expected/.git_keep/info/exclude rename to test/integration/pull/expected/origin/info/exclude diff --git a/test/integration/pullRebase/expected_remote/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/pull/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/pullRebase/expected_remote/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/pull/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/pullRebase/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/pull/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/pullRebase/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/pull/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/pullMergeConflict/expected_remote/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/pull/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/pullMergeConflict/expected_remote/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/pull/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/pullAndSetUpstream/expected/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 b/test/integration/pull/expected/origin/objects/2f/6174050380438f14b16658a356e762435ca591 similarity index 100% rename from test/integration/pullAndSetUpstream/expected/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 rename to test/integration/pull/expected/origin/objects/2f/6174050380438f14b16658a356e762435ca591 diff --git a/test/integration/pull/expected/origin/objects/3e/a0c134bed03d0a2cb7eeaff586af277d137129 b/test/integration/pull/expected/origin/objects/3e/a0c134bed03d0a2cb7eeaff586af277d137129 new file mode 100644 index 000000000..a56e97735 --- /dev/null +++ b/test/integration/pull/expected/origin/objects/3e/a0c134bed03d0a2cb7eeaff586af277d137129 @@ -0,0 +1,2 @@ +xŤÍA +0@Ń®sŠŮJĆŚăJ\yŚL¨ŕ")´·×#tűyđS5[ ńĄíŞŕ•Sń‘—á®’‰…ł`± ´PČL%¦ľsńÓ^u‡i†Ç4ŹúŤöŢô–Ş=™$pŕŠč˝;ë9iú'wö+ë¦č49,Ů \ No newline at end of file diff --git a/test/integration/pull/expected/origin/objects/7b/9a91f4ecba02fd55dbf3f372bc3faee3897939 b/test/integration/pull/expected/origin/objects/7b/9a91f4ecba02fd55dbf3f372bc3faee3897939 new file mode 100644 index 000000000..a03a86b26 Binary files /dev/null and b/test/integration/pull/expected/origin/objects/7b/9a91f4ecba02fd55dbf3f372bc3faee3897939 differ diff --git a/test/integration/pull/expected/origin/objects/97/bf06c598032ab5ad0faf744c91545071f3cb38 b/test/integration/pull/expected/origin/objects/97/bf06c598032ab5ad0faf744c91545071f3cb38 new file mode 100644 index 000000000..6921642c3 Binary files /dev/null and b/test/integration/pull/expected/origin/objects/97/bf06c598032ab5ad0faf744c91545071f3cb38 differ diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/pull/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/pullRebaseConflict/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/pull/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/pullMergeConflict/expected_remote/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/pull/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/pullMergeConflict/expected_remote/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/pull/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/pullMergeConflict/expected_remote/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/pull/expected/origin/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/pullMergeConflict/expected_remote/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/pull/expected/origin/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/pullRebase/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/pull/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/pullRebase/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/pull/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/pull/expected/origin/objects/f0/eb4a85b26f51dc8c23e31bb7f541f0e2d1d2d0 b/test/integration/pull/expected/origin/objects/f0/eb4a85b26f51dc8c23e31bb7f541f0e2d1d2d0 new file mode 100644 index 000000000..0277b216d --- /dev/null +++ b/test/integration/pull/expected/origin/objects/f0/eb4a85b26f51dc8c23e31bb7f541f0e2d1d2d0 @@ -0,0 +1,3 @@ +xŤŽA +Ă E»öî Ĺq4*”RČ*ÇĐq†j‚…ööő]}xĽź¶ÖÖ®!ąS?µ-âU˘d‡"ąJ4 ‚%?–XíůŕWס¤ś@SÉĆJőľAÁ` Ťśc + “ĘďţŘ=/ú:/wţä¶?ůB[»i\D'Źú `Śtśęü§®ÚWÖ'Łú‘};¦ \ No newline at end of file diff --git a/test/integration/pull/expected/origin/packed-refs b/test/integration/pull/expected/origin/packed-refs new file mode 100644 index 000000000..b9e906164 --- /dev/null +++ b/test/integration/pull/expected/origin/packed-refs @@ -0,0 +1,2 @@ +# pack-refs with: peeled fully-peeled sorted +97bf06c598032ab5ad0faf744c91545071f3cb38 refs/heads/master diff --git a/test/integration/push/expected/.git_keep/COMMIT_EDITMSG b/test/integration/pull/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/push/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/pull/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/pull/expected/repo/.git_keep/FETCH_HEAD b/test/integration/pull/expected/repo/.git_keep/FETCH_HEAD new file mode 100644 index 000000000..872d125b1 --- /dev/null +++ b/test/integration/pull/expected/repo/.git_keep/FETCH_HEAD @@ -0,0 +1 @@ +97bf06c598032ab5ad0faf744c91545071f3cb38 branch 'master' of ../origin diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected_remote/HEAD b/test/integration/pull/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/pullRebaseInteractiveWithDrop/expected_remote/HEAD rename to test/integration/pull/expected/repo/.git_keep/HEAD diff --git a/test/integration/pull/expected/repo/.git_keep/ORIG_HEAD b/test/integration/pull/expected/repo/.git_keep/ORIG_HEAD new file mode 100644 index 000000000..480b52b43 --- /dev/null +++ b/test/integration/pull/expected/repo/.git_keep/ORIG_HEAD @@ -0,0 +1 @@ +7b9a91f4ecba02fd55dbf3f372bc3faee3897939 diff --git a/test/integration/pull/expected/repo/.git_keep/config b/test/integration/pull/expected/repo/.git_keep/config new file mode 100644 index 000000000..7721ae814 --- /dev/null +++ b/test/integration/pull/expected/repo/.git_keep/config @@ -0,0 +1,16 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[user] + email = CI@example.com + name = CI +[remote "origin"] + url = ../origin + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "master"] + remote = origin + merge = refs/heads/master diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/description b/test/integration/pull/expected/repo/.git_keep/description similarity index 100% rename from test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/description rename to test/integration/pull/expected/repo/.git_keep/description diff --git a/test/integration/pull/expected/repo/.git_keep/index b/test/integration/pull/expected/repo/.git_keep/index new file mode 100644 index 000000000..b5f0f25a7 Binary files /dev/null and b/test/integration/pull/expected/repo/.git_keep/index differ diff --git a/test/integration/pullRebase/expected_remote/info/exclude b/test/integration/pull/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/pullRebase/expected_remote/info/exclude rename to test/integration/pull/expected/repo/.git_keep/info/exclude diff --git a/test/integration/pull/expected/repo/.git_keep/logs/HEAD b/test/integration/pull/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..f67583b72 --- /dev/null +++ b/test/integration/pull/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,7 @@ +0000000000000000000000000000000000000000 3ea0c134bed03d0a2cb7eeaff586af277d137129 CI 1648348653 +1100 commit (initial): myfile1 +3ea0c134bed03d0a2cb7eeaff586af277d137129 7b9a91f4ecba02fd55dbf3f372bc3faee3897939 CI 1648348653 +1100 commit: myfile2 +7b9a91f4ecba02fd55dbf3f372bc3faee3897939 f0eb4a85b26f51dc8c23e31bb7f541f0e2d1d2d0 CI 1648348653 +1100 commit: myfile3 +f0eb4a85b26f51dc8c23e31bb7f541f0e2d1d2d0 97bf06c598032ab5ad0faf744c91545071f3cb38 CI 1648348653 +1100 commit: myfile4 +97bf06c598032ab5ad0faf744c91545071f3cb38 7b9a91f4ecba02fd55dbf3f372bc3faee3897939 CI 1648348653 +1100 reset: moving to HEAD~2 +7b9a91f4ecba02fd55dbf3f372bc3faee3897939 97bf06c598032ab5ad0faf744c91545071f3cb38 CI 1648348654 +1100 rebase -i (start): checkout 97bf06c598032ab5ad0faf744c91545071f3cb38 +97bf06c598032ab5ad0faf744c91545071f3cb38 97bf06c598032ab5ad0faf744c91545071f3cb38 CI 1648348654 +1100 rebase -i (finish): returning to refs/heads/master diff --git a/test/integration/pull/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/pull/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..bbbd7e2e5 --- /dev/null +++ b/test/integration/pull/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,6 @@ +0000000000000000000000000000000000000000 3ea0c134bed03d0a2cb7eeaff586af277d137129 CI 1648348653 +1100 commit (initial): myfile1 +3ea0c134bed03d0a2cb7eeaff586af277d137129 7b9a91f4ecba02fd55dbf3f372bc3faee3897939 CI 1648348653 +1100 commit: myfile2 +7b9a91f4ecba02fd55dbf3f372bc3faee3897939 f0eb4a85b26f51dc8c23e31bb7f541f0e2d1d2d0 CI 1648348653 +1100 commit: myfile3 +f0eb4a85b26f51dc8c23e31bb7f541f0e2d1d2d0 97bf06c598032ab5ad0faf744c91545071f3cb38 CI 1648348653 +1100 commit: myfile4 +97bf06c598032ab5ad0faf744c91545071f3cb38 7b9a91f4ecba02fd55dbf3f372bc3faee3897939 CI 1648348653 +1100 reset: moving to HEAD~2 +7b9a91f4ecba02fd55dbf3f372bc3faee3897939 97bf06c598032ab5ad0faf744c91545071f3cb38 CI 1648348654 +1100 rebase -i (finish): refs/heads/master onto 97bf06c598032ab5ad0faf744c91545071f3cb38 diff --git a/test/integration/pull/expected/repo/.git_keep/logs/refs/remotes/origin/master b/test/integration/pull/expected/repo/.git_keep/logs/refs/remotes/origin/master new file mode 100644 index 000000000..69650cb95 --- /dev/null +++ b/test/integration/pull/expected/repo/.git_keep/logs/refs/remotes/origin/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 97bf06c598032ab5ad0faf744c91545071f3cb38 CI 1648348653 +1100 fetch origin: storing head diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/pull/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/pullRebaseConflict/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/pull/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/pullRebase/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/pull/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/pullRebase/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/pull/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/pullRebase/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/pull/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/pullRebase/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/pull/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/pullAndSetUpstream/expected_remote/objects/2f/6174050380438f14b16658a356e762435ca591 b/test/integration/pull/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 similarity index 100% rename from test/integration/pullAndSetUpstream/expected_remote/objects/2f/6174050380438f14b16658a356e762435ca591 rename to test/integration/pull/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 diff --git a/test/integration/pull/expected/repo/.git_keep/objects/3e/a0c134bed03d0a2cb7eeaff586af277d137129 b/test/integration/pull/expected/repo/.git_keep/objects/3e/a0c134bed03d0a2cb7eeaff586af277d137129 new file mode 100644 index 000000000..a56e97735 --- /dev/null +++ b/test/integration/pull/expected/repo/.git_keep/objects/3e/a0c134bed03d0a2cb7eeaff586af277d137129 @@ -0,0 +1,2 @@ +xŤÍA +0@Ń®sŠŮJĆŚăJ\yŚL¨ŕ")´·×#tűyđS5[ ńĄíŞŕ•Sń‘—á®’‰…ł`± ´PČL%¦ľsńÓ^u‡i†Ç4ŹúŤöŢô–Ş=™$pŕŠč˝;ë9iú'wö+ë¦č49,Ů \ No newline at end of file diff --git a/test/integration/pull/expected/repo/.git_keep/objects/7b/9a91f4ecba02fd55dbf3f372bc3faee3897939 b/test/integration/pull/expected/repo/.git_keep/objects/7b/9a91f4ecba02fd55dbf3f372bc3faee3897939 new file mode 100644 index 000000000..a03a86b26 Binary files /dev/null and b/test/integration/pull/expected/repo/.git_keep/objects/7b/9a91f4ecba02fd55dbf3f372bc3faee3897939 differ diff --git a/test/integration/pull/expected/repo/.git_keep/objects/97/bf06c598032ab5ad0faf744c91545071f3cb38 b/test/integration/pull/expected/repo/.git_keep/objects/97/bf06c598032ab5ad0faf744c91545071f3cb38 new file mode 100644 index 000000000..6921642c3 Binary files /dev/null and b/test/integration/pull/expected/repo/.git_keep/objects/97/bf06c598032ab5ad0faf744c91545071f3cb38 differ diff --git a/test/integration/pullRebaseConflict/expected_remote/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/pull/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/pullRebaseConflict/expected_remote/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/pull/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/pullRebase/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/pull/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/pullRebase/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/pull/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/pullRebase/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/pull/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/pullRebase/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/pull/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/pullRebase/expected_remote/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/pull/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/pullRebase/expected_remote/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/pull/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/pull/expected/repo/.git_keep/objects/f0/eb4a85b26f51dc8c23e31bb7f541f0e2d1d2d0 b/test/integration/pull/expected/repo/.git_keep/objects/f0/eb4a85b26f51dc8c23e31bb7f541f0e2d1d2d0 new file mode 100644 index 000000000..0277b216d --- /dev/null +++ b/test/integration/pull/expected/repo/.git_keep/objects/f0/eb4a85b26f51dc8c23e31bb7f541f0e2d1d2d0 @@ -0,0 +1,3 @@ +xŤŽA +Ă E»öî Ĺq4*”RČ*ÇĐq†j‚…ööő]}xĽź¶ÖÖ®!ąS?µ-âU˘d‡"ąJ4 ‚%?–XíůŕWס¤ś@SÉĆJőľAÁ` Ťśc + “ĘďţŘ=/ú:/wţä¶?ůB[»i\D'Źú `Śtśęü§®ÚWÖ'Łú‘};¦ \ No newline at end of file diff --git a/test/integration/pull/expected/repo/.git_keep/refs/heads/master b/test/integration/pull/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..49859b120 --- /dev/null +++ b/test/integration/pull/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +97bf06c598032ab5ad0faf744c91545071f3cb38 diff --git a/test/integration/pull/expected/repo/.git_keep/refs/remotes/origin/master b/test/integration/pull/expected/repo/.git_keep/refs/remotes/origin/master new file mode 100644 index 000000000..49859b120 --- /dev/null +++ b/test/integration/pull/expected/repo/.git_keep/refs/remotes/origin/master @@ -0,0 +1 @@ +97bf06c598032ab5ad0faf744c91545071f3cb38 diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/myfile1 b/test/integration/pull/expected/repo/myfile1 similarity index 100% rename from test/integration/pullRebaseInteractiveWithDrop/expected/myfile1 rename to test/integration/pull/expected/repo/myfile1 diff --git a/test/integration/pullRebase/expected/myfile2 b/test/integration/pull/expected/repo/myfile2 similarity index 100% rename from test/integration/pullRebase/expected/myfile2 rename to test/integration/pull/expected/repo/myfile2 diff --git a/test/integration/pullMergeConflict/expected/myfile3 b/test/integration/pull/expected/repo/myfile3 similarity index 100% rename from test/integration/pullMergeConflict/expected/myfile3 rename to test/integration/pull/expected/repo/myfile3 diff --git a/test/integration/pullAndSetUpstream/expected/myfile4 b/test/integration/pull/expected/repo/myfile4 similarity index 100% rename from test/integration/pullAndSetUpstream/expected/myfile4 rename to test/integration/pull/expected/repo/myfile4 diff --git a/test/integration/pull/expected_remote/config b/test/integration/pull/expected_remote/config deleted file mode 100644 index 94ceda391..000000000 --- a/test/integration/pull/expected_remote/config +++ /dev/null @@ -1,8 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = true - ignorecase = true - precomposeunicode = true -[remote "origin"] - url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/pull/./actual diff --git a/test/integration/pull/expected_remote/objects/00/3527daa0801470151d8f93140a02fc306fea00 b/test/integration/pull/expected_remote/objects/00/3527daa0801470151d8f93140a02fc306fea00 deleted file mode 100644 index 0ed3c76d8..000000000 --- a/test/integration/pull/expected_remote/objects/00/3527daa0801470151d8f93140a02fc306fea00 +++ /dev/null @@ -1,2 +0,0 @@ -xŤÍA -0@Ń®sŠŮĘŚNÇJ\yŚL¨ŕ")´·×#tűyđS5[ËĄíŞ€*©`”eę3ł’—ě©‹T^¸ĎÂ%¦{çâ§˝ęÓ Źiőí˝é-U{IĎ>H@†+˘;ë9iú'wö+ë¦ä4í,Ý \ No newline at end of file diff --git a/test/integration/pull/expected_remote/objects/0c/0f210a4e5ff3b58e4190501c2b755695f439fa b/test/integration/pull/expected_remote/objects/0c/0f210a4e5ff3b58e4190501c2b755695f439fa deleted file mode 100644 index a89fa981c..000000000 Binary files a/test/integration/pull/expected_remote/objects/0c/0f210a4e5ff3b58e4190501c2b755695f439fa and /dev/null differ diff --git a/test/integration/pull/expected_remote/objects/33/6826e035e431ac94eca7f3cb6dd3fb072f7a5a b/test/integration/pull/expected_remote/objects/33/6826e035e431ac94eca7f3cb6dd3fb072f7a5a deleted file mode 100644 index 2b7ab37ad..000000000 Binary files a/test/integration/pull/expected_remote/objects/33/6826e035e431ac94eca7f3cb6dd3fb072f7a5a and /dev/null differ diff --git a/test/integration/pull/expected_remote/objects/6a/d6c42187d356f4eab4f004cca17863746adec1 b/test/integration/pull/expected_remote/objects/6a/d6c42187d356f4eab4f004cca17863746adec1 deleted file mode 100644 index 335077711..000000000 --- a/test/integration/pull/expected_remote/objects/6a/d6c42187d356f4eab4f004cca17863746adec1 +++ /dev/null @@ -1,2 +0,0 @@ -xŤÎA -Â0@Q×9Eö‚d2“I"BW=Ć4ť`ÁŘR"čííÜ~Ţâ—µµĄ[Čt껪ő•!’ “#LhćkdOŠ„ f“]_Ý"rň¬‚”LZ$V,Ď3ÖÉE_Ł1ňîŹu·ĂhŻĂx׏´í©—˛¶›FJ™ł#{pÎőęú'7í[—§’ůôâ90 \ No newline at end of file diff --git a/test/integration/pull/expected_remote/packed-refs b/test/integration/pull/expected_remote/packed-refs deleted file mode 100644 index 2683a6cf6..000000000 --- a/test/integration/pull/expected_remote/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# pack-refs with: peeled fully-peeled sorted -6ad6c42187d356f4eab4f004cca17863746adec1 refs/heads/master diff --git a/test/integration/pull/setup.sh b/test/integration/pull/setup.sh index ffe8a3b6d..34646d663 100644 --- a/test/integration/pull/setup.sh +++ b/test/integration/pull/setup.sh @@ -25,12 +25,12 @@ git add . git commit -am "myfile4" cd .. -git clone --bare ./actual actual_remote +git clone --bare ./repo origin -cd actual +cd repo # the test is to ensure that we actually can pull these two commits back from the origin git reset --hard HEAD~2 -git remote add origin ../actual_remote +git remote add origin ../origin git fetch origin git branch --set-upstream-to=origin/master master diff --git a/test/integration/pullAndSetUpstream/expected/.git_keep/FETCH_HEAD b/test/integration/pullAndSetUpstream/expected/.git_keep/FETCH_HEAD deleted file mode 100644 index dad3f2b15..000000000 --- a/test/integration/pullAndSetUpstream/expected/.git_keep/FETCH_HEAD +++ /dev/null @@ -1 +0,0 @@ -766e681a51daa75233c1c4ae8845be2c893577d5 branch 'master' of ../actual_remote diff --git a/test/integration/pullAndSetUpstream/expected/.git_keep/ORIG_HEAD b/test/integration/pullAndSetUpstream/expected/.git_keep/ORIG_HEAD deleted file mode 100644 index 013d7edf1..000000000 --- a/test/integration/pullAndSetUpstream/expected/.git_keep/ORIG_HEAD +++ /dev/null @@ -1 +0,0 @@ -c9fd61f40de25556977e063683d1de612f931ccb diff --git a/test/integration/pullAndSetUpstream/expected/.git_keep/config b/test/integration/pullAndSetUpstream/expected/.git_keep/config deleted file mode 100644 index 821803a3e..000000000 --- a/test/integration/pullAndSetUpstream/expected/.git_keep/config +++ /dev/null @@ -1,16 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true - precomposeunicode = true -[user] - email = CI@example.com - name = CI -[remote "origin"] - url = ../actual_remote - fetch = +refs/heads/*:refs/remotes/origin/* -[branch "master"] - remote = origin - merge = refs/heads/master diff --git a/test/integration/pullAndSetUpstream/expected/.git_keep/index b/test/integration/pullAndSetUpstream/expected/.git_keep/index deleted file mode 100644 index f658c6ea4..000000000 Binary files a/test/integration/pullAndSetUpstream/expected/.git_keep/index and /dev/null differ diff --git a/test/integration/pullAndSetUpstream/expected/.git_keep/logs/HEAD b/test/integration/pullAndSetUpstream/expected/.git_keep/logs/HEAD deleted file mode 100644 index a0abb8bc8..000000000 --- a/test/integration/pullAndSetUpstream/expected/.git_keep/logs/HEAD +++ /dev/null @@ -1,7 +0,0 @@ -0000000000000000000000000000000000000000 972fb9caab8b8536ae38687fec98304b76748b9d CI 1642217132 +1100 commit (initial): myfile1 -972fb9caab8b8536ae38687fec98304b76748b9d c9fd61f40de25556977e063683d1de612f931ccb CI 1642217132 +1100 commit: myfile2 -c9fd61f40de25556977e063683d1de612f931ccb 06d3929607b7519beb45ca67165a1f2b5c0e578b CI 1642217132 +1100 commit: myfile3 -06d3929607b7519beb45ca67165a1f2b5c0e578b 766e681a51daa75233c1c4ae8845be2c893577d5 CI 1642217132 +1100 commit: myfile4 -766e681a51daa75233c1c4ae8845be2c893577d5 c9fd61f40de25556977e063683d1de612f931ccb CI 1642217132 +1100 reset: moving to HEAD~2 -c9fd61f40de25556977e063683d1de612f931ccb 766e681a51daa75233c1c4ae8845be2c893577d5 CI 1642217139 +1100 rebase -i (start): checkout 766e681a51daa75233c1c4ae8845be2c893577d5 -766e681a51daa75233c1c4ae8845be2c893577d5 766e681a51daa75233c1c4ae8845be2c893577d5 CI 1642217139 +1100 rebase -i (finish): returning to refs/heads/master diff --git a/test/integration/pullAndSetUpstream/expected/.git_keep/logs/refs/heads/master b/test/integration/pullAndSetUpstream/expected/.git_keep/logs/refs/heads/master deleted file mode 100644 index d6b607c56..000000000 --- a/test/integration/pullAndSetUpstream/expected/.git_keep/logs/refs/heads/master +++ /dev/null @@ -1,6 +0,0 @@ -0000000000000000000000000000000000000000 972fb9caab8b8536ae38687fec98304b76748b9d CI 1642217132 +1100 commit (initial): myfile1 -972fb9caab8b8536ae38687fec98304b76748b9d c9fd61f40de25556977e063683d1de612f931ccb CI 1642217132 +1100 commit: myfile2 -c9fd61f40de25556977e063683d1de612f931ccb 06d3929607b7519beb45ca67165a1f2b5c0e578b CI 1642217132 +1100 commit: myfile3 -06d3929607b7519beb45ca67165a1f2b5c0e578b 766e681a51daa75233c1c4ae8845be2c893577d5 CI 1642217132 +1100 commit: myfile4 -766e681a51daa75233c1c4ae8845be2c893577d5 c9fd61f40de25556977e063683d1de612f931ccb CI 1642217132 +1100 reset: moving to HEAD~2 -c9fd61f40de25556977e063683d1de612f931ccb 766e681a51daa75233c1c4ae8845be2c893577d5 CI 1642217139 +1100 rebase -i (finish): refs/heads/master onto 766e681a51daa75233c1c4ae8845be2c893577d5 diff --git a/test/integration/pullAndSetUpstream/expected/.git_keep/logs/refs/remotes/origin/master b/test/integration/pullAndSetUpstream/expected/.git_keep/logs/refs/remotes/origin/master deleted file mode 100644 index 9c9943bda..000000000 --- a/test/integration/pullAndSetUpstream/expected/.git_keep/logs/refs/remotes/origin/master +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 766e681a51daa75233c1c4ae8845be2c893577d5 CI 1642217132 +1100 fetch origin: storing head diff --git a/test/integration/pullAndSetUpstream/expected/.git_keep/objects/06/d3929607b7519beb45ca67165a1f2b5c0e578b b/test/integration/pullAndSetUpstream/expected/.git_keep/objects/06/d3929607b7519beb45ca67165a1f2b5c0e578b deleted file mode 100644 index 32e93478b..000000000 Binary files a/test/integration/pullAndSetUpstream/expected/.git_keep/objects/06/d3929607b7519beb45ca67165a1f2b5c0e578b and /dev/null differ diff --git a/test/integration/pullAndSetUpstream/expected/.git_keep/objects/76/6e681a51daa75233c1c4ae8845be2c893577d5 b/test/integration/pullAndSetUpstream/expected/.git_keep/objects/76/6e681a51daa75233c1c4ae8845be2c893577d5 deleted file mode 100644 index 527c680a2..000000000 Binary files a/test/integration/pullAndSetUpstream/expected/.git_keep/objects/76/6e681a51daa75233c1c4ae8845be2c893577d5 and /dev/null differ diff --git a/test/integration/pullAndSetUpstream/expected/.git_keep/objects/97/2fb9caab8b8536ae38687fec98304b76748b9d b/test/integration/pullAndSetUpstream/expected/.git_keep/objects/97/2fb9caab8b8536ae38687fec98304b76748b9d deleted file mode 100644 index ab6f93898..000000000 Binary files a/test/integration/pullAndSetUpstream/expected/.git_keep/objects/97/2fb9caab8b8536ae38687fec98304b76748b9d and /dev/null differ diff --git a/test/integration/pullAndSetUpstream/expected/.git_keep/objects/c9/fd61f40de25556977e063683d1de612f931ccb b/test/integration/pullAndSetUpstream/expected/.git_keep/objects/c9/fd61f40de25556977e063683d1de612f931ccb deleted file mode 100644 index cb10ffe51..000000000 Binary files a/test/integration/pullAndSetUpstream/expected/.git_keep/objects/c9/fd61f40de25556977e063683d1de612f931ccb and /dev/null differ diff --git a/test/integration/pullAndSetUpstream/expected/.git_keep/refs/heads/master b/test/integration/pullAndSetUpstream/expected/.git_keep/refs/heads/master deleted file mode 100644 index e6edfeca1..000000000 --- a/test/integration/pullAndSetUpstream/expected/.git_keep/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -766e681a51daa75233c1c4ae8845be2c893577d5 diff --git a/test/integration/pullAndSetUpstream/expected/.git_keep/refs/remotes/origin/master b/test/integration/pullAndSetUpstream/expected/.git_keep/refs/remotes/origin/master deleted file mode 100644 index e6edfeca1..000000000 --- a/test/integration/pullAndSetUpstream/expected/.git_keep/refs/remotes/origin/master +++ /dev/null @@ -1 +0,0 @@ -766e681a51daa75233c1c4ae8845be2c893577d5 diff --git a/test/integration/push/expected/.git_keep/HEAD b/test/integration/pullAndSetUpstream/expected/origin/HEAD similarity index 100% rename from test/integration/push/expected/.git_keep/HEAD rename to test/integration/pullAndSetUpstream/expected/origin/HEAD diff --git a/test/integration/pullAndSetUpstream/expected/origin/config b/test/integration/pullAndSetUpstream/expected/origin/config new file mode 100644 index 000000000..142886cf6 --- /dev/null +++ b/test/integration/pullAndSetUpstream/expected/origin/config @@ -0,0 +1,8 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/pullAndSetUpstream/actual/./repo diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected_remote/description b/test/integration/pullAndSetUpstream/expected/origin/description similarity index 100% rename from test/integration/pullRebaseInteractiveWithDrop/expected_remote/description rename to test/integration/pullAndSetUpstream/expected/origin/description diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/info/exclude b/test/integration/pullAndSetUpstream/expected/origin/info/exclude similarity index 100% rename from test/integration/pullRebaseConflict/expected/.git_keep/info/exclude rename to test/integration/pullAndSetUpstream/expected/origin/info/exclude diff --git a/test/integration/pullRebaseConflict/expected_remote/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/pullAndSetUpstream/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/pullRebaseConflict/expected_remote/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/pullAndSetUpstream/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/pullAndSetUpstream/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/pullRebaseConflict/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/pullAndSetUpstream/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/pullAndSetUpstream/expected/origin/objects/1f/027c0e280612f8e5e2cf0a5361f6ab0c4baed6 b/test/integration/pullAndSetUpstream/expected/origin/objects/1f/027c0e280612f8e5e2cf0a5361f6ab0c4baed6 new file mode 100644 index 000000000..610741e7b --- /dev/null +++ b/test/integration/pullAndSetUpstream/expected/origin/objects/1f/027c0e280612f8e5e2cf0a5361f6ab0c4baed6 @@ -0,0 +1,2 @@ +xŤÍA +0@Ń®sŠŮJF§“))¸ň1™PÁ!")ŘŰ×#tűyđS5[ ńĄíŞŕ•Sń‘çđPÉDŠÂY°‹XÍÔg¦Ó˝sńÓŢu‡q‚ç8˝ô¶­zKŐ@&éI\˝wg='M˙äÎľeYÝ3“,Ő \ No newline at end of file diff --git a/test/integration/pullRebase/expected_remote/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/pullAndSetUpstream/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/pullRebase/expected_remote/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/pullAndSetUpstream/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/pullMerge/expected/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 b/test/integration/pullAndSetUpstream/expected/origin/objects/2f/6174050380438f14b16658a356e762435ca591 similarity index 100% rename from test/integration/pullMerge/expected/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 rename to test/integration/pullAndSetUpstream/expected/origin/objects/2f/6174050380438f14b16658a356e762435ca591 diff --git a/test/integration/pullAndSetUpstream/expected/origin/objects/64/d950eb46bf13d35cd27dd7a3ad621422dee6ac b/test/integration/pullAndSetUpstream/expected/origin/objects/64/d950eb46bf13d35cd27dd7a3ad621422dee6ac new file mode 100644 index 000000000..b3f8ea3c9 Binary files /dev/null and b/test/integration/pullAndSetUpstream/expected/origin/objects/64/d950eb46bf13d35cd27dd7a3ad621422dee6ac differ diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/pullAndSetUpstream/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/pullRebaseInteractive/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/pullAndSetUpstream/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/pullRebase/expected_remote/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/pullAndSetUpstream/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/pullRebase/expected_remote/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/pullAndSetUpstream/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/pullRebase/expected_remote/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/pullAndSetUpstream/expected/origin/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/pullRebase/expected_remote/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/pullAndSetUpstream/expected/origin/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/pullAndSetUpstream/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/pullRebaseConflict/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/pullAndSetUpstream/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/pullAndSetUpstream/expected/origin/objects/df/fd8a2962e840dfcbce39a0315e0cded7873b29 b/test/integration/pullAndSetUpstream/expected/origin/objects/df/fd8a2962e840dfcbce39a0315e0cded7873b29 new file mode 100644 index 000000000..626fe4440 Binary files /dev/null and b/test/integration/pullAndSetUpstream/expected/origin/objects/df/fd8a2962e840dfcbce39a0315e0cded7873b29 differ diff --git a/test/integration/pullAndSetUpstream/expected/origin/objects/f1/1c72f0484c803d954446036bf464c3b8523330 b/test/integration/pullAndSetUpstream/expected/origin/objects/f1/1c72f0484c803d954446036bf464c3b8523330 new file mode 100644 index 000000000..44a011289 Binary files /dev/null and b/test/integration/pullAndSetUpstream/expected/origin/objects/f1/1c72f0484c803d954446036bf464c3b8523330 differ diff --git a/test/integration/pullAndSetUpstream/expected/origin/packed-refs b/test/integration/pullAndSetUpstream/expected/origin/packed-refs new file mode 100644 index 000000000..3f7c0d7ac --- /dev/null +++ b/test/integration/pullAndSetUpstream/expected/origin/packed-refs @@ -0,0 +1,2 @@ +# pack-refs with: peeled fully-peeled sorted +dffd8a2962e840dfcbce39a0315e0cded7873b29 refs/heads/master diff --git a/test/integration/pushAndSetUpstream/expected/.git_keep/COMMIT_EDITMSG b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/pushAndSetUpstream/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/pullAndSetUpstream/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/pullAndSetUpstream/expected/repo/.git_keep/FETCH_HEAD b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/FETCH_HEAD new file mode 100644 index 000000000..15edd8246 --- /dev/null +++ b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/FETCH_HEAD @@ -0,0 +1 @@ +dffd8a2962e840dfcbce39a0315e0cded7873b29 branch 'master' of ../origin diff --git a/test/integration/push/expected_remote/HEAD b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/push/expected_remote/HEAD rename to test/integration/pullAndSetUpstream/expected/repo/.git_keep/HEAD diff --git a/test/integration/pullAndSetUpstream/expected/repo/.git_keep/ORIG_HEAD b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/ORIG_HEAD new file mode 100644 index 000000000..111490020 --- /dev/null +++ b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/ORIG_HEAD @@ -0,0 +1 @@ +f11c72f0484c803d954446036bf464c3b8523330 diff --git a/test/integration/pullAndSetUpstream/expected/repo/.git_keep/config b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/config new file mode 100644 index 000000000..7721ae814 --- /dev/null +++ b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/config @@ -0,0 +1,16 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[user] + email = CI@example.com + name = CI +[remote "origin"] + url = ../origin + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "master"] + remote = origin + merge = refs/heads/master diff --git a/test/integration/push/expected/.git_keep/description b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/description similarity index 100% rename from test/integration/push/expected/.git_keep/description rename to test/integration/pullAndSetUpstream/expected/repo/.git_keep/description diff --git a/test/integration/pullAndSetUpstream/expected/repo/.git_keep/index b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/index new file mode 100644 index 000000000..c1cf7c23d Binary files /dev/null and b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/index differ diff --git a/test/integration/pullRebaseConflict/expected_remote/info/exclude b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/pullRebaseConflict/expected_remote/info/exclude rename to test/integration/pullAndSetUpstream/expected/repo/.git_keep/info/exclude diff --git a/test/integration/pullAndSetUpstream/expected/repo/.git_keep/logs/HEAD b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..e3b32bef3 --- /dev/null +++ b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,7 @@ +0000000000000000000000000000000000000000 1f027c0e280612f8e5e2cf0a5361f6ab0c4baed6 CI 1648348714 +1100 commit (initial): myfile1 +1f027c0e280612f8e5e2cf0a5361f6ab0c4baed6 f11c72f0484c803d954446036bf464c3b8523330 CI 1648348714 +1100 commit: myfile2 +f11c72f0484c803d954446036bf464c3b8523330 64d950eb46bf13d35cd27dd7a3ad621422dee6ac CI 1648348715 +1100 commit: myfile3 +64d950eb46bf13d35cd27dd7a3ad621422dee6ac dffd8a2962e840dfcbce39a0315e0cded7873b29 CI 1648348715 +1100 commit: myfile4 +dffd8a2962e840dfcbce39a0315e0cded7873b29 f11c72f0484c803d954446036bf464c3b8523330 CI 1648348715 +1100 reset: moving to HEAD~2 +f11c72f0484c803d954446036bf464c3b8523330 dffd8a2962e840dfcbce39a0315e0cded7873b29 CI 1648348721 +1100 rebase -i (start): checkout dffd8a2962e840dfcbce39a0315e0cded7873b29 +dffd8a2962e840dfcbce39a0315e0cded7873b29 dffd8a2962e840dfcbce39a0315e0cded7873b29 CI 1648348721 +1100 rebase -i (finish): returning to refs/heads/master diff --git a/test/integration/pullAndSetUpstream/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..49a6912d0 --- /dev/null +++ b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,6 @@ +0000000000000000000000000000000000000000 1f027c0e280612f8e5e2cf0a5361f6ab0c4baed6 CI 1648348714 +1100 commit (initial): myfile1 +1f027c0e280612f8e5e2cf0a5361f6ab0c4baed6 f11c72f0484c803d954446036bf464c3b8523330 CI 1648348714 +1100 commit: myfile2 +f11c72f0484c803d954446036bf464c3b8523330 64d950eb46bf13d35cd27dd7a3ad621422dee6ac CI 1648348715 +1100 commit: myfile3 +64d950eb46bf13d35cd27dd7a3ad621422dee6ac dffd8a2962e840dfcbce39a0315e0cded7873b29 CI 1648348715 +1100 commit: myfile4 +dffd8a2962e840dfcbce39a0315e0cded7873b29 f11c72f0484c803d954446036bf464c3b8523330 CI 1648348715 +1100 reset: moving to HEAD~2 +f11c72f0484c803d954446036bf464c3b8523330 dffd8a2962e840dfcbce39a0315e0cded7873b29 CI 1648348721 +1100 rebase -i (finish): refs/heads/master onto dffd8a2962e840dfcbce39a0315e0cded7873b29 diff --git a/test/integration/pullAndSetUpstream/expected/repo/.git_keep/logs/refs/remotes/origin/master b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/logs/refs/remotes/origin/master new file mode 100644 index 000000000..b8dece53f --- /dev/null +++ b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/logs/refs/remotes/origin/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 dffd8a2962e840dfcbce39a0315e0cded7873b29 CI 1648348715 +1100 fetch origin: storing head diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/pullRebaseInteractive/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/pullAndSetUpstream/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/pullRebaseConflict/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/pullRebaseConflict/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/pullAndSetUpstream/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/pullAndSetUpstream/expected/repo/.git_keep/objects/1f/027c0e280612f8e5e2cf0a5361f6ab0c4baed6 b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/objects/1f/027c0e280612f8e5e2cf0a5361f6ab0c4baed6 new file mode 100644 index 000000000..610741e7b --- /dev/null +++ b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/objects/1f/027c0e280612f8e5e2cf0a5361f6ab0c4baed6 @@ -0,0 +1,2 @@ +xŤÍA +0@Ń®sŠŮJF§“))¸ň1™PÁ!")ŘŰ×#tűyđS5[ ńĄíŞŕ•Sń‘çđPÉDŠÂY°‹XÍÔg¦Ó˝sńÓŢu‡q‚ç8˝ô¶­zKŐ@&éI\˝wg='M˙äÎľeYÝ3“,Ő \ No newline at end of file diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/pullRebaseConflict/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/pullAndSetUpstream/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/pullMerge/expected_remote/objects/2f/6174050380438f14b16658a356e762435ca591 b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 similarity index 100% rename from test/integration/pullMerge/expected_remote/objects/2f/6174050380438f14b16658a356e762435ca591 rename to test/integration/pullAndSetUpstream/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 diff --git a/test/integration/pullAndSetUpstream/expected/repo/.git_keep/objects/64/d950eb46bf13d35cd27dd7a3ad621422dee6ac b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/objects/64/d950eb46bf13d35cd27dd7a3ad621422dee6ac new file mode 100644 index 000000000..b3f8ea3c9 Binary files /dev/null and b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/objects/64/d950eb46bf13d35cd27dd7a3ad621422dee6ac differ diff --git a/test/integration/pullRebaseInteractive/expected_remote/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/pullRebaseInteractive/expected_remote/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/pullAndSetUpstream/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/pullRebaseConflict/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/pullAndSetUpstream/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/pullRebaseConflict/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/pullAndSetUpstream/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/pullRebaseConflict/expected_remote/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/pullRebaseConflict/expected_remote/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/pullAndSetUpstream/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/pullAndSetUpstream/expected/repo/.git_keep/objects/df/fd8a2962e840dfcbce39a0315e0cded7873b29 b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/objects/df/fd8a2962e840dfcbce39a0315e0cded7873b29 new file mode 100644 index 000000000..626fe4440 Binary files /dev/null and b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/objects/df/fd8a2962e840dfcbce39a0315e0cded7873b29 differ diff --git a/test/integration/pullAndSetUpstream/expected/repo/.git_keep/objects/f1/1c72f0484c803d954446036bf464c3b8523330 b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/objects/f1/1c72f0484c803d954446036bf464c3b8523330 new file mode 100644 index 000000000..44a011289 Binary files /dev/null and b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/objects/f1/1c72f0484c803d954446036bf464c3b8523330 differ diff --git a/test/integration/pullAndSetUpstream/expected/repo/.git_keep/refs/heads/master b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..dd134e7e3 --- /dev/null +++ b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +dffd8a2962e840dfcbce39a0315e0cded7873b29 diff --git a/test/integration/pullAndSetUpstream/expected/repo/.git_keep/refs/remotes/origin/master b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/refs/remotes/origin/master new file mode 100644 index 000000000..dd134e7e3 --- /dev/null +++ b/test/integration/pullAndSetUpstream/expected/repo/.git_keep/refs/remotes/origin/master @@ -0,0 +1 @@ +dffd8a2962e840dfcbce39a0315e0cded7873b29 diff --git a/test/integration/push/expected/myfile1 b/test/integration/pullAndSetUpstream/expected/repo/myfile1 similarity index 100% rename from test/integration/push/expected/myfile1 rename to test/integration/pullAndSetUpstream/expected/repo/myfile1 diff --git a/test/integration/pullRebaseConflict/expected/myfile2 b/test/integration/pullAndSetUpstream/expected/repo/myfile2 similarity index 100% rename from test/integration/pullRebaseConflict/expected/myfile2 rename to test/integration/pullAndSetUpstream/expected/repo/myfile2 diff --git a/test/integration/pullRebase/expected/myfile3 b/test/integration/pullAndSetUpstream/expected/repo/myfile3 similarity index 100% rename from test/integration/pullRebase/expected/myfile3 rename to test/integration/pullAndSetUpstream/expected/repo/myfile3 diff --git a/test/integration/pullMerge/expected/myfile4 b/test/integration/pullAndSetUpstream/expected/repo/myfile4 similarity index 100% rename from test/integration/pullMerge/expected/myfile4 rename to test/integration/pullAndSetUpstream/expected/repo/myfile4 diff --git a/test/integration/pullAndSetUpstream/expected_remote/config b/test/integration/pullAndSetUpstream/expected_remote/config deleted file mode 100644 index 6457661a3..000000000 --- a/test/integration/pullAndSetUpstream/expected_remote/config +++ /dev/null @@ -1,8 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = true - ignorecase = true - precomposeunicode = true -[remote "origin"] - url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/pullAndSetUpstream/./actual diff --git a/test/integration/pullAndSetUpstream/expected_remote/objects/06/d3929607b7519beb45ca67165a1f2b5c0e578b b/test/integration/pullAndSetUpstream/expected_remote/objects/06/d3929607b7519beb45ca67165a1f2b5c0e578b deleted file mode 100644 index 32e93478b..000000000 Binary files a/test/integration/pullAndSetUpstream/expected_remote/objects/06/d3929607b7519beb45ca67165a1f2b5c0e578b and /dev/null differ diff --git a/test/integration/pullAndSetUpstream/expected_remote/objects/76/6e681a51daa75233c1c4ae8845be2c893577d5 b/test/integration/pullAndSetUpstream/expected_remote/objects/76/6e681a51daa75233c1c4ae8845be2c893577d5 deleted file mode 100644 index 527c680a2..000000000 Binary files a/test/integration/pullAndSetUpstream/expected_remote/objects/76/6e681a51daa75233c1c4ae8845be2c893577d5 and /dev/null differ diff --git a/test/integration/pullAndSetUpstream/expected_remote/objects/97/2fb9caab8b8536ae38687fec98304b76748b9d b/test/integration/pullAndSetUpstream/expected_remote/objects/97/2fb9caab8b8536ae38687fec98304b76748b9d deleted file mode 100644 index ab6f93898..000000000 Binary files a/test/integration/pullAndSetUpstream/expected_remote/objects/97/2fb9caab8b8536ae38687fec98304b76748b9d and /dev/null differ diff --git a/test/integration/pullAndSetUpstream/expected_remote/objects/c9/fd61f40de25556977e063683d1de612f931ccb b/test/integration/pullAndSetUpstream/expected_remote/objects/c9/fd61f40de25556977e063683d1de612f931ccb deleted file mode 100644 index cb10ffe51..000000000 Binary files a/test/integration/pullAndSetUpstream/expected_remote/objects/c9/fd61f40de25556977e063683d1de612f931ccb and /dev/null differ diff --git a/test/integration/pullAndSetUpstream/expected_remote/packed-refs b/test/integration/pullAndSetUpstream/expected_remote/packed-refs deleted file mode 100644 index 66a0f8392..000000000 --- a/test/integration/pullAndSetUpstream/expected_remote/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# pack-refs with: peeled fully-peeled sorted -766e681a51daa75233c1c4ae8845be2c893577d5 refs/heads/master diff --git a/test/integration/pullAndSetUpstream/setup.sh b/test/integration/pullAndSetUpstream/setup.sh index f0c7cf842..757cef9de 100644 --- a/test/integration/pullAndSetUpstream/setup.sh +++ b/test/integration/pullAndSetUpstream/setup.sh @@ -25,11 +25,11 @@ git add . git commit -am "myfile4" cd .. -git clone --bare ./actual actual_remote +git clone --bare ./repo origin -cd actual +cd repo # the test is to ensure that we actually can pull these two commits back from the origin git reset --hard HEAD~2 -git remote add origin ../actual_remote +git remote add origin ../origin git fetch origin diff --git a/test/integration/pullMerge/expected/.git_keep/FETCH_HEAD b/test/integration/pullMerge/expected/.git_keep/FETCH_HEAD deleted file mode 100644 index e2a5e2793..000000000 --- a/test/integration/pullMerge/expected/.git_keep/FETCH_HEAD +++ /dev/null @@ -1 +0,0 @@ -7f157a65ec0c8d6cffce08d6768e6733939e75a1 branch 'master' of ../actual_remote diff --git a/test/integration/pullMerge/expected/.git_keep/ORIG_HEAD b/test/integration/pullMerge/expected/.git_keep/ORIG_HEAD deleted file mode 100644 index d3db7a1d9..000000000 --- a/test/integration/pullMerge/expected/.git_keep/ORIG_HEAD +++ /dev/null @@ -1 +0,0 @@ -2a0805355a8040f9eebfa2dbf70b8bc313d6f456 diff --git a/test/integration/pullMerge/expected/.git_keep/config b/test/integration/pullMerge/expected/.git_keep/config deleted file mode 100644 index 110d1b43e..000000000 --- a/test/integration/pullMerge/expected/.git_keep/config +++ /dev/null @@ -1,18 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true - precomposeunicode = true -[user] - email = CI@example.com - name = CI -[remote "origin"] - url = ../actual_remote - fetch = +refs/heads/*:refs/remotes/origin/* -[branch "master"] - remote = origin - merge = refs/heads/master -[pull] - rebase = false diff --git a/test/integration/pullMerge/expected/.git_keep/index b/test/integration/pullMerge/expected/.git_keep/index deleted file mode 100644 index d8f385b74..000000000 Binary files a/test/integration/pullMerge/expected/.git_keep/index and /dev/null differ diff --git a/test/integration/pullMerge/expected/.git_keep/logs/HEAD b/test/integration/pullMerge/expected/.git_keep/logs/HEAD deleted file mode 100644 index bd085fb7f..000000000 --- a/test/integration/pullMerge/expected/.git_keep/logs/HEAD +++ /dev/null @@ -1,7 +0,0 @@ -0000000000000000000000000000000000000000 7c0bda1656e7695870ed15839643564b0a9283a8 CI 1634896907 +1100 commit (initial): myfile1 -7c0bda1656e7695870ed15839643564b0a9283a8 5529eadf398ce89032744d5f4151000f07d70124 CI 1634896907 +1100 commit: myfile2 -5529eadf398ce89032744d5f4151000f07d70124 703e85166069a42b4254af06b68dffc159ea3f24 CI 1634896907 +1100 commit: myfile3 -703e85166069a42b4254af06b68dffc159ea3f24 7f157a65ec0c8d6cffce08d6768e6733939e75a1 CI 1634896907 +1100 commit: myfile4 -7f157a65ec0c8d6cffce08d6768e6733939e75a1 5529eadf398ce89032744d5f4151000f07d70124 CI 1634896907 +1100 reset: moving to head^^ -5529eadf398ce89032744d5f4151000f07d70124 2a0805355a8040f9eebfa2dbf70b8bc313d6f456 CI 1634896907 +1100 commit: myfile4 -2a0805355a8040f9eebfa2dbf70b8bc313d6f456 b10baba2f9d877322f94f8770e2e0c8ab1db6bcc CI 1634896908 +1100 pull --no-edit: Merge made by the 'recursive' strategy. diff --git a/test/integration/pullMerge/expected/.git_keep/logs/refs/heads/master b/test/integration/pullMerge/expected/.git_keep/logs/refs/heads/master deleted file mode 100644 index bd085fb7f..000000000 --- a/test/integration/pullMerge/expected/.git_keep/logs/refs/heads/master +++ /dev/null @@ -1,7 +0,0 @@ -0000000000000000000000000000000000000000 7c0bda1656e7695870ed15839643564b0a9283a8 CI 1634896907 +1100 commit (initial): myfile1 -7c0bda1656e7695870ed15839643564b0a9283a8 5529eadf398ce89032744d5f4151000f07d70124 CI 1634896907 +1100 commit: myfile2 -5529eadf398ce89032744d5f4151000f07d70124 703e85166069a42b4254af06b68dffc159ea3f24 CI 1634896907 +1100 commit: myfile3 -703e85166069a42b4254af06b68dffc159ea3f24 7f157a65ec0c8d6cffce08d6768e6733939e75a1 CI 1634896907 +1100 commit: myfile4 -7f157a65ec0c8d6cffce08d6768e6733939e75a1 5529eadf398ce89032744d5f4151000f07d70124 CI 1634896907 +1100 reset: moving to head^^ -5529eadf398ce89032744d5f4151000f07d70124 2a0805355a8040f9eebfa2dbf70b8bc313d6f456 CI 1634896907 +1100 commit: myfile4 -2a0805355a8040f9eebfa2dbf70b8bc313d6f456 b10baba2f9d877322f94f8770e2e0c8ab1db6bcc CI 1634896908 +1100 pull --no-edit: Merge made by the 'recursive' strategy. diff --git a/test/integration/pullMerge/expected/.git_keep/logs/refs/remotes/origin/master b/test/integration/pullMerge/expected/.git_keep/logs/refs/remotes/origin/master deleted file mode 100644 index cd4098ff1..000000000 --- a/test/integration/pullMerge/expected/.git_keep/logs/refs/remotes/origin/master +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 7f157a65ec0c8d6cffce08d6768e6733939e75a1 CI 1634896907 +1100 fetch origin: storing head diff --git a/test/integration/pullMerge/expected/.git_keep/objects/2a/0805355a8040f9eebfa2dbf70b8bc313d6f456 b/test/integration/pullMerge/expected/.git_keep/objects/2a/0805355a8040f9eebfa2dbf70b8bc313d6f456 deleted file mode 100644 index 8988a8d06..000000000 Binary files a/test/integration/pullMerge/expected/.git_keep/objects/2a/0805355a8040f9eebfa2dbf70b8bc313d6f456 and /dev/null differ diff --git a/test/integration/pullMerge/expected/.git_keep/objects/55/29eadf398ce89032744d5f4151000f07d70124 b/test/integration/pullMerge/expected/.git_keep/objects/55/29eadf398ce89032744d5f4151000f07d70124 deleted file mode 100644 index c0dd8a01d..000000000 --- a/test/integration/pullMerge/expected/.git_keep/objects/55/29eadf398ce89032744d5f4151000f07d70124 +++ /dev/null @@ -1,2 +0,0 @@ -xŤŽK -Â0@]çŮ 2“Ď$"BW=Ć´™`ÁŘR"čííÜ>Ľ7Ż­-Ý"‡SßU­$P"W(Eµ2±׉äŁÉžĚAŹ©®ę¦}ëňTg~j|9] \ No newline at end of file diff --git a/test/integration/pullMerge/expected/.git_keep/objects/70/3e85166069a42b4254af06b68dffc159ea3f24 b/test/integration/pullMerge/expected/.git_keep/objects/70/3e85166069a42b4254af06b68dffc159ea3f24 deleted file mode 100644 index 48dfdc50c..000000000 Binary files a/test/integration/pullMerge/expected/.git_keep/objects/70/3e85166069a42b4254af06b68dffc159ea3f24 and /dev/null differ diff --git a/test/integration/pullMerge/expected/.git_keep/objects/7c/0bda1656e7695870ed15839643564b0a9283a8 b/test/integration/pullMerge/expected/.git_keep/objects/7c/0bda1656e7695870ed15839643564b0a9283a8 deleted file mode 100644 index b08614b98..000000000 --- a/test/integration/pullMerge/expected/.git_keep/objects/7c/0bda1656e7695870ed15839643564b0a9283a8 +++ /dev/null @@ -1,3 +0,0 @@ -xŤÍA -Â0@Q×9Ĺě™iÇI"BW=FšL°Đ!R"čííÜ~üÜĚÖÄrę»* J®dńQCaV -R ‰Şç…Ç"\Sľ.˝űłí0Íp›ć‡~’˝6˝äfw 9D‰čáL„čŽzLşţÉť}ëş)ą5ŕ,ă \ No newline at end of file diff --git a/test/integration/pullMerge/expected/.git_keep/objects/7f/157a65ec0c8d6cffce08d6768e6733939e75a1 b/test/integration/pullMerge/expected/.git_keep/objects/7f/157a65ec0c8d6cffce08d6768e6733939e75a1 deleted file mode 100644 index 1af721127..000000000 Binary files a/test/integration/pullMerge/expected/.git_keep/objects/7f/157a65ec0c8d6cffce08d6768e6733939e75a1 and /dev/null differ diff --git a/test/integration/pullMerge/expected/.git_keep/objects/b1/0baba2f9d877322f94f8770e2e0c8ab1db6bcc b/test/integration/pullMerge/expected/.git_keep/objects/b1/0baba2f9d877322f94f8770e2e0c8ab1db6bcc deleted file mode 100644 index d3842cf9b..000000000 Binary files a/test/integration/pullMerge/expected/.git_keep/objects/b1/0baba2f9d877322f94f8770e2e0c8ab1db6bcc and /dev/null differ diff --git a/test/integration/pullMerge/expected/.git_keep/refs/heads/master b/test/integration/pullMerge/expected/.git_keep/refs/heads/master deleted file mode 100644 index 547542fbd..000000000 --- a/test/integration/pullMerge/expected/.git_keep/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -b10baba2f9d877322f94f8770e2e0c8ab1db6bcc diff --git a/test/integration/pullMerge/expected/.git_keep/refs/remotes/origin/master b/test/integration/pullMerge/expected/.git_keep/refs/remotes/origin/master deleted file mode 100644 index 0b78ce1e0..000000000 --- a/test/integration/pullMerge/expected/.git_keep/refs/remotes/origin/master +++ /dev/null @@ -1 +0,0 @@ -7f157a65ec0c8d6cffce08d6768e6733939e75a1 diff --git a/test/integration/pushAndSetUpstream/expected_remote/HEAD b/test/integration/pullMerge/expected/origin/HEAD similarity index 100% rename from test/integration/pushAndSetUpstream/expected_remote/HEAD rename to test/integration/pullMerge/expected/origin/HEAD diff --git a/test/integration/pullMerge/expected/origin/config b/test/integration/pullMerge/expected/origin/config new file mode 100644 index 000000000..90705ff13 --- /dev/null +++ b/test/integration/pullMerge/expected/origin/config @@ -0,0 +1,8 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/pullMerge/actual/./repo diff --git a/test/integration/push/expected_remote/description b/test/integration/pullMerge/expected/origin/description similarity index 100% rename from test/integration/push/expected_remote/description rename to test/integration/pullMerge/expected/origin/description diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/info/exclude b/test/integration/pullMerge/expected/origin/info/exclude similarity index 100% rename from test/integration/pullRebaseInteractive/expected/.git_keep/info/exclude rename to test/integration/pullMerge/expected/origin/info/exclude diff --git a/test/integration/pullMerge/expected/origin/objects/0d/5dd7784063912fe3efeaf7d2b6782019ee9e6e b/test/integration/pullMerge/expected/origin/objects/0d/5dd7784063912fe3efeaf7d2b6782019ee9e6e new file mode 100644 index 000000000..ce0f31a5a Binary files /dev/null and b/test/integration/pullMerge/expected/origin/objects/0d/5dd7784063912fe3efeaf7d2b6782019ee9e6e differ diff --git a/test/integration/pullRebaseInteractive/expected_remote/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/pullMerge/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/pullRebaseInteractive/expected_remote/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/pullMerge/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/pullMerge/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/pullRebaseInteractive/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/pullMerge/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/pullMerge/expected/origin/objects/22/4786fb3e4a16b22b4e2b43fe01d7797491adad b/test/integration/pullMerge/expected/origin/objects/22/4786fb3e4a16b22b4e2b43fe01d7797491adad new file mode 100644 index 000000000..660fe0a45 --- /dev/null +++ b/test/integration/pullMerge/expected/origin/objects/22/4786fb3e4a16b22b4e2b43fe01d7797491adad @@ -0,0 +1,2 @@ +xŤÍA +0@Ń®sŠŮJF§“))¸ň1™PÁ!")ŘŰ×#tűyđS5[ ńĄíŞŕ•Sń‘çđPÉDŠÂY°‹XÍÔg¦Ó˝sńÓŢu‡q‚ç8˝ô¶­zKŐ@&éI¸"zďÎzNšţÉť}˲*ş6%,ĺ \ No newline at end of file diff --git a/test/integration/pullMerge/expected/origin/objects/29/1b985e75f255f9947f064aee9e1f37af1a930d b/test/integration/pullMerge/expected/origin/objects/29/1b985e75f255f9947f064aee9e1f37af1a930d new file mode 100644 index 000000000..e4b84263d --- /dev/null +++ b/test/integration/pullMerge/expected/origin/objects/29/1b985e75f255f9947f064aee9e1f37af1a930d @@ -0,0 +1,2 @@ +xŤÎA +Â0@Q×9Eö‚Ě$“™D„®zŚ´™`ÁŘR"čííÜ~ŢâĎkkK·čÔwUë*ŁđČÇŠ4!sŮVaG>Ě9$4[ŢőŐ-”PŠH$`źĐUőZ5W)nb‰0©&e5ůÝën‡Ń^‡ń®źÜ¶§^ćµÝ,2EOQXěŔőęú'7í[—§’ůôô9% \ No newline at end of file diff --git a/test/integration/pullRebaseConflict/expected_remote/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/pullMerge/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/pullRebaseConflict/expected_remote/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/pullMerge/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/pullMergeConflict/expected/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 b/test/integration/pullMerge/expected/origin/objects/2f/6174050380438f14b16658a356e762435ca591 similarity index 100% rename from test/integration/pullMergeConflict/expected/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 rename to test/integration/pullMerge/expected/origin/objects/2f/6174050380438f14b16658a356e762435ca591 diff --git a/test/integration/pullMerge/expected/origin/objects/82/422401226cbf89b60b7ba3c6d4fa74781250c9 b/test/integration/pullMerge/expected/origin/objects/82/422401226cbf89b60b7ba3c6d4fa74781250c9 new file mode 100644 index 000000000..4e97dab19 Binary files /dev/null and b/test/integration/pullMerge/expected/origin/objects/82/422401226cbf89b60b7ba3c6d4fa74781250c9 differ diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/pullMerge/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/pullMerge/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/pullRebaseConflict/expected_remote/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/pullMerge/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/pullRebaseConflict/expected_remote/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/pullMerge/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/pullRebaseConflict/expected_remote/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/pullMerge/expected/origin/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/pullRebaseConflict/expected_remote/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/pullMerge/expected/origin/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/pullMerge/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/pullRebaseInteractive/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/pullMerge/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/pullMerge/expected/origin/packed-refs b/test/integration/pullMerge/expected/origin/packed-refs new file mode 100644 index 000000000..e6e25ae85 --- /dev/null +++ b/test/integration/pullMerge/expected/origin/packed-refs @@ -0,0 +1,2 @@ +# pack-refs with: peeled fully-peeled sorted +291b985e75f255f9947f064aee9e1f37af1a930d refs/heads/master diff --git a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/COMMIT_EDITMSG b/test/integration/pullMerge/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/pushAndSetUpstreamDefault/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/pullMerge/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/pullMerge/expected/repo/.git_keep/FETCH_HEAD b/test/integration/pullMerge/expected/repo/.git_keep/FETCH_HEAD new file mode 100644 index 000000000..0b3113c2b --- /dev/null +++ b/test/integration/pullMerge/expected/repo/.git_keep/FETCH_HEAD @@ -0,0 +1 @@ +291b985e75f255f9947f064aee9e1f37af1a930d branch 'master' of ../origin diff --git a/test/integration/pushAndSetUpstreamDefault/expected_remote/HEAD b/test/integration/pullMerge/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/pushAndSetUpstreamDefault/expected_remote/HEAD rename to test/integration/pullMerge/expected/repo/.git_keep/HEAD diff --git a/test/integration/pullMerge/expected/repo/.git_keep/ORIG_HEAD b/test/integration/pullMerge/expected/repo/.git_keep/ORIG_HEAD new file mode 100644 index 000000000..83635ede7 --- /dev/null +++ b/test/integration/pullMerge/expected/repo/.git_keep/ORIG_HEAD @@ -0,0 +1 @@ +673a4237450c6ea2a27b18f1d7a3c9293c5606ea diff --git a/test/integration/pullMerge/expected/repo/.git_keep/config b/test/integration/pullMerge/expected/repo/.git_keep/config new file mode 100644 index 000000000..1cff3a489 --- /dev/null +++ b/test/integration/pullMerge/expected/repo/.git_keep/config @@ -0,0 +1,18 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[user] + email = CI@example.com + name = CI +[remote "origin"] + url = ../origin + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "master"] + remote = origin + merge = refs/heads/master +[pull] + rebase = false diff --git a/test/integration/pushAndSetUpstream/expected/.git_keep/description b/test/integration/pullMerge/expected/repo/.git_keep/description similarity index 100% rename from test/integration/pushAndSetUpstream/expected/.git_keep/description rename to test/integration/pullMerge/expected/repo/.git_keep/description diff --git a/test/integration/pullMerge/expected/repo/.git_keep/index b/test/integration/pullMerge/expected/repo/.git_keep/index new file mode 100644 index 000000000..fc9d5cb17 Binary files /dev/null and b/test/integration/pullMerge/expected/repo/.git_keep/index differ diff --git a/test/integration/pullRebaseInteractive/expected_remote/info/exclude b/test/integration/pullMerge/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/pullRebaseInteractive/expected_remote/info/exclude rename to test/integration/pullMerge/expected/repo/.git_keep/info/exclude diff --git a/test/integration/pullMerge/expected/repo/.git_keep/logs/HEAD b/test/integration/pullMerge/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..b3175cf78 --- /dev/null +++ b/test/integration/pullMerge/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,7 @@ +0000000000000000000000000000000000000000 224786fb3e4a16b22b4e2b43fe01d7797491adad CI 1648348767 +1100 commit (initial): myfile1 +224786fb3e4a16b22b4e2b43fe01d7797491adad 82422401226cbf89b60b7ba3c6d4fa74781250c9 CI 1648348767 +1100 commit: myfile2 +82422401226cbf89b60b7ba3c6d4fa74781250c9 0d5dd7784063912fe3efeaf7d2b6782019ee9e6e CI 1648348767 +1100 commit: myfile3 +0d5dd7784063912fe3efeaf7d2b6782019ee9e6e 291b985e75f255f9947f064aee9e1f37af1a930d CI 1648348767 +1100 commit: myfile4 +291b985e75f255f9947f064aee9e1f37af1a930d 82422401226cbf89b60b7ba3c6d4fa74781250c9 CI 1648348767 +1100 reset: moving to HEAD~2 +82422401226cbf89b60b7ba3c6d4fa74781250c9 673a4237450c6ea2a27b18f1d7a3c9293c5606ea CI 1648348767 +1100 commit: myfile4 +673a4237450c6ea2a27b18f1d7a3c9293c5606ea a61316509295a5644a82e38e8bd455422fe477c5 CI 1648348768 +1100 pull --no-edit: Merge made by the 'recursive' strategy. diff --git a/test/integration/pullMerge/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/pullMerge/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..b3175cf78 --- /dev/null +++ b/test/integration/pullMerge/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,7 @@ +0000000000000000000000000000000000000000 224786fb3e4a16b22b4e2b43fe01d7797491adad CI 1648348767 +1100 commit (initial): myfile1 +224786fb3e4a16b22b4e2b43fe01d7797491adad 82422401226cbf89b60b7ba3c6d4fa74781250c9 CI 1648348767 +1100 commit: myfile2 +82422401226cbf89b60b7ba3c6d4fa74781250c9 0d5dd7784063912fe3efeaf7d2b6782019ee9e6e CI 1648348767 +1100 commit: myfile3 +0d5dd7784063912fe3efeaf7d2b6782019ee9e6e 291b985e75f255f9947f064aee9e1f37af1a930d CI 1648348767 +1100 commit: myfile4 +291b985e75f255f9947f064aee9e1f37af1a930d 82422401226cbf89b60b7ba3c6d4fa74781250c9 CI 1648348767 +1100 reset: moving to HEAD~2 +82422401226cbf89b60b7ba3c6d4fa74781250c9 673a4237450c6ea2a27b18f1d7a3c9293c5606ea CI 1648348767 +1100 commit: myfile4 +673a4237450c6ea2a27b18f1d7a3c9293c5606ea a61316509295a5644a82e38e8bd455422fe477c5 CI 1648348768 +1100 pull --no-edit: Merge made by the 'recursive' strategy. diff --git a/test/integration/pullMerge/expected/repo/.git_keep/logs/refs/remotes/origin/master b/test/integration/pullMerge/expected/repo/.git_keep/logs/refs/remotes/origin/master new file mode 100644 index 000000000..57e616700 --- /dev/null +++ b/test/integration/pullMerge/expected/repo/.git_keep/logs/refs/remotes/origin/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 291b985e75f255f9947f064aee9e1f37af1a930d CI 1648348767 +1100 fetch origin: storing head diff --git a/test/integration/pullMerge/expected/repo/.git_keep/objects/0d/5dd7784063912fe3efeaf7d2b6782019ee9e6e b/test/integration/pullMerge/expected/repo/.git_keep/objects/0d/5dd7784063912fe3efeaf7d2b6782019ee9e6e new file mode 100644 index 000000000..ce0f31a5a Binary files /dev/null and b/test/integration/pullMerge/expected/repo/.git_keep/objects/0d/5dd7784063912fe3efeaf7d2b6782019ee9e6e differ diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/pullMerge/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/pullMerge/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/pullRebaseInteractive/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/pullMerge/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/pullRebaseInteractive/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/pullMerge/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/pullMerge/expected/repo/.git_keep/objects/22/4786fb3e4a16b22b4e2b43fe01d7797491adad b/test/integration/pullMerge/expected/repo/.git_keep/objects/22/4786fb3e4a16b22b4e2b43fe01d7797491adad new file mode 100644 index 000000000..660fe0a45 --- /dev/null +++ b/test/integration/pullMerge/expected/repo/.git_keep/objects/22/4786fb3e4a16b22b4e2b43fe01d7797491adad @@ -0,0 +1,2 @@ +xŤÍA +0@Ń®sŠŮJF§“))¸ň1™PÁ!")ŘŰ×#tűyđS5[ ńĄíŞŕ•Sń‘çđPÉDŠÂY°‹XÍÔg¦Ó˝sńÓŢu‡q‚ç8˝ô¶­zKŐ@&éI¸"zďÎzNšţÉť}˲*ş6%,ĺ \ No newline at end of file diff --git a/test/integration/pullMerge/expected/repo/.git_keep/objects/29/1b985e75f255f9947f064aee9e1f37af1a930d b/test/integration/pullMerge/expected/repo/.git_keep/objects/29/1b985e75f255f9947f064aee9e1f37af1a930d new file mode 100644 index 000000000..e4b84263d --- /dev/null +++ b/test/integration/pullMerge/expected/repo/.git_keep/objects/29/1b985e75f255f9947f064aee9e1f37af1a930d @@ -0,0 +1,2 @@ +xŤÎA +Â0@Q×9Eö‚Ě$“™D„®zŚ´™`ÁŘR"čííÜ~ŢâĎkkK·čÔwUë*ŁđČÇŠ4!sŮVaG>Ě9$4[ŢőŐ-”PŠH$`źĐUőZ5W)nb‰0©&e5ůÝën‡Ń^‡ń®źÜ¶§^ćµÝ,2EOQXěŔőęú'7í[—§’ůôô9% \ No newline at end of file diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/pullMerge/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/pullRebaseInteractive/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/pullMerge/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/pullMergeConflict/expected_remote/objects/2f/6174050380438f14b16658a356e762435ca591 b/test/integration/pullMerge/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 similarity index 100% rename from test/integration/pullMergeConflict/expected_remote/objects/2f/6174050380438f14b16658a356e762435ca591 rename to test/integration/pullMerge/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 diff --git a/test/integration/pullMerge/expected/repo/.git_keep/objects/67/3a4237450c6ea2a27b18f1d7a3c9293c5606ea b/test/integration/pullMerge/expected/repo/.git_keep/objects/67/3a4237450c6ea2a27b18f1d7a3c9293c5606ea new file mode 100644 index 000000000..c630a6f65 Binary files /dev/null and b/test/integration/pullMerge/expected/repo/.git_keep/objects/67/3a4237450c6ea2a27b18f1d7a3c9293c5606ea differ diff --git a/test/integration/pullMerge/expected/repo/.git_keep/objects/82/422401226cbf89b60b7ba3c6d4fa74781250c9 b/test/integration/pullMerge/expected/repo/.git_keep/objects/82/422401226cbf89b60b7ba3c6d4fa74781250c9 new file mode 100644 index 000000000..4e97dab19 Binary files /dev/null and b/test/integration/pullMerge/expected/repo/.git_keep/objects/82/422401226cbf89b60b7ba3c6d4fa74781250c9 differ diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected_remote/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/pullMerge/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/pullRebaseInteractiveWithDrop/expected_remote/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/pullMerge/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/pullMerge/expected/repo/.git_keep/objects/a6/1316509295a5644a82e38e8bd455422fe477c5 b/test/integration/pullMerge/expected/repo/.git_keep/objects/a6/1316509295a5644a82e38e8bd455422fe477c5 new file mode 100644 index 000000000..f75c94690 Binary files /dev/null and b/test/integration/pullMerge/expected/repo/.git_keep/objects/a6/1316509295a5644a82e38e8bd455422fe477c5 differ diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/pullMerge/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/pullRebaseInteractive/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/pullMerge/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/pullMerge/expected/repo/.git_keep/objects/ce/0848710343a75263ea72cb5bdfa666b9ecda68 b/test/integration/pullMerge/expected/repo/.git_keep/objects/ce/0848710343a75263ea72cb5bdfa666b9ecda68 new file mode 100644 index 000000000..5e9361d35 Binary files /dev/null and b/test/integration/pullMerge/expected/repo/.git_keep/objects/ce/0848710343a75263ea72cb5bdfa666b9ecda68 differ diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/pullMerge/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/pullRebaseInteractive/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/pullMerge/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/pullRebaseInteractive/expected_remote/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/pullMerge/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/pullRebaseInteractive/expected_remote/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/pullMerge/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/pullMerge/expected/repo/.git_keep/refs/heads/master b/test/integration/pullMerge/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..b1c046dd7 --- /dev/null +++ b/test/integration/pullMerge/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +a61316509295a5644a82e38e8bd455422fe477c5 diff --git a/test/integration/pullMerge/expected/repo/.git_keep/refs/remotes/origin/master b/test/integration/pullMerge/expected/repo/.git_keep/refs/remotes/origin/master new file mode 100644 index 000000000..c2b075905 --- /dev/null +++ b/test/integration/pullMerge/expected/repo/.git_keep/refs/remotes/origin/master @@ -0,0 +1 @@ +291b985e75f255f9947f064aee9e1f37af1a930d diff --git a/test/integration/pushAndSetUpstream/expected/myfile1 b/test/integration/pullMerge/expected/repo/myfile1 similarity index 100% rename from test/integration/pushAndSetUpstream/expected/myfile1 rename to test/integration/pullMerge/expected/repo/myfile1 diff --git a/test/integration/pullRebaseInteractive/expected/myfile2 b/test/integration/pullMerge/expected/repo/myfile2 similarity index 100% rename from test/integration/pullRebaseInteractive/expected/myfile2 rename to test/integration/pullMerge/expected/repo/myfile2 diff --git a/test/integration/pullRebaseConflict/expected/myfile3 b/test/integration/pullMerge/expected/repo/myfile3 similarity index 100% rename from test/integration/pullRebaseConflict/expected/myfile3 rename to test/integration/pullMerge/expected/repo/myfile3 diff --git a/test/integration/pullMergeConflict/expected/myfile4 b/test/integration/pullMerge/expected/repo/myfile4 similarity index 100% rename from test/integration/pullMergeConflict/expected/myfile4 rename to test/integration/pullMerge/expected/repo/myfile4 diff --git a/test/integration/pullMerge/expected_remote/config b/test/integration/pullMerge/expected_remote/config deleted file mode 100644 index 5a46fafb8..000000000 --- a/test/integration/pullMerge/expected_remote/config +++ /dev/null @@ -1,8 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = true - ignorecase = true - precomposeunicode = true -[remote "origin"] - url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/pullMerge/./actual diff --git a/test/integration/pullMerge/expected_remote/objects/55/29eadf398ce89032744d5f4151000f07d70124 b/test/integration/pullMerge/expected_remote/objects/55/29eadf398ce89032744d5f4151000f07d70124 deleted file mode 100644 index c0dd8a01d..000000000 --- a/test/integration/pullMerge/expected_remote/objects/55/29eadf398ce89032744d5f4151000f07d70124 +++ /dev/null @@ -1,2 +0,0 @@ -xŤŽK -Â0@]çŮ 2“Ď$"BW=Ć´™`ÁŘR"čííÜ>Ľ7Ż­-Ý"‡SßU­$P"W(Eµ2±׉äŁÉžĚAŹ©®ę¦}ëňTg~j|9] \ No newline at end of file diff --git a/test/integration/pullMerge/expected_remote/objects/70/3e85166069a42b4254af06b68dffc159ea3f24 b/test/integration/pullMerge/expected_remote/objects/70/3e85166069a42b4254af06b68dffc159ea3f24 deleted file mode 100644 index 48dfdc50c..000000000 Binary files a/test/integration/pullMerge/expected_remote/objects/70/3e85166069a42b4254af06b68dffc159ea3f24 and /dev/null differ diff --git a/test/integration/pullMerge/expected_remote/objects/7c/0bda1656e7695870ed15839643564b0a9283a8 b/test/integration/pullMerge/expected_remote/objects/7c/0bda1656e7695870ed15839643564b0a9283a8 deleted file mode 100644 index b08614b98..000000000 --- a/test/integration/pullMerge/expected_remote/objects/7c/0bda1656e7695870ed15839643564b0a9283a8 +++ /dev/null @@ -1,3 +0,0 @@ -xŤÍA -Â0@Q×9Ĺě™iÇI"BW=FšL°Đ!R"čííÜ~üÜĚÖÄrę»* J®dńQCaV -R ‰Şç…Ç"\Sľ.˝űłí0Íp›ć‡~’˝6˝äfw 9D‰čáL„čŽzLşţÉť}ëş)ą5ŕ,ă \ No newline at end of file diff --git a/test/integration/pullMerge/expected_remote/objects/7f/157a65ec0c8d6cffce08d6768e6733939e75a1 b/test/integration/pullMerge/expected_remote/objects/7f/157a65ec0c8d6cffce08d6768e6733939e75a1 deleted file mode 100644 index 1af721127..000000000 Binary files a/test/integration/pullMerge/expected_remote/objects/7f/157a65ec0c8d6cffce08d6768e6733939e75a1 and /dev/null differ diff --git a/test/integration/pullMerge/expected_remote/packed-refs b/test/integration/pullMerge/expected_remote/packed-refs deleted file mode 100644 index 0ec136723..000000000 --- a/test/integration/pullMerge/expected_remote/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# pack-refs with: peeled fully-peeled sorted -7f157a65ec0c8d6cffce08d6768e6733939e75a1 refs/heads/master diff --git a/test/integration/pullMerge/setup.sh b/test/integration/pullMerge/setup.sh index 379a95362..36d825537 100644 --- a/test/integration/pullMerge/setup.sh +++ b/test/integration/pullMerge/setup.sh @@ -25,9 +25,9 @@ git add . git commit -am "myfile4" cd .. -git clone --bare ./actual actual_remote +git clone --bare ./repo origin -cd actual +cd repo git reset --hard HEAD~2 @@ -35,7 +35,7 @@ echo test4 > myfile4 git add . git commit -am "myfile4" -git remote add origin ../actual_remote +git remote add origin ../origin git fetch origin git branch --set-upstream-to=origin/master master diff --git a/test/integration/pullMergeConflict/expected/.git_keep/COMMIT_EDITMSG b/test/integration/pullMergeConflict/expected/.git_keep/COMMIT_EDITMSG deleted file mode 100644 index ce92bd599..000000000 --- a/test/integration/pullMergeConflict/expected/.git_keep/COMMIT_EDITMSG +++ /dev/null @@ -1,25 +0,0 @@ -Merge branch 'master' of ../actual_remote - -# Conflicts: -# myfile4 -# -# It looks like you may be committing a merge. -# If this is not correct, please remove the file -# /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/pullMergeConflict/actual/.git/MERGE_HEAD -# and try again. - - -# Please enter the commit message for your changes. Lines starting -# with '#' will be ignored, and an empty message aborts the commit. -# -# On branch master -# Your branch and 'origin/master' have diverged, -# and have 1 and 2 different commits each, respectively. -# (use "git pull" to merge the remote branch into yours) -# -# All conflicts fixed but you are still merging. -# -# Changes to be committed: -# new file: myfile3 -# modified: myfile4 -# diff --git a/test/integration/pullMergeConflict/expected/.git_keep/FETCH_HEAD b/test/integration/pullMergeConflict/expected/.git_keep/FETCH_HEAD deleted file mode 100644 index bd1ba7678..000000000 --- a/test/integration/pullMergeConflict/expected/.git_keep/FETCH_HEAD +++ /dev/null @@ -1 +0,0 @@ -38699899bb94dfae74e3e55cf5bd6d92e6f3292a branch 'master' of ../actual_remote diff --git a/test/integration/pullMergeConflict/expected/.git_keep/ORIG_HEAD b/test/integration/pullMergeConflict/expected/.git_keep/ORIG_HEAD deleted file mode 100644 index 703055cf2..000000000 --- a/test/integration/pullMergeConflict/expected/.git_keep/ORIG_HEAD +++ /dev/null @@ -1 +0,0 @@ -7dba68a0030313e27b8dd5da2076952629485f2d diff --git a/test/integration/pullMergeConflict/expected/.git_keep/config b/test/integration/pullMergeConflict/expected/.git_keep/config deleted file mode 100644 index 110d1b43e..000000000 --- a/test/integration/pullMergeConflict/expected/.git_keep/config +++ /dev/null @@ -1,18 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true - precomposeunicode = true -[user] - email = CI@example.com - name = CI -[remote "origin"] - url = ../actual_remote - fetch = +refs/heads/*:refs/remotes/origin/* -[branch "master"] - remote = origin - merge = refs/heads/master -[pull] - rebase = false diff --git a/test/integration/pullMergeConflict/expected/.git_keep/index b/test/integration/pullMergeConflict/expected/.git_keep/index deleted file mode 100644 index d9ffd9453..000000000 Binary files a/test/integration/pullMergeConflict/expected/.git_keep/index and /dev/null differ diff --git a/test/integration/pullMergeConflict/expected/.git_keep/logs/HEAD b/test/integration/pullMergeConflict/expected/.git_keep/logs/HEAD deleted file mode 100644 index 566b28a05..000000000 --- a/test/integration/pullMergeConflict/expected/.git_keep/logs/HEAD +++ /dev/null @@ -1,7 +0,0 @@ -0000000000000000000000000000000000000000 f0e8e7922de77a5ab20b924640c8b8435bae0b0b CI 1634896911 +1100 commit (initial): myfile1 -f0e8e7922de77a5ab20b924640c8b8435bae0b0b ddf4b7fe8f45d07a181c2b57cc3434c982d3f4aa CI 1634896911 +1100 commit: myfile2 -ddf4b7fe8f45d07a181c2b57cc3434c982d3f4aa 80f8aed01cdb61f9e94c6a53c39f400dfbcf05c9 CI 1634896911 +1100 commit: myfile3 -80f8aed01cdb61f9e94c6a53c39f400dfbcf05c9 38699899bb94dfae74e3e55cf5bd6d92e6f3292a CI 1634896911 +1100 commit: myfile4 -38699899bb94dfae74e3e55cf5bd6d92e6f3292a ddf4b7fe8f45d07a181c2b57cc3434c982d3f4aa CI 1634896911 +1100 reset: moving to head^^ -ddf4b7fe8f45d07a181c2b57cc3434c982d3f4aa 7dba68a0030313e27b8dd5da2076952629485f2d CI 1634896911 +1100 commit: myfile4 conflict -7dba68a0030313e27b8dd5da2076952629485f2d 720c7e2dd34822d33cb24a0a3f0f4bdabf433500 CI 1634896916 +1100 commit (merge): Merge branch 'master' of ../actual_remote diff --git a/test/integration/pullMergeConflict/expected/.git_keep/logs/refs/heads/master b/test/integration/pullMergeConflict/expected/.git_keep/logs/refs/heads/master deleted file mode 100644 index 566b28a05..000000000 --- a/test/integration/pullMergeConflict/expected/.git_keep/logs/refs/heads/master +++ /dev/null @@ -1,7 +0,0 @@ -0000000000000000000000000000000000000000 f0e8e7922de77a5ab20b924640c8b8435bae0b0b CI 1634896911 +1100 commit (initial): myfile1 -f0e8e7922de77a5ab20b924640c8b8435bae0b0b ddf4b7fe8f45d07a181c2b57cc3434c982d3f4aa CI 1634896911 +1100 commit: myfile2 -ddf4b7fe8f45d07a181c2b57cc3434c982d3f4aa 80f8aed01cdb61f9e94c6a53c39f400dfbcf05c9 CI 1634896911 +1100 commit: myfile3 -80f8aed01cdb61f9e94c6a53c39f400dfbcf05c9 38699899bb94dfae74e3e55cf5bd6d92e6f3292a CI 1634896911 +1100 commit: myfile4 -38699899bb94dfae74e3e55cf5bd6d92e6f3292a ddf4b7fe8f45d07a181c2b57cc3434c982d3f4aa CI 1634896911 +1100 reset: moving to head^^ -ddf4b7fe8f45d07a181c2b57cc3434c982d3f4aa 7dba68a0030313e27b8dd5da2076952629485f2d CI 1634896911 +1100 commit: myfile4 conflict -7dba68a0030313e27b8dd5da2076952629485f2d 720c7e2dd34822d33cb24a0a3f0f4bdabf433500 CI 1634896916 +1100 commit (merge): Merge branch 'master' of ../actual_remote diff --git a/test/integration/pullMergeConflict/expected/.git_keep/logs/refs/remotes/origin/master b/test/integration/pullMergeConflict/expected/.git_keep/logs/refs/remotes/origin/master deleted file mode 100644 index 4473fe625..000000000 --- a/test/integration/pullMergeConflict/expected/.git_keep/logs/refs/remotes/origin/master +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 38699899bb94dfae74e3e55cf5bd6d92e6f3292a CI 1634896911 +1100 fetch origin: storing head diff --git a/test/integration/pullMergeConflict/expected/.git_keep/objects/1f/e5d8152187295b171f171c0d55d809500ae80f b/test/integration/pullMergeConflict/expected/.git_keep/objects/1f/e5d8152187295b171f171c0d55d809500ae80f deleted file mode 100644 index 5fcd3c3ea..000000000 Binary files a/test/integration/pullMergeConflict/expected/.git_keep/objects/1f/e5d8152187295b171f171c0d55d809500ae80f and /dev/null differ diff --git a/test/integration/pullMergeConflict/expected/.git_keep/objects/38/699899bb94dfae74e3e55cf5bd6d92e6f3292a b/test/integration/pullMergeConflict/expected/.git_keep/objects/38/699899bb94dfae74e3e55cf5bd6d92e6f3292a deleted file mode 100644 index c7b25d78c..000000000 --- a/test/integration/pullMergeConflict/expected/.git_keep/objects/38/699899bb94dfae74e3e55cf5bd6d92e6f3292a +++ /dev/null @@ -1,3 +0,0 @@ -xŤÎA -Â0@Q×9Eö‚Ě4“i"BW=F:ťÁ‚±ĄDĐŰŰ#¸ýĽĹ—µÖĄyĚtj»Şďڱ'PH†4!sL%DÖž; -QJĚ趲ë«ů–ŠÎ€2OŚ–5“p‰AB6m(Ů•w{¬»FĆ»~JÝžz‘µŢ 1648349178 +1100 commit (initial): myfile1 +7c201cb45dc62900f5f42281c1235219df5d0388 77a75278eb08101403d727a8ecaad724f5d9dc78 CI 1648349178 +1100 commit: myfile2 +77a75278eb08101403d727a8ecaad724f5d9dc78 c7180f424ee6b59241eecffedcfa4472a86d927d CI 1648349178 +1100 commit: myfile3 +c7180f424ee6b59241eecffedcfa4472a86d927d 29c0636a86cc64292b7a6b1083c2df10de9cde6c CI 1648349178 +1100 commit: myfile4 +29c0636a86cc64292b7a6b1083c2df10de9cde6c 77a75278eb08101403d727a8ecaad724f5d9dc78 CI 1648349178 +1100 reset: moving to HEAD~2 +77a75278eb08101403d727a8ecaad724f5d9dc78 4db288af7bc797a3819441c734a4c4e7e3635296 CI 1648349178 +1100 commit: myfile4 conflict +4db288af7bc797a3819441c734a4c4e7e3635296 c25833e74799f64c317fe3f112f934fcc57b71f9 CI 1648349183 +1100 commit (merge): Merge branch 'master' of ../origin diff --git a/test/integration/pullMergeConflict/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/pullMergeConflict/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..d67e84881 --- /dev/null +++ b/test/integration/pullMergeConflict/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,7 @@ +0000000000000000000000000000000000000000 7c201cb45dc62900f5f42281c1235219df5d0388 CI 1648349178 +1100 commit (initial): myfile1 +7c201cb45dc62900f5f42281c1235219df5d0388 77a75278eb08101403d727a8ecaad724f5d9dc78 CI 1648349178 +1100 commit: myfile2 +77a75278eb08101403d727a8ecaad724f5d9dc78 c7180f424ee6b59241eecffedcfa4472a86d927d CI 1648349178 +1100 commit: myfile3 +c7180f424ee6b59241eecffedcfa4472a86d927d 29c0636a86cc64292b7a6b1083c2df10de9cde6c CI 1648349178 +1100 commit: myfile4 +29c0636a86cc64292b7a6b1083c2df10de9cde6c 77a75278eb08101403d727a8ecaad724f5d9dc78 CI 1648349178 +1100 reset: moving to HEAD~2 +77a75278eb08101403d727a8ecaad724f5d9dc78 4db288af7bc797a3819441c734a4c4e7e3635296 CI 1648349178 +1100 commit: myfile4 conflict +4db288af7bc797a3819441c734a4c4e7e3635296 c25833e74799f64c317fe3f112f934fcc57b71f9 CI 1648349183 +1100 commit (merge): Merge branch 'master' of ../origin diff --git a/test/integration/pullMergeConflict/expected/repo/.git_keep/logs/refs/remotes/origin/master b/test/integration/pullMergeConflict/expected/repo/.git_keep/logs/refs/remotes/origin/master new file mode 100644 index 000000000..9d875f2ce --- /dev/null +++ b/test/integration/pullMergeConflict/expected/repo/.git_keep/logs/refs/remotes/origin/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 29c0636a86cc64292b7a6b1083c2df10de9cde6c CI 1648349178 +1100 fetch origin: storing head diff --git a/test/integration/push/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/pullMergeConflict/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/push/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/pullMergeConflict/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/pullMergeConflict/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/pullRebaseInteractiveWithDrop/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/pullMergeConflict/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/pullMergeConflict/expected/repo/.git_keep/objects/29/c0636a86cc64292b7a6b1083c2df10de9cde6c b/test/integration/pullMergeConflict/expected/repo/.git_keep/objects/29/c0636a86cc64292b7a6b1083c2df10de9cde6c new file mode 100644 index 000000000..26794f8c9 --- /dev/null +++ b/test/integration/pullMergeConflict/expected/repo/.git_keep/objects/29/c0636a86cc64292b7a6b1083c2df10de9cde6c @@ -0,0 +1,2 @@ +xŤÎA +Â0@Q×9Eö‚d’É$ˇ«cšÎ`ÁŘR"čííÜ~Ţâ×µµĄ[(xę»őJĐE˛Ăp˘9D’DC¬ Ťwyu[d§čQ„¦X<‚HU•ą*#&Ď™ćâÓlřÝën‡Ń^‡ń.nŰS.um7 „9`”íŔ9sÔcŞËźÜ´Ż.OAó9w \ No newline at end of file diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/pullMergeConflict/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/pullMergeConflict/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/pullRebase/expected_remote/objects/2f/6174050380438f14b16658a356e762435ca591 b/test/integration/pullMergeConflict/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 similarity index 100% rename from test/integration/pullRebase/expected_remote/objects/2f/6174050380438f14b16658a356e762435ca591 rename to test/integration/pullMergeConflict/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 diff --git a/test/integration/pullMergeConflict/expected/repo/.git_keep/objects/4d/b288af7bc797a3819441c734a4c4e7e3635296 b/test/integration/pullMergeConflict/expected/repo/.git_keep/objects/4d/b288af7bc797a3819441c734a4c4e7e3635296 new file mode 100644 index 000000000..53c1056c1 --- /dev/null +++ b/test/integration/pullMergeConflict/expected/repo/.git_keep/objects/4d/b288af7bc797a3819441c734a4c4e7e3635296 @@ -0,0 +1,2 @@ +xŤŽA +Â@ E]Ď)f/HҦ“DW=FšI±ĐiĄŚ ··Gp÷yĽß¶RćhOuwŹę9(`cITĆ„ťŽ€ŇŤ‰¦®7BĘÄ”ÂKw_kdVîA ÍÜ°Š›ę±Ž&÷ŮX‚ľësŰăc×Çp÷Ź–×âŰĘ-b"i©G–xF=NU˙Sĺ;Í‹S´mť–Ůjř´#=] \ No newline at end of file diff --git a/test/integration/pullMergeConflict/expected/repo/.git_keep/objects/77/a75278eb08101403d727a8ecaad724f5d9dc78 b/test/integration/pullMergeConflict/expected/repo/.git_keep/objects/77/a75278eb08101403d727a8ecaad724f5d9dc78 new file mode 100644 index 000000000..fa0ad87b7 Binary files /dev/null and b/test/integration/pullMergeConflict/expected/repo/.git_keep/objects/77/a75278eb08101403d727a8ecaad724f5d9dc78 differ diff --git a/test/integration/pullMergeConflict/expected/repo/.git_keep/objects/7c/201cb45dc62900f5f42281c1235219df5d0388 b/test/integration/pullMergeConflict/expected/repo/.git_keep/objects/7c/201cb45dc62900f5f42281c1235219df5d0388 new file mode 100644 index 000000000..4dcbc87d0 --- /dev/null +++ b/test/integration/pullMergeConflict/expected/repo/.git_keep/objects/7c/201cb45dc62900f5f42281c1235219df5d0388 @@ -0,0 +1,2 @@ +xŤÍA +0@Ń®sŠŮJF§“J\yŚL¨ŕ")´·×#tűyđS5[ ńĄíŞŕ•Sń‘—0¨d"Eá,ŘE,ę3S‰éŢąřiŻşĂ4ĂcšGýF{ozKŐž€LŇÓ€AŕŠč˝;ë9iú'wö+ë¦č5",ß \ No newline at end of file diff --git a/test/integration/pullMergeConflict/expected/repo/.git_keep/objects/7d/a51df5143674eeec01d1bafa23ab8b9e69e8c2 b/test/integration/pullMergeConflict/expected/repo/.git_keep/objects/7d/a51df5143674eeec01d1bafa23ab8b9e69e8c2 new file mode 100644 index 000000000..2a3309a4c Binary files /dev/null and b/test/integration/pullMergeConflict/expected/repo/.git_keep/objects/7d/a51df5143674eeec01d1bafa23ab8b9e69e8c2 differ diff --git a/test/integration/pullMergeConflict/expected/.git_keep/objects/9b/1719f5cf069568785080a0bbabbe7c377e22ae b/test/integration/pullMergeConflict/expected/repo/.git_keep/objects/9b/1719f5cf069568785080a0bbabbe7c377e22ae similarity index 100% rename from test/integration/pullMergeConflict/expected/.git_keep/objects/9b/1719f5cf069568785080a0bbabbe7c377e22ae rename to test/integration/pullMergeConflict/expected/repo/.git_keep/objects/9b/1719f5cf069568785080a0bbabbe7c377e22ae diff --git a/test/integration/push/expected_remote/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/pullMergeConflict/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/push/expected_remote/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/pullMergeConflict/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/pullMergeConflict/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/pullMergeConflict/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/pullMergeConflict/expected/.git_keep/objects/ae/d6c0a012c68a8b615ab0185b64f59c414d4746 b/test/integration/pullMergeConflict/expected/repo/.git_keep/objects/ae/d6c0a012c68a8b615ab0185b64f59c414d4746 similarity index 100% rename from test/integration/pullMergeConflict/expected/.git_keep/objects/ae/d6c0a012c68a8b615ab0185b64f59c414d4746 rename to test/integration/pullMergeConflict/expected/repo/.git_keep/objects/ae/d6c0a012c68a8b615ab0185b64f59c414d4746 diff --git a/test/integration/pullMergeConflict/expected/repo/.git_keep/objects/c2/5833e74799f64c317fe3f112f934fcc57b71f9 b/test/integration/pullMergeConflict/expected/repo/.git_keep/objects/c2/5833e74799f64c317fe3f112f934fcc57b71f9 new file mode 100644 index 000000000..03f46ce9a Binary files /dev/null and b/test/integration/pullMergeConflict/expected/repo/.git_keep/objects/c2/5833e74799f64c317fe3f112f934fcc57b71f9 differ diff --git a/test/integration/pullMergeConflict/expected/repo/.git_keep/objects/c7/180f424ee6b59241eecffedcfa4472a86d927d b/test/integration/pullMergeConflict/expected/repo/.git_keep/objects/c7/180f424ee6b59241eecffedcfa4472a86d927d new file mode 100644 index 000000000..72dee6f91 Binary files /dev/null and b/test/integration/pullMergeConflict/expected/repo/.git_keep/objects/c7/180f424ee6b59241eecffedcfa4472a86d927d differ diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/pullMergeConflict/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/pullMergeConflict/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected_remote/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/pullMergeConflict/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/pullRebaseInteractiveWithDrop/expected_remote/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/pullMergeConflict/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/pullMergeConflict/expected/repo/.git_keep/refs/heads/master b/test/integration/pullMergeConflict/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..4512ce2dd --- /dev/null +++ b/test/integration/pullMergeConflict/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +c25833e74799f64c317fe3f112f934fcc57b71f9 diff --git a/test/integration/pullMergeConflict/expected/repo/.git_keep/refs/remotes/origin/master b/test/integration/pullMergeConflict/expected/repo/.git_keep/refs/remotes/origin/master new file mode 100644 index 000000000..9f6715ee9 --- /dev/null +++ b/test/integration/pullMergeConflict/expected/repo/.git_keep/refs/remotes/origin/master @@ -0,0 +1 @@ +29c0636a86cc64292b7a6b1083c2df10de9cde6c diff --git a/test/integration/pushAndSetUpstreamDefault/expected/myfile1 b/test/integration/pullMergeConflict/expected/repo/myfile1 similarity index 100% rename from test/integration/pushAndSetUpstreamDefault/expected/myfile1 rename to test/integration/pullMergeConflict/expected/repo/myfile1 diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/myfile2 b/test/integration/pullMergeConflict/expected/repo/myfile2 similarity index 100% rename from test/integration/pullRebaseInteractiveWithDrop/expected/myfile2 rename to test/integration/pullMergeConflict/expected/repo/myfile2 diff --git a/test/integration/pullRebaseInteractive/expected/myfile3 b/test/integration/pullMergeConflict/expected/repo/myfile3 similarity index 100% rename from test/integration/pullRebaseInteractive/expected/myfile3 rename to test/integration/pullMergeConflict/expected/repo/myfile3 diff --git a/test/integration/pullRebase/expected/myfile4 b/test/integration/pullMergeConflict/expected/repo/myfile4 similarity index 100% rename from test/integration/pullRebase/expected/myfile4 rename to test/integration/pullMergeConflict/expected/repo/myfile4 diff --git a/test/integration/pullMergeConflict/expected_remote/config b/test/integration/pullMergeConflict/expected_remote/config deleted file mode 100644 index 082441c96..000000000 --- a/test/integration/pullMergeConflict/expected_remote/config +++ /dev/null @@ -1,8 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = true - ignorecase = true - precomposeunicode = true -[remote "origin"] - url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/pullMergeConflict/./actual diff --git a/test/integration/pullMergeConflict/expected_remote/objects/38/699899bb94dfae74e3e55cf5bd6d92e6f3292a b/test/integration/pullMergeConflict/expected_remote/objects/38/699899bb94dfae74e3e55cf5bd6d92e6f3292a deleted file mode 100644 index c7b25d78c..000000000 --- a/test/integration/pullMergeConflict/expected_remote/objects/38/699899bb94dfae74e3e55cf5bd6d92e6f3292a +++ /dev/null @@ -1,3 +0,0 @@ -xŤÎA -Â0@Q×9Eö‚Ě4“i"BW=F:ťÁ‚±ĄDĐŰŰ#¸ýĽĹ—µÖĄyĚtj»Şďڱ'PH†4!sL%DÖž; -QJĚ趲ë«ů–ŠÎ€2OŚ–5“p‰AB6m(Ů•w{¬»FĆ»~JÝžz‘µŢ myfile4 git add . git commit -am "myfile4 conflict" -git remote add origin ../actual_remote +git remote add origin ../origin git fetch origin git branch --set-upstream-to=origin/master master diff --git a/test/integration/pullRebase/expected/.git_keep/FETCH_HEAD b/test/integration/pullRebase/expected/.git_keep/FETCH_HEAD deleted file mode 100644 index a05fa9894..000000000 --- a/test/integration/pullRebase/expected/.git_keep/FETCH_HEAD +++ /dev/null @@ -1 +0,0 @@ -d0e04b2bced3bc76f0abf50698a7ab774cd54568 branch 'master' of ../actual_remote diff --git a/test/integration/pullRebase/expected/.git_keep/ORIG_HEAD b/test/integration/pullRebase/expected/.git_keep/ORIG_HEAD deleted file mode 100644 index 66241013d..000000000 --- a/test/integration/pullRebase/expected/.git_keep/ORIG_HEAD +++ /dev/null @@ -1 +0,0 @@ -7b21277988b03a5fd9e933126e8d1f31d2498d08 diff --git a/test/integration/pullRebase/expected/.git_keep/config b/test/integration/pullRebase/expected/.git_keep/config deleted file mode 100644 index 1a54274ac..000000000 --- a/test/integration/pullRebase/expected/.git_keep/config +++ /dev/null @@ -1,18 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true - precomposeunicode = true -[user] - email = CI@example.com - name = CI -[remote "origin"] - url = ../actual_remote - fetch = +refs/heads/*:refs/remotes/origin/* -[branch "master"] - remote = origin - merge = refs/heads/master -[pull] - rebase = true diff --git a/test/integration/pullRebase/expected/.git_keep/index b/test/integration/pullRebase/expected/.git_keep/index deleted file mode 100644 index 3e4466b50..000000000 Binary files a/test/integration/pullRebase/expected/.git_keep/index and /dev/null differ diff --git a/test/integration/pullRebase/expected/.git_keep/logs/HEAD b/test/integration/pullRebase/expected/.git_keep/logs/HEAD deleted file mode 100644 index f5bdda011..000000000 --- a/test/integration/pullRebase/expected/.git_keep/logs/HEAD +++ /dev/null @@ -1,9 +0,0 @@ -0000000000000000000000000000000000000000 c0ae07711df69fb0a21efaca9d63da42a67eaedf CI 1634896919 +1100 commit (initial): myfile1 -c0ae07711df69fb0a21efaca9d63da42a67eaedf 0bbb382cb5729bfd2e6fd3e1d60237e03cb375a4 CI 1634896919 +1100 commit: myfile2 -0bbb382cb5729bfd2e6fd3e1d60237e03cb375a4 fe1d53ca86366f64f689586cb0fe243fed1d1482 CI 1634896919 +1100 commit: myfile3 -fe1d53ca86366f64f689586cb0fe243fed1d1482 d0e04b2bced3bc76f0abf50698a7ab774cd54568 CI 1634896919 +1100 commit: myfile4 -d0e04b2bced3bc76f0abf50698a7ab774cd54568 0bbb382cb5729bfd2e6fd3e1d60237e03cb375a4 CI 1634896919 +1100 reset: moving to head^^ -0bbb382cb5729bfd2e6fd3e1d60237e03cb375a4 7b21277988b03a5fd9e933126e8d1f31d2498d08 CI 1634896919 +1100 commit: myfile5 -7b21277988b03a5fd9e933126e8d1f31d2498d08 d0e04b2bced3bc76f0abf50698a7ab774cd54568 CI 1634896920 +1100 pull --no-edit: checkout d0e04b2bced3bc76f0abf50698a7ab774cd54568 -d0e04b2bced3bc76f0abf50698a7ab774cd54568 74755f34462bd712c676b84247831233da97a272 CI 1634896920 +1100 pull --no-edit: myfile5 -74755f34462bd712c676b84247831233da97a272 74755f34462bd712c676b84247831233da97a272 CI 1634896920 +1100 rebase finished: returning to refs/heads/master diff --git a/test/integration/pullRebase/expected/.git_keep/logs/refs/heads/master b/test/integration/pullRebase/expected/.git_keep/logs/refs/heads/master deleted file mode 100644 index 564aa150d..000000000 --- a/test/integration/pullRebase/expected/.git_keep/logs/refs/heads/master +++ /dev/null @@ -1,7 +0,0 @@ -0000000000000000000000000000000000000000 c0ae07711df69fb0a21efaca9d63da42a67eaedf CI 1634896919 +1100 commit (initial): myfile1 -c0ae07711df69fb0a21efaca9d63da42a67eaedf 0bbb382cb5729bfd2e6fd3e1d60237e03cb375a4 CI 1634896919 +1100 commit: myfile2 -0bbb382cb5729bfd2e6fd3e1d60237e03cb375a4 fe1d53ca86366f64f689586cb0fe243fed1d1482 CI 1634896919 +1100 commit: myfile3 -fe1d53ca86366f64f689586cb0fe243fed1d1482 d0e04b2bced3bc76f0abf50698a7ab774cd54568 CI 1634896919 +1100 commit: myfile4 -d0e04b2bced3bc76f0abf50698a7ab774cd54568 0bbb382cb5729bfd2e6fd3e1d60237e03cb375a4 CI 1634896919 +1100 reset: moving to head^^ -0bbb382cb5729bfd2e6fd3e1d60237e03cb375a4 7b21277988b03a5fd9e933126e8d1f31d2498d08 CI 1634896919 +1100 commit: myfile5 -7b21277988b03a5fd9e933126e8d1f31d2498d08 74755f34462bd712c676b84247831233da97a272 CI 1634896920 +1100 rebase finished: returning to refs/heads/master diff --git a/test/integration/pullRebase/expected/.git_keep/logs/refs/remotes/origin/master b/test/integration/pullRebase/expected/.git_keep/logs/refs/remotes/origin/master deleted file mode 100644 index f04c3d5eb..000000000 --- a/test/integration/pullRebase/expected/.git_keep/logs/refs/remotes/origin/master +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 d0e04b2bced3bc76f0abf50698a7ab774cd54568 CI 1634896919 +1100 fetch origin: storing head diff --git a/test/integration/pullRebase/expected/.git_keep/objects/0b/bb382cb5729bfd2e6fd3e1d60237e03cb375a4 b/test/integration/pullRebase/expected/.git_keep/objects/0b/bb382cb5729bfd2e6fd3e1d60237e03cb375a4 deleted file mode 100644 index 53166135d..000000000 Binary files a/test/integration/pullRebase/expected/.git_keep/objects/0b/bb382cb5729bfd2e6fd3e1d60237e03cb375a4 and /dev/null differ diff --git a/test/integration/pullRebase/expected/.git_keep/objects/74/755f34462bd712c676b84247831233da97a272 b/test/integration/pullRebase/expected/.git_keep/objects/74/755f34462bd712c676b84247831233da97a272 deleted file mode 100644 index 6cf095267..000000000 Binary files a/test/integration/pullRebase/expected/.git_keep/objects/74/755f34462bd712c676b84247831233da97a272 and /dev/null differ diff --git a/test/integration/pullRebase/expected/.git_keep/objects/7b/21277988b03a5fd9e933126e8d1f31d2498d08 b/test/integration/pullRebase/expected/.git_keep/objects/7b/21277988b03a5fd9e933126e8d1f31d2498d08 deleted file mode 100644 index 7557f1bec..000000000 --- a/test/integration/pullRebase/expected/.git_keep/objects/7b/21277988b03a5fd9e933126e8d1f31d2498d08 +++ /dev/null @@ -1,2 +0,0 @@ -xŤŽK -Â0@]çŮ 2“ɧ"BW=F&™`ˇ±ĄDĐŰŰ#¸}</o­-]c´—~čh˛)E8”Tm!¨©Ö@­EŔµ§C^]3Ó`2»`"×bÄ×B‚š @™)¸dUz÷çvčiÖă4?ä“ÚľĘ-oí®Ń“˘Źőőě:é9ŐĺO]µo]VqęB:ţ \ No newline at end of file diff --git a/test/integration/pullRebase/expected/.git_keep/objects/c0/ae07711df69fb0a21efaca9d63da42a67eaedf b/test/integration/pullRebase/expected/.git_keep/objects/c0/ae07711df69fb0a21efaca9d63da42a67eaedf deleted file mode 100644 index bf8cba378..000000000 --- a/test/integration/pullRebase/expected/.git_keep/objects/c0/ae07711df69fb0a21efaca9d63da42a67eaedf +++ /dev/null @@ -1,2 +0,0 @@ -xŤÍA -0@Ń®sŠŮJF§cĄ®<ĆL¨ŕ")´·×#tűyđS5[ ńĄíŞŕ•SńÂË5d"ĹŔ9`'XZ¨ĎLEŇ˝sňiŻşĂ4ĂcšGýŠ˝7˝ĄjO@î)DŽáŠč˝;ë9iú'wö+ë¦č6Ő,é \ No newline at end of file diff --git a/test/integration/pullRebase/expected/.git_keep/objects/d0/e04b2bced3bc76f0abf50698a7ab774cd54568 b/test/integration/pullRebase/expected/.git_keep/objects/d0/e04b2bced3bc76f0abf50698a7ab774cd54568 deleted file mode 100644 index 607a6325f..000000000 --- a/test/integration/pullRebase/expected/.git_keep/objects/d0/e04b2bced3bc76f0abf50698a7ab774cd54568 +++ /dev/null @@ -1,3 +0,0 @@ -xŤÎA -Â0@Q×9Eö‚d:“éD„®zŚ4ťÁ‚±ĄDĐŰŰ#¸ýĽĹ/k­KóčÔvUßCO!”@(4s”Ś‘µçŽ0–¸-ďújŢć% #ł1KŠÂe -¦6ťa’Îĺw{¬»FĆ»~rÝžz)k˝y`$Iś ů3@î¨ÇTÓ?ą«_[žJîĺź8ö \ No newline at end of file diff --git a/test/integration/pullRebase/expected/.git_keep/objects/fe/1d53ca86366f64f689586cb0fe243fed1d1482 b/test/integration/pullRebase/expected/.git_keep/objects/fe/1d53ca86366f64f689586cb0fe243fed1d1482 deleted file mode 100644 index d16cbc927..000000000 Binary files a/test/integration/pullRebase/expected/.git_keep/objects/fe/1d53ca86366f64f689586cb0fe243fed1d1482 and /dev/null differ diff --git a/test/integration/pullRebase/expected/.git_keep/refs/heads/master b/test/integration/pullRebase/expected/.git_keep/refs/heads/master deleted file mode 100644 index dcff007ea..000000000 --- a/test/integration/pullRebase/expected/.git_keep/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -74755f34462bd712c676b84247831233da97a272 diff --git a/test/integration/pullRebase/expected/.git_keep/refs/remotes/origin/master b/test/integration/pullRebase/expected/.git_keep/refs/remotes/origin/master deleted file mode 100644 index 5a2173631..000000000 --- a/test/integration/pullRebase/expected/.git_keep/refs/remotes/origin/master +++ /dev/null @@ -1 +0,0 @@ -d0e04b2bced3bc76f0abf50698a7ab774cd54568 diff --git a/test/integration/pushNoFollowTags/expected/.git_keep/HEAD b/test/integration/pullRebase/expected/origin/HEAD similarity index 100% rename from test/integration/pushNoFollowTags/expected/.git_keep/HEAD rename to test/integration/pullRebase/expected/origin/HEAD diff --git a/test/integration/pullRebase/expected/origin/config b/test/integration/pullRebase/expected/origin/config new file mode 100644 index 000000000..3b62fd0ac --- /dev/null +++ b/test/integration/pullRebase/expected/origin/config @@ -0,0 +1,8 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/pullRebase/actual/./repo diff --git a/test/integration/pushAndSetUpstreamDefault/expected_remote/description b/test/integration/pullRebase/expected/origin/description similarity index 100% rename from test/integration/pushAndSetUpstreamDefault/expected_remote/description rename to test/integration/pullRebase/expected/origin/description diff --git a/test/integration/push/expected/.git_keep/info/exclude b/test/integration/pullRebase/expected/origin/info/exclude similarity index 100% rename from test/integration/push/expected/.git_keep/info/exclude rename to test/integration/pullRebase/expected/origin/info/exclude diff --git a/test/integration/push/expected_remote/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/pullRebase/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/push/expected_remote/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/pullRebase/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/push/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/pullRebase/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/push/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/pullRebase/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected_remote/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/pullRebase/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/pullRebaseInteractiveWithDrop/expected_remote/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/pullRebase/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 b/test/integration/pullRebase/expected/origin/objects/2f/6174050380438f14b16658a356e762435ca591 similarity index 100% rename from test/integration/pullRebaseConflict/expected/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 rename to test/integration/pullRebase/expected/origin/objects/2f/6174050380438f14b16658a356e762435ca591 diff --git a/test/integration/pullRebase/expected/origin/objects/7b/a4176e37b24d5c97f17214ca6d658dbc58ef9d b/test/integration/pullRebase/expected/origin/objects/7b/a4176e37b24d5c97f17214ca6d658dbc58ef9d new file mode 100644 index 000000000..285b95bdd --- /dev/null +++ b/test/integration/pullRebase/expected/origin/objects/7b/a4176e37b24d5c97f17214ca6d658dbc58ef9d @@ -0,0 +1,2 @@ +xŤÍA +0@Ń®sŠŮĘLśŽJ)¸ň1™PÁ!ERĐŰ×#tűyđS5[ËĄmŞ€*©`”ą4dfĄ 9ŹTzžąËÂ%¦»wńŰŢuq‚Ç8˝tŹöYő–Ş=„CÇGW"DwÖsŇôOîě(ËŞä~1L,Ç \ No newline at end of file diff --git a/test/integration/pullRebase/expected/origin/objects/84/b9e43914aa7ae61a869a6b17cf0ec9f1bf04a9 b/test/integration/pullRebase/expected/origin/objects/84/b9e43914aa7ae61a869a6b17cf0ec9f1bf04a9 new file mode 100644 index 000000000..93ffd3015 Binary files /dev/null and b/test/integration/pullRebase/expected/origin/objects/84/b9e43914aa7ae61a869a6b17cf0ec9f1bf04a9 differ diff --git a/test/integration/pushAndSetUpstream/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/pullRebase/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/pushAndSetUpstream/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/pullRebase/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected_remote/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/pullRebase/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/pullRebaseInteractiveWithDrop/expected_remote/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/pullRebase/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected_remote/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/pullRebase/expected/origin/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/pullRebaseInteractiveWithDrop/expected_remote/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/pullRebase/expected/origin/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/push/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/pullRebase/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/push/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/pullRebase/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/pullRebase/expected/origin/objects/f2/744f41facc4c70c41f07c93c2a5fc010b4ccf6 b/test/integration/pullRebase/expected/origin/objects/f2/744f41facc4c70c41f07c93c2a5fc010b4ccf6 new file mode 100644 index 000000000..48bff47be Binary files /dev/null and b/test/integration/pullRebase/expected/origin/objects/f2/744f41facc4c70c41f07c93c2a5fc010b4ccf6 differ diff --git a/test/integration/pullRebase/expected/origin/objects/f2/b972db67c4667ac1896df3556a2cb2422bef8a b/test/integration/pullRebase/expected/origin/objects/f2/b972db67c4667ac1896df3556a2cb2422bef8a new file mode 100644 index 000000000..c6127ca4a Binary files /dev/null and b/test/integration/pullRebase/expected/origin/objects/f2/b972db67c4667ac1896df3556a2cb2422bef8a differ diff --git a/test/integration/pullRebase/expected/origin/packed-refs b/test/integration/pullRebase/expected/origin/packed-refs new file mode 100644 index 000000000..2eebc50dc --- /dev/null +++ b/test/integration/pullRebase/expected/origin/packed-refs @@ -0,0 +1,2 @@ +# pack-refs with: peeled fully-peeled sorted +f2b972db67c4667ac1896df3556a2cb2422bef8a refs/heads/master diff --git a/test/integration/pullRebase/expected/.git_keep/COMMIT_EDITMSG b/test/integration/pullRebase/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/pullRebase/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/pullRebase/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/pullRebase/expected/repo/.git_keep/FETCH_HEAD b/test/integration/pullRebase/expected/repo/.git_keep/FETCH_HEAD new file mode 100644 index 000000000..c1bf8040c --- /dev/null +++ b/test/integration/pullRebase/expected/repo/.git_keep/FETCH_HEAD @@ -0,0 +1 @@ +f2b972db67c4667ac1896df3556a2cb2422bef8a branch 'master' of ../origin diff --git a/test/integration/pushNoFollowTags/expected_remote/HEAD b/test/integration/pullRebase/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/pushNoFollowTags/expected_remote/HEAD rename to test/integration/pullRebase/expected/repo/.git_keep/HEAD diff --git a/test/integration/pullRebase/expected/repo/.git_keep/ORIG_HEAD b/test/integration/pullRebase/expected/repo/.git_keep/ORIG_HEAD new file mode 100644 index 000000000..992a72681 --- /dev/null +++ b/test/integration/pullRebase/expected/repo/.git_keep/ORIG_HEAD @@ -0,0 +1 @@ +25b115c8ff09bf59b023af22277ea140b2833110 diff --git a/test/integration/pullRebase/expected/repo/.git_keep/config b/test/integration/pullRebase/expected/repo/.git_keep/config new file mode 100644 index 000000000..c85b6d3bb --- /dev/null +++ b/test/integration/pullRebase/expected/repo/.git_keep/config @@ -0,0 +1,18 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[user] + email = CI@example.com + name = CI +[remote "origin"] + url = ../origin + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "master"] + remote = origin + merge = refs/heads/master +[pull] + rebase = true diff --git a/test/integration/pushFollowTags/expected/.git_keep/description b/test/integration/pullRebase/expected/repo/.git_keep/description similarity index 100% rename from test/integration/pushFollowTags/expected/.git_keep/description rename to test/integration/pullRebase/expected/repo/.git_keep/description diff --git a/test/integration/pullRebase/expected/repo/.git_keep/index b/test/integration/pullRebase/expected/repo/.git_keep/index new file mode 100644 index 000000000..f694dd5ca Binary files /dev/null and b/test/integration/pullRebase/expected/repo/.git_keep/index differ diff --git a/test/integration/push/expected_remote/info/exclude b/test/integration/pullRebase/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/push/expected_remote/info/exclude rename to test/integration/pullRebase/expected/repo/.git_keep/info/exclude diff --git a/test/integration/pullRebase/expected/repo/.git_keep/logs/HEAD b/test/integration/pullRebase/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..db78f7c3e --- /dev/null +++ b/test/integration/pullRebase/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,9 @@ +0000000000000000000000000000000000000000 7ba4176e37b24d5c97f17214ca6d658dbc58ef9d CI 1648349202 +1100 commit (initial): myfile1 +7ba4176e37b24d5c97f17214ca6d658dbc58ef9d 84b9e43914aa7ae61a869a6b17cf0ec9f1bf04a9 CI 1648349202 +1100 commit: myfile2 +84b9e43914aa7ae61a869a6b17cf0ec9f1bf04a9 f2744f41facc4c70c41f07c93c2a5fc010b4ccf6 CI 1648349202 +1100 commit: myfile3 +f2744f41facc4c70c41f07c93c2a5fc010b4ccf6 f2b972db67c4667ac1896df3556a2cb2422bef8a CI 1648349203 +1100 commit: myfile4 +f2b972db67c4667ac1896df3556a2cb2422bef8a 84b9e43914aa7ae61a869a6b17cf0ec9f1bf04a9 CI 1648349203 +1100 reset: moving to HEAD~2 +84b9e43914aa7ae61a869a6b17cf0ec9f1bf04a9 25b115c8ff09bf59b023af22277ea140b2833110 CI 1648349203 +1100 commit: myfile5 +25b115c8ff09bf59b023af22277ea140b2833110 f2b972db67c4667ac1896df3556a2cb2422bef8a CI 1648349204 +1100 pull --no-edit: checkout f2b972db67c4667ac1896df3556a2cb2422bef8a +f2b972db67c4667ac1896df3556a2cb2422bef8a ef833c09ff39663448dd9582e3d6ac1fa777fb4f CI 1648349204 +1100 pull --no-edit: myfile5 +ef833c09ff39663448dd9582e3d6ac1fa777fb4f ef833c09ff39663448dd9582e3d6ac1fa777fb4f CI 1648349204 +1100 rebase finished: returning to refs/heads/master diff --git a/test/integration/pullRebase/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/pullRebase/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..906b261f3 --- /dev/null +++ b/test/integration/pullRebase/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,7 @@ +0000000000000000000000000000000000000000 7ba4176e37b24d5c97f17214ca6d658dbc58ef9d CI 1648349202 +1100 commit (initial): myfile1 +7ba4176e37b24d5c97f17214ca6d658dbc58ef9d 84b9e43914aa7ae61a869a6b17cf0ec9f1bf04a9 CI 1648349202 +1100 commit: myfile2 +84b9e43914aa7ae61a869a6b17cf0ec9f1bf04a9 f2744f41facc4c70c41f07c93c2a5fc010b4ccf6 CI 1648349202 +1100 commit: myfile3 +f2744f41facc4c70c41f07c93c2a5fc010b4ccf6 f2b972db67c4667ac1896df3556a2cb2422bef8a CI 1648349203 +1100 commit: myfile4 +f2b972db67c4667ac1896df3556a2cb2422bef8a 84b9e43914aa7ae61a869a6b17cf0ec9f1bf04a9 CI 1648349203 +1100 reset: moving to HEAD~2 +84b9e43914aa7ae61a869a6b17cf0ec9f1bf04a9 25b115c8ff09bf59b023af22277ea140b2833110 CI 1648349203 +1100 commit: myfile5 +25b115c8ff09bf59b023af22277ea140b2833110 ef833c09ff39663448dd9582e3d6ac1fa777fb4f CI 1648349204 +1100 rebase finished: returning to refs/heads/master diff --git a/test/integration/pullRebase/expected/repo/.git_keep/logs/refs/remotes/origin/master b/test/integration/pullRebase/expected/repo/.git_keep/logs/refs/remotes/origin/master new file mode 100644 index 000000000..ccc2918cc --- /dev/null +++ b/test/integration/pullRebase/expected/repo/.git_keep/logs/refs/remotes/origin/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 f2b972db67c4667ac1896df3556a2cb2422bef8a CI 1648349203 +1100 fetch origin: storing head diff --git a/test/integration/pushAndSetUpstream/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/pullRebase/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/pushAndSetUpstream/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/pullRebase/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/push/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/pullRebase/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/push/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/pullRebase/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/pullRebase/expected/repo/.git_keep/objects/25/b115c8ff09bf59b023af22277ea140b2833110 b/test/integration/pullRebase/expected/repo/.git_keep/objects/25/b115c8ff09bf59b023af22277ea140b2833110 new file mode 100644 index 000000000..38ec4954a Binary files /dev/null and b/test/integration/pullRebase/expected/repo/.git_keep/objects/25/b115c8ff09bf59b023af22277ea140b2833110 differ diff --git a/test/integration/push/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/pullRebase/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/push/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/pullRebase/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/pullRebaseConflict/expected_remote/objects/2f/6174050380438f14b16658a356e762435ca591 b/test/integration/pullRebase/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 similarity index 100% rename from test/integration/pullRebaseConflict/expected_remote/objects/2f/6174050380438f14b16658a356e762435ca591 rename to test/integration/pullRebase/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 diff --git a/test/integration/pullRebase/expected/repo/.git_keep/objects/7b/a4176e37b24d5c97f17214ca6d658dbc58ef9d b/test/integration/pullRebase/expected/repo/.git_keep/objects/7b/a4176e37b24d5c97f17214ca6d658dbc58ef9d new file mode 100644 index 000000000..285b95bdd --- /dev/null +++ b/test/integration/pullRebase/expected/repo/.git_keep/objects/7b/a4176e37b24d5c97f17214ca6d658dbc58ef9d @@ -0,0 +1,2 @@ +xŤÍA +0@Ń®sŠŮĘLśŽJ)¸ň1™PÁ!ERĐŰ×#tűyđS5[ËĄmŞ€*©`”ą4dfĄ 9ŹTzžąËÂ%¦»wńŰŢuq‚Ç8˝tŹöYő–Ş=„CÇGW"DwÖsŇôOîě(ËŞä~1L,Ç \ No newline at end of file diff --git a/test/integration/pullRebase/expected/repo/.git_keep/objects/84/b9e43914aa7ae61a869a6b17cf0ec9f1bf04a9 b/test/integration/pullRebase/expected/repo/.git_keep/objects/84/b9e43914aa7ae61a869a6b17cf0ec9f1bf04a9 new file mode 100644 index 000000000..93ffd3015 Binary files /dev/null and b/test/integration/pullRebase/expected/repo/.git_keep/objects/84/b9e43914aa7ae61a869a6b17cf0ec9f1bf04a9 differ diff --git a/test/integration/pullRebase/expected/.git_keep/objects/92/c2dd111eeb7daf4a0e30faff73b9441103805d b/test/integration/pullRebase/expected/repo/.git_keep/objects/92/c2dd111eeb7daf4a0e30faff73b9441103805d similarity index 100% rename from test/integration/pullRebase/expected/.git_keep/objects/92/c2dd111eeb7daf4a0e30faff73b9441103805d rename to test/integration/pullRebase/expected/repo/.git_keep/objects/92/c2dd111eeb7daf4a0e30faff73b9441103805d diff --git a/test/integration/pullRebase/expected/.git_keep/objects/98/fea3de076a474cabfac7130669625879051d43 b/test/integration/pullRebase/expected/repo/.git_keep/objects/98/fea3de076a474cabfac7130669625879051d43 similarity index 100% rename from test/integration/pullRebase/expected/.git_keep/objects/98/fea3de076a474cabfac7130669625879051d43 rename to test/integration/pullRebase/expected/repo/.git_keep/objects/98/fea3de076a474cabfac7130669625879051d43 diff --git a/test/integration/pushAndSetUpstream/expected_remote/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/pullRebase/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/pushAndSetUpstream/expected_remote/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/pullRebase/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/push/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/pullRebase/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/push/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/pullRebase/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/push/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/pullRebase/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/push/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/pullRebase/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/push/expected_remote/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/pullRebase/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/push/expected_remote/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/pullRebase/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/pullRebase/expected/repo/.git_keep/objects/ef/833c09ff39663448dd9582e3d6ac1fa777fb4f b/test/integration/pullRebase/expected/repo/.git_keep/objects/ef/833c09ff39663448dd9582e3d6ac1fa777fb4f new file mode 100644 index 000000000..1bcc7cca9 Binary files /dev/null and b/test/integration/pullRebase/expected/repo/.git_keep/objects/ef/833c09ff39663448dd9582e3d6ac1fa777fb4f differ diff --git a/test/integration/pullRebase/expected/repo/.git_keep/objects/f2/744f41facc4c70c41f07c93c2a5fc010b4ccf6 b/test/integration/pullRebase/expected/repo/.git_keep/objects/f2/744f41facc4c70c41f07c93c2a5fc010b4ccf6 new file mode 100644 index 000000000..48bff47be Binary files /dev/null and b/test/integration/pullRebase/expected/repo/.git_keep/objects/f2/744f41facc4c70c41f07c93c2a5fc010b4ccf6 differ diff --git a/test/integration/pullRebase/expected/repo/.git_keep/objects/f2/b972db67c4667ac1896df3556a2cb2422bef8a b/test/integration/pullRebase/expected/repo/.git_keep/objects/f2/b972db67c4667ac1896df3556a2cb2422bef8a new file mode 100644 index 000000000..c6127ca4a Binary files /dev/null and b/test/integration/pullRebase/expected/repo/.git_keep/objects/f2/b972db67c4667ac1896df3556a2cb2422bef8a differ diff --git a/test/integration/pullRebase/expected/repo/.git_keep/refs/heads/master b/test/integration/pullRebase/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..ca6b94f6e --- /dev/null +++ b/test/integration/pullRebase/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +ef833c09ff39663448dd9582e3d6ac1fa777fb4f diff --git a/test/integration/pullRebase/expected/repo/.git_keep/refs/remotes/origin/master b/test/integration/pullRebase/expected/repo/.git_keep/refs/remotes/origin/master new file mode 100644 index 000000000..319df43c4 --- /dev/null +++ b/test/integration/pullRebase/expected/repo/.git_keep/refs/remotes/origin/master @@ -0,0 +1 @@ +f2b972db67c4667ac1896df3556a2cb2422bef8a diff --git a/test/integration/pushFollowTags/expected/myfile1 b/test/integration/pullRebase/expected/repo/myfile1 similarity index 100% rename from test/integration/pushFollowTags/expected/myfile1 rename to test/integration/pullRebase/expected/repo/myfile1 diff --git a/test/integration/push/expected/myfile2 b/test/integration/pullRebase/expected/repo/myfile2 similarity index 100% rename from test/integration/push/expected/myfile2 rename to test/integration/pullRebase/expected/repo/myfile2 diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/myfile3 b/test/integration/pullRebase/expected/repo/myfile3 similarity index 100% rename from test/integration/pullRebaseInteractiveWithDrop/expected/myfile3 rename to test/integration/pullRebase/expected/repo/myfile3 diff --git a/test/integration/push/expected/myfile4 b/test/integration/pullRebase/expected/repo/myfile4 similarity index 100% rename from test/integration/push/expected/myfile4 rename to test/integration/pullRebase/expected/repo/myfile4 diff --git a/test/integration/pullRebase/expected/myfile5 b/test/integration/pullRebase/expected/repo/myfile5 similarity index 100% rename from test/integration/pullRebase/expected/myfile5 rename to test/integration/pullRebase/expected/repo/myfile5 diff --git a/test/integration/pullRebase/expected_remote/config b/test/integration/pullRebase/expected_remote/config deleted file mode 100644 index 201a8b505..000000000 --- a/test/integration/pullRebase/expected_remote/config +++ /dev/null @@ -1,8 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = true - ignorecase = true - precomposeunicode = true -[remote "origin"] - url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/pullRebase/./actual diff --git a/test/integration/pullRebase/expected_remote/objects/0b/bb382cb5729bfd2e6fd3e1d60237e03cb375a4 b/test/integration/pullRebase/expected_remote/objects/0b/bb382cb5729bfd2e6fd3e1d60237e03cb375a4 deleted file mode 100644 index 53166135d..000000000 Binary files a/test/integration/pullRebase/expected_remote/objects/0b/bb382cb5729bfd2e6fd3e1d60237e03cb375a4 and /dev/null differ diff --git a/test/integration/pullRebase/expected_remote/objects/c0/ae07711df69fb0a21efaca9d63da42a67eaedf b/test/integration/pullRebase/expected_remote/objects/c0/ae07711df69fb0a21efaca9d63da42a67eaedf deleted file mode 100644 index bf8cba378..000000000 --- a/test/integration/pullRebase/expected_remote/objects/c0/ae07711df69fb0a21efaca9d63da42a67eaedf +++ /dev/null @@ -1,2 +0,0 @@ -xŤÍA -0@Ń®sŠŮJF§cĄ®<ĆL¨ŕ")´·×#tűyđS5[ ńĄíŞŕ•SńÂË5d"ĹŔ9`'XZ¨ĎLEŇ˝sňiŻşĂ4ĂcšGýŠ˝7˝ĄjO@î)DŽáŠč˝;ë9iú'wö+ë¦č6Ő,é \ No newline at end of file diff --git a/test/integration/pullRebase/expected_remote/objects/d0/e04b2bced3bc76f0abf50698a7ab774cd54568 b/test/integration/pullRebase/expected_remote/objects/d0/e04b2bced3bc76f0abf50698a7ab774cd54568 deleted file mode 100644 index 607a6325f..000000000 --- a/test/integration/pullRebase/expected_remote/objects/d0/e04b2bced3bc76f0abf50698a7ab774cd54568 +++ /dev/null @@ -1,3 +0,0 @@ -xŤÎA -Â0@Q×9Eö‚d:“éD„®zŚ4ťÁ‚±ĄDĐŰŰ#¸ýĽĹ/k­KóčÔvUßCO!”@(4s”Ś‘µçŽ0–¸-ďújŢć% #ł1KŠÂe -¦6ťa’Îĺw{¬»FĆ»~rÝžz)k˝y`$Iś ů3@î¨ÇTÓ?ą«_[žJîĺź8ö \ No newline at end of file diff --git a/test/integration/pullRebase/expected_remote/objects/fe/1d53ca86366f64f689586cb0fe243fed1d1482 b/test/integration/pullRebase/expected_remote/objects/fe/1d53ca86366f64f689586cb0fe243fed1d1482 deleted file mode 100644 index d16cbc927..000000000 Binary files a/test/integration/pullRebase/expected_remote/objects/fe/1d53ca86366f64f689586cb0fe243fed1d1482 and /dev/null differ diff --git a/test/integration/pullRebase/expected_remote/packed-refs b/test/integration/pullRebase/expected_remote/packed-refs deleted file mode 100644 index 88b741528..000000000 --- a/test/integration/pullRebase/expected_remote/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# pack-refs with: peeled fully-peeled sorted -d0e04b2bced3bc76f0abf50698a7ab774cd54568 refs/heads/master diff --git a/test/integration/pullRebase/setup.sh b/test/integration/pullRebase/setup.sh index b1eb37fcf..affe8b273 100644 --- a/test/integration/pullRebase/setup.sh +++ b/test/integration/pullRebase/setup.sh @@ -25,9 +25,9 @@ git add . git commit -am "myfile4" cd .. -git clone --bare ./actual actual_remote +git clone --bare ./repo origin -cd actual +cd repo git reset --hard HEAD~2 @@ -35,7 +35,7 @@ echo test4 > myfile5 git add . git commit -am "myfile5" -git remote add origin ../actual_remote +git remote add origin ../origin git fetch origin git branch --set-upstream-to=origin/master master diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/FETCH_HEAD b/test/integration/pullRebaseConflict/expected/.git_keep/FETCH_HEAD deleted file mode 100644 index 8f2963fe4..000000000 --- a/test/integration/pullRebaseConflict/expected/.git_keep/FETCH_HEAD +++ /dev/null @@ -1 +0,0 @@ -103c3eb899d173b83fc1b40261c8880fef359cc3 branch 'master' of ../actual_remote diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/ORIG_HEAD b/test/integration/pullRebaseConflict/expected/.git_keep/ORIG_HEAD deleted file mode 100644 index 4133994ce..000000000 --- a/test/integration/pullRebaseConflict/expected/.git_keep/ORIG_HEAD +++ /dev/null @@ -1 +0,0 @@ -116cef0e366265c3d002cdb3dce4e285e32b5d12 diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/config b/test/integration/pullRebaseConflict/expected/.git_keep/config deleted file mode 100644 index 1a54274ac..000000000 --- a/test/integration/pullRebaseConflict/expected/.git_keep/config +++ /dev/null @@ -1,18 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true - precomposeunicode = true -[user] - email = CI@example.com - name = CI -[remote "origin"] - url = ../actual_remote - fetch = +refs/heads/*:refs/remotes/origin/* -[branch "master"] - remote = origin - merge = refs/heads/master -[pull] - rebase = true diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/index b/test/integration/pullRebaseConflict/expected/.git_keep/index deleted file mode 100644 index 286197c14..000000000 Binary files a/test/integration/pullRebaseConflict/expected/.git_keep/index and /dev/null differ diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/logs/HEAD b/test/integration/pullRebaseConflict/expected/.git_keep/logs/HEAD deleted file mode 100644 index 707a3154c..000000000 --- a/test/integration/pullRebaseConflict/expected/.git_keep/logs/HEAD +++ /dev/null @@ -1,9 +0,0 @@ -0000000000000000000000000000000000000000 34574474ac6f7dd2d3142bc28ee39db88d8a16af CI 1634896923 +1100 commit (initial): myfile1 -34574474ac6f7dd2d3142bc28ee39db88d8a16af 3b9389ff50095ad2d66d33bb6d67b5700f0bf6da CI 1634896923 +1100 commit: myfile2 -3b9389ff50095ad2d66d33bb6d67b5700f0bf6da aa6ae0785290ee09875f6bd5a5d50c0e7002de13 CI 1634896923 +1100 commit: myfile3 -aa6ae0785290ee09875f6bd5a5d50c0e7002de13 103c3eb899d173b83fc1b40261c8880fef359cc3 CI 1634896923 +1100 commit: myfile4 -103c3eb899d173b83fc1b40261c8880fef359cc3 3b9389ff50095ad2d66d33bb6d67b5700f0bf6da CI 1634896923 +1100 reset: moving to head^^ -3b9389ff50095ad2d66d33bb6d67b5700f0bf6da 116cef0e366265c3d002cdb3dce4e285e32b5d12 CI 1634896923 +1100 commit: myfile4 conflict -116cef0e366265c3d002cdb3dce4e285e32b5d12 103c3eb899d173b83fc1b40261c8880fef359cc3 CI 1634896924 +1100 pull --no-edit: checkout 103c3eb899d173b83fc1b40261c8880fef359cc3 -103c3eb899d173b83fc1b40261c8880fef359cc3 db7122c7f62714dfa854d8d22b2081d308912af8 CI 1634896926 +1100 rebase: myfile4 conflict -db7122c7f62714dfa854d8d22b2081d308912af8 db7122c7f62714dfa854d8d22b2081d308912af8 CI 1634896926 +1100 rebase finished: returning to refs/heads/master diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/logs/refs/heads/master b/test/integration/pullRebaseConflict/expected/.git_keep/logs/refs/heads/master deleted file mode 100644 index eceafe30b..000000000 --- a/test/integration/pullRebaseConflict/expected/.git_keep/logs/refs/heads/master +++ /dev/null @@ -1,7 +0,0 @@ -0000000000000000000000000000000000000000 34574474ac6f7dd2d3142bc28ee39db88d8a16af CI 1634896923 +1100 commit (initial): myfile1 -34574474ac6f7dd2d3142bc28ee39db88d8a16af 3b9389ff50095ad2d66d33bb6d67b5700f0bf6da CI 1634896923 +1100 commit: myfile2 -3b9389ff50095ad2d66d33bb6d67b5700f0bf6da aa6ae0785290ee09875f6bd5a5d50c0e7002de13 CI 1634896923 +1100 commit: myfile3 -aa6ae0785290ee09875f6bd5a5d50c0e7002de13 103c3eb899d173b83fc1b40261c8880fef359cc3 CI 1634896923 +1100 commit: myfile4 -103c3eb899d173b83fc1b40261c8880fef359cc3 3b9389ff50095ad2d66d33bb6d67b5700f0bf6da CI 1634896923 +1100 reset: moving to head^^ -3b9389ff50095ad2d66d33bb6d67b5700f0bf6da 116cef0e366265c3d002cdb3dce4e285e32b5d12 CI 1634896923 +1100 commit: myfile4 conflict -116cef0e366265c3d002cdb3dce4e285e32b5d12 db7122c7f62714dfa854d8d22b2081d308912af8 CI 1634896926 +1100 rebase finished: returning to refs/heads/master diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/logs/refs/remotes/origin/master b/test/integration/pullRebaseConflict/expected/.git_keep/logs/refs/remotes/origin/master deleted file mode 100644 index f05f22244..000000000 --- a/test/integration/pullRebaseConflict/expected/.git_keep/logs/refs/remotes/origin/master +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 103c3eb899d173b83fc1b40261c8880fef359cc3 CI 1634896923 +1100 fetch origin: storing head diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/objects/10/3c3eb899d173b83fc1b40261c8880fef359cc3 b/test/integration/pullRebaseConflict/expected/.git_keep/objects/10/3c3eb899d173b83fc1b40261c8880fef359cc3 deleted file mode 100644 index 54f9946f5..000000000 Binary files a/test/integration/pullRebaseConflict/expected/.git_keep/objects/10/3c3eb899d173b83fc1b40261c8880fef359cc3 and /dev/null differ diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/objects/11/6cef0e366265c3d002cdb3dce4e285e32b5d12 b/test/integration/pullRebaseConflict/expected/.git_keep/objects/11/6cef0e366265c3d002cdb3dce4e285e32b5d12 deleted file mode 100644 index 01f6c3182..000000000 Binary files a/test/integration/pullRebaseConflict/expected/.git_keep/objects/11/6cef0e366265c3d002cdb3dce4e285e32b5d12 and /dev/null differ diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/objects/34/574474ac6f7dd2d3142bc28ee39db88d8a16af b/test/integration/pullRebaseConflict/expected/.git_keep/objects/34/574474ac6f7dd2d3142bc28ee39db88d8a16af deleted file mode 100644 index 229191e1c..000000000 --- a/test/integration/pullRebaseConflict/expected/.git_keep/objects/34/574474ac6f7dd2d3142bc28ee39db88d8a16af +++ /dev/null @@ -1,2 +0,0 @@ -xŤÍA -Ă @Ń®=Ĺě ĹŃéDˇ”BV9†Ń‘2X‚…äöÍşý<řą©.řŇ7°ÂąÚÄó%"ÁŔ% KXšÉ¦šňÝ™ôíď¶Á8Ácś^˛'ý¬rËMź€ě)DŽÎĂŃZsÖsŇĺOnô¨Ë*h~5B,ß \ No newline at end of file diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/objects/3b/9389ff50095ad2d66d33bb6d67b5700f0bf6da b/test/integration/pullRebaseConflict/expected/.git_keep/objects/3b/9389ff50095ad2d66d33bb6d67b5700f0bf6da deleted file mode 100644 index fd885765d..000000000 Binary files a/test/integration/pullRebaseConflict/expected/.git_keep/objects/3b/9389ff50095ad2d66d33bb6d67b5700f0bf6da and /dev/null differ diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/objects/aa/6ae0785290ee09875f6bd5a5d50c0e7002de13 b/test/integration/pullRebaseConflict/expected/.git_keep/objects/aa/6ae0785290ee09875f6bd5a5d50c0e7002de13 deleted file mode 100644 index 94a6241c8..000000000 Binary files a/test/integration/pullRebaseConflict/expected/.git_keep/objects/aa/6ae0785290ee09875f6bd5a5d50c0e7002de13 and /dev/null differ diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/objects/db/7122c7f62714dfa854d8d22b2081d308912af8 b/test/integration/pullRebaseConflict/expected/.git_keep/objects/db/7122c7f62714dfa854d8d22b2081d308912af8 deleted file mode 100644 index e8035ad35..000000000 Binary files a/test/integration/pullRebaseConflict/expected/.git_keep/objects/db/7122c7f62714dfa854d8d22b2081d308912af8 and /dev/null differ diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/refs/heads/master b/test/integration/pullRebaseConflict/expected/.git_keep/refs/heads/master deleted file mode 100644 index ef35219b9..000000000 --- a/test/integration/pullRebaseConflict/expected/.git_keep/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -db7122c7f62714dfa854d8d22b2081d308912af8 diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/refs/remotes/origin/master b/test/integration/pullRebaseConflict/expected/.git_keep/refs/remotes/origin/master deleted file mode 100644 index 271b00ad9..000000000 --- a/test/integration/pullRebaseConflict/expected/.git_keep/refs/remotes/origin/master +++ /dev/null @@ -1 +0,0 @@ -103c3eb899d173b83fc1b40261c8880fef359cc3 diff --git a/test/integration/pushTag/expected/.git_keep/HEAD b/test/integration/pullRebaseConflict/expected/origin/HEAD similarity index 100% rename from test/integration/pushTag/expected/.git_keep/HEAD rename to test/integration/pullRebaseConflict/expected/origin/HEAD diff --git a/test/integration/pullRebaseConflict/expected/origin/config b/test/integration/pullRebaseConflict/expected/origin/config new file mode 100644 index 000000000..22a73c314 --- /dev/null +++ b/test/integration/pullRebaseConflict/expected/origin/config @@ -0,0 +1,8 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/pullRebaseConflict/actual/./repo diff --git a/test/integration/pushFollowTags/expected_remote/description b/test/integration/pullRebaseConflict/expected/origin/description similarity index 100% rename from test/integration/pushFollowTags/expected_remote/description rename to test/integration/pullRebaseConflict/expected/origin/description diff --git a/test/integration/pushAndSetUpstream/expected/.git_keep/info/exclude b/test/integration/pullRebaseConflict/expected/origin/info/exclude similarity index 100% rename from test/integration/pushAndSetUpstream/expected/.git_keep/info/exclude rename to test/integration/pullRebaseConflict/expected/origin/info/exclude diff --git a/test/integration/pullRebaseConflict/expected/origin/objects/00/36ac0e5f5536f55bfdfcb4e09927f1eed3b37b b/test/integration/pullRebaseConflict/expected/origin/objects/00/36ac0e5f5536f55bfdfcb4e09927f1eed3b37b new file mode 100644 index 000000000..92dba726a --- /dev/null +++ b/test/integration/pullRebaseConflict/expected/origin/objects/00/36ac0e5f5536f55bfdfcb4e09927f1eed3b37b @@ -0,0 +1,2 @@ +xŤÍA +0@Ń®sŠŮĘLśŽJ)¸ň1™PÁ!ERĐŰ×#tűyđS5[ËĄmŞ€*©`”ą4dfĄ 9ŹTzžąËÂ%¦»wńŰŢuq‚Ç8˝tŹöYő–Ş=„CÇ÷W"DwÖsŇôOîě(ËŞä~1P,Ç \ No newline at end of file diff --git a/test/integration/pushAndSetUpstream/expected_remote/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/pullRebaseConflict/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/pushAndSetUpstream/expected_remote/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/pullRebaseConflict/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/pushAndSetUpstream/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/pullRebaseConflict/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/pushAndSetUpstream/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/pullRebaseConflict/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/push/expected_remote/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/pullRebaseConflict/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/push/expected_remote/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/pullRebaseConflict/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 b/test/integration/pullRebaseConflict/expected/origin/objects/2f/6174050380438f14b16658a356e762435ca591 similarity index 100% rename from test/integration/pullRebaseInteractive/expected/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 rename to test/integration/pullRebaseConflict/expected/origin/objects/2f/6174050380438f14b16658a356e762435ca591 diff --git a/test/integration/pullRebaseConflict/expected/origin/objects/30/8a85a7f740d42925175560337196f952ac6cf6 b/test/integration/pullRebaseConflict/expected/origin/objects/30/8a85a7f740d42925175560337196f952ac6cf6 new file mode 100644 index 000000000..cf8b94a34 Binary files /dev/null and b/test/integration/pullRebaseConflict/expected/origin/objects/30/8a85a7f740d42925175560337196f952ac6cf6 differ diff --git a/test/integration/pullRebaseConflict/expected/origin/objects/70/2648e6efd5f8c60f5fe57e152850a5de756978 b/test/integration/pullRebaseConflict/expected/origin/objects/70/2648e6efd5f8c60f5fe57e152850a5de756978 new file mode 100644 index 000000000..04ef3447f Binary files /dev/null and b/test/integration/pullRebaseConflict/expected/origin/objects/70/2648e6efd5f8c60f5fe57e152850a5de756978 differ diff --git a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/pullRebaseConflict/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/pushAndSetUpstreamDefault/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/pullRebaseConflict/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/push/expected_remote/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/pullRebaseConflict/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/push/expected_remote/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/pullRebaseConflict/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/pullRebaseConflict/expected/origin/objects/ae/0aa5a0d1c65005bd50012612b1c56c1ea06155 b/test/integration/pullRebaseConflict/expected/origin/objects/ae/0aa5a0d1c65005bd50012612b1c56c1ea06155 new file mode 100644 index 000000000..8ebe82e5a Binary files /dev/null and b/test/integration/pullRebaseConflict/expected/origin/objects/ae/0aa5a0d1c65005bd50012612b1c56c1ea06155 differ diff --git a/test/integration/push/expected_remote/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/pullRebaseConflict/expected/origin/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/push/expected_remote/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/pullRebaseConflict/expected/origin/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/pushAndSetUpstream/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/pullRebaseConflict/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/pushAndSetUpstream/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/pullRebaseConflict/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/pullRebaseConflict/expected/origin/packed-refs b/test/integration/pullRebaseConflict/expected/origin/packed-refs new file mode 100644 index 000000000..edf7e7c39 --- /dev/null +++ b/test/integration/pullRebaseConflict/expected/origin/packed-refs @@ -0,0 +1,2 @@ +# pack-refs with: peeled fully-peeled sorted +702648e6efd5f8c60f5fe57e152850a5de756978 refs/heads/master diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/COMMIT_EDITMSG b/test/integration/pullRebaseConflict/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/pullRebaseConflict/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/pullRebaseConflict/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/pullRebaseConflict/expected/repo/.git_keep/FETCH_HEAD b/test/integration/pullRebaseConflict/expected/repo/.git_keep/FETCH_HEAD new file mode 100644 index 000000000..d74d32218 --- /dev/null +++ b/test/integration/pullRebaseConflict/expected/repo/.git_keep/FETCH_HEAD @@ -0,0 +1 @@ +702648e6efd5f8c60f5fe57e152850a5de756978 branch 'master' of ../origin diff --git a/test/integration/pushTag/expected_remote/HEAD b/test/integration/pullRebaseConflict/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/pushTag/expected_remote/HEAD rename to test/integration/pullRebaseConflict/expected/repo/.git_keep/HEAD diff --git a/test/integration/pullRebaseConflict/expected/repo/.git_keep/ORIG_HEAD b/test/integration/pullRebaseConflict/expected/repo/.git_keep/ORIG_HEAD new file mode 100644 index 000000000..c7f24c5a8 --- /dev/null +++ b/test/integration/pullRebaseConflict/expected/repo/.git_keep/ORIG_HEAD @@ -0,0 +1 @@ +d450cc8f4e691e3043aac25ae71f0f1a3217368f diff --git a/test/integration/pullRebaseConflict/expected/repo/.git_keep/config b/test/integration/pullRebaseConflict/expected/repo/.git_keep/config new file mode 100644 index 000000000..c85b6d3bb --- /dev/null +++ b/test/integration/pullRebaseConflict/expected/repo/.git_keep/config @@ -0,0 +1,18 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[user] + email = CI@example.com + name = CI +[remote "origin"] + url = ../origin + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "master"] + remote = origin + merge = refs/heads/master +[pull] + rebase = true diff --git a/test/integration/pushNoFollowTags/expected/.git_keep/description b/test/integration/pullRebaseConflict/expected/repo/.git_keep/description similarity index 100% rename from test/integration/pushNoFollowTags/expected/.git_keep/description rename to test/integration/pullRebaseConflict/expected/repo/.git_keep/description diff --git a/test/integration/pullRebaseConflict/expected/repo/.git_keep/index b/test/integration/pullRebaseConflict/expected/repo/.git_keep/index new file mode 100644 index 000000000..ceeffd34e Binary files /dev/null and b/test/integration/pullRebaseConflict/expected/repo/.git_keep/index differ diff --git a/test/integration/pushAndSetUpstream/expected_remote/info/exclude b/test/integration/pullRebaseConflict/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/pushAndSetUpstream/expected_remote/info/exclude rename to test/integration/pullRebaseConflict/expected/repo/.git_keep/info/exclude diff --git a/test/integration/pullRebaseConflict/expected/repo/.git_keep/logs/HEAD b/test/integration/pullRebaseConflict/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..89cdca1d7 --- /dev/null +++ b/test/integration/pullRebaseConflict/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,9 @@ +0000000000000000000000000000000000000000 0036ac0e5f5536f55bfdfcb4e09927f1eed3b37b CI 1648349220 +1100 commit (initial): myfile1 +0036ac0e5f5536f55bfdfcb4e09927f1eed3b37b 308a85a7f740d42925175560337196f952ac6cf6 CI 1648349220 +1100 commit: myfile2 +308a85a7f740d42925175560337196f952ac6cf6 ae0aa5a0d1c65005bd50012612b1c56c1ea06155 CI 1648349220 +1100 commit: myfile3 +ae0aa5a0d1c65005bd50012612b1c56c1ea06155 702648e6efd5f8c60f5fe57e152850a5de756978 CI 1648349220 +1100 commit: myfile4 +702648e6efd5f8c60f5fe57e152850a5de756978 308a85a7f740d42925175560337196f952ac6cf6 CI 1648349220 +1100 reset: moving to HEAD~2 +308a85a7f740d42925175560337196f952ac6cf6 d450cc8f4e691e3043aac25ae71f0f1a3217368f CI 1648349220 +1100 commit: myfile4 conflict +d450cc8f4e691e3043aac25ae71f0f1a3217368f 702648e6efd5f8c60f5fe57e152850a5de756978 CI 1648349221 +1100 pull --no-edit: checkout 702648e6efd5f8c60f5fe57e152850a5de756978 +702648e6efd5f8c60f5fe57e152850a5de756978 bdd975a23140e915dd46a1a16575c71bcad754ca CI 1648349223 +1100 rebase: myfile4 conflict +bdd975a23140e915dd46a1a16575c71bcad754ca bdd975a23140e915dd46a1a16575c71bcad754ca CI 1648349223 +1100 rebase finished: returning to refs/heads/master diff --git a/test/integration/pullRebaseConflict/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/pullRebaseConflict/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..d538b98ff --- /dev/null +++ b/test/integration/pullRebaseConflict/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,7 @@ +0000000000000000000000000000000000000000 0036ac0e5f5536f55bfdfcb4e09927f1eed3b37b CI 1648349220 +1100 commit (initial): myfile1 +0036ac0e5f5536f55bfdfcb4e09927f1eed3b37b 308a85a7f740d42925175560337196f952ac6cf6 CI 1648349220 +1100 commit: myfile2 +308a85a7f740d42925175560337196f952ac6cf6 ae0aa5a0d1c65005bd50012612b1c56c1ea06155 CI 1648349220 +1100 commit: myfile3 +ae0aa5a0d1c65005bd50012612b1c56c1ea06155 702648e6efd5f8c60f5fe57e152850a5de756978 CI 1648349220 +1100 commit: myfile4 +702648e6efd5f8c60f5fe57e152850a5de756978 308a85a7f740d42925175560337196f952ac6cf6 CI 1648349220 +1100 reset: moving to HEAD~2 +308a85a7f740d42925175560337196f952ac6cf6 d450cc8f4e691e3043aac25ae71f0f1a3217368f CI 1648349220 +1100 commit: myfile4 conflict +d450cc8f4e691e3043aac25ae71f0f1a3217368f bdd975a23140e915dd46a1a16575c71bcad754ca CI 1648349223 +1100 rebase finished: returning to refs/heads/master diff --git a/test/integration/pullRebaseConflict/expected/repo/.git_keep/logs/refs/remotes/origin/master b/test/integration/pullRebaseConflict/expected/repo/.git_keep/logs/refs/remotes/origin/master new file mode 100644 index 000000000..db9c9657f --- /dev/null +++ b/test/integration/pullRebaseConflict/expected/repo/.git_keep/logs/refs/remotes/origin/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 702648e6efd5f8c60f5fe57e152850a5de756978 CI 1648349220 +1100 fetch origin: storing head diff --git a/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/00/36ac0e5f5536f55bfdfcb4e09927f1eed3b37b b/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/00/36ac0e5f5536f55bfdfcb4e09927f1eed3b37b new file mode 100644 index 000000000..92dba726a --- /dev/null +++ b/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/00/36ac0e5f5536f55bfdfcb4e09927f1eed3b37b @@ -0,0 +1,2 @@ +xŤÍA +0@Ń®sŠŮĘLśŽJ)¸ň1™PÁ!ERĐŰ×#tűyđS5[ËĄmŞ€*©`”ą4dfĄ 9ŹTzžąËÂ%¦»wńŰŢuq‚Ç8˝tŹöYő–Ş=„CÇ÷W"DwÖsŇôOîě(ËŞä~1P,Ç \ No newline at end of file diff --git a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/pushAndSetUpstreamDefault/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/pushAndSetUpstream/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/pushAndSetUpstream/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/pushAndSetUpstream/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/pushAndSetUpstream/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/pullRebaseInteractive/expected_remote/objects/2f/6174050380438f14b16658a356e762435ca591 b/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 similarity index 100% rename from test/integration/pullRebaseInteractive/expected_remote/objects/2f/6174050380438f14b16658a356e762435ca591 rename to test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 diff --git a/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/30/8a85a7f740d42925175560337196f952ac6cf6 b/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/30/8a85a7f740d42925175560337196f952ac6cf6 new file mode 100644 index 000000000..cf8b94a34 Binary files /dev/null and b/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/30/8a85a7f740d42925175560337196f952ac6cf6 differ diff --git a/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 b/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 new file mode 100644 index 000000000..adf64119a Binary files /dev/null and b/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 differ diff --git a/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/70/2648e6efd5f8c60f5fe57e152850a5de756978 b/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/70/2648e6efd5f8c60f5fe57e152850a5de756978 new file mode 100644 index 000000000..04ef3447f Binary files /dev/null and b/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/70/2648e6efd5f8c60f5fe57e152850a5de756978 differ diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/objects/9b/1719f5cf069568785080a0bbabbe7c377e22ae b/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/9b/1719f5cf069568785080a0bbabbe7c377e22ae similarity index 100% rename from test/integration/pullRebaseConflict/expected/.git_keep/objects/9b/1719f5cf069568785080a0bbabbe7c377e22ae rename to test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/9b/1719f5cf069568785080a0bbabbe7c377e22ae diff --git a/test/integration/pushAndSetUpstreamDefault/expected_remote/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/pushAndSetUpstreamDefault/expected_remote/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/pushAndSetUpstream/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/pushAndSetUpstream/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/ae/0aa5a0d1c65005bd50012612b1c56c1ea06155 b/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/ae/0aa5a0d1c65005bd50012612b1c56c1ea06155 new file mode 100644 index 000000000..8ebe82e5a Binary files /dev/null and b/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/ae/0aa5a0d1c65005bd50012612b1c56c1ea06155 differ diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/objects/ae/d6c0a012c68a8b615ab0185b64f59c414d4746 b/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/ae/d6c0a012c68a8b615ab0185b64f59c414d4746 similarity index 100% rename from test/integration/pullRebaseConflict/expected/.git_keep/objects/ae/d6c0a012c68a8b615ab0185b64f59c414d4746 rename to test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/ae/d6c0a012c68a8b615ab0185b64f59c414d4746 diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/objects/b2/da3d615a1805f094849247add77d09aee06451 b/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/b2/da3d615a1805f094849247add77d09aee06451 similarity index 100% rename from test/integration/pullRebaseConflict/expected/.git_keep/objects/b2/da3d615a1805f094849247add77d09aee06451 rename to test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/b2/da3d615a1805f094849247add77d09aee06451 diff --git a/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/bd/d975a23140e915dd46a1a16575c71bcad754ca b/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/bd/d975a23140e915dd46a1a16575c71bcad754ca new file mode 100644 index 000000000..32a1c9b2a --- /dev/null +++ b/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/bd/d975a23140e915dd46a1a16575c71bcad754ca @@ -0,0 +1,3 @@ +x…ŽË +Â0E]ç+˛dň<@D誟1&,4M)ôďͽŰĂáÜ›Z­K—Ě©Ěňˇ3™ě’ +€˘ 6jë)gď3DbgQ‰ťŢşô ť ě¸d,!9(X=+Ô0łG}ôęĎvČi–×iľó›ęľň%µz“jĚXŃ ĎJAÇ©ÎtóÓEý”ee+SŰĘş¤.ľ‘= \ No newline at end of file diff --git a/test/integration/pushAndSetUpstream/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/pushAndSetUpstream/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/d4/50cc8f4e691e3043aac25ae71f0f1a3217368f b/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/d4/50cc8f4e691e3043aac25ae71f0f1a3217368f new file mode 100644 index 000000000..2850a992e --- /dev/null +++ b/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/d4/50cc8f4e691e3043aac25ae71f0f1a3217368f @@ -0,0 +1,2 @@ +xŤÎA +0@Ń®sŠě e&™L ”Rpĺ1Ć1ˇ‚Q‘ÚŰ×#tűy‹Ż[­słüĄ9[É+ S€]™JHJHEbłË‘×f=ś*H,‘`"—\Ŕ÷—ś(ka#ďöÚŰöŢĎü‘ş/ů¦[}Xdę<%çŔ^ĚYĎ©–˙ä¦~ËĽd˛ş­e™µ™=W<[ \ No newline at end of file diff --git a/test/integration/pushAndSetUpstream/expected_remote/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/pushAndSetUpstream/expected_remote/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/objects/e6/1e2c991de853082420fd27fd983098afd4c0c8 b/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/e6/1e2c991de853082420fd27fd983098afd4c0c8 similarity index 100% rename from test/integration/pullRebaseConflict/expected/.git_keep/objects/e6/1e2c991de853082420fd27fd983098afd4c0c8 rename to test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/e6/1e2c991de853082420fd27fd983098afd4c0c8 diff --git a/test/integration/pullRebaseConflict/expected/.git_keep/objects/e6/9912eb1649ce8dbb33678796cec3e89da3675d b/test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/e6/9912eb1649ce8dbb33678796cec3e89da3675d similarity index 100% rename from test/integration/pullRebaseConflict/expected/.git_keep/objects/e6/9912eb1649ce8dbb33678796cec3e89da3675d rename to test/integration/pullRebaseConflict/expected/repo/.git_keep/objects/e6/9912eb1649ce8dbb33678796cec3e89da3675d diff --git a/test/integration/pullRebaseConflict/expected/repo/.git_keep/refs/heads/master b/test/integration/pullRebaseConflict/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..19ea48024 --- /dev/null +++ b/test/integration/pullRebaseConflict/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +bdd975a23140e915dd46a1a16575c71bcad754ca diff --git a/test/integration/pullRebaseConflict/expected/repo/.git_keep/refs/remotes/origin/master b/test/integration/pullRebaseConflict/expected/repo/.git_keep/refs/remotes/origin/master new file mode 100644 index 000000000..af3d6e11d --- /dev/null +++ b/test/integration/pullRebaseConflict/expected/repo/.git_keep/refs/remotes/origin/master @@ -0,0 +1 @@ +702648e6efd5f8c60f5fe57e152850a5de756978 diff --git a/test/integration/pushNoFollowTags/expected/myfile1 b/test/integration/pullRebaseConflict/expected/repo/myfile1 similarity index 100% rename from test/integration/pushNoFollowTags/expected/myfile1 rename to test/integration/pullRebaseConflict/expected/repo/myfile1 diff --git a/test/integration/pushAndSetUpstream/expected/myfile2 b/test/integration/pullRebaseConflict/expected/repo/myfile2 similarity index 100% rename from test/integration/pushAndSetUpstream/expected/myfile2 rename to test/integration/pullRebaseConflict/expected/repo/myfile2 diff --git a/test/integration/push/expected/myfile3 b/test/integration/pullRebaseConflict/expected/repo/myfile3 similarity index 100% rename from test/integration/push/expected/myfile3 rename to test/integration/pullRebaseConflict/expected/repo/myfile3 diff --git a/test/integration/pullRebaseConflict/expected/myfile4 b/test/integration/pullRebaseConflict/expected/repo/myfile4 similarity index 100% rename from test/integration/pullRebaseConflict/expected/myfile4 rename to test/integration/pullRebaseConflict/expected/repo/myfile4 diff --git a/test/integration/pullRebaseConflict/expected_remote/config b/test/integration/pullRebaseConflict/expected_remote/config deleted file mode 100644 index e2f03fd10..000000000 --- a/test/integration/pullRebaseConflict/expected_remote/config +++ /dev/null @@ -1,8 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = true - ignorecase = true - precomposeunicode = true -[remote "origin"] - url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/pullRebaseConflict/./actual diff --git a/test/integration/pullRebaseConflict/expected_remote/objects/10/3c3eb899d173b83fc1b40261c8880fef359cc3 b/test/integration/pullRebaseConflict/expected_remote/objects/10/3c3eb899d173b83fc1b40261c8880fef359cc3 deleted file mode 100644 index 54f9946f5..000000000 Binary files a/test/integration/pullRebaseConflict/expected_remote/objects/10/3c3eb899d173b83fc1b40261c8880fef359cc3 and /dev/null differ diff --git a/test/integration/pullRebaseConflict/expected_remote/objects/34/574474ac6f7dd2d3142bc28ee39db88d8a16af b/test/integration/pullRebaseConflict/expected_remote/objects/34/574474ac6f7dd2d3142bc28ee39db88d8a16af deleted file mode 100644 index 229191e1c..000000000 --- a/test/integration/pullRebaseConflict/expected_remote/objects/34/574474ac6f7dd2d3142bc28ee39db88d8a16af +++ /dev/null @@ -1,2 +0,0 @@ -xŤÍA -Ă @Ń®=Ĺě ĹŃéDˇ”BV9†Ń‘2X‚…äöÍşý<řą©.řŇ7°ÂąÚÄó%"ÁŔ% KXšÉ¦šňÝ™ôíď¶Á8Ácś^˛'ý¬rËMź€ě)DŽÎĂŃZsÖsŇĺOnô¨Ë*h~5B,ß \ No newline at end of file diff --git a/test/integration/pullRebaseConflict/expected_remote/objects/3b/9389ff50095ad2d66d33bb6d67b5700f0bf6da b/test/integration/pullRebaseConflict/expected_remote/objects/3b/9389ff50095ad2d66d33bb6d67b5700f0bf6da deleted file mode 100644 index fd885765d..000000000 Binary files a/test/integration/pullRebaseConflict/expected_remote/objects/3b/9389ff50095ad2d66d33bb6d67b5700f0bf6da and /dev/null differ diff --git a/test/integration/pullRebaseConflict/expected_remote/objects/aa/6ae0785290ee09875f6bd5a5d50c0e7002de13 b/test/integration/pullRebaseConflict/expected_remote/objects/aa/6ae0785290ee09875f6bd5a5d50c0e7002de13 deleted file mode 100644 index 94a6241c8..000000000 Binary files a/test/integration/pullRebaseConflict/expected_remote/objects/aa/6ae0785290ee09875f6bd5a5d50c0e7002de13 and /dev/null differ diff --git a/test/integration/pullRebaseConflict/expected_remote/packed-refs b/test/integration/pullRebaseConflict/expected_remote/packed-refs deleted file mode 100644 index 5fc546218..000000000 --- a/test/integration/pullRebaseConflict/expected_remote/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# pack-refs with: peeled fully-peeled sorted -103c3eb899d173b83fc1b40261c8880fef359cc3 refs/heads/master diff --git a/test/integration/pullRebaseConflict/setup.sh b/test/integration/pullRebaseConflict/setup.sh index e02be3c0c..7360923fe 100644 --- a/test/integration/pullRebaseConflict/setup.sh +++ b/test/integration/pullRebaseConflict/setup.sh @@ -25,9 +25,9 @@ git add . git commit -am "myfile4" cd .. -git clone --bare ./actual actual_remote +git clone --bare ./repo origin -cd actual +cd repo git reset --hard HEAD~2 @@ -35,7 +35,7 @@ echo conflict > myfile4 git add . git commit -am "myfile4 conflict" -git remote add origin ../actual_remote +git remote add origin ../origin git fetch origin git branch --set-upstream-to=origin/master master diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/COMMIT_EDITMSG b/test/integration/pullRebaseInteractive/expected/.git_keep/COMMIT_EDITMSG deleted file mode 100644 index 12f245db0..000000000 --- a/test/integration/pullRebaseInteractive/expected/.git_keep/COMMIT_EDITMSG +++ /dev/null @@ -1,16 +0,0 @@ -myfile4 conflict - -# Please enter the commit message for your changes. Lines starting -# with '#' will be ignored, and an empty message aborts the commit. -# -# interactive rebase in progress; onto ea4a99e -# Last command done (1 command done): -# pick efbb36c myfile4 conflict -# Next commands to do (3 remaining commands): -# pick 9147ce4 5 -# pick e2251a5 6 -# You are currently rebasing branch 'master' on 'ea4a99e'. -# -# Changes to be committed: -# modified: myfile4 -# diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/FETCH_HEAD b/test/integration/pullRebaseInteractive/expected/.git_keep/FETCH_HEAD deleted file mode 100644 index 5d2dc1af4..000000000 --- a/test/integration/pullRebaseInteractive/expected/.git_keep/FETCH_HEAD +++ /dev/null @@ -1 +0,0 @@ -ea4a99ea801f54f1ec09a88a28c65eb4db5865aa branch 'master' of ../actual_remote diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/ORIG_HEAD b/test/integration/pullRebaseInteractive/expected/.git_keep/ORIG_HEAD deleted file mode 100644 index a03bb270d..000000000 --- a/test/integration/pullRebaseInteractive/expected/.git_keep/ORIG_HEAD +++ /dev/null @@ -1 +0,0 @@ -efbb36c97316886b089b1b27233cd8bfdc37ed4a diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/config b/test/integration/pullRebaseInteractive/expected/.git_keep/config deleted file mode 100644 index cfff6ba8c..000000000 --- a/test/integration/pullRebaseInteractive/expected/.git_keep/config +++ /dev/null @@ -1,18 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true - precomposeunicode = true -[user] - email = CI@example.com - name = CI -[remote "origin"] - url = ../actual_remote - fetch = +refs/heads/*:refs/remotes/origin/* -[branch "master"] - remote = origin - merge = refs/heads/master -[pull] - rebase = interactive diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/index b/test/integration/pullRebaseInteractive/expected/.git_keep/index deleted file mode 100644 index 906076536..000000000 Binary files a/test/integration/pullRebaseInteractive/expected/.git_keep/index and /dev/null differ diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/logs/HEAD b/test/integration/pullRebaseInteractive/expected/.git_keep/logs/HEAD deleted file mode 100644 index ea2e57777..000000000 --- a/test/integration/pullRebaseInteractive/expected/.git_keep/logs/HEAD +++ /dev/null @@ -1,15 +0,0 @@ -0000000000000000000000000000000000000000 74ca3dec707dde7c92727d9490517e498360fea8 CI 1634896929 +1100 commit (initial): myfile1 -74ca3dec707dde7c92727d9490517e498360fea8 ca58e8d47d619ffb625dc021f0ab2bb0f0bcf623 CI 1634896929 +1100 commit: myfile2 -ca58e8d47d619ffb625dc021f0ab2bb0f0bcf623 3fb33027aedae13ab0796292c821a0258f6c2f7b CI 1634896929 +1100 commit: myfile3 -3fb33027aedae13ab0796292c821a0258f6c2f7b ea4a99ea801f54f1ec09a88a28c65eb4db5865aa CI 1634896929 +1100 commit: myfile4 -ea4a99ea801f54f1ec09a88a28c65eb4db5865aa ca58e8d47d619ffb625dc021f0ab2bb0f0bcf623 CI 1634896929 +1100 reset: moving to head^^ -ca58e8d47d619ffb625dc021f0ab2bb0f0bcf623 efbb36c97316886b089b1b27233cd8bfdc37ed4a CI 1634896929 +1100 commit: myfile4 conflict -efbb36c97316886b089b1b27233cd8bfdc37ed4a 9147ce4817b84339d884cee1683f361fd3aa4696 CI 1634896929 +1100 commit: 5 -9147ce4817b84339d884cee1683f361fd3aa4696 e2251a5b6d32bf5fc57f234946e3fabeba3b5cca CI 1634896929 +1100 commit: 6 -e2251a5b6d32bf5fc57f234946e3fabeba3b5cca 89ee54b2ed7aff7c3aae24f64be85568f9a9d329 CI 1634896929 +1100 commit: 7 -89ee54b2ed7aff7c3aae24f64be85568f9a9d329 ea4a99ea801f54f1ec09a88a28c65eb4db5865aa CI 1634896931 +1100 rebase -i (start): checkout ea4a99ea801f54f1ec09a88a28c65eb4db5865aa -ea4a99ea801f54f1ec09a88a28c65eb4db5865aa 29daf999882c9e60c6b6a2868913a6cfd856d620 CI 1634896933 +1100 rebase -i (continue): myfile4 conflict -29daf999882c9e60c6b6a2868913a6cfd856d620 5c32741b468f0ab8ddd243e9871dcc8dec5c35f9 CI 1634896933 +1100 rebase -i (pick): 5 -5c32741b468f0ab8ddd243e9871dcc8dec5c35f9 423f7757eb2eea3de217b54447a94820af933d3a CI 1634896933 +1100 rebase -i (pick): 6 -423f7757eb2eea3de217b54447a94820af933d3a bf4fb489636d4bde42e478b04cbdcc079dcd0183 CI 1634896933 +1100 rebase -i (pick): 7 -bf4fb489636d4bde42e478b04cbdcc079dcd0183 bf4fb489636d4bde42e478b04cbdcc079dcd0183 CI 1634896933 +1100 rebase -i (finish): returning to refs/heads/master diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/logs/refs/heads/master b/test/integration/pullRebaseInteractive/expected/.git_keep/logs/refs/heads/master deleted file mode 100644 index 6ebd29d80..000000000 --- a/test/integration/pullRebaseInteractive/expected/.git_keep/logs/refs/heads/master +++ /dev/null @@ -1,10 +0,0 @@ -0000000000000000000000000000000000000000 74ca3dec707dde7c92727d9490517e498360fea8 CI 1634896929 +1100 commit (initial): myfile1 -74ca3dec707dde7c92727d9490517e498360fea8 ca58e8d47d619ffb625dc021f0ab2bb0f0bcf623 CI 1634896929 +1100 commit: myfile2 -ca58e8d47d619ffb625dc021f0ab2bb0f0bcf623 3fb33027aedae13ab0796292c821a0258f6c2f7b CI 1634896929 +1100 commit: myfile3 -3fb33027aedae13ab0796292c821a0258f6c2f7b ea4a99ea801f54f1ec09a88a28c65eb4db5865aa CI 1634896929 +1100 commit: myfile4 -ea4a99ea801f54f1ec09a88a28c65eb4db5865aa ca58e8d47d619ffb625dc021f0ab2bb0f0bcf623 CI 1634896929 +1100 reset: moving to head^^ -ca58e8d47d619ffb625dc021f0ab2bb0f0bcf623 efbb36c97316886b089b1b27233cd8bfdc37ed4a CI 1634896929 +1100 commit: myfile4 conflict -efbb36c97316886b089b1b27233cd8bfdc37ed4a 9147ce4817b84339d884cee1683f361fd3aa4696 CI 1634896929 +1100 commit: 5 -9147ce4817b84339d884cee1683f361fd3aa4696 e2251a5b6d32bf5fc57f234946e3fabeba3b5cca CI 1634896929 +1100 commit: 6 -e2251a5b6d32bf5fc57f234946e3fabeba3b5cca 89ee54b2ed7aff7c3aae24f64be85568f9a9d329 CI 1634896929 +1100 commit: 7 -89ee54b2ed7aff7c3aae24f64be85568f9a9d329 bf4fb489636d4bde42e478b04cbdcc079dcd0183 CI 1634896933 +1100 rebase -i (finish): refs/heads/master onto ea4a99ea801f54f1ec09a88a28c65eb4db5865aa diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/logs/refs/remotes/origin/master b/test/integration/pullRebaseInteractive/expected/.git_keep/logs/refs/remotes/origin/master deleted file mode 100644 index 4a22e7de9..000000000 --- a/test/integration/pullRebaseInteractive/expected/.git_keep/logs/refs/remotes/origin/master +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 ea4a99ea801f54f1ec09a88a28c65eb4db5865aa CI 1634896929 +1100 fetch origin: storing head diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/29/daf999882c9e60c6b6a2868913a6cfd856d620 b/test/integration/pullRebaseInteractive/expected/.git_keep/objects/29/daf999882c9e60c6b6a2868913a6cfd856d620 deleted file mode 100644 index 59ed7fe6b..000000000 Binary files a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/29/daf999882c9e60c6b6a2868913a6cfd856d620 and /dev/null differ diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/3f/b33027aedae13ab0796292c821a0258f6c2f7b b/test/integration/pullRebaseInteractive/expected/.git_keep/objects/3f/b33027aedae13ab0796292c821a0258f6c2f7b deleted file mode 100644 index 72f6e886b..000000000 Binary files a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/3f/b33027aedae13ab0796292c821a0258f6c2f7b and /dev/null differ diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/42/3f7757eb2eea3de217b54447a94820af933d3a b/test/integration/pullRebaseInteractive/expected/.git_keep/objects/42/3f7757eb2eea3de217b54447a94820af933d3a deleted file mode 100644 index a0d83ec6c..000000000 --- a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/42/3f7757eb2eea3de217b54447a94820af933d3a +++ /dev/null @@ -1,5 +0,0 @@ -x}ÎA -1 …a×=E÷‚4MŰI@DŐŁ6) -Ö† -ß.\»}|đţ˛¶öč}Wµ>x •âä2áJ…A*8!:ĚĘl¶Ľë«ŰXĐOn!QuůF"â*ÓR -‰–!be“ßýľîv^ěy^®úÉm{ꩬíb!a NěŮaܱލ®˙9⏛dľ-Ą7• \ No newline at end of file diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/5c/32741b468f0ab8ddd243e9871dcc8dec5c35f9 b/test/integration/pullRebaseInteractive/expected/.git_keep/objects/5c/32741b468f0ab8ddd243e9871dcc8dec5c35f9 deleted file mode 100644 index 3bc24fb42..000000000 Binary files a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/5c/32741b468f0ab8ddd243e9871dcc8dec5c35f9 and /dev/null differ diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/74/ca3dec707dde7c92727d9490517e498360fea8 b/test/integration/pullRebaseInteractive/expected/.git_keep/objects/74/ca3dec707dde7c92727d9490517e498360fea8 deleted file mode 100644 index 2f5e7e39f..000000000 --- a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/74/ca3dec707dde7c92727d9490517e498360fea8 +++ /dev/null @@ -1,2 +0,0 @@ -xŤÍA -Â0@Q×9Ĺěɤă4ˇ«cšL°Đ!R"čííÜ~üÜĚÖH|ę»*xĺ\˝đ2&Ť…H1r‰ëH …©Jľ'ďţl;L3ܦůˇ±×¦—ÜěČĹÄ)$8#zďŽzLşţÉť}ëş)ş7(,ë \ No newline at end of file diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/89/ee54b2ed7aff7c3aae24f64be85568f9a9d329 b/test/integration/pullRebaseInteractive/expected/.git_keep/objects/89/ee54b2ed7aff7c3aae24f64be85568f9a9d329 deleted file mode 100644 index 155cfe5f6..000000000 Binary files a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/89/ee54b2ed7aff7c3aae24f64be85568f9a9d329 and /dev/null differ diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/91/47ce4817b84339d884cee1683f361fd3aa4696 b/test/integration/pullRebaseInteractive/expected/.git_keep/objects/91/47ce4817b84339d884cee1683f361fd3aa4696 deleted file mode 100644 index 04880639a..000000000 Binary files a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/91/47ce4817b84339d884cee1683f361fd3aa4696 and /dev/null differ diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/b8/9e837219d9a8aceb8b0f13381be0afb0dac427 b/test/integration/pullRebaseInteractive/expected/.git_keep/objects/b8/9e837219d9a8aceb8b0f13381be0afb0dac427 deleted file mode 100644 index 3d41eceda..000000000 Binary files a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/b8/9e837219d9a8aceb8b0f13381be0afb0dac427 and /dev/null differ diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/bf/4fb489636d4bde42e478b04cbdcc079dcd0183 b/test/integration/pullRebaseInteractive/expected/.git_keep/objects/bf/4fb489636d4bde42e478b04cbdcc079dcd0183 deleted file mode 100644 index 11a65f3f4..000000000 Binary files a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/bf/4fb489636d4bde42e478b04cbdcc079dcd0183 and /dev/null differ diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/ca/58e8d47d619ffb625dc021f0ab2bb0f0bcf623 b/test/integration/pullRebaseInteractive/expected/.git_keep/objects/ca/58e8d47d619ffb625dc021f0ab2bb0f0bcf623 deleted file mode 100644 index 1cf77f0bb..000000000 Binary files a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/ca/58e8d47d619ffb625dc021f0ab2bb0f0bcf623 and /dev/null differ diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/e2/251a5b6d32bf5fc57f234946e3fabeba3b5cca b/test/integration/pullRebaseInteractive/expected/.git_keep/objects/e2/251a5b6d32bf5fc57f234946e3fabeba3b5cca deleted file mode 100644 index f4473469b..000000000 Binary files a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/e2/251a5b6d32bf5fc57f234946e3fabeba3b5cca and /dev/null differ diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/ea/4a99ea801f54f1ec09a88a28c65eb4db5865aa b/test/integration/pullRebaseInteractive/expected/.git_keep/objects/ea/4a99ea801f54f1ec09a88a28c65eb4db5865aa deleted file mode 100644 index a9ed03844..000000000 --- a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/ea/4a99ea801f54f1ec09a88a28c65eb4db5865aa +++ /dev/null @@ -1,2 +0,0 @@ -xŤÎA -Â0@Q×9Eö‚df’I"BW=Ć4N°ĐŘR"čííÜ~Ţâ—µµą[ČţÔwU‹•!z%ç)Uđ0‡$X#٧P$d0›ěúę–ęDä0Š>Ddr13f, A†Tą`Ť“‘w®»F{Ć»~¤m‹^ĘÚn|Ęś1Ű3€sć¨ÇT×?ąiß:/ęÍÓg8Ő \ No newline at end of file diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/ef/bb36c97316886b089b1b27233cd8bfdc37ed4a b/test/integration/pullRebaseInteractive/expected/.git_keep/objects/ef/bb36c97316886b089b1b27233cd8bfdc37ed4a deleted file mode 100644 index 2f6153345..000000000 --- a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/ef/bb36c97316886b089b1b27233cd8bfdc37ed4a +++ /dev/null @@ -1,2 +0,0 @@ -xŤÎA -Â0@Q×9Eö‚̤ɀĐUŹ1™N°ĐR"čííÜ>ţâK«uéÖÁp껪eťI€ťPä gŔ2ů’xôłżz2ďúęV8DŤÍ„©”L.Ě pv9C,…Ü`řÝźm·ădoăôĐ×mŐ‹´z·Hʉ’KöŚ`=¦şţ™›ú-ËŞŢJ{•u‘n~/ć>@ \ No newline at end of file diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/refs/heads/master b/test/integration/pullRebaseInteractive/expected/.git_keep/refs/heads/master deleted file mode 100644 index bc528dc20..000000000 --- a/test/integration/pullRebaseInteractive/expected/.git_keep/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -bf4fb489636d4bde42e478b04cbdcc079dcd0183 diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/refs/remotes/origin/master b/test/integration/pullRebaseInteractive/expected/.git_keep/refs/remotes/origin/master deleted file mode 100644 index 0597374d4..000000000 --- a/test/integration/pullRebaseInteractive/expected/.git_keep/refs/remotes/origin/master +++ /dev/null @@ -1 +0,0 @@ -ea4a99ea801f54f1ec09a88a28c65eb4db5865aa diff --git a/test/integration/pushWithCredentials/expected/.git_keep/HEAD b/test/integration/pullRebaseInteractive/expected/origin/HEAD similarity index 100% rename from test/integration/pushWithCredentials/expected/.git_keep/HEAD rename to test/integration/pullRebaseInteractive/expected/origin/HEAD diff --git a/test/integration/pullRebaseInteractive/expected/origin/config b/test/integration/pullRebaseInteractive/expected/origin/config new file mode 100644 index 000000000..c10372133 --- /dev/null +++ b/test/integration/pullRebaseInteractive/expected/origin/config @@ -0,0 +1,8 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/pullRebaseInteractive/actual/./repo diff --git a/test/integration/pushNoFollowTags/expected_remote/description b/test/integration/pullRebaseInteractive/expected/origin/description similarity index 100% rename from test/integration/pushNoFollowTags/expected_remote/description rename to test/integration/pullRebaseInteractive/expected/origin/description diff --git a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/info/exclude b/test/integration/pullRebaseInteractive/expected/origin/info/exclude similarity index 100% rename from test/integration/pushAndSetUpstreamDefault/expected/.git_keep/info/exclude rename to test/integration/pullRebaseInteractive/expected/origin/info/exclude diff --git a/test/integration/pushAndSetUpstreamDefault/expected_remote/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/pullRebaseInteractive/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/pushAndSetUpstreamDefault/expected_remote/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/pullRebaseInteractive/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/pullRebaseInteractive/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/pushAndSetUpstreamDefault/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/pullRebaseInteractive/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/pushAndSetUpstream/expected_remote/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/pullRebaseInteractive/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/pushAndSetUpstream/expected_remote/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/pullRebaseInteractive/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 b/test/integration/pullRebaseInteractive/expected/origin/objects/2f/6174050380438f14b16658a356e762435ca591 similarity index 100% rename from test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 rename to test/integration/pullRebaseInteractive/expected/origin/objects/2f/6174050380438f14b16658a356e762435ca591 diff --git a/test/integration/pullRebaseInteractive/expected/origin/objects/52/137603da2dccb618dfa0953d1b7df8c0255959 b/test/integration/pullRebaseInteractive/expected/origin/objects/52/137603da2dccb618dfa0953d1b7df8c0255959 new file mode 100644 index 000000000..41731f660 Binary files /dev/null and b/test/integration/pullRebaseInteractive/expected/origin/objects/52/137603da2dccb618dfa0953d1b7df8c0255959 differ diff --git a/test/integration/pullRebaseInteractive/expected/origin/objects/7c/0506ec2cd7852818e3e597619ff64af83770c6 b/test/integration/pullRebaseInteractive/expected/origin/objects/7c/0506ec2cd7852818e3e597619ff64af83770c6 new file mode 100644 index 000000000..bf8c283f0 --- /dev/null +++ b/test/integration/pullRebaseInteractive/expected/origin/objects/7c/0506ec2cd7852818e3e597619ff64af83770c6 @@ -0,0 +1,3 @@ +xŤÍA +0@Ń®sŠŮJ&Žc„R +®<ĆL¨ŕ‘ÚŰ×#tűyđS5[ ńĄŞŕ•SńÂË0jĚDŠ‘sÄ XZ¨ËLERśĽŰ«0Ípźć§~ÄöMo©Ú)v4ęáŠč˝;ë9iú'wö-ë¦č~3‹,Ő \ No newline at end of file diff --git a/test/integration/pullRebaseInteractive/expected/origin/objects/91/d2303b08e6765e0ec38c401ecbab0cbb126dca b/test/integration/pullRebaseInteractive/expected/origin/objects/91/d2303b08e6765e0ec38c401ecbab0cbb126dca new file mode 100644 index 000000000..d3ebd3660 Binary files /dev/null and b/test/integration/pullRebaseInteractive/expected/origin/objects/91/d2303b08e6765e0ec38c401ecbab0cbb126dca differ diff --git a/test/integration/pushFollowTags/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/pullRebaseInteractive/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/pushFollowTags/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/pullRebaseInteractive/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/pushAndSetUpstream/expected_remote/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/pullRebaseInteractive/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/pushAndSetUpstream/expected_remote/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/pullRebaseInteractive/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/pushAndSetUpstream/expected_remote/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/pullRebaseInteractive/expected/origin/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/pushAndSetUpstream/expected_remote/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/pullRebaseInteractive/expected/origin/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/pullRebaseInteractive/expected/origin/objects/d4/3a810e4d47f2c632ea62ae581a8aade6f23b21 b/test/integration/pullRebaseInteractive/expected/origin/objects/d4/3a810e4d47f2c632ea62ae581a8aade6f23b21 new file mode 100644 index 000000000..8d51321bd --- /dev/null +++ b/test/integration/pullRebaseInteractive/expected/origin/objects/d4/3a810e4d47f2c632ea62ae581a8aade6f23b21 @@ -0,0 +1,3 @@ +xŤÎA +Â0@Q×9Eö‚Ěd&ÓD„®zŚd:Ĺ‚±ĄDĐŰŰ#¸ýĽĹ×µÖĄyěůÔv3fÁŽ!%`J3rA‘2E±NSÔ{t[ŢíŐ|ŹS  ɤ“h`JIĐ´äZ +™4»ünŹu÷ĂčŻĂx·O®ŰÓ.şÖ›GáDÜŽţŚŕŽzL5ű“»úť—§±űüJ9? \ No newline at end of file diff --git a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/pullRebaseInteractive/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/pushAndSetUpstreamDefault/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/pullRebaseInteractive/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/pullRebaseInteractive/expected/origin/packed-refs b/test/integration/pullRebaseInteractive/expected/origin/packed-refs new file mode 100644 index 000000000..6060b6bc3 --- /dev/null +++ b/test/integration/pullRebaseInteractive/expected/origin/packed-refs @@ -0,0 +1,2 @@ +# pack-refs with: peeled fully-peeled sorted +d43a810e4d47f2c632ea62ae581a8aade6f23b21 refs/heads/master diff --git a/test/integration/pullRebaseInteractive/expected/repo/.git_keep/COMMIT_EDITMSG b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/COMMIT_EDITMSG new file mode 100644 index 000000000..f09f5548b --- /dev/null +++ b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/COMMIT_EDITMSG @@ -0,0 +1,16 @@ +myfile4 conflict + +# Please enter the commit message for your changes. Lines starting +# with '#' will be ignored, and an empty message aborts the commit. +# +# interactive rebase in progress; onto d43a810 +# Last command done (1 command done): +# pick e974f4a myfile4 conflict +# Next commands to do (3 remaining commands): +# pick d217625 5 +# pick 09f87d1 6 +# You are currently rebasing branch 'master' on 'd43a810'. +# +# Changes to be committed: +# modified: myfile4 +# diff --git a/test/integration/pullRebaseInteractive/expected/repo/.git_keep/FETCH_HEAD b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/FETCH_HEAD new file mode 100644 index 000000000..5b1cee8fc --- /dev/null +++ b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/FETCH_HEAD @@ -0,0 +1 @@ +d43a810e4d47f2c632ea62ae581a8aade6f23b21 branch 'master' of ../origin diff --git a/test/integration/pushWithCredentials/expected_remote/HEAD b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/pushWithCredentials/expected_remote/HEAD rename to test/integration/pullRebaseInteractive/expected/repo/.git_keep/HEAD diff --git a/test/integration/pullRebaseInteractive/expected/repo/.git_keep/ORIG_HEAD b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/ORIG_HEAD new file mode 100644 index 000000000..3bcbef789 --- /dev/null +++ b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/ORIG_HEAD @@ -0,0 +1 @@ +e974f4acf07db6fcaa438df552a8fd44e2d58dcd diff --git a/test/integration/pullRebaseInteractive/expected/repo/.git_keep/config b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/config new file mode 100644 index 000000000..6dc2c0ed8 --- /dev/null +++ b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/config @@ -0,0 +1,18 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[user] + email = CI@example.com + name = CI +[remote "origin"] + url = ../origin + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "master"] + remote = origin + merge = refs/heads/master +[pull] + rebase = interactive diff --git a/test/integration/pushTag/expected/.git_keep/description b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/description similarity index 100% rename from test/integration/pushTag/expected/.git_keep/description rename to test/integration/pullRebaseInteractive/expected/repo/.git_keep/description diff --git a/test/integration/pullRebaseInteractive/expected/repo/.git_keep/index b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/index new file mode 100644 index 000000000..531e6a734 Binary files /dev/null and b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/index differ diff --git a/test/integration/pushAndSetUpstreamDefault/expected_remote/info/exclude b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/pushAndSetUpstreamDefault/expected_remote/info/exclude rename to test/integration/pullRebaseInteractive/expected/repo/.git_keep/info/exclude diff --git a/test/integration/pullRebaseInteractive/expected/repo/.git_keep/logs/HEAD b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..610710e3e --- /dev/null +++ b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,15 @@ +0000000000000000000000000000000000000000 7c0506ec2cd7852818e3e597619ff64af83770c6 CI 1648349245 +1100 commit (initial): myfile1 +7c0506ec2cd7852818e3e597619ff64af83770c6 52137603da2dccb618dfa0953d1b7df8c0255959 CI 1648349245 +1100 commit: myfile2 +52137603da2dccb618dfa0953d1b7df8c0255959 91d2303b08e6765e0ec38c401ecbab0cbb126dca CI 1648349245 +1100 commit: myfile3 +91d2303b08e6765e0ec38c401ecbab0cbb126dca d43a810e4d47f2c632ea62ae581a8aade6f23b21 CI 1648349245 +1100 commit: myfile4 +d43a810e4d47f2c632ea62ae581a8aade6f23b21 52137603da2dccb618dfa0953d1b7df8c0255959 CI 1648349245 +1100 reset: moving to HEAD~2 +52137603da2dccb618dfa0953d1b7df8c0255959 e974f4acf07db6fcaa438df552a8fd44e2d58dcd CI 1648349245 +1100 commit: myfile4 conflict +e974f4acf07db6fcaa438df552a8fd44e2d58dcd d217625c37713436bb6c92ff9d0b3991a8a7dba5 CI 1648349245 +1100 commit: 5 +d217625c37713436bb6c92ff9d0b3991a8a7dba5 09f87d11c514ba0a54e43193aaf9067174e2315e CI 1648349245 +1100 commit: 6 +09f87d11c514ba0a54e43193aaf9067174e2315e 2e0409bb60df3c4587245fd01fdeb270bb5a24f3 CI 1648349245 +1100 commit: 7 +2e0409bb60df3c4587245fd01fdeb270bb5a24f3 d43a810e4d47f2c632ea62ae581a8aade6f23b21 CI 1648349247 +1100 rebase -i (start): checkout d43a810e4d47f2c632ea62ae581a8aade6f23b21 +d43a810e4d47f2c632ea62ae581a8aade6f23b21 66d3639353f039f2b87ea3e0dd3db13a5415c6df CI 1648349249 +1100 rebase -i (continue): myfile4 conflict +66d3639353f039f2b87ea3e0dd3db13a5415c6df 5c4dd6c94fae2afe48f413f48dc998ae48fcf463 CI 1648349249 +1100 rebase -i (pick): 5 +5c4dd6c94fae2afe48f413f48dc998ae48fcf463 ff0d57cafe9d745264b23450e9268cdb5ddc4edc CI 1648349249 +1100 rebase -i (pick): 6 +ff0d57cafe9d745264b23450e9268cdb5ddc4edc 416178fd7462af72f4357dda1241fc66063e467b CI 1648349249 +1100 rebase -i (pick): 7 +416178fd7462af72f4357dda1241fc66063e467b 416178fd7462af72f4357dda1241fc66063e467b CI 1648349249 +1100 rebase -i (finish): returning to refs/heads/master diff --git a/test/integration/pullRebaseInteractive/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..8f16c1e9c --- /dev/null +++ b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,10 @@ +0000000000000000000000000000000000000000 7c0506ec2cd7852818e3e597619ff64af83770c6 CI 1648349245 +1100 commit (initial): myfile1 +7c0506ec2cd7852818e3e597619ff64af83770c6 52137603da2dccb618dfa0953d1b7df8c0255959 CI 1648349245 +1100 commit: myfile2 +52137603da2dccb618dfa0953d1b7df8c0255959 91d2303b08e6765e0ec38c401ecbab0cbb126dca CI 1648349245 +1100 commit: myfile3 +91d2303b08e6765e0ec38c401ecbab0cbb126dca d43a810e4d47f2c632ea62ae581a8aade6f23b21 CI 1648349245 +1100 commit: myfile4 +d43a810e4d47f2c632ea62ae581a8aade6f23b21 52137603da2dccb618dfa0953d1b7df8c0255959 CI 1648349245 +1100 reset: moving to HEAD~2 +52137603da2dccb618dfa0953d1b7df8c0255959 e974f4acf07db6fcaa438df552a8fd44e2d58dcd CI 1648349245 +1100 commit: myfile4 conflict +e974f4acf07db6fcaa438df552a8fd44e2d58dcd d217625c37713436bb6c92ff9d0b3991a8a7dba5 CI 1648349245 +1100 commit: 5 +d217625c37713436bb6c92ff9d0b3991a8a7dba5 09f87d11c514ba0a54e43193aaf9067174e2315e CI 1648349245 +1100 commit: 6 +09f87d11c514ba0a54e43193aaf9067174e2315e 2e0409bb60df3c4587245fd01fdeb270bb5a24f3 CI 1648349245 +1100 commit: 7 +2e0409bb60df3c4587245fd01fdeb270bb5a24f3 416178fd7462af72f4357dda1241fc66063e467b CI 1648349249 +1100 rebase -i (finish): refs/heads/master onto d43a810e4d47f2c632ea62ae581a8aade6f23b21 diff --git a/test/integration/pullRebaseInteractive/expected/repo/.git_keep/logs/refs/remotes/origin/master b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/logs/refs/remotes/origin/master new file mode 100644 index 000000000..fdad392f4 --- /dev/null +++ b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/logs/refs/remotes/origin/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 d43a810e4d47f2c632ea62ae581a8aade6f23b21 CI 1648349245 +1100 fetch origin: storing head diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/00/a0b67048be84a6aeaa50b27ad90ab567d65837 b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/00/a0b67048be84a6aeaa50b27ad90ab567d65837 similarity index 100% rename from test/integration/pullRebaseInteractive/expected/.git_keep/objects/00/a0b67048be84a6aeaa50b27ad90ab567d65837 rename to test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/00/a0b67048be84a6aeaa50b27ad90ab567d65837 diff --git a/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/03/5fa6a8b921a1d593845c5ce81434b92cc0eccb b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/03/5fa6a8b921a1d593845c5ce81434b92cc0eccb new file mode 100644 index 000000000..ce54059d4 Binary files /dev/null and b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/03/5fa6a8b921a1d593845c5ce81434b92cc0eccb differ diff --git a/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/09/f87d11c514ba0a54e43193aaf9067174e2315e b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/09/f87d11c514ba0a54e43193aaf9067174e2315e new file mode 100644 index 000000000..c3702e14a Binary files /dev/null and b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/09/f87d11c514ba0a54e43193aaf9067174e2315e differ diff --git a/test/integration/pushFollowTags/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/pushFollowTags/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/pushAndSetUpstreamDefault/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/pushAndSetUpstreamDefault/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/24/21815f8570a34d9f8c8991df1005150ed3ae99 b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/24/21815f8570a34d9f8c8991df1005150ed3ae99 similarity index 100% rename from test/integration/pullRebaseInteractive/expected/.git_keep/objects/24/21815f8570a34d9f8c8991df1005150ed3ae99 rename to test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/24/21815f8570a34d9f8c8991df1005150ed3ae99 diff --git a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/pushAndSetUpstreamDefault/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/2e/0409bb60df3c4587245fd01fdeb270bb5a24f3 b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/2e/0409bb60df3c4587245fd01fdeb270bb5a24f3 new file mode 100644 index 000000000..1d9689812 Binary files /dev/null and b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/2e/0409bb60df3c4587245fd01fdeb270bb5a24f3 differ diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected_remote/objects/2f/6174050380438f14b16658a356e762435ca591 b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 similarity index 100% rename from test/integration/pullRebaseInteractiveWithDrop/expected_remote/objects/2f/6174050380438f14b16658a356e762435ca591 rename to test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 diff --git a/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/41/6178fd7462af72f4357dda1241fc66063e467b b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/41/6178fd7462af72f4357dda1241fc66063e467b new file mode 100644 index 000000000..3744a685d Binary files /dev/null and b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/41/6178fd7462af72f4357dda1241fc66063e467b differ diff --git a/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/52/137603da2dccb618dfa0953d1b7df8c0255959 b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/52/137603da2dccb618dfa0953d1b7df8c0255959 new file mode 100644 index 000000000..41731f660 Binary files /dev/null and b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/52/137603da2dccb618dfa0953d1b7df8c0255959 differ diff --git a/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/5c/4dd6c94fae2afe48f413f48dc998ae48fcf463 b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/5c/4dd6c94fae2afe48f413f48dc998ae48fcf463 new file mode 100644 index 000000000..053e1cb24 --- /dev/null +++ b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/5c/4dd6c94fae2afe48f413f48dc998ae48fcf463 @@ -0,0 +1,2 @@ +x…Î1 +1@Qëś"˝ “L&N@DŘjŹ1I&(wY"x|·°·ýĽâ—Ą÷ǰŽů06UŰ g%/ä™1B’R3{*, }KÉálVŮô5lŚ#&$l€©ůĚgT¨kv(•X›‘÷¸/›ťf{™ć›~¤ŻO=•Ą_­‹1$Čť0{ݧ†ţáéÇ ™/¨Ů8 \ No newline at end of file diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/5d/0d8eb2623180ca95f2634f7e25f40521d5aea2 b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/5d/0d8eb2623180ca95f2634f7e25f40521d5aea2 similarity index 100% rename from test/integration/pullRebaseInteractive/expected/.git_keep/objects/5d/0d8eb2623180ca95f2634f7e25f40521d5aea2 rename to test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/5d/0d8eb2623180ca95f2634f7e25f40521d5aea2 diff --git a/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/66/d3639353f039f2b87ea3e0dd3db13a5415c6df b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/66/d3639353f039f2b87ea3e0dd3db13a5415c6df new file mode 100644 index 000000000..534bfc387 Binary files /dev/null and b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/66/d3639353f039f2b87ea3e0dd3db13a5415c6df differ diff --git a/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/7c/0506ec2cd7852818e3e597619ff64af83770c6 b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/7c/0506ec2cd7852818e3e597619ff64af83770c6 new file mode 100644 index 000000000..bf8c283f0 --- /dev/null +++ b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/7c/0506ec2cd7852818e3e597619ff64af83770c6 @@ -0,0 +1,3 @@ +xŤÍA +0@Ń®sŠŮJ&Žc„R +®<ĆL¨ŕ‘ÚŰ×#tűyđS5[ ńĄŞŕ•SńÂË0jĚDŠ‘sÄ XZ¨ËLERśĽŰ«0Ípźć§~ÄöMo©Ú)v4ęáŠč˝;ë9iú'wö-ë¦č~3‹,Ő \ No newline at end of file diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/8c/fc761d2799512553e491f7ceb3564a5e994999 b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/8c/fc761d2799512553e491f7ceb3564a5e994999 similarity index 100% rename from test/integration/pullRebaseInteractive/expected/.git_keep/objects/8c/fc761d2799512553e491f7ceb3564a5e994999 rename to test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/8c/fc761d2799512553e491f7ceb3564a5e994999 diff --git a/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/91/d2303b08e6765e0ec38c401ecbab0cbb126dca b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/91/d2303b08e6765e0ec38c401ecbab0cbb126dca new file mode 100644 index 000000000..d3ebd3660 Binary files /dev/null and b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/91/d2303b08e6765e0ec38c401ecbab0cbb126dca differ diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/9b/1719f5cf069568785080a0bbabbe7c377e22ae b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/9b/1719f5cf069568785080a0bbabbe7c377e22ae similarity index 100% rename from test/integration/pullRebaseInteractive/expected/.git_keep/objects/9b/1719f5cf069568785080a0bbabbe7c377e22ae rename to test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/9b/1719f5cf069568785080a0bbabbe7c377e22ae diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/9d/aeafb9864cf43055ae93beb0afd6c7d144bfa4 b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/9d/aeafb9864cf43055ae93beb0afd6c7d144bfa4 similarity index 100% rename from test/integration/pullRebaseInteractive/expected/.git_keep/objects/9d/aeafb9864cf43055ae93beb0afd6c7d144bfa4 rename to test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/9d/aeafb9864cf43055ae93beb0afd6c7d144bfa4 diff --git a/test/integration/pushFollowTags/expected_remote/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/pushFollowTags/expected_remote/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/pushAndSetUpstreamDefault/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/ae/d6c0a012c68a8b615ab0185b64f59c414d4746 b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/ae/d6c0a012c68a8b615ab0185b64f59c414d4746 similarity index 100% rename from test/integration/pullRebaseInteractive/expected/.git_keep/objects/ae/d6c0a012c68a8b615ab0185b64f59c414d4746 rename to test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/ae/d6c0a012c68a8b615ab0185b64f59c414d4746 diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/b2/da3d615a1805f094849247add77d09aee06451 b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/b2/da3d615a1805f094849247add77d09aee06451 similarity index 100% rename from test/integration/pullRebaseInteractive/expected/.git_keep/objects/b2/da3d615a1805f094849247add77d09aee06451 rename to test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/b2/da3d615a1805f094849247add77d09aee06451 diff --git a/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/d2/17625c37713436bb6c92ff9d0b3991a8a7dba5 b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/d2/17625c37713436bb6c92ff9d0b3991a8a7dba5 new file mode 100644 index 000000000..96116a717 Binary files /dev/null and b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/d2/17625c37713436bb6c92ff9d0b3991a8a7dba5 differ diff --git a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/pushAndSetUpstreamDefault/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/d4/3a810e4d47f2c632ea62ae581a8aade6f23b21 b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/d4/3a810e4d47f2c632ea62ae581a8aade6f23b21 new file mode 100644 index 000000000..8d51321bd --- /dev/null +++ b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/d4/3a810e4d47f2c632ea62ae581a8aade6f23b21 @@ -0,0 +1,3 @@ +xŤÎA +Â0@Q×9Eö‚Ěd&ÓD„®zŚd:Ĺ‚±ĄDĐŰŰ#¸ýĽĹ×µÖĄyěůÔv3fÁŽ!%`J3rA‘2E±NSÔ{t[ŢíŐ|ŹS  ɤ“h`JIĐ´äZ +™4»ünŹu÷ĂčŻĂx·O®ŰÓ.şÖ›GáDÜŽţŚŕŽzL5ű“»úť—§±űüJ9? \ No newline at end of file diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/d4/8cf11b7fbbda4199b736bb9e8fadabf773eb9e b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/d4/8cf11b7fbbda4199b736bb9e8fadabf773eb9e similarity index 100% rename from test/integration/pullRebaseInteractive/expected/.git_keep/objects/d4/8cf11b7fbbda4199b736bb9e8fadabf773eb9e rename to test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/d4/8cf11b7fbbda4199b736bb9e8fadabf773eb9e diff --git a/test/integration/pushAndSetUpstreamDefault/expected_remote/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/pushAndSetUpstreamDefault/expected_remote/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/e9/74f4acf07db6fcaa438df552a8fd44e2d58dcd b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/e9/74f4acf07db6fcaa438df552a8fd44e2d58dcd new file mode 100644 index 000000000..dc8909137 Binary files /dev/null and b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/e9/74f4acf07db6fcaa438df552a8fd44e2d58dcd differ diff --git a/test/integration/pullRebaseInteractive/expected/.git_keep/objects/f0/bbe52a52883609acdb825c8af32b4b3ccb0607 b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/f0/bbe52a52883609acdb825c8af32b4b3ccb0607 similarity index 100% rename from test/integration/pullRebaseInteractive/expected/.git_keep/objects/f0/bbe52a52883609acdb825c8af32b4b3ccb0607 rename to test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/f0/bbe52a52883609acdb825c8af32b4b3ccb0607 diff --git a/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/ff/0d57cafe9d745264b23450e9268cdb5ddc4edc b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/ff/0d57cafe9d745264b23450e9268cdb5ddc4edc new file mode 100644 index 000000000..e278bfbe8 --- /dev/null +++ b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/objects/ff/0d57cafe9d745264b23450e9268cdb5ddc4edc @@ -0,0 +1,2 @@ +x…ŽA +1 E]÷Ý Ň´iM@D•Çm‚‚u†ˇ‚Çw÷.ßçÁuîý><íĆŞę#F ČFů$acŁJĚĐ Bȶ$ĘěYő9|®ŘZ©Ś&ĹÉ’!µĘLňĺjX’“׸ͫź®ţ4]/ú–ľ<ôPç~öPrÄě÷°Ý¸mݢ†ţŃů§»â>jń7ů \ No newline at end of file diff --git a/test/integration/pullRebaseInteractive/expected/repo/.git_keep/refs/heads/master b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..99eb1dca1 --- /dev/null +++ b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +416178fd7462af72f4357dda1241fc66063e467b diff --git a/test/integration/pullRebaseInteractive/expected/repo/.git_keep/refs/remotes/origin/master b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/refs/remotes/origin/master new file mode 100644 index 000000000..6a52d4f85 --- /dev/null +++ b/test/integration/pullRebaseInteractive/expected/repo/.git_keep/refs/remotes/origin/master @@ -0,0 +1 @@ +d43a810e4d47f2c632ea62ae581a8aade6f23b21 diff --git a/test/integration/pushTag/expected/myfile1 b/test/integration/pullRebaseInteractive/expected/repo/myfile1 similarity index 100% rename from test/integration/pushTag/expected/myfile1 rename to test/integration/pullRebaseInteractive/expected/repo/myfile1 diff --git a/test/integration/pushAndSetUpstreamDefault/expected/myfile2 b/test/integration/pullRebaseInteractive/expected/repo/myfile2 similarity index 100% rename from test/integration/pushAndSetUpstreamDefault/expected/myfile2 rename to test/integration/pullRebaseInteractive/expected/repo/myfile2 diff --git a/test/integration/pushAndSetUpstream/expected/myfile3 b/test/integration/pullRebaseInteractive/expected/repo/myfile3 similarity index 100% rename from test/integration/pushAndSetUpstream/expected/myfile3 rename to test/integration/pullRebaseInteractive/expected/repo/myfile3 diff --git a/test/integration/pullRebaseInteractive/expected/myfile4 b/test/integration/pullRebaseInteractive/expected/repo/myfile4 similarity index 100% rename from test/integration/pullRebaseInteractive/expected/myfile4 rename to test/integration/pullRebaseInteractive/expected/repo/myfile4 diff --git a/test/integration/pullRebaseInteractive/expected/myfile5 b/test/integration/pullRebaseInteractive/expected/repo/myfile5 similarity index 100% rename from test/integration/pullRebaseInteractive/expected/myfile5 rename to test/integration/pullRebaseInteractive/expected/repo/myfile5 diff --git a/test/integration/pullRebaseInteractive/expected/myfile6 b/test/integration/pullRebaseInteractive/expected/repo/myfile6 similarity index 100% rename from test/integration/pullRebaseInteractive/expected/myfile6 rename to test/integration/pullRebaseInteractive/expected/repo/myfile6 diff --git a/test/integration/pullRebaseInteractive/expected/myfile7 b/test/integration/pullRebaseInteractive/expected/repo/myfile7 similarity index 100% rename from test/integration/pullRebaseInteractive/expected/myfile7 rename to test/integration/pullRebaseInteractive/expected/repo/myfile7 diff --git a/test/integration/pullRebaseInteractive/expected_remote/config b/test/integration/pullRebaseInteractive/expected_remote/config deleted file mode 100644 index 79d424485..000000000 --- a/test/integration/pullRebaseInteractive/expected_remote/config +++ /dev/null @@ -1,8 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = true - ignorecase = true - precomposeunicode = true -[remote "origin"] - url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/pullRebaseInteractive/./actual diff --git a/test/integration/pullRebaseInteractive/expected_remote/objects/3f/b33027aedae13ab0796292c821a0258f6c2f7b b/test/integration/pullRebaseInteractive/expected_remote/objects/3f/b33027aedae13ab0796292c821a0258f6c2f7b deleted file mode 100644 index 72f6e886b..000000000 Binary files a/test/integration/pullRebaseInteractive/expected_remote/objects/3f/b33027aedae13ab0796292c821a0258f6c2f7b and /dev/null differ diff --git a/test/integration/pullRebaseInteractive/expected_remote/objects/74/ca3dec707dde7c92727d9490517e498360fea8 b/test/integration/pullRebaseInteractive/expected_remote/objects/74/ca3dec707dde7c92727d9490517e498360fea8 deleted file mode 100644 index 2f5e7e39f..000000000 --- a/test/integration/pullRebaseInteractive/expected_remote/objects/74/ca3dec707dde7c92727d9490517e498360fea8 +++ /dev/null @@ -1,2 +0,0 @@ -xŤÍA -Â0@Q×9Ĺěɤă4ˇ«cšL°Đ!R"čííÜ~üÜĚÖH|ę»*xĺ\˝đ2&Ť…H1r‰ëH …©Jľ'ďţl;L3ܦůˇ±×¦—ÜěČĹÄ)$8#zďŽzLşţÉť}ëş)ş7(,ë \ No newline at end of file diff --git a/test/integration/pullRebaseInteractive/expected_remote/objects/ca/58e8d47d619ffb625dc021f0ab2bb0f0bcf623 b/test/integration/pullRebaseInteractive/expected_remote/objects/ca/58e8d47d619ffb625dc021f0ab2bb0f0bcf623 deleted file mode 100644 index 1cf77f0bb..000000000 Binary files a/test/integration/pullRebaseInteractive/expected_remote/objects/ca/58e8d47d619ffb625dc021f0ab2bb0f0bcf623 and /dev/null differ diff --git a/test/integration/pullRebaseInteractive/expected_remote/objects/ea/4a99ea801f54f1ec09a88a28c65eb4db5865aa b/test/integration/pullRebaseInteractive/expected_remote/objects/ea/4a99ea801f54f1ec09a88a28c65eb4db5865aa deleted file mode 100644 index a9ed03844..000000000 --- a/test/integration/pullRebaseInteractive/expected_remote/objects/ea/4a99ea801f54f1ec09a88a28c65eb4db5865aa +++ /dev/null @@ -1,2 +0,0 @@ -xŤÎA -Â0@Q×9Eö‚df’I"BW=Ć4N°ĐŘR"čííÜ~Ţâ—µµą[ČţÔwU‹•!z%ç)Uđ0‡$X#٧P$d0›ěúę–ęDä0Š>Ddr13f, A†Tą`Ť“‘w®»F{Ć»~¤m‹^ĘÚn|Ęś1Ű3€sć¨ÇT×?ąiß:/ęÍÓg8Ő \ No newline at end of file diff --git a/test/integration/pullRebaseInteractive/expected_remote/packed-refs b/test/integration/pullRebaseInteractive/expected_remote/packed-refs deleted file mode 100644 index 33ecbd263..000000000 --- a/test/integration/pullRebaseInteractive/expected_remote/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# pack-refs with: peeled fully-peeled sorted -ea4a99ea801f54f1ec09a88a28c65eb4db5865aa refs/heads/master diff --git a/test/integration/pullRebaseInteractive/setup.sh b/test/integration/pullRebaseInteractive/setup.sh index a0dce709f..fc90cd285 100644 --- a/test/integration/pullRebaseInteractive/setup.sh +++ b/test/integration/pullRebaseInteractive/setup.sh @@ -25,9 +25,9 @@ git add . git commit -am "myfile4" cd .. -git clone --bare ./actual actual_remote +git clone --bare ./repo origin -cd actual +cd repo git reset --hard HEAD~2 @@ -47,7 +47,7 @@ echo test > myfile7 git add . git commit -am "7" -git remote add origin ../actual_remote +git remote add origin ../origin git fetch origin git branch --set-upstream-to=origin/master master diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/COMMIT_EDITMSG b/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/COMMIT_EDITMSG deleted file mode 100644 index 13b4a42ac..000000000 --- a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/COMMIT_EDITMSG +++ /dev/null @@ -1,16 +0,0 @@ -myfile4 conflict - -# Please enter the commit message for your changes. Lines starting -# with '#' will be ignored, and an empty message aborts the commit. -# -# interactive rebase in progress; onto 4589efc -# Last command done (1 command done): -# pick 9013b5f myfile4 conflict -# Next commands to do (3 remaining commands): -# pick 0fa5386 5 -# drop 69a5c9f 6 -# You are currently rebasing branch 'master' on '4589efc'. -# -# Changes to be committed: -# modified: myfile4 -# diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/FETCH_HEAD b/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/FETCH_HEAD deleted file mode 100644 index 4d6186494..000000000 --- a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/FETCH_HEAD +++ /dev/null @@ -1 +0,0 @@ -4589efcaf3024e841825bb289bb88eb0e4f8530a branch 'master' of ../actual_remote diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/ORIG_HEAD b/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/ORIG_HEAD deleted file mode 100644 index d989f6dc2..000000000 --- a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/ORIG_HEAD +++ /dev/null @@ -1 +0,0 @@ -9013b5f12ca8a0fdd44fbe72028500bbac5c89ee diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/config b/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/config deleted file mode 100644 index cfff6ba8c..000000000 --- a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/config +++ /dev/null @@ -1,18 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true - precomposeunicode = true -[user] - email = CI@example.com - name = CI -[remote "origin"] - url = ../actual_remote - fetch = +refs/heads/*:refs/remotes/origin/* -[branch "master"] - remote = origin - merge = refs/heads/master -[pull] - rebase = interactive diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/index b/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/index deleted file mode 100644 index 109dfab63..000000000 Binary files a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/index and /dev/null differ diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/logs/HEAD b/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/logs/HEAD deleted file mode 100644 index f5f276231..000000000 --- a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/logs/HEAD +++ /dev/null @@ -1,14 +0,0 @@ -0000000000000000000000000000000000000000 5759b6258419271e67a172e51cd90048dd21f9c0 CI 1634896936 +1100 commit (initial): myfile1 -5759b6258419271e67a172e51cd90048dd21f9c0 476a1939075b60aa47da50a8c40c5b4412a2f18b CI 1634896936 +1100 commit: myfile2 -476a1939075b60aa47da50a8c40c5b4412a2f18b e047462bda495acbe565c85b205d614f38c0a692 CI 1634896936 +1100 commit: myfile3 -e047462bda495acbe565c85b205d614f38c0a692 4589efcaf3024e841825bb289bb88eb0e4f8530a CI 1634896936 +1100 commit: myfile4 -4589efcaf3024e841825bb289bb88eb0e4f8530a 476a1939075b60aa47da50a8c40c5b4412a2f18b CI 1634896936 +1100 reset: moving to head^^ -476a1939075b60aa47da50a8c40c5b4412a2f18b 9013b5f12ca8a0fdd44fbe72028500bbac5c89ee CI 1634896936 +1100 commit: myfile4 conflict -9013b5f12ca8a0fdd44fbe72028500bbac5c89ee 0fa53867500c0f3a5cca9b2112982795fae51c51 CI 1634896936 +1100 commit: 5 -0fa53867500c0f3a5cca9b2112982795fae51c51 69a5c9fb912112305bfe15272855afb50f6acf4b CI 1634896936 +1100 commit: 6 -69a5c9fb912112305bfe15272855afb50f6acf4b af4c4b2b977f8909e590ea5bc3bab59d991e4c28 CI 1634896936 +1100 commit: 7 -af4c4b2b977f8909e590ea5bc3bab59d991e4c28 4589efcaf3024e841825bb289bb88eb0e4f8530a CI 1634896938 +1100 rebase -i (start): checkout 4589efcaf3024e841825bb289bb88eb0e4f8530a -4589efcaf3024e841825bb289bb88eb0e4f8530a 5d08d9b6315ddb8fb8372d83b54862ba7d7fdc88 CI 1634896942 +1100 rebase -i (continue): myfile4 conflict -5d08d9b6315ddb8fb8372d83b54862ba7d7fdc88 7c717449332e4a81f7e5643eef9c95f459444e3f CI 1634896942 +1100 rebase -i (pick): 5 -7c717449332e4a81f7e5643eef9c95f459444e3f ae4e33d43751b83fbd0b6f0a1796d58462492e47 CI 1634896942 +1100 rebase -i (pick): 7 -ae4e33d43751b83fbd0b6f0a1796d58462492e47 ae4e33d43751b83fbd0b6f0a1796d58462492e47 CI 1634896942 +1100 rebase -i (finish): returning to refs/heads/master diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/logs/refs/heads/master b/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/logs/refs/heads/master deleted file mode 100644 index ae47bc191..000000000 --- a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/logs/refs/heads/master +++ /dev/null @@ -1,10 +0,0 @@ -0000000000000000000000000000000000000000 5759b6258419271e67a172e51cd90048dd21f9c0 CI 1634896936 +1100 commit (initial): myfile1 -5759b6258419271e67a172e51cd90048dd21f9c0 476a1939075b60aa47da50a8c40c5b4412a2f18b CI 1634896936 +1100 commit: myfile2 -476a1939075b60aa47da50a8c40c5b4412a2f18b e047462bda495acbe565c85b205d614f38c0a692 CI 1634896936 +1100 commit: myfile3 -e047462bda495acbe565c85b205d614f38c0a692 4589efcaf3024e841825bb289bb88eb0e4f8530a CI 1634896936 +1100 commit: myfile4 -4589efcaf3024e841825bb289bb88eb0e4f8530a 476a1939075b60aa47da50a8c40c5b4412a2f18b CI 1634896936 +1100 reset: moving to head^^ -476a1939075b60aa47da50a8c40c5b4412a2f18b 9013b5f12ca8a0fdd44fbe72028500bbac5c89ee CI 1634896936 +1100 commit: myfile4 conflict -9013b5f12ca8a0fdd44fbe72028500bbac5c89ee 0fa53867500c0f3a5cca9b2112982795fae51c51 CI 1634896936 +1100 commit: 5 -0fa53867500c0f3a5cca9b2112982795fae51c51 69a5c9fb912112305bfe15272855afb50f6acf4b CI 1634896936 +1100 commit: 6 -69a5c9fb912112305bfe15272855afb50f6acf4b af4c4b2b977f8909e590ea5bc3bab59d991e4c28 CI 1634896936 +1100 commit: 7 -af4c4b2b977f8909e590ea5bc3bab59d991e4c28 ae4e33d43751b83fbd0b6f0a1796d58462492e47 CI 1634896942 +1100 rebase -i (finish): refs/heads/master onto 4589efcaf3024e841825bb289bb88eb0e4f8530a diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/logs/refs/remotes/origin/master b/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/logs/refs/remotes/origin/master deleted file mode 100644 index 3c26173a8..000000000 --- a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/logs/refs/remotes/origin/master +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 4589efcaf3024e841825bb289bb88eb0e4f8530a CI 1634896936 +1100 fetch origin: storing head diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/0f/a53867500c0f3a5cca9b2112982795fae51c51 b/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/0f/a53867500c0f3a5cca9b2112982795fae51c51 deleted file mode 100644 index f5f9df209..000000000 Binary files a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/0f/a53867500c0f3a5cca9b2112982795fae51c51 and /dev/null differ diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/45/89efcaf3024e841825bb289bb88eb0e4f8530a b/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/45/89efcaf3024e841825bb289bb88eb0e4f8530a deleted file mode 100644 index abf2de1e2..000000000 --- a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/45/89efcaf3024e841825bb289bb88eb0e4f8530a +++ /dev/null @@ -1,2 +0,0 @@ -xŤÎA -Â0@Q×9Eö‚Ě$3ÓD„®zŚ$ť`ÁŘR"čííÜ~Ţâ—µµĄ[Śt껪uUp `đȇДQ„Cň,:#Ď%qDłĄ]_Ý*Đ@âňś(r*YY¸Îx¤ęC$Ń™ôîŹu·ădŻăt×OjŰS/em7‹â)D‰^ěŔőęú'7í[—§’ůĂĐ8­ \ No newline at end of file diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/47/6a1939075b60aa47da50a8c40c5b4412a2f18b b/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/47/6a1939075b60aa47da50a8c40c5b4412a2f18b deleted file mode 100644 index 6f4196f0d..000000000 Binary files a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/47/6a1939075b60aa47da50a8c40c5b4412a2f18b and /dev/null differ diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/57/59b6258419271e67a172e51cd90048dd21f9c0 b/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/57/59b6258419271e67a172e51cd90048dd21f9c0 deleted file mode 100644 index 08237c841..000000000 --- a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/57/59b6258419271e67a172e51cd90048dd21f9c0 +++ /dev/null @@ -1,3 +0,0 @@ -xŤÍA -Â0@Q×9ĹěÉ4ă4ˇ«cšL°Đ!R"čííÜ~üÜĚÖH|ę»*xĺ\˝đ2&Ť…H1r‰8Ö‘ -…©JľNŢýŮvf¸MóC?bŻM/ąŮĹÄ)0ś˝wG=&]˙äÎľuÝÝ6,ç \ No newline at end of file diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/5d/08d9b6315ddb8fb8372d83b54862ba7d7fdc88 b/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/5d/08d9b6315ddb8fb8372d83b54862ba7d7fdc88 deleted file mode 100644 index eb8963927..000000000 --- a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/5d/08d9b6315ddb8fb8372d83b54862ba7d7fdc88 +++ /dev/null @@ -1,2 +0,0 @@ -x}α -Â0€açë2箾¶=m \ No newline at end of file diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/65/401620c5230dfa2ad6e0e2dcb6b447fe21262b b/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/65/401620c5230dfa2ad6e0e2dcb6b447fe21262b deleted file mode 100644 index a48fefe98..000000000 Binary files a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/65/401620c5230dfa2ad6e0e2dcb6b447fe21262b and /dev/null differ diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/69/a5c9fb912112305bfe15272855afb50f6acf4b b/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/69/a5c9fb912112305bfe15272855afb50f6acf4b deleted file mode 100644 index f4e99e6a6..000000000 Binary files a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/69/a5c9fb912112305bfe15272855afb50f6acf4b and /dev/null differ diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/7c/717449332e4a81f7e5643eef9c95f459444e3f b/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/7c/717449332e4a81f7e5643eef9c95f459444e3f deleted file mode 100644 index 07becc026..000000000 --- a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/7c/717449332e4a81f7e5643eef9c95f459444e3f +++ /dev/null @@ -1,3 +0,0 @@ -x}ÎM -Â0@a×9Eö‚$™L2"BW=ĆL~P0¶”ß.\»}|‹—×ŢC[˘ÓŘkŐÍTtŚŽ‚Iś‹ĂLÜŔ‰ČYL0QmĽ××ĐX •$,–C6!®z -N8–ŘJ&Rü÷u×ó˘§yąŐ÷íY/yíWmxJ!AĐgkŤQG=¦FýĎ˝űq…ę ұ8q \ No newline at end of file diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/90/13b5f12ca8a0fdd44fbe72028500bbac5c89ee b/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/90/13b5f12ca8a0fdd44fbe72028500bbac5c89ee deleted file mode 100644 index 93173c9a0..000000000 Binary files a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/90/13b5f12ca8a0fdd44fbe72028500bbac5c89ee and /dev/null differ diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/ae/4e33d43751b83fbd0b6f0a1796d58462492e47 b/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/ae/4e33d43751b83fbd0b6f0a1796d58462492e47 deleted file mode 100644 index d2952d0ad..000000000 --- a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/ae/4e33d43751b83fbd0b6f0a1796d58462492e47 +++ /dev/null @@ -1,2 +0,0 @@ -x}α -Â0€aç 1648349271 +1100 commit (initial): myfile1 +fefea9e2c324080a61d03142554b81e410e9c87f a888f490faa49a665557b35171f4ce0896414ea2 CI 1648349271 +1100 commit: myfile2 +a888f490faa49a665557b35171f4ce0896414ea2 6e44f128bc1b25454eeb074e40dd15d02eff5c87 CI 1648349271 +1100 commit: myfile3 +6e44f128bc1b25454eeb074e40dd15d02eff5c87 ce137eabb7b8df81d4818ac8a16892b1f7327219 CI 1648349271 +1100 commit: myfile4 +ce137eabb7b8df81d4818ac8a16892b1f7327219 a888f490faa49a665557b35171f4ce0896414ea2 CI 1648349271 +1100 reset: moving to HEAD~2 +a888f490faa49a665557b35171f4ce0896414ea2 6ba64def9b38eb7bcf5aa1a6c513c490967062ad CI 1648349271 +1100 commit: myfile4 conflict +6ba64def9b38eb7bcf5aa1a6c513c490967062ad 6226d76652e77aba63c55f4f48344304f4f75879 CI 1648349271 +1100 commit: 5 +6226d76652e77aba63c55f4f48344304f4f75879 67c00631fc73b6b4d61a1dcb0195777f0d832fd7 CI 1648349271 +1100 commit: 6 +67c00631fc73b6b4d61a1dcb0195777f0d832fd7 3c2846a93bb9c2815e3218ac3c906da26d159068 CI 1648349271 +1100 commit: 7 +3c2846a93bb9c2815e3218ac3c906da26d159068 ce137eabb7b8df81d4818ac8a16892b1f7327219 CI 1648349273 +1100 rebase -i (start): checkout ce137eabb7b8df81d4818ac8a16892b1f7327219 +ce137eabb7b8df81d4818ac8a16892b1f7327219 281c7e805fd7bf133611e701ef01f0a4f362f232 CI 1648349278 +1100 rebase -i (continue): myfile4 conflict +281c7e805fd7bf133611e701ef01f0a4f362f232 d13fd4cd73174c7048108d2dc8d277a8e013d1e4 CI 1648349278 +1100 rebase -i (pick): 5 +d13fd4cd73174c7048108d2dc8d277a8e013d1e4 72da3b902dcd9e99b21bdc36891e028b8dbfb219 CI 1648349278 +1100 rebase -i (pick): 7 +72da3b902dcd9e99b21bdc36891e028b8dbfb219 72da3b902dcd9e99b21bdc36891e028b8dbfb219 CI 1648349278 +1100 rebase -i (finish): returning to refs/heads/master diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..816678825 --- /dev/null +++ b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,10 @@ +0000000000000000000000000000000000000000 fefea9e2c324080a61d03142554b81e410e9c87f CI 1648349271 +1100 commit (initial): myfile1 +fefea9e2c324080a61d03142554b81e410e9c87f a888f490faa49a665557b35171f4ce0896414ea2 CI 1648349271 +1100 commit: myfile2 +a888f490faa49a665557b35171f4ce0896414ea2 6e44f128bc1b25454eeb074e40dd15d02eff5c87 CI 1648349271 +1100 commit: myfile3 +6e44f128bc1b25454eeb074e40dd15d02eff5c87 ce137eabb7b8df81d4818ac8a16892b1f7327219 CI 1648349271 +1100 commit: myfile4 +ce137eabb7b8df81d4818ac8a16892b1f7327219 a888f490faa49a665557b35171f4ce0896414ea2 CI 1648349271 +1100 reset: moving to HEAD~2 +a888f490faa49a665557b35171f4ce0896414ea2 6ba64def9b38eb7bcf5aa1a6c513c490967062ad CI 1648349271 +1100 commit: myfile4 conflict +6ba64def9b38eb7bcf5aa1a6c513c490967062ad 6226d76652e77aba63c55f4f48344304f4f75879 CI 1648349271 +1100 commit: 5 +6226d76652e77aba63c55f4f48344304f4f75879 67c00631fc73b6b4d61a1dcb0195777f0d832fd7 CI 1648349271 +1100 commit: 6 +67c00631fc73b6b4d61a1dcb0195777f0d832fd7 3c2846a93bb9c2815e3218ac3c906da26d159068 CI 1648349271 +1100 commit: 7 +3c2846a93bb9c2815e3218ac3c906da26d159068 72da3b902dcd9e99b21bdc36891e028b8dbfb219 CI 1648349278 +1100 rebase -i (finish): refs/heads/master onto ce137eabb7b8df81d4818ac8a16892b1f7327219 diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/logs/refs/remotes/origin/master b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/logs/refs/remotes/origin/master new file mode 100644 index 000000000..b4fbeb7a0 --- /dev/null +++ b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/logs/refs/remotes/origin/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 ce137eabb7b8df81d4818ac8a16892b1f7327219 CI 1648349271 +1100 fetch origin: storing head diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/00/a0b67048be84a6aeaa50b27ad90ab567d65837 b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/00/a0b67048be84a6aeaa50b27ad90ab567d65837 similarity index 100% rename from test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/00/a0b67048be84a6aeaa50b27ad90ab567d65837 rename to test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/00/a0b67048be84a6aeaa50b27ad90ab567d65837 diff --git a/test/integration/pushNoFollowTags/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/pushNoFollowTags/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/pushFollowTags/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/pushFollowTags/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/26/02a2a5727666c205fef7f152786e1edb1c5d4b b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/26/02a2a5727666c205fef7f152786e1edb1c5d4b similarity index 100% rename from test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/26/02a2a5727666c205fef7f152786e1edb1c5d4b rename to test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/26/02a2a5727666c205fef7f152786e1edb1c5d4b diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/28/1c7e805fd7bf133611e701ef01f0a4f362f232 b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/28/1c7e805fd7bf133611e701ef01f0a4f362f232 new file mode 100644 index 000000000..01b717854 Binary files /dev/null and b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/28/1c7e805fd7bf133611e701ef01f0a4f362f232 differ diff --git a/test/integration/pushFollowTags/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/pushFollowTags/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/push/expected_remote/objects/2f/6174050380438f14b16658a356e762435ca591 b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 similarity index 100% rename from test/integration/push/expected_remote/objects/2f/6174050380438f14b16658a356e762435ca591 rename to test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/32/2d2d5205fe70df6899f8d58474941de4798aab b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/32/2d2d5205fe70df6899f8d58474941de4798aab new file mode 100644 index 000000000..8a1d879aa Binary files /dev/null and b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/32/2d2d5205fe70df6899f8d58474941de4798aab differ diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/3c/2846a93bb9c2815e3218ac3c906da26d159068 b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/3c/2846a93bb9c2815e3218ac3c906da26d159068 new file mode 100644 index 000000000..3622a8add Binary files /dev/null and b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/3c/2846a93bb9c2815e3218ac3c906da26d159068 differ diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/5d/0d8eb2623180ca95f2634f7e25f40521d5aea2 b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/5d/0d8eb2623180ca95f2634f7e25f40521d5aea2 similarity index 100% rename from test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/5d/0d8eb2623180ca95f2634f7e25f40521d5aea2 rename to test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/5d/0d8eb2623180ca95f2634f7e25f40521d5aea2 diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/62/26d76652e77aba63c55f4f48344304f4f75879 b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/62/26d76652e77aba63c55f4f48344304f4f75879 new file mode 100644 index 000000000..88e06fe16 --- /dev/null +++ b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/62/26d76652e77aba63c55f4f48344304f4f75879 @@ -0,0 +1,4 @@ +xŤŽÁ +Â0=ç+rdÓ$›D„žúo“- +Ö–ÁĎ·źŕu†©ë˛<»u9źú®j‰@‰BÍ "ÉĐ +A"§Ć1űd6ěúî–šÎE|VIRç8pŤÎ×P¨-Đ >ý±îvśěuśîúŲ˝ôR×ĺf‡ěC’łgçĚAŹ©®ę&šÁ8H \ No newline at end of file diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/67/c00631fc73b6b4d61a1dcb0195777f0d832fd7 b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/67/c00631fc73b6b4d61a1dcb0195777f0d832fd7 new file mode 100644 index 000000000..6282c8a0f Binary files /dev/null and b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/67/c00631fc73b6b4d61a1dcb0195777f0d832fd7 differ diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/6b/a64def9b38eb7bcf5aa1a6c513c490967062ad b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/6b/a64def9b38eb7bcf5aa1a6c513c490967062ad new file mode 100644 index 000000000..b23522e37 Binary files /dev/null and b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/6b/a64def9b38eb7bcf5aa1a6c513c490967062ad differ diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/6e/44f128bc1b25454eeb074e40dd15d02eff5c87 b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/6e/44f128bc1b25454eeb074e40dd15d02eff5c87 new file mode 100644 index 000000000..d30bb28d3 --- /dev/null +++ b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/6e/44f128bc1b25454eeb074e40dd15d02eff5c87 @@ -0,0 +1,3 @@ +xŤŽK +Â0@]çŮ ’ÉL~ "tŐcLÓ,[J˝˝=‚«Ź·xummé +ťú.bý kŽ0+!*Şň ¨ŮŐFRĺ3v73( +~ľ)ěm/§¸m™çG÷(r蛪7¨U#•H"śŕ\ÚT…b“bL5Tn­B‚ěÖ˛é«{lY˘Mą2'DÍ€j€%'2brĺÝďËć‡Ń_†ń¦ź2ŻO=µeľzLA8ś)Ł?"¸˝îS]˙půqÝ‚Z7Ż \ No newline at end of file diff --git a/test/integration/pushWithCredentials/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/pushWithCredentials/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/pushFollowTags/expected_remote/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/pushFollowTags/expected_remote/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/f0/bbe52a52883609acdb825c8af32b4b3ccb0607 b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/f0/bbe52a52883609acdb825c8af32b4b3ccb0607 similarity index 100% rename from test/integration/pullRebaseInteractiveWithDrop/expected/.git_keep/objects/f0/bbe52a52883609acdb825c8af32b4b3ccb0607 rename to test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/f0/bbe52a52883609acdb825c8af32b4b3ccb0607 diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/fe/fea9e2c324080a61d03142554b81e410e9c87f b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/fe/fea9e2c324080a61d03142554b81e410e9c87f new file mode 100644 index 000000000..8493481ba --- /dev/null +++ b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/objects/fe/fea9e2c324080a61d03142554b81e410e9c87f @@ -0,0 +1,2 @@ +xŤÍA +Â0@Q×9Ĺěɤă$ˇ«cšL°Đ!R"čííÜ~üÜĚÖH|ę»*xĺ\˝đGM…H1qIk¤…†ÂT%_“w¶¦nÓüĐŹŘkÓKnvdJŤ!"ś˝wG=&]˙äÎľuÝÝ3@,Ó \ No newline at end of file diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/refs/heads/master b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..388a5b886 --- /dev/null +++ b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +72da3b902dcd9e99b21bdc36891e028b8dbfb219 diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/refs/remotes/origin/master b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/refs/remotes/origin/master new file mode 100644 index 000000000..a350da945 --- /dev/null +++ b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/.git_keep/refs/remotes/origin/master @@ -0,0 +1 @@ +ce137eabb7b8df81d4818ac8a16892b1f7327219 diff --git a/test/integration/pushWithCredentials/expected/myfile1 b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/myfile1 similarity index 100% rename from test/integration/pushWithCredentials/expected/myfile1 rename to test/integration/pullRebaseInteractiveWithDrop/expected/repo/myfile1 diff --git a/test/integration/pushFollowTags/expected/myfile2 b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/myfile2 similarity index 100% rename from test/integration/pushFollowTags/expected/myfile2 rename to test/integration/pullRebaseInteractiveWithDrop/expected/repo/myfile2 diff --git a/test/integration/pushAndSetUpstreamDefault/expected/myfile3 b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/myfile3 similarity index 100% rename from test/integration/pushAndSetUpstreamDefault/expected/myfile3 rename to test/integration/pullRebaseInteractiveWithDrop/expected/repo/myfile3 diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/myfile4 b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/myfile4 similarity index 100% rename from test/integration/pullRebaseInteractiveWithDrop/expected/myfile4 rename to test/integration/pullRebaseInteractiveWithDrop/expected/repo/myfile4 diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/myfile5 b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/myfile5 similarity index 100% rename from test/integration/pullRebaseInteractiveWithDrop/expected/myfile5 rename to test/integration/pullRebaseInteractiveWithDrop/expected/repo/myfile5 diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected/myfile7 b/test/integration/pullRebaseInteractiveWithDrop/expected/repo/myfile7 similarity index 100% rename from test/integration/pullRebaseInteractiveWithDrop/expected/myfile7 rename to test/integration/pullRebaseInteractiveWithDrop/expected/repo/myfile7 diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected_remote/config b/test/integration/pullRebaseInteractiveWithDrop/expected_remote/config deleted file mode 100644 index fb9626026..000000000 --- a/test/integration/pullRebaseInteractiveWithDrop/expected_remote/config +++ /dev/null @@ -1,8 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = true - ignorecase = true - precomposeunicode = true -[remote "origin"] - url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/pullRebaseInteractiveWithDrop/./actual diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected_remote/objects/45/89efcaf3024e841825bb289bb88eb0e4f8530a b/test/integration/pullRebaseInteractiveWithDrop/expected_remote/objects/45/89efcaf3024e841825bb289bb88eb0e4f8530a deleted file mode 100644 index abf2de1e2..000000000 --- a/test/integration/pullRebaseInteractiveWithDrop/expected_remote/objects/45/89efcaf3024e841825bb289bb88eb0e4f8530a +++ /dev/null @@ -1,2 +0,0 @@ -xŤÎA -Â0@Q×9Eö‚Ě$3ÓD„®zŚ$ť`ÁŘR"čííÜ~Ţâ—µµĄ[Śt껪uUp `đȇДQ„Cň,:#Ď%qDłĄ]_Ý*Đ@âňś(r*YY¸Îx¤ęC$Ń™ôîŹu·ădŻăt×OjŰS/em7‹â)D‰^ěŔőęú'7í[—§’ůĂĐ8­ \ No newline at end of file diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected_remote/objects/47/6a1939075b60aa47da50a8c40c5b4412a2f18b b/test/integration/pullRebaseInteractiveWithDrop/expected_remote/objects/47/6a1939075b60aa47da50a8c40c5b4412a2f18b deleted file mode 100644 index 6f4196f0d..000000000 Binary files a/test/integration/pullRebaseInteractiveWithDrop/expected_remote/objects/47/6a1939075b60aa47da50a8c40c5b4412a2f18b and /dev/null differ diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected_remote/objects/57/59b6258419271e67a172e51cd90048dd21f9c0 b/test/integration/pullRebaseInteractiveWithDrop/expected_remote/objects/57/59b6258419271e67a172e51cd90048dd21f9c0 deleted file mode 100644 index 08237c841..000000000 --- a/test/integration/pullRebaseInteractiveWithDrop/expected_remote/objects/57/59b6258419271e67a172e51cd90048dd21f9c0 +++ /dev/null @@ -1,3 +0,0 @@ -xŤÍA -Â0@Q×9ĹěÉ4ă4ˇ«cšL°Đ!R"čííÜ~üÜĚÖH|ę»*xĺ\˝đ2&Ť…H1r‰8Ö‘ -…©JľNŢýŮvf¸MóC?bŻM/ąŮĹÄ)0ś˝wG=&]˙äÎľuÝÝ6,ç \ No newline at end of file diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected_remote/objects/e0/47462bda495acbe565c85b205d614f38c0a692 b/test/integration/pullRebaseInteractiveWithDrop/expected_remote/objects/e0/47462bda495acbe565c85b205d614f38c0a692 deleted file mode 100644 index 528db3bd1..000000000 Binary files a/test/integration/pullRebaseInteractiveWithDrop/expected_remote/objects/e0/47462bda495acbe565c85b205d614f38c0a692 and /dev/null differ diff --git a/test/integration/pullRebaseInteractiveWithDrop/expected_remote/packed-refs b/test/integration/pullRebaseInteractiveWithDrop/expected_remote/packed-refs deleted file mode 100644 index 27634cc2c..000000000 --- a/test/integration/pullRebaseInteractiveWithDrop/expected_remote/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# pack-refs with: peeled fully-peeled sorted -4589efcaf3024e841825bb289bb88eb0e4f8530a refs/heads/master diff --git a/test/integration/pullRebaseInteractiveWithDrop/setup.sh b/test/integration/pullRebaseInteractiveWithDrop/setup.sh index a0dce709f..fc90cd285 100644 --- a/test/integration/pullRebaseInteractiveWithDrop/setup.sh +++ b/test/integration/pullRebaseInteractiveWithDrop/setup.sh @@ -25,9 +25,9 @@ git add . git commit -am "myfile4" cd .. -git clone --bare ./actual actual_remote +git clone --bare ./repo origin -cd actual +cd repo git reset --hard HEAD~2 @@ -47,7 +47,7 @@ echo test > myfile7 git add . git commit -am "7" -git remote add origin ../actual_remote +git remote add origin ../origin git fetch origin git branch --set-upstream-to=origin/master master diff --git a/test/integration/push/expected/.git_keep/FETCH_HEAD b/test/integration/push/expected/.git_keep/FETCH_HEAD deleted file mode 100644 index ecbad2700..000000000 --- a/test/integration/push/expected/.git_keep/FETCH_HEAD +++ /dev/null @@ -1 +0,0 @@ -547f41a06ebd3bee30fbba3f43631810fa24f1bb branch 'master' of ../actual_remote diff --git a/test/integration/push/expected/.git_keep/config b/test/integration/push/expected/.git_keep/config deleted file mode 100644 index 821803a3e..000000000 --- a/test/integration/push/expected/.git_keep/config +++ /dev/null @@ -1,16 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true - precomposeunicode = true -[user] - email = CI@example.com - name = CI -[remote "origin"] - url = ../actual_remote - fetch = +refs/heads/*:refs/remotes/origin/* -[branch "master"] - remote = origin - merge = refs/heads/master diff --git a/test/integration/push/expected/.git_keep/index b/test/integration/push/expected/.git_keep/index deleted file mode 100644 index 7d490a7c8..000000000 Binary files a/test/integration/push/expected/.git_keep/index and /dev/null differ diff --git a/test/integration/push/expected/.git_keep/logs/HEAD b/test/integration/push/expected/.git_keep/logs/HEAD deleted file mode 100644 index 6c2301554..000000000 --- a/test/integration/push/expected/.git_keep/logs/HEAD +++ /dev/null @@ -1,4 +0,0 @@ -0000000000000000000000000000000000000000 eb831bc1251f71f602159d98f4550e380007ca4f CI 1634897746 +1100 commit (initial): myfile1 -eb831bc1251f71f602159d98f4550e380007ca4f 547f41a06ebd3bee30fbba3f43631810fa24f1bb CI 1634897746 +1100 commit: myfile2 -547f41a06ebd3bee30fbba3f43631810fa24f1bb a09547e07257ed0456f498fde1b8214152427384 CI 1634897746 +1100 commit: myfile3 -a09547e07257ed0456f498fde1b8214152427384 a6e580c7c3c4ea40bc311466d57a946bb3f77541 CI 1634897746 +1100 commit: myfile4 diff --git a/test/integration/push/expected/.git_keep/logs/refs/heads/master b/test/integration/push/expected/.git_keep/logs/refs/heads/master deleted file mode 100644 index 6c2301554..000000000 --- a/test/integration/push/expected/.git_keep/logs/refs/heads/master +++ /dev/null @@ -1,4 +0,0 @@ -0000000000000000000000000000000000000000 eb831bc1251f71f602159d98f4550e380007ca4f CI 1634897746 +1100 commit (initial): myfile1 -eb831bc1251f71f602159d98f4550e380007ca4f 547f41a06ebd3bee30fbba3f43631810fa24f1bb CI 1634897746 +1100 commit: myfile2 -547f41a06ebd3bee30fbba3f43631810fa24f1bb a09547e07257ed0456f498fde1b8214152427384 CI 1634897746 +1100 commit: myfile3 -a09547e07257ed0456f498fde1b8214152427384 a6e580c7c3c4ea40bc311466d57a946bb3f77541 CI 1634897746 +1100 commit: myfile4 diff --git a/test/integration/push/expected/.git_keep/logs/refs/remotes/origin/master b/test/integration/push/expected/.git_keep/logs/refs/remotes/origin/master deleted file mode 100644 index a82757c78..000000000 --- a/test/integration/push/expected/.git_keep/logs/refs/remotes/origin/master +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 547f41a06ebd3bee30fbba3f43631810fa24f1bb CI 1634897746 +1100 fetch origin: storing head -547f41a06ebd3bee30fbba3f43631810fa24f1bb a6e580c7c3c4ea40bc311466d57a946bb3f77541 CI 1634897748 +1100 update by push diff --git a/test/integration/push/expected/.git_keep/objects/54/7f41a06ebd3bee30fbba3f43631810fa24f1bb b/test/integration/push/expected/.git_keep/objects/54/7f41a06ebd3bee30fbba3f43631810fa24f1bb deleted file mode 100644 index 419d9ecdf..000000000 Binary files a/test/integration/push/expected/.git_keep/objects/54/7f41a06ebd3bee30fbba3f43631810fa24f1bb and /dev/null differ diff --git a/test/integration/push/expected/.git_keep/objects/a0/9547e07257ed0456f498fde1b8214152427384 b/test/integration/push/expected/.git_keep/objects/a0/9547e07257ed0456f498fde1b8214152427384 deleted file mode 100644 index 02e8b627c..000000000 --- a/test/integration/push/expected/.git_keep/objects/a0/9547e07257ed0456f498fde1b8214152427384 +++ /dev/null @@ -1,2 +0,0 @@ -xŤŽA -Â0E]çŮ ’éLÓ"BW=ĆL:…Ć–AooŽŕęĂă=řy+e©®tއŞďĚ)Âl„hLhĆ3 Ą“ tąo›Őí|č«úž#ŕUfU &ÂŘâ wd âř]źŰáÇÉßĆéˇ.űŞ—Ľ•»‡”®Ă@ŃźBpŤ¶SU˙Ô]ůÚ˛*ş`L;W \ No newline at end of file diff --git a/test/integration/push/expected/.git_keep/objects/a6/e580c7c3c4ea40bc311466d57a946bb3f77541 b/test/integration/push/expected/.git_keep/objects/a6/e580c7c3c4ea40bc311466d57a946bb3f77541 deleted file mode 100644 index e50d53ba1..000000000 --- a/test/integration/push/expected/.git_keep/objects/a6/e580c7c3c4ea40bc311466d57a946bb3f77541 +++ /dev/null @@ -1,4 +0,0 @@ -xŤÎM -Â0@a×9Eö‚Ě$ó“€ŕŞÇHŰ Ś-%‚Ţ^Źŕöń-Ţ´¶¶tŹ™}7óˇ -*CL@1U¤E8•Čb*"O…3ş­ěöěľ@fR ¬6±TʩΆc -HČ‚ĆD®Ľú}ÝýmđçŰpµwiŰĂNÓÚ.%RĘŞ$ţŕ~ő7ŐíOîÚ§.#÷Zč7Ë \ No newline at end of file diff --git a/test/integration/push/expected/.git_keep/objects/eb/831bc1251f71f602159d98f4550e380007ca4f b/test/integration/push/expected/.git_keep/objects/eb/831bc1251f71f602159d98f4550e380007ca4f deleted file mode 100644 index 4acb8b3ca..000000000 --- a/test/integration/push/expected/.git_keep/objects/eb/831bc1251f71f602159d98f4550e380007ca4f +++ /dev/null @@ -1,2 +0,0 @@ -xŤÍA -0@Ń®sŠŮJF§“Ą®<ĆL¨ŕ")´·×#tűyđS5[ ńĄíŞŕ•SńÂK4f"ĹČ9b'X-Ôg¦"éŢ9ů´WÝašá1ÍŁ~ĹŢ›ŢRµ' ÷‡áŠč˝;ë9iú'wö+ë¦č6,ç \ No newline at end of file diff --git a/test/integration/push/expected/.git_keep/refs/heads/master b/test/integration/push/expected/.git_keep/refs/heads/master deleted file mode 100644 index ccbf04e76..000000000 --- a/test/integration/push/expected/.git_keep/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -a6e580c7c3c4ea40bc311466d57a946bb3f77541 diff --git a/test/integration/push/expected/.git_keep/refs/remotes/origin/master b/test/integration/push/expected/.git_keep/refs/remotes/origin/master deleted file mode 100644 index ccbf04e76..000000000 --- a/test/integration/push/expected/.git_keep/refs/remotes/origin/master +++ /dev/null @@ -1 +0,0 @@ -a6e580c7c3c4ea40bc311466d57a946bb3f77541 diff --git a/test/integration/rebase3/expected/.git_keep/HEAD b/test/integration/push/expected/origin/HEAD similarity index 100% rename from test/integration/rebase3/expected/.git_keep/HEAD rename to test/integration/push/expected/origin/HEAD diff --git a/test/integration/push/expected/origin/config b/test/integration/push/expected/origin/config new file mode 100644 index 000000000..f190da0bc --- /dev/null +++ b/test/integration/push/expected/origin/config @@ -0,0 +1,8 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/push/actual/./repo diff --git a/test/integration/pushWithCredentials/expected_remote/description b/test/integration/push/expected/origin/description similarity index 100% rename from test/integration/pushWithCredentials/expected_remote/description rename to test/integration/push/expected/origin/description diff --git a/test/integration/pushNoFollowTags/expected/.git_keep/info/exclude b/test/integration/push/expected/origin/info/exclude similarity index 100% rename from test/integration/pushNoFollowTags/expected/.git_keep/info/exclude rename to test/integration/push/expected/origin/info/exclude diff --git a/test/integration/pushNoFollowTags/expected_remote/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/push/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/pushNoFollowTags/expected_remote/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/push/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/push/expected/origin/objects/14/6ca480a776a466024a08d273987c4b2e71f23b b/test/integration/push/expected/origin/objects/14/6ca480a776a466024a08d273987c4b2e71f23b new file mode 100644 index 000000000..a3d79e190 --- /dev/null +++ b/test/integration/push/expected/origin/objects/14/6ca480a776a466024a08d273987c4b2e71f23b @@ -0,0 +1,2 @@ +xŤÎA +Â0@Q×9Eö‚d&ÓIDW=F:ť`ÁX)ôöön?ońummé„}3ó%E‚2H ólV…ĹXęÄ‘32ĎS¨HŔîU6{vꀆ”$F٬*‰RČ(UBŚ͕wżŻ›żŤţ|Żö)íő°“®íâ)GĘŮBp{ݧşýÉ]űÖĺač~;Ś9 \ No newline at end of file diff --git a/test/integration/pushNoFollowTags/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/push/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/pushNoFollowTags/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/push/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/pushFollowTags/expected_remote/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/push/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/pushFollowTags/expected_remote/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/push/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/pushAndSetUpstream/expected/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 b/test/integration/push/expected/origin/objects/2f/6174050380438f14b16658a356e762435ca591 similarity index 100% rename from test/integration/pushAndSetUpstream/expected/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 rename to test/integration/push/expected/origin/objects/2f/6174050380438f14b16658a356e762435ca591 diff --git a/test/integration/push/expected/origin/objects/69/fef9300b95338821093ec2dfb6e2974d303510 b/test/integration/push/expected/origin/objects/69/fef9300b95338821093ec2dfb6e2974d303510 new file mode 100644 index 000000000..ea7faca6b Binary files /dev/null and b/test/integration/push/expected/origin/objects/69/fef9300b95338821093ec2dfb6e2974d303510 differ diff --git a/test/integration/push/expected/origin/objects/71/4500c4933e4316cc9747711829560cc42c2f8e b/test/integration/push/expected/origin/objects/71/4500c4933e4316cc9747711829560cc42c2f8e new file mode 100644 index 000000000..ec5ba1314 --- /dev/null +++ b/test/integration/push/expected/origin/objects/71/4500c4933e4316cc9747711829560cc42c2f8e @@ -0,0 +1,2 @@ +xŤÍA +0@Ń®sŠŮJ&NÇ))¸ň1™PÁ!")ŘŰ×#tűyđS5[ ńĄíŞŕ•Sń‘çţˇ’‰…ł`Xzš©ËL%¦{pńÓŢu‡q‚ç8˝ô¶­zKŐ@&éHB¸"zďÎzNšţÉť}˲*ş3,Ő \ No newline at end of file diff --git a/test/integration/pushTag/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/push/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/pushTag/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/push/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/pushFollowTags/expected_remote/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/push/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/pushFollowTags/expected_remote/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/push/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/pushWithCredentials/expected_remote/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/push/expected/origin/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/pushWithCredentials/expected_remote/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/push/expected/origin/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/pushNoFollowTags/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/push/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/pushNoFollowTags/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/push/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/push/expected/origin/objects/ee/53190e06796d55bf236a35d45249c90eff8594 b/test/integration/push/expected/origin/objects/ee/53190e06796d55bf236a35d45249c90eff8594 new file mode 100644 index 000000000..ca0b896d7 Binary files /dev/null and b/test/integration/push/expected/origin/objects/ee/53190e06796d55bf236a35d45249c90eff8594 differ diff --git a/test/integration/push/expected/origin/packed-refs b/test/integration/push/expected/origin/packed-refs new file mode 100644 index 000000000..418f3935f --- /dev/null +++ b/test/integration/push/expected/origin/packed-refs @@ -0,0 +1,2 @@ +# pack-refs with: peeled fully-peeled sorted +146ca480a776a466024a08d273987c4b2e71f23b refs/heads/master diff --git a/test/integration/push/expected/origin/refs/heads/master b/test/integration/push/expected/origin/refs/heads/master new file mode 100644 index 000000000..b77d8cdb7 --- /dev/null +++ b/test/integration/push/expected/origin/refs/heads/master @@ -0,0 +1 @@ +69fef9300b95338821093ec2dfb6e2974d303510 diff --git a/test/integration/pushWithCredentials/expected/.git_keep/COMMIT_EDITMSG b/test/integration/push/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/pushWithCredentials/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/push/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/push/expected/repo/.git_keep/FETCH_HEAD b/test/integration/push/expected/repo/.git_keep/FETCH_HEAD new file mode 100644 index 000000000..26ee184b7 --- /dev/null +++ b/test/integration/push/expected/repo/.git_keep/FETCH_HEAD @@ -0,0 +1 @@ +146ca480a776a466024a08d273987c4b2e71f23b branch 'master' of ../origin diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/HEAD b/test/integration/push/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/HEAD rename to test/integration/push/expected/repo/.git_keep/HEAD diff --git a/test/integration/push/expected/repo/.git_keep/config b/test/integration/push/expected/repo/.git_keep/config new file mode 100644 index 000000000..7721ae814 --- /dev/null +++ b/test/integration/push/expected/repo/.git_keep/config @@ -0,0 +1,16 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[user] + email = CI@example.com + name = CI +[remote "origin"] + url = ../origin + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "master"] + remote = origin + merge = refs/heads/master diff --git a/test/integration/rebase/expected/.git_keep/description b/test/integration/push/expected/repo/.git_keep/description similarity index 100% rename from test/integration/rebase/expected/.git_keep/description rename to test/integration/push/expected/repo/.git_keep/description diff --git a/test/integration/push/expected/repo/.git_keep/index b/test/integration/push/expected/repo/.git_keep/index new file mode 100644 index 000000000..b5391b42b Binary files /dev/null and b/test/integration/push/expected/repo/.git_keep/index differ diff --git a/test/integration/pushNoFollowTags/expected_remote/info/exclude b/test/integration/push/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/pushNoFollowTags/expected_remote/info/exclude rename to test/integration/push/expected/repo/.git_keep/info/exclude diff --git a/test/integration/push/expected/repo/.git_keep/logs/HEAD b/test/integration/push/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..859603aeb --- /dev/null +++ b/test/integration/push/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,4 @@ +0000000000000000000000000000000000000000 714500c4933e4316cc9747711829560cc42c2f8e CI 1648348228 +1100 commit (initial): myfile1 +714500c4933e4316cc9747711829560cc42c2f8e 146ca480a776a466024a08d273987c4b2e71f23b CI 1648348228 +1100 commit: myfile2 +146ca480a776a466024a08d273987c4b2e71f23b ee53190e06796d55bf236a35d45249c90eff8594 CI 1648348228 +1100 commit: myfile3 +ee53190e06796d55bf236a35d45249c90eff8594 69fef9300b95338821093ec2dfb6e2974d303510 CI 1648348228 +1100 commit: myfile4 diff --git a/test/integration/push/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/push/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..859603aeb --- /dev/null +++ b/test/integration/push/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,4 @@ +0000000000000000000000000000000000000000 714500c4933e4316cc9747711829560cc42c2f8e CI 1648348228 +1100 commit (initial): myfile1 +714500c4933e4316cc9747711829560cc42c2f8e 146ca480a776a466024a08d273987c4b2e71f23b CI 1648348228 +1100 commit: myfile2 +146ca480a776a466024a08d273987c4b2e71f23b ee53190e06796d55bf236a35d45249c90eff8594 CI 1648348228 +1100 commit: myfile3 +ee53190e06796d55bf236a35d45249c90eff8594 69fef9300b95338821093ec2dfb6e2974d303510 CI 1648348228 +1100 commit: myfile4 diff --git a/test/integration/push/expected/repo/.git_keep/logs/refs/remotes/origin/master b/test/integration/push/expected/repo/.git_keep/logs/refs/remotes/origin/master new file mode 100644 index 000000000..03b67d245 --- /dev/null +++ b/test/integration/push/expected/repo/.git_keep/logs/refs/remotes/origin/master @@ -0,0 +1,2 @@ +0000000000000000000000000000000000000000 146ca480a776a466024a08d273987c4b2e71f23b CI 1648348228 +1100 fetch origin: storing head +146ca480a776a466024a08d273987c4b2e71f23b 69fef9300b95338821093ec2dfb6e2974d303510 CI 1648348229 +1100 update by push diff --git a/test/integration/pushTag/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/push/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/pushTag/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/push/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/push/expected/repo/.git_keep/objects/14/6ca480a776a466024a08d273987c4b2e71f23b b/test/integration/push/expected/repo/.git_keep/objects/14/6ca480a776a466024a08d273987c4b2e71f23b new file mode 100644 index 000000000..a3d79e190 --- /dev/null +++ b/test/integration/push/expected/repo/.git_keep/objects/14/6ca480a776a466024a08d273987c4b2e71f23b @@ -0,0 +1,2 @@ +xŤÎA +Â0@Q×9Eö‚d&ÓIDW=F:ť`ÁX)ôöön?ońummé„}3ó%E‚2H ólV…ĹXęÄ‘32ĎS¨HŔîU6{vꀆ”$F٬*‰RČ(UBŚ͕wżŻ›żŤţ|Żö)íő°“®íâ)GĘŮBp{ݧşýÉ]űÖĺač~;Ś9 \ No newline at end of file diff --git a/test/integration/pushNoFollowTags/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/push/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/pushNoFollowTags/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/push/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/pushNoFollowTags/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/push/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/pushNoFollowTags/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/push/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/pushAndSetUpstream/expected_remote/objects/2f/6174050380438f14b16658a356e762435ca591 b/test/integration/push/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 similarity index 100% rename from test/integration/pushAndSetUpstream/expected_remote/objects/2f/6174050380438f14b16658a356e762435ca591 rename to test/integration/push/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 diff --git a/test/integration/push/expected/repo/.git_keep/objects/69/fef9300b95338821093ec2dfb6e2974d303510 b/test/integration/push/expected/repo/.git_keep/objects/69/fef9300b95338821093ec2dfb6e2974d303510 new file mode 100644 index 000000000..ea7faca6b Binary files /dev/null and b/test/integration/push/expected/repo/.git_keep/objects/69/fef9300b95338821093ec2dfb6e2974d303510 differ diff --git a/test/integration/push/expected/repo/.git_keep/objects/71/4500c4933e4316cc9747711829560cc42c2f8e b/test/integration/push/expected/repo/.git_keep/objects/71/4500c4933e4316cc9747711829560cc42c2f8e new file mode 100644 index 000000000..ec5ba1314 --- /dev/null +++ b/test/integration/push/expected/repo/.git_keep/objects/71/4500c4933e4316cc9747711829560cc42c2f8e @@ -0,0 +1,2 @@ +xŤÍA +0@Ń®sŠŮJ&NÇ))¸ň1™PÁ!")ŘŰ×#tűyđS5[ ńĄíŞŕ•Sń‘çţˇ’‰…ł`Xzš©ËL%¦{pńÓŢu‡q‚ç8˝ô¶­zKŐ@&éHB¸"zďÎzNšţÉť}˲*ş3,Ő \ No newline at end of file diff --git a/test/integration/pushTag/expected_remote/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/push/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/pushTag/expected_remote/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/push/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/pushNoFollowTags/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/push/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/pushNoFollowTags/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/push/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/rebase2/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/push/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/rebase2/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/push/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/pushNoFollowTags/expected_remote/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/push/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/pushNoFollowTags/expected_remote/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/push/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/push/expected/repo/.git_keep/objects/ee/53190e06796d55bf236a35d45249c90eff8594 b/test/integration/push/expected/repo/.git_keep/objects/ee/53190e06796d55bf236a35d45249c90eff8594 new file mode 100644 index 000000000..ca0b896d7 Binary files /dev/null and b/test/integration/push/expected/repo/.git_keep/objects/ee/53190e06796d55bf236a35d45249c90eff8594 differ diff --git a/test/integration/push/expected/repo/.git_keep/refs/heads/master b/test/integration/push/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..b77d8cdb7 --- /dev/null +++ b/test/integration/push/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +69fef9300b95338821093ec2dfb6e2974d303510 diff --git a/test/integration/push/expected/repo/.git_keep/refs/remotes/origin/master b/test/integration/push/expected/repo/.git_keep/refs/remotes/origin/master new file mode 100644 index 000000000..b77d8cdb7 --- /dev/null +++ b/test/integration/push/expected/repo/.git_keep/refs/remotes/origin/master @@ -0,0 +1 @@ +69fef9300b95338821093ec2dfb6e2974d303510 diff --git a/test/integration/searching/expected/myfile1 b/test/integration/push/expected/repo/myfile1 similarity index 100% rename from test/integration/searching/expected/myfile1 rename to test/integration/push/expected/repo/myfile1 diff --git a/test/integration/pushNoFollowTags/expected/myfile2 b/test/integration/push/expected/repo/myfile2 similarity index 100% rename from test/integration/pushNoFollowTags/expected/myfile2 rename to test/integration/push/expected/repo/myfile2 diff --git a/test/integration/pushFollowTags/expected/myfile3 b/test/integration/push/expected/repo/myfile3 similarity index 100% rename from test/integration/pushFollowTags/expected/myfile3 rename to test/integration/push/expected/repo/myfile3 diff --git a/test/integration/pushAndSetUpstream/expected/myfile4 b/test/integration/push/expected/repo/myfile4 similarity index 100% rename from test/integration/pushAndSetUpstream/expected/myfile4 rename to test/integration/push/expected/repo/myfile4 diff --git a/test/integration/push/expected_remote/config b/test/integration/push/expected_remote/config deleted file mode 100644 index 26275994b..000000000 --- a/test/integration/push/expected_remote/config +++ /dev/null @@ -1,8 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = true - ignorecase = true - precomposeunicode = true -[remote "origin"] - url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/push/./actual diff --git a/test/integration/push/expected_remote/objects/54/7f41a06ebd3bee30fbba3f43631810fa24f1bb b/test/integration/push/expected_remote/objects/54/7f41a06ebd3bee30fbba3f43631810fa24f1bb deleted file mode 100644 index 419d9ecdf..000000000 Binary files a/test/integration/push/expected_remote/objects/54/7f41a06ebd3bee30fbba3f43631810fa24f1bb and /dev/null differ diff --git a/test/integration/push/expected_remote/objects/a0/9547e07257ed0456f498fde1b8214152427384 b/test/integration/push/expected_remote/objects/a0/9547e07257ed0456f498fde1b8214152427384 deleted file mode 100644 index 02e8b627c..000000000 --- a/test/integration/push/expected_remote/objects/a0/9547e07257ed0456f498fde1b8214152427384 +++ /dev/null @@ -1,2 +0,0 @@ -xŤŽA -Â0E]çŮ ’éLÓ"BW=ĆL:…Ć–AooŽŕęĂă=řy+e©®tއŞďĚ)Âl„hLhĆ3 Ą“ tąo›Őí|č«úž#ŕUfU &ÂŘâ wd âř]źŰáÇÉßĆéˇ.űŞ—Ľ•»‡”®Ă@ŃźBpŤ¶SU˙Ô]ůÚ˛*ş`L;W \ No newline at end of file diff --git a/test/integration/push/expected_remote/objects/a6/e580c7c3c4ea40bc311466d57a946bb3f77541 b/test/integration/push/expected_remote/objects/a6/e580c7c3c4ea40bc311466d57a946bb3f77541 deleted file mode 100644 index e50d53ba1..000000000 --- a/test/integration/push/expected_remote/objects/a6/e580c7c3c4ea40bc311466d57a946bb3f77541 +++ /dev/null @@ -1,4 +0,0 @@ -xŤÎM -Â0@a×9Eö‚Ě$ó“€ŕŞÇHŰ Ś-%‚Ţ^Źŕöń-Ţ´¶¶tŹ™}7óˇ -*CL@1U¤E8•Čb*"O…3ş­ěöěľ@fR ¬6±TʩΆc -HČ‚ĆD®Ľú}ÝýmđçŰpµwiŰĂNÓÚ.%RĘŞ$ţŕ~ő7ŐíOîÚ§.#÷Zč7Ë \ No newline at end of file diff --git a/test/integration/push/expected_remote/objects/eb/831bc1251f71f602159d98f4550e380007ca4f b/test/integration/push/expected_remote/objects/eb/831bc1251f71f602159d98f4550e380007ca4f deleted file mode 100644 index 4acb8b3ca..000000000 --- a/test/integration/push/expected_remote/objects/eb/831bc1251f71f602159d98f4550e380007ca4f +++ /dev/null @@ -1,2 +0,0 @@ -xŤÍA -0@Ń®sŠŮJF§“Ą®<ĆL¨ŕ")´·×#tűyđS5[ ńĄíŞŕ•SńÂK4f"ĹČ9b'X-Ôg¦"éŢ9ů´WÝašá1ÍŁ~ĹŢ›ŢRµ' ÷‡áŠč˝;ë9iú'wö+ë¦č6,ç \ No newline at end of file diff --git a/test/integration/push/expected_remote/packed-refs b/test/integration/push/expected_remote/packed-refs deleted file mode 100644 index 0c4bde9c0..000000000 --- a/test/integration/push/expected_remote/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# pack-refs with: peeled fully-peeled sorted -547f41a06ebd3bee30fbba3f43631810fa24f1bb refs/heads/master diff --git a/test/integration/push/expected_remote/refs/heads/master b/test/integration/push/expected_remote/refs/heads/master deleted file mode 100644 index ccbf04e76..000000000 --- a/test/integration/push/expected_remote/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -a6e580c7c3c4ea40bc311466d57a946bb3f77541 diff --git a/test/integration/push/setup.sh b/test/integration/push/setup.sh index 075e9afd9..ec135f72e 100644 --- a/test/integration/push/setup.sh +++ b/test/integration/push/setup.sh @@ -19,9 +19,9 @@ git add . git commit -am "myfile2" cd .. -git clone --bare ./actual actual_remote +git clone --bare ./repo origin -cd actual +cd repo echo test3 > myfile3 git add . @@ -30,6 +30,6 @@ echo test4 > myfile4 git add . git commit -am "myfile4" -git remote add origin ../actual_remote +git remote add origin ../origin git fetch origin git branch --set-upstream-to=origin/master master diff --git a/test/integration/pushAndSetUpstream/expected/.git_keep/FETCH_HEAD b/test/integration/pushAndSetUpstream/expected/.git_keep/FETCH_HEAD deleted file mode 100644 index 989da164a..000000000 --- a/test/integration/pushAndSetUpstream/expected/.git_keep/FETCH_HEAD +++ /dev/null @@ -1 +0,0 @@ -dab77371cf53420955fc9baeb84303414f7e4a60 not-for-merge branch 'master' of ../actual_remote diff --git a/test/integration/pushAndSetUpstream/expected/.git_keep/config b/test/integration/pushAndSetUpstream/expected/.git_keep/config deleted file mode 100644 index 7b5eaec7c..000000000 --- a/test/integration/pushAndSetUpstream/expected/.git_keep/config +++ /dev/null @@ -1,18 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true - precomposeunicode = true -[user] - email = CI@example.com - name = CI -[remote "origin"] - url = ../actual_remote - fetch = +refs/heads/*:refs/remotes/origin/* -[push] - default = nothing -[branch "test"] - remote = origin - merge = refs/heads/test diff --git a/test/integration/pushAndSetUpstream/expected/.git_keep/index b/test/integration/pushAndSetUpstream/expected/.git_keep/index deleted file mode 100644 index b9df8bc71..000000000 Binary files a/test/integration/pushAndSetUpstream/expected/.git_keep/index and /dev/null differ diff --git a/test/integration/pushAndSetUpstream/expected/.git_keep/logs/HEAD b/test/integration/pushAndSetUpstream/expected/.git_keep/logs/HEAD deleted file mode 100644 index ab1e651fb..000000000 --- a/test/integration/pushAndSetUpstream/expected/.git_keep/logs/HEAD +++ /dev/null @@ -1,5 +0,0 @@ -0000000000000000000000000000000000000000 65c52315dc238c164b914369f49bd70882cc1d85 CI 1634897751 +1100 commit (initial): myfile1 -65c52315dc238c164b914369f49bd70882cc1d85 dab77371cf53420955fc9baeb84303414f7e4a60 CI 1634897751 +1100 commit: myfile2 -dab77371cf53420955fc9baeb84303414f7e4a60 dbd679941d871665b7ff70fffe6116725e56e270 CI 1634897751 +1100 commit: myfile3 -dbd679941d871665b7ff70fffe6116725e56e270 707a2a0835c897496934849bf6e0815593b140b3 CI 1634897751 +1100 commit: myfile4 -707a2a0835c897496934849bf6e0815593b140b3 707a2a0835c897496934849bf6e0815593b140b3 CI 1634897753 +1100 checkout: moving from master to test diff --git a/test/integration/pushAndSetUpstream/expected/.git_keep/logs/refs/heads/master b/test/integration/pushAndSetUpstream/expected/.git_keep/logs/refs/heads/master deleted file mode 100644 index 0efb79581..000000000 --- a/test/integration/pushAndSetUpstream/expected/.git_keep/logs/refs/heads/master +++ /dev/null @@ -1,4 +0,0 @@ -0000000000000000000000000000000000000000 65c52315dc238c164b914369f49bd70882cc1d85 CI 1634897751 +1100 commit (initial): myfile1 -65c52315dc238c164b914369f49bd70882cc1d85 dab77371cf53420955fc9baeb84303414f7e4a60 CI 1634897751 +1100 commit: myfile2 -dab77371cf53420955fc9baeb84303414f7e4a60 dbd679941d871665b7ff70fffe6116725e56e270 CI 1634897751 +1100 commit: myfile3 -dbd679941d871665b7ff70fffe6116725e56e270 707a2a0835c897496934849bf6e0815593b140b3 CI 1634897751 +1100 commit: myfile4 diff --git a/test/integration/pushAndSetUpstream/expected/.git_keep/logs/refs/heads/test b/test/integration/pushAndSetUpstream/expected/.git_keep/logs/refs/heads/test deleted file mode 100644 index c22f24f3c..000000000 --- a/test/integration/pushAndSetUpstream/expected/.git_keep/logs/refs/heads/test +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 707a2a0835c897496934849bf6e0815593b140b3 CI 1634897753 +1100 branch: Created from master diff --git a/test/integration/pushAndSetUpstream/expected/.git_keep/logs/refs/remotes/origin/master b/test/integration/pushAndSetUpstream/expected/.git_keep/logs/refs/remotes/origin/master deleted file mode 100644 index 2b03e0efd..000000000 --- a/test/integration/pushAndSetUpstream/expected/.git_keep/logs/refs/remotes/origin/master +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 dab77371cf53420955fc9baeb84303414f7e4a60 CI 1634897751 +1100 fetch origin: storing head diff --git a/test/integration/pushAndSetUpstream/expected/.git_keep/logs/refs/remotes/origin/test b/test/integration/pushAndSetUpstream/expected/.git_keep/logs/refs/remotes/origin/test deleted file mode 100644 index 1e7209170..000000000 --- a/test/integration/pushAndSetUpstream/expected/.git_keep/logs/refs/remotes/origin/test +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 707a2a0835c897496934849bf6e0815593b140b3 CI 1634897754 +1100 update by push diff --git a/test/integration/pushAndSetUpstream/expected/.git_keep/objects/65/c52315dc238c164b914369f49bd70882cc1d85 b/test/integration/pushAndSetUpstream/expected/.git_keep/objects/65/c52315dc238c164b914369f49bd70882cc1d85 deleted file mode 100644 index 9f235e0ed..000000000 Binary files a/test/integration/pushAndSetUpstream/expected/.git_keep/objects/65/c52315dc238c164b914369f49bd70882cc1d85 and /dev/null differ diff --git a/test/integration/pushAndSetUpstream/expected/.git_keep/objects/70/7a2a0835c897496934849bf6e0815593b140b3 b/test/integration/pushAndSetUpstream/expected/.git_keep/objects/70/7a2a0835c897496934849bf6e0815593b140b3 deleted file mode 100644 index 3556acfa5..000000000 Binary files a/test/integration/pushAndSetUpstream/expected/.git_keep/objects/70/7a2a0835c897496934849bf6e0815593b140b3 and /dev/null differ diff --git a/test/integration/pushAndSetUpstream/expected/.git_keep/objects/da/b77371cf53420955fc9baeb84303414f7e4a60 b/test/integration/pushAndSetUpstream/expected/.git_keep/objects/da/b77371cf53420955fc9baeb84303414f7e4a60 deleted file mode 100644 index fd638ab15..000000000 Binary files a/test/integration/pushAndSetUpstream/expected/.git_keep/objects/da/b77371cf53420955fc9baeb84303414f7e4a60 and /dev/null differ diff --git a/test/integration/pushAndSetUpstream/expected/.git_keep/objects/db/d679941d871665b7ff70fffe6116725e56e270 b/test/integration/pushAndSetUpstream/expected/.git_keep/objects/db/d679941d871665b7ff70fffe6116725e56e270 deleted file mode 100644 index 49cc241d7..000000000 Binary files a/test/integration/pushAndSetUpstream/expected/.git_keep/objects/db/d679941d871665b7ff70fffe6116725e56e270 and /dev/null differ diff --git a/test/integration/pushAndSetUpstream/expected/.git_keep/refs/heads/master b/test/integration/pushAndSetUpstream/expected/.git_keep/refs/heads/master deleted file mode 100644 index 683d3d319..000000000 --- a/test/integration/pushAndSetUpstream/expected/.git_keep/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -707a2a0835c897496934849bf6e0815593b140b3 diff --git a/test/integration/pushAndSetUpstream/expected/.git_keep/refs/heads/test b/test/integration/pushAndSetUpstream/expected/.git_keep/refs/heads/test deleted file mode 100644 index 683d3d319..000000000 --- a/test/integration/pushAndSetUpstream/expected/.git_keep/refs/heads/test +++ /dev/null @@ -1 +0,0 @@ -707a2a0835c897496934849bf6e0815593b140b3 diff --git a/test/integration/pushAndSetUpstream/expected/.git_keep/refs/remotes/origin/master b/test/integration/pushAndSetUpstream/expected/.git_keep/refs/remotes/origin/master deleted file mode 100644 index 874cd1689..000000000 --- a/test/integration/pushAndSetUpstream/expected/.git_keep/refs/remotes/origin/master +++ /dev/null @@ -1 +0,0 @@ -dab77371cf53420955fc9baeb84303414f7e4a60 diff --git a/test/integration/pushAndSetUpstream/expected/.git_keep/refs/remotes/origin/test b/test/integration/pushAndSetUpstream/expected/.git_keep/refs/remotes/origin/test deleted file mode 100644 index 683d3d319..000000000 --- a/test/integration/pushAndSetUpstream/expected/.git_keep/refs/remotes/origin/test +++ /dev/null @@ -1 +0,0 @@ -707a2a0835c897496934849bf6e0815593b140b3 diff --git a/test/integration/rebaseFixups/expected/.git_keep/HEAD b/test/integration/pushAndSetUpstream/expected/origin/HEAD similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/HEAD rename to test/integration/pushAndSetUpstream/expected/origin/HEAD diff --git a/test/integration/pushAndSetUpstream/expected/origin/config b/test/integration/pushAndSetUpstream/expected/origin/config new file mode 100644 index 000000000..18e379b43 --- /dev/null +++ b/test/integration/pushAndSetUpstream/expected/origin/config @@ -0,0 +1,8 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/pushAndSetUpstream/actual/./repo diff --git a/test/integration/rebase2/expected/.git_keep/description b/test/integration/pushAndSetUpstream/expected/origin/description similarity index 100% rename from test/integration/rebase2/expected/.git_keep/description rename to test/integration/pushAndSetUpstream/expected/origin/description diff --git a/test/integration/pushTag/expected/.git_keep/info/exclude b/test/integration/pushAndSetUpstream/expected/origin/info/exclude similarity index 100% rename from test/integration/pushTag/expected/.git_keep/info/exclude rename to test/integration/pushAndSetUpstream/expected/origin/info/exclude diff --git a/test/integration/pushTag/expected_remote/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/pushAndSetUpstream/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/pushTag/expected_remote/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/pushAndSetUpstream/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/pushTag/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/pushAndSetUpstream/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/pushTag/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/pushAndSetUpstream/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/pushNoFollowTags/expected_remote/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/pushAndSetUpstream/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/pushNoFollowTags/expected_remote/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/pushAndSetUpstream/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 b/test/integration/pushAndSetUpstream/expected/origin/objects/2f/6174050380438f14b16658a356e762435ca591 similarity index 100% rename from test/integration/pushAndSetUpstreamDefault/expected/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 rename to test/integration/pushAndSetUpstream/expected/origin/objects/2f/6174050380438f14b16658a356e762435ca591 diff --git a/test/integration/pushAndSetUpstream/expected/origin/objects/97/8360cc5c0a9115bf3db5f10196cd135e1be962 b/test/integration/pushAndSetUpstream/expected/origin/objects/97/8360cc5c0a9115bf3db5f10196cd135e1be962 new file mode 100644 index 000000000..dd4d890c2 Binary files /dev/null and b/test/integration/pushAndSetUpstream/expected/origin/objects/97/8360cc5c0a9115bf3db5f10196cd135e1be962 differ diff --git a/test/integration/pushWithCredentials/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/pushAndSetUpstream/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/pushWithCredentials/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/pushAndSetUpstream/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/pushNoFollowTags/expected_remote/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/pushAndSetUpstream/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/pushNoFollowTags/expected_remote/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/pushAndSetUpstream/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/rebase3/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/pushAndSetUpstream/expected/origin/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/rebase3/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/pushAndSetUpstream/expected/origin/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/pushAndSetUpstream/expected/origin/objects/d7/7ec09ecf2391f9b76e54de98187095cd2edf9d b/test/integration/pushAndSetUpstream/expected/origin/objects/d7/7ec09ecf2391f9b76e54de98187095cd2edf9d new file mode 100644 index 000000000..d8f35d219 --- /dev/null +++ b/test/integration/pushAndSetUpstream/expected/origin/objects/d7/7ec09ecf2391f9b76e54de98187095cd2edf9d @@ -0,0 +1,2 @@ +xŤÎM +Â0@a×9Eö‚d2?MADčŞÇHÚ,[J˝˝=‚ŰÇ·xÓZëŇ<ôtj»ŞŹ&ĐQŕ€)&* Â)#‹v yĘÜŰň®ŻćŐ Éz•¨ŚÄ€ĄP‰Ŕ4gŇyFĐ\~·Çşűaô×aĽë'×í©—i­7B )Ĺý wÔcŞéźÜŐŻ-O%÷×r8Ę \ No newline at end of file diff --git a/test/integration/pushWithCredentials/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/pushAndSetUpstream/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/pushWithCredentials/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/pushAndSetUpstream/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/pushAndSetUpstream/expected/origin/objects/e0/c356303c1b9b8fbe6acddb3e58f28b52348c60 b/test/integration/pushAndSetUpstream/expected/origin/objects/e0/c356303c1b9b8fbe6acddb3e58f28b52348c60 new file mode 100644 index 000000000..33e4be4e0 --- /dev/null +++ b/test/integration/pushAndSetUpstream/expected/origin/objects/e0/c356303c1b9b8fbe6acddb3e58f28b52348c60 @@ -0,0 +1,3 @@ +xŤÍA +Ă @Ń®=Ĺě ĹŃé8… +YĺFG‚…ôöÍşý<ř©Őşt@âKßUÁ*§b#Ďᡒ‰…ł ‹XÍä3S‰éîLüôwŰaśŕ9N/=bÝV˝ĄV@&ń$.x¸"ZkÎzNşţÉMý–eU4?3‹,Ő \ No newline at end of file diff --git a/test/integration/pushAndSetUpstream/expected/origin/objects/ef/f34f9e6233e534513bb4b2154da4edd316283f b/test/integration/pushAndSetUpstream/expected/origin/objects/ef/f34f9e6233e534513bb4b2154da4edd316283f new file mode 100644 index 000000000..e9e90781f --- /dev/null +++ b/test/integration/pushAndSetUpstream/expected/origin/objects/ef/f34f9e6233e534513bb4b2154da4edd316283f @@ -0,0 +1,2 @@ +xŤŽA +Ă E»öî ĹqÔ(„RČ*ÇĐÉ Ä& ííëşzđx>íµ®MCr—v2k[`@Šq’ŠäP˘ˇX,ůNbuä“_M§!b0Ô­É ŔÁĄx)Pßy†Â)X•ßíąźzšő8Íţäzl|Ł˝Ţ5ŃE; ľŁşí§˙™«ú•ucT? *:› \ No newline at end of file diff --git a/test/integration/pushAndSetUpstream/expected/origin/packed-refs b/test/integration/pushAndSetUpstream/expected/origin/packed-refs new file mode 100644 index 000000000..7b481f224 --- /dev/null +++ b/test/integration/pushAndSetUpstream/expected/origin/packed-refs @@ -0,0 +1,2 @@ +# pack-refs with: peeled fully-peeled sorted +978360cc5c0a9115bf3db5f10196cd135e1be962 refs/heads/master diff --git a/test/integration/pushAndSetUpstream/expected/origin/refs/heads/test b/test/integration/pushAndSetUpstream/expected/origin/refs/heads/test new file mode 100644 index 000000000..21ce8deb5 --- /dev/null +++ b/test/integration/pushAndSetUpstream/expected/origin/refs/heads/test @@ -0,0 +1 @@ +d77ec09ecf2391f9b76e54de98187095cd2edf9d diff --git a/test/integration/setUpstream/expected/.git_keep/COMMIT_EDITMSG b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/setUpstream/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/pushAndSetUpstream/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/pushAndSetUpstream/expected/repo/.git_keep/FETCH_HEAD b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/FETCH_HEAD new file mode 100644 index 000000000..0ff8d1b7a --- /dev/null +++ b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/FETCH_HEAD @@ -0,0 +1 @@ +978360cc5c0a9115bf3db5f10196cd135e1be962 not-for-merge branch 'master' of ../origin diff --git a/test/integration/pushAndSetUpstream/expected/.git_keep/HEAD b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/pushAndSetUpstream/expected/.git_keep/HEAD rename to test/integration/pushAndSetUpstream/expected/repo/.git_keep/HEAD diff --git a/test/integration/pushAndSetUpstream/expected/repo/.git_keep/config b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/config new file mode 100644 index 000000000..2b6dd06c7 --- /dev/null +++ b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/config @@ -0,0 +1,18 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[user] + email = CI@example.com + name = CI +[remote "origin"] + url = ../origin + fetch = +refs/heads/*:refs/remotes/origin/* +[push] + default = nothing +[branch "test"] + remote = origin + merge = refs/heads/test diff --git a/test/integration/rebase3/expected/.git_keep/description b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/description similarity index 100% rename from test/integration/rebase3/expected/.git_keep/description rename to test/integration/pushAndSetUpstream/expected/repo/.git_keep/description diff --git a/test/integration/pushAndSetUpstream/expected/repo/.git_keep/index b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/index new file mode 100644 index 000000000..701b9194f Binary files /dev/null and b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/index differ diff --git a/test/integration/pushTag/expected_remote/info/exclude b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/pushTag/expected_remote/info/exclude rename to test/integration/pushAndSetUpstream/expected/repo/.git_keep/info/exclude diff --git a/test/integration/pushAndSetUpstream/expected/repo/.git_keep/logs/HEAD b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..b97dee17d --- /dev/null +++ b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,5 @@ +0000000000000000000000000000000000000000 e0c356303c1b9b8fbe6acddb3e58f28b52348c60 CI 1648348273 +1100 commit (initial): myfile1 +e0c356303c1b9b8fbe6acddb3e58f28b52348c60 978360cc5c0a9115bf3db5f10196cd135e1be962 CI 1648348273 +1100 commit: myfile2 +978360cc5c0a9115bf3db5f10196cd135e1be962 eff34f9e6233e534513bb4b2154da4edd316283f CI 1648348273 +1100 commit: myfile3 +eff34f9e6233e534513bb4b2154da4edd316283f d77ec09ecf2391f9b76e54de98187095cd2edf9d CI 1648348273 +1100 commit: myfile4 +d77ec09ecf2391f9b76e54de98187095cd2edf9d d77ec09ecf2391f9b76e54de98187095cd2edf9d CI 1648348275 +1100 checkout: moving from master to test diff --git a/test/integration/pushAndSetUpstream/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..34ef6da51 --- /dev/null +++ b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,4 @@ +0000000000000000000000000000000000000000 e0c356303c1b9b8fbe6acddb3e58f28b52348c60 CI 1648348273 +1100 commit (initial): myfile1 +e0c356303c1b9b8fbe6acddb3e58f28b52348c60 978360cc5c0a9115bf3db5f10196cd135e1be962 CI 1648348273 +1100 commit: myfile2 +978360cc5c0a9115bf3db5f10196cd135e1be962 eff34f9e6233e534513bb4b2154da4edd316283f CI 1648348273 +1100 commit: myfile3 +eff34f9e6233e534513bb4b2154da4edd316283f d77ec09ecf2391f9b76e54de98187095cd2edf9d CI 1648348273 +1100 commit: myfile4 diff --git a/test/integration/pushAndSetUpstream/expected/repo/.git_keep/logs/refs/heads/test b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/logs/refs/heads/test new file mode 100644 index 000000000..9e9eedef1 --- /dev/null +++ b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/logs/refs/heads/test @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 d77ec09ecf2391f9b76e54de98187095cd2edf9d CI 1648348275 +1100 branch: Created from master diff --git a/test/integration/pushAndSetUpstream/expected/repo/.git_keep/logs/refs/remotes/origin/master b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/logs/refs/remotes/origin/master new file mode 100644 index 000000000..75fe60b40 --- /dev/null +++ b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/logs/refs/remotes/origin/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 978360cc5c0a9115bf3db5f10196cd135e1be962 CI 1648348273 +1100 fetch origin: storing head diff --git a/test/integration/pushAndSetUpstream/expected/repo/.git_keep/logs/refs/remotes/origin/test b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/logs/refs/remotes/origin/test new file mode 100644 index 000000000..53f60551f --- /dev/null +++ b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/logs/refs/remotes/origin/test @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 d77ec09ecf2391f9b76e54de98187095cd2edf9d CI 1648348276 +1100 update by push diff --git a/test/integration/pushWithCredentials/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/pushWithCredentials/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/pushAndSetUpstream/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/pushTag/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/pushTag/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/pushAndSetUpstream/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/pushWithCredentials/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/pushWithCredentials/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/pushAndSetUpstream/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/pushAndSetUpstreamDefault/expected_remote/objects/2f/6174050380438f14b16658a356e762435ca591 b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 similarity index 100% rename from test/integration/pushAndSetUpstreamDefault/expected_remote/objects/2f/6174050380438f14b16658a356e762435ca591 rename to test/integration/pushAndSetUpstream/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 diff --git a/test/integration/pushAndSetUpstream/expected/repo/.git_keep/objects/97/8360cc5c0a9115bf3db5f10196cd135e1be962 b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/objects/97/8360cc5c0a9115bf3db5f10196cd135e1be962 new file mode 100644 index 000000000..dd4d890c2 Binary files /dev/null and b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/objects/97/8360cc5c0a9115bf3db5f10196cd135e1be962 differ diff --git a/test/integration/pushWithCredentials/expected_remote/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/pushWithCredentials/expected_remote/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/pushAndSetUpstream/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/pushTag/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/pushTag/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/pushAndSetUpstream/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/pushAndSetUpstream/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/pushAndSetUpstream/expected/repo/.git_keep/objects/d7/7ec09ecf2391f9b76e54de98187095cd2edf9d b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/objects/d7/7ec09ecf2391f9b76e54de98187095cd2edf9d new file mode 100644 index 000000000..d8f35d219 --- /dev/null +++ b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/objects/d7/7ec09ecf2391f9b76e54de98187095cd2edf9d @@ -0,0 +1,2 @@ +xŤÎM +Â0@a×9Eö‚d2?MADčŞÇHÚ,[J˝˝=‚ŰÇ·xÓZëŇ<ôtj»ŞŹ&ĐQŕ€)&* Â)#‹v yĘÜŰň®ŻćŐ Éz•¨ŚÄ€ĄP‰Ŕ4gŇyFĐ\~·Çşűaô×aĽë'×í©—i­7B )Ĺý wÔcŞéźÜŐŻ-O%÷×r8Ę \ No newline at end of file diff --git a/test/integration/pushWithCredentials/expected_remote/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/pushWithCredentials/expected_remote/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/pushAndSetUpstream/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/pushAndSetUpstream/expected/repo/.git_keep/objects/e0/c356303c1b9b8fbe6acddb3e58f28b52348c60 b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/objects/e0/c356303c1b9b8fbe6acddb3e58f28b52348c60 new file mode 100644 index 000000000..33e4be4e0 --- /dev/null +++ b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/objects/e0/c356303c1b9b8fbe6acddb3e58f28b52348c60 @@ -0,0 +1,3 @@ +xŤÍA +Ă @Ń®=Ĺě ĹŃé8… +YĺFG‚…ôöÍşý<ř©Őşt@âKßUÁ*§b#Ďᡒ‰…ł ‹XÍä3S‰éîLüôwŰaśŕ9N/=bÝV˝ĄV@&ń$.x¸"ZkÎzNşţÉMý–eU4?3‹,Ő \ No newline at end of file diff --git a/test/integration/pushAndSetUpstream/expected/repo/.git_keep/objects/ef/f34f9e6233e534513bb4b2154da4edd316283f b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/objects/ef/f34f9e6233e534513bb4b2154da4edd316283f new file mode 100644 index 000000000..e9e90781f --- /dev/null +++ b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/objects/ef/f34f9e6233e534513bb4b2154da4edd316283f @@ -0,0 +1,2 @@ +xŤŽA +Ă E»öî ĹqÔ(„RČ*ÇĐÉ Ä& ííëşzđx>íµ®MCr—v2k[`@Šq’ŠäP˘ˇX,ůNbuä“_M§!b0Ô­É ŔÁĄx)Pßy†Â)X•ßíąźzšő8Íţäzl|Ł˝Ţ5ŃE; ľŁşí§˙™«ú•ucT? *:› \ No newline at end of file diff --git a/test/integration/pushAndSetUpstream/expected/repo/.git_keep/refs/heads/master b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..21ce8deb5 --- /dev/null +++ b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +d77ec09ecf2391f9b76e54de98187095cd2edf9d diff --git a/test/integration/pushAndSetUpstream/expected/repo/.git_keep/refs/heads/test b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/refs/heads/test new file mode 100644 index 000000000..21ce8deb5 --- /dev/null +++ b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/refs/heads/test @@ -0,0 +1 @@ +d77ec09ecf2391f9b76e54de98187095cd2edf9d diff --git a/test/integration/pushAndSetUpstream/expected/repo/.git_keep/refs/remotes/origin/master b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/refs/remotes/origin/master new file mode 100644 index 000000000..2539af585 --- /dev/null +++ b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/refs/remotes/origin/master @@ -0,0 +1 @@ +978360cc5c0a9115bf3db5f10196cd135e1be962 diff --git a/test/integration/pushAndSetUpstream/expected/repo/.git_keep/refs/remotes/origin/test b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/refs/remotes/origin/test new file mode 100644 index 000000000..21ce8deb5 --- /dev/null +++ b/test/integration/pushAndSetUpstream/expected/repo/.git_keep/refs/remotes/origin/test @@ -0,0 +1 @@ +d77ec09ecf2391f9b76e54de98187095cd2edf9d diff --git a/test/integration/setUpstream/expected/myfile1 b/test/integration/pushAndSetUpstream/expected/repo/myfile1 similarity index 100% rename from test/integration/setUpstream/expected/myfile1 rename to test/integration/pushAndSetUpstream/expected/repo/myfile1 diff --git a/test/integration/pushTag/expected/myfile2 b/test/integration/pushAndSetUpstream/expected/repo/myfile2 similarity index 100% rename from test/integration/pushTag/expected/myfile2 rename to test/integration/pushAndSetUpstream/expected/repo/myfile2 diff --git a/test/integration/pushNoFollowTags/expected/myfile3 b/test/integration/pushAndSetUpstream/expected/repo/myfile3 similarity index 100% rename from test/integration/pushNoFollowTags/expected/myfile3 rename to test/integration/pushAndSetUpstream/expected/repo/myfile3 diff --git a/test/integration/pushAndSetUpstreamDefault/expected/myfile4 b/test/integration/pushAndSetUpstream/expected/repo/myfile4 similarity index 100% rename from test/integration/pushAndSetUpstreamDefault/expected/myfile4 rename to test/integration/pushAndSetUpstream/expected/repo/myfile4 diff --git a/test/integration/pushAndSetUpstream/expected_remote/config b/test/integration/pushAndSetUpstream/expected_remote/config deleted file mode 100644 index de756510f..000000000 --- a/test/integration/pushAndSetUpstream/expected_remote/config +++ /dev/null @@ -1,8 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = true - ignorecase = true - precomposeunicode = true -[remote "origin"] - url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/pushAndSetUpstream/./actual diff --git a/test/integration/pushAndSetUpstream/expected_remote/objects/65/c52315dc238c164b914369f49bd70882cc1d85 b/test/integration/pushAndSetUpstream/expected_remote/objects/65/c52315dc238c164b914369f49bd70882cc1d85 deleted file mode 100644 index 9f235e0ed..000000000 Binary files a/test/integration/pushAndSetUpstream/expected_remote/objects/65/c52315dc238c164b914369f49bd70882cc1d85 and /dev/null differ diff --git a/test/integration/pushAndSetUpstream/expected_remote/objects/70/7a2a0835c897496934849bf6e0815593b140b3 b/test/integration/pushAndSetUpstream/expected_remote/objects/70/7a2a0835c897496934849bf6e0815593b140b3 deleted file mode 100644 index 3556acfa5..000000000 Binary files a/test/integration/pushAndSetUpstream/expected_remote/objects/70/7a2a0835c897496934849bf6e0815593b140b3 and /dev/null differ diff --git a/test/integration/pushAndSetUpstream/expected_remote/objects/da/b77371cf53420955fc9baeb84303414f7e4a60 b/test/integration/pushAndSetUpstream/expected_remote/objects/da/b77371cf53420955fc9baeb84303414f7e4a60 deleted file mode 100644 index fd638ab15..000000000 Binary files a/test/integration/pushAndSetUpstream/expected_remote/objects/da/b77371cf53420955fc9baeb84303414f7e4a60 and /dev/null differ diff --git a/test/integration/pushAndSetUpstream/expected_remote/objects/db/d679941d871665b7ff70fffe6116725e56e270 b/test/integration/pushAndSetUpstream/expected_remote/objects/db/d679941d871665b7ff70fffe6116725e56e270 deleted file mode 100644 index 49cc241d7..000000000 Binary files a/test/integration/pushAndSetUpstream/expected_remote/objects/db/d679941d871665b7ff70fffe6116725e56e270 and /dev/null differ diff --git a/test/integration/pushAndSetUpstream/expected_remote/packed-refs b/test/integration/pushAndSetUpstream/expected_remote/packed-refs deleted file mode 100644 index 8271e61c9..000000000 --- a/test/integration/pushAndSetUpstream/expected_remote/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# pack-refs with: peeled fully-peeled sorted -dab77371cf53420955fc9baeb84303414f7e4a60 refs/heads/master diff --git a/test/integration/pushAndSetUpstream/expected_remote/refs/heads/test b/test/integration/pushAndSetUpstream/expected_remote/refs/heads/test deleted file mode 100644 index 683d3d319..000000000 --- a/test/integration/pushAndSetUpstream/expected_remote/refs/heads/test +++ /dev/null @@ -1 +0,0 @@ -707a2a0835c897496934849bf6e0815593b140b3 diff --git a/test/integration/pushAndSetUpstream/setup.sh b/test/integration/pushAndSetUpstream/setup.sh index 6c4c85af6..c4fa44969 100644 --- a/test/integration/pushAndSetUpstream/setup.sh +++ b/test/integration/pushAndSetUpstream/setup.sh @@ -19,9 +19,9 @@ git add . git commit -am "myfile2" cd .. -git clone --bare ./actual actual_remote +git clone --bare ./repo origin -cd actual +cd repo echo test3 > myfile3 git add . @@ -30,6 +30,6 @@ echo test4 > myfile4 git add . git commit -am "myfile4" -git remote add origin ../actual_remote +git remote add origin ../origin git fetch origin git config push.default nothing diff --git a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/FETCH_HEAD b/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/FETCH_HEAD deleted file mode 100644 index adf0b729b..000000000 --- a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/FETCH_HEAD +++ /dev/null @@ -1 +0,0 @@ -dc7117cc68b23798cabb2c388a45036da33c2f10 not-for-merge branch 'master' of ../actual_remote diff --git a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/config b/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/config deleted file mode 100644 index ec0727bec..000000000 --- a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/config +++ /dev/null @@ -1,18 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true - precomposeunicode = true -[user] - email = CI@example.com - name = CI -[remote "origin"] - url = ../actual_remote - fetch = +refs/heads/*:refs/remotes/origin/* -[push] - default = current -[branch "test"] - remote = origin - merge = refs/heads/test diff --git a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/index b/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/index deleted file mode 100644 index 6bf05e8bb..000000000 Binary files a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/index and /dev/null differ diff --git a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/logs/HEAD b/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/logs/HEAD deleted file mode 100644 index 734f642ab..000000000 --- a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/logs/HEAD +++ /dev/null @@ -1,5 +0,0 @@ -0000000000000000000000000000000000000000 d0e2575d4cdf78f6845db57439c7b526d02dbc7d CI 1634897757 +1100 commit (initial): myfile1 -d0e2575d4cdf78f6845db57439c7b526d02dbc7d dc7117cc68b23798cabb2c388a45036da33c2f10 CI 1634897757 +1100 commit: myfile2 -dc7117cc68b23798cabb2c388a45036da33c2f10 6552acdbb2da7b153b78bbd9f6a564a54fce1ed9 CI 1634897757 +1100 commit: myfile3 -6552acdbb2da7b153b78bbd9f6a564a54fce1ed9 2d0011f18dcd00e21fd13ede01792048ccd09e85 CI 1634897757 +1100 commit: myfile4 -2d0011f18dcd00e21fd13ede01792048ccd09e85 2d0011f18dcd00e21fd13ede01792048ccd09e85 CI 1634897760 +1100 checkout: moving from master to test diff --git a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/logs/refs/heads/master b/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/logs/refs/heads/master deleted file mode 100644 index 00e298ce4..000000000 --- a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/logs/refs/heads/master +++ /dev/null @@ -1,4 +0,0 @@ -0000000000000000000000000000000000000000 d0e2575d4cdf78f6845db57439c7b526d02dbc7d CI 1634897757 +1100 commit (initial): myfile1 -d0e2575d4cdf78f6845db57439c7b526d02dbc7d dc7117cc68b23798cabb2c388a45036da33c2f10 CI 1634897757 +1100 commit: myfile2 -dc7117cc68b23798cabb2c388a45036da33c2f10 6552acdbb2da7b153b78bbd9f6a564a54fce1ed9 CI 1634897757 +1100 commit: myfile3 -6552acdbb2da7b153b78bbd9f6a564a54fce1ed9 2d0011f18dcd00e21fd13ede01792048ccd09e85 CI 1634897757 +1100 commit: myfile4 diff --git a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/logs/refs/heads/test b/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/logs/refs/heads/test deleted file mode 100644 index 26a649f81..000000000 --- a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/logs/refs/heads/test +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 2d0011f18dcd00e21fd13ede01792048ccd09e85 CI 1634897760 +1100 branch: Created from master diff --git a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/logs/refs/remotes/origin/master b/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/logs/refs/remotes/origin/master deleted file mode 100644 index 63ed3051f..000000000 --- a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/logs/refs/remotes/origin/master +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 dc7117cc68b23798cabb2c388a45036da33c2f10 CI 1634897757 +1100 fetch origin: storing head diff --git a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/logs/refs/remotes/origin/test b/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/logs/refs/remotes/origin/test deleted file mode 100644 index 8b11b4981..000000000 --- a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/logs/refs/remotes/origin/test +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 2d0011f18dcd00e21fd13ede01792048ccd09e85 CI 1634897761 +1100 update by push diff --git a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/objects/2d/0011f18dcd00e21fd13ede01792048ccd09e85 b/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/objects/2d/0011f18dcd00e21fd13ede01792048ccd09e85 deleted file mode 100644 index 3b028eaf7..000000000 Binary files a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/objects/2d/0011f18dcd00e21fd13ede01792048ccd09e85 and /dev/null differ diff --git a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/objects/65/52acdbb2da7b153b78bbd9f6a564a54fce1ed9 b/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/objects/65/52acdbb2da7b153b78bbd9f6a564a54fce1ed9 deleted file mode 100644 index 5e637927f..000000000 Binary files a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/objects/65/52acdbb2da7b153b78bbd9f6a564a54fce1ed9 and /dev/null differ diff --git a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/objects/d0/e2575d4cdf78f6845db57439c7b526d02dbc7d b/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/objects/d0/e2575d4cdf78f6845db57439c7b526d02dbc7d deleted file mode 100644 index d93d894fa..000000000 --- a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/objects/d0/e2575d4cdf78f6845db57439c7b526d02dbc7d +++ /dev/null @@ -1,2 +0,0 @@ -xŤÍA -0@Ń®sŠŮJFÇ™Ą\yŚL¨ŕ‘ÚŰ×#tűyđS5[ ńĄŞŕ•Sń‘5d"ĹŔ9`±-Ôg¦ÓĐąřnŻzŔ4Ă}šźú‰¶ozKŐ€ÜSE+˘÷î¬ç¤éźÜŮ·¬›˘ű7,,ë \ No newline at end of file diff --git a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/objects/dc/7117cc68b23798cabb2c388a45036da33c2f10 b/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/objects/dc/7117cc68b23798cabb2c388a45036da33c2f10 deleted file mode 100644 index bd9a3df16..000000000 Binary files a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/objects/dc/7117cc68b23798cabb2c388a45036da33c2f10 and /dev/null differ diff --git a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/refs/heads/master b/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/refs/heads/master deleted file mode 100644 index fcd0d8e35..000000000 --- a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -2d0011f18dcd00e21fd13ede01792048ccd09e85 diff --git a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/refs/heads/test b/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/refs/heads/test deleted file mode 100644 index fcd0d8e35..000000000 --- a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/refs/heads/test +++ /dev/null @@ -1 +0,0 @@ -2d0011f18dcd00e21fd13ede01792048ccd09e85 diff --git a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/refs/remotes/origin/master b/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/refs/remotes/origin/master deleted file mode 100644 index caea74126..000000000 --- a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/refs/remotes/origin/master +++ /dev/null @@ -1 +0,0 @@ -dc7117cc68b23798cabb2c388a45036da33c2f10 diff --git a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/refs/remotes/origin/test b/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/refs/remotes/origin/test deleted file mode 100644 index fcd0d8e35..000000000 --- a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/refs/remotes/origin/test +++ /dev/null @@ -1 +0,0 @@ -2d0011f18dcd00e21fd13ede01792048ccd09e85 diff --git a/test/integration/rebaseRewordLastCommit/expected/.git_keep/HEAD b/test/integration/pushAndSetUpstreamDefault/expected/origin/HEAD similarity index 100% rename from test/integration/rebaseRewordLastCommit/expected/.git_keep/HEAD rename to test/integration/pushAndSetUpstreamDefault/expected/origin/HEAD diff --git a/test/integration/pushAndSetUpstreamDefault/expected/origin/config b/test/integration/pushAndSetUpstreamDefault/expected/origin/config new file mode 100644 index 000000000..b6cfc193d --- /dev/null +++ b/test/integration/pushAndSetUpstreamDefault/expected/origin/config @@ -0,0 +1,8 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/pushAndSetUpstreamDefault/actual/./repo diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/description b/test/integration/pushAndSetUpstreamDefault/expected/origin/description similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/description rename to test/integration/pushAndSetUpstreamDefault/expected/origin/description diff --git a/test/integration/pushWithCredentials/expected/.git_keep/info/exclude b/test/integration/pushAndSetUpstreamDefault/expected/origin/info/exclude similarity index 100% rename from test/integration/pushWithCredentials/expected/.git_keep/info/exclude rename to test/integration/pushAndSetUpstreamDefault/expected/origin/info/exclude diff --git a/test/integration/pushWithCredentials/expected_remote/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/pushAndSetUpstreamDefault/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/pushWithCredentials/expected_remote/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/pushAndSetUpstreamDefault/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/pushWithCredentials/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/pushAndSetUpstreamDefault/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/pushWithCredentials/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/pushAndSetUpstreamDefault/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/pushWithCredentials/expected_remote/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/pushAndSetUpstreamDefault/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/pushWithCredentials/expected_remote/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/pushAndSetUpstreamDefault/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/pushWithCredentials/expected/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 b/test/integration/pushAndSetUpstreamDefault/expected/origin/objects/2f/6174050380438f14b16658a356e762435ca591 similarity index 100% rename from test/integration/pushWithCredentials/expected/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 rename to test/integration/pushAndSetUpstreamDefault/expected/origin/objects/2f/6174050380438f14b16658a356e762435ca591 diff --git a/test/integration/pushAndSetUpstreamDefault/expected/origin/objects/30/9d64f4b30c8a17897642eb8966189d2b054af2 b/test/integration/pushAndSetUpstreamDefault/expected/origin/objects/30/9d64f4b30c8a17897642eb8966189d2b054af2 new file mode 100644 index 000000000..7fbedd38e Binary files /dev/null and b/test/integration/pushAndSetUpstreamDefault/expected/origin/objects/30/9d64f4b30c8a17897642eb8966189d2b054af2 differ diff --git a/test/integration/pushAndSetUpstreamDefault/expected/origin/objects/83/d120ae6a09eeef4e082d1c2cc81aac81075988 b/test/integration/pushAndSetUpstreamDefault/expected/origin/objects/83/d120ae6a09eeef4e082d1c2cc81aac81075988 new file mode 100644 index 000000000..60b6c9ee5 Binary files /dev/null and b/test/integration/pushAndSetUpstreamDefault/expected/origin/objects/83/d120ae6a09eeef4e082d1c2cc81aac81075988 differ diff --git a/test/integration/pushAndSetUpstreamDefault/expected/origin/objects/8d/eea9ab6bed53871b952a62607704ea47d6d50e b/test/integration/pushAndSetUpstreamDefault/expected/origin/objects/8d/eea9ab6bed53871b952a62607704ea47d6d50e new file mode 100644 index 000000000..5bca7d1d2 --- /dev/null +++ b/test/integration/pushAndSetUpstreamDefault/expected/origin/objects/8d/eea9ab6bed53871b952a62607704ea47d6d50e @@ -0,0 +1,2 @@ +xŤÍA +0@Ń®sŠŮJ&NÇ))¸ň1™PÁ!")ŘŰ×#tűyđS5[ ńĄíŞŕ•Sń‘çţˇ’‰…ł`Xzš©ËL%¦{pńÓŢu‡q‚ç8˝ô¶­zKŐ@&éH‚\˝wg='M˙äÎľeYÝ4/,Ů \ No newline at end of file diff --git a/test/integration/pushAndSetUpstreamDefault/expected/origin/objects/a1/6265d00b218b3961405fc0c71a5ec2ffff879e b/test/integration/pushAndSetUpstreamDefault/expected/origin/objects/a1/6265d00b218b3961405fc0c71a5ec2ffff879e new file mode 100644 index 000000000..a80d7de45 Binary files /dev/null and b/test/integration/pushAndSetUpstreamDefault/expected/origin/objects/a1/6265d00b218b3961405fc0c71a5ec2ffff879e differ diff --git a/test/integration/rebase/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/pushAndSetUpstreamDefault/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/rebase/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/pushAndSetUpstreamDefault/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/pushTag/expected_remote/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/pushAndSetUpstreamDefault/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/pushTag/expected_remote/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/pushAndSetUpstreamDefault/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/rebaseFixups/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/pushAndSetUpstreamDefault/expected/origin/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/pushAndSetUpstreamDefault/expected/origin/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/rebase/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/pushAndSetUpstreamDefault/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/rebase/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/pushAndSetUpstreamDefault/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/pushAndSetUpstreamDefault/expected/origin/packed-refs b/test/integration/pushAndSetUpstreamDefault/expected/origin/packed-refs new file mode 100644 index 000000000..2212696c5 --- /dev/null +++ b/test/integration/pushAndSetUpstreamDefault/expected/origin/packed-refs @@ -0,0 +1,2 @@ +# pack-refs with: peeled fully-peeled sorted +309d64f4b30c8a17897642eb8966189d2b054af2 refs/heads/master diff --git a/test/integration/pushAndSetUpstreamDefault/expected/origin/refs/heads/test b/test/integration/pushAndSetUpstreamDefault/expected/origin/refs/heads/test new file mode 100644 index 000000000..088420ba8 --- /dev/null +++ b/test/integration/pushAndSetUpstreamDefault/expected/origin/refs/heads/test @@ -0,0 +1 @@ +83d120ae6a09eeef4e082d1c2cc81aac81075988 diff --git a/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/COMMIT_EDITMSG b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/COMMIT_EDITMSG new file mode 100644 index 000000000..51be8ec3d --- /dev/null +++ b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/COMMIT_EDITMSG @@ -0,0 +1 @@ +myfile4 diff --git a/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/FETCH_HEAD b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/FETCH_HEAD new file mode 100644 index 000000000..088c0e840 --- /dev/null +++ b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/FETCH_HEAD @@ -0,0 +1 @@ +309d64f4b30c8a17897642eb8966189d2b054af2 not-for-merge branch 'master' of ../origin diff --git a/test/integration/pushAndSetUpstreamDefault/expected/.git_keep/HEAD b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/pushAndSetUpstreamDefault/expected/.git_keep/HEAD rename to test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/HEAD diff --git a/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/config b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/config new file mode 100644 index 000000000..735b55597 --- /dev/null +++ b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/config @@ -0,0 +1,18 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[user] + email = CI@example.com + name = CI +[remote "origin"] + url = ../origin + fetch = +refs/heads/*:refs/remotes/origin/* +[push] + default = current +[branch "test"] + remote = origin + merge = refs/heads/test diff --git a/test/integration/rebaseFixups/expected/.git_keep/description b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/description similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/description rename to test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/description diff --git a/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/index b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/index new file mode 100644 index 000000000..6f272ffd6 Binary files /dev/null and b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/index differ diff --git a/test/integration/pushWithCredentials/expected_remote/info/exclude b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/pushWithCredentials/expected_remote/info/exclude rename to test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/info/exclude diff --git a/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/logs/HEAD b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..25cc9239c --- /dev/null +++ b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,5 @@ +0000000000000000000000000000000000000000 8deea9ab6bed53871b952a62607704ea47d6d50e CI 1648348284 +1100 commit (initial): myfile1 +8deea9ab6bed53871b952a62607704ea47d6d50e 309d64f4b30c8a17897642eb8966189d2b054af2 CI 1648348284 +1100 commit: myfile2 +309d64f4b30c8a17897642eb8966189d2b054af2 a16265d00b218b3961405fc0c71a5ec2ffff879e CI 1648348284 +1100 commit: myfile3 +a16265d00b218b3961405fc0c71a5ec2ffff879e 83d120ae6a09eeef4e082d1c2cc81aac81075988 CI 1648348284 +1100 commit: myfile4 +83d120ae6a09eeef4e082d1c2cc81aac81075988 83d120ae6a09eeef4e082d1c2cc81aac81075988 CI 1648348287 +1100 checkout: moving from master to test diff --git a/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..cb73b1272 --- /dev/null +++ b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,4 @@ +0000000000000000000000000000000000000000 8deea9ab6bed53871b952a62607704ea47d6d50e CI 1648348284 +1100 commit (initial): myfile1 +8deea9ab6bed53871b952a62607704ea47d6d50e 309d64f4b30c8a17897642eb8966189d2b054af2 CI 1648348284 +1100 commit: myfile2 +309d64f4b30c8a17897642eb8966189d2b054af2 a16265d00b218b3961405fc0c71a5ec2ffff879e CI 1648348284 +1100 commit: myfile3 +a16265d00b218b3961405fc0c71a5ec2ffff879e 83d120ae6a09eeef4e082d1c2cc81aac81075988 CI 1648348284 +1100 commit: myfile4 diff --git a/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/logs/refs/heads/test b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/logs/refs/heads/test new file mode 100644 index 000000000..a3f63ea1c --- /dev/null +++ b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/logs/refs/heads/test @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 83d120ae6a09eeef4e082d1c2cc81aac81075988 CI 1648348287 +1100 branch: Created from master diff --git a/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/logs/refs/remotes/origin/master b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/logs/refs/remotes/origin/master new file mode 100644 index 000000000..3772cf2a7 --- /dev/null +++ b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/logs/refs/remotes/origin/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 309d64f4b30c8a17897642eb8966189d2b054af2 CI 1648348284 +1100 fetch origin: storing head diff --git a/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/logs/refs/remotes/origin/test b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/logs/refs/remotes/origin/test new file mode 100644 index 000000000..30f2a7a42 --- /dev/null +++ b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/logs/refs/remotes/origin/test @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 83d120ae6a09eeef4e082d1c2cc81aac81075988 CI 1648348288 +1100 update by push diff --git a/test/integration/searching/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/searching/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/pushWithCredentials/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/pushWithCredentials/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/searching/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/searching/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/pushWithCredentials/expected_remote/objects/2f/6174050380438f14b16658a356e762435ca591 b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 similarity index 100% rename from test/integration/pushWithCredentials/expected_remote/objects/2f/6174050380438f14b16658a356e762435ca591 rename to test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 diff --git a/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/objects/30/9d64f4b30c8a17897642eb8966189d2b054af2 b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/objects/30/9d64f4b30c8a17897642eb8966189d2b054af2 new file mode 100644 index 000000000..7fbedd38e Binary files /dev/null and b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/objects/30/9d64f4b30c8a17897642eb8966189d2b054af2 differ diff --git a/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/objects/83/d120ae6a09eeef4e082d1c2cc81aac81075988 b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/objects/83/d120ae6a09eeef4e082d1c2cc81aac81075988 new file mode 100644 index 000000000..60b6c9ee5 Binary files /dev/null and b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/objects/83/d120ae6a09eeef4e082d1c2cc81aac81075988 differ diff --git a/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/objects/8d/eea9ab6bed53871b952a62607704ea47d6d50e b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/objects/8d/eea9ab6bed53871b952a62607704ea47d6d50e new file mode 100644 index 000000000..5bca7d1d2 --- /dev/null +++ b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/objects/8d/eea9ab6bed53871b952a62607704ea47d6d50e @@ -0,0 +1,2 @@ +xŤÍA +0@Ń®sŠŮJ&NÇ))¸ň1™PÁ!")ŘŰ×#tűyđS5[ ńĄíŞŕ•Sń‘çţˇ’‰…ł`Xzš©ËL%¦{pńÓŢu‡q‚ç8˝ô¶­zKŐ@&éH‚\˝wg='M˙äÎľeYÝ4/,Ů \ No newline at end of file diff --git a/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/objects/a1/6265d00b218b3961405fc0c71a5ec2ffff879e b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/objects/a1/6265d00b218b3961405fc0c71a5ec2ffff879e new file mode 100644 index 000000000..a80d7de45 Binary files /dev/null and b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/objects/a1/6265d00b218b3961405fc0c71a5ec2ffff879e differ diff --git a/test/integration/rebase2/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/rebase2/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/pushWithCredentials/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/pushWithCredentials/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/rebaseSwapping/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/rebase2/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/rebase2/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/refs/heads/master b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..088420ba8 --- /dev/null +++ b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +83d120ae6a09eeef4e082d1c2cc81aac81075988 diff --git a/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/refs/heads/test b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/refs/heads/test new file mode 100644 index 000000000..088420ba8 --- /dev/null +++ b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/refs/heads/test @@ -0,0 +1 @@ +83d120ae6a09eeef4e082d1c2cc81aac81075988 diff --git a/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/refs/remotes/origin/master b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/refs/remotes/origin/master new file mode 100644 index 000000000..4415813b2 --- /dev/null +++ b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/refs/remotes/origin/master @@ -0,0 +1 @@ +309d64f4b30c8a17897642eb8966189d2b054af2 diff --git a/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/refs/remotes/origin/test b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/refs/remotes/origin/test new file mode 100644 index 000000000..088420ba8 --- /dev/null +++ b/test/integration/pushAndSetUpstreamDefault/expected/repo/.git_keep/refs/remotes/origin/test @@ -0,0 +1 @@ +83d120ae6a09eeef4e082d1c2cc81aac81075988 diff --git a/test/integration/squash/expected/myfile1 b/test/integration/pushAndSetUpstreamDefault/expected/repo/myfile1 similarity index 100% rename from test/integration/squash/expected/myfile1 rename to test/integration/pushAndSetUpstreamDefault/expected/repo/myfile1 diff --git a/test/integration/pushWithCredentials/expected/myfile2 b/test/integration/pushAndSetUpstreamDefault/expected/repo/myfile2 similarity index 100% rename from test/integration/pushWithCredentials/expected/myfile2 rename to test/integration/pushAndSetUpstreamDefault/expected/repo/myfile2 diff --git a/test/integration/pushWithCredentials/expected/myfile3 b/test/integration/pushAndSetUpstreamDefault/expected/repo/myfile3 similarity index 100% rename from test/integration/pushWithCredentials/expected/myfile3 rename to test/integration/pushAndSetUpstreamDefault/expected/repo/myfile3 diff --git a/test/integration/pushWithCredentials/expected/myfile4 b/test/integration/pushAndSetUpstreamDefault/expected/repo/myfile4 similarity index 100% rename from test/integration/pushWithCredentials/expected/myfile4 rename to test/integration/pushAndSetUpstreamDefault/expected/repo/myfile4 diff --git a/test/integration/pushAndSetUpstreamDefault/expected_remote/config b/test/integration/pushAndSetUpstreamDefault/expected_remote/config deleted file mode 100644 index 5f4aec3f4..000000000 --- a/test/integration/pushAndSetUpstreamDefault/expected_remote/config +++ /dev/null @@ -1,8 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = true - ignorecase = true - precomposeunicode = true -[remote "origin"] - url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/pushAndSetUpstreamDefault/./actual diff --git a/test/integration/pushAndSetUpstreamDefault/expected_remote/objects/2d/0011f18dcd00e21fd13ede01792048ccd09e85 b/test/integration/pushAndSetUpstreamDefault/expected_remote/objects/2d/0011f18dcd00e21fd13ede01792048ccd09e85 deleted file mode 100644 index 3b028eaf7..000000000 Binary files a/test/integration/pushAndSetUpstreamDefault/expected_remote/objects/2d/0011f18dcd00e21fd13ede01792048ccd09e85 and /dev/null differ diff --git a/test/integration/pushAndSetUpstreamDefault/expected_remote/objects/65/52acdbb2da7b153b78bbd9f6a564a54fce1ed9 b/test/integration/pushAndSetUpstreamDefault/expected_remote/objects/65/52acdbb2da7b153b78bbd9f6a564a54fce1ed9 deleted file mode 100644 index 5e637927f..000000000 Binary files a/test/integration/pushAndSetUpstreamDefault/expected_remote/objects/65/52acdbb2da7b153b78bbd9f6a564a54fce1ed9 and /dev/null differ diff --git a/test/integration/pushAndSetUpstreamDefault/expected_remote/objects/d0/e2575d4cdf78f6845db57439c7b526d02dbc7d b/test/integration/pushAndSetUpstreamDefault/expected_remote/objects/d0/e2575d4cdf78f6845db57439c7b526d02dbc7d deleted file mode 100644 index d93d894fa..000000000 --- a/test/integration/pushAndSetUpstreamDefault/expected_remote/objects/d0/e2575d4cdf78f6845db57439c7b526d02dbc7d +++ /dev/null @@ -1,2 +0,0 @@ -xŤÍA -0@Ń®sŠŮJFÇ™Ą\yŚL¨ŕ‘ÚŰ×#tűyđS5[ ńĄŞŕ•Sń‘5d"ĹŔ9`±-Ôg¦ÓĐąřnŻzŔ4Ă}šźú‰¶ozKŐ€ÜSE+˘÷î¬ç¤éźÜŮ·¬›˘ű7,,ë \ No newline at end of file diff --git a/test/integration/pushAndSetUpstreamDefault/expected_remote/objects/dc/7117cc68b23798cabb2c388a45036da33c2f10 b/test/integration/pushAndSetUpstreamDefault/expected_remote/objects/dc/7117cc68b23798cabb2c388a45036da33c2f10 deleted file mode 100644 index bd9a3df16..000000000 Binary files a/test/integration/pushAndSetUpstreamDefault/expected_remote/objects/dc/7117cc68b23798cabb2c388a45036da33c2f10 and /dev/null differ diff --git a/test/integration/pushAndSetUpstreamDefault/expected_remote/packed-refs b/test/integration/pushAndSetUpstreamDefault/expected_remote/packed-refs deleted file mode 100644 index aadce3af8..000000000 --- a/test/integration/pushAndSetUpstreamDefault/expected_remote/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# pack-refs with: peeled fully-peeled sorted -dc7117cc68b23798cabb2c388a45036da33c2f10 refs/heads/master diff --git a/test/integration/pushAndSetUpstreamDefault/expected_remote/refs/heads/test b/test/integration/pushAndSetUpstreamDefault/expected_remote/refs/heads/test deleted file mode 100644 index fcd0d8e35..000000000 --- a/test/integration/pushAndSetUpstreamDefault/expected_remote/refs/heads/test +++ /dev/null @@ -1 +0,0 @@ -2d0011f18dcd00e21fd13ede01792048ccd09e85 diff --git a/test/integration/pushAndSetUpstreamDefault/setup.sh b/test/integration/pushAndSetUpstreamDefault/setup.sh index 1d5f61ecf..04ec4d860 100644 --- a/test/integration/pushAndSetUpstreamDefault/setup.sh +++ b/test/integration/pushAndSetUpstreamDefault/setup.sh @@ -19,9 +19,9 @@ git add . git commit -am "myfile2" cd .. -git clone --bare ./actual actual_remote +git clone --bare ./repo origin -cd actual +cd repo echo test3 > myfile3 git add . @@ -30,6 +30,6 @@ echo test4 > myfile4 git add . git commit -am "myfile4" -git remote add origin ../actual_remote +git remote add origin ../origin git fetch origin git config push.default current diff --git a/test/integration/pushFollowTags/expected/.git_keep/FETCH_HEAD b/test/integration/pushFollowTags/expected/.git_keep/FETCH_HEAD deleted file mode 100644 index eb26084cc..000000000 --- a/test/integration/pushFollowTags/expected/.git_keep/FETCH_HEAD +++ /dev/null @@ -1 +0,0 @@ -d0d3bfe09c1a5a9631f3041a184d6b9c6d927c83 branch 'master' of ../actual_remote diff --git a/test/integration/pushFollowTags/expected/.git_keep/config b/test/integration/pushFollowTags/expected/.git_keep/config deleted file mode 100644 index 190f2591c..000000000 --- a/test/integration/pushFollowTags/expected/.git_keep/config +++ /dev/null @@ -1,18 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true - precomposeunicode = true -[user] - email = CI@example.com - name = CI -[remote "origin"] - url = ../actual_remote - fetch = +refs/heads/*:refs/remotes/origin/* -[branch "master"] - remote = origin - merge = refs/heads/master -[push] - followTags = true diff --git a/test/integration/pushFollowTags/expected/.git_keep/index b/test/integration/pushFollowTags/expected/.git_keep/index deleted file mode 100644 index f23548c75..000000000 Binary files a/test/integration/pushFollowTags/expected/.git_keep/index and /dev/null differ diff --git a/test/integration/pushFollowTags/expected/.git_keep/logs/HEAD b/test/integration/pushFollowTags/expected/.git_keep/logs/HEAD deleted file mode 100644 index 263e15735..000000000 --- a/test/integration/pushFollowTags/expected/.git_keep/logs/HEAD +++ /dev/null @@ -1,3 +0,0 @@ -0000000000000000000000000000000000000000 f27af92910b10e6ddf592fae975337355579464b CI 1634944096 +1100 commit (initial): myfile1 -f27af92910b10e6ddf592fae975337355579464b d0d3bfe09c1a5a9631f3041a184d6b9c6d927c83 CI 1634944096 +1100 commit: myfile2 -d0d3bfe09c1a5a9631f3041a184d6b9c6d927c83 aea6b2960cc3e7a2453ce3490ca09d090d7ce223 CI 1634944096 +1100 commit: myfile3 diff --git a/test/integration/pushFollowTags/expected/.git_keep/logs/refs/heads/master b/test/integration/pushFollowTags/expected/.git_keep/logs/refs/heads/master deleted file mode 100644 index 263e15735..000000000 --- a/test/integration/pushFollowTags/expected/.git_keep/logs/refs/heads/master +++ /dev/null @@ -1,3 +0,0 @@ -0000000000000000000000000000000000000000 f27af92910b10e6ddf592fae975337355579464b CI 1634944096 +1100 commit (initial): myfile1 -f27af92910b10e6ddf592fae975337355579464b d0d3bfe09c1a5a9631f3041a184d6b9c6d927c83 CI 1634944096 +1100 commit: myfile2 -d0d3bfe09c1a5a9631f3041a184d6b9c6d927c83 aea6b2960cc3e7a2453ce3490ca09d090d7ce223 CI 1634944096 +1100 commit: myfile3 diff --git a/test/integration/pushFollowTags/expected/.git_keep/logs/refs/remotes/origin/master b/test/integration/pushFollowTags/expected/.git_keep/logs/refs/remotes/origin/master deleted file mode 100644 index 36306f3d0..000000000 --- a/test/integration/pushFollowTags/expected/.git_keep/logs/refs/remotes/origin/master +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 d0d3bfe09c1a5a9631f3041a184d6b9c6d927c83 CI 1634944096 +1100 fetch origin: storing head -d0d3bfe09c1a5a9631f3041a184d6b9c6d927c83 aea6b2960cc3e7a2453ce3490ca09d090d7ce223 CI 1634944097 +1100 update by push diff --git a/test/integration/pushFollowTags/expected/.git_keep/objects/34/10e6811881ccede9ff762c875f9b99a3e6eaef b/test/integration/pushFollowTags/expected/.git_keep/objects/34/10e6811881ccede9ff762c875f9b99a3e6eaef deleted file mode 100644 index 63ae5ead6..000000000 Binary files a/test/integration/pushFollowTags/expected/.git_keep/objects/34/10e6811881ccede9ff762c875f9b99a3e6eaef and /dev/null differ diff --git a/test/integration/pushFollowTags/expected/.git_keep/objects/ae/a6b2960cc3e7a2453ce3490ca09d090d7ce223 b/test/integration/pushFollowTags/expected/.git_keep/objects/ae/a6b2960cc3e7a2453ce3490ca09d090d7ce223 deleted file mode 100644 index 23f4eb7e8..000000000 Binary files a/test/integration/pushFollowTags/expected/.git_keep/objects/ae/a6b2960cc3e7a2453ce3490ca09d090d7ce223 and /dev/null differ diff --git a/test/integration/pushFollowTags/expected/.git_keep/objects/d0/d3bfe09c1a5a9631f3041a184d6b9c6d927c83 b/test/integration/pushFollowTags/expected/.git_keep/objects/d0/d3bfe09c1a5a9631f3041a184d6b9c6d927c83 deleted file mode 100644 index dbbef8c24..000000000 --- a/test/integration/pushFollowTags/expected/.git_keep/objects/d0/d3bfe09c1a5a9631f3041a184d6b9c6d927c83 +++ /dev/null @@ -1,4 +0,0 @@ -xŤÎA -Â0@Q×9Eö‚d’Éġ«#if°ĐŘR"čííÜ~ŢâOkks·Ŕxę»Í) äČęjQ&b-čꉪ÷Ĺ©G łĺ]^ÝŞOYŮ3¸N¨VŤě5 §B -1ĆÄHXL~÷çşŰa´·a|Č'·m‘Ë´¶» -ČŽÉžś3G=¦şüÉMűęĽ7?šS9ł \ No newline at end of file diff --git a/test/integration/pushFollowTags/expected/.git_keep/objects/f2/7af92910b10e6ddf592fae975337355579464b b/test/integration/pushFollowTags/expected/.git_keep/objects/f2/7af92910b10e6ddf592fae975337355579464b deleted file mode 100644 index b2353a7c3..000000000 --- a/test/integration/pushFollowTags/expected/.git_keep/objects/f2/7af92910b10e6ddf592fae975337355579464b +++ /dev/null @@ -1,2 +0,0 @@ -xŤÍA -0@Ń®sŠŮĘŚNÇJ\yŚL¨ŕ")´·×#tűyđS5[ËĄíŞ€*©`”eę3ł’—ě©‹T^¸ĎÂ%¦{çâ§˝ęÓ Źiőí˝é-U{IĎŔ•Ńťőś4ý“;ű•uSr3m,Ő \ No newline at end of file diff --git a/test/integration/pushFollowTags/expected/.git_keep/refs/heads/master b/test/integration/pushFollowTags/expected/.git_keep/refs/heads/master deleted file mode 100644 index 04b4caa25..000000000 --- a/test/integration/pushFollowTags/expected/.git_keep/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -aea6b2960cc3e7a2453ce3490ca09d090d7ce223 diff --git a/test/integration/pushFollowTags/expected/.git_keep/refs/remotes/origin/master b/test/integration/pushFollowTags/expected/.git_keep/refs/remotes/origin/master deleted file mode 100644 index 04b4caa25..000000000 --- a/test/integration/pushFollowTags/expected/.git_keep/refs/remotes/origin/master +++ /dev/null @@ -1 +0,0 @@ -aea6b2960cc3e7a2453ce3490ca09d090d7ce223 diff --git a/test/integration/pushFollowTags/expected/.git_keep/refs/tags/v1.0 b/test/integration/pushFollowTags/expected/.git_keep/refs/tags/v1.0 deleted file mode 100644 index 9e7dd44c2..000000000 --- a/test/integration/pushFollowTags/expected/.git_keep/refs/tags/v1.0 +++ /dev/null @@ -1 +0,0 @@ -3410e6811881ccede9ff762c875f9b99a3e6eaef diff --git a/test/integration/rebaseRewordOldCommit/expected/.git_keep/HEAD b/test/integration/pushFollowTags/expected/origin/HEAD similarity index 100% rename from test/integration/rebaseRewordOldCommit/expected/.git_keep/HEAD rename to test/integration/pushFollowTags/expected/origin/HEAD diff --git a/test/integration/pushFollowTags/expected/origin/config b/test/integration/pushFollowTags/expected/origin/config new file mode 100644 index 000000000..f285c4f51 --- /dev/null +++ b/test/integration/pushFollowTags/expected/origin/config @@ -0,0 +1,8 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/pushFollowTags/actual/./repo diff --git a/test/integration/rebaseRewordLastCommit/expected/.git_keep/description b/test/integration/pushFollowTags/expected/origin/description similarity index 100% rename from test/integration/rebaseRewordLastCommit/expected/.git_keep/description rename to test/integration/pushFollowTags/expected/origin/description diff --git a/test/integration/rebase/expected/.git_keep/info/exclude b/test/integration/pushFollowTags/expected/origin/info/exclude similarity index 100% rename from test/integration/rebase/expected/.git_keep/info/exclude rename to test/integration/pushFollowTags/expected/origin/info/exclude diff --git a/test/integration/pushFollowTags/expected/origin/objects/03/63748fdf3c7a6947886a53d51208c0866f76af b/test/integration/pushFollowTags/expected/origin/objects/03/63748fdf3c7a6947886a53d51208c0866f76af new file mode 100644 index 000000000..d39af3410 --- /dev/null +++ b/test/integration/pushFollowTags/expected/origin/objects/03/63748fdf3c7a6947886a53d51208c0866f76af @@ -0,0 +1,3 @@ +xŚË +0E»ÎWĚľ ™¤Ig ”‚+?#/ĹұAęß7Â]śĹ9·ş PńĄřw +Č…ŁŇÖůűčYI’rLšŮ°ő†c4˘k‚Prž«¨ícÇNž0Ą úýđJ?—×Oęšő´7ŇmŇÂQJ!ň{ÚľsYŕl˙Éd'H \ No newline at end of file diff --git a/test/integration/setUpstream/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/pushFollowTags/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/setUpstream/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/pushFollowTags/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/rebase/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/pushFollowTags/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/rebase/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/pushFollowTags/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/setUpstream/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/pushFollowTags/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/setUpstream/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/pushFollowTags/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/pushFollowTags/expected/origin/objects/8a/c21a1d236ab7fb92c8f8082a98399596b59dd5 b/test/integration/pushFollowTags/expected/origin/objects/8a/c21a1d236ab7fb92c8f8082a98399596b59dd5 new file mode 100644 index 000000000..500e00fd3 Binary files /dev/null and b/test/integration/pushFollowTags/expected/origin/objects/8a/c21a1d236ab7fb92c8f8082a98399596b59dd5 differ diff --git a/test/integration/rebase3/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/pushFollowTags/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/rebase3/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/pushFollowTags/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/pushWithCredentials/expected_remote/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/pushFollowTags/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/pushWithCredentials/expected_remote/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/pushFollowTags/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/pushFollowTags/expected/origin/objects/bc/1bee0a92515554303f848cbdecb4f7bc219e55 b/test/integration/pushFollowTags/expected/origin/objects/bc/1bee0a92515554303f848cbdecb4f7bc219e55 new file mode 100644 index 000000000..16d65967d Binary files /dev/null and b/test/integration/pushFollowTags/expected/origin/objects/bc/1bee0a92515554303f848cbdecb4f7bc219e55 differ diff --git a/test/integration/rebase3/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/pushFollowTags/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/rebase3/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/pushFollowTags/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/pushFollowTags/expected/origin/objects/f6/19224ae5e8ac2a5fa8e01624df4ca3d1b50d69 b/test/integration/pushFollowTags/expected/origin/objects/f6/19224ae5e8ac2a5fa8e01624df4ca3d1b50d69 new file mode 100644 index 000000000..2c25bdee4 Binary files /dev/null and b/test/integration/pushFollowTags/expected/origin/objects/f6/19224ae5e8ac2a5fa8e01624df4ca3d1b50d69 differ diff --git a/test/integration/pushFollowTags/expected/origin/packed-refs b/test/integration/pushFollowTags/expected/origin/packed-refs new file mode 100644 index 000000000..00ae51cfc --- /dev/null +++ b/test/integration/pushFollowTags/expected/origin/packed-refs @@ -0,0 +1,2 @@ +# pack-refs with: peeled fully-peeled sorted +f619224ae5e8ac2a5fa8e01624df4ca3d1b50d69 refs/heads/master diff --git a/test/integration/pushFollowTags/expected/origin/refs/heads/master b/test/integration/pushFollowTags/expected/origin/refs/heads/master new file mode 100644 index 000000000..e3fe528b1 --- /dev/null +++ b/test/integration/pushFollowTags/expected/origin/refs/heads/master @@ -0,0 +1 @@ +8ac21a1d236ab7fb92c8f8082a98399596b59dd5 diff --git a/test/integration/pushFollowTags/expected/origin/refs/tags/v1.0 b/test/integration/pushFollowTags/expected/origin/refs/tags/v1.0 new file mode 100644 index 000000000..2a626e934 --- /dev/null +++ b/test/integration/pushFollowTags/expected/origin/refs/tags/v1.0 @@ -0,0 +1 @@ +0363748fdf3c7a6947886a53d51208c0866f76af diff --git a/test/integration/pushFollowTags/expected/.git_keep/COMMIT_EDITMSG b/test/integration/pushFollowTags/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/pushFollowTags/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/pushFollowTags/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/pushFollowTags/expected/repo/.git_keep/FETCH_HEAD b/test/integration/pushFollowTags/expected/repo/.git_keep/FETCH_HEAD new file mode 100644 index 000000000..bf5b60915 --- /dev/null +++ b/test/integration/pushFollowTags/expected/repo/.git_keep/FETCH_HEAD @@ -0,0 +1 @@ +f619224ae5e8ac2a5fa8e01624df4ca3d1b50d69 branch 'master' of ../origin diff --git a/test/integration/rebaseSwapping/expected/.git_keep/HEAD b/test/integration/pushFollowTags/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/HEAD rename to test/integration/pushFollowTags/expected/repo/.git_keep/HEAD diff --git a/test/integration/pushFollowTags/expected/repo/.git_keep/config b/test/integration/pushFollowTags/expected/repo/.git_keep/config new file mode 100644 index 000000000..fe5852494 --- /dev/null +++ b/test/integration/pushFollowTags/expected/repo/.git_keep/config @@ -0,0 +1,18 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[user] + email = CI@example.com + name = CI +[remote "origin"] + url = ../origin + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "master"] + remote = origin + merge = refs/heads/master +[push] + followTags = true diff --git a/test/integration/rebaseRewordOldCommit/expected/.git_keep/description b/test/integration/pushFollowTags/expected/repo/.git_keep/description similarity index 100% rename from test/integration/rebaseRewordOldCommit/expected/.git_keep/description rename to test/integration/pushFollowTags/expected/repo/.git_keep/description diff --git a/test/integration/pushFollowTags/expected/repo/.git_keep/index b/test/integration/pushFollowTags/expected/repo/.git_keep/index new file mode 100644 index 000000000..9b5fc68b0 Binary files /dev/null and b/test/integration/pushFollowTags/expected/repo/.git_keep/index differ diff --git a/test/integration/rebase2/expected/.git_keep/info/exclude b/test/integration/pushFollowTags/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/rebase2/expected/.git_keep/info/exclude rename to test/integration/pushFollowTags/expected/repo/.git_keep/info/exclude diff --git a/test/integration/pushFollowTags/expected/repo/.git_keep/logs/HEAD b/test/integration/pushFollowTags/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..f9281a9c5 --- /dev/null +++ b/test/integration/pushFollowTags/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 bc1bee0a92515554303f848cbdecb4f7bc219e55 CI 1648348306 +1100 commit (initial): myfile1 +bc1bee0a92515554303f848cbdecb4f7bc219e55 f619224ae5e8ac2a5fa8e01624df4ca3d1b50d69 CI 1648348306 +1100 commit: myfile2 +f619224ae5e8ac2a5fa8e01624df4ca3d1b50d69 8ac21a1d236ab7fb92c8f8082a98399596b59dd5 CI 1648348306 +1100 commit: myfile3 diff --git a/test/integration/pushFollowTags/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/pushFollowTags/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..f9281a9c5 --- /dev/null +++ b/test/integration/pushFollowTags/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 bc1bee0a92515554303f848cbdecb4f7bc219e55 CI 1648348306 +1100 commit (initial): myfile1 +bc1bee0a92515554303f848cbdecb4f7bc219e55 f619224ae5e8ac2a5fa8e01624df4ca3d1b50d69 CI 1648348306 +1100 commit: myfile2 +f619224ae5e8ac2a5fa8e01624df4ca3d1b50d69 8ac21a1d236ab7fb92c8f8082a98399596b59dd5 CI 1648348306 +1100 commit: myfile3 diff --git a/test/integration/pushFollowTags/expected/repo/.git_keep/logs/refs/remotes/origin/master b/test/integration/pushFollowTags/expected/repo/.git_keep/logs/refs/remotes/origin/master new file mode 100644 index 000000000..e9c2433a9 --- /dev/null +++ b/test/integration/pushFollowTags/expected/repo/.git_keep/logs/refs/remotes/origin/master @@ -0,0 +1,2 @@ +0000000000000000000000000000000000000000 f619224ae5e8ac2a5fa8e01624df4ca3d1b50d69 CI 1648348306 +1100 fetch origin: storing head +f619224ae5e8ac2a5fa8e01624df4ca3d1b50d69 8ac21a1d236ab7fb92c8f8082a98399596b59dd5 CI 1648348307 +1100 update by push diff --git a/test/integration/pushFollowTags/expected/repo/.git_keep/objects/03/63748fdf3c7a6947886a53d51208c0866f76af b/test/integration/pushFollowTags/expected/repo/.git_keep/objects/03/63748fdf3c7a6947886a53d51208c0866f76af new file mode 100644 index 000000000..d39af3410 --- /dev/null +++ b/test/integration/pushFollowTags/expected/repo/.git_keep/objects/03/63748fdf3c7a6947886a53d51208c0866f76af @@ -0,0 +1,3 @@ +xŚË +0E»ÎWĚľ ™¤Ig ”‚+?#/ĹұAęß7Â]śĹ9·ş PńĄřw +Č…ŁŇÖůűčYI’rLšŮ°ő†c4˘k‚Prž«¨ícÇNž0Ą úýđJ?—×Oęšő´7ŇmŇÂQJ!ň{ÚľsYŕl˙Éd'H \ No newline at end of file diff --git a/test/integration/setUpstream/expected_remote/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/pushFollowTags/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/setUpstream/expected_remote/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/pushFollowTags/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/rebase2/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/pushFollowTags/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/rebase2/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/pushFollowTags/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/setUpstream/expected_remote/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/pushFollowTags/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/setUpstream/expected_remote/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/pushFollowTags/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/pushFollowTags/expected/repo/.git_keep/objects/8a/c21a1d236ab7fb92c8f8082a98399596b59dd5 b/test/integration/pushFollowTags/expected/repo/.git_keep/objects/8a/c21a1d236ab7fb92c8f8082a98399596b59dd5 new file mode 100644 index 000000000..500e00fd3 Binary files /dev/null and b/test/integration/pushFollowTags/expected/repo/.git_keep/objects/8a/c21a1d236ab7fb92c8f8082a98399596b59dd5 differ diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/pushFollowTags/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/pushFollowTags/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/searching/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/pushFollowTags/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/searching/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/pushFollowTags/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/pushFollowTags/expected/repo/.git_keep/objects/bc/1bee0a92515554303f848cbdecb4f7bc219e55 b/test/integration/pushFollowTags/expected/repo/.git_keep/objects/bc/1bee0a92515554303f848cbdecb4f7bc219e55 new file mode 100644 index 000000000..16d65967d Binary files /dev/null and b/test/integration/pushFollowTags/expected/repo/.git_keep/objects/bc/1bee0a92515554303f848cbdecb4f7bc219e55 differ diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/pushFollowTags/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/pushFollowTags/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/pushFollowTags/expected/repo/.git_keep/objects/f6/19224ae5e8ac2a5fa8e01624df4ca3d1b50d69 b/test/integration/pushFollowTags/expected/repo/.git_keep/objects/f6/19224ae5e8ac2a5fa8e01624df4ca3d1b50d69 new file mode 100644 index 000000000..2c25bdee4 Binary files /dev/null and b/test/integration/pushFollowTags/expected/repo/.git_keep/objects/f6/19224ae5e8ac2a5fa8e01624df4ca3d1b50d69 differ diff --git a/test/integration/pushFollowTags/expected/repo/.git_keep/refs/heads/master b/test/integration/pushFollowTags/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..e3fe528b1 --- /dev/null +++ b/test/integration/pushFollowTags/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +8ac21a1d236ab7fb92c8f8082a98399596b59dd5 diff --git a/test/integration/pushFollowTags/expected/repo/.git_keep/refs/remotes/origin/master b/test/integration/pushFollowTags/expected/repo/.git_keep/refs/remotes/origin/master new file mode 100644 index 000000000..e3fe528b1 --- /dev/null +++ b/test/integration/pushFollowTags/expected/repo/.git_keep/refs/remotes/origin/master @@ -0,0 +1 @@ +8ac21a1d236ab7fb92c8f8082a98399596b59dd5 diff --git a/test/integration/pushFollowTags/expected/repo/.git_keep/refs/tags/v1.0 b/test/integration/pushFollowTags/expected/repo/.git_keep/refs/tags/v1.0 new file mode 100644 index 000000000..2a626e934 --- /dev/null +++ b/test/integration/pushFollowTags/expected/repo/.git_keep/refs/tags/v1.0 @@ -0,0 +1 @@ +0363748fdf3c7a6947886a53d51208c0866f76af diff --git a/test/integration/submoduleAdd/expected/haha/myfile1 b/test/integration/pushFollowTags/expected/repo/myfile1 similarity index 100% rename from test/integration/submoduleAdd/expected/haha/myfile1 rename to test/integration/pushFollowTags/expected/repo/myfile1 diff --git a/test/integration/setUpstream/expected/myfile2 b/test/integration/pushFollowTags/expected/repo/myfile2 similarity index 100% rename from test/integration/setUpstream/expected/myfile2 rename to test/integration/pushFollowTags/expected/repo/myfile2 diff --git a/test/integration/searching/expected/myfile3 b/test/integration/pushFollowTags/expected/repo/myfile3 similarity index 100% rename from test/integration/searching/expected/myfile3 rename to test/integration/pushFollowTags/expected/repo/myfile3 diff --git a/test/integration/pushFollowTags/expected_remote/config b/test/integration/pushFollowTags/expected_remote/config deleted file mode 100644 index a23b4ec0a..000000000 --- a/test/integration/pushFollowTags/expected_remote/config +++ /dev/null @@ -1,8 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = true - ignorecase = true - precomposeunicode = true -[remote "origin"] - url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/pushFollowTags/./actual diff --git a/test/integration/pushFollowTags/expected_remote/objects/34/10e6811881ccede9ff762c875f9b99a3e6eaef b/test/integration/pushFollowTags/expected_remote/objects/34/10e6811881ccede9ff762c875f9b99a3e6eaef deleted file mode 100644 index 63ae5ead6..000000000 Binary files a/test/integration/pushFollowTags/expected_remote/objects/34/10e6811881ccede9ff762c875f9b99a3e6eaef and /dev/null differ diff --git a/test/integration/pushFollowTags/expected_remote/objects/ae/a6b2960cc3e7a2453ce3490ca09d090d7ce223 b/test/integration/pushFollowTags/expected_remote/objects/ae/a6b2960cc3e7a2453ce3490ca09d090d7ce223 deleted file mode 100644 index 23f4eb7e8..000000000 Binary files a/test/integration/pushFollowTags/expected_remote/objects/ae/a6b2960cc3e7a2453ce3490ca09d090d7ce223 and /dev/null differ diff --git a/test/integration/pushFollowTags/expected_remote/objects/d0/d3bfe09c1a5a9631f3041a184d6b9c6d927c83 b/test/integration/pushFollowTags/expected_remote/objects/d0/d3bfe09c1a5a9631f3041a184d6b9c6d927c83 deleted file mode 100644 index dbbef8c24..000000000 --- a/test/integration/pushFollowTags/expected_remote/objects/d0/d3bfe09c1a5a9631f3041a184d6b9c6d927c83 +++ /dev/null @@ -1,4 +0,0 @@ -xŤÎA -Â0@Q×9Eö‚d’Éġ«#if°ĐŘR"čííÜ~ŢâOkks·Ŕxę»Í) äČęjQ&b-čꉪ÷Ĺ©G łĺ]^ÝŞOYŮ3¸N¨VŤě5 §B -1ĆÄHXL~÷çşŰa´·a|Č'·m‘Ë´¶» -ČŽÉžś3G=¦şüÉMűęĽ7?šS9ł \ No newline at end of file diff --git a/test/integration/pushFollowTags/expected_remote/objects/f2/7af92910b10e6ddf592fae975337355579464b b/test/integration/pushFollowTags/expected_remote/objects/f2/7af92910b10e6ddf592fae975337355579464b deleted file mode 100644 index b2353a7c3..000000000 --- a/test/integration/pushFollowTags/expected_remote/objects/f2/7af92910b10e6ddf592fae975337355579464b +++ /dev/null @@ -1,2 +0,0 @@ -xŤÍA -0@Ń®sŠŮĘŚNÇJ\yŚL¨ŕ")´·×#tűyđS5[ËĄíŞ€*©`”eę3ł’—ě©‹T^¸ĎÂ%¦{çâ§˝ęÓ Źiőí˝é-U{IĎŔ•Ńťőś4ý“;ű•uSr3m,Ő \ No newline at end of file diff --git a/test/integration/pushFollowTags/expected_remote/packed-refs b/test/integration/pushFollowTags/expected_remote/packed-refs deleted file mode 100644 index 51ac4766d..000000000 --- a/test/integration/pushFollowTags/expected_remote/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# pack-refs with: peeled fully-peeled sorted -d0d3bfe09c1a5a9631f3041a184d6b9c6d927c83 refs/heads/master diff --git a/test/integration/pushFollowTags/expected_remote/refs/heads/master b/test/integration/pushFollowTags/expected_remote/refs/heads/master deleted file mode 100644 index 04b4caa25..000000000 --- a/test/integration/pushFollowTags/expected_remote/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -aea6b2960cc3e7a2453ce3490ca09d090d7ce223 diff --git a/test/integration/pushFollowTags/expected_remote/refs/tags/v1.0 b/test/integration/pushFollowTags/expected_remote/refs/tags/v1.0 deleted file mode 100644 index 9e7dd44c2..000000000 --- a/test/integration/pushFollowTags/expected_remote/refs/tags/v1.0 +++ /dev/null @@ -1 +0,0 @@ -3410e6811881ccede9ff762c875f9b99a3e6eaef diff --git a/test/integration/pushFollowTags/setup.sh b/test/integration/pushFollowTags/setup.sh index 035c9189d..d66aa5419 100644 --- a/test/integration/pushFollowTags/setup.sh +++ b/test/integration/pushFollowTags/setup.sh @@ -19,15 +19,15 @@ git add . git commit -am "myfile2" cd .. -git clone --bare ./actual actual_remote +git clone --bare ./repo origin -cd actual +cd repo echo test3 > myfile3 git add . git commit -am "myfile3" -git remote add origin ../actual_remote +git remote add origin ../origin git fetch origin git branch --set-upstream-to=origin/master master git config push.followTags true diff --git a/test/integration/pushNoFollowTags/expected/.git_keep/FETCH_HEAD b/test/integration/pushNoFollowTags/expected/.git_keep/FETCH_HEAD deleted file mode 100644 index ce7bd7286..000000000 --- a/test/integration/pushNoFollowTags/expected/.git_keep/FETCH_HEAD +++ /dev/null @@ -1 +0,0 @@ -8f99b05bf3462e1a797335475bff5fabe3ae9ec5 branch 'master' of ../actual_remote diff --git a/test/integration/pushNoFollowTags/expected/.git_keep/config b/test/integration/pushNoFollowTags/expected/.git_keep/config deleted file mode 100644 index 821803a3e..000000000 --- a/test/integration/pushNoFollowTags/expected/.git_keep/config +++ /dev/null @@ -1,16 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true - precomposeunicode = true -[user] - email = CI@example.com - name = CI -[remote "origin"] - url = ../actual_remote - fetch = +refs/heads/*:refs/remotes/origin/* -[branch "master"] - remote = origin - merge = refs/heads/master diff --git a/test/integration/pushNoFollowTags/expected/.git_keep/index b/test/integration/pushNoFollowTags/expected/.git_keep/index deleted file mode 100644 index 818799f5d..000000000 Binary files a/test/integration/pushNoFollowTags/expected/.git_keep/index and /dev/null differ diff --git a/test/integration/pushNoFollowTags/expected/.git_keep/logs/HEAD b/test/integration/pushNoFollowTags/expected/.git_keep/logs/HEAD deleted file mode 100644 index 429f8a7fc..000000000 --- a/test/integration/pushNoFollowTags/expected/.git_keep/logs/HEAD +++ /dev/null @@ -1,3 +0,0 @@ -0000000000000000000000000000000000000000 fb20b9e96648c61699f9faf3a4383340fefd5f91 CI 1634944114 +1100 commit (initial): myfile1 -fb20b9e96648c61699f9faf3a4383340fefd5f91 8f99b05bf3462e1a797335475bff5fabe3ae9ec5 CI 1634944114 +1100 commit: myfile2 -8f99b05bf3462e1a797335475bff5fabe3ae9ec5 03009ca2af4be2a9bb49206974ce9c97eaa2da23 CI 1634944114 +1100 commit: myfile3 diff --git a/test/integration/pushNoFollowTags/expected/.git_keep/logs/refs/heads/master b/test/integration/pushNoFollowTags/expected/.git_keep/logs/refs/heads/master deleted file mode 100644 index 429f8a7fc..000000000 --- a/test/integration/pushNoFollowTags/expected/.git_keep/logs/refs/heads/master +++ /dev/null @@ -1,3 +0,0 @@ -0000000000000000000000000000000000000000 fb20b9e96648c61699f9faf3a4383340fefd5f91 CI 1634944114 +1100 commit (initial): myfile1 -fb20b9e96648c61699f9faf3a4383340fefd5f91 8f99b05bf3462e1a797335475bff5fabe3ae9ec5 CI 1634944114 +1100 commit: myfile2 -8f99b05bf3462e1a797335475bff5fabe3ae9ec5 03009ca2af4be2a9bb49206974ce9c97eaa2da23 CI 1634944114 +1100 commit: myfile3 diff --git a/test/integration/pushNoFollowTags/expected/.git_keep/logs/refs/remotes/origin/master b/test/integration/pushNoFollowTags/expected/.git_keep/logs/refs/remotes/origin/master deleted file mode 100644 index 42331700f..000000000 --- a/test/integration/pushNoFollowTags/expected/.git_keep/logs/refs/remotes/origin/master +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 8f99b05bf3462e1a797335475bff5fabe3ae9ec5 CI 1634944115 +1100 fetch origin: storing head -8f99b05bf3462e1a797335475bff5fabe3ae9ec5 03009ca2af4be2a9bb49206974ce9c97eaa2da23 CI 1634944115 +1100 update by push diff --git a/test/integration/pushNoFollowTags/expected/.git_keep/objects/03/009ca2af4be2a9bb49206974ce9c97eaa2da23 b/test/integration/pushNoFollowTags/expected/.git_keep/objects/03/009ca2af4be2a9bb49206974ce9c97eaa2da23 deleted file mode 100644 index 4a4d1b682..000000000 Binary files a/test/integration/pushNoFollowTags/expected/.git_keep/objects/03/009ca2af4be2a9bb49206974ce9c97eaa2da23 and /dev/null differ diff --git a/test/integration/pushNoFollowTags/expected/.git_keep/objects/8f/99b05bf3462e1a797335475bff5fabe3ae9ec5 b/test/integration/pushNoFollowTags/expected/.git_keep/objects/8f/99b05bf3462e1a797335475bff5fabe3ae9ec5 deleted file mode 100644 index 1e525bf69..000000000 --- a/test/integration/pushNoFollowTags/expected/.git_keep/objects/8f/99b05bf3462e1a797335475bff5fabe3ae9ec5 +++ /dev/null @@ -1,3 +0,0 @@ -xŤÎA -Â0@Q×9ĹěÉ$Ó±"BW=FŇĚ`ˇ±ĄDĐŰŰ#¸ýĽĹźÖZç(tj»*¤k$Lť/EŐ„EY,sä>0—˛·@ČnK»ľX>‹ -3ő#‹X˛(ö1’7µŇ™ Kďö\wF¸ ăC?©n‹^¦µŢ9’!ś˝wG=¦šţÉ]ýÚĽhp?Ö:: \ No newline at end of file diff --git a/test/integration/pushNoFollowTags/expected/.git_keep/objects/e1/9bd88e6b3a0d7e4ffc1de39b34d5a312fb9b77 b/test/integration/pushNoFollowTags/expected/.git_keep/objects/e1/9bd88e6b3a0d7e4ffc1de39b34d5a312fb9b77 deleted file mode 100644 index 33f59a1d3..000000000 Binary files a/test/integration/pushNoFollowTags/expected/.git_keep/objects/e1/9bd88e6b3a0d7e4ffc1de39b34d5a312fb9b77 and /dev/null differ diff --git a/test/integration/pushNoFollowTags/expected/.git_keep/objects/fb/20b9e96648c61699f9faf3a4383340fefd5f91 b/test/integration/pushNoFollowTags/expected/.git_keep/objects/fb/20b9e96648c61699f9faf3a4383340fefd5f91 deleted file mode 100644 index 8160387e5..000000000 --- a/test/integration/pushNoFollowTags/expected/.git_keep/objects/fb/20b9e96648c61699f9faf3a4383340fefd5f91 +++ /dev/null @@ -1,3 +0,0 @@ -xŤÍA -Â0Fa×9ĹěÉߎÓD„®zŚ4™`ˇC¤DĐŰŰ#¸}|đR5[ĺÔvUň*©ř(Ë0jČĚŠ 9 ‹(/ÜgáÓµsńÝžu§i¦Ű4?ôíµé%U»¤ç‘`:Ţ»Ł“¦rg߲n -÷0,Ă \ No newline at end of file diff --git a/test/integration/pushNoFollowTags/expected/.git_keep/refs/heads/master b/test/integration/pushNoFollowTags/expected/.git_keep/refs/heads/master deleted file mode 100644 index c5beb70f7..000000000 --- a/test/integration/pushNoFollowTags/expected/.git_keep/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -03009ca2af4be2a9bb49206974ce9c97eaa2da23 diff --git a/test/integration/pushNoFollowTags/expected/.git_keep/refs/remotes/origin/master b/test/integration/pushNoFollowTags/expected/.git_keep/refs/remotes/origin/master deleted file mode 100644 index c5beb70f7..000000000 --- a/test/integration/pushNoFollowTags/expected/.git_keep/refs/remotes/origin/master +++ /dev/null @@ -1 +0,0 @@ -03009ca2af4be2a9bb49206974ce9c97eaa2da23 diff --git a/test/integration/pushNoFollowTags/expected/.git_keep/refs/tags/v1.0 b/test/integration/pushNoFollowTags/expected/.git_keep/refs/tags/v1.0 deleted file mode 100644 index b4c9b638f..000000000 --- a/test/integration/pushNoFollowTags/expected/.git_keep/refs/tags/v1.0 +++ /dev/null @@ -1 +0,0 @@ -e19bd88e6b3a0d7e4ffc1de39b34d5a312fb9b77 diff --git a/test/integration/reflogCherryPick/expected/.git_keep/HEAD b/test/integration/pushNoFollowTags/expected/origin/HEAD similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/HEAD rename to test/integration/pushNoFollowTags/expected/origin/HEAD diff --git a/test/integration/pushNoFollowTags/expected/origin/config b/test/integration/pushNoFollowTags/expected/origin/config new file mode 100644 index 000000000..67da24ff7 --- /dev/null +++ b/test/integration/pushNoFollowTags/expected/origin/config @@ -0,0 +1,8 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/pushNoFollowTags/actual/./repo diff --git a/test/integration/rebaseSwapping/expected/.git_keep/description b/test/integration/pushNoFollowTags/expected/origin/description similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/description rename to test/integration/pushNoFollowTags/expected/origin/description diff --git a/test/integration/rebase3/expected/.git_keep/info/exclude b/test/integration/pushNoFollowTags/expected/origin/info/exclude similarity index 100% rename from test/integration/rebase3/expected/.git_keep/info/exclude rename to test/integration/pushNoFollowTags/expected/origin/info/exclude diff --git a/test/integration/squash/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/pushNoFollowTags/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/squash/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/pushNoFollowTags/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/rebase3/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/pushNoFollowTags/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/rebase3/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/pushNoFollowTags/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/squash/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/pushNoFollowTags/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce similarity index 100% rename from test/integration/squash/expected/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce rename to test/integration/pushNoFollowTags/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce diff --git a/test/integration/pushNoFollowTags/expected/origin/objects/32/a7825dd9144b755bd2bbefa9f0f75047d53aae b/test/integration/pushNoFollowTags/expected/origin/objects/32/a7825dd9144b755bd2bbefa9f0f75047d53aae new file mode 100644 index 000000000..60e20345f Binary files /dev/null and b/test/integration/pushNoFollowTags/expected/origin/objects/32/a7825dd9144b755bd2bbefa9f0f75047d53aae differ diff --git a/test/integration/pushNoFollowTags/expected/origin/objects/4f/7c2bf086a8b6ba8cdb00cf76dbb18543c4ef3b b/test/integration/pushNoFollowTags/expected/origin/objects/4f/7c2bf086a8b6ba8cdb00cf76dbb18543c4ef3b new file mode 100644 index 000000000..db48eb1e2 --- /dev/null +++ b/test/integration/pushNoFollowTags/expected/origin/objects/4f/7c2bf086a8b6ba8cdb00cf76dbb18543c4ef3b @@ -0,0 +1,2 @@ +xŤŽM +Â0F]çŮ 2?i›‚ĐUŹ‘Lg°`l)ôöćÂońÉVĘZ=ŽáTUO–ŘăbŮR`ł´ [‰™‘¤ku{:ôU˝č q”Ô ;\´·Ac&Î.˝ëc;ü4űë4ßő“ĘţÔ‹lĺ汑Ű0ř3"€k¶ťŞúgîĘ×Ö§˛ű ĺ:Ź \ No newline at end of file diff --git a/test/integration/rebaseFixups/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/pushNoFollowTags/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/pushNoFollowTags/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/setUpstream/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/pushNoFollowTags/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/setUpstream/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/pushNoFollowTags/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/rebaseFixups/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/pushNoFollowTags/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/pushNoFollowTags/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/pushNoFollowTags/expected/origin/objects/f0/ce9150789c4aef204270b5201d22e6f7e8b23b b/test/integration/pushNoFollowTags/expected/origin/objects/f0/ce9150789c4aef204270b5201d22e6f7e8b23b new file mode 100644 index 000000000..c6e6187bd Binary files /dev/null and b/test/integration/pushNoFollowTags/expected/origin/objects/f0/ce9150789c4aef204270b5201d22e6f7e8b23b differ diff --git a/test/integration/pushNoFollowTags/expected/origin/packed-refs b/test/integration/pushNoFollowTags/expected/origin/packed-refs new file mode 100644 index 000000000..04e69c5bf --- /dev/null +++ b/test/integration/pushNoFollowTags/expected/origin/packed-refs @@ -0,0 +1,2 @@ +# pack-refs with: peeled fully-peeled sorted +f0ce9150789c4aef204270b5201d22e6f7e8b23b refs/heads/master diff --git a/test/integration/pushNoFollowTags/expected/origin/refs/heads/master b/test/integration/pushNoFollowTags/expected/origin/refs/heads/master new file mode 100644 index 000000000..fc820b89f --- /dev/null +++ b/test/integration/pushNoFollowTags/expected/origin/refs/heads/master @@ -0,0 +1 @@ +4f7c2bf086a8b6ba8cdb00cf76dbb18543c4ef3b diff --git a/test/integration/pushNoFollowTags/expected/.git_keep/COMMIT_EDITMSG b/test/integration/pushNoFollowTags/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/pushNoFollowTags/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/pushNoFollowTags/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/pushNoFollowTags/expected/repo/.git_keep/FETCH_HEAD b/test/integration/pushNoFollowTags/expected/repo/.git_keep/FETCH_HEAD new file mode 100644 index 000000000..7f07f6234 --- /dev/null +++ b/test/integration/pushNoFollowTags/expected/repo/.git_keep/FETCH_HEAD @@ -0,0 +1 @@ +f0ce9150789c4aef204270b5201d22e6f7e8b23b branch 'master' of ../origin diff --git a/test/integration/rememberCommitMessageAfterFail/expected/.git_keep/HEAD b/test/integration/pushNoFollowTags/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/rememberCommitMessageAfterFail/expected/.git_keep/HEAD rename to test/integration/pushNoFollowTags/expected/repo/.git_keep/HEAD diff --git a/test/integration/pushNoFollowTags/expected/repo/.git_keep/config b/test/integration/pushNoFollowTags/expected/repo/.git_keep/config new file mode 100644 index 000000000..7721ae814 --- /dev/null +++ b/test/integration/pushNoFollowTags/expected/repo/.git_keep/config @@ -0,0 +1,16 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[user] + email = CI@example.com + name = CI +[remote "origin"] + url = ../origin + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "master"] + remote = origin + merge = refs/heads/master diff --git a/test/integration/reflogCheckout/expected/.git_keep/description b/test/integration/pushNoFollowTags/expected/repo/.git_keep/description similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/description rename to test/integration/pushNoFollowTags/expected/repo/.git_keep/description diff --git a/test/integration/pushNoFollowTags/expected/repo/.git_keep/index b/test/integration/pushNoFollowTags/expected/repo/.git_keep/index new file mode 100644 index 000000000..1c3ab1418 Binary files /dev/null and b/test/integration/pushNoFollowTags/expected/repo/.git_keep/index differ diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/info/exclude b/test/integration/pushNoFollowTags/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/info/exclude rename to test/integration/pushNoFollowTags/expected/repo/.git_keep/info/exclude diff --git a/test/integration/pushNoFollowTags/expected/repo/.git_keep/logs/HEAD b/test/integration/pushNoFollowTags/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..36c5ad470 --- /dev/null +++ b/test/integration/pushNoFollowTags/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 32a7825dd9144b755bd2bbefa9f0f75047d53aae CI 1648348314 +1100 commit (initial): myfile1 +32a7825dd9144b755bd2bbefa9f0f75047d53aae f0ce9150789c4aef204270b5201d22e6f7e8b23b CI 1648348314 +1100 commit: myfile2 +f0ce9150789c4aef204270b5201d22e6f7e8b23b 4f7c2bf086a8b6ba8cdb00cf76dbb18543c4ef3b CI 1648348314 +1100 commit: myfile3 diff --git a/test/integration/pushNoFollowTags/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/pushNoFollowTags/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..36c5ad470 --- /dev/null +++ b/test/integration/pushNoFollowTags/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 32a7825dd9144b755bd2bbefa9f0f75047d53aae CI 1648348314 +1100 commit (initial): myfile1 +32a7825dd9144b755bd2bbefa9f0f75047d53aae f0ce9150789c4aef204270b5201d22e6f7e8b23b CI 1648348314 +1100 commit: myfile2 +f0ce9150789c4aef204270b5201d22e6f7e8b23b 4f7c2bf086a8b6ba8cdb00cf76dbb18543c4ef3b CI 1648348314 +1100 commit: myfile3 diff --git a/test/integration/pushNoFollowTags/expected/repo/.git_keep/logs/refs/remotes/origin/master b/test/integration/pushNoFollowTags/expected/repo/.git_keep/logs/refs/remotes/origin/master new file mode 100644 index 000000000..2ef4175f7 --- /dev/null +++ b/test/integration/pushNoFollowTags/expected/repo/.git_keep/logs/refs/remotes/origin/master @@ -0,0 +1,2 @@ +0000000000000000000000000000000000000000 f0ce9150789c4aef204270b5201d22e6f7e8b23b CI 1648348314 +1100 fetch origin: storing head +f0ce9150789c4aef204270b5201d22e6f7e8b23b 4f7c2bf086a8b6ba8cdb00cf76dbb18543c4ef3b CI 1648348315 +1100 update by push diff --git a/test/integration/submoduleAdd/expected/.git_keep/modules/blah/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/pushNoFollowTags/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/submoduleAdd/expected/.git_keep/modules/blah/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/pushNoFollowTags/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/pushNoFollowTags/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/pushNoFollowTags/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/pushNoFollowTags/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/pushNoFollowTags/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce new file mode 100644 index 000000000..0a734f981 Binary files /dev/null and b/test/integration/pushNoFollowTags/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce differ diff --git a/test/integration/pushNoFollowTags/expected/repo/.git_keep/objects/32/a7825dd9144b755bd2bbefa9f0f75047d53aae b/test/integration/pushNoFollowTags/expected/repo/.git_keep/objects/32/a7825dd9144b755bd2bbefa9f0f75047d53aae new file mode 100644 index 000000000..60e20345f Binary files /dev/null and b/test/integration/pushNoFollowTags/expected/repo/.git_keep/objects/32/a7825dd9144b755bd2bbefa9f0f75047d53aae differ diff --git a/test/integration/pushNoFollowTags/expected/repo/.git_keep/objects/4f/7c2bf086a8b6ba8cdb00cf76dbb18543c4ef3b b/test/integration/pushNoFollowTags/expected/repo/.git_keep/objects/4f/7c2bf086a8b6ba8cdb00cf76dbb18543c4ef3b new file mode 100644 index 000000000..db48eb1e2 --- /dev/null +++ b/test/integration/pushNoFollowTags/expected/repo/.git_keep/objects/4f/7c2bf086a8b6ba8cdb00cf76dbb18543c4ef3b @@ -0,0 +1,2 @@ +xŤŽM +Â0F]çŮ 2?i›‚ĐUŹ‘Lg°`l)ôöćÂońÉVĘZ=ŽáTUO–ŘăbŮR`ł´ [‰™‘¤ku{:ôU˝č q”Ô ;\´·Ac&Î.˝ëc;ü4űë4ßő“ĘţÔ‹lĺ汑Ű0ř3"€k¶ťŞúgîĘ×Ö§˛ű ĺ:Ź \ No newline at end of file diff --git a/test/integration/rebaseRewordLastCommit/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/pushNoFollowTags/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/rebaseRewordLastCommit/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/pushNoFollowTags/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/setUpstream/expected_remote/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/pushNoFollowTags/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/setUpstream/expected_remote/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/pushNoFollowTags/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/pushNoFollowTags/expected/repo/.git_keep/objects/bc/74fd77b84a00637ff1a30dc835d7d9d48e5e16 b/test/integration/pushNoFollowTags/expected/repo/.git_keep/objects/bc/74fd77b84a00637ff1a30dc835d7d9d48e5e16 new file mode 100644 index 000000000..18b8870a4 --- /dev/null +++ b/test/integration/pushNoFollowTags/expected/repo/.git_keep/objects/bc/74fd77b84a00637ff1a30dc835d7d9d48e5e16 @@ -0,0 +1,2 @@ +xŚA +0E»Î)f_“ĆJ)¸ň™8KcÄ©·o„żx‹÷~ńP{żd~K(`bZŽč¬wlŮ»02bť™ÉÝŚF˘fUŽU ä”ć˘JýŘ©Á&Ů ŕŃ/ůů´~¤©ÖȧëČŔ•Q©tŔ.ŰwÎ śí,Ž(J \ No newline at end of file diff --git a/test/integration/rebaseRewordLastCommit/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/pushNoFollowTags/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/rebaseRewordLastCommit/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/pushNoFollowTags/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/pushNoFollowTags/expected/repo/.git_keep/objects/f0/ce9150789c4aef204270b5201d22e6f7e8b23b b/test/integration/pushNoFollowTags/expected/repo/.git_keep/objects/f0/ce9150789c4aef204270b5201d22e6f7e8b23b new file mode 100644 index 000000000..c6e6187bd Binary files /dev/null and b/test/integration/pushNoFollowTags/expected/repo/.git_keep/objects/f0/ce9150789c4aef204270b5201d22e6f7e8b23b differ diff --git a/test/integration/pushNoFollowTags/expected/repo/.git_keep/refs/heads/master b/test/integration/pushNoFollowTags/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..fc820b89f --- /dev/null +++ b/test/integration/pushNoFollowTags/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +4f7c2bf086a8b6ba8cdb00cf76dbb18543c4ef3b diff --git a/test/integration/pushNoFollowTags/expected/repo/.git_keep/refs/remotes/origin/master b/test/integration/pushNoFollowTags/expected/repo/.git_keep/refs/remotes/origin/master new file mode 100644 index 000000000..fc820b89f --- /dev/null +++ b/test/integration/pushNoFollowTags/expected/repo/.git_keep/refs/remotes/origin/master @@ -0,0 +1 @@ +4f7c2bf086a8b6ba8cdb00cf76dbb18543c4ef3b diff --git a/test/integration/pushNoFollowTags/expected/repo/.git_keep/refs/tags/v1.0 b/test/integration/pushNoFollowTags/expected/repo/.git_keep/refs/tags/v1.0 new file mode 100644 index 000000000..ac64fbcb2 --- /dev/null +++ b/test/integration/pushNoFollowTags/expected/repo/.git_keep/refs/tags/v1.0 @@ -0,0 +1 @@ +bc74fd77b84a00637ff1a30dc835d7d9d48e5e16 diff --git a/test/integration/submoduleAdd/expected/myfile1 b/test/integration/pushNoFollowTags/expected/repo/myfile1 similarity index 100% rename from test/integration/submoduleAdd/expected/myfile1 rename to test/integration/pushNoFollowTags/expected/repo/myfile1 diff --git a/test/integration/squash/expected/myfile2 b/test/integration/pushNoFollowTags/expected/repo/myfile2 similarity index 100% rename from test/integration/squash/expected/myfile2 rename to test/integration/pushNoFollowTags/expected/repo/myfile2 diff --git a/test/integration/setUpstream/expected/myfile3 b/test/integration/pushNoFollowTags/expected/repo/myfile3 similarity index 100% rename from test/integration/setUpstream/expected/myfile3 rename to test/integration/pushNoFollowTags/expected/repo/myfile3 diff --git a/test/integration/pushNoFollowTags/expected_remote/config b/test/integration/pushNoFollowTags/expected_remote/config deleted file mode 100644 index 01095ff3a..000000000 --- a/test/integration/pushNoFollowTags/expected_remote/config +++ /dev/null @@ -1,8 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = true - ignorecase = true - precomposeunicode = true -[remote "origin"] - url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/pushNoFollowTags/./actual diff --git a/test/integration/pushNoFollowTags/expected_remote/objects/03/009ca2af4be2a9bb49206974ce9c97eaa2da23 b/test/integration/pushNoFollowTags/expected_remote/objects/03/009ca2af4be2a9bb49206974ce9c97eaa2da23 deleted file mode 100644 index 4a4d1b682..000000000 Binary files a/test/integration/pushNoFollowTags/expected_remote/objects/03/009ca2af4be2a9bb49206974ce9c97eaa2da23 and /dev/null differ diff --git a/test/integration/pushNoFollowTags/expected_remote/objects/8f/99b05bf3462e1a797335475bff5fabe3ae9ec5 b/test/integration/pushNoFollowTags/expected_remote/objects/8f/99b05bf3462e1a797335475bff5fabe3ae9ec5 deleted file mode 100644 index 1e525bf69..000000000 --- a/test/integration/pushNoFollowTags/expected_remote/objects/8f/99b05bf3462e1a797335475bff5fabe3ae9ec5 +++ /dev/null @@ -1,3 +0,0 @@ -xŤÎA -Â0@Q×9ĹěÉ$Ó±"BW=FŇĚ`ˇ±ĄDĐŰŰ#¸ýĽĹźÖZç(tj»*¤k$Lť/EŐ„EY,sä>0—˛·@ČnK»ľX>‹ -3ő#‹X˛(ö1’7µŇ™ Kďö\wF¸ ăC?©n‹^¦µŢ9’!ś˝wG=¦šţÉ]ýÚĽhp?Ö:: \ No newline at end of file diff --git a/test/integration/pushNoFollowTags/expected_remote/objects/fb/20b9e96648c61699f9faf3a4383340fefd5f91 b/test/integration/pushNoFollowTags/expected_remote/objects/fb/20b9e96648c61699f9faf3a4383340fefd5f91 deleted file mode 100644 index 8160387e5..000000000 --- a/test/integration/pushNoFollowTags/expected_remote/objects/fb/20b9e96648c61699f9faf3a4383340fefd5f91 +++ /dev/null @@ -1,3 +0,0 @@ -xŤÍA -Â0Fa×9ĹěÉߎÓD„®zŚ4™`ˇC¤DĐŰŰ#¸}|đR5[ĺÔvUň*©ř(Ë0jČĚŠ 9 ‹(/ÜgáÓµsńÝžu§i¦Ű4?ôíµé%U»¤ç‘`:Ţ»Ł“¦rg߲n -÷0,Ă \ No newline at end of file diff --git a/test/integration/pushNoFollowTags/expected_remote/packed-refs b/test/integration/pushNoFollowTags/expected_remote/packed-refs deleted file mode 100644 index cb3f85f2e..000000000 --- a/test/integration/pushNoFollowTags/expected_remote/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# pack-refs with: peeled fully-peeled sorted -8f99b05bf3462e1a797335475bff5fabe3ae9ec5 refs/heads/master diff --git a/test/integration/pushNoFollowTags/expected_remote/refs/heads/master b/test/integration/pushNoFollowTags/expected_remote/refs/heads/master deleted file mode 100644 index c5beb70f7..000000000 --- a/test/integration/pushNoFollowTags/expected_remote/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -03009ca2af4be2a9bb49206974ce9c97eaa2da23 diff --git a/test/integration/pushNoFollowTags/setup.sh b/test/integration/pushNoFollowTags/setup.sh index b60c4eed4..f8c704295 100644 --- a/test/integration/pushNoFollowTags/setup.sh +++ b/test/integration/pushNoFollowTags/setup.sh @@ -19,15 +19,15 @@ git add . git commit -am "myfile2" cd .. -git clone --bare ./actual actual_remote +git clone --bare ./repo origin -cd actual +cd repo echo test3 > myfile3 git add . git commit -am "myfile3" -git remote add origin ../actual_remote +git remote add origin ../origin git fetch origin git branch --set-upstream-to=origin/master master git tag -a v1.0 -m "my version 1.0" diff --git a/test/integration/pushTag/expected/.git_keep/FETCH_HEAD b/test/integration/pushTag/expected/.git_keep/FETCH_HEAD deleted file mode 100644 index db4145664..000000000 --- a/test/integration/pushTag/expected/.git_keep/FETCH_HEAD +++ /dev/null @@ -1 +0,0 @@ -5e8100f80934cb3f1530579225107a478afac4ee branch 'master' of ../actual_remote diff --git a/test/integration/pushTag/expected/.git_keep/config b/test/integration/pushTag/expected/.git_keep/config deleted file mode 100644 index 821803a3e..000000000 --- a/test/integration/pushTag/expected/.git_keep/config +++ /dev/null @@ -1,16 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true - precomposeunicode = true -[user] - email = CI@example.com - name = CI -[remote "origin"] - url = ../actual_remote - fetch = +refs/heads/*:refs/remotes/origin/* -[branch "master"] - remote = origin - merge = refs/heads/master diff --git a/test/integration/pushTag/expected/.git_keep/index b/test/integration/pushTag/expected/.git_keep/index deleted file mode 100644 index 4ad50a104..000000000 Binary files a/test/integration/pushTag/expected/.git_keep/index and /dev/null differ diff --git a/test/integration/pushTag/expected/.git_keep/logs/HEAD b/test/integration/pushTag/expected/.git_keep/logs/HEAD deleted file mode 100644 index 6b662a0c2..000000000 --- a/test/integration/pushTag/expected/.git_keep/logs/HEAD +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 f5e0cf8631fc56de2f374ef60e123a2b643381e5 CI 1641183988 +1100 commit (initial): myfile1 -f5e0cf8631fc56de2f374ef60e123a2b643381e5 5e8100f80934cb3f1530579225107a478afac4ee CI 1641183988 +1100 commit: myfile2 diff --git a/test/integration/pushTag/expected/.git_keep/logs/refs/heads/master b/test/integration/pushTag/expected/.git_keep/logs/refs/heads/master deleted file mode 100644 index 6b662a0c2..000000000 --- a/test/integration/pushTag/expected/.git_keep/logs/refs/heads/master +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 f5e0cf8631fc56de2f374ef60e123a2b643381e5 CI 1641183988 +1100 commit (initial): myfile1 -f5e0cf8631fc56de2f374ef60e123a2b643381e5 5e8100f80934cb3f1530579225107a478afac4ee CI 1641183988 +1100 commit: myfile2 diff --git a/test/integration/pushTag/expected/.git_keep/logs/refs/remotes/origin/master b/test/integration/pushTag/expected/.git_keep/logs/refs/remotes/origin/master deleted file mode 100644 index 3509e2c88..000000000 --- a/test/integration/pushTag/expected/.git_keep/logs/refs/remotes/origin/master +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 5e8100f80934cb3f1530579225107a478afac4ee CI 1641183988 +1100 fetch origin: storing head diff --git a/test/integration/pushTag/expected/.git_keep/objects/5e/8100f80934cb3f1530579225107a478afac4ee b/test/integration/pushTag/expected/.git_keep/objects/5e/8100f80934cb3f1530579225107a478afac4ee deleted file mode 100644 index bcbc6ef2b..000000000 Binary files a/test/integration/pushTag/expected/.git_keep/objects/5e/8100f80934cb3f1530579225107a478afac4ee and /dev/null differ diff --git a/test/integration/pushTag/expected/.git_keep/objects/f5/e0cf8631fc56de2f374ef60e123a2b643381e5 b/test/integration/pushTag/expected/.git_keep/objects/f5/e0cf8631fc56de2f374ef60e123a2b643381e5 deleted file mode 100644 index 647bf5fc7..000000000 --- a/test/integration/pushTag/expected/.git_keep/objects/f5/e0cf8631fc56de2f374ef60e123a2b643381e5 +++ /dev/null @@ -1,2 +0,0 @@ -xŤÍA -Â@ @Q×sŠě™´1MADčŞÇHg2Xh)#čííÜ~üTÝ×H|j»DăT˘ň2Ś&™ČP8 vŠe …úĚT4]» ďö¬;L3ܦůaő×f—TýČ„(ý(gÄĂQŹIł?yđoY7Ăđ46,Ű \ No newline at end of file diff --git a/test/integration/pushTag/expected/.git_keep/refs/heads/master b/test/integration/pushTag/expected/.git_keep/refs/heads/master deleted file mode 100644 index eb5effc80..000000000 --- a/test/integration/pushTag/expected/.git_keep/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -5e8100f80934cb3f1530579225107a478afac4ee diff --git a/test/integration/pushTag/expected/.git_keep/refs/remotes/origin/master b/test/integration/pushTag/expected/.git_keep/refs/remotes/origin/master deleted file mode 100644 index eb5effc80..000000000 --- a/test/integration/pushTag/expected/.git_keep/refs/remotes/origin/master +++ /dev/null @@ -1 +0,0 @@ -5e8100f80934cb3f1530579225107a478afac4ee diff --git a/test/integration/pushTag/expected/.git_keep/refs/tags/v1.0 b/test/integration/pushTag/expected/.git_keep/refs/tags/v1.0 deleted file mode 100644 index eb5effc80..000000000 --- a/test/integration/pushTag/expected/.git_keep/refs/tags/v1.0 +++ /dev/null @@ -1 +0,0 @@ -5e8100f80934cb3f1530579225107a478afac4ee diff --git a/test/integration/searching/expected/.git_keep/HEAD b/test/integration/pushTag/expected/origin/HEAD similarity index 100% rename from test/integration/searching/expected/.git_keep/HEAD rename to test/integration/pushTag/expected/origin/HEAD diff --git a/test/integration/pushTag/expected/origin/config b/test/integration/pushTag/expected/origin/config new file mode 100644 index 000000000..322981408 --- /dev/null +++ b/test/integration/pushTag/expected/origin/config @@ -0,0 +1,8 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/pushTag/actual/./repo diff --git a/test/integration/reflogCherryPick/expected/.git_keep/description b/test/integration/pushTag/expected/origin/description similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/description rename to test/integration/pushTag/expected/origin/description diff --git a/test/integration/rebaseFixups/expected/.git_keep/info/exclude b/test/integration/pushTag/expected/origin/info/exclude similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/info/exclude rename to test/integration/pushTag/expected/origin/info/exclude diff --git a/test/integration/submoduleAdd/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/pushTag/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/submoduleAdd/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/pushTag/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/rebaseFixups/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/pushTag/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/pushTag/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/pushTag/expected/origin/objects/a4/72e4256e0cabe433e1655f13d45f5093f502f3 b/test/integration/pushTag/expected/origin/objects/a4/72e4256e0cabe433e1655f13d45f5093f502f3 new file mode 100644 index 000000000..e3bebf789 Binary files /dev/null and b/test/integration/pushTag/expected/origin/objects/a4/72e4256e0cabe433e1655f13d45f5093f502f3 differ diff --git a/test/integration/rebaseRewordOldCommit/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/pushTag/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/rebaseRewordOldCommit/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/pushTag/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/squash/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/pushTag/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/squash/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/pushTag/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/pushTag/expected/origin/objects/f4/d17a0fe9700c664eb4227b5992a4117c481eb4 b/test/integration/pushTag/expected/origin/objects/f4/d17a0fe9700c664eb4227b5992a4117c481eb4 new file mode 100644 index 000000000..667d1eb35 --- /dev/null +++ b/test/integration/pushTag/expected/origin/objects/f4/d17a0fe9700c664eb4227b5992a4117c481eb4 @@ -0,0 +1,2 @@ +xŤŽM +Â0F]çŮ ’ůÉÔ€ĐUŹ‘¶3Xhl)ôöćÂÇ[<Ţâ›¶R–ę!ń©Ş>wÄc˛0ĎŞ–$©$…äŠ"3â ÄíůĐWő™;TĆ(¦<*)HŚ4s´5 ‘ËďúÜßţÖý䲯z™¶r÷ |Ą6ěü ×l;UőĎÜ•Ż-«˘űť‡9Ä \ No newline at end of file diff --git a/test/integration/pushTag/expected/origin/packed-refs b/test/integration/pushTag/expected/origin/packed-refs new file mode 100644 index 000000000..97e7bbf20 --- /dev/null +++ b/test/integration/pushTag/expected/origin/packed-refs @@ -0,0 +1,2 @@ +# pack-refs with: peeled fully-peeled sorted +f4d17a0fe9700c664eb4227b5992a4117c481eb4 refs/heads/master diff --git a/test/integration/pushTag/expected/origin/refs/tags/v1.0 b/test/integration/pushTag/expected/origin/refs/tags/v1.0 new file mode 100644 index 000000000..4e9f606c9 --- /dev/null +++ b/test/integration/pushTag/expected/origin/refs/tags/v1.0 @@ -0,0 +1 @@ +f4d17a0fe9700c664eb4227b5992a4117c481eb4 diff --git a/test/integration/pushTag/expected/.git_keep/COMMIT_EDITMSG b/test/integration/pushTag/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/pushTag/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/pushTag/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/pushTag/expected/repo/.git_keep/FETCH_HEAD b/test/integration/pushTag/expected/repo/.git_keep/FETCH_HEAD new file mode 100644 index 000000000..073a60063 --- /dev/null +++ b/test/integration/pushTag/expected/repo/.git_keep/FETCH_HEAD @@ -0,0 +1 @@ +f4d17a0fe9700c664eb4227b5992a4117c481eb4 branch 'master' of ../origin diff --git a/test/integration/searchingInStagingPanel/expected/.git_keep/HEAD b/test/integration/pushTag/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/searchingInStagingPanel/expected/.git_keep/HEAD rename to test/integration/pushTag/expected/repo/.git_keep/HEAD diff --git a/test/integration/pushTag/expected/repo/.git_keep/config b/test/integration/pushTag/expected/repo/.git_keep/config new file mode 100644 index 000000000..7721ae814 --- /dev/null +++ b/test/integration/pushTag/expected/repo/.git_keep/config @@ -0,0 +1,16 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[user] + email = CI@example.com + name = CI +[remote "origin"] + url = ../origin + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "master"] + remote = origin + merge = refs/heads/master diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/description b/test/integration/pushTag/expected/repo/.git_keep/description similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/description rename to test/integration/pushTag/expected/repo/.git_keep/description diff --git a/test/integration/pushTag/expected/repo/.git_keep/index b/test/integration/pushTag/expected/repo/.git_keep/index new file mode 100644 index 000000000..318501c8d Binary files /dev/null and b/test/integration/pushTag/expected/repo/.git_keep/index differ diff --git a/test/integration/rebaseRewordLastCommit/expected/.git_keep/info/exclude b/test/integration/pushTag/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/rebaseRewordLastCommit/expected/.git_keep/info/exclude rename to test/integration/pushTag/expected/repo/.git_keep/info/exclude diff --git a/test/integration/pushTag/expected/repo/.git_keep/logs/HEAD b/test/integration/pushTag/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..66ae6fb77 --- /dev/null +++ b/test/integration/pushTag/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,2 @@ +0000000000000000000000000000000000000000 a472e4256e0cabe433e1655f13d45f5093f502f3 CI 1648348327 +1100 commit (initial): myfile1 +a472e4256e0cabe433e1655f13d45f5093f502f3 f4d17a0fe9700c664eb4227b5992a4117c481eb4 CI 1648348327 +1100 commit: myfile2 diff --git a/test/integration/pushTag/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/pushTag/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..66ae6fb77 --- /dev/null +++ b/test/integration/pushTag/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,2 @@ +0000000000000000000000000000000000000000 a472e4256e0cabe433e1655f13d45f5093f502f3 CI 1648348327 +1100 commit (initial): myfile1 +a472e4256e0cabe433e1655f13d45f5093f502f3 f4d17a0fe9700c664eb4227b5992a4117c481eb4 CI 1648348327 +1100 commit: myfile2 diff --git a/test/integration/pushTag/expected/repo/.git_keep/logs/refs/remotes/origin/master b/test/integration/pushTag/expected/repo/.git_keep/logs/refs/remotes/origin/master new file mode 100644 index 000000000..1e8c40120 --- /dev/null +++ b/test/integration/pushTag/expected/repo/.git_keep/logs/refs/remotes/origin/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 f4d17a0fe9700c664eb4227b5992a4117c481eb4 CI 1648348327 +1100 fetch origin: storing head diff --git a/test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/pushTag/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/pushTag/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/rebaseRewordLastCommit/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/pushTag/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/rebaseRewordLastCommit/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/pushTag/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/pushTag/expected/repo/.git_keep/objects/a4/72e4256e0cabe433e1655f13d45f5093f502f3 b/test/integration/pushTag/expected/repo/.git_keep/objects/a4/72e4256e0cabe433e1655f13d45f5093f502f3 new file mode 100644 index 000000000..e3bebf789 Binary files /dev/null and b/test/integration/pushTag/expected/repo/.git_keep/objects/a4/72e4256e0cabe433e1655f13d45f5093f502f3 differ diff --git a/test/integration/rebaseSwapping/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/pushTag/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/pushTag/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/submoduleAdd/expected/.git_keep/modules/blah/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/pushTag/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/submoduleAdd/expected/.git_keep/modules/blah/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/pushTag/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/pushTag/expected/repo/.git_keep/objects/f4/d17a0fe9700c664eb4227b5992a4117c481eb4 b/test/integration/pushTag/expected/repo/.git_keep/objects/f4/d17a0fe9700c664eb4227b5992a4117c481eb4 new file mode 100644 index 000000000..667d1eb35 --- /dev/null +++ b/test/integration/pushTag/expected/repo/.git_keep/objects/f4/d17a0fe9700c664eb4227b5992a4117c481eb4 @@ -0,0 +1,2 @@ +xŤŽM +Â0F]çŮ ’ůÉÔ€ĐUŹ‘¶3Xhl)ôöćÂÇ[<Ţâ›¶R–ę!ń©Ş>wÄc˛0ĎŞ–$©$…äŠ"3â ÄíůĐWő™;TĆ(¦<*)HŚ4s´5 ‘ËďúÜßţÖý䲯z™¶r÷ |Ą6ěü ×l;UőĎÜ•Ż-«˘űť‡9Ä \ No newline at end of file diff --git a/test/integration/pushTag/expected/repo/.git_keep/refs/heads/master b/test/integration/pushTag/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..4e9f606c9 --- /dev/null +++ b/test/integration/pushTag/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +f4d17a0fe9700c664eb4227b5992a4117c481eb4 diff --git a/test/integration/pushTag/expected/repo/.git_keep/refs/remotes/origin/master b/test/integration/pushTag/expected/repo/.git_keep/refs/remotes/origin/master new file mode 100644 index 000000000..4e9f606c9 --- /dev/null +++ b/test/integration/pushTag/expected/repo/.git_keep/refs/remotes/origin/master @@ -0,0 +1 @@ +f4d17a0fe9700c664eb4227b5992a4117c481eb4 diff --git a/test/integration/pushTag/expected/repo/.git_keep/refs/tags/v1.0 b/test/integration/pushTag/expected/repo/.git_keep/refs/tags/v1.0 new file mode 100644 index 000000000..4e9f606c9 --- /dev/null +++ b/test/integration/pushTag/expected/repo/.git_keep/refs/tags/v1.0 @@ -0,0 +1 @@ +f4d17a0fe9700c664eb4227b5992a4117c481eb4 diff --git a/test/integration/submoduleEnter/expected/myfile1 b/test/integration/pushTag/expected/repo/myfile1 similarity index 100% rename from test/integration/submoduleEnter/expected/myfile1 rename to test/integration/pushTag/expected/repo/myfile1 diff --git a/test/integration/submoduleAdd/expected/haha/myfile2 b/test/integration/pushTag/expected/repo/myfile2 similarity index 100% rename from test/integration/submoduleAdd/expected/haha/myfile2 rename to test/integration/pushTag/expected/repo/myfile2 diff --git a/test/integration/pushTag/expected_remote/config b/test/integration/pushTag/expected_remote/config deleted file mode 100644 index 6b41174e6..000000000 --- a/test/integration/pushTag/expected_remote/config +++ /dev/null @@ -1,8 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = true - ignorecase = true - precomposeunicode = true -[remote "origin"] - url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/pushTag/./actual diff --git a/test/integration/pushTag/expected_remote/objects/5e/8100f80934cb3f1530579225107a478afac4ee b/test/integration/pushTag/expected_remote/objects/5e/8100f80934cb3f1530579225107a478afac4ee deleted file mode 100644 index bcbc6ef2b..000000000 Binary files a/test/integration/pushTag/expected_remote/objects/5e/8100f80934cb3f1530579225107a478afac4ee and /dev/null differ diff --git a/test/integration/pushTag/expected_remote/objects/f5/e0cf8631fc56de2f374ef60e123a2b643381e5 b/test/integration/pushTag/expected_remote/objects/f5/e0cf8631fc56de2f374ef60e123a2b643381e5 deleted file mode 100644 index 647bf5fc7..000000000 --- a/test/integration/pushTag/expected_remote/objects/f5/e0cf8631fc56de2f374ef60e123a2b643381e5 +++ /dev/null @@ -1,2 +0,0 @@ -xŤÍA -Â@ @Q×sŠě™´1MADčŞÇHg2Xh)#čííÜ~üTÝ×H|j»DăT˘ň2Ś&™ČP8 vŠe …úĚT4]» ďö¬;L3ܦůaő×f—TýČ„(ý(gÄĂQŹIł?yđoY7Ăđ46,Ű \ No newline at end of file diff --git a/test/integration/pushTag/expected_remote/packed-refs b/test/integration/pushTag/expected_remote/packed-refs deleted file mode 100644 index b71ee5976..000000000 --- a/test/integration/pushTag/expected_remote/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# pack-refs with: peeled fully-peeled sorted -5e8100f80934cb3f1530579225107a478afac4ee refs/heads/master diff --git a/test/integration/pushTag/expected_remote/refs/tags/v1.0 b/test/integration/pushTag/expected_remote/refs/tags/v1.0 deleted file mode 100644 index eb5effc80..000000000 --- a/test/integration/pushTag/expected_remote/refs/tags/v1.0 +++ /dev/null @@ -1 +0,0 @@ -5e8100f80934cb3f1530579225107a478afac4ee diff --git a/test/integration/pushTag/setup.sh b/test/integration/pushTag/setup.sh index cf6270c03..beedd6ad7 100644 --- a/test/integration/pushTag/setup.sh +++ b/test/integration/pushTag/setup.sh @@ -19,10 +19,10 @@ git add . git commit -am "myfile2" cd .. -git clone --bare ./actual actual_remote +git clone --bare ./repo origin -cd actual +cd repo -git remote add origin ../actual_remote +git remote add origin ../origin git fetch origin git branch --set-upstream-to=origin/master master diff --git a/test/integration/pushWithCredentials/expected/.git_keep/FETCH_HEAD b/test/integration/pushWithCredentials/expected/.git_keep/FETCH_HEAD deleted file mode 100644 index 6832209cd..000000000 --- a/test/integration/pushWithCredentials/expected/.git_keep/FETCH_HEAD +++ /dev/null @@ -1 +0,0 @@ -ff7015f162da19450f2eaf0fc24987104df30e15 branch 'master' of ../actual_remote diff --git a/test/integration/pushWithCredentials/expected/.git_keep/config b/test/integration/pushWithCredentials/expected/.git_keep/config deleted file mode 100644 index 821803a3e..000000000 --- a/test/integration/pushWithCredentials/expected/.git_keep/config +++ /dev/null @@ -1,16 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true - precomposeunicode = true -[user] - email = CI@example.com - name = CI -[remote "origin"] - url = ../actual_remote - fetch = +refs/heads/*:refs/remotes/origin/* -[branch "master"] - remote = origin - merge = refs/heads/master diff --git a/test/integration/pushWithCredentials/expected/.git_keep/index b/test/integration/pushWithCredentials/expected/.git_keep/index deleted file mode 100644 index 9e081cf47..000000000 Binary files a/test/integration/pushWithCredentials/expected/.git_keep/index and /dev/null differ diff --git a/test/integration/pushWithCredentials/expected/.git_keep/logs/HEAD b/test/integration/pushWithCredentials/expected/.git_keep/logs/HEAD deleted file mode 100644 index 27c049707..000000000 --- a/test/integration/pushWithCredentials/expected/.git_keep/logs/HEAD +++ /dev/null @@ -1,4 +0,0 @@ -0000000000000000000000000000000000000000 ba8cb1da2a48c38706b15552877d79e8745c4bff CI 1641689920 +1100 commit (initial): myfile1 -ba8cb1da2a48c38706b15552877d79e8745c4bff ff7015f162da19450f2eaf0fc24987104df30e15 CI 1641689920 +1100 commit: myfile2 -ff7015f162da19450f2eaf0fc24987104df30e15 d9ea8db22c1655e9861309cc97139357d20e4e64 CI 1641689920 +1100 commit: myfile3 -d9ea8db22c1655e9861309cc97139357d20e4e64 75c50688e5a8e48a00d1a824124221bcc6aad640 CI 1641689920 +1100 commit: myfile4 diff --git a/test/integration/pushWithCredentials/expected/.git_keep/logs/refs/heads/master b/test/integration/pushWithCredentials/expected/.git_keep/logs/refs/heads/master deleted file mode 100644 index 27c049707..000000000 --- a/test/integration/pushWithCredentials/expected/.git_keep/logs/refs/heads/master +++ /dev/null @@ -1,4 +0,0 @@ -0000000000000000000000000000000000000000 ba8cb1da2a48c38706b15552877d79e8745c4bff CI 1641689920 +1100 commit (initial): myfile1 -ba8cb1da2a48c38706b15552877d79e8745c4bff ff7015f162da19450f2eaf0fc24987104df30e15 CI 1641689920 +1100 commit: myfile2 -ff7015f162da19450f2eaf0fc24987104df30e15 d9ea8db22c1655e9861309cc97139357d20e4e64 CI 1641689920 +1100 commit: myfile3 -d9ea8db22c1655e9861309cc97139357d20e4e64 75c50688e5a8e48a00d1a824124221bcc6aad640 CI 1641689920 +1100 commit: myfile4 diff --git a/test/integration/pushWithCredentials/expected/.git_keep/logs/refs/remotes/origin/master b/test/integration/pushWithCredentials/expected/.git_keep/logs/refs/remotes/origin/master deleted file mode 100644 index 463f9add6..000000000 --- a/test/integration/pushWithCredentials/expected/.git_keep/logs/refs/remotes/origin/master +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 ff7015f162da19450f2eaf0fc24987104df30e15 CI 1641689920 +1100 fetch origin: storing head -ff7015f162da19450f2eaf0fc24987104df30e15 75c50688e5a8e48a00d1a824124221bcc6aad640 CI 1641689925 +1100 update by push diff --git a/test/integration/pushWithCredentials/expected/.git_keep/objects/75/c50688e5a8e48a00d1a824124221bcc6aad640 b/test/integration/pushWithCredentials/expected/.git_keep/objects/75/c50688e5a8e48a00d1a824124221bcc6aad640 deleted file mode 100644 index 53b925279..000000000 Binary files a/test/integration/pushWithCredentials/expected/.git_keep/objects/75/c50688e5a8e48a00d1a824124221bcc6aad640 and /dev/null differ diff --git a/test/integration/pushWithCredentials/expected/.git_keep/objects/ba/8cb1da2a48c38706b15552877d79e8745c4bff b/test/integration/pushWithCredentials/expected/.git_keep/objects/ba/8cb1da2a48c38706b15552877d79e8745c4bff deleted file mode 100644 index e6612ab16..000000000 --- a/test/integration/pushWithCredentials/expected/.git_keep/objects/ba/8cb1da2a48c38706b15552877d79e8745c4bff +++ /dev/null @@ -1,2 +0,0 @@ -xŤÍA -Â0@Q×9Ĺ왉ă4ˇ«#M&XčR"čííÜ~üÜĚ–Ärę»* J®d˘†Â¬¤ň‰ęŔ3_‹pMůć]z÷WŰaśŕ>NOý$ŰV˝äf a’ŁG8!şŁ“®rgßş¬Jî3Ť,Ő \ No newline at end of file diff --git a/test/integration/pushWithCredentials/expected/.git_keep/objects/d9/ea8db22c1655e9861309cc97139357d20e4e64 b/test/integration/pushWithCredentials/expected/.git_keep/objects/d9/ea8db22c1655e9861309cc97139357d20e4e64 deleted file mode 100644 index 16633475a..000000000 Binary files a/test/integration/pushWithCredentials/expected/.git_keep/objects/d9/ea8db22c1655e9861309cc97139357d20e4e64 and /dev/null differ diff --git a/test/integration/pushWithCredentials/expected/.git_keep/objects/ff/7015f162da19450f2eaf0fc24987104df30e15 b/test/integration/pushWithCredentials/expected/.git_keep/objects/ff/7015f162da19450f2eaf0fc24987104df30e15 deleted file mode 100644 index c79143577..000000000 Binary files a/test/integration/pushWithCredentials/expected/.git_keep/objects/ff/7015f162da19450f2eaf0fc24987104df30e15 and /dev/null differ diff --git a/test/integration/pushWithCredentials/expected/.git_keep/refs/heads/master b/test/integration/pushWithCredentials/expected/.git_keep/refs/heads/master deleted file mode 100644 index b3746d069..000000000 --- a/test/integration/pushWithCredentials/expected/.git_keep/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -75c50688e5a8e48a00d1a824124221bcc6aad640 diff --git a/test/integration/pushWithCredentials/expected/.git_keep/refs/remotes/origin/master b/test/integration/pushWithCredentials/expected/.git_keep/refs/remotes/origin/master deleted file mode 100644 index b3746d069..000000000 --- a/test/integration/pushWithCredentials/expected/.git_keep/refs/remotes/origin/master +++ /dev/null @@ -1 +0,0 @@ -75c50688e5a8e48a00d1a824124221bcc6aad640 diff --git a/test/integration/setUpstream/expected/.git_keep/HEAD b/test/integration/pushWithCredentials/expected/origin/HEAD similarity index 100% rename from test/integration/setUpstream/expected/.git_keep/HEAD rename to test/integration/pushWithCredentials/expected/origin/HEAD diff --git a/test/integration/pushWithCredentials/expected/origin/config b/test/integration/pushWithCredentials/expected/origin/config new file mode 100644 index 000000000..97d87029a --- /dev/null +++ b/test/integration/pushWithCredentials/expected/origin/config @@ -0,0 +1,8 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/pushWithCredentials/actual/./repo diff --git a/test/integration/reflogHardReset/expected/.git_keep/description b/test/integration/pushWithCredentials/expected/origin/description similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/description rename to test/integration/pushWithCredentials/expected/origin/description diff --git a/test/integration/rebaseRewordOldCommit/expected/.git_keep/info/exclude b/test/integration/pushWithCredentials/expected/origin/info/exclude similarity index 100% rename from test/integration/rebaseRewordOldCommit/expected/.git_keep/info/exclude rename to test/integration/pushWithCredentials/expected/origin/info/exclude diff --git a/test/integration/submoduleEnter/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/pushWithCredentials/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/submoduleEnter/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/pushWithCredentials/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/rebaseRewordOldCommit/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/pushWithCredentials/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/rebaseRewordOldCommit/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/pushWithCredentials/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/pushWithCredentials/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/pushWithCredentials/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce new file mode 100644 index 000000000..0a734f981 Binary files /dev/null and b/test/integration/pushWithCredentials/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce differ diff --git a/test/integration/searching/expected/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 b/test/integration/pushWithCredentials/expected/origin/objects/2f/6174050380438f14b16658a356e762435ca591 similarity index 100% rename from test/integration/searching/expected/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 rename to test/integration/pushWithCredentials/expected/origin/objects/2f/6174050380438f14b16658a356e762435ca591 diff --git a/test/integration/pushWithCredentials/expected/origin/objects/3e/912c74bc7c237df0c521aff7b3f4932d7e8616 b/test/integration/pushWithCredentials/expected/origin/objects/3e/912c74bc7c237df0c521aff7b3f4932d7e8616 new file mode 100644 index 000000000..9a7993c8a --- /dev/null +++ b/test/integration/pushWithCredentials/expected/origin/objects/3e/912c74bc7c237df0c521aff7b3f4932d7e8616 @@ -0,0 +1,2 @@ +xŤŽA +Â0E]çŮ 2“IÚ"BW=F2™ÁBcK‰ ·7GpőáóřďóVëŇ,^ý©"Öe‰ă€E=‘&OŞ© iŽ™ĐqčÉbötČ«ŮcHI!ÂP0s9#¸+ŽnÔ±o‘Wؤw{n‡ťf{›ć‡|RÝWąđVďÉw'Ú3"€ém?ŐäOÜÔŻ.«ůóď:W \ No newline at end of file diff --git a/test/integration/pushWithCredentials/expected/origin/objects/5b/85aaf0806d1bc5830bb10291727f773c3402dc b/test/integration/pushWithCredentials/expected/origin/objects/5b/85aaf0806d1bc5830bb10291727f773c3402dc new file mode 100644 index 000000000..7ac5bf63c Binary files /dev/null and b/test/integration/pushWithCredentials/expected/origin/objects/5b/85aaf0806d1bc5830bb10291727f773c3402dc differ diff --git a/test/integration/pushWithCredentials/expected/origin/objects/5d/98350a913b48a35001ff9b54335f065b25fd7c b/test/integration/pushWithCredentials/expected/origin/objects/5d/98350a913b48a35001ff9b54335f065b25fd7c new file mode 100644 index 000000000..efbdd8e6b Binary files /dev/null and b/test/integration/pushWithCredentials/expected/origin/objects/5d/98350a913b48a35001ff9b54335f065b25fd7c differ diff --git a/test/integration/reflogCheckout/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/pushWithCredentials/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/pushWithCredentials/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/submoduleAdd/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/pushWithCredentials/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/submoduleAdd/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/pushWithCredentials/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/pushWithCredentials/expected/origin/objects/d1/08cb97213835c25d44e14d167e7c5b48f94ce2 b/test/integration/pushWithCredentials/expected/origin/objects/d1/08cb97213835c25d44e14d167e7c5b48f94ce2 new file mode 100644 index 000000000..a711ed381 --- /dev/null +++ b/test/integration/pushWithCredentials/expected/origin/objects/d1/08cb97213835c25d44e14d167e7c5b48f94ce2 @@ -0,0 +1,2 @@ +xŤÎA +Â0@Q×9ĹěÉd&“D„®zŚ4ť`ÁŘR"čííÜ~Ţâ—µµĄ&>ő]\ l˝Ąh™bEžPÄÇL^4cň%ű„fË»ľ:&t%đTBqćj‹wk UNäć QPL~÷ÇşĂ0ÂuďúÉm{ꥬí(‰…pF´Öőęú'7í[—§˛ůÚF8Í \ No newline at end of file diff --git a/test/integration/searching/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/pushWithCredentials/expected/origin/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/searching/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/pushWithCredentials/expected/origin/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/rebaseRewordOldCommit/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/pushWithCredentials/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/rebaseRewordOldCommit/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/pushWithCredentials/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/pushWithCredentials/expected/origin/packed-refs b/test/integration/pushWithCredentials/expected/origin/packed-refs new file mode 100644 index 000000000..a8749c608 --- /dev/null +++ b/test/integration/pushWithCredentials/expected/origin/packed-refs @@ -0,0 +1,2 @@ +# pack-refs with: peeled fully-peeled sorted +5b85aaf0806d1bc5830bb10291727f773c3402dc refs/heads/master diff --git a/test/integration/pushWithCredentials/expected/origin/refs/heads/master b/test/integration/pushWithCredentials/expected/origin/refs/heads/master new file mode 100644 index 000000000..12e3ae0c7 --- /dev/null +++ b/test/integration/pushWithCredentials/expected/origin/refs/heads/master @@ -0,0 +1 @@ +d108cb97213835c25d44e14d167e7c5b48f94ce2 diff --git a/test/integration/pushWithCredentials/expected/repo/.git_keep/COMMIT_EDITMSG b/test/integration/pushWithCredentials/expected/repo/.git_keep/COMMIT_EDITMSG new file mode 100644 index 000000000..51be8ec3d --- /dev/null +++ b/test/integration/pushWithCredentials/expected/repo/.git_keep/COMMIT_EDITMSG @@ -0,0 +1 @@ +myfile4 diff --git a/test/integration/pushWithCredentials/expected/repo/.git_keep/FETCH_HEAD b/test/integration/pushWithCredentials/expected/repo/.git_keep/FETCH_HEAD new file mode 100644 index 000000000..bfa52698e --- /dev/null +++ b/test/integration/pushWithCredentials/expected/repo/.git_keep/FETCH_HEAD @@ -0,0 +1 @@ +5b85aaf0806d1bc5830bb10291727f773c3402dc branch 'master' of ../origin diff --git a/test/integration/setUpstream/expected_remote/HEAD b/test/integration/pushWithCredentials/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/setUpstream/expected_remote/HEAD rename to test/integration/pushWithCredentials/expected/repo/.git_keep/HEAD diff --git a/test/integration/pushWithCredentials/expected/repo/.git_keep/config b/test/integration/pushWithCredentials/expected/repo/.git_keep/config new file mode 100644 index 000000000..7721ae814 --- /dev/null +++ b/test/integration/pushWithCredentials/expected/repo/.git_keep/config @@ -0,0 +1,16 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[user] + email = CI@example.com + name = CI +[remote "origin"] + url = ../origin + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "master"] + remote = origin + merge = refs/heads/master diff --git a/test/integration/rememberCommitMessageAfterFail/expected/.git_keep/description b/test/integration/pushWithCredentials/expected/repo/.git_keep/description similarity index 100% rename from test/integration/rememberCommitMessageAfterFail/expected/.git_keep/description rename to test/integration/pushWithCredentials/expected/repo/.git_keep/description diff --git a/test/integration/pushWithCredentials/expected/repo/.git_keep/index b/test/integration/pushWithCredentials/expected/repo/.git_keep/index new file mode 100644 index 000000000..0c9add5d7 Binary files /dev/null and b/test/integration/pushWithCredentials/expected/repo/.git_keep/index differ diff --git a/test/integration/rebaseSwapping/expected/.git_keep/info/exclude b/test/integration/pushWithCredentials/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/info/exclude rename to test/integration/pushWithCredentials/expected/repo/.git_keep/info/exclude diff --git a/test/integration/pushWithCredentials/expected/repo/.git_keep/logs/HEAD b/test/integration/pushWithCredentials/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..238148235 --- /dev/null +++ b/test/integration/pushWithCredentials/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,4 @@ +0000000000000000000000000000000000000000 5d98350a913b48a35001ff9b54335f065b25fd7c CI 1648348611 +1100 commit (initial): myfile1 +5d98350a913b48a35001ff9b54335f065b25fd7c 5b85aaf0806d1bc5830bb10291727f773c3402dc CI 1648348611 +1100 commit: myfile2 +5b85aaf0806d1bc5830bb10291727f773c3402dc 3e912c74bc7c237df0c521aff7b3f4932d7e8616 CI 1648348611 +1100 commit: myfile3 +3e912c74bc7c237df0c521aff7b3f4932d7e8616 d108cb97213835c25d44e14d167e7c5b48f94ce2 CI 1648348611 +1100 commit: myfile4 diff --git a/test/integration/pushWithCredentials/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/pushWithCredentials/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..238148235 --- /dev/null +++ b/test/integration/pushWithCredentials/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,4 @@ +0000000000000000000000000000000000000000 5d98350a913b48a35001ff9b54335f065b25fd7c CI 1648348611 +1100 commit (initial): myfile1 +5d98350a913b48a35001ff9b54335f065b25fd7c 5b85aaf0806d1bc5830bb10291727f773c3402dc CI 1648348611 +1100 commit: myfile2 +5b85aaf0806d1bc5830bb10291727f773c3402dc 3e912c74bc7c237df0c521aff7b3f4932d7e8616 CI 1648348611 +1100 commit: myfile3 +3e912c74bc7c237df0c521aff7b3f4932d7e8616 d108cb97213835c25d44e14d167e7c5b48f94ce2 CI 1648348611 +1100 commit: myfile4 diff --git a/test/integration/pushWithCredentials/expected/repo/.git_keep/logs/refs/remotes/origin/master b/test/integration/pushWithCredentials/expected/repo/.git_keep/logs/refs/remotes/origin/master new file mode 100644 index 000000000..a55b9f3a9 --- /dev/null +++ b/test/integration/pushWithCredentials/expected/repo/.git_keep/logs/refs/remotes/origin/master @@ -0,0 +1,2 @@ +0000000000000000000000000000000000000000 5b85aaf0806d1bc5830bb10291727f773c3402dc CI 1648348611 +1100 fetch origin: storing head +5b85aaf0806d1bc5830bb10291727f773c3402dc d108cb97213835c25d44e14d167e7c5b48f94ce2 CI 1648348616 +1100 update by push diff --git a/test/integration/submoduleRemove/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/pushWithCredentials/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/submoduleRemove/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/pushWithCredentials/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/rebaseSwapping/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/pushWithCredentials/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/pushWithCredentials/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/pushWithCredentials/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/pushWithCredentials/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce new file mode 100644 index 000000000..0a734f981 Binary files /dev/null and b/test/integration/pushWithCredentials/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce differ diff --git a/test/integration/setUpstream/expected/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 b/test/integration/pushWithCredentials/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 similarity index 100% rename from test/integration/setUpstream/expected/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 rename to test/integration/pushWithCredentials/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 diff --git a/test/integration/pushWithCredentials/expected/repo/.git_keep/objects/3e/912c74bc7c237df0c521aff7b3f4932d7e8616 b/test/integration/pushWithCredentials/expected/repo/.git_keep/objects/3e/912c74bc7c237df0c521aff7b3f4932d7e8616 new file mode 100644 index 000000000..9a7993c8a --- /dev/null +++ b/test/integration/pushWithCredentials/expected/repo/.git_keep/objects/3e/912c74bc7c237df0c521aff7b3f4932d7e8616 @@ -0,0 +1,2 @@ +xŤŽA +Â0E]çŮ 2“IÚ"BW=F2™ÁBcK‰ ·7GpőáóřďóVëŇ,^ý©"Öe‰ă€E=‘&OŞ© iŽ™ĐqčÉbötČ«ŮcHI!ÂP0s9#¸+ŽnÔ±o‘Wؤw{n‡ťf{›ć‡|RÝWąđVďÉw'Ú3"€ém?ŐäOÜÔŻ.«ůóď:W \ No newline at end of file diff --git a/test/integration/pushWithCredentials/expected/repo/.git_keep/objects/5b/85aaf0806d1bc5830bb10291727f773c3402dc b/test/integration/pushWithCredentials/expected/repo/.git_keep/objects/5b/85aaf0806d1bc5830bb10291727f773c3402dc new file mode 100644 index 000000000..7ac5bf63c Binary files /dev/null and b/test/integration/pushWithCredentials/expected/repo/.git_keep/objects/5b/85aaf0806d1bc5830bb10291727f773c3402dc differ diff --git a/test/integration/pushWithCredentials/expected/repo/.git_keep/objects/5d/98350a913b48a35001ff9b54335f065b25fd7c b/test/integration/pushWithCredentials/expected/repo/.git_keep/objects/5d/98350a913b48a35001ff9b54335f065b25fd7c new file mode 100644 index 000000000..efbdd8e6b Binary files /dev/null and b/test/integration/pushWithCredentials/expected/repo/.git_keep/objects/5d/98350a913b48a35001ff9b54335f065b25fd7c differ diff --git a/test/integration/reflogCherryPick/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/pushWithCredentials/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/pushWithCredentials/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/pushWithCredentials/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/pushWithCredentials/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/pushWithCredentials/expected/repo/.git_keep/objects/d1/08cb97213835c25d44e14d167e7c5b48f94ce2 b/test/integration/pushWithCredentials/expected/repo/.git_keep/objects/d1/08cb97213835c25d44e14d167e7c5b48f94ce2 new file mode 100644 index 000000000..a711ed381 --- /dev/null +++ b/test/integration/pushWithCredentials/expected/repo/.git_keep/objects/d1/08cb97213835c25d44e14d167e7c5b48f94ce2 @@ -0,0 +1,2 @@ +xŤÎA +Â0@Q×9ĹěÉd&“D„®zŚ4ť`ÁŘR"čííÜ~Ţâ—µµĄ&>ő]\ l˝Ąh™bEžPÄÇL^4cň%ű„fË»ľ:&t%đTBqćj‹wk UNäć QPL~÷ÇşĂ0ÂuďúÉm{ꥬí(‰…pF´Öőęú'7í[—§˛ůÚF8Í \ No newline at end of file diff --git a/test/integration/setUpstream/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/pushWithCredentials/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/setUpstream/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/pushWithCredentials/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/rebaseSwapping/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/pushWithCredentials/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/pushWithCredentials/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/pushWithCredentials/expected/repo/.git_keep/refs/heads/master b/test/integration/pushWithCredentials/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..12e3ae0c7 --- /dev/null +++ b/test/integration/pushWithCredentials/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +d108cb97213835c25d44e14d167e7c5b48f94ce2 diff --git a/test/integration/pushWithCredentials/expected/repo/.git_keep/refs/remotes/origin/master b/test/integration/pushWithCredentials/expected/repo/.git_keep/refs/remotes/origin/master new file mode 100644 index 000000000..12e3ae0c7 --- /dev/null +++ b/test/integration/pushWithCredentials/expected/repo/.git_keep/refs/remotes/origin/master @@ -0,0 +1 @@ +d108cb97213835c25d44e14d167e7c5b48f94ce2 diff --git a/test/integration/submoduleEnter/expected/other_repo/myfile1 b/test/integration/pushWithCredentials/expected/repo/myfile1 similarity index 100% rename from test/integration/submoduleEnter/expected/other_repo/myfile1 rename to test/integration/pushWithCredentials/expected/repo/myfile1 diff --git a/test/integration/submoduleAdd/expected/myfile2 b/test/integration/pushWithCredentials/expected/repo/myfile2 similarity index 100% rename from test/integration/submoduleAdd/expected/myfile2 rename to test/integration/pushWithCredentials/expected/repo/myfile2 diff --git a/test/integration/squash/expected/myfile3 b/test/integration/pushWithCredentials/expected/repo/myfile3 similarity index 100% rename from test/integration/squash/expected/myfile3 rename to test/integration/pushWithCredentials/expected/repo/myfile3 diff --git a/test/integration/searching/expected/myfile4 b/test/integration/pushWithCredentials/expected/repo/myfile4 similarity index 100% rename from test/integration/searching/expected/myfile4 rename to test/integration/pushWithCredentials/expected/repo/myfile4 diff --git a/test/integration/pushWithCredentials/expected_remote/config b/test/integration/pushWithCredentials/expected_remote/config deleted file mode 100644 index c498610f7..000000000 --- a/test/integration/pushWithCredentials/expected_remote/config +++ /dev/null @@ -1,8 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = true - ignorecase = true - precomposeunicode = true -[remote "origin"] - url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/pushWithCredentials/./actual diff --git a/test/integration/pushWithCredentials/expected_remote/objects/75/c50688e5a8e48a00d1a824124221bcc6aad640 b/test/integration/pushWithCredentials/expected_remote/objects/75/c50688e5a8e48a00d1a824124221bcc6aad640 deleted file mode 100644 index 53b925279..000000000 Binary files a/test/integration/pushWithCredentials/expected_remote/objects/75/c50688e5a8e48a00d1a824124221bcc6aad640 and /dev/null differ diff --git a/test/integration/pushWithCredentials/expected_remote/objects/ba/8cb1da2a48c38706b15552877d79e8745c4bff b/test/integration/pushWithCredentials/expected_remote/objects/ba/8cb1da2a48c38706b15552877d79e8745c4bff deleted file mode 100644 index e6612ab16..000000000 --- a/test/integration/pushWithCredentials/expected_remote/objects/ba/8cb1da2a48c38706b15552877d79e8745c4bff +++ /dev/null @@ -1,2 +0,0 @@ -xŤÍA -Â0@Q×9Ĺ왉ă4ˇ«#M&XčR"čííÜ~üÜĚ–Ärę»* J®d˘†Â¬¤ň‰ęŔ3_‹pMůć]z÷WŰaśŕ>NOý$ŰV˝äf a’ŁG8!şŁ“®rgßş¬Jî3Ť,Ő \ No newline at end of file diff --git a/test/integration/pushWithCredentials/expected_remote/objects/d9/ea8db22c1655e9861309cc97139357d20e4e64 b/test/integration/pushWithCredentials/expected_remote/objects/d9/ea8db22c1655e9861309cc97139357d20e4e64 deleted file mode 100644 index 16633475a..000000000 Binary files a/test/integration/pushWithCredentials/expected_remote/objects/d9/ea8db22c1655e9861309cc97139357d20e4e64 and /dev/null differ diff --git a/test/integration/pushWithCredentials/expected_remote/objects/ff/7015f162da19450f2eaf0fc24987104df30e15 b/test/integration/pushWithCredentials/expected_remote/objects/ff/7015f162da19450f2eaf0fc24987104df30e15 deleted file mode 100644 index c79143577..000000000 Binary files a/test/integration/pushWithCredentials/expected_remote/objects/ff/7015f162da19450f2eaf0fc24987104df30e15 and /dev/null differ diff --git a/test/integration/pushWithCredentials/expected_remote/packed-refs b/test/integration/pushWithCredentials/expected_remote/packed-refs deleted file mode 100644 index 66cf8b589..000000000 --- a/test/integration/pushWithCredentials/expected_remote/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# pack-refs with: peeled fully-peeled sorted -ff7015f162da19450f2eaf0fc24987104df30e15 refs/heads/master diff --git a/test/integration/pushWithCredentials/expected_remote/refs/heads/master b/test/integration/pushWithCredentials/expected_remote/refs/heads/master deleted file mode 100644 index b3746d069..000000000 --- a/test/integration/pushWithCredentials/expected_remote/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -75c50688e5a8e48a00d1a824124221bcc6aad640 diff --git a/test/integration/pushWithCredentials/setup.sh b/test/integration/pushWithCredentials/setup.sh index d39a13d5a..c3fccb5da 100644 --- a/test/integration/pushWithCredentials/setup.sh +++ b/test/integration/pushWithCredentials/setup.sh @@ -19,9 +19,9 @@ git add . git commit -am "myfile2" cd .. -git clone --bare ./actual actual_remote +git clone --bare ./repo origin -cd actual +cd repo echo test3 > myfile3 git add . @@ -30,10 +30,10 @@ echo test4 > myfile4 git add . git commit -am "myfile4" -git remote add origin ../actual_remote +git remote add origin ../origin git fetch origin git branch --set-upstream-to=origin/master master # actually getting a password prompt is tricky: it requires SSH'ing into localhost under a newly created, restricted, user. This is not easy to do in a cross-platform way, nor is it easy to do in a docker container. If you can think of a way to do it, please let me know! -cp ../../../hooks/pre-push .git/hooks/pre-push +cp ../../../../hooks/pre-push .git/hooks/pre-push chmod +x .git/hooks/pre-push diff --git a/test/integration/rebase/expected/.git_keep/COMMIT_EDITMSG b/test/integration/rebase/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/rebase/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/rebase/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/rebaseRewordLastCommit/expected/.git_keep/FETCH_HEAD b/test/integration/rebase/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/rebaseRewordLastCommit/expected/.git_keep/FETCH_HEAD rename to test/integration/rebase/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/squash/expected/.git_keep/HEAD b/test/integration/rebase/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/squash/expected/.git_keep/HEAD rename to test/integration/rebase/expected/repo/.git_keep/HEAD diff --git a/test/integration/rebase/expected/.git_keep/ORIG_HEAD b/test/integration/rebase/expected/repo/.git_keep/ORIG_HEAD similarity index 100% rename from test/integration/rebase/expected/.git_keep/ORIG_HEAD rename to test/integration/rebase/expected/repo/.git_keep/ORIG_HEAD diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/config b/test/integration/rebase/expected/repo/.git_keep/config similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/config rename to test/integration/rebase/expected/repo/.git_keep/config diff --git a/test/integration/searching/expected/.git_keep/description b/test/integration/rebase/expected/repo/.git_keep/description similarity index 100% rename from test/integration/searching/expected/.git_keep/description rename to test/integration/rebase/expected/repo/.git_keep/description diff --git a/test/integration/rebase/expected/.git_keep/index b/test/integration/rebase/expected/repo/.git_keep/index similarity index 100% rename from test/integration/rebase/expected/.git_keep/index rename to test/integration/rebase/expected/repo/.git_keep/index diff --git a/test/integration/reflogCheckout/expected/.git_keep/info/exclude b/test/integration/rebase/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/info/exclude rename to test/integration/rebase/expected/repo/.git_keep/info/exclude diff --git a/test/integration/rebase/expected/.git_keep/logs/HEAD b/test/integration/rebase/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/rebase/expected/.git_keep/logs/HEAD rename to test/integration/rebase/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/rebase/expected/.git_keep/logs/refs/heads/master b/test/integration/rebase/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/rebase/expected/.git_keep/logs/refs/heads/master rename to test/integration/rebase/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/reflogCheckout/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/rebase/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/rebase/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/rebase/expected/.git_keep/objects/18/24d7294d6d3524d83510db27086177a6db97bf b/test/integration/rebase/expected/repo/.git_keep/objects/18/24d7294d6d3524d83510db27086177a6db97bf similarity index 100% rename from test/integration/rebase/expected/.git_keep/objects/18/24d7294d6d3524d83510db27086177a6db97bf rename to test/integration/rebase/expected/repo/.git_keep/objects/18/24d7294d6d3524d83510db27086177a6db97bf diff --git a/test/integration/filterPath3/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/rebase/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/filterPath3/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/rebase/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/filterPath3/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/rebase/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/filterPath3/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/rebase/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/rebase/expected/.git_keep/objects/44/e5064a45438ffa3e6e4a0f1444552e2199be97 b/test/integration/rebase/expected/repo/.git_keep/objects/44/e5064a45438ffa3e6e4a0f1444552e2199be97 similarity index 100% rename from test/integration/rebase/expected/.git_keep/objects/44/e5064a45438ffa3e6e4a0f1444552e2199be97 rename to test/integration/rebase/expected/repo/.git_keep/objects/44/e5064a45438ffa3e6e4a0f1444552e2199be97 diff --git a/test/integration/rebase/expected/.git_keep/objects/47/614f63053804bc596291b8f7cff3b460b1b3ee b/test/integration/rebase/expected/repo/.git_keep/objects/47/614f63053804bc596291b8f7cff3b460b1b3ee similarity index 100% rename from test/integration/rebase/expected/.git_keep/objects/47/614f63053804bc596291b8f7cff3b460b1b3ee rename to test/integration/rebase/expected/repo/.git_keep/objects/47/614f63053804bc596291b8f7cff3b460b1b3ee diff --git a/test/integration/rebase/expected/.git_keep/objects/57/8ebf1736e797b78fb670c718ebf177936eb2ef b/test/integration/rebase/expected/repo/.git_keep/objects/57/8ebf1736e797b78fb670c718ebf177936eb2ef similarity index 100% rename from test/integration/rebase/expected/.git_keep/objects/57/8ebf1736e797b78fb670c718ebf177936eb2ef rename to test/integration/rebase/expected/repo/.git_keep/objects/57/8ebf1736e797b78fb670c718ebf177936eb2ef diff --git a/test/integration/rebase/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/rebase/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c similarity index 100% rename from test/integration/rebase/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c rename to test/integration/rebase/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/rebase/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/rebase/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/rebase/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/rebase/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 similarity index 100% rename from test/integration/rebase/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 rename to test/integration/rebase/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 diff --git a/test/integration/searching/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/rebase/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/searching/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/rebase/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/rebase/expected/.git_keep/objects/e8/ece6af94d443b67962124243509d8f61a29758 b/test/integration/rebase/expected/repo/.git_keep/objects/e8/ece6af94d443b67962124243509d8f61a29758 similarity index 100% rename from test/integration/rebase/expected/.git_keep/objects/e8/ece6af94d443b67962124243509d8f61a29758 rename to test/integration/rebase/expected/repo/.git_keep/objects/e8/ece6af94d443b67962124243509d8f61a29758 diff --git a/test/integration/rebase/expected/.git_keep/objects/ec/fc5809e3397bbda6bd4c9f47267a8c5f22346c b/test/integration/rebase/expected/repo/.git_keep/objects/ec/fc5809e3397bbda6bd4c9f47267a8c5f22346c similarity index 100% rename from test/integration/rebase/expected/.git_keep/objects/ec/fc5809e3397bbda6bd4c9f47267a8c5f22346c rename to test/integration/rebase/expected/repo/.git_keep/objects/ec/fc5809e3397bbda6bd4c9f47267a8c5f22346c diff --git a/test/integration/rebase/expected/.git_keep/objects/fa/af373a925c1e335894ebf4343a00a917f04edc b/test/integration/rebase/expected/repo/.git_keep/objects/fa/af373a925c1e335894ebf4343a00a917f04edc similarity index 100% rename from test/integration/rebase/expected/.git_keep/objects/fa/af373a925c1e335894ebf4343a00a917f04edc rename to test/integration/rebase/expected/repo/.git_keep/objects/fa/af373a925c1e335894ebf4343a00a917f04edc diff --git a/test/integration/rebase/expected/.git_keep/refs/heads/master b/test/integration/rebase/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/rebase/expected/.git_keep/refs/heads/master rename to test/integration/rebase/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/filterPath3/expected/file0 b/test/integration/rebase/expected/repo/file0 similarity index 100% rename from test/integration/filterPath3/expected/file0 rename to test/integration/rebase/expected/repo/file0 diff --git a/test/integration/rebase2/expected/file1 b/test/integration/rebase/expected/repo/file1 similarity index 100% rename from test/integration/rebase2/expected/file1 rename to test/integration/rebase/expected/repo/file1 diff --git a/test/integration/mergeConflictsFiltered/expected/directory/file2 b/test/integration/rebase/expected/repo/file2 similarity index 100% rename from test/integration/mergeConflictsFiltered/expected/directory/file2 rename to test/integration/rebase/expected/repo/file2 diff --git a/test/integration/rebase/expected/file4 b/test/integration/rebase/expected/repo/file4 similarity index 100% rename from test/integration/rebase/expected/file4 rename to test/integration/rebase/expected/repo/file4 diff --git a/test/integration/rebase2/expected/.git_keep/COMMIT_EDITMSG b/test/integration/rebase2/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/rebase2/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/rebase2/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/rebaseRewordOldCommit/expected/.git_keep/FETCH_HEAD b/test/integration/rebase2/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/rebaseRewordOldCommit/expected/.git_keep/FETCH_HEAD rename to test/integration/rebase2/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/staginWithDiffContextChange/expected/.git_keep/HEAD b/test/integration/rebase2/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/staginWithDiffContextChange/expected/.git_keep/HEAD rename to test/integration/rebase2/expected/repo/.git_keep/HEAD diff --git a/test/integration/rebase2/expected/.git_keep/MERGE_MSG b/test/integration/rebase2/expected/repo/.git_keep/MERGE_MSG similarity index 100% rename from test/integration/rebase2/expected/.git_keep/MERGE_MSG rename to test/integration/rebase2/expected/repo/.git_keep/MERGE_MSG diff --git a/test/integration/rebase2/expected/.git_keep/ORIG_HEAD b/test/integration/rebase2/expected/repo/.git_keep/ORIG_HEAD similarity index 100% rename from test/integration/rebase2/expected/.git_keep/ORIG_HEAD rename to test/integration/rebase2/expected/repo/.git_keep/ORIG_HEAD diff --git a/test/integration/rebase2/expected/.git_keep/REBASE_HEAD b/test/integration/rebase2/expected/repo/.git_keep/REBASE_HEAD similarity index 100% rename from test/integration/rebase2/expected/.git_keep/REBASE_HEAD rename to test/integration/rebase2/expected/repo/.git_keep/REBASE_HEAD diff --git a/test/integration/rebaseFixups/expected/.git_keep/config b/test/integration/rebase2/expected/repo/.git_keep/config similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/config rename to test/integration/rebase2/expected/repo/.git_keep/config diff --git a/test/integration/searchingInStagingPanel/expected/.git_keep/description b/test/integration/rebase2/expected/repo/.git_keep/description similarity index 100% rename from test/integration/searchingInStagingPanel/expected/.git_keep/description rename to test/integration/rebase2/expected/repo/.git_keep/description diff --git a/test/integration/rebase2/expected/.git_keep/index b/test/integration/rebase2/expected/repo/.git_keep/index similarity index 100% rename from test/integration/rebase2/expected/.git_keep/index rename to test/integration/rebase2/expected/repo/.git_keep/index diff --git a/test/integration/reflogCherryPick/expected/.git_keep/info/exclude b/test/integration/rebase2/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/info/exclude rename to test/integration/rebase2/expected/repo/.git_keep/info/exclude diff --git a/test/integration/rebase2/expected/.git_keep/logs/HEAD b/test/integration/rebase2/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/rebase2/expected/.git_keep/logs/HEAD rename to test/integration/rebase2/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/rebase2/expected/.git_keep/logs/refs/heads/master b/test/integration/rebase2/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/rebase2/expected/.git_keep/logs/refs/heads/master rename to test/integration/rebase2/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/reflogCherryPick/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/rebase2/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/rebase2/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/rebase/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/rebase2/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/rebase/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/rebase2/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/rebase2/expected/.git_keep/objects/26/d430fb59900099e9992a3c79f30e42309cdce3 b/test/integration/rebase2/expected/repo/.git_keep/objects/26/d430fb59900099e9992a3c79f30e42309cdce3 similarity index 100% rename from test/integration/rebase2/expected/.git_keep/objects/26/d430fb59900099e9992a3c79f30e42309cdce3 rename to test/integration/rebase2/expected/repo/.git_keep/objects/26/d430fb59900099e9992a3c79f30e42309cdce3 diff --git a/test/integration/rebase/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/rebase2/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/rebase/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/rebase2/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/rebase2/expected/.git_keep/objects/44/e5064a45438ffa3e6e4a0f1444552e2199be97 b/test/integration/rebase2/expected/repo/.git_keep/objects/44/e5064a45438ffa3e6e4a0f1444552e2199be97 similarity index 100% rename from test/integration/rebase2/expected/.git_keep/objects/44/e5064a45438ffa3e6e4a0f1444552e2199be97 rename to test/integration/rebase2/expected/repo/.git_keep/objects/44/e5064a45438ffa3e6e4a0f1444552e2199be97 diff --git a/test/integration/rebase2/expected/.git_keep/objects/4a/edafb1a5d371825cbfea5ffcf2692cc786a1bf b/test/integration/rebase2/expected/repo/.git_keep/objects/4a/edafb1a5d371825cbfea5ffcf2692cc786a1bf similarity index 100% rename from test/integration/rebase2/expected/.git_keep/objects/4a/edafb1a5d371825cbfea5ffcf2692cc786a1bf rename to test/integration/rebase2/expected/repo/.git_keep/objects/4a/edafb1a5d371825cbfea5ffcf2692cc786a1bf diff --git a/test/integration/rebase3/expected/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f b/test/integration/rebase2/expected/repo/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f similarity index 100% rename from test/integration/rebase3/expected/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f rename to test/integration/rebase2/expected/repo/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f diff --git a/test/integration/rebase2/expected/.git_keep/objects/61/baf480bb5ddfad6d66c785b321d4aadd5367b4 b/test/integration/rebase2/expected/repo/.git_keep/objects/61/baf480bb5ddfad6d66c785b321d4aadd5367b4 similarity index 100% rename from test/integration/rebase2/expected/.git_keep/objects/61/baf480bb5ddfad6d66c785b321d4aadd5367b4 rename to test/integration/rebase2/expected/repo/.git_keep/objects/61/baf480bb5ddfad6d66c785b321d4aadd5367b4 diff --git a/test/integration/rebase2/expected/.git_keep/objects/8d/3ce0d821345b25fef1188e48cba4a1d44c30be b/test/integration/rebase2/expected/repo/.git_keep/objects/8d/3ce0d821345b25fef1188e48cba4a1d44c30be similarity index 100% rename from test/integration/rebase2/expected/.git_keep/objects/8d/3ce0d821345b25fef1188e48cba4a1d44c30be rename to test/integration/rebase2/expected/repo/.git_keep/objects/8d/3ce0d821345b25fef1188e48cba4a1d44c30be diff --git a/test/integration/rebase2/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/rebase2/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c similarity index 100% rename from test/integration/rebase2/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c rename to test/integration/rebase2/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c diff --git a/test/integration/reflogHardReset/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/rebase2/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/rebase2/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/rebase2/expected/.git_keep/objects/bb/c22338ee174004f5c5fa117688249bc5b7e205 b/test/integration/rebase2/expected/repo/.git_keep/objects/bb/c22338ee174004f5c5fa117688249bc5b7e205 similarity index 100% rename from test/integration/rebase2/expected/.git_keep/objects/bb/c22338ee174004f5c5fa117688249bc5b7e205 rename to test/integration/rebase2/expected/repo/.git_keep/objects/bb/c22338ee174004f5c5fa117688249bc5b7e205 diff --git a/test/integration/rebase2/expected/.git_keep/objects/bc/e4745137c540943900ca78e4b31dd1315bf57c b/test/integration/rebase2/expected/repo/.git_keep/objects/bc/e4745137c540943900ca78e4b31dd1315bf57c similarity index 100% rename from test/integration/rebase2/expected/.git_keep/objects/bc/e4745137c540943900ca78e4b31dd1315bf57c rename to test/integration/rebase2/expected/repo/.git_keep/objects/bc/e4745137c540943900ca78e4b31dd1315bf57c diff --git a/test/integration/rebase2/expected/.git_keep/objects/c3/6e808d2fa61e16952b7d0ffb8f18d08156cc94 b/test/integration/rebase2/expected/repo/.git_keep/objects/c3/6e808d2fa61e16952b7d0ffb8f18d08156cc94 similarity index 100% rename from test/integration/rebase2/expected/.git_keep/objects/c3/6e808d2fa61e16952b7d0ffb8f18d08156cc94 rename to test/integration/rebase2/expected/repo/.git_keep/objects/c3/6e808d2fa61e16952b7d0ffb8f18d08156cc94 diff --git a/test/integration/rebase2/expected/.git_keep/objects/c3/901284a9e7fc063d6fa7f0c5797d031445ba45 b/test/integration/rebase2/expected/repo/.git_keep/objects/c3/901284a9e7fc063d6fa7f0c5797d031445ba45 similarity index 100% rename from test/integration/rebase2/expected/.git_keep/objects/c3/901284a9e7fc063d6fa7f0c5797d031445ba45 rename to test/integration/rebase2/expected/repo/.git_keep/objects/c3/901284a9e7fc063d6fa7f0c5797d031445ba45 diff --git a/test/integration/rebase2/expected/.git_keep/objects/cc/01bf15804065932f5e50340902614b3c04c948 b/test/integration/rebase2/expected/repo/.git_keep/objects/cc/01bf15804065932f5e50340902614b3c04c948 similarity index 100% rename from test/integration/rebase2/expected/.git_keep/objects/cc/01bf15804065932f5e50340902614b3c04c948 rename to test/integration/rebase2/expected/repo/.git_keep/objects/cc/01bf15804065932f5e50340902614b3c04c948 diff --git a/test/integration/rebase2/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/rebase2/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 similarity index 100% rename from test/integration/rebase2/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 rename to test/integration/rebase2/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 diff --git a/test/integration/setUpstream/expected_remote/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/rebase2/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/setUpstream/expected_remote/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/rebase2/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/setUpstream/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/rebase2/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/setUpstream/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/rebase2/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/rebase2/expected/.git_keep/objects/f9/4292928d0bc034fe88c753306b1959300e1264 b/test/integration/rebase2/expected/repo/.git_keep/objects/f9/4292928d0bc034fe88c753306b1959300e1264 similarity index 100% rename from test/integration/rebase2/expected/.git_keep/objects/f9/4292928d0bc034fe88c753306b1959300e1264 rename to test/integration/rebase2/expected/repo/.git_keep/objects/f9/4292928d0bc034fe88c753306b1959300e1264 diff --git a/test/integration/rebase2/expected/.git_keep/objects/ff/3fb62dafc2fdd0c81ed64bc132b53584e5e1e2 b/test/integration/rebase2/expected/repo/.git_keep/objects/ff/3fb62dafc2fdd0c81ed64bc132b53584e5e1e2 similarity index 100% rename from test/integration/rebase2/expected/.git_keep/objects/ff/3fb62dafc2fdd0c81ed64bc132b53584e5e1e2 rename to test/integration/rebase2/expected/repo/.git_keep/objects/ff/3fb62dafc2fdd0c81ed64bc132b53584e5e1e2 diff --git a/test/integration/rebase2/expected/.git_keep/refs/heads/master b/test/integration/rebase2/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/rebase2/expected/.git_keep/refs/heads/master rename to test/integration/rebase2/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/rebase/expected/file0 b/test/integration/rebase2/expected/repo/file0 similarity index 100% rename from test/integration/rebase/expected/file0 rename to test/integration/rebase2/expected/repo/file0 diff --git a/test/integration/rebase3/expected/file1 b/test/integration/rebase2/expected/repo/file1 similarity index 100% rename from test/integration/rebase3/expected/file1 rename to test/integration/rebase2/expected/repo/file1 diff --git a/test/integration/rebase/expected/file2 b/test/integration/rebase2/expected/repo/file2 similarity index 100% rename from test/integration/rebase/expected/file2 rename to test/integration/rebase2/expected/repo/file2 diff --git a/test/integration/rebase2/expected/file4 b/test/integration/rebase2/expected/repo/file4 similarity index 100% rename from test/integration/rebase2/expected/file4 rename to test/integration/rebase2/expected/repo/file4 diff --git a/test/integration/rebase3/expected/.git_keep/COMMIT_EDITMSG b/test/integration/rebase3/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/rebase3/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/rebase3/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/rebaseSwapping/expected/.git_keep/FETCH_HEAD b/test/integration/rebase3/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/FETCH_HEAD rename to test/integration/rebase3/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/staging/expected/.git_keep/HEAD b/test/integration/rebase3/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/staging/expected/.git_keep/HEAD rename to test/integration/rebase3/expected/repo/.git_keep/HEAD diff --git a/test/integration/rebase3/expected/.git_keep/ORIG_HEAD b/test/integration/rebase3/expected/repo/.git_keep/ORIG_HEAD similarity index 100% rename from test/integration/rebase3/expected/.git_keep/ORIG_HEAD rename to test/integration/rebase3/expected/repo/.git_keep/ORIG_HEAD diff --git a/test/integration/rebaseRewordLastCommit/expected/.git_keep/config b/test/integration/rebase3/expected/repo/.git_keep/config similarity index 100% rename from test/integration/rebaseRewordLastCommit/expected/.git_keep/config rename to test/integration/rebase3/expected/repo/.git_keep/config diff --git a/test/integration/setUpstream/expected/.git_keep/description b/test/integration/rebase3/expected/repo/.git_keep/description similarity index 100% rename from test/integration/setUpstream/expected/.git_keep/description rename to test/integration/rebase3/expected/repo/.git_keep/description diff --git a/test/integration/rebase3/expected/.git_keep/index b/test/integration/rebase3/expected/repo/.git_keep/index similarity index 100% rename from test/integration/rebase3/expected/.git_keep/index rename to test/integration/rebase3/expected/repo/.git_keep/index diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/info/exclude b/test/integration/rebase3/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/info/exclude rename to test/integration/rebase3/expected/repo/.git_keep/info/exclude diff --git a/test/integration/rebase3/expected/.git_keep/logs/HEAD b/test/integration/rebase3/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/rebase3/expected/.git_keep/logs/HEAD rename to test/integration/rebase3/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/rebase3/expected/.git_keep/logs/refs/heads/master b/test/integration/rebase3/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/rebase3/expected/.git_keep/logs/refs/heads/master rename to test/integration/rebase3/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/rebase3/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/rebase3/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/rebase2/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/rebase3/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/rebase2/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/rebase3/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/rebase2/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/rebase3/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/rebase2/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/rebase3/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/rebase3/expected/.git_keep/objects/3c/21f03d819ae34b74084712c3ef1b9b99b2f40e b/test/integration/rebase3/expected/repo/.git_keep/objects/3c/21f03d819ae34b74084712c3ef1b9b99b2f40e similarity index 100% rename from test/integration/rebase3/expected/.git_keep/objects/3c/21f03d819ae34b74084712c3ef1b9b99b2f40e rename to test/integration/rebase3/expected/repo/.git_keep/objects/3c/21f03d819ae34b74084712c3ef1b9b99b2f40e diff --git a/test/integration/rebase3/expected/.git_keep/objects/44/e5064a45438ffa3e6e4a0f1444552e2199be97 b/test/integration/rebase3/expected/repo/.git_keep/objects/44/e5064a45438ffa3e6e4a0f1444552e2199be97 similarity index 100% rename from test/integration/rebase3/expected/.git_keep/objects/44/e5064a45438ffa3e6e4a0f1444552e2199be97 rename to test/integration/rebase3/expected/repo/.git_keep/objects/44/e5064a45438ffa3e6e4a0f1444552e2199be97 diff --git a/test/integration/rebase3/expected/.git_keep/objects/4b/f6ae41c5ef2186c87f5f39dbb8cadd76c597cc b/test/integration/rebase3/expected/repo/.git_keep/objects/4b/f6ae41c5ef2186c87f5f39dbb8cadd76c597cc similarity index 100% rename from test/integration/rebase3/expected/.git_keep/objects/4b/f6ae41c5ef2186c87f5f39dbb8cadd76c597cc rename to test/integration/rebase3/expected/repo/.git_keep/objects/4b/f6ae41c5ef2186c87f5f39dbb8cadd76c597cc diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f b/test/integration/rebase3/expected/repo/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f rename to test/integration/rebase3/expected/repo/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f diff --git a/test/integration/rebase3/expected/.git_keep/objects/51/a0e4a6635c22a062a48b7134dd556541a1e06c b/test/integration/rebase3/expected/repo/.git_keep/objects/51/a0e4a6635c22a062a48b7134dd556541a1e06c similarity index 100% rename from test/integration/rebase3/expected/.git_keep/objects/51/a0e4a6635c22a062a48b7134dd556541a1e06c rename to test/integration/rebase3/expected/repo/.git_keep/objects/51/a0e4a6635c22a062a48b7134dd556541a1e06c diff --git a/test/integration/rebase3/expected/.git_keep/objects/7b/42ba8a9f370bbbf0db85c5aca61f4e8a7b3d26 b/test/integration/rebase3/expected/repo/.git_keep/objects/7b/42ba8a9f370bbbf0db85c5aca61f4e8a7b3d26 similarity index 100% rename from test/integration/rebase3/expected/.git_keep/objects/7b/42ba8a9f370bbbf0db85c5aca61f4e8a7b3d26 rename to test/integration/rebase3/expected/repo/.git_keep/objects/7b/42ba8a9f370bbbf0db85c5aca61f4e8a7b3d26 diff --git a/test/integration/rebase3/expected/.git_keep/objects/8f/2acebb8a7a83cfaf3cffc6a9103f633f5cf292 b/test/integration/rebase3/expected/repo/.git_keep/objects/8f/2acebb8a7a83cfaf3cffc6a9103f633f5cf292 similarity index 100% rename from test/integration/rebase3/expected/.git_keep/objects/8f/2acebb8a7a83cfaf3cffc6a9103f633f5cf292 rename to test/integration/rebase3/expected/repo/.git_keep/objects/8f/2acebb8a7a83cfaf3cffc6a9103f633f5cf292 diff --git a/test/integration/rebase3/expected/.git_keep/objects/9e/68fbe4291e7416d50587d9b6968aa5ceeccff9 b/test/integration/rebase3/expected/repo/.git_keep/objects/9e/68fbe4291e7416d50587d9b6968aa5ceeccff9 similarity index 100% rename from test/integration/rebase3/expected/.git_keep/objects/9e/68fbe4291e7416d50587d9b6968aa5ceeccff9 rename to test/integration/rebase3/expected/repo/.git_keep/objects/9e/68fbe4291e7416d50587d9b6968aa5ceeccff9 diff --git a/test/integration/rebase3/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/rebase3/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c similarity index 100% rename from test/integration/rebase3/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c rename to test/integration/rebase3/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c diff --git a/test/integration/searching/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/rebase3/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/searching/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/rebase3/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/rebase3/expected/.git_keep/objects/cc/01bf15804065932f5e50340902614b3c04c948 b/test/integration/rebase3/expected/repo/.git_keep/objects/cc/01bf15804065932f5e50340902614b3c04c948 similarity index 100% rename from test/integration/rebase3/expected/.git_keep/objects/cc/01bf15804065932f5e50340902614b3c04c948 rename to test/integration/rebase3/expected/repo/.git_keep/objects/cc/01bf15804065932f5e50340902614b3c04c948 diff --git a/test/integration/rebase3/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/rebase3/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 similarity index 100% rename from test/integration/rebase3/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 rename to test/integration/rebase3/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 diff --git a/test/integration/squash/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/rebase3/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 similarity index 100% rename from test/integration/squash/expected/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 rename to test/integration/rebase3/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 diff --git a/test/integration/rebase3/expected/.git_keep/objects/d8/ae31faf375fd293cedb0c88c41a9c7a77a2530 b/test/integration/rebase3/expected/repo/.git_keep/objects/d8/ae31faf375fd293cedb0c88c41a9c7a77a2530 similarity index 100% rename from test/integration/rebase3/expected/.git_keep/objects/d8/ae31faf375fd293cedb0c88c41a9c7a77a2530 rename to test/integration/rebase3/expected/repo/.git_keep/objects/d8/ae31faf375fd293cedb0c88c41a9c7a77a2530 diff --git a/test/integration/setUpstream/expected_remote/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/rebase3/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/setUpstream/expected_remote/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/rebase3/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/rebase3/expected/.git_keep/objects/f0/6dfb4e9e5a9dfab869590058f2c1ce1c72b2ac b/test/integration/rebase3/expected/repo/.git_keep/objects/f0/6dfb4e9e5a9dfab869590058f2c1ce1c72b2ac similarity index 100% rename from test/integration/rebase3/expected/.git_keep/objects/f0/6dfb4e9e5a9dfab869590058f2c1ce1c72b2ac rename to test/integration/rebase3/expected/repo/.git_keep/objects/f0/6dfb4e9e5a9dfab869590058f2c1ce1c72b2ac diff --git a/test/integration/rebase3/expected/.git_keep/objects/fd/ecf9e3e742db4c8690d56b328b2533e67d2866 b/test/integration/rebase3/expected/repo/.git_keep/objects/fd/ecf9e3e742db4c8690d56b328b2533e67d2866 similarity index 100% rename from test/integration/rebase3/expected/.git_keep/objects/fd/ecf9e3e742db4c8690d56b328b2533e67d2866 rename to test/integration/rebase3/expected/repo/.git_keep/objects/fd/ecf9e3e742db4c8690d56b328b2533e67d2866 diff --git a/test/integration/rebase3/expected/.git_keep/objects/ff/3fb62dafc2fdd0c81ed64bc132b53584e5e1e2 b/test/integration/rebase3/expected/repo/.git_keep/objects/ff/3fb62dafc2fdd0c81ed64bc132b53584e5e1e2 similarity index 100% rename from test/integration/rebase3/expected/.git_keep/objects/ff/3fb62dafc2fdd0c81ed64bc132b53584e5e1e2 rename to test/integration/rebase3/expected/repo/.git_keep/objects/ff/3fb62dafc2fdd0c81ed64bc132b53584e5e1e2 diff --git a/test/integration/rebase3/expected/.git_keep/refs/heads/master b/test/integration/rebase3/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/rebase3/expected/.git_keep/refs/heads/master rename to test/integration/rebase3/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/rebase2/expected/file0 b/test/integration/rebase3/expected/repo/file0 similarity index 100% rename from test/integration/rebase2/expected/file0 rename to test/integration/rebase3/expected/repo/file0 diff --git a/test/integration/rebaseFixupAndSquash/expected/file1 b/test/integration/rebase3/expected/repo/file1 similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/file1 rename to test/integration/rebase3/expected/repo/file1 diff --git a/test/integration/rebase2/expected/file2 b/test/integration/rebase3/expected/repo/file2 similarity index 100% rename from test/integration/rebase2/expected/file2 rename to test/integration/rebase3/expected/repo/file2 diff --git a/test/integration/rebase3/expected/file4 b/test/integration/rebase3/expected/repo/file4 similarity index 100% rename from test/integration/rebase3/expected/file4 rename to test/integration/rebase3/expected/repo/file4 diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/COMMIT_EDITMSG b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/reflogCheckout/expected/.git_keep/FETCH_HEAD b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/FETCH_HEAD rename to test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/stagingTwo/expected/.git_keep/HEAD b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/stagingTwo/expected/.git_keep/HEAD rename to test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/HEAD diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/ORIG_HEAD b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/ORIG_HEAD similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/ORIG_HEAD rename to test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/ORIG_HEAD diff --git a/test/integration/rebaseRewordOldCommit/expected/.git_keep/config b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/config similarity index 100% rename from test/integration/rebaseRewordOldCommit/expected/.git_keep/config rename to test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/config diff --git a/test/integration/setUpstream/expected_remote/description b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/description similarity index 100% rename from test/integration/setUpstream/expected_remote/description rename to test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/description diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/index b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/index similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/index rename to test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/index diff --git a/test/integration/reflogHardReset/expected/.git_keep/info/exclude b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/info/exclude rename to test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/info/exclude diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/logs/HEAD b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/logs/HEAD rename to test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/logs/refs/heads/master b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/logs/refs/heads/master rename to test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/0d/633de5bd380e6b42e03ec1e7a055ba4f3c860d b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/0d/633de5bd380e6b42e03ec1e7a055ba4f3c860d similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/0d/633de5bd380e6b42e03ec1e7a055ba4f3c860d rename to test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/0d/633de5bd380e6b42e03ec1e7a055ba4f3c860d diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/12/ed10a6439eadfdb8877e39b7c6547591a0a91c b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/12/ed10a6439eadfdb8877e39b7c6547591a0a91c similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/12/ed10a6439eadfdb8877e39b7c6547591a0a91c rename to test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/12/ed10a6439eadfdb8877e39b7c6547591a0a91c diff --git a/test/integration/reflogHardReset/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/1d/197a4c509a5e71bad9b0b439c8fd26323ff218 b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/1d/197a4c509a5e71bad9b0b439c8fd26323ff218 similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/1d/197a4c509a5e71bad9b0b439c8fd26323ff218 rename to test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/1d/197a4c509a5e71bad9b0b439c8fd26323ff218 diff --git a/test/integration/rebase3/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/rebase3/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/rebase3/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/rebase3/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/44/e5064a45438ffa3e6e4a0f1444552e2199be97 b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/44/e5064a45438ffa3e6e4a0f1444552e2199be97 similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/44/e5064a45438ffa3e6e4a0f1444552e2199be97 rename to test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/44/e5064a45438ffa3e6e4a0f1444552e2199be97 diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/4a/e4346ad59bf70d5ba07184af5a138b6a65c224 b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/4a/e4346ad59bf70d5ba07184af5a138b6a65c224 similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/4a/e4346ad59bf70d5ba07184af5a138b6a65c224 rename to test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/4a/e4346ad59bf70d5ba07184af5a138b6a65c224 diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/4d/c7f318f68fe1890dba6fb595009c4652c0a861 b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/4d/c7f318f68fe1890dba6fb595009c4652c0a861 similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/4d/c7f318f68fe1890dba6fb595009c4652c0a861 rename to test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/4d/c7f318f68fe1890dba6fb595009c4652c0a861 diff --git a/test/integration/rebaseFixups/expected/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f rename to test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/74/d431c56eac1e359f6f5736978347af68af5702 b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/74/d431c56eac1e359f6f5736978347af68af5702 similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/74/d431c56eac1e359f6f5736978347af68af5702 rename to test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/74/d431c56eac1e359f6f5736978347af68af5702 diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/76/79fc004a4a40da12907d72ccef14991976aaff b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/76/79fc004a4a40da12907d72ccef14991976aaff similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/76/79fc004a4a40da12907d72ccef14991976aaff rename to test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/76/79fc004a4a40da12907d72ccef14991976aaff diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/7b/01314ccdeccc57cee454feca6369237410e786 b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/7b/01314ccdeccc57cee454feca6369237410e786 similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/7b/01314ccdeccc57cee454feca6369237410e786 rename to test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/7b/01314ccdeccc57cee454feca6369237410e786 diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/8a/db7457de59c3945566ce7675a31bbf048b38ee b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/8a/db7457de59c3945566ce7675a31bbf048b38ee similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/8a/db7457de59c3945566ce7675a31bbf048b38ee rename to test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/8a/db7457de59c3945566ce7675a31bbf048b38ee diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c rename to test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c diff --git a/test/integration/setUpstream/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/setUpstream/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/cc/01bf15804065932f5e50340902614b3c04c948 b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/cc/01bf15804065932f5e50340902614b3c04c948 similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/cc/01bf15804065932f5e50340902614b3c04c948 rename to test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/cc/01bf15804065932f5e50340902614b3c04c948 diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 rename to test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 diff --git a/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 new file mode 100644 index 000000000..d39fa7d2f Binary files /dev/null and b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 differ diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/db/ab7e62cd7517f73425d46120a931a59c8eda6e b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/db/ab7e62cd7517f73425d46120a931a59c8eda6e similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/db/ab7e62cd7517f73425d46120a931a59c8eda6e rename to test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/db/ab7e62cd7517f73425d46120a931a59c8eda6e diff --git a/test/integration/squash/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/squash/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/ff/3fb62dafc2fdd0c81ed64bc132b53584e5e1e2 b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/ff/3fb62dafc2fdd0c81ed64bc132b53584e5e1e2 similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/ff/3fb62dafc2fdd0c81ed64bc132b53584e5e1e2 rename to test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/objects/ff/3fb62dafc2fdd0c81ed64bc132b53584e5e1e2 diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/refs/heads/master b/test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/refs/heads/master rename to test/integration/rebaseFixupAndSquash/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/rebase3/expected/file0 b/test/integration/rebaseFixupAndSquash/expected/repo/file0 similarity index 100% rename from test/integration/rebase3/expected/file0 rename to test/integration/rebaseFixupAndSquash/expected/repo/file0 diff --git a/test/integration/rebaseFixups/expected/file1 b/test/integration/rebaseFixupAndSquash/expected/repo/file1 similarity index 100% rename from test/integration/rebaseFixups/expected/file1 rename to test/integration/rebaseFixupAndSquash/expected/repo/file1 diff --git a/test/integration/rebase3/expected/file2 b/test/integration/rebaseFixupAndSquash/expected/repo/file2 similarity index 100% rename from test/integration/rebase3/expected/file2 rename to test/integration/rebaseFixupAndSquash/expected/repo/file2 diff --git a/test/integration/rebaseFixupAndSquash/expected/file4 b/test/integration/rebaseFixupAndSquash/expected/repo/file4 similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/file4 rename to test/integration/rebaseFixupAndSquash/expected/repo/file4 diff --git a/test/integration/rebaseFixups/expected/.git_keep/COMMIT_EDITMSG b/test/integration/rebaseFixups/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/rebaseFixups/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/reflogCherryPick/expected/.git_keep/FETCH_HEAD b/test/integration/rebaseFixups/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/FETCH_HEAD rename to test/integration/rebaseFixups/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/stash/expected/.git_keep/HEAD b/test/integration/rebaseFixups/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/stash/expected/.git_keep/HEAD rename to test/integration/rebaseFixups/expected/repo/.git_keep/HEAD diff --git a/test/integration/rebaseFixups/expected/.git_keep/ORIG_HEAD b/test/integration/rebaseFixups/expected/repo/.git_keep/ORIG_HEAD similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/ORIG_HEAD rename to test/integration/rebaseFixups/expected/repo/.git_keep/ORIG_HEAD diff --git a/test/integration/rebaseSwapping/expected/.git_keep/config b/test/integration/rebaseFixups/expected/repo/.git_keep/config similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/config rename to test/integration/rebaseFixups/expected/repo/.git_keep/config diff --git a/test/integration/squash/expected/.git_keep/description b/test/integration/rebaseFixups/expected/repo/.git_keep/description similarity index 100% rename from test/integration/squash/expected/.git_keep/description rename to test/integration/rebaseFixups/expected/repo/.git_keep/description diff --git a/test/integration/rebaseFixups/expected/.git_keep/index b/test/integration/rebaseFixups/expected/repo/.git_keep/index similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/index rename to test/integration/rebaseFixups/expected/repo/.git_keep/index diff --git a/test/integration/searching/expected/.git_keep/info/exclude b/test/integration/rebaseFixups/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/searching/expected/.git_keep/info/exclude rename to test/integration/rebaseFixups/expected/repo/.git_keep/info/exclude diff --git a/test/integration/rebaseFixups/expected/.git_keep/logs/HEAD b/test/integration/rebaseFixups/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/logs/HEAD rename to test/integration/rebaseFixups/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/rebaseFixups/expected/.git_keep/logs/refs/heads/master b/test/integration/rebaseFixups/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/logs/refs/heads/master rename to test/integration/rebaseFixups/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/rebaseFixups/expected/.git_keep/objects/10/56fd624d61daad06a8726c0ea5626820cafe59 b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/10/56fd624d61daad06a8726c0ea5626820cafe59 similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/objects/10/56fd624d61daad06a8726c0ea5626820cafe59 rename to test/integration/rebaseFixups/expected/repo/.git_keep/objects/10/56fd624d61daad06a8726c0ea5626820cafe59 diff --git a/test/integration/searching/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/searching/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/rebaseFixups/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/rebaseFixups/expected/.git_keep/objects/1d/7ab21ab5322589052cf9d2d62ca58677f454cc b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/1d/7ab21ab5322589052cf9d2d62ca58677f454cc similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/objects/1d/7ab21ab5322589052cf9d2d62ca58677f454cc rename to test/integration/rebaseFixups/expected/repo/.git_keep/objects/1d/7ab21ab5322589052cf9d2d62ca58677f454cc diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/rebaseFixups/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/rebaseFixups/expected/.git_keep/objects/2a/627747a92ce8c274f7df0da3329616f69b9856 b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/2a/627747a92ce8c274f7df0da3329616f69b9856 similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/objects/2a/627747a92ce8c274f7df0da3329616f69b9856 rename to test/integration/rebaseFixups/expected/repo/.git_keep/objects/2a/627747a92ce8c274f7df0da3329616f69b9856 diff --git a/test/integration/rebaseFixups/expected/.git_keep/objects/2b/d4d58d29b60b5868c19437ff4467d84ed270aa b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/2b/d4d58d29b60b5868c19437ff4467d84ed270aa similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/objects/2b/d4d58d29b60b5868c19437ff4467d84ed270aa rename to test/integration/rebaseFixups/expected/repo/.git_keep/objects/2b/d4d58d29b60b5868c19437ff4467d84ed270aa diff --git a/test/integration/rebaseFixups/expected/.git_keep/objects/30/a685cfa43930aadd5b56b2ec0746564d1a1d22 b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/30/a685cfa43930aadd5b56b2ec0746564d1a1d22 similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/objects/30/a685cfa43930aadd5b56b2ec0746564d1a1d22 rename to test/integration/rebaseFixups/expected/repo/.git_keep/objects/30/a685cfa43930aadd5b56b2ec0746564d1a1d22 diff --git a/test/integration/rebaseFixups/expected/.git_keep/objects/33/1be377b5889b19b5900bc4bed98b1c9cc40095 b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/33/1be377b5889b19b5900bc4bed98b1c9cc40095 similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/objects/33/1be377b5889b19b5900bc4bed98b1c9cc40095 rename to test/integration/rebaseFixups/expected/repo/.git_keep/objects/33/1be377b5889b19b5900bc4bed98b1c9cc40095 diff --git a/test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/rebaseFixups/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/rebaseFixups/expected/.git_keep/objects/44/e5064a45438ffa3e6e4a0f1444552e2199be97 b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/44/e5064a45438ffa3e6e4a0f1444552e2199be97 similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/objects/44/e5064a45438ffa3e6e4a0f1444552e2199be97 rename to test/integration/rebaseFixups/expected/repo/.git_keep/objects/44/e5064a45438ffa3e6e4a0f1444552e2199be97 diff --git a/test/integration/rebaseFixups/expected/.git_keep/objects/4d/7b35df7f8ced30495fc0f62b91a270bad7076b b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/4d/7b35df7f8ced30495fc0f62b91a270bad7076b similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/objects/4d/7b35df7f8ced30495fc0f62b91a270bad7076b rename to test/integration/rebaseFixups/expected/repo/.git_keep/objects/4d/7b35df7f8ced30495fc0f62b91a270bad7076b diff --git a/test/integration/rebaseSwapping/expected/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f rename to test/integration/rebaseFixups/expected/repo/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f diff --git a/test/integration/rebaseFixups/expected/.git_keep/objects/69/ebe8bf01f728a9bc787e8553694e36127b48c0 b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/69/ebe8bf01f728a9bc787e8553694e36127b48c0 similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/objects/69/ebe8bf01f728a9bc787e8553694e36127b48c0 rename to test/integration/rebaseFixups/expected/repo/.git_keep/objects/69/ebe8bf01f728a9bc787e8553694e36127b48c0 diff --git a/test/integration/rebaseFixups/expected/.git_keep/objects/77/741cf500de50347e9f4e5a091515e4568ddad3 b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/77/741cf500de50347e9f4e5a091515e4568ddad3 similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/objects/77/741cf500de50347e9f4e5a091515e4568ddad3 rename to test/integration/rebaseFixups/expected/repo/.git_keep/objects/77/741cf500de50347e9f4e5a091515e4568ddad3 diff --git a/test/integration/rebaseFixups/expected/repo/.git_keep/objects/83/90c32b5e687b97e242da46498b574ace0e1eb5 b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/83/90c32b5e687b97e242da46498b574ace0e1eb5 new file mode 100644 index 000000000..be495f399 Binary files /dev/null and b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/83/90c32b5e687b97e242da46498b574ace0e1eb5 differ diff --git a/test/integration/rebaseFixups/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c rename to test/integration/rebaseFixups/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c diff --git a/test/integration/setUpstream/expected_remote/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/setUpstream/expected_remote/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/rebaseFixups/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/rebaseFixups/expected/.git_keep/objects/ac/e527b9737b6c554963361f50ce98a0509c2344 b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/ac/e527b9737b6c554963361f50ce98a0509c2344 similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/objects/ac/e527b9737b6c554963361f50ce98a0509c2344 rename to test/integration/rebaseFixups/expected/repo/.git_keep/objects/ac/e527b9737b6c554963361f50ce98a0509c2344 diff --git a/test/integration/rebaseFixups/expected/.git_keep/objects/ad/46c1683d660e21b4f13ad808420a4de18326b7 b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/ad/46c1683d660e21b4f13ad808420a4de18326b7 similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/objects/ad/46c1683d660e21b4f13ad808420a4de18326b7 rename to test/integration/rebaseFixups/expected/repo/.git_keep/objects/ad/46c1683d660e21b4f13ad808420a4de18326b7 diff --git a/test/integration/rebaseFixups/expected/.git_keep/objects/b8/c4d6287efcb68cdffbac00ec15ffc25f575cc5 b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/b8/c4d6287efcb68cdffbac00ec15ffc25f575cc5 similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/objects/b8/c4d6287efcb68cdffbac00ec15ffc25f575cc5 rename to test/integration/rebaseFixups/expected/repo/.git_keep/objects/b8/c4d6287efcb68cdffbac00ec15ffc25f575cc5 diff --git a/test/integration/rebaseFixups/expected/.git_keep/objects/ba/860ef885ce294ade006af8afda01a8cc584a12 b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/ba/860ef885ce294ade006af8afda01a8cc584a12 similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/objects/ba/860ef885ce294ade006af8afda01a8cc584a12 rename to test/integration/rebaseFixups/expected/repo/.git_keep/objects/ba/860ef885ce294ade006af8afda01a8cc584a12 diff --git a/test/integration/rebaseFixups/expected/.git_keep/objects/c8/07dfd74adc1e1b732025cab46cf56b4d193e74 b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/c8/07dfd74adc1e1b732025cab46cf56b4d193e74 similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/objects/c8/07dfd74adc1e1b732025cab46cf56b4d193e74 rename to test/integration/rebaseFixups/expected/repo/.git_keep/objects/c8/07dfd74adc1e1b732025cab46cf56b4d193e74 diff --git a/test/integration/rebaseFixups/expected/.git_keep/objects/c8/738908c85292494dba61be9c050ad95ff0e182 b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/c8/738908c85292494dba61be9c050ad95ff0e182 similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/objects/c8/738908c85292494dba61be9c050ad95ff0e182 rename to test/integration/rebaseFixups/expected/repo/.git_keep/objects/c8/738908c85292494dba61be9c050ad95ff0e182 diff --git a/test/integration/rebaseFixups/expected/.git_keep/objects/cc/01bf15804065932f5e50340902614b3c04c948 b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/cc/01bf15804065932f5e50340902614b3c04c948 similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/objects/cc/01bf15804065932f5e50340902614b3c04c948 rename to test/integration/rebaseFixups/expected/repo/.git_keep/objects/cc/01bf15804065932f5e50340902614b3c04c948 diff --git a/test/integration/rebaseFixups/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 rename to test/integration/rebaseFixups/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 diff --git a/test/integration/rebaseFixups/expected/.git_keep/objects/d1/3e563982268d8ab77ad47793a2b501dfe6a0dc b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/d1/3e563982268d8ab77ad47793a2b501dfe6a0dc similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/objects/d1/3e563982268d8ab77ad47793a2b501dfe6a0dc rename to test/integration/rebaseFixups/expected/repo/.git_keep/objects/d1/3e563982268d8ab77ad47793a2b501dfe6a0dc diff --git a/test/integration/rebaseFixups/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 new file mode 100644 index 000000000..d39fa7d2f Binary files /dev/null and b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 differ diff --git a/test/integration/rebaseFixups/expected/.git_keep/objects/dc/bade3308277dabb66de476c1cce03bd840d22a b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/dc/bade3308277dabb66de476c1cce03bd840d22a similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/objects/dc/bade3308277dabb66de476c1cce03bd840d22a rename to test/integration/rebaseFixups/expected/repo/.git_keep/objects/dc/bade3308277dabb66de476c1cce03bd840d22a diff --git a/test/integration/tags2/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/tags2/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/rebaseFixups/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/rebaseFixups/expected/.git_keep/objects/e3/ad04c1fd3c9137b052ecb422855052f044d88f b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/e3/ad04c1fd3c9137b052ecb422855052f044d88f similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/objects/e3/ad04c1fd3c9137b052ecb422855052f044d88f rename to test/integration/rebaseFixups/expected/repo/.git_keep/objects/e3/ad04c1fd3c9137b052ecb422855052f044d88f diff --git a/test/integration/rebaseFixups/expected/.git_keep/objects/ff/3fb62dafc2fdd0c81ed64bc132b53584e5e1e2 b/test/integration/rebaseFixups/expected/repo/.git_keep/objects/ff/3fb62dafc2fdd0c81ed64bc132b53584e5e1e2 similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/objects/ff/3fb62dafc2fdd0c81ed64bc132b53584e5e1e2 rename to test/integration/rebaseFixups/expected/repo/.git_keep/objects/ff/3fb62dafc2fdd0c81ed64bc132b53584e5e1e2 diff --git a/test/integration/rebaseFixups/expected/.git_keep/refs/heads/master b/test/integration/rebaseFixups/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/refs/heads/master rename to test/integration/rebaseFixups/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/rebaseFixupAndSquash/expected/file0 b/test/integration/rebaseFixups/expected/repo/file0 similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/file0 rename to test/integration/rebaseFixups/expected/repo/file0 diff --git a/test/integration/rebaseRewordLastCommit/expected/file1 b/test/integration/rebaseFixups/expected/repo/file1 similarity index 100% rename from test/integration/rebaseRewordLastCommit/expected/file1 rename to test/integration/rebaseFixups/expected/repo/file1 diff --git a/test/integration/rebaseFixupAndSquash/expected/file2 b/test/integration/rebaseFixups/expected/repo/file2 similarity index 100% rename from test/integration/rebaseFixupAndSquash/expected/file2 rename to test/integration/rebaseFixups/expected/repo/file2 diff --git a/test/integration/rebaseFixups/expected/file4 b/test/integration/rebaseFixups/expected/repo/file4 similarity index 100% rename from test/integration/rebaseFixups/expected/file4 rename to test/integration/rebaseFixups/expected/repo/file4 diff --git a/test/integration/rebaseFixups/expected/file5 b/test/integration/rebaseFixups/expected/repo/file5 similarity index 100% rename from test/integration/rebaseFixups/expected/file5 rename to test/integration/rebaseFixups/expected/repo/file5 diff --git a/test/integration/rebaseFixups/expected/file6 b/test/integration/rebaseFixups/expected/repo/file6 similarity index 100% rename from test/integration/rebaseFixups/expected/file6 rename to test/integration/rebaseFixups/expected/repo/file6 diff --git a/test/integration/rebaseRewordLastCommit/expected/.git_keep/COMMIT_EDITMSG b/test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/rebaseRewordLastCommit/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/FETCH_HEAD b/test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/FETCH_HEAD rename to test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/stashDrop/expected/.git_keep/HEAD b/test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/stashDrop/expected/.git_keep/HEAD rename to test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/HEAD diff --git a/test/integration/reflogCheckout/expected/.git_keep/config b/test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/config similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/config rename to test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/config diff --git a/test/integration/staginWithDiffContextChange/expected/.git_keep/description b/test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/description similarity index 100% rename from test/integration/staginWithDiffContextChange/expected/.git_keep/description rename to test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/description diff --git a/test/integration/rebaseRewordLastCommit/expected/.git_keep/index b/test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/index similarity index 100% rename from test/integration/rebaseRewordLastCommit/expected/.git_keep/index rename to test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/index diff --git a/test/integration/searchingInStagingPanel/expected/.git_keep/info/exclude b/test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/searchingInStagingPanel/expected/.git_keep/info/exclude rename to test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/info/exclude diff --git a/test/integration/rebaseRewordLastCommit/expected/.git_keep/logs/HEAD b/test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/rebaseRewordLastCommit/expected/.git_keep/logs/HEAD rename to test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/rebaseRewordLastCommit/expected/.git_keep/logs/refs/heads/master b/test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/rebaseRewordLastCommit/expected/.git_keep/logs/refs/heads/master rename to test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/setUpstream/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/setUpstream/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/rebaseFixups/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/rebaseFixups/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/rebaseFixups/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/rebaseRewordLastCommit/expected/.git_keep/objects/59/f4e88de812c15bf0fa7b224cdb361f7ede8931 b/test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/objects/59/f4e88de812c15bf0fa7b224cdb361f7ede8931 similarity index 100% rename from test/integration/rebaseRewordLastCommit/expected/.git_keep/objects/59/f4e88de812c15bf0fa7b224cdb361f7ede8931 rename to test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/objects/59/f4e88de812c15bf0fa7b224cdb361f7ede8931 diff --git a/test/integration/rebaseRewordLastCommit/expected/.git_keep/objects/74/abc9e0d0ec8dd0f5ea872a851364206008ea2b b/test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/objects/74/abc9e0d0ec8dd0f5ea872a851364206008ea2b similarity index 100% rename from test/integration/rebaseRewordLastCommit/expected/.git_keep/objects/74/abc9e0d0ec8dd0f5ea872a851364206008ea2b rename to test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/objects/74/abc9e0d0ec8dd0f5ea872a851364206008ea2b diff --git a/test/integration/rebaseRewordLastCommit/expected/.git_keep/objects/97/066d3866b8e5ead0b68fc746a02222408f28a3 b/test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/objects/97/066d3866b8e5ead0b68fc746a02222408f28a3 similarity index 100% rename from test/integration/rebaseRewordLastCommit/expected/.git_keep/objects/97/066d3866b8e5ead0b68fc746a02222408f28a3 rename to test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/objects/97/066d3866b8e5ead0b68fc746a02222408f28a3 diff --git a/test/integration/rebaseRewordLastCommit/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c similarity index 100% rename from test/integration/rebaseRewordLastCommit/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c rename to test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c diff --git a/test/integration/squash/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/squash/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/rebaseRewordLastCommit/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 similarity index 100% rename from test/integration/rebaseRewordLastCommit/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 rename to test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 diff --git a/test/integration/rebaseRewordLastCommit/expected/.git_keep/objects/d4/83ea1d742e44d9191f3e31e926d7621c513042 b/test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/objects/d4/83ea1d742e44d9191f3e31e926d7621c513042 similarity index 100% rename from test/integration/rebaseRewordLastCommit/expected/.git_keep/objects/d4/83ea1d742e44d9191f3e31e926d7621c513042 rename to test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/objects/d4/83ea1d742e44d9191f3e31e926d7621c513042 diff --git a/test/integration/tags3/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b similarity index 100% rename from test/integration/tags3/expected/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b rename to test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b diff --git a/test/integration/rebaseRewordLastCommit/expected/.git_keep/objects/e2/98537fd470f70bbb174d78f610fe49539cfe66 b/test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/objects/e2/98537fd470f70bbb174d78f610fe49539cfe66 similarity index 100% rename from test/integration/rebaseRewordLastCommit/expected/.git_keep/objects/e2/98537fd470f70bbb174d78f610fe49539cfe66 rename to test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/objects/e2/98537fd470f70bbb174d78f610fe49539cfe66 diff --git a/test/integration/rebaseRewordLastCommit/expected/.git_keep/refs/heads/master b/test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/rebaseRewordLastCommit/expected/.git_keep/refs/heads/master rename to test/integration/rebaseRewordLastCommit/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/rebaseFixups/expected/file0 b/test/integration/rebaseRewordLastCommit/expected/repo/file0 similarity index 100% rename from test/integration/rebaseFixups/expected/file0 rename to test/integration/rebaseRewordLastCommit/expected/repo/file0 diff --git a/test/integration/rebaseRewordOldCommit/expected/file1 b/test/integration/rebaseRewordLastCommit/expected/repo/file1 similarity index 100% rename from test/integration/rebaseRewordOldCommit/expected/file1 rename to test/integration/rebaseRewordLastCommit/expected/repo/file1 diff --git a/test/integration/rebaseFixups/expected/file2 b/test/integration/rebaseRewordLastCommit/expected/repo/file2 similarity index 100% rename from test/integration/rebaseFixups/expected/file2 rename to test/integration/rebaseRewordLastCommit/expected/repo/file2 diff --git a/test/integration/rebaseRewordOldCommit/expected/file3 b/test/integration/rebaseRewordLastCommit/expected/repo/file3 similarity index 100% rename from test/integration/rebaseRewordOldCommit/expected/file3 rename to test/integration/rebaseRewordLastCommit/expected/repo/file3 diff --git a/test/integration/rebaseRewordOldCommit/expected/.git_keep/COMMIT_EDITMSG b/test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/rebaseRewordOldCommit/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/reflogHardReset/expected/.git_keep/FETCH_HEAD b/test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/FETCH_HEAD rename to test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/stashPop/expected/.git_keep/HEAD b/test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/stashPop/expected/.git_keep/HEAD rename to test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/HEAD diff --git a/test/integration/rebaseRewordOldCommit/expected/.git_keep/ORIG_HEAD b/test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/ORIG_HEAD similarity index 100% rename from test/integration/rebaseRewordOldCommit/expected/.git_keep/ORIG_HEAD rename to test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/ORIG_HEAD diff --git a/test/integration/reflogCherryPick/expected/.git_keep/config b/test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/config similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/config rename to test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/config diff --git a/test/integration/staging/expected/.git_keep/description b/test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/description similarity index 100% rename from test/integration/staging/expected/.git_keep/description rename to test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/description diff --git a/test/integration/rebaseRewordOldCommit/expected/.git_keep/index b/test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/index similarity index 100% rename from test/integration/rebaseRewordOldCommit/expected/.git_keep/index rename to test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/index diff --git a/test/integration/setUpstream/expected/.git_keep/info/exclude b/test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/setUpstream/expected/.git_keep/info/exclude rename to test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/info/exclude diff --git a/test/integration/rebaseRewordOldCommit/expected/.git_keep/logs/HEAD b/test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/rebaseRewordOldCommit/expected/.git_keep/logs/HEAD rename to test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/rebaseRewordOldCommit/expected/.git_keep/logs/refs/heads/master b/test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/rebaseRewordOldCommit/expected/.git_keep/logs/refs/heads/master rename to test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/setUpstream/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/setUpstream/expected_remote/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/rebaseRewordOldCommit/expected/.git_keep/objects/1b/cb7e30b3a5a5ae64397dcfe6b74cc18fc55784 b/test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/objects/1b/cb7e30b3a5a5ae64397dcfe6b74cc18fc55784 similarity index 100% rename from test/integration/rebaseRewordOldCommit/expected/.git_keep/objects/1b/cb7e30b3a5a5ae64397dcfe6b74cc18fc55784 rename to test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/objects/1b/cb7e30b3a5a5ae64397dcfe6b74cc18fc55784 diff --git a/test/integration/rebaseRewordLastCommit/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/rebaseRewordLastCommit/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/rebaseRewordLastCommit/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/rebaseRewordLastCommit/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/rebaseRewordOldCommit/expected/.git_keep/objects/3c/3125afd7a6475dcdd4c4a6b20cc920b31eb96f b/test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/objects/3c/3125afd7a6475dcdd4c4a6b20cc920b31eb96f similarity index 100% rename from test/integration/rebaseRewordOldCommit/expected/.git_keep/objects/3c/3125afd7a6475dcdd4c4a6b20cc920b31eb96f rename to test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/objects/3c/3125afd7a6475dcdd4c4a6b20cc920b31eb96f diff --git a/test/integration/rebaseRewordOldCommit/expected/.git_keep/objects/44/79c0a1c7e43a55a3a6909be88a810dbad3fc42 b/test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/objects/44/79c0a1c7e43a55a3a6909be88a810dbad3fc42 similarity index 100% rename from test/integration/rebaseRewordOldCommit/expected/.git_keep/objects/44/79c0a1c7e43a55a3a6909be88a810dbad3fc42 rename to test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/objects/44/79c0a1c7e43a55a3a6909be88a810dbad3fc42 diff --git a/test/integration/rebaseRewordOldCommit/expected/.git_keep/objects/64/7b9df53752363ecdc1d4c5cebe7d66e6132bfe b/test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/objects/64/7b9df53752363ecdc1d4c5cebe7d66e6132bfe similarity index 100% rename from test/integration/rebaseRewordOldCommit/expected/.git_keep/objects/64/7b9df53752363ecdc1d4c5cebe7d66e6132bfe rename to test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/objects/64/7b9df53752363ecdc1d4c5cebe7d66e6132bfe diff --git a/test/integration/rebaseRewordOldCommit/expected/.git_keep/objects/7c/5b8c907caad01842aa84e91b7d4724d57de4fd b/test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/objects/7c/5b8c907caad01842aa84e91b7d4724d57de4fd similarity index 100% rename from test/integration/rebaseRewordOldCommit/expected/.git_keep/objects/7c/5b8c907caad01842aa84e91b7d4724d57de4fd rename to test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/objects/7c/5b8c907caad01842aa84e91b7d4724d57de4fd diff --git a/test/integration/rebaseRewordOldCommit/expected/.git_keep/objects/9d/793e4fc04a0583eed7670d52fbb16b402f7499 b/test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/objects/9d/793e4fc04a0583eed7670d52fbb16b402f7499 similarity index 100% rename from test/integration/rebaseRewordOldCommit/expected/.git_keep/objects/9d/793e4fc04a0583eed7670d52fbb16b402f7499 rename to test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/objects/9d/793e4fc04a0583eed7670d52fbb16b402f7499 diff --git a/test/integration/rebaseRewordOldCommit/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c similarity index 100% rename from test/integration/rebaseRewordOldCommit/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c rename to test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c diff --git a/test/integration/stash/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/stash/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/rebaseRewordOldCommit/expected/.git_keep/objects/c0/793b482cdf9ca48686dbf56fc0a46e982003e1 b/test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/objects/c0/793b482cdf9ca48686dbf56fc0a46e982003e1 similarity index 100% rename from test/integration/rebaseRewordOldCommit/expected/.git_keep/objects/c0/793b482cdf9ca48686dbf56fc0a46e982003e1 rename to test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/objects/c0/793b482cdf9ca48686dbf56fc0a46e982003e1 diff --git a/test/integration/rebaseRewordOldCommit/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 similarity index 100% rename from test/integration/rebaseRewordOldCommit/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 rename to test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 diff --git a/test/integration/rebaseRewordOldCommit/expected/.git_keep/objects/d4/83ea1d742e44d9191f3e31e926d7621c513042 b/test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/objects/d4/83ea1d742e44d9191f3e31e926d7621c513042 similarity index 100% rename from test/integration/rebaseRewordOldCommit/expected/.git_keep/objects/d4/83ea1d742e44d9191f3e31e926d7621c513042 rename to test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/objects/d4/83ea1d742e44d9191f3e31e926d7621c513042 diff --git a/test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b new file mode 100644 index 000000000..9b771fc2f Binary files /dev/null and b/test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b differ diff --git a/test/integration/rebaseRewordOldCommit/expected/.git_keep/refs/heads/master b/test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/rebaseRewordOldCommit/expected/.git_keep/refs/heads/master rename to test/integration/rebaseRewordOldCommit/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/rebaseRewordLastCommit/expected/file0 b/test/integration/rebaseRewordOldCommit/expected/repo/file0 similarity index 100% rename from test/integration/rebaseRewordLastCommit/expected/file0 rename to test/integration/rebaseRewordOldCommit/expected/repo/file0 diff --git a/test/integration/rebaseSwapping/expected/file1 b/test/integration/rebaseRewordOldCommit/expected/repo/file1 similarity index 100% rename from test/integration/rebaseSwapping/expected/file1 rename to test/integration/rebaseRewordOldCommit/expected/repo/file1 diff --git a/test/integration/rebaseRewordLastCommit/expected/file2 b/test/integration/rebaseRewordOldCommit/expected/repo/file2 similarity index 100% rename from test/integration/rebaseRewordLastCommit/expected/file2 rename to test/integration/rebaseRewordOldCommit/expected/repo/file2 diff --git a/test/integration/rebaseRewordOldCommit/expected/repo/file3 b/test/integration/rebaseRewordOldCommit/expected/repo/file3 new file mode 100644 index 000000000..df6b0d2bc --- /dev/null +++ b/test/integration/rebaseRewordOldCommit/expected/repo/file3 @@ -0,0 +1 @@ +test3 diff --git a/test/integration/rebaseSwapping/expected/.git_keep/COMMIT_EDITMSG b/test/integration/rebaseSwapping/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/rebaseSwapping/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/rememberCommitMessageAfterFail/expected/.git_keep/FETCH_HEAD b/test/integration/rebaseSwapping/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/rememberCommitMessageAfterFail/expected/.git_keep/FETCH_HEAD rename to test/integration/rebaseSwapping/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/stash_Copy/expected/.git_keep/HEAD b/test/integration/rebaseSwapping/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/stash_Copy/expected/.git_keep/HEAD rename to test/integration/rebaseSwapping/expected/repo/.git_keep/HEAD diff --git a/test/integration/rebaseSwapping/expected/.git_keep/ORIG_HEAD b/test/integration/rebaseSwapping/expected/repo/.git_keep/ORIG_HEAD similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/ORIG_HEAD rename to test/integration/rebaseSwapping/expected/repo/.git_keep/ORIG_HEAD diff --git a/test/integration/rebaseSwapping/expected/.git_keep/REBASE_HEAD b/test/integration/rebaseSwapping/expected/repo/.git_keep/REBASE_HEAD similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/REBASE_HEAD rename to test/integration/rebaseSwapping/expected/repo/.git_keep/REBASE_HEAD diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/config b/test/integration/rebaseSwapping/expected/repo/.git_keep/config similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/config rename to test/integration/rebaseSwapping/expected/repo/.git_keep/config diff --git a/test/integration/stagingTwo/expected/.git_keep/description b/test/integration/rebaseSwapping/expected/repo/.git_keep/description similarity index 100% rename from test/integration/stagingTwo/expected/.git_keep/description rename to test/integration/rebaseSwapping/expected/repo/.git_keep/description diff --git a/test/integration/rebaseSwapping/expected/.git_keep/index b/test/integration/rebaseSwapping/expected/repo/.git_keep/index similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/index rename to test/integration/rebaseSwapping/expected/repo/.git_keep/index diff --git a/test/integration/setUpstream/expected_remote/info/exclude b/test/integration/rebaseSwapping/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/setUpstream/expected_remote/info/exclude rename to test/integration/rebaseSwapping/expected/repo/.git_keep/info/exclude diff --git a/test/integration/rebaseSwapping/expected/.git_keep/logs/HEAD b/test/integration/rebaseSwapping/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/logs/HEAD rename to test/integration/rebaseSwapping/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/rebaseSwapping/expected/.git_keep/logs/refs/heads/master b/test/integration/rebaseSwapping/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/logs/refs/heads/master rename to test/integration/rebaseSwapping/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/rebaseSwapping/expected/.git_keep/objects/0e/45fe2fb8b21adfe348ec5419bd87e4c796c02a b/test/integration/rebaseSwapping/expected/repo/.git_keep/objects/0e/45fe2fb8b21adfe348ec5419bd87e4c796c02a similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/objects/0e/45fe2fb8b21adfe348ec5419bd87e4c796c02a rename to test/integration/rebaseSwapping/expected/repo/.git_keep/objects/0e/45fe2fb8b21adfe348ec5419bd87e4c796c02a diff --git a/test/integration/squash/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/rebaseSwapping/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/squash/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/rebaseSwapping/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/rebaseRewordOldCommit/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/rebaseSwapping/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/rebaseRewordOldCommit/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/rebaseSwapping/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/rebaseRewordOldCommit/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/rebaseSwapping/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/rebaseRewordOldCommit/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/rebaseSwapping/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/rebaseSwapping/expected/.git_keep/objects/41/eefd8a741d391640c4e0528e0b6fff31f90a18 b/test/integration/rebaseSwapping/expected/repo/.git_keep/objects/41/eefd8a741d391640c4e0528e0b6fff31f90a18 similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/objects/41/eefd8a741d391640c4e0528e0b6fff31f90a18 rename to test/integration/rebaseSwapping/expected/repo/.git_keep/objects/41/eefd8a741d391640c4e0528e0b6fff31f90a18 diff --git a/test/integration/rebaseSwapping/expected/.git_keep/objects/44/e5064a45438ffa3e6e4a0f1444552e2199be97 b/test/integration/rebaseSwapping/expected/repo/.git_keep/objects/44/e5064a45438ffa3e6e4a0f1444552e2199be97 similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/objects/44/e5064a45438ffa3e6e4a0f1444552e2199be97 rename to test/integration/rebaseSwapping/expected/repo/.git_keep/objects/44/e5064a45438ffa3e6e4a0f1444552e2199be97 diff --git a/test/integration/searching/expected/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f b/test/integration/rebaseSwapping/expected/repo/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f similarity index 100% rename from test/integration/searching/expected/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f rename to test/integration/rebaseSwapping/expected/repo/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f diff --git a/test/integration/rebaseSwapping/expected/.git_keep/objects/5e/6e75233f7d0501f030400c0b55d4c778b72b73 b/test/integration/rebaseSwapping/expected/repo/.git_keep/objects/5e/6e75233f7d0501f030400c0b55d4c778b72b73 similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/objects/5e/6e75233f7d0501f030400c0b55d4c778b72b73 rename to test/integration/rebaseSwapping/expected/repo/.git_keep/objects/5e/6e75233f7d0501f030400c0b55d4c778b72b73 diff --git a/test/integration/rebaseSwapping/expected/.git_keep/objects/61/3c1bfa180babe5e67317d1ef42d566718a7d8f b/test/integration/rebaseSwapping/expected/repo/.git_keep/objects/61/3c1bfa180babe5e67317d1ef42d566718a7d8f similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/objects/61/3c1bfa180babe5e67317d1ef42d566718a7d8f rename to test/integration/rebaseSwapping/expected/repo/.git_keep/objects/61/3c1bfa180babe5e67317d1ef42d566718a7d8f diff --git a/test/integration/rebaseSwapping/expected/.git_keep/objects/84/c7a918e6bd704aaf4f789ecaea479ab31d4741 b/test/integration/rebaseSwapping/expected/repo/.git_keep/objects/84/c7a918e6bd704aaf4f789ecaea479ab31d4741 similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/objects/84/c7a918e6bd704aaf4f789ecaea479ab31d4741 rename to test/integration/rebaseSwapping/expected/repo/.git_keep/objects/84/c7a918e6bd704aaf4f789ecaea479ab31d4741 diff --git a/test/integration/rebaseSwapping/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/rebaseSwapping/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c rename to test/integration/rebaseSwapping/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c diff --git a/test/integration/stashDrop/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/rebaseSwapping/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/stashDrop/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/rebaseSwapping/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/rebaseSwapping/expected/.git_keep/objects/ac/32b36c1b300cc79ad3f16dfb3c8a77ea7f4965 b/test/integration/rebaseSwapping/expected/repo/.git_keep/objects/ac/32b36c1b300cc79ad3f16dfb3c8a77ea7f4965 similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/objects/ac/32b36c1b300cc79ad3f16dfb3c8a77ea7f4965 rename to test/integration/rebaseSwapping/expected/repo/.git_keep/objects/ac/32b36c1b300cc79ad3f16dfb3c8a77ea7f4965 diff --git a/test/integration/rebaseSwapping/expected/.git_keep/objects/b2/18d34eec545f29156411f24ab609b970082e1c b/test/integration/rebaseSwapping/expected/repo/.git_keep/objects/b2/18d34eec545f29156411f24ab609b970082e1c similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/objects/b2/18d34eec545f29156411f24ab609b970082e1c rename to test/integration/rebaseSwapping/expected/repo/.git_keep/objects/b2/18d34eec545f29156411f24ab609b970082e1c diff --git a/test/integration/rebaseSwapping/expected/.git_keep/objects/cc/01bf15804065932f5e50340902614b3c04c948 b/test/integration/rebaseSwapping/expected/repo/.git_keep/objects/cc/01bf15804065932f5e50340902614b3c04c948 similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/objects/cc/01bf15804065932f5e50340902614b3c04c948 rename to test/integration/rebaseSwapping/expected/repo/.git_keep/objects/cc/01bf15804065932f5e50340902614b3c04c948 diff --git a/test/integration/rebaseSwapping/expected/.git_keep/objects/ce/ada384bff8df54abb8acbf497b751aa9220f00 b/test/integration/rebaseSwapping/expected/repo/.git_keep/objects/ce/ada384bff8df54abb8acbf497b751aa9220f00 similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/objects/ce/ada384bff8df54abb8acbf497b751aa9220f00 rename to test/integration/rebaseSwapping/expected/repo/.git_keep/objects/ce/ada384bff8df54abb8acbf497b751aa9220f00 diff --git a/test/integration/rebaseSwapping/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/rebaseSwapping/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 rename to test/integration/rebaseSwapping/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 diff --git a/test/integration/rebaseSwapping/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/rebaseSwapping/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 new file mode 100644 index 000000000..d39fa7d2f Binary files /dev/null and b/test/integration/rebaseSwapping/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 differ diff --git a/test/integration/rebaseSwapping/expected/.git_keep/objects/d2/3bcf26566cbf601e766d12ea206cb7827d6630 b/test/integration/rebaseSwapping/expected/repo/.git_keep/objects/d2/3bcf26566cbf601e766d12ea206cb7827d6630 similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/objects/d2/3bcf26566cbf601e766d12ea206cb7827d6630 rename to test/integration/rebaseSwapping/expected/repo/.git_keep/objects/d2/3bcf26566cbf601e766d12ea206cb7827d6630 diff --git a/test/integration/rebaseSwapping/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/rebaseSwapping/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b new file mode 100644 index 000000000..9b771fc2f Binary files /dev/null and b/test/integration/rebaseSwapping/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b differ diff --git a/test/integration/rebaseSwapping/expected/.git_keep/objects/ff/3fb62dafc2fdd0c81ed64bc132b53584e5e1e2 b/test/integration/rebaseSwapping/expected/repo/.git_keep/objects/ff/3fb62dafc2fdd0c81ed64bc132b53584e5e1e2 similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/objects/ff/3fb62dafc2fdd0c81ed64bc132b53584e5e1e2 rename to test/integration/rebaseSwapping/expected/repo/.git_keep/objects/ff/3fb62dafc2fdd0c81ed64bc132b53584e5e1e2 diff --git a/test/integration/rebaseSwapping/expected/.git_keep/objects/ff/8d9889fccee3b361f37c46c9f0de3f5ef6d70f b/test/integration/rebaseSwapping/expected/repo/.git_keep/objects/ff/8d9889fccee3b361f37c46c9f0de3f5ef6d70f similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/objects/ff/8d9889fccee3b361f37c46c9f0de3f5ef6d70f rename to test/integration/rebaseSwapping/expected/repo/.git_keep/objects/ff/8d9889fccee3b361f37c46c9f0de3f5ef6d70f diff --git a/test/integration/rebaseSwapping/expected/.git_keep/refs/heads/master b/test/integration/rebaseSwapping/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/refs/heads/master rename to test/integration/rebaseSwapping/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/rebaseRewordOldCommit/expected/file0 b/test/integration/rebaseSwapping/expected/repo/file0 similarity index 100% rename from test/integration/rebaseRewordOldCommit/expected/file0 rename to test/integration/rebaseSwapping/expected/repo/file0 diff --git a/test/integration/reflogCheckout/expected/file1 b/test/integration/rebaseSwapping/expected/repo/file1 similarity index 100% rename from test/integration/reflogCheckout/expected/file1 rename to test/integration/rebaseSwapping/expected/repo/file1 diff --git a/test/integration/rebaseRewordOldCommit/expected/file2 b/test/integration/rebaseSwapping/expected/repo/file2 similarity index 100% rename from test/integration/rebaseRewordOldCommit/expected/file2 rename to test/integration/rebaseSwapping/expected/repo/file2 diff --git a/test/integration/rebaseSwapping/expected/file4 b/test/integration/rebaseSwapping/expected/repo/file4 similarity index 100% rename from test/integration/rebaseSwapping/expected/file4 rename to test/integration/rebaseSwapping/expected/repo/file4 diff --git a/test/integration/reflogCheckout/expected/.git_keep/COMMIT_EDITMSG b/test/integration/reflogCheckout/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/reflogCheckout/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/searching/expected/.git_keep/FETCH_HEAD b/test/integration/reflogCheckout/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/searching/expected/.git_keep/FETCH_HEAD rename to test/integration/reflogCheckout/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/reflogCheckout/expected/.git_keep/HEAD b/test/integration/reflogCheckout/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/HEAD rename to test/integration/reflogCheckout/expected/repo/.git_keep/HEAD diff --git a/test/integration/reflogHardReset/expected/.git_keep/config b/test/integration/reflogCheckout/expected/repo/.git_keep/config similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/config rename to test/integration/reflogCheckout/expected/repo/.git_keep/config diff --git a/test/integration/stash/expected/.git_keep/description b/test/integration/reflogCheckout/expected/repo/.git_keep/description similarity index 100% rename from test/integration/stash/expected/.git_keep/description rename to test/integration/reflogCheckout/expected/repo/.git_keep/description diff --git a/test/integration/reflogCheckout/expected/.git_keep/index b/test/integration/reflogCheckout/expected/repo/.git_keep/index similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/index rename to test/integration/reflogCheckout/expected/repo/.git_keep/index diff --git a/test/integration/squash/expected/.git_keep/info/exclude b/test/integration/reflogCheckout/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/squash/expected/.git_keep/info/exclude rename to test/integration/reflogCheckout/expected/repo/.git_keep/info/exclude diff --git a/test/integration/reflogCheckout/expected/.git_keep/logs/HEAD b/test/integration/reflogCheckout/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/logs/HEAD rename to test/integration/reflogCheckout/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/reflogCheckout/expected/.git_keep/logs/refs/heads/branch2 b/test/integration/reflogCheckout/expected/repo/.git_keep/logs/refs/heads/branch2 similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/logs/refs/heads/branch2 rename to test/integration/reflogCheckout/expected/repo/.git_keep/logs/refs/heads/branch2 diff --git a/test/integration/reflogCheckout/expected/.git_keep/logs/refs/heads/ma b/test/integration/reflogCheckout/expected/repo/.git_keep/logs/refs/heads/ma similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/logs/refs/heads/ma rename to test/integration/reflogCheckout/expected/repo/.git_keep/logs/refs/heads/ma diff --git a/test/integration/reflogCheckout/expected/.git_keep/logs/refs/heads/master b/test/integration/reflogCheckout/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/logs/refs/heads/master rename to test/integration/reflogCheckout/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/reflogCheckout/expected/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 b/test/integration/reflogCheckout/expected/repo/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 rename to test/integration/reflogCheckout/expected/repo/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 diff --git a/test/integration/reflogCheckout/expected/.git_keep/objects/10/e005e1fa2db07721aa63cb048b87b7a2830b64 b/test/integration/reflogCheckout/expected/repo/.git_keep/objects/10/e005e1fa2db07721aa63cb048b87b7a2830b64 similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/objects/10/e005e1fa2db07721aa63cb048b87b7a2830b64 rename to test/integration/reflogCheckout/expected/repo/.git_keep/objects/10/e005e1fa2db07721aa63cb048b87b7a2830b64 diff --git a/test/integration/stash/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/reflogCheckout/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/stash/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/reflogCheckout/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/rebaseSwapping/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/reflogCheckout/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/reflogCheckout/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/reflogCheckout/expected/.git_keep/objects/2b/16e862b7fc2a6ce1e711e5e174bc2f08c0e001 b/test/integration/reflogCheckout/expected/repo/.git_keep/objects/2b/16e862b7fc2a6ce1e711e5e174bc2f08c0e001 similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/objects/2b/16e862b7fc2a6ce1e711e5e174bc2f08c0e001 rename to test/integration/reflogCheckout/expected/repo/.git_keep/objects/2b/16e862b7fc2a6ce1e711e5e174bc2f08c0e001 diff --git a/test/integration/reflogCheckout/expected/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 b/test/integration/reflogCheckout/expected/repo/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 rename to test/integration/reflogCheckout/expected/repo/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 diff --git a/test/integration/reflogCheckout/expected/.git_keep/objects/37/661793a793e075730b85b9c3b300195738fc63 b/test/integration/reflogCheckout/expected/repo/.git_keep/objects/37/661793a793e075730b85b9c3b300195738fc63 similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/objects/37/661793a793e075730b85b9c3b300195738fc63 rename to test/integration/reflogCheckout/expected/repo/.git_keep/objects/37/661793a793e075730b85b9c3b300195738fc63 diff --git a/test/integration/rebaseSwapping/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/reflogCheckout/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/rebaseSwapping/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/reflogCheckout/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/reflogCheckout/expected/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a b/test/integration/reflogCheckout/expected/repo/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a rename to test/integration/reflogCheckout/expected/repo/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a diff --git a/test/integration/reflogCheckout/expected/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b b/test/integration/reflogCheckout/expected/repo/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b rename to test/integration/reflogCheckout/expected/repo/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b diff --git a/test/integration/reflogCheckout/expected/.git_keep/objects/40/e3ff58efe2f50bc70ab084aba687ffd56dcd38 b/test/integration/reflogCheckout/expected/repo/.git_keep/objects/40/e3ff58efe2f50bc70ab084aba687ffd56dcd38 similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/objects/40/e3ff58efe2f50bc70ab084aba687ffd56dcd38 rename to test/integration/reflogCheckout/expected/repo/.git_keep/objects/40/e3ff58efe2f50bc70ab084aba687ffd56dcd38 diff --git a/test/integration/reflogCheckout/expected/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 b/test/integration/reflogCheckout/expected/repo/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 rename to test/integration/reflogCheckout/expected/repo/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 diff --git a/test/integration/reflogCheckout/expected/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 b/test/integration/reflogCheckout/expected/repo/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 rename to test/integration/reflogCheckout/expected/repo/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 diff --git a/test/integration/reflogCheckout/expected/.git_keep/objects/9a/cb41da3b683497b3966135ccd64411b8ef698f b/test/integration/reflogCheckout/expected/repo/.git_keep/objects/9a/cb41da3b683497b3966135ccd64411b8ef698f similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/objects/9a/cb41da3b683497b3966135ccd64411b8ef698f rename to test/integration/reflogCheckout/expected/repo/.git_keep/objects/9a/cb41da3b683497b3966135ccd64411b8ef698f diff --git a/test/integration/reflogCheckout/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/reflogCheckout/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c rename to test/integration/reflogCheckout/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c diff --git a/test/integration/stashNewBranch/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/reflogCheckout/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/stashNewBranch/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/reflogCheckout/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/reflogCheckout/expected/.git_keep/objects/ce/d0c7ee1af3cd078a0bd940fa45e973dfd0f226 b/test/integration/reflogCheckout/expected/repo/.git_keep/objects/ce/d0c7ee1af3cd078a0bd940fa45e973dfd0f226 similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/objects/ce/d0c7ee1af3cd078a0bd940fa45e973dfd0f226 rename to test/integration/reflogCheckout/expected/repo/.git_keep/objects/ce/d0c7ee1af3cd078a0bd940fa45e973dfd0f226 diff --git a/test/integration/reflogCheckout/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/reflogCheckout/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 rename to test/integration/reflogCheckout/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 diff --git a/test/integration/reflogCheckout/expected/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 b/test/integration/reflogCheckout/expected/repo/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 rename to test/integration/reflogCheckout/expected/repo/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 diff --git a/test/integration/reflogCheckout/expected/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a b/test/integration/reflogCheckout/expected/repo/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a rename to test/integration/reflogCheckout/expected/repo/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a diff --git a/test/integration/reflogCheckout/expected/.git_keep/objects/fd/c461cdae46cbcd0e8b6f33898b25a17ab36f32 b/test/integration/reflogCheckout/expected/repo/.git_keep/objects/fd/c461cdae46cbcd0e8b6f33898b25a17ab36f32 similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/objects/fd/c461cdae46cbcd0e8b6f33898b25a17ab36f32 rename to test/integration/reflogCheckout/expected/repo/.git_keep/objects/fd/c461cdae46cbcd0e8b6f33898b25a17ab36f32 diff --git a/test/integration/reflogCheckout/expected/.git_keep/refs/heads/branch2 b/test/integration/reflogCheckout/expected/repo/.git_keep/refs/heads/branch2 similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/refs/heads/branch2 rename to test/integration/reflogCheckout/expected/repo/.git_keep/refs/heads/branch2 diff --git a/test/integration/reflogCheckout/expected/.git_keep/refs/heads/ma b/test/integration/reflogCheckout/expected/repo/.git_keep/refs/heads/ma similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/refs/heads/ma rename to test/integration/reflogCheckout/expected/repo/.git_keep/refs/heads/ma diff --git a/test/integration/reflogCheckout/expected/.git_keep/refs/heads/master b/test/integration/reflogCheckout/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/refs/heads/master rename to test/integration/reflogCheckout/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/rebaseSwapping/expected/file0 b/test/integration/reflogCheckout/expected/repo/file0 similarity index 100% rename from test/integration/rebaseSwapping/expected/file0 rename to test/integration/reflogCheckout/expected/repo/file0 diff --git a/test/integration/reflogCherryPick/expected/file1 b/test/integration/reflogCheckout/expected/repo/file1 similarity index 100% rename from test/integration/reflogCherryPick/expected/file1 rename to test/integration/reflogCheckout/expected/repo/file1 diff --git a/test/integration/rebaseSwapping/expected/file2 b/test/integration/reflogCheckout/expected/repo/file2 similarity index 100% rename from test/integration/rebaseSwapping/expected/file2 rename to test/integration/reflogCheckout/expected/repo/file2 diff --git a/test/integration/reflogCheckout/expected/file4 b/test/integration/reflogCheckout/expected/repo/file4 similarity index 100% rename from test/integration/reflogCheckout/expected/file4 rename to test/integration/reflogCheckout/expected/repo/file4 diff --git a/test/integration/reflogCherryPick/expected/.git_keep/COMMIT_EDITMSG b/test/integration/reflogCherryPick/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/reflogCherryPick/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/searchingInStagingPanel/expected/.git_keep/FETCH_HEAD b/test/integration/reflogCherryPick/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/searchingInStagingPanel/expected/.git_keep/FETCH_HEAD rename to test/integration/reflogCherryPick/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/submoduleAdd/expected/.git_keep/HEAD b/test/integration/reflogCherryPick/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/submoduleAdd/expected/.git_keep/HEAD rename to test/integration/reflogCherryPick/expected/repo/.git_keep/HEAD diff --git a/test/integration/reflogCherryPick/expected/.git_keep/ORIG_HEAD b/test/integration/reflogCherryPick/expected/repo/.git_keep/ORIG_HEAD similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/ORIG_HEAD rename to test/integration/reflogCherryPick/expected/repo/.git_keep/ORIG_HEAD diff --git a/test/integration/searching/expected/.git_keep/config b/test/integration/reflogCherryPick/expected/repo/.git_keep/config similarity index 100% rename from test/integration/searching/expected/.git_keep/config rename to test/integration/reflogCherryPick/expected/repo/.git_keep/config diff --git a/test/integration/stashDrop/expected/.git_keep/description b/test/integration/reflogCherryPick/expected/repo/.git_keep/description similarity index 100% rename from test/integration/stashDrop/expected/.git_keep/description rename to test/integration/reflogCherryPick/expected/repo/.git_keep/description diff --git a/test/integration/reflogCherryPick/expected/.git_keep/index b/test/integration/reflogCherryPick/expected/repo/.git_keep/index similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/index rename to test/integration/reflogCherryPick/expected/repo/.git_keep/index diff --git a/test/integration/staginWithDiffContextChange/expected/.git_keep/info/exclude b/test/integration/reflogCherryPick/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/staginWithDiffContextChange/expected/.git_keep/info/exclude rename to test/integration/reflogCherryPick/expected/repo/.git_keep/info/exclude diff --git a/test/integration/reflogCherryPick/expected/.git_keep/logs/HEAD b/test/integration/reflogCherryPick/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/logs/HEAD rename to test/integration/reflogCherryPick/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/reflogCherryPick/expected/.git_keep/logs/refs/heads/branch2 b/test/integration/reflogCherryPick/expected/repo/.git_keep/logs/refs/heads/branch2 similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/logs/refs/heads/branch2 rename to test/integration/reflogCherryPick/expected/repo/.git_keep/logs/refs/heads/branch2 diff --git a/test/integration/reflogCherryPick/expected/.git_keep/logs/refs/heads/master b/test/integration/reflogCherryPick/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/logs/refs/heads/master rename to test/integration/reflogCherryPick/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/reflogCherryPick/expected/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 b/test/integration/reflogCherryPick/expected/repo/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 rename to test/integration/reflogCherryPick/expected/repo/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 diff --git a/test/integration/stashDrop/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/reflogCherryPick/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/stashDrop/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/reflogCherryPick/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/reflogCheckout/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/reflogCherryPick/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/reflogCherryPick/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/reflogCherryPick/expected/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 b/test/integration/reflogCherryPick/expected/repo/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 rename to test/integration/reflogCherryPick/expected/repo/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 diff --git a/test/integration/reflogCherryPick/expected/.git_keep/objects/35/bedc872b1ca9e026e51c4017416acba4b3d64b b/test/integration/reflogCherryPick/expected/repo/.git_keep/objects/35/bedc872b1ca9e026e51c4017416acba4b3d64b similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/objects/35/bedc872b1ca9e026e51c4017416acba4b3d64b rename to test/integration/reflogCherryPick/expected/repo/.git_keep/objects/35/bedc872b1ca9e026e51c4017416acba4b3d64b diff --git a/test/integration/reflogCheckout/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/reflogCherryPick/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/reflogCheckout/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/reflogCherryPick/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/reflogCherryPick/expected/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a b/test/integration/reflogCherryPick/expected/repo/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a rename to test/integration/reflogCherryPick/expected/repo/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a diff --git a/test/integration/reflogCherryPick/expected/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b b/test/integration/reflogCherryPick/expected/repo/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b rename to test/integration/reflogCherryPick/expected/repo/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b diff --git a/test/integration/reflogCherryPick/expected/.git_keep/objects/43/12f3a59c644c52ad89254be43d7a7987e56bed b/test/integration/reflogCherryPick/expected/repo/.git_keep/objects/43/12f3a59c644c52ad89254be43d7a7987e56bed similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/objects/43/12f3a59c644c52ad89254be43d7a7987e56bed rename to test/integration/reflogCherryPick/expected/repo/.git_keep/objects/43/12f3a59c644c52ad89254be43d7a7987e56bed diff --git a/test/integration/reflogCherryPick/expected/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 b/test/integration/reflogCherryPick/expected/repo/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 rename to test/integration/reflogCherryPick/expected/repo/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 diff --git a/test/integration/reflogCherryPick/expected/.git_keep/objects/5a/5a519752ffd367bbd85dfbc19e5b18d44d6223 b/test/integration/reflogCherryPick/expected/repo/.git_keep/objects/5a/5a519752ffd367bbd85dfbc19e5b18d44d6223 similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/objects/5a/5a519752ffd367bbd85dfbc19e5b18d44d6223 rename to test/integration/reflogCherryPick/expected/repo/.git_keep/objects/5a/5a519752ffd367bbd85dfbc19e5b18d44d6223 diff --git a/test/integration/reflogCherryPick/expected/.git_keep/objects/71/3ec49844ebad06a5c98fd3c5ce1445f664c3c6 b/test/integration/reflogCherryPick/expected/repo/.git_keep/objects/71/3ec49844ebad06a5c98fd3c5ce1445f664c3c6 similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/objects/71/3ec49844ebad06a5c98fd3c5ce1445f664c3c6 rename to test/integration/reflogCherryPick/expected/repo/.git_keep/objects/71/3ec49844ebad06a5c98fd3c5ce1445f664c3c6 diff --git a/test/integration/reflogCherryPick/expected/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 b/test/integration/reflogCherryPick/expected/repo/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 rename to test/integration/reflogCherryPick/expected/repo/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 diff --git a/test/integration/reflogCherryPick/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/reflogCherryPick/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c rename to test/integration/reflogCherryPick/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c diff --git a/test/integration/stashPop/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/reflogCherryPick/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/stashPop/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/reflogCherryPick/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/reflogCherryPick/expected/.git_keep/objects/a9/55e641b00e7e896842122a3537c70476d7b4e0 b/test/integration/reflogCherryPick/expected/repo/.git_keep/objects/a9/55e641b00e7e896842122a3537c70476d7b4e0 similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/objects/a9/55e641b00e7e896842122a3537c70476d7b4e0 rename to test/integration/reflogCherryPick/expected/repo/.git_keep/objects/a9/55e641b00e7e896842122a3537c70476d7b4e0 diff --git a/test/integration/reflogCherryPick/expected/.git_keep/objects/ac/7b38400c8aed050f379f9643b953b9d428fda1 b/test/integration/reflogCherryPick/expected/repo/.git_keep/objects/ac/7b38400c8aed050f379f9643b953b9d428fda1 similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/objects/ac/7b38400c8aed050f379f9643b953b9d428fda1 rename to test/integration/reflogCherryPick/expected/repo/.git_keep/objects/ac/7b38400c8aed050f379f9643b953b9d428fda1 diff --git a/test/integration/reflogCherryPick/expected/.git_keep/objects/af/eb127e4579981e4b852e8aabb44b07f2ea4e09 b/test/integration/reflogCherryPick/expected/repo/.git_keep/objects/af/eb127e4579981e4b852e8aabb44b07f2ea4e09 similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/objects/af/eb127e4579981e4b852e8aabb44b07f2ea4e09 rename to test/integration/reflogCherryPick/expected/repo/.git_keep/objects/af/eb127e4579981e4b852e8aabb44b07f2ea4e09 diff --git a/test/integration/reflogCherryPick/expected/.git_keep/objects/bc/8891320172f4cfa3efd7bb8767a46daa200d79 b/test/integration/reflogCherryPick/expected/repo/.git_keep/objects/bc/8891320172f4cfa3efd7bb8767a46daa200d79 similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/objects/bc/8891320172f4cfa3efd7bb8767a46daa200d79 rename to test/integration/reflogCherryPick/expected/repo/.git_keep/objects/bc/8891320172f4cfa3efd7bb8767a46daa200d79 diff --git a/test/integration/reflogCherryPick/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/reflogCherryPick/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 rename to test/integration/reflogCherryPick/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 diff --git a/test/integration/reflogCherryPick/expected/.git_keep/objects/e2/3253d1f81331e1c94a5a5f68e2d4cc1cbee2fd b/test/integration/reflogCherryPick/expected/repo/.git_keep/objects/e2/3253d1f81331e1c94a5a5f68e2d4cc1cbee2fd similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/objects/e2/3253d1f81331e1c94a5a5f68e2d4cc1cbee2fd rename to test/integration/reflogCherryPick/expected/repo/.git_keep/objects/e2/3253d1f81331e1c94a5a5f68e2d4cc1cbee2fd diff --git a/test/integration/reflogCherryPick/expected/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 b/test/integration/reflogCherryPick/expected/repo/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 rename to test/integration/reflogCherryPick/expected/repo/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 diff --git a/test/integration/reflogCherryPick/expected/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a b/test/integration/reflogCherryPick/expected/repo/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a rename to test/integration/reflogCherryPick/expected/repo/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a diff --git a/test/integration/reflogCherryPick/expected/.git_keep/refs/heads/branch2 b/test/integration/reflogCherryPick/expected/repo/.git_keep/refs/heads/branch2 similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/refs/heads/branch2 rename to test/integration/reflogCherryPick/expected/repo/.git_keep/refs/heads/branch2 diff --git a/test/integration/reflogCherryPick/expected/.git_keep/refs/heads/master b/test/integration/reflogCherryPick/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/refs/heads/master rename to test/integration/reflogCherryPick/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/reflogCheckout/expected/file0 b/test/integration/reflogCherryPick/expected/repo/file0 similarity index 100% rename from test/integration/reflogCheckout/expected/file0 rename to test/integration/reflogCherryPick/expected/repo/file0 diff --git a/test/integration/reflogCommitFiles/expected/file1 b/test/integration/reflogCherryPick/expected/repo/file1 similarity index 100% rename from test/integration/reflogCommitFiles/expected/file1 rename to test/integration/reflogCherryPick/expected/repo/file1 diff --git a/test/integration/reflogCherryPick/expected/file2 b/test/integration/reflogCherryPick/expected/repo/file2 similarity index 100% rename from test/integration/reflogCherryPick/expected/file2 rename to test/integration/reflogCherryPick/expected/repo/file2 diff --git a/test/integration/reflogCherryPick/expected/file4 b/test/integration/reflogCherryPick/expected/repo/file4 similarity index 100% rename from test/integration/reflogCherryPick/expected/file4 rename to test/integration/reflogCherryPick/expected/repo/file4 diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/COMMIT_EDITMSG b/test/integration/reflogCommitFiles/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/squash/expected/.git_keep/FETCH_HEAD b/test/integration/reflogCommitFiles/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/squash/expected/.git_keep/FETCH_HEAD rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/HEAD b/test/integration/reflogCommitFiles/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/HEAD rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/HEAD diff --git a/test/integration/searchingInStagingPanel/expected/.git_keep/config b/test/integration/reflogCommitFiles/expected/repo/.git_keep/config similarity index 100% rename from test/integration/searchingInStagingPanel/expected/.git_keep/config rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/config diff --git a/test/integration/stashNewBranch/expected/.git_keep/description b/test/integration/reflogCommitFiles/expected/repo/.git_keep/description similarity index 100% rename from test/integration/stashNewBranch/expected/.git_keep/description rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/description diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/index b/test/integration/reflogCommitFiles/expected/repo/.git_keep/index similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/index rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/index diff --git a/test/integration/staging/expected/.git_keep/info/exclude b/test/integration/reflogCommitFiles/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/staging/expected/.git_keep/info/exclude rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/info/exclude diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/logs/HEAD b/test/integration/reflogCommitFiles/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/logs/HEAD rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/logs/refs/heads/branch2 b/test/integration/reflogCommitFiles/expected/repo/.git_keep/logs/refs/heads/branch2 similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/logs/refs/heads/branch2 rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/logs/refs/heads/branch2 diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/logs/refs/heads/master b/test/integration/reflogCommitFiles/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/logs/refs/heads/master rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/objects/07/e795700fa240713f5577867a45eb6f2071d856 b/test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/07/e795700fa240713f5577867a45eb6f2071d856 similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/objects/07/e795700fa240713f5577867a45eb6f2071d856 rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/07/e795700fa240713f5577867a45eb6f2071d856 diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 b/test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 diff --git a/test/integration/stashNewBranch/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/stashNewBranch/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/reflogCherryPick/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 b/test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 diff --git a/test/integration/reflogCherryPick/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/reflogCherryPick/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a b/test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b b/test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/objects/44/5557afd2775df735bc53b891678e6bd9072638 b/test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/44/5557afd2775df735bc53b891678e6bd9072638 similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/objects/44/5557afd2775df735bc53b891678e6bd9072638 rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/44/5557afd2775df735bc53b891678e6bd9072638 diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/objects/53/26459d9a0c196b18cc31dc95f05c9a4e4462de b/test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/53/26459d9a0c196b18cc31dc95f05c9a4e4462de similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/objects/53/26459d9a0c196b18cc31dc95f05c9a4e4462de rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/53/26459d9a0c196b18cc31dc95f05c9a4e4462de diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 b/test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/objects/75/6e436bdd05b965c967edc1929432917e3864cd b/test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/75/6e436bdd05b965c967edc1929432917e3864cd similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/objects/75/6e436bdd05b965c967edc1929432917e3864cd rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/75/6e436bdd05b965c967edc1929432917e3864cd diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/objects/7d/61d1707885895d92f021111196df4466347327 b/test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/7d/61d1707885895d92f021111196df4466347327 similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/objects/7d/61d1707885895d92f021111196df4466347327 rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/7d/61d1707885895d92f021111196df4466347327 diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/objects/86/3cae3fe21db864bc92b74ae4820e628e5eaf8b b/test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/86/3cae3fe21db864bc92b74ae4820e628e5eaf8b similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/objects/86/3cae3fe21db864bc92b74ae4820e628e5eaf8b rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/86/3cae3fe21db864bc92b74ae4820e628e5eaf8b diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 b/test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c diff --git a/test/integration/stash_Copy/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/stash_Copy/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/objects/a6/cc56fedc3f0fc234dcacef1f1de2706c32c44b b/test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/a6/cc56fedc3f0fc234dcacef1f1de2706c32c44b similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/objects/a6/cc56fedc3f0fc234dcacef1f1de2706c32c44b rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/a6/cc56fedc3f0fc234dcacef1f1de2706c32c44b diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/objects/b0/bf1c26d59a724c767948a6de15664bfc0c292f b/test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/b0/bf1c26d59a724c767948a6de15664bfc0c292f similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/objects/b0/bf1c26d59a724c767948a6de15664bfc0c292f rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/b0/bf1c26d59a724c767948a6de15664bfc0c292f diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/objects/c5/4d82926c7b673499d675aec8732cfe08aed761 b/test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/c5/4d82926c7b673499d675aec8732cfe08aed761 similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/objects/c5/4d82926c7b673499d675aec8732cfe08aed761 rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/c5/4d82926c7b673499d675aec8732cfe08aed761 diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 b/test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a b/test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/refs/heads/branch2 b/test/integration/reflogCommitFiles/expected/repo/.git_keep/refs/heads/branch2 similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/refs/heads/branch2 rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/refs/heads/branch2 diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/refs/heads/master b/test/integration/reflogCommitFiles/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/refs/heads/master rename to test/integration/reflogCommitFiles/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/reflogCherryPick/expected/file0 b/test/integration/reflogCommitFiles/expected/repo/file0 similarity index 100% rename from test/integration/reflogCherryPick/expected/file0 rename to test/integration/reflogCommitFiles/expected/repo/file0 diff --git a/test/integration/reflogHardReset/expected/file1 b/test/integration/reflogCommitFiles/expected/repo/file1 similarity index 100% rename from test/integration/reflogHardReset/expected/file1 rename to test/integration/reflogCommitFiles/expected/repo/file1 diff --git a/test/integration/reflogCommitFiles/expected/file2 b/test/integration/reflogCommitFiles/expected/repo/file2 similarity index 100% rename from test/integration/reflogCommitFiles/expected/file2 rename to test/integration/reflogCommitFiles/expected/repo/file2 diff --git a/test/integration/reflogCommitFiles/expected/file4 b/test/integration/reflogCommitFiles/expected/repo/file4 similarity index 100% rename from test/integration/reflogCommitFiles/expected/file4 rename to test/integration/reflogCommitFiles/expected/repo/file4 diff --git a/test/integration/reflogCommitFiles/recording.json b/test/integration/reflogCommitFiles/recording.json index bf91fbcf3..8339b7ea7 100644 --- a/test/integration/reflogCommitFiles/recording.json +++ b/test/integration/reflogCommitFiles/recording.json @@ -1 +1,125 @@ -{"KeyEvents":[{"Timestamp":608,"Mod":0,"Key":259,"Ch":0},{"Timestamp":768,"Mod":0,"Key":259,"Ch":0},{"Timestamp":1376,"Mod":0,"Key":256,"Ch":93},{"Timestamp":1817,"Mod":0,"Key":258,"Ch":0},{"Timestamp":2560,"Mod":0,"Key":13,"Ch":13},{"Timestamp":3271,"Mod":0,"Key":256,"Ch":32},{"Timestamp":3936,"Mod":2,"Key":16,"Ch":16},{"Timestamp":4680,"Mod":0,"Key":258,"Ch":0},{"Timestamp":4945,"Mod":0,"Key":258,"Ch":0},{"Timestamp":5216,"Mod":0,"Key":13,"Ch":13},{"Timestamp":5712,"Mod":0,"Key":260,"Ch":0},{"Timestamp":5952,"Mod":0,"Key":260,"Ch":0},{"Timestamp":6191,"Mod":0,"Key":256,"Ch":99},{"Timestamp":6456,"Mod":0,"Key":256,"Ch":97},{"Timestamp":6536,"Mod":0,"Key":256,"Ch":115},{"Timestamp":6647,"Mod":0,"Key":256,"Ch":100},{"Timestamp":6968,"Mod":0,"Key":13,"Ch":13},{"Timestamp":7376,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":272,"Height":74}]} \ No newline at end of file +{ + "KeyEvents": [ + { + "Timestamp": 608, + "Mod": 0, + "Key": 259, + "Ch": 0 + }, + { + "Timestamp": 768, + "Mod": 0, + "Key": 259, + "Ch": 0 + }, + { + "Timestamp": 1376, + "Mod": 0, + "Key": 256, + "Ch": 93 + }, + { + "Timestamp": 1817, + "Mod": 0, + "Key": 258, + "Ch": 0 + }, + { + "Timestamp": 2560, + "Mod": 0, + "Key": 13, + "Ch": 13 + }, + { + "Timestamp": 2860, + "Mod": 0, + "Key": 13, + "Ch": 13 + }, + { + "Timestamp": 3271, + "Mod": 0, + "Key": 256, + "Ch": 32 + }, + { + "Timestamp": 3936, + "Mod": 2, + "Key": 16, + "Ch": 16 + }, + { + "Timestamp": 4680, + "Mod": 0, + "Key": 258, + "Ch": 0 + }, + { + "Timestamp": 4945, + "Mod": 0, + "Key": 258, + "Ch": 0 + }, + { + "Timestamp": 5216, + "Mod": 0, + "Key": 13, + "Ch": 13 + }, + { + "Timestamp": 5712, + "Mod": 0, + "Key": 260, + "Ch": 0 + }, + { + "Timestamp": 5952, + "Mod": 0, + "Key": 260, + "Ch": 0 + }, + { + "Timestamp": 6191, + "Mod": 0, + "Key": 256, + "Ch": 99 + }, + { + "Timestamp": 6456, + "Mod": 0, + "Key": 256, + "Ch": 97 + }, + { + "Timestamp": 6536, + "Mod": 0, + "Key": 256, + "Ch": 115 + }, + { + "Timestamp": 6647, + "Mod": 0, + "Key": 256, + "Ch": 100 + }, + { + "Timestamp": 6968, + "Mod": 0, + "Key": 13, + "Ch": 13 + }, + { + "Timestamp": 7376, + "Mod": 0, + "Key": 256, + "Ch": 113 + } + ], + "ResizeEvents": [ + { + "Timestamp": 0, + "Width": 272, + "Height": 74 + } + ] +} diff --git a/test/integration/reflogHardReset/expected/.git_keep/COMMIT_EDITMSG b/test/integration/reflogHardReset/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/reflogHardReset/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/staginWithDiffContextChange/expected/.git_keep/FETCH_HEAD b/test/integration/reflogHardReset/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/staginWithDiffContextChange/expected/.git_keep/FETCH_HEAD rename to test/integration/reflogHardReset/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/reflogHardReset/expected/.git_keep/HEAD b/test/integration/reflogHardReset/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/HEAD rename to test/integration/reflogHardReset/expected/repo/.git_keep/HEAD diff --git a/test/integration/reflogHardReset/expected/.git_keep/ORIG_HEAD b/test/integration/reflogHardReset/expected/repo/.git_keep/ORIG_HEAD similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/ORIG_HEAD rename to test/integration/reflogHardReset/expected/repo/.git_keep/ORIG_HEAD diff --git a/test/integration/squash/expected/.git_keep/config b/test/integration/reflogHardReset/expected/repo/.git_keep/config similarity index 100% rename from test/integration/squash/expected/.git_keep/config rename to test/integration/reflogHardReset/expected/repo/.git_keep/config diff --git a/test/integration/stashPop/expected/.git_keep/description b/test/integration/reflogHardReset/expected/repo/.git_keep/description similarity index 100% rename from test/integration/stashPop/expected/.git_keep/description rename to test/integration/reflogHardReset/expected/repo/.git_keep/description diff --git a/test/integration/reflogHardReset/expected/.git_keep/index b/test/integration/reflogHardReset/expected/repo/.git_keep/index similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/index rename to test/integration/reflogHardReset/expected/repo/.git_keep/index diff --git a/test/integration/stagingTwo/expected/.git_keep/info/exclude b/test/integration/reflogHardReset/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/stagingTwo/expected/.git_keep/info/exclude rename to test/integration/reflogHardReset/expected/repo/.git_keep/info/exclude diff --git a/test/integration/reflogHardReset/expected/.git_keep/logs/HEAD b/test/integration/reflogHardReset/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/logs/HEAD rename to test/integration/reflogHardReset/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/reflogHardReset/expected/.git_keep/logs/refs/heads/branch2 b/test/integration/reflogHardReset/expected/repo/.git_keep/logs/refs/heads/branch2 similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/logs/refs/heads/branch2 rename to test/integration/reflogHardReset/expected/repo/.git_keep/logs/refs/heads/branch2 diff --git a/test/integration/reflogHardReset/expected/.git_keep/logs/refs/heads/master b/test/integration/reflogHardReset/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/logs/refs/heads/master rename to test/integration/reflogHardReset/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/reflogHardReset/expected/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 b/test/integration/reflogHardReset/expected/repo/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 rename to test/integration/reflogHardReset/expected/repo/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 diff --git a/test/integration/reflogHardReset/expected/.git_keep/objects/16/fc0fdb6ae48d0bdffbfa7013410227e5fac6f3 b/test/integration/reflogHardReset/expected/repo/.git_keep/objects/16/fc0fdb6ae48d0bdffbfa7013410227e5fac6f3 similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/objects/16/fc0fdb6ae48d0bdffbfa7013410227e5fac6f3 rename to test/integration/reflogHardReset/expected/repo/.git_keep/objects/16/fc0fdb6ae48d0bdffbfa7013410227e5fac6f3 diff --git a/test/integration/stashPop/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/reflogHardReset/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/stashPop/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/reflogHardReset/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/reflogHardReset/expected/.git_keep/objects/18/83828474eb5bac8cb27c8a7a3614f9ea3137a0 b/test/integration/reflogHardReset/expected/repo/.git_keep/objects/18/83828474eb5bac8cb27c8a7a3614f9ea3137a0 similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/objects/18/83828474eb5bac8cb27c8a7a3614f9ea3137a0 rename to test/integration/reflogHardReset/expected/repo/.git_keep/objects/18/83828474eb5bac8cb27c8a7a3614f9ea3137a0 diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/reflogHardReset/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/reflogHardReset/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/reflogHardReset/expected/.git_keep/objects/1f/d818af9eb65653e98def81168002cabc353b6a b/test/integration/reflogHardReset/expected/repo/.git_keep/objects/1f/d818af9eb65653e98def81168002cabc353b6a similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/objects/1f/d818af9eb65653e98def81168002cabc353b6a rename to test/integration/reflogHardReset/expected/repo/.git_keep/objects/1f/d818af9eb65653e98def81168002cabc353b6a diff --git a/test/integration/reflogHardReset/expected/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 b/test/integration/reflogHardReset/expected/repo/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 rename to test/integration/reflogHardReset/expected/repo/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 diff --git a/test/integration/reflogCommitFiles/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/reflogHardReset/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/reflogCommitFiles/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/reflogHardReset/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/reflogHardReset/expected/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a b/test/integration/reflogHardReset/expected/repo/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a rename to test/integration/reflogHardReset/expected/repo/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a diff --git a/test/integration/reflogHardReset/expected/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b b/test/integration/reflogHardReset/expected/repo/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b rename to test/integration/reflogHardReset/expected/repo/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b diff --git a/test/integration/reflogHardReset/expected/.git_keep/objects/3e/0b28f0bcdd445c5f6d6b80b7a42f6fa8a536d2 b/test/integration/reflogHardReset/expected/repo/.git_keep/objects/3e/0b28f0bcdd445c5f6d6b80b7a42f6fa8a536d2 similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/objects/3e/0b28f0bcdd445c5f6d6b80b7a42f6fa8a536d2 rename to test/integration/reflogHardReset/expected/repo/.git_keep/objects/3e/0b28f0bcdd445c5f6d6b80b7a42f6fa8a536d2 diff --git a/test/integration/reflogHardReset/expected/.git_keep/objects/49/6408d5ed7b1edff760bf2ce56a43b9fab737e0 b/test/integration/reflogHardReset/expected/repo/.git_keep/objects/49/6408d5ed7b1edff760bf2ce56a43b9fab737e0 similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/objects/49/6408d5ed7b1edff760bf2ce56a43b9fab737e0 rename to test/integration/reflogHardReset/expected/repo/.git_keep/objects/49/6408d5ed7b1edff760bf2ce56a43b9fab737e0 diff --git a/test/integration/reflogHardReset/expected/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 b/test/integration/reflogHardReset/expected/repo/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 rename to test/integration/reflogHardReset/expected/repo/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 diff --git a/test/integration/reflogHardReset/expected/.git_keep/objects/7c/03a659737f2cc728a2a572cedee98019bbd04b b/test/integration/reflogHardReset/expected/repo/.git_keep/objects/7c/03a659737f2cc728a2a572cedee98019bbd04b similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/objects/7c/03a659737f2cc728a2a572cedee98019bbd04b rename to test/integration/reflogHardReset/expected/repo/.git_keep/objects/7c/03a659737f2cc728a2a572cedee98019bbd04b diff --git a/test/integration/reflogHardReset/expected/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 b/test/integration/reflogHardReset/expected/repo/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 rename to test/integration/reflogHardReset/expected/repo/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 diff --git a/test/integration/reflogHardReset/expected/.git_keep/objects/94/0576e482f2193afad72ea2205c05fd01507e1a b/test/integration/reflogHardReset/expected/repo/.git_keep/objects/94/0576e482f2193afad72ea2205c05fd01507e1a similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/objects/94/0576e482f2193afad72ea2205c05fd01507e1a rename to test/integration/reflogHardReset/expected/repo/.git_keep/objects/94/0576e482f2193afad72ea2205c05fd01507e1a diff --git a/test/integration/reflogHardReset/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/reflogHardReset/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c rename to test/integration/reflogHardReset/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c diff --git a/test/integration/submoduleAdd/expected/.git_keep/modules/blah/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/reflogHardReset/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/submoduleAdd/expected/.git_keep/modules/blah/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/reflogHardReset/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/reflogHardReset/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/reflogHardReset/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 rename to test/integration/reflogHardReset/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 diff --git a/test/integration/reflogHardReset/expected/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 b/test/integration/reflogHardReset/expected/repo/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 rename to test/integration/reflogHardReset/expected/repo/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 diff --git a/test/integration/reflogHardReset/expected/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a b/test/integration/reflogHardReset/expected/repo/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a rename to test/integration/reflogHardReset/expected/repo/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a diff --git a/test/integration/reflogHardReset/expected/.git_keep/refs/heads/branch2 b/test/integration/reflogHardReset/expected/repo/.git_keep/refs/heads/branch2 similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/refs/heads/branch2 rename to test/integration/reflogHardReset/expected/repo/.git_keep/refs/heads/branch2 diff --git a/test/integration/reflogHardReset/expected/.git_keep/refs/heads/master b/test/integration/reflogHardReset/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/refs/heads/master rename to test/integration/reflogHardReset/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/reflogCommitFiles/expected/file0 b/test/integration/reflogHardReset/expected/repo/file0 similarity index 100% rename from test/integration/reflogCommitFiles/expected/file0 rename to test/integration/reflogHardReset/expected/repo/file0 diff --git a/test/integration/stashDrop/expected/file1 b/test/integration/reflogHardReset/expected/repo/file1 similarity index 100% rename from test/integration/stashDrop/expected/file1 rename to test/integration/reflogHardReset/expected/repo/file1 diff --git a/test/integration/reflogCheckout/expected/file2 b/test/integration/reflogHardReset/expected/repo/file2 similarity index 100% rename from test/integration/reflogCheckout/expected/file2 rename to test/integration/reflogHardReset/expected/repo/file2 diff --git a/test/integration/reflogHardReset/expected/file4 b/test/integration/reflogHardReset/expected/repo/file4 similarity index 100% rename from test/integration/reflogHardReset/expected/file4 rename to test/integration/reflogHardReset/expected/repo/file4 diff --git a/test/integration/rememberCommitMessageAfterFail/expected/.git_keep/COMMIT_EDITMSG b/test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/rememberCommitMessageAfterFail/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/staging/expected/.git_keep/FETCH_HEAD b/test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/staging/expected/.git_keep/FETCH_HEAD rename to test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/submoduleAdd/expected/.git_keep/modules/blah/HEAD b/test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/submoduleAdd/expected/.git_keep/modules/blah/HEAD rename to test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/HEAD diff --git a/test/integration/tags4/expected/.git_keep/config b/test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/config similarity index 100% rename from test/integration/tags4/expected/.git_keep/config rename to test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/config diff --git a/test/integration/stash_Copy/expected/.git_keep/description b/test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/description similarity index 100% rename from test/integration/stash_Copy/expected/.git_keep/description rename to test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/description diff --git a/test/integration/rememberCommitMessageAfterFail/expected/.git_keep/index b/test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/index similarity index 100% rename from test/integration/rememberCommitMessageAfterFail/expected/.git_keep/index rename to test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/index diff --git a/test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/info/exclude b/test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/info/exclude new file mode 100644 index 000000000..a5196d1be --- /dev/null +++ b/test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/test/integration/rememberCommitMessageAfterFail/expected/.git_keep/logs/HEAD b/test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/rememberCommitMessageAfterFail/expected/.git_keep/logs/HEAD rename to test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/rememberCommitMessageAfterFail/expected/.git_keep/logs/refs/heads/master b/test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/rememberCommitMessageAfterFail/expected/.git_keep/logs/refs/heads/master rename to test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/rememberCommitMessageAfterFail/expected/.git_keep/objects/6c/493ff740f9380390d5c9ddef4af18697ac9375 b/test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/objects/6c/493ff740f9380390d5c9ddef4af18697ac9375 similarity index 100% rename from test/integration/rememberCommitMessageAfterFail/expected/.git_keep/objects/6c/493ff740f9380390d5c9ddef4af18697ac9375 rename to test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/objects/6c/493ff740f9380390d5c9ddef4af18697ac9375 diff --git a/test/integration/rememberCommitMessageAfterFail/expected/.git_keep/objects/ae/ac8b060acee50f309eb1f6698a981c50bdf493 b/test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/objects/ae/ac8b060acee50f309eb1f6698a981c50bdf493 similarity index 100% rename from test/integration/rememberCommitMessageAfterFail/expected/.git_keep/objects/ae/ac8b060acee50f309eb1f6698a981c50bdf493 rename to test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/objects/ae/ac8b060acee50f309eb1f6698a981c50bdf493 diff --git a/test/integration/rememberCommitMessageAfterFail/expected/.git_keep/objects/c2/bf9b666a310383fd7095bc5bd993bba11b040e b/test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/objects/c2/bf9b666a310383fd7095bc5bd993bba11b040e similarity index 100% rename from test/integration/rememberCommitMessageAfterFail/expected/.git_keep/objects/c2/bf9b666a310383fd7095bc5bd993bba11b040e rename to test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/objects/c2/bf9b666a310383fd7095bc5bd993bba11b040e diff --git a/test/integration/rememberCommitMessageAfterFail/expected/.git_keep/objects/c9/62a96f68e65b4dc8e0fea12db5f9006091efdf b/test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/objects/c9/62a96f68e65b4dc8e0fea12db5f9006091efdf similarity index 100% rename from test/integration/rememberCommitMessageAfterFail/expected/.git_keep/objects/c9/62a96f68e65b4dc8e0fea12db5f9006091efdf rename to test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/objects/c9/62a96f68e65b4dc8e0fea12db5f9006091efdf diff --git a/test/integration/rememberCommitMessageAfterFail/expected/.git_keep/objects/d0/ce4cb10cd926f646a08889b077a6d7eddd3534 b/test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/objects/d0/ce4cb10cd926f646a08889b077a6d7eddd3534 similarity index 100% rename from test/integration/rememberCommitMessageAfterFail/expected/.git_keep/objects/d0/ce4cb10cd926f646a08889b077a6d7eddd3534 rename to test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/objects/d0/ce4cb10cd926f646a08889b077a6d7eddd3534 diff --git a/test/integration/rememberCommitMessageAfterFail/expected/.git_keep/objects/e2/129701f1a4d54dc44f03c93bca0a2aec7c5449 b/test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/objects/e2/129701f1a4d54dc44f03c93bca0a2aec7c5449 similarity index 100% rename from test/integration/rememberCommitMessageAfterFail/expected/.git_keep/objects/e2/129701f1a4d54dc44f03c93bca0a2aec7c5449 rename to test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/objects/e2/129701f1a4d54dc44f03c93bca0a2aec7c5449 diff --git a/test/integration/rememberCommitMessageAfterFail/expected/.git_keep/refs/heads/master b/test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/rememberCommitMessageAfterFail/expected/.git_keep/refs/heads/master rename to test/integration/rememberCommitMessageAfterFail/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/rememberCommitMessageAfterFail/expected/file1 b/test/integration/rememberCommitMessageAfterFail/expected/repo/file1 similarity index 100% rename from test/integration/rememberCommitMessageAfterFail/expected/file1 rename to test/integration/rememberCommitMessageAfterFail/expected/repo/file1 diff --git a/test/integration/rememberCommitMessageAfterFail/expected/file2 b/test/integration/rememberCommitMessageAfterFail/expected/repo/file2 similarity index 100% rename from test/integration/rememberCommitMessageAfterFail/expected/file2 rename to test/integration/rememberCommitMessageAfterFail/expected/repo/file2 diff --git a/test/integration/resetAuthor/expected/repo/.git_keep/COMMIT_EDITMSG b/test/integration/resetAuthor/expected/repo/.git_keep/COMMIT_EDITMSG new file mode 100644 index 000000000..f4b7a0e26 --- /dev/null +++ b/test/integration/resetAuthor/expected/repo/.git_keep/COMMIT_EDITMSG @@ -0,0 +1 @@ +myfile2 diff --git a/test/integration/stagingTwo/expected/.git_keep/FETCH_HEAD b/test/integration/resetAuthor/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/stagingTwo/expected/.git_keep/FETCH_HEAD rename to test/integration/resetAuthor/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/submoduleEnter/expected/.git_keep/HEAD b/test/integration/resetAuthor/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/submoduleEnter/expected/.git_keep/HEAD rename to test/integration/resetAuthor/expected/repo/.git_keep/HEAD diff --git a/test/integration/resetAuthor/expected/repo/.git_keep/config b/test/integration/resetAuthor/expected/repo/.git_keep/config new file mode 100644 index 000000000..85e571409 --- /dev/null +++ b/test/integration/resetAuthor/expected/repo/.git_keep/config @@ -0,0 +1,10 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[user] + email = Author2@example.com + name = Author2 diff --git a/test/integration/submoduleAdd/expected/.git_keep/description b/test/integration/resetAuthor/expected/repo/.git_keep/description similarity index 100% rename from test/integration/submoduleAdd/expected/.git_keep/description rename to test/integration/resetAuthor/expected/repo/.git_keep/description diff --git a/test/integration/resetAuthor/expected/repo/.git_keep/index b/test/integration/resetAuthor/expected/repo/.git_keep/index new file mode 100644 index 000000000..d28ffa71e Binary files /dev/null and b/test/integration/resetAuthor/expected/repo/.git_keep/index differ diff --git a/test/integration/resetAuthor/expected/repo/.git_keep/info/exclude b/test/integration/resetAuthor/expected/repo/.git_keep/info/exclude new file mode 100644 index 000000000..a5196d1be --- /dev/null +++ b/test/integration/resetAuthor/expected/repo/.git_keep/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/test/integration/resetAuthor/expected/repo/.git_keep/logs/HEAD b/test/integration/resetAuthor/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..882fa7c0e --- /dev/null +++ b/test/integration/resetAuthor/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 291bcc7e708303b395f52245ec988ddbc985bae3 Author1 1651932821 +0200 commit (initial): myfile1 +291bcc7e708303b395f52245ec988ddbc985bae3 63aff3f0f54955ea149f9c2f3c07697b8864940d Author1 1651932821 +0200 commit: myfile2 +63aff3f0f54955ea149f9c2f3c07697b8864940d 0714eb875f11c56a2dc8c53c148889fe43602349 Author2 1651932824 +0200 commit (amend): myfile2 diff --git a/test/integration/resetAuthor/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/resetAuthor/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..882fa7c0e --- /dev/null +++ b/test/integration/resetAuthor/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 291bcc7e708303b395f52245ec988ddbc985bae3 Author1 1651932821 +0200 commit (initial): myfile1 +291bcc7e708303b395f52245ec988ddbc985bae3 63aff3f0f54955ea149f9c2f3c07697b8864940d Author1 1651932821 +0200 commit: myfile2 +63aff3f0f54955ea149f9c2f3c07697b8864940d 0714eb875f11c56a2dc8c53c148889fe43602349 Author2 1651932824 +0200 commit (amend): myfile2 diff --git a/test/integration/resetAuthor/expected/repo/.git_keep/objects/07/14eb875f11c56a2dc8c53c148889fe43602349 b/test/integration/resetAuthor/expected/repo/.git_keep/objects/07/14eb875f11c56a2dc8c53c148889fe43602349 new file mode 100644 index 000000000..c355bd74a Binary files /dev/null and b/test/integration/resetAuthor/expected/repo/.git_keep/objects/07/14eb875f11c56a2dc8c53c148889fe43602349 differ diff --git a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/resetAuthor/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/modules/other_repo/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/resetAuthor/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/stash_Copy/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/resetAuthor/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/stash_Copy/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/resetAuthor/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/resetAuthor/expected/repo/.git_keep/objects/29/1bcc7e708303b395f52245ec988ddbc985bae3 b/test/integration/resetAuthor/expected/repo/.git_keep/objects/29/1bcc7e708303b395f52245ec988ddbc985bae3 new file mode 100644 index 000000000..a351f8296 --- /dev/null +++ b/test/integration/resetAuthor/expected/repo/.git_keep/objects/29/1bcc7e708303b395f52245ec988ddbc985bae3 @@ -0,0 +1,2 @@ +x•ŤQ +Â0DýÎ)ö_lşÝ¦ ˘GŮ&,t‰”z{xżfx0oR5[ óˇíŞŕ•SńÂË4kĚDŠ‘sÄ X&ZhČLEŇś<Ű˝îpűÂůW®ú{lzJŐ.];â<„Ž>xď:íwM˙:{—uStČ×5' \ No newline at end of file diff --git a/test/integration/resetAuthor/expected/repo/.git_keep/objects/63/aff3f0f54955ea149f9c2f3c07697b8864940d b/test/integration/resetAuthor/expected/repo/.git_keep/objects/63/aff3f0f54955ea149f9c2f3c07697b8864940d new file mode 100644 index 000000000..3d713469f --- /dev/null +++ b/test/integration/resetAuthor/expected/repo/.git_keep/objects/63/aff3f0f54955ea149f9c2f3c07697b8864940d @@ -0,0 +1,2 @@ +x•ŽK +1]çŮ ’î$=iŃŁäÓÁ‰3 ôöń®ŞxPđňÚÚÜ5‚;ô]DÇÉ:ž«)E¤2±×D–Äd*: µĹ]#dH9O2™`ŤM–}őÎKćJI>E±*>ű}Ýőí Đçź\ĺ۶Č)Żí˘<°Ĺ€ ŹŤQc÷şüŞö®ó"¨>dB„ \ No newline at end of file diff --git a/test/integration/submoduleAdd/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/resetAuthor/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/submoduleAdd/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/resetAuthor/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/submoduleEnter/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/resetAuthor/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/submoduleEnter/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/resetAuthor/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/resetAuthor/expected/repo/.git_keep/refs/heads/master b/test/integration/resetAuthor/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..73d857f01 --- /dev/null +++ b/test/integration/resetAuthor/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +0714eb875f11c56a2dc8c53c148889fe43602349 diff --git a/test/integration/submoduleRemove/expected/myfile1 b/test/integration/resetAuthor/expected/repo/myfile1 similarity index 100% rename from test/integration/submoduleRemove/expected/myfile1 rename to test/integration/resetAuthor/expected/repo/myfile1 diff --git a/test/integration/submoduleEnter/expected/myfile2 b/test/integration/resetAuthor/expected/repo/myfile2 similarity index 100% rename from test/integration/submoduleEnter/expected/myfile2 rename to test/integration/resetAuthor/expected/repo/myfile2 diff --git a/test/integration/resetAuthor/recording.json b/test/integration/resetAuthor/recording.json new file mode 100644 index 000000000..40a1552ac --- /dev/null +++ b/test/integration/resetAuthor/recording.json @@ -0,0 +1 @@ +{"KeyEvents":[{"Timestamp":638,"Mod":0,"Key":256,"Ch":52},{"Timestamp":1406,"Mod":0,"Key":256,"Ch":97},{"Timestamp":2584,"Mod":0,"Key":256,"Ch":121},{"Timestamp":5654,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":117,"Height":83}]} \ No newline at end of file diff --git a/test/integration/resetAuthor/setup.sh b/test/integration/resetAuthor/setup.sh new file mode 100644 index 000000000..a521883c1 --- /dev/null +++ b/test/integration/resetAuthor/setup.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +set -e + +cd $1 + +git init + +git config user.email "Author1@example.com" +git config user.name "Author1" + +echo test1 > myfile1 +git add . +git commit -am "myfile1" +echo test2 > myfile2 +git add . +git commit -am "myfile2" + +git config user.email "Author2@example.com" +git config user.name "Author2" diff --git a/test/integration/resetAuthor/test.json b/test/integration/resetAuthor/test.json new file mode 100644 index 000000000..8e14c4d8e --- /dev/null +++ b/test/integration/resetAuthor/test.json @@ -0,0 +1 @@ +{ "description": "In this test the author of a commit is reset to a different name/email.", "speed": 5 } diff --git a/test/integration/searching/expected/.git_keep/COMMIT_EDITMSG b/test/integration/searching/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/searching/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/searching/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/stash/expected/.git_keep/FETCH_HEAD b/test/integration/searching/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/stash/expected/.git_keep/FETCH_HEAD rename to test/integration/searching/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/HEAD b/test/integration/searching/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/HEAD rename to test/integration/searching/expected/repo/.git_keep/HEAD diff --git a/test/integration/staginWithDiffContextChange/expected/.git_keep/config b/test/integration/searching/expected/repo/.git_keep/config similarity index 100% rename from test/integration/staginWithDiffContextChange/expected/.git_keep/config rename to test/integration/searching/expected/repo/.git_keep/config diff --git a/test/integration/submoduleAdd/expected/.git_keep/modules/blah/description b/test/integration/searching/expected/repo/.git_keep/description similarity index 100% rename from test/integration/submoduleAdd/expected/.git_keep/modules/blah/description rename to test/integration/searching/expected/repo/.git_keep/description diff --git a/test/integration/searching/expected/.git_keep/index b/test/integration/searching/expected/repo/.git_keep/index similarity index 100% rename from test/integration/searching/expected/.git_keep/index rename to test/integration/searching/expected/repo/.git_keep/index diff --git a/test/integration/stash/expected/.git_keep/info/exclude b/test/integration/searching/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/stash/expected/.git_keep/info/exclude rename to test/integration/searching/expected/repo/.git_keep/info/exclude diff --git a/test/integration/searching/expected/.git_keep/logs/HEAD b/test/integration/searching/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/searching/expected/.git_keep/logs/HEAD rename to test/integration/searching/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/searching/expected/.git_keep/logs/refs/heads/master b/test/integration/searching/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/searching/expected/.git_keep/logs/refs/heads/master rename to test/integration/searching/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/submoduleReset/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/searching/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 rename to test/integration/searching/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 diff --git a/test/integration/submoduleAdd/expected/.git_keep/modules/blah/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/searching/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/submoduleAdd/expected/.git_keep/modules/blah/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/searching/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/searching/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/searching/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce new file mode 100644 index 000000000..0a734f981 Binary files /dev/null and b/test/integration/searching/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce differ diff --git a/test/integration/setUpstream/expected_remote/objects/2f/6174050380438f14b16658a356e762435ca591 b/test/integration/searching/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 similarity index 100% rename from test/integration/setUpstream/expected_remote/objects/2f/6174050380438f14b16658a356e762435ca591 rename to test/integration/searching/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 diff --git a/test/integration/searching/expected/.git_keep/objects/33/f3da8081c87015eb5b43b148362af87ce6011c b/test/integration/searching/expected/repo/.git_keep/objects/33/f3da8081c87015eb5b43b148362af87ce6011c similarity index 100% rename from test/integration/searching/expected/.git_keep/objects/33/f3da8081c87015eb5b43b148362af87ce6011c rename to test/integration/searching/expected/repo/.git_keep/objects/33/f3da8081c87015eb5b43b148362af87ce6011c diff --git a/test/integration/searching/expected/.git_keep/objects/3e/c60bb22aa39d08428e57e3251563f797b40fc8 b/test/integration/searching/expected/repo/.git_keep/objects/3e/c60bb22aa39d08428e57e3251563f797b40fc8 similarity index 100% rename from test/integration/searching/expected/.git_keep/objects/3e/c60bb22aa39d08428e57e3251563f797b40fc8 rename to test/integration/searching/expected/repo/.git_keep/objects/3e/c60bb22aa39d08428e57e3251563f797b40fc8 diff --git a/test/integration/squash/expected/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f b/test/integration/searching/expected/repo/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f similarity index 100% rename from test/integration/squash/expected/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f rename to test/integration/searching/expected/repo/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f diff --git a/test/integration/searching/expected/.git_keep/objects/5f/b9c54526790a11246b733354bf896da8ffc09d b/test/integration/searching/expected/repo/.git_keep/objects/5f/b9c54526790a11246b733354bf896da8ffc09d similarity index 100% rename from test/integration/searching/expected/.git_keep/objects/5f/b9c54526790a11246b733354bf896da8ffc09d rename to test/integration/searching/expected/repo/.git_keep/objects/5f/b9c54526790a11246b733354bf896da8ffc09d diff --git a/test/integration/searching/expected/.git_keep/objects/6b/94b71598d5aa96357ab261599cfd99a4c2c9d0 b/test/integration/searching/expected/repo/.git_keep/objects/6b/94b71598d5aa96357ab261599cfd99a4c2c9d0 similarity index 100% rename from test/integration/searching/expected/.git_keep/objects/6b/94b71598d5aa96357ab261599cfd99a4c2c9d0 rename to test/integration/searching/expected/repo/.git_keep/objects/6b/94b71598d5aa96357ab261599cfd99a4c2c9d0 diff --git a/test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/searching/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/searching/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/submoduleRemove/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/searching/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/submoduleRemove/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/searching/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/searching/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/searching/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 new file mode 100644 index 000000000..d39fa7d2f Binary files /dev/null and b/test/integration/searching/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 differ diff --git a/test/integration/searching/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/searching/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b new file mode 100644 index 000000000..9b771fc2f Binary files /dev/null and b/test/integration/searching/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b differ diff --git a/test/integration/searching/expected/.git_keep/objects/f0/5f4d92d7babb2f40ebd2829dccee0afff44c70 b/test/integration/searching/expected/repo/.git_keep/objects/f0/5f4d92d7babb2f40ebd2829dccee0afff44c70 similarity index 100% rename from test/integration/searching/expected/.git_keep/objects/f0/5f4d92d7babb2f40ebd2829dccee0afff44c70 rename to test/integration/searching/expected/repo/.git_keep/objects/f0/5f4d92d7babb2f40ebd2829dccee0afff44c70 diff --git a/test/integration/searching/expected/.git_keep/objects/fc/759ce6e48e0012eab3f02ec3524a55be938dd5 b/test/integration/searching/expected/repo/.git_keep/objects/fc/759ce6e48e0012eab3f02ec3524a55be938dd5 similarity index 100% rename from test/integration/searching/expected/.git_keep/objects/fc/759ce6e48e0012eab3f02ec3524a55be938dd5 rename to test/integration/searching/expected/repo/.git_keep/objects/fc/759ce6e48e0012eab3f02ec3524a55be938dd5 diff --git a/test/integration/searching/expected/.git_keep/refs/heads/master b/test/integration/searching/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/searching/expected/.git_keep/refs/heads/master rename to test/integration/searching/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/submoduleReset/expected/myfile1 b/test/integration/searching/expected/repo/myfile1 similarity index 100% rename from test/integration/submoduleReset/expected/myfile1 rename to test/integration/searching/expected/repo/myfile1 diff --git a/test/integration/searching/expected/repo/myfile3 b/test/integration/searching/expected/repo/myfile3 new file mode 100644 index 000000000..df6b0d2bc --- /dev/null +++ b/test/integration/searching/expected/repo/myfile3 @@ -0,0 +1 @@ +test3 diff --git a/test/integration/setUpstream/expected/myfile4 b/test/integration/searching/expected/repo/myfile4 similarity index 100% rename from test/integration/setUpstream/expected/myfile4 rename to test/integration/searching/expected/repo/myfile4 diff --git a/test/integration/searching/expected/myfile5 b/test/integration/searching/expected/repo/myfile5 similarity index 100% rename from test/integration/searching/expected/myfile5 rename to test/integration/searching/expected/repo/myfile5 diff --git a/test/integration/searchingInStagingPanel/expected/.git_keep/COMMIT_EDITMSG b/test/integration/searchingInStagingPanel/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/searchingInStagingPanel/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/searchingInStagingPanel/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/stashDrop/expected/.git_keep/FETCH_HEAD b/test/integration/searchingInStagingPanel/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/stashDrop/expected/.git_keep/FETCH_HEAD rename to test/integration/searchingInStagingPanel/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/submoduleRemove/expected/.git_keep/HEAD b/test/integration/searchingInStagingPanel/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/submoduleRemove/expected/.git_keep/HEAD rename to test/integration/searchingInStagingPanel/expected/repo/.git_keep/HEAD diff --git a/test/integration/staging/expected/.git_keep/config b/test/integration/searchingInStagingPanel/expected/repo/.git_keep/config similarity index 100% rename from test/integration/staging/expected/.git_keep/config rename to test/integration/searchingInStagingPanel/expected/repo/.git_keep/config diff --git a/test/integration/submoduleEnter/expected/.git_keep/description b/test/integration/searchingInStagingPanel/expected/repo/.git_keep/description similarity index 100% rename from test/integration/submoduleEnter/expected/.git_keep/description rename to test/integration/searchingInStagingPanel/expected/repo/.git_keep/description diff --git a/test/integration/searchingInStagingPanel/expected/.git_keep/index b/test/integration/searchingInStagingPanel/expected/repo/.git_keep/index similarity index 100% rename from test/integration/searchingInStagingPanel/expected/.git_keep/index rename to test/integration/searchingInStagingPanel/expected/repo/.git_keep/index diff --git a/test/integration/stashDrop/expected/.git_keep/info/exclude b/test/integration/searchingInStagingPanel/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/stashDrop/expected/.git_keep/info/exclude rename to test/integration/searchingInStagingPanel/expected/repo/.git_keep/info/exclude diff --git a/test/integration/searchingInStagingPanel/expected/.git_keep/logs/HEAD b/test/integration/searchingInStagingPanel/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/searchingInStagingPanel/expected/.git_keep/logs/HEAD rename to test/integration/searchingInStagingPanel/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/searchingInStagingPanel/expected/.git_keep/logs/refs/heads/master b/test/integration/searchingInStagingPanel/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/searchingInStagingPanel/expected/.git_keep/logs/refs/heads/master rename to test/integration/searchingInStagingPanel/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/searchingInStagingPanel/expected/.git_keep/objects/16/4d8eaeabbb4b1082fdfb6735be0134535340b2 b/test/integration/searchingInStagingPanel/expected/repo/.git_keep/objects/16/4d8eaeabbb4b1082fdfb6735be0134535340b2 similarity index 100% rename from test/integration/searchingInStagingPanel/expected/.git_keep/objects/16/4d8eaeabbb4b1082fdfb6735be0134535340b2 rename to test/integration/searchingInStagingPanel/expected/repo/.git_keep/objects/16/4d8eaeabbb4b1082fdfb6735be0134535340b2 diff --git a/test/integration/searchingInStagingPanel/expected/.git_keep/objects/36/4e6307f708c6f17d83c7309aaf9a3034210236 b/test/integration/searchingInStagingPanel/expected/repo/.git_keep/objects/36/4e6307f708c6f17d83c7309aaf9a3034210236 similarity index 100% rename from test/integration/searchingInStagingPanel/expected/.git_keep/objects/36/4e6307f708c6f17d83c7309aaf9a3034210236 rename to test/integration/searchingInStagingPanel/expected/repo/.git_keep/objects/36/4e6307f708c6f17d83c7309aaf9a3034210236 diff --git a/test/integration/searchingInStagingPanel/expected/.git_keep/objects/4e/a1f9142dd3ced7ae2180752f770ce203fb8ac3 b/test/integration/searchingInStagingPanel/expected/repo/.git_keep/objects/4e/a1f9142dd3ced7ae2180752f770ce203fb8ac3 similarity index 100% rename from test/integration/searchingInStagingPanel/expected/.git_keep/objects/4e/a1f9142dd3ced7ae2180752f770ce203fb8ac3 rename to test/integration/searchingInStagingPanel/expected/repo/.git_keep/objects/4e/a1f9142dd3ced7ae2180752f770ce203fb8ac3 diff --git a/test/integration/searchingInStagingPanel/expected/.git_keep/objects/70/dcf03faa734af0278690e1b0f8e767b733d88a b/test/integration/searchingInStagingPanel/expected/repo/.git_keep/objects/70/dcf03faa734af0278690e1b0f8e767b733d88a similarity index 100% rename from test/integration/searchingInStagingPanel/expected/.git_keep/objects/70/dcf03faa734af0278690e1b0f8e767b733d88a rename to test/integration/searchingInStagingPanel/expected/repo/.git_keep/objects/70/dcf03faa734af0278690e1b0f8e767b733d88a diff --git a/test/integration/searchingInStagingPanel/expected/.git_keep/objects/88/4971c742724377080ba3d75d4b4d6bceee4e4b b/test/integration/searchingInStagingPanel/expected/repo/.git_keep/objects/88/4971c742724377080ba3d75d4b4d6bceee4e4b similarity index 100% rename from test/integration/searchingInStagingPanel/expected/.git_keep/objects/88/4971c742724377080ba3d75d4b4d6bceee4e4b rename to test/integration/searchingInStagingPanel/expected/repo/.git_keep/objects/88/4971c742724377080ba3d75d4b4d6bceee4e4b diff --git a/test/integration/searchingInStagingPanel/expected/.git_keep/objects/89/b24ecec50c07aef0d6640a2a9f6dc354a33125 b/test/integration/searchingInStagingPanel/expected/repo/.git_keep/objects/89/b24ecec50c07aef0d6640a2a9f6dc354a33125 similarity index 100% rename from test/integration/searchingInStagingPanel/expected/.git_keep/objects/89/b24ecec50c07aef0d6640a2a9f6dc354a33125 rename to test/integration/searchingInStagingPanel/expected/repo/.git_keep/objects/89/b24ecec50c07aef0d6640a2a9f6dc354a33125 diff --git a/test/integration/searchingInStagingPanel/expected/.git_keep/objects/9c/2a7090627d0fffa9ed001bf7be98f86c2c8068 b/test/integration/searchingInStagingPanel/expected/repo/.git_keep/objects/9c/2a7090627d0fffa9ed001bf7be98f86c2c8068 similarity index 100% rename from test/integration/searchingInStagingPanel/expected/.git_keep/objects/9c/2a7090627d0fffa9ed001bf7be98f86c2c8068 rename to test/integration/searchingInStagingPanel/expected/repo/.git_keep/objects/9c/2a7090627d0fffa9ed001bf7be98f86c2c8068 diff --git a/test/integration/searchingInStagingPanel/expected/.git_keep/objects/a9/2d664bc20a04b1621b1fc893d1196b41182fdf b/test/integration/searchingInStagingPanel/expected/repo/.git_keep/objects/a9/2d664bc20a04b1621b1fc893d1196b41182fdf similarity index 100% rename from test/integration/searchingInStagingPanel/expected/.git_keep/objects/a9/2d664bc20a04b1621b1fc893d1196b41182fdf rename to test/integration/searchingInStagingPanel/expected/repo/.git_keep/objects/a9/2d664bc20a04b1621b1fc893d1196b41182fdf diff --git a/test/integration/searchingInStagingPanel/expected/.git_keep/objects/cb/f7f40f0ffe31d36ddc23bc6ce251c66f6f4e87 b/test/integration/searchingInStagingPanel/expected/repo/.git_keep/objects/cb/f7f40f0ffe31d36ddc23bc6ce251c66f6f4e87 similarity index 100% rename from test/integration/searchingInStagingPanel/expected/.git_keep/objects/cb/f7f40f0ffe31d36ddc23bc6ce251c66f6f4e87 rename to test/integration/searchingInStagingPanel/expected/repo/.git_keep/objects/cb/f7f40f0ffe31d36ddc23bc6ce251c66f6f4e87 diff --git a/test/integration/searchingInStagingPanel/expected/.git_keep/refs/heads/master b/test/integration/searchingInStagingPanel/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/searchingInStagingPanel/expected/.git_keep/refs/heads/master rename to test/integration/searchingInStagingPanel/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/searchingInStagingPanel/expected/myfile1 b/test/integration/searchingInStagingPanel/expected/repo/myfile1 similarity index 100% rename from test/integration/searchingInStagingPanel/expected/myfile1 rename to test/integration/searchingInStagingPanel/expected/repo/myfile1 diff --git a/test/integration/setAuthor/expected/repo/.git_keep/COMMIT_EDITMSG b/test/integration/setAuthor/expected/repo/.git_keep/COMMIT_EDITMSG new file mode 100644 index 000000000..c23aa0355 --- /dev/null +++ b/test/integration/setAuthor/expected/repo/.git_keep/COMMIT_EDITMSG @@ -0,0 +1 @@ +myfile3 diff --git a/test/integration/stashNewBranch/expected/.git_keep/FETCH_HEAD b/test/integration/setAuthor/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/stashNewBranch/expected/.git_keep/FETCH_HEAD rename to test/integration/setAuthor/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/submoduleReset/expected/.git_keep/HEAD b/test/integration/setAuthor/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/HEAD rename to test/integration/setAuthor/expected/repo/.git_keep/HEAD diff --git a/test/integration/setAuthor/expected/repo/.git_keep/config b/test/integration/setAuthor/expected/repo/.git_keep/config new file mode 100644 index 000000000..85e571409 --- /dev/null +++ b/test/integration/setAuthor/expected/repo/.git_keep/config @@ -0,0 +1,10 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[user] + email = Author2@example.com + name = Author2 diff --git a/test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/description b/test/integration/setAuthor/expected/repo/.git_keep/description similarity index 100% rename from test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/description rename to test/integration/setAuthor/expected/repo/.git_keep/description diff --git a/test/integration/setAuthor/expected/repo/.git_keep/index b/test/integration/setAuthor/expected/repo/.git_keep/index new file mode 100644 index 000000000..78afb6d69 Binary files /dev/null and b/test/integration/setAuthor/expected/repo/.git_keep/index differ diff --git a/test/integration/stashNewBranch/expected/.git_keep/info/exclude b/test/integration/setAuthor/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/stashNewBranch/expected/.git_keep/info/exclude rename to test/integration/setAuthor/expected/repo/.git_keep/info/exclude diff --git a/test/integration/setAuthor/expected/repo/.git_keep/logs/HEAD b/test/integration/setAuthor/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..38d45fb5d --- /dev/null +++ b/test/integration/setAuthor/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,4 @@ +0000000000000000000000000000000000000000 2075aeb39a2a66a9607860a65b2a71c517760254 Author1 1652008089 +1000 commit (initial): myfile1 +2075aeb39a2a66a9607860a65b2a71c517760254 d01c8bb001458d0a7c01193813685c658e0355ac Author1 1652008089 +1000 commit: myfile2 +d01c8bb001458d0a7c01193813685c658e0355ac 8710ece70b7db9638b9645e93abdbcf210fa4595 Author2 1652008089 +1000 commit: myfile3 +8710ece70b7db9638b9645e93abdbcf210fa4595 baf3189129ba8878ba9b4107eaaaf3389287259b Author2 1652008097 +1000 commit (amend): myfile3 diff --git a/test/integration/setAuthor/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/setAuthor/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..38d45fb5d --- /dev/null +++ b/test/integration/setAuthor/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,4 @@ +0000000000000000000000000000000000000000 2075aeb39a2a66a9607860a65b2a71c517760254 Author1 1652008089 +1000 commit (initial): myfile1 +2075aeb39a2a66a9607860a65b2a71c517760254 d01c8bb001458d0a7c01193813685c658e0355ac Author1 1652008089 +1000 commit: myfile2 +d01c8bb001458d0a7c01193813685c658e0355ac 8710ece70b7db9638b9645e93abdbcf210fa4595 Author2 1652008089 +1000 commit: myfile3 +8710ece70b7db9638b9645e93abdbcf210fa4595 baf3189129ba8878ba9b4107eaaaf3389287259b Author2 1652008097 +1000 commit (amend): myfile3 diff --git a/test/integration/setAuthor/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/setAuthor/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 new file mode 100644 index 000000000..7f2ebf4ee Binary files /dev/null and b/test/integration/setAuthor/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 differ diff --git a/test/integration/submoduleAdd/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/setAuthor/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/submoduleAdd/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/setAuthor/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/setAuthor/expected/repo/.git_keep/objects/20/75aeb39a2a66a9607860a65b2a71c517760254 b/test/integration/setAuthor/expected/repo/.git_keep/objects/20/75aeb39a2a66a9607860a65b2a71c517760254 new file mode 100644 index 000000000..ce4b3233f --- /dev/null +++ b/test/integration/setAuthor/expected/repo/.git_keep/objects/20/75aeb39a2a66a9607860a65b2a71c517760254 @@ -0,0 +1,2 @@ +x•ŤQ +Â0DýÎ)ö_ݸÝnˇ%M6Xh”z{xżfx0ob-em@"‡¶›šÄŚA–q2MĚF*IÉĘ#/|NÂ9ÄÁ»đl÷şĂíóŻ\íĘcłS¬ĺҵGTÔ Ž„®Ó~×ěďˇ+ďĽnFîČ‹5' \ No newline at end of file diff --git a/test/integration/setAuthor/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/setAuthor/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce new file mode 100644 index 000000000..0a734f981 Binary files /dev/null and b/test/integration/setAuthor/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce differ diff --git a/test/integration/setAuthor/expected/repo/.git_keep/objects/87/10ece70b7db9638b9645e93abdbcf210fa4595 b/test/integration/setAuthor/expected/repo/.git_keep/objects/87/10ece70b7db9638b9645e93abdbcf210fa4595 new file mode 100644 index 000000000..573b0d49c Binary files /dev/null and b/test/integration/setAuthor/expected/repo/.git_keep/objects/87/10ece70b7db9638b9645e93abdbcf210fa4595 differ diff --git a/test/integration/submoduleEnter/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/setAuthor/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/submoduleEnter/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/setAuthor/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/setAuthor/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/modules/other_repo/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/setAuthor/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/setAuthor/expected/repo/.git_keep/objects/ba/f3189129ba8878ba9b4107eaaaf3389287259b b/test/integration/setAuthor/expected/repo/.git_keep/objects/ba/f3189129ba8878ba9b4107eaaaf3389287259b new file mode 100644 index 000000000..18a5ff1cd Binary files /dev/null and b/test/integration/setAuthor/expected/repo/.git_keep/objects/ba/f3189129ba8878ba9b4107eaaaf3389287259b differ diff --git a/test/integration/setAuthor/expected/repo/.git_keep/objects/d0/1c8bb001458d0a7c01193813685c658e0355ac b/test/integration/setAuthor/expected/repo/.git_keep/objects/d0/1c8bb001458d0a7c01193813685c658e0355ac new file mode 100644 index 000000000..e9d69bf0f Binary files /dev/null and b/test/integration/setAuthor/expected/repo/.git_keep/objects/d0/1c8bb001458d0a7c01193813685c658e0355ac differ diff --git a/test/integration/setAuthor/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/setAuthor/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b new file mode 100644 index 000000000..9b771fc2f Binary files /dev/null and b/test/integration/setAuthor/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b differ diff --git a/test/integration/setAuthor/expected/repo/.git_keep/refs/heads/master b/test/integration/setAuthor/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..2499d7343 --- /dev/null +++ b/test/integration/setAuthor/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +baf3189129ba8878ba9b4107eaaaf3389287259b diff --git a/test/integration/submoduleReset/expected/other_repo/myfile1 b/test/integration/setAuthor/expected/repo/myfile1 similarity index 100% rename from test/integration/submoduleReset/expected/other_repo/myfile1 rename to test/integration/setAuthor/expected/repo/myfile1 diff --git a/test/integration/submoduleRemove/expected/myfile2 b/test/integration/setAuthor/expected/repo/myfile2 similarity index 100% rename from test/integration/submoduleRemove/expected/myfile2 rename to test/integration/setAuthor/expected/repo/myfile2 diff --git a/test/integration/setAuthor/expected/repo/myfile3 b/test/integration/setAuthor/expected/repo/myfile3 new file mode 100644 index 000000000..df6b0d2bc --- /dev/null +++ b/test/integration/setAuthor/expected/repo/myfile3 @@ -0,0 +1 @@ +test3 diff --git a/test/integration/setAuthor/recording.json b/test/integration/setAuthor/recording.json new file mode 100644 index 000000000..9084af754 --- /dev/null +++ b/test/integration/setAuthor/recording.json @@ -0,0 +1 @@ +{"KeyEvents":[{"Timestamp":1118,"Mod":0,"Key":259,"Ch":0},{"Timestamp":1382,"Mod":0,"Key":259,"Ch":0},{"Timestamp":2654,"Mod":0,"Key":256,"Ch":97},{"Timestamp":3632,"Mod":0,"Key":258,"Ch":0},{"Timestamp":4070,"Mod":0,"Key":13,"Ch":13},{"Timestamp":6702,"Mod":0,"Key":9,"Ch":9},{"Timestamp":7486,"Mod":0,"Key":258,"Ch":0},{"Timestamp":7899,"Mod":0,"Key":13,"Ch":13},{"Timestamp":9141,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":272,"Height":74}]} \ No newline at end of file diff --git a/test/integration/setAuthor/setup.sh b/test/integration/setAuthor/setup.sh new file mode 100644 index 000000000..2eeb4d549 --- /dev/null +++ b/test/integration/setAuthor/setup.sh @@ -0,0 +1,24 @@ +#!/bin/sh + +set -e + +cd $1 + +git init + +git config user.email "Author1@example.com" +git config user.name "Author1" + +echo test1 > myfile1 +git add . +git commit -am "myfile1" +echo test2 > myfile2 +git add . +git commit -am "myfile2" + +git config user.email "Author2@example.com" +git config user.name "Author2" + +echo test3 > myfile3 +git add . +git commit -am "myfile3" diff --git a/test/integration/setAuthor/test.json b/test/integration/setAuthor/test.json new file mode 100644 index 000000000..c8426b12c --- /dev/null +++ b/test/integration/setAuthor/test.json @@ -0,0 +1,4 @@ +{ + "description": "In this test the author of a commit is set to a different name/email.", + "speed": 5 +} diff --git a/test/integration/setUpstream/expected/.git_keep/FETCH_HEAD b/test/integration/setUpstream/expected/.git_keep/FETCH_HEAD deleted file mode 100644 index 865fc1191..000000000 --- a/test/integration/setUpstream/expected/.git_keep/FETCH_HEAD +++ /dev/null @@ -1 +0,0 @@ -148a38f7ce513079d6cd40e4a02f11e46ea2ba6b branch 'master' of ../actual_remote diff --git a/test/integration/setUpstream/expected/.git_keep/ORIG_HEAD b/test/integration/setUpstream/expected/.git_keep/ORIG_HEAD deleted file mode 100644 index 131e55236..000000000 --- a/test/integration/setUpstream/expected/.git_keep/ORIG_HEAD +++ /dev/null @@ -1 +0,0 @@ -058c8904c25889dd77ee3e817325fd1a28134037 diff --git a/test/integration/setUpstream/expected/.git_keep/config b/test/integration/setUpstream/expected/.git_keep/config deleted file mode 100644 index 821803a3e..000000000 --- a/test/integration/setUpstream/expected/.git_keep/config +++ /dev/null @@ -1,16 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true - precomposeunicode = true -[user] - email = CI@example.com - name = CI -[remote "origin"] - url = ../actual_remote - fetch = +refs/heads/*:refs/remotes/origin/* -[branch "master"] - remote = origin - merge = refs/heads/master diff --git a/test/integration/setUpstream/expected/.git_keep/index b/test/integration/setUpstream/expected/.git_keep/index deleted file mode 100644 index 9c34edeae..000000000 Binary files a/test/integration/setUpstream/expected/.git_keep/index and /dev/null differ diff --git a/test/integration/setUpstream/expected/.git_keep/logs/HEAD b/test/integration/setUpstream/expected/.git_keep/logs/HEAD deleted file mode 100644 index 0a0706f6a..000000000 --- a/test/integration/setUpstream/expected/.git_keep/logs/HEAD +++ /dev/null @@ -1,6 +0,0 @@ -0000000000000000000000000000000000000000 7d7da1f440cca8d28eaf4b46e63f207993562b84 CI 1634898072 +1100 commit (initial): myfile1 -7d7da1f440cca8d28eaf4b46e63f207993562b84 058c8904c25889dd77ee3e817325fd1a28134037 CI 1634898072 +1100 commit: myfile2 -058c8904c25889dd77ee3e817325fd1a28134037 409dd039b9ec270067678ae23b710c8e4c49c458 CI 1634898072 +1100 commit: myfile3 -409dd039b9ec270067678ae23b710c8e4c49c458 148a38f7ce513079d6cd40e4a02f11e46ea2ba6b CI 1634898072 +1100 commit: myfile4 -148a38f7ce513079d6cd40e4a02f11e46ea2ba6b 058c8904c25889dd77ee3e817325fd1a28134037 CI 1634898072 +1100 reset: moving to HEAD~2 -058c8904c25889dd77ee3e817325fd1a28134037 148a38f7ce513079d6cd40e4a02f11e46ea2ba6b CI 1634898082 +1100 pull --no-edit: Fast-forward diff --git a/test/integration/setUpstream/expected/.git_keep/logs/refs/heads/master b/test/integration/setUpstream/expected/.git_keep/logs/refs/heads/master deleted file mode 100644 index 0a0706f6a..000000000 --- a/test/integration/setUpstream/expected/.git_keep/logs/refs/heads/master +++ /dev/null @@ -1,6 +0,0 @@ -0000000000000000000000000000000000000000 7d7da1f440cca8d28eaf4b46e63f207993562b84 CI 1634898072 +1100 commit (initial): myfile1 -7d7da1f440cca8d28eaf4b46e63f207993562b84 058c8904c25889dd77ee3e817325fd1a28134037 CI 1634898072 +1100 commit: myfile2 -058c8904c25889dd77ee3e817325fd1a28134037 409dd039b9ec270067678ae23b710c8e4c49c458 CI 1634898072 +1100 commit: myfile3 -409dd039b9ec270067678ae23b710c8e4c49c458 148a38f7ce513079d6cd40e4a02f11e46ea2ba6b CI 1634898072 +1100 commit: myfile4 -148a38f7ce513079d6cd40e4a02f11e46ea2ba6b 058c8904c25889dd77ee3e817325fd1a28134037 CI 1634898072 +1100 reset: moving to HEAD~2 -058c8904c25889dd77ee3e817325fd1a28134037 148a38f7ce513079d6cd40e4a02f11e46ea2ba6b CI 1634898082 +1100 pull --no-edit: Fast-forward diff --git a/test/integration/setUpstream/expected/.git_keep/logs/refs/remotes/origin/master b/test/integration/setUpstream/expected/.git_keep/logs/refs/remotes/origin/master deleted file mode 100644 index 10925c1eb..000000000 --- a/test/integration/setUpstream/expected/.git_keep/logs/refs/remotes/origin/master +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 148a38f7ce513079d6cd40e4a02f11e46ea2ba6b CI 1634898079 +1100 fetch origin: storing head diff --git a/test/integration/setUpstream/expected/.git_keep/objects/05/8c8904c25889dd77ee3e817325fd1a28134037 b/test/integration/setUpstream/expected/.git_keep/objects/05/8c8904c25889dd77ee3e817325fd1a28134037 deleted file mode 100644 index ae34bb7c1..000000000 --- a/test/integration/setUpstream/expected/.git_keep/objects/05/8c8904c25889dd77ee3e817325fd1a28134037 +++ /dev/null @@ -1,2 +0,0 @@ -xŤÎA -Â0@Q×9Eö‚$“é$"BW=Ƥ™`ÁŘR"čííÜ~ŢâĎkkK·žńÔwU+1 —«+Eµ2±×L€ě* 'łÉ®Żnc‰E|Etó,©@R©‘”B™Ă@y÷ÇşŰq˛×qşëGÚöÔËĽ¶›ő0qrěŮ{çĚQŹ©®rÓľuy*Ýś:< \ No newline at end of file diff --git a/test/integration/setUpstream/expected/.git_keep/objects/14/8a38f7ce513079d6cd40e4a02f11e46ea2ba6b b/test/integration/setUpstream/expected/.git_keep/objects/14/8a38f7ce513079d6cd40e4a02f11e46ea2ba6b deleted file mode 100644 index 9d94a934d..000000000 --- a/test/integration/setUpstream/expected/.git_keep/objects/14/8a38f7ce513079d6cd40e4a02f11e46ea2ba6b +++ /dev/null @@ -1,3 +0,0 @@ -xŤÎA -0@Ń®sŠě e&™L& ĄŕĘcÄ8RÁT‘ÚŰ×#tűy‹_¶Z—f1ŃĄŞÖÍŚ‘ € /3ŇĚA˛¬‘ůPrHhö|č«Y‚4MŕÓ´¸Ŕ‘Łdu~ŚE” -ĄBAL~·çvŘ~°]?<ô“ëľę­lőn‘=IÎ^ĚYĎ©¦rSżó˛*™–ş8M \ No newline at end of file diff --git a/test/integration/setUpstream/expected/.git_keep/objects/40/9dd039b9ec270067678ae23b710c8e4c49c458 b/test/integration/setUpstream/expected/.git_keep/objects/40/9dd039b9ec270067678ae23b710c8e4c49c458 deleted file mode 100644 index fa4e2ebaa..000000000 --- a/test/integration/setUpstream/expected/.git_keep/objects/40/9dd039b9ec270067678ae23b710c8e4c49c458 +++ /dev/null @@ -1,3 +0,0 @@ -xŤŽA -Ă E»öî Ĺq4ŽJ!«ĂŚ# Ä& ííëşúđx<>ďµ®MCt—vŠh»@@¦rq%9,%eŔB†iA°ěű˛¨#ťňjÚxbŠĆ±őD1çDP¨G¬/’%@g0¨ônĎýÔÓ¬Çi~Č'Őc“ďő®a@G‘L°ú -`Śę´źjň§®ę·¬› úŔÚ9ö \ No newline at end of file diff --git a/test/integration/setUpstream/expected/.git_keep/objects/7d/7da1f440cca8d28eaf4b46e63f207993562b84 b/test/integration/setUpstream/expected/.git_keep/objects/7d/7da1f440cca8d28eaf4b46e63f207993562b84 deleted file mode 100644 index 54afb1c5a..000000000 --- a/test/integration/setUpstream/expected/.git_keep/objects/7d/7da1f440cca8d28eaf4b46e63f207993562b84 +++ /dev/null @@ -1,3 +0,0 @@ -xŤÍA -Â0@Q×9Ĺěɤăd -"BW=Ć4™`ˇ!R"čííÜ~üÔj]; ń©ďfŕŤSńĘKM2‘ˇp Š%ŇBCf*š®Áé»?ŰÓ ·i~ŘGëkłKjőČÉ(>8#zďŽzLşýÉ]ý–u3t?4A,Ů \ No newline at end of file diff --git a/test/integration/setUpstream/expected/.git_keep/refs/heads/master b/test/integration/setUpstream/expected/.git_keep/refs/heads/master deleted file mode 100644 index 25aa18f55..000000000 --- a/test/integration/setUpstream/expected/.git_keep/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -148a38f7ce513079d6cd40e4a02f11e46ea2ba6b diff --git a/test/integration/setUpstream/expected/.git_keep/refs/remotes/origin/master b/test/integration/setUpstream/expected/.git_keep/refs/remotes/origin/master deleted file mode 100644 index 25aa18f55..000000000 --- a/test/integration/setUpstream/expected/.git_keep/refs/remotes/origin/master +++ /dev/null @@ -1 +0,0 @@ -148a38f7ce513079d6cd40e4a02f11e46ea2ba6b diff --git a/test/integration/tags/expected/.git_keep/HEAD b/test/integration/setUpstream/expected/origin/HEAD similarity index 100% rename from test/integration/tags/expected/.git_keep/HEAD rename to test/integration/setUpstream/expected/origin/HEAD diff --git a/test/integration/setUpstream/expected/origin/config b/test/integration/setUpstream/expected/origin/config new file mode 100644 index 000000000..f97482c61 --- /dev/null +++ b/test/integration/setUpstream/expected/origin/config @@ -0,0 +1,6 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true +[remote "origin"] + url = /home/mark/Downloads/gits/lazygit/test/integration/setUpstream/actual/./repo diff --git a/test/integration/submoduleRemove/expected/.git_keep/description b/test/integration/setUpstream/expected/origin/description similarity index 100% rename from test/integration/submoduleRemove/expected/.git_keep/description rename to test/integration/setUpstream/expected/origin/description diff --git a/test/integration/setUpstream/expected/origin/info/exclude b/test/integration/setUpstream/expected/origin/info/exclude new file mode 100644 index 000000000..a5196d1be --- /dev/null +++ b/test/integration/setUpstream/expected/origin/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/test/integration/setUpstream/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/setUpstream/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 new file mode 100644 index 000000000..7f2ebf4ee Binary files /dev/null and b/test/integration/setUpstream/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 differ diff --git a/test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/setUpstream/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/setUpstream/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/setUpstream/expected/origin/objects/27/58cffdc0d931ff3a3d6c58b75f91ec42981dcf b/test/integration/setUpstream/expected/origin/objects/27/58cffdc0d931ff3a3d6c58b75f91ec42981dcf new file mode 100644 index 000000000..099d02445 Binary files /dev/null and b/test/integration/setUpstream/expected/origin/objects/27/58cffdc0d931ff3a3d6c58b75f91ec42981dcf differ diff --git a/test/integration/setUpstream/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/setUpstream/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce new file mode 100644 index 000000000..0a734f981 Binary files /dev/null and b/test/integration/setUpstream/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce differ diff --git a/test/integration/squash/expected/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 b/test/integration/setUpstream/expected/origin/objects/2f/6174050380438f14b16658a356e762435ca591 similarity index 100% rename from test/integration/squash/expected/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 rename to test/integration/setUpstream/expected/origin/objects/2f/6174050380438f14b16658a356e762435ca591 diff --git a/test/integration/setUpstream/expected/origin/objects/6d/51185514ab4f80b42f17013295c261f92a66f0 b/test/integration/setUpstream/expected/origin/objects/6d/51185514ab4f80b42f17013295c261f92a66f0 new file mode 100644 index 000000000..d9b4d87b9 Binary files /dev/null and b/test/integration/setUpstream/expected/origin/objects/6d/51185514ab4f80b42f17013295c261f92a66f0 differ diff --git a/test/integration/setUpstream/expected/origin/objects/9c/663d29d26a71dd67e3bf7b1f2ea73f4939d9e0 b/test/integration/setUpstream/expected/origin/objects/9c/663d29d26a71dd67e3bf7b1f2ea73f4939d9e0 new file mode 100644 index 000000000..7965d6afb --- /dev/null +++ b/test/integration/setUpstream/expected/origin/objects/9c/663d29d26a71dd67e3bf7b1f2ea73f4939d9e0 @@ -0,0 +1,3 @@ +xŤÍA +Â0@Q×9Ĺ왉“i +"BW=FšL°Đ!R"čííÜ~üÜĚÖÄrę»* J®dFŤ…Y)J‰äŐľášrđ.˝űłí0Íp›ć‡~’˝6˝äfw če áŚŃőtý“;űÖuSr?2X,Ď \ No newline at end of file diff --git a/test/integration/submoduleRemove/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/setUpstream/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/submoduleRemove/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/setUpstream/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/submoduleReset/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/setUpstream/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 rename to test/integration/setUpstream/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 diff --git a/test/integration/setUpstream/expected/origin/objects/ce/3220d7b3cbc57811e3e6169349c611f62a7c42 b/test/integration/setUpstream/expected/origin/objects/ce/3220d7b3cbc57811e3e6169349c611f62a7c42 new file mode 100644 index 000000000..19012a4aa Binary files /dev/null and b/test/integration/setUpstream/expected/origin/objects/ce/3220d7b3cbc57811e3e6169349c611f62a7c42 differ diff --git a/test/integration/setUpstream/expected/origin/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/setUpstream/expected/origin/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 new file mode 100644 index 000000000..d39fa7d2f Binary files /dev/null and b/test/integration/setUpstream/expected/origin/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 differ diff --git a/test/integration/setUpstream/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/setUpstream/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b new file mode 100644 index 000000000..9b771fc2f Binary files /dev/null and b/test/integration/setUpstream/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b differ diff --git a/test/integration/setUpstream/expected/origin/packed-refs b/test/integration/setUpstream/expected/origin/packed-refs new file mode 100644 index 000000000..f854ff120 --- /dev/null +++ b/test/integration/setUpstream/expected/origin/packed-refs @@ -0,0 +1,2 @@ +# pack-refs with: peeled fully-peeled sorted +ce3220d7b3cbc57811e3e6169349c611f62a7c42 refs/heads/master diff --git a/test/integration/setUpstream/expected/repo/.git_keep/COMMIT_EDITMSG b/test/integration/setUpstream/expected/repo/.git_keep/COMMIT_EDITMSG new file mode 100644 index 000000000..51be8ec3d --- /dev/null +++ b/test/integration/setUpstream/expected/repo/.git_keep/COMMIT_EDITMSG @@ -0,0 +1 @@ +myfile4 diff --git a/test/integration/setUpstream/expected/repo/.git_keep/FETCH_HEAD b/test/integration/setUpstream/expected/repo/.git_keep/FETCH_HEAD new file mode 100644 index 000000000..b60b7b2a0 --- /dev/null +++ b/test/integration/setUpstream/expected/repo/.git_keep/FETCH_HEAD @@ -0,0 +1 @@ +ce3220d7b3cbc57811e3e6169349c611f62a7c42 not-for-merge branch 'master' of ../origin diff --git a/test/integration/tags4/expected/.git_keep/HEAD b/test/integration/setUpstream/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/tags4/expected/.git_keep/HEAD rename to test/integration/setUpstream/expected/repo/.git_keep/HEAD diff --git a/test/integration/setUpstream/expected/repo/.git_keep/ORIG_HEAD b/test/integration/setUpstream/expected/repo/.git_keep/ORIG_HEAD new file mode 100644 index 000000000..6e2a4de9b --- /dev/null +++ b/test/integration/setUpstream/expected/repo/.git_keep/ORIG_HEAD @@ -0,0 +1 @@ +ce3220d7b3cbc57811e3e6169349c611f62a7c42 diff --git a/test/integration/setUpstream/expected/repo/.git_keep/config b/test/integration/setUpstream/expected/repo/.git_keep/config new file mode 100644 index 000000000..64b94ff0f --- /dev/null +++ b/test/integration/setUpstream/expected/repo/.git_keep/config @@ -0,0 +1,14 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[user] + email = CI@example.com + name = CI +[remote "origin"] + url = ../origin + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "master"] + remote = origin + merge = refs/heads/master diff --git a/test/integration/submoduleReset/expected/.git_keep/description b/test/integration/setUpstream/expected/repo/.git_keep/description similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/description rename to test/integration/setUpstream/expected/repo/.git_keep/description diff --git a/test/integration/setUpstream/expected/repo/.git_keep/index b/test/integration/setUpstream/expected/repo/.git_keep/index new file mode 100644 index 000000000..25d846403 Binary files /dev/null and b/test/integration/setUpstream/expected/repo/.git_keep/index differ diff --git a/test/integration/setUpstream/expected/repo/.git_keep/info/exclude b/test/integration/setUpstream/expected/repo/.git_keep/info/exclude new file mode 100644 index 000000000..a5196d1be --- /dev/null +++ b/test/integration/setUpstream/expected/repo/.git_keep/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/test/integration/setUpstream/expected/repo/.git_keep/logs/HEAD b/test/integration/setUpstream/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..300481fb2 --- /dev/null +++ b/test/integration/setUpstream/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,5 @@ +0000000000000000000000000000000000000000 9c663d29d26a71dd67e3bf7b1f2ea73f4939d9e0 CI 1650269554 +0200 commit (initial): myfile1 +9c663d29d26a71dd67e3bf7b1f2ea73f4939d9e0 6d51185514ab4f80b42f17013295c261f92a66f0 CI 1650269554 +0200 commit: myfile2 +6d51185514ab4f80b42f17013295c261f92a66f0 2758cffdc0d931ff3a3d6c58b75f91ec42981dcf CI 1650269554 +0200 commit: myfile3 +2758cffdc0d931ff3a3d6c58b75f91ec42981dcf ce3220d7b3cbc57811e3e6169349c611f62a7c42 CI 1650269554 +0200 commit: myfile4 +ce3220d7b3cbc57811e3e6169349c611f62a7c42 6d51185514ab4f80b42f17013295c261f92a66f0 CI 1650269554 +0200 reset: moving to HEAD~2 diff --git a/test/integration/setUpstream/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/setUpstream/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..300481fb2 --- /dev/null +++ b/test/integration/setUpstream/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,5 @@ +0000000000000000000000000000000000000000 9c663d29d26a71dd67e3bf7b1f2ea73f4939d9e0 CI 1650269554 +0200 commit (initial): myfile1 +9c663d29d26a71dd67e3bf7b1f2ea73f4939d9e0 6d51185514ab4f80b42f17013295c261f92a66f0 CI 1650269554 +0200 commit: myfile2 +6d51185514ab4f80b42f17013295c261f92a66f0 2758cffdc0d931ff3a3d6c58b75f91ec42981dcf CI 1650269554 +0200 commit: myfile3 +2758cffdc0d931ff3a3d6c58b75f91ec42981dcf ce3220d7b3cbc57811e3e6169349c611f62a7c42 CI 1650269554 +0200 commit: myfile4 +ce3220d7b3cbc57811e3e6169349c611f62a7c42 6d51185514ab4f80b42f17013295c261f92a66f0 CI 1650269554 +0200 reset: moving to HEAD~2 diff --git a/test/integration/setUpstream/expected/repo/.git_keep/logs/refs/remotes/origin/master b/test/integration/setUpstream/expected/repo/.git_keep/logs/refs/remotes/origin/master new file mode 100644 index 000000000..ade370956 --- /dev/null +++ b/test/integration/setUpstream/expected/repo/.git_keep/logs/refs/remotes/origin/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 ce3220d7b3cbc57811e3e6169349c611f62a7c42 CI 1650269559 +0200 fetch origin: storing head diff --git a/test/integration/setUpstream/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/setUpstream/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 new file mode 100644 index 000000000..7f2ebf4ee Binary files /dev/null and b/test/integration/setUpstream/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 differ diff --git a/test/integration/submoduleEnter/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/setUpstream/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/submoduleEnter/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/setUpstream/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/setUpstream/expected/repo/.git_keep/objects/27/58cffdc0d931ff3a3d6c58b75f91ec42981dcf b/test/integration/setUpstream/expected/repo/.git_keep/objects/27/58cffdc0d931ff3a3d6c58b75f91ec42981dcf new file mode 100644 index 000000000..099d02445 Binary files /dev/null and b/test/integration/setUpstream/expected/repo/.git_keep/objects/27/58cffdc0d931ff3a3d6c58b75f91ec42981dcf differ diff --git a/test/integration/setUpstream/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/setUpstream/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce new file mode 100644 index 000000000..0a734f981 Binary files /dev/null and b/test/integration/setUpstream/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce differ diff --git a/test/integration/setUpstream/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 b/test/integration/setUpstream/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 new file mode 100644 index 000000000..31ae3f5ba Binary files /dev/null and b/test/integration/setUpstream/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 differ diff --git a/test/integration/setUpstream/expected/repo/.git_keep/objects/6d/51185514ab4f80b42f17013295c261f92a66f0 b/test/integration/setUpstream/expected/repo/.git_keep/objects/6d/51185514ab4f80b42f17013295c261f92a66f0 new file mode 100644 index 000000000..d9b4d87b9 Binary files /dev/null and b/test/integration/setUpstream/expected/repo/.git_keep/objects/6d/51185514ab4f80b42f17013295c261f92a66f0 differ diff --git a/test/integration/setUpstream/expected/repo/.git_keep/objects/9c/663d29d26a71dd67e3bf7b1f2ea73f4939d9e0 b/test/integration/setUpstream/expected/repo/.git_keep/objects/9c/663d29d26a71dd67e3bf7b1f2ea73f4939d9e0 new file mode 100644 index 000000000..7965d6afb --- /dev/null +++ b/test/integration/setUpstream/expected/repo/.git_keep/objects/9c/663d29d26a71dd67e3bf7b1f2ea73f4939d9e0 @@ -0,0 +1,3 @@ +xŤÍA +Â0@Q×9Ĺ왉“i +"BW=FšL°Đ!R"čííÜ~üÜĚÖÄrę»* J®dFŤ…Y)J‰äŐľášrđ.˝űłí0Íp›ć‡~’˝6˝äfw če áŚŃőtý“;űÖuSr?2X,Ď \ No newline at end of file diff --git a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/setUpstream/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/modules/other_repo/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/setUpstream/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/setUpstream/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/setUpstream/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 new file mode 100644 index 000000000..96d2e71a6 Binary files /dev/null and b/test/integration/setUpstream/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 differ diff --git a/test/integration/setUpstream/expected/repo/.git_keep/objects/ce/3220d7b3cbc57811e3e6169349c611f62a7c42 b/test/integration/setUpstream/expected/repo/.git_keep/objects/ce/3220d7b3cbc57811e3e6169349c611f62a7c42 new file mode 100644 index 000000000..19012a4aa Binary files /dev/null and b/test/integration/setUpstream/expected/repo/.git_keep/objects/ce/3220d7b3cbc57811e3e6169349c611f62a7c42 differ diff --git a/test/integration/setUpstream/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/setUpstream/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 new file mode 100644 index 000000000..d39fa7d2f Binary files /dev/null and b/test/integration/setUpstream/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 differ diff --git a/test/integration/setUpstream/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/setUpstream/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b new file mode 100644 index 000000000..9b771fc2f Binary files /dev/null and b/test/integration/setUpstream/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b differ diff --git a/test/integration/setUpstream/expected/repo/.git_keep/refs/heads/master b/test/integration/setUpstream/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..0147cfa3f --- /dev/null +++ b/test/integration/setUpstream/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +6d51185514ab4f80b42f17013295c261f92a66f0 diff --git a/test/integration/setUpstream/expected/repo/.git_keep/refs/remotes/origin/master b/test/integration/setUpstream/expected/repo/.git_keep/refs/remotes/origin/master new file mode 100644 index 000000000..6e2a4de9b --- /dev/null +++ b/test/integration/setUpstream/expected/repo/.git_keep/refs/remotes/origin/master @@ -0,0 +1 @@ +ce3220d7b3cbc57811e3e6169349c611f62a7c42 diff --git a/test/integration/tags/expected/file1 b/test/integration/setUpstream/expected/repo/myfile1 similarity index 100% rename from test/integration/tags/expected/file1 rename to test/integration/setUpstream/expected/repo/myfile1 diff --git a/test/integration/submoduleReset/expected/myfile2 b/test/integration/setUpstream/expected/repo/myfile2 similarity index 100% rename from test/integration/submoduleReset/expected/myfile2 rename to test/integration/setUpstream/expected/repo/myfile2 diff --git a/test/integration/setUpstream/expected_remote/config b/test/integration/setUpstream/expected_remote/config deleted file mode 100644 index 1a0f699c7..000000000 --- a/test/integration/setUpstream/expected_remote/config +++ /dev/null @@ -1,8 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = true - ignorecase = true - precomposeunicode = true -[remote "origin"] - url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/setUpstream/./actual diff --git a/test/integration/setUpstream/expected_remote/objects/05/8c8904c25889dd77ee3e817325fd1a28134037 b/test/integration/setUpstream/expected_remote/objects/05/8c8904c25889dd77ee3e817325fd1a28134037 deleted file mode 100644 index ae34bb7c1..000000000 --- a/test/integration/setUpstream/expected_remote/objects/05/8c8904c25889dd77ee3e817325fd1a28134037 +++ /dev/null @@ -1,2 +0,0 @@ -xŤÎA -Â0@Q×9Eö‚$“é$"BW=Ƥ™`ÁŘR"čííÜ~ŢâĎkkK·žńÔwU+1 —«+Eµ2±×L€ě* 'łÉ®Żnc‰E|Etó,©@R©‘”B™Ă@y÷ÇşŰq˛×qşëGÚöÔËĽ¶›ő0qrěŮ{çĚQŹ©®rÓľuy*Ýś:< \ No newline at end of file diff --git a/test/integration/setUpstream/expected_remote/objects/14/8a38f7ce513079d6cd40e4a02f11e46ea2ba6b b/test/integration/setUpstream/expected_remote/objects/14/8a38f7ce513079d6cd40e4a02f11e46ea2ba6b deleted file mode 100644 index 9d94a934d..000000000 --- a/test/integration/setUpstream/expected_remote/objects/14/8a38f7ce513079d6cd40e4a02f11e46ea2ba6b +++ /dev/null @@ -1,3 +0,0 @@ -xŤÎA -0@Ń®sŠě e&™L& ĄŕĘcÄ8RÁT‘ÚŰ×#tűy‹_¶Z—f1ŃĄŞÖÍŚ‘ € /3ŇĚA˛¬‘ůPrHhö|č«Y‚4MŕÓ´¸Ŕ‘Łdu~ŚE” -ĄBAL~·çvŘ~°]?<ô“ëľę­lőn‘=IÎ^ĚYĎ©¦rSżó˛*™–ş8M \ No newline at end of file diff --git a/test/integration/setUpstream/expected_remote/objects/40/9dd039b9ec270067678ae23b710c8e4c49c458 b/test/integration/setUpstream/expected_remote/objects/40/9dd039b9ec270067678ae23b710c8e4c49c458 deleted file mode 100644 index fa4e2ebaa..000000000 --- a/test/integration/setUpstream/expected_remote/objects/40/9dd039b9ec270067678ae23b710c8e4c49c458 +++ /dev/null @@ -1,3 +0,0 @@ -xŤŽA -Ă E»öî Ĺq4ŽJ!«ĂŚ# Ä& ííëşúđx<>ďµ®MCt—vŠh»@@¦rq%9,%eŔB†iA°ěű˛¨#ťňjÚxbŠĆ±őD1çDP¨G¬/’%@g0¨ônĎýÔÓ¬Çi~Č'Őc“ďő®a@G‘L°ú -`Śę´źjň§®ę·¬› úŔÚ9ö \ No newline at end of file diff --git a/test/integration/setUpstream/expected_remote/objects/7d/7da1f440cca8d28eaf4b46e63f207993562b84 b/test/integration/setUpstream/expected_remote/objects/7d/7da1f440cca8d28eaf4b46e63f207993562b84 deleted file mode 100644 index 54afb1c5a..000000000 --- a/test/integration/setUpstream/expected_remote/objects/7d/7da1f440cca8d28eaf4b46e63f207993562b84 +++ /dev/null @@ -1,3 +0,0 @@ -xŤÍA -Â0@Q×9Ĺěɤăd -"BW=Ć4™`ˇ!R"čííÜ~üÔj]; ń©ďfŕŤSńĘKM2‘ˇp Š%ŇBCf*š®Áé»?ŰÓ ·i~ŘGëkłKjőČÉ(>8#zďŽzLşýÉ]ý–u3t?4A,Ů \ No newline at end of file diff --git a/test/integration/setUpstream/expected_remote/packed-refs b/test/integration/setUpstream/expected_remote/packed-refs deleted file mode 100644 index a5eca4e4d..000000000 --- a/test/integration/setUpstream/expected_remote/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# pack-refs with: peeled fully-peeled sorted -148a38f7ce513079d6cd40e4a02f11e46ea2ba6b refs/heads/master diff --git a/test/integration/setUpstream/recording.json b/test/integration/setUpstream/recording.json index d4983d00b..a84937cc7 100644 --- a/test/integration/setUpstream/recording.json +++ b/test/integration/setUpstream/recording.json @@ -1 +1 @@ -{"KeyEvents":[{"Timestamp":555,"Mod":0,"Key":259,"Ch":0},{"Timestamp":1226,"Mod":0,"Key":256,"Ch":93},{"Timestamp":1731,"Mod":0,"Key":256,"Ch":110},{"Timestamp":1971,"Mod":0,"Key":256,"Ch":111},{"Timestamp":2131,"Mod":0,"Key":256,"Ch":114},{"Timestamp":2219,"Mod":0,"Key":256,"Ch":105},{"Timestamp":2274,"Mod":0,"Key":256,"Ch":103},{"Timestamp":2338,"Mod":0,"Key":256,"Ch":105},{"Timestamp":2418,"Mod":0,"Key":256,"Ch":110},{"Timestamp":2843,"Mod":0,"Key":13,"Ch":13},{"Timestamp":3379,"Mod":0,"Key":256,"Ch":46},{"Timestamp":3522,"Mod":0,"Key":256,"Ch":46},{"Timestamp":3690,"Mod":0,"Key":256,"Ch":47},{"Timestamp":3947,"Mod":0,"Key":256,"Ch":97},{"Timestamp":4105,"Mod":0,"Key":256,"Ch":99},{"Timestamp":4266,"Mod":0,"Key":256,"Ch":116},{"Timestamp":4338,"Mod":0,"Key":256,"Ch":117},{"Timestamp":4442,"Mod":0,"Key":256,"Ch":97},{"Timestamp":4530,"Mod":0,"Key":256,"Ch":108},{"Timestamp":4731,"Mod":0,"Key":256,"Ch":95},{"Timestamp":4915,"Mod":0,"Key":256,"Ch":114},{"Timestamp":4962,"Mod":0,"Key":256,"Ch":101},{"Timestamp":5041,"Mod":0,"Key":256,"Ch":109},{"Timestamp":5090,"Mod":0,"Key":256,"Ch":111},{"Timestamp":5146,"Mod":0,"Key":256,"Ch":116},{"Timestamp":5170,"Mod":0,"Key":256,"Ch":101},{"Timestamp":5443,"Mod":0,"Key":13,"Ch":13},{"Timestamp":6313,"Mod":0,"Key":256,"Ch":102},{"Timestamp":7171,"Mod":0,"Key":13,"Ch":13},{"Timestamp":7883,"Mod":0,"Key":256,"Ch":117},{"Timestamp":8459,"Mod":0,"Key":13,"Ch":13},{"Timestamp":9411,"Mod":0,"Key":256,"Ch":112},{"Timestamp":10298,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":272,"Height":74}]} \ No newline at end of file +{"KeyEvents":[{"Timestamp":558,"Mod":0,"Key":256,"Ch":108},{"Timestamp":992,"Mod":0,"Key":256,"Ch":93},{"Timestamp":1583,"Mod":0,"Key":256,"Ch":110},{"Timestamp":2109,"Mod":0,"Key":256,"Ch":111},{"Timestamp":2232,"Mod":0,"Key":256,"Ch":114},{"Timestamp":2278,"Mod":0,"Key":256,"Ch":105},{"Timestamp":2413,"Mod":0,"Key":256,"Ch":103},{"Timestamp":2478,"Mod":0,"Key":256,"Ch":105},{"Timestamp":2538,"Mod":0,"Key":256,"Ch":110},{"Timestamp":2831,"Mod":0,"Key":13,"Ch":13},{"Timestamp":3060,"Mod":0,"Key":256,"Ch":46},{"Timestamp":3234,"Mod":0,"Key":256,"Ch":46},{"Timestamp":3293,"Mod":0,"Key":256,"Ch":47},{"Timestamp":3454,"Mod":0,"Key":256,"Ch":111},{"Timestamp":3594,"Mod":0,"Key":256,"Ch":114},{"Timestamp":3632,"Mod":0,"Key":256,"Ch":105},{"Timestamp":3780,"Mod":0,"Key":256,"Ch":103},{"Timestamp":3831,"Mod":0,"Key":256,"Ch":105},{"Timestamp":3890,"Mod":0,"Key":256,"Ch":110},{"Timestamp":4150,"Mod":0,"Key":13,"Ch":13},{"Timestamp":4695,"Mod":0,"Key":256,"Ch":102},{"Timestamp":5433,"Mod":0,"Key":256,"Ch":91},{"Timestamp":6106,"Mod":0,"Key":256,"Ch":117},{"Timestamp":6884,"Mod":0,"Key":256,"Ch":115},{"Timestamp":7833,"Mod":0,"Key":9,"Ch":9},{"Timestamp":8301,"Mod":0,"Key":13,"Ch":13},{"Timestamp":9114,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":239,"Height":55}]} \ No newline at end of file diff --git a/test/integration/setUpstream/setup.sh b/test/integration/setUpstream/setup.sh index a5a68834a..d0bc91327 100644 --- a/test/integration/setUpstream/setup.sh +++ b/test/integration/setUpstream/setup.sh @@ -25,8 +25,8 @@ git add . git commit -am "myfile4" cd .. -git clone --bare ./actual actual_remote +git clone --bare ./repo origin -cd actual +cd repo git reset --hard HEAD~2 diff --git a/test/integration/undo2/expected/.git_keep/HEAD b/test/integration/setUpstreamThroughPush/expected/origin/HEAD similarity index 100% rename from test/integration/undo2/expected/.git_keep/HEAD rename to test/integration/setUpstreamThroughPush/expected/origin/HEAD diff --git a/test/integration/setUpstreamThroughPush/expected/origin/config b/test/integration/setUpstreamThroughPush/expected/origin/config new file mode 100644 index 000000000..63958f045 --- /dev/null +++ b/test/integration/setUpstreamThroughPush/expected/origin/config @@ -0,0 +1,8 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/setUpstream/actual/./repo diff --git a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/description b/test/integration/setUpstreamThroughPush/expected/origin/description similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/modules/other_repo/description rename to test/integration/setUpstreamThroughPush/expected/origin/description diff --git a/test/integration/stashPop/expected/.git_keep/info/exclude b/test/integration/setUpstreamThroughPush/expected/origin/info/exclude similarity index 100% rename from test/integration/stashPop/expected/.git_keep/info/exclude rename to test/integration/setUpstreamThroughPush/expected/origin/info/exclude diff --git a/test/integration/setUpstreamThroughPush/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/setUpstreamThroughPush/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 new file mode 100644 index 000000000..7f2ebf4ee Binary files /dev/null and b/test/integration/setUpstreamThroughPush/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 differ diff --git a/test/integration/submoduleRemove/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/setUpstreamThroughPush/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/submoduleRemove/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/setUpstreamThroughPush/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/setUpstreamThroughPush/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/setUpstreamThroughPush/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce new file mode 100644 index 000000000..0a734f981 Binary files /dev/null and b/test/integration/setUpstreamThroughPush/expected/origin/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce differ diff --git a/test/integration/setUpstreamThroughPush/expected/origin/objects/2f/6174050380438f14b16658a356e762435ca591 b/test/integration/setUpstreamThroughPush/expected/origin/objects/2f/6174050380438f14b16658a356e762435ca591 new file mode 100644 index 000000000..31ae3f5ba Binary files /dev/null and b/test/integration/setUpstreamThroughPush/expected/origin/objects/2f/6174050380438f14b16658a356e762435ca591 differ diff --git a/test/integration/setUpstreamThroughPush/expected/origin/objects/30/ef3df33d31f0b98298881be4dbe69c54758ba2 b/test/integration/setUpstreamThroughPush/expected/origin/objects/30/ef3df33d31f0b98298881be4dbe69c54758ba2 new file mode 100644 index 000000000..a6fdc2a4b Binary files /dev/null and b/test/integration/setUpstreamThroughPush/expected/origin/objects/30/ef3df33d31f0b98298881be4dbe69c54758ba2 differ diff --git a/test/integration/setUpstreamThroughPush/expected/origin/objects/63/05259d1908bee46b3b686702ed55b6f12e9ba2 b/test/integration/setUpstreamThroughPush/expected/origin/objects/63/05259d1908bee46b3b686702ed55b6f12e9ba2 new file mode 100644 index 000000000..30dddbf70 --- /dev/null +++ b/test/integration/setUpstreamThroughPush/expected/origin/objects/63/05259d1908bee46b3b686702ed55b6f12e9ba2 @@ -0,0 +1,2 @@ +xŤÍA +Â0@Q×9ĹěÉ$Óiˇ«cšL°Đ!R"čííÜ~üÜĚÖH|ę»*xĺ\˝đ2^5"ĹÄ%a¬#- S•<'ďţl;L3ܦůˇ±×¦—ÜěČ”"q"ś˝wG=&]˙äÎľuÝÝ27,Í \ No newline at end of file diff --git a/test/integration/setUpstreamThroughPush/expected/origin/objects/a2/6a9d22097eb77a8cf2fbb18512aa44c0c536a2 b/test/integration/setUpstreamThroughPush/expected/origin/objects/a2/6a9d22097eb77a8cf2fbb18512aa44c0c536a2 new file mode 100644 index 000000000..e17ab2106 --- /dev/null +++ b/test/integration/setUpstreamThroughPush/expected/origin/objects/a2/6a9d22097eb77a8cf2fbb18512aa44c0c536a2 @@ -0,0 +1,4 @@ +xŤÎA +Â0@Q×9ĹěÉL’iD„®zڤ™`ÁŘR"čííÜ~ŢâĎkkKę»*¤ÁyLAŞ-Eµ +‹˛ÔĚŽ#1˘l+ydłĄ]_ŘŮ@A +ŠŤYŐsv™#–´„ą"©äD&˝űcÝaśŕ:Nwý¤¶=ő2ŻíČ>:Ďś­5G=¦şţÉMűÖĺ©d~”Ë9É \ No newline at end of file diff --git a/test/integration/submoduleReset/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/setUpstreamThroughPush/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/setUpstreamThroughPush/expected/origin/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/setUpstreamThroughPush/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/setUpstreamThroughPush/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 new file mode 100644 index 000000000..96d2e71a6 Binary files /dev/null and b/test/integration/setUpstreamThroughPush/expected/origin/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 differ diff --git a/test/integration/setUpstreamThroughPush/expected/origin/objects/c6/ffcbed8902934d462722ff6ef471813b9a4df5 b/test/integration/setUpstreamThroughPush/expected/origin/objects/c6/ffcbed8902934d462722ff6ef471813b9a4df5 new file mode 100644 index 000000000..714f1dd9d Binary files /dev/null and b/test/integration/setUpstreamThroughPush/expected/origin/objects/c6/ffcbed8902934d462722ff6ef471813b9a4df5 differ diff --git a/test/integration/setUpstreamThroughPush/expected/origin/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/setUpstreamThroughPush/expected/origin/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 new file mode 100644 index 000000000..d39fa7d2f Binary files /dev/null and b/test/integration/setUpstreamThroughPush/expected/origin/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 differ diff --git a/test/integration/setUpstreamThroughPush/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/setUpstreamThroughPush/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b new file mode 100644 index 000000000..9b771fc2f Binary files /dev/null and b/test/integration/setUpstreamThroughPush/expected/origin/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b differ diff --git a/test/integration/setUpstreamThroughPush/expected/origin/packed-refs b/test/integration/setUpstreamThroughPush/expected/origin/packed-refs new file mode 100644 index 000000000..300d293d2 --- /dev/null +++ b/test/integration/setUpstreamThroughPush/expected/origin/packed-refs @@ -0,0 +1,2 @@ +# pack-refs with: peeled fully-peeled sorted +30ef3df33d31f0b98298881be4dbe69c54758ba2 refs/heads/master diff --git a/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/COMMIT_EDITMSG b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/COMMIT_EDITMSG new file mode 100644 index 000000000..51be8ec3d --- /dev/null +++ b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/COMMIT_EDITMSG @@ -0,0 +1 @@ +myfile4 diff --git a/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/FETCH_HEAD b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/FETCH_HEAD new file mode 100644 index 000000000..125d82b6f --- /dev/null +++ b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/FETCH_HEAD @@ -0,0 +1 @@ +30ef3df33d31f0b98298881be4dbe69c54758ba2 branch 'master' of ../origin diff --git a/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/HEAD b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/ORIG_HEAD b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/ORIG_HEAD new file mode 100644 index 000000000..0b53f05ce --- /dev/null +++ b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/ORIG_HEAD @@ -0,0 +1 @@ +a26a9d22097eb77a8cf2fbb18512aa44c0c536a2 diff --git a/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/config b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/config new file mode 100644 index 000000000..7721ae814 --- /dev/null +++ b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/config @@ -0,0 +1,16 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[user] + email = CI@example.com + name = CI +[remote "origin"] + url = ../origin + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "master"] + remote = origin + merge = refs/heads/master diff --git a/test/integration/switchTabFromMenu/expected/.git_keep/description b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/description similarity index 100% rename from test/integration/switchTabFromMenu/expected/.git_keep/description rename to test/integration/setUpstreamThroughPush/expected/repo/.git_keep/description diff --git a/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/index b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/index new file mode 100644 index 000000000..99e8224eb Binary files /dev/null and b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/index differ diff --git a/test/integration/stash_Copy/expected/.git_keep/info/exclude b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/stash_Copy/expected/.git_keep/info/exclude rename to test/integration/setUpstreamThroughPush/expected/repo/.git_keep/info/exclude diff --git a/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/logs/HEAD b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..aba248ca8 --- /dev/null +++ b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,7 @@ +0000000000000000000000000000000000000000 6305259d1908bee46b3b686702ed55b6f12e9ba2 CI 1648346253 +1100 commit (initial): myfile1 +6305259d1908bee46b3b686702ed55b6f12e9ba2 a26a9d22097eb77a8cf2fbb18512aa44c0c536a2 CI 1648346253 +1100 commit: myfile2 +a26a9d22097eb77a8cf2fbb18512aa44c0c536a2 c6ffcbed8902934d462722ff6ef471813b9a4df5 CI 1648346253 +1100 commit: myfile3 +c6ffcbed8902934d462722ff6ef471813b9a4df5 30ef3df33d31f0b98298881be4dbe69c54758ba2 CI 1648346253 +1100 commit: myfile4 +30ef3df33d31f0b98298881be4dbe69c54758ba2 a26a9d22097eb77a8cf2fbb18512aa44c0c536a2 CI 1648346253 +1100 reset: moving to HEAD~2 +a26a9d22097eb77a8cf2fbb18512aa44c0c536a2 30ef3df33d31f0b98298881be4dbe69c54758ba2 CI 1648346262 +1100 rebase -i (start): checkout 30ef3df33d31f0b98298881be4dbe69c54758ba2 +30ef3df33d31f0b98298881be4dbe69c54758ba2 30ef3df33d31f0b98298881be4dbe69c54758ba2 CI 1648346262 +1100 rebase -i (finish): returning to refs/heads/master diff --git a/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..e0e98143e --- /dev/null +++ b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,6 @@ +0000000000000000000000000000000000000000 6305259d1908bee46b3b686702ed55b6f12e9ba2 CI 1648346253 +1100 commit (initial): myfile1 +6305259d1908bee46b3b686702ed55b6f12e9ba2 a26a9d22097eb77a8cf2fbb18512aa44c0c536a2 CI 1648346253 +1100 commit: myfile2 +a26a9d22097eb77a8cf2fbb18512aa44c0c536a2 c6ffcbed8902934d462722ff6ef471813b9a4df5 CI 1648346253 +1100 commit: myfile3 +c6ffcbed8902934d462722ff6ef471813b9a4df5 30ef3df33d31f0b98298881be4dbe69c54758ba2 CI 1648346253 +1100 commit: myfile4 +30ef3df33d31f0b98298881be4dbe69c54758ba2 a26a9d22097eb77a8cf2fbb18512aa44c0c536a2 CI 1648346253 +1100 reset: moving to HEAD~2 +a26a9d22097eb77a8cf2fbb18512aa44c0c536a2 30ef3df33d31f0b98298881be4dbe69c54758ba2 CI 1648346262 +1100 rebase -i (finish): refs/heads/master onto 30ef3df33d31f0b98298881be4dbe69c54758ba2 diff --git a/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/logs/refs/remotes/origin/master b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/logs/refs/remotes/origin/master new file mode 100644 index 000000000..774c65ed0 --- /dev/null +++ b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/logs/refs/remotes/origin/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 30ef3df33d31f0b98298881be4dbe69c54758ba2 CI 1648346260 +1100 fetch origin: storing head diff --git a/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 new file mode 100644 index 000000000..7f2ebf4ee Binary files /dev/null and b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 differ diff --git a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/modules/other_repo/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce new file mode 100644 index 000000000..0a734f981 Binary files /dev/null and b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce differ diff --git a/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 new file mode 100644 index 000000000..31ae3f5ba Binary files /dev/null and b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 differ diff --git a/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/30/ef3df33d31f0b98298881be4dbe69c54758ba2 b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/30/ef3df33d31f0b98298881be4dbe69c54758ba2 new file mode 100644 index 000000000..a6fdc2a4b Binary files /dev/null and b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/30/ef3df33d31f0b98298881be4dbe69c54758ba2 differ diff --git a/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/63/05259d1908bee46b3b686702ed55b6f12e9ba2 b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/63/05259d1908bee46b3b686702ed55b6f12e9ba2 new file mode 100644 index 000000000..30dddbf70 --- /dev/null +++ b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/63/05259d1908bee46b3b686702ed55b6f12e9ba2 @@ -0,0 +1,2 @@ +xŤÍA +Â0@Q×9ĹěÉ$Óiˇ«cšL°Đ!R"čííÜ~üÜĚÖH|ę»*xĺ\˝đ2^5"ĹÄ%a¬#- S•<'ďţl;L3ܦůˇ±×¦—ÜěČ”"q"ś˝wG=&]˙äÎľuÝÝ27,Í \ No newline at end of file diff --git a/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/a2/6a9d22097eb77a8cf2fbb18512aa44c0c536a2 b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/a2/6a9d22097eb77a8cf2fbb18512aa44c0c536a2 new file mode 100644 index 000000000..e17ab2106 --- /dev/null +++ b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/a2/6a9d22097eb77a8cf2fbb18512aa44c0c536a2 @@ -0,0 +1,4 @@ +xŤÎA +Â0@Q×9ĹěÉL’iD„®zڤ™`ÁŘR"čííÜ~ŢâĎkkKę»*¤ÁyLAŞ-Eµ +‹˛ÔĚŽ#1˘l+ydłĄ]_ŘŮ@A +ŠŤYŐsv™#–´„ą"©äD&˝űcÝaśŕ:Nwý¤¶=ő2ŻíČ>:Ďś­5G=¦şţÉMűÖĺ©d~”Ë9É \ No newline at end of file diff --git a/test/integration/tags/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/tags/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 new file mode 100644 index 000000000..96d2e71a6 Binary files /dev/null and b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 differ diff --git a/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/c6/ffcbed8902934d462722ff6ef471813b9a4df5 b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/c6/ffcbed8902934d462722ff6ef471813b9a4df5 new file mode 100644 index 000000000..714f1dd9d Binary files /dev/null and b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/c6/ffcbed8902934d462722ff6ef471813b9a4df5 differ diff --git a/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 new file mode 100644 index 000000000..d39fa7d2f Binary files /dev/null and b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 differ diff --git a/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b new file mode 100644 index 000000000..9b771fc2f Binary files /dev/null and b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b differ diff --git a/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/refs/heads/master b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..af1728373 --- /dev/null +++ b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +30ef3df33d31f0b98298881be4dbe69c54758ba2 diff --git a/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/refs/remotes/origin/master b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/refs/remotes/origin/master new file mode 100644 index 000000000..af1728373 --- /dev/null +++ b/test/integration/setUpstreamThroughPush/expected/repo/.git_keep/refs/remotes/origin/master @@ -0,0 +1 @@ +30ef3df33d31f0b98298881be4dbe69c54758ba2 diff --git a/test/integration/tags2/expected/file1 b/test/integration/setUpstreamThroughPush/expected/repo/myfile1 similarity index 100% rename from test/integration/tags2/expected/file1 rename to test/integration/setUpstreamThroughPush/expected/repo/myfile1 diff --git a/test/integration/submoduleReset/expected/other_repo/myfile2 b/test/integration/setUpstreamThroughPush/expected/repo/myfile2 similarity index 100% rename from test/integration/submoduleReset/expected/other_repo/myfile2 rename to test/integration/setUpstreamThroughPush/expected/repo/myfile2 diff --git a/test/integration/setUpstreamThroughPush/expected/repo/myfile3 b/test/integration/setUpstreamThroughPush/expected/repo/myfile3 new file mode 100644 index 000000000..df6b0d2bc --- /dev/null +++ b/test/integration/setUpstreamThroughPush/expected/repo/myfile3 @@ -0,0 +1 @@ +test3 diff --git a/test/integration/setUpstreamThroughPush/expected/repo/myfile4 b/test/integration/setUpstreamThroughPush/expected/repo/myfile4 new file mode 100644 index 000000000..d234c5e05 --- /dev/null +++ b/test/integration/setUpstreamThroughPush/expected/repo/myfile4 @@ -0,0 +1 @@ +test4 diff --git a/test/integration/setUpstreamThroughPush/recording.json b/test/integration/setUpstreamThroughPush/recording.json new file mode 100644 index 000000000..8776559d9 --- /dev/null +++ b/test/integration/setUpstreamThroughPush/recording.json @@ -0,0 +1 @@ +{"KeyEvents":[{"Timestamp":808,"Mod":0,"Key":259,"Ch":0},{"Timestamp":1221,"Mod":0,"Key":256,"Ch":93},{"Timestamp":1598,"Mod":0,"Key":256,"Ch":110},{"Timestamp":2267,"Mod":0,"Key":256,"Ch":111},{"Timestamp":2399,"Mod":0,"Key":256,"Ch":114},{"Timestamp":2500,"Mod":0,"Key":256,"Ch":105},{"Timestamp":2573,"Mod":0,"Key":256,"Ch":103},{"Timestamp":2634,"Mod":0,"Key":256,"Ch":105},{"Timestamp":2710,"Mod":0,"Key":256,"Ch":110},{"Timestamp":3042,"Mod":0,"Key":13,"Ch":13},{"Timestamp":3671,"Mod":0,"Key":256,"Ch":46},{"Timestamp":4001,"Mod":0,"Key":256,"Ch":46},{"Timestamp":4215,"Mod":0,"Key":256,"Ch":47},{"Timestamp":4511,"Mod":0,"Key":256,"Ch":111},{"Timestamp":4896,"Mod":0,"Key":256,"Ch":114},{"Timestamp":5008,"Mod":0,"Key":256,"Ch":105},{"Timestamp":5133,"Mod":0,"Key":256,"Ch":103},{"Timestamp":5202,"Mod":0,"Key":256,"Ch":105},{"Timestamp":5255,"Mod":0,"Key":256,"Ch":110},{"Timestamp":5558,"Mod":0,"Key":13,"Ch":13},{"Timestamp":6247,"Mod":0,"Key":256,"Ch":102},{"Timestamp":7072,"Mod":0,"Key":256,"Ch":91},{"Timestamp":7716,"Mod":0,"Key":256,"Ch":112},{"Timestamp":8319,"Mod":0,"Key":13,"Ch":13},{"Timestamp":9159,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":254,"Height":74}]} \ No newline at end of file diff --git a/test/integration/setUpstreamThroughPush/setup.sh b/test/integration/setUpstreamThroughPush/setup.sh new file mode 100644 index 000000000..d0bc91327 --- /dev/null +++ b/test/integration/setUpstreamThroughPush/setup.sh @@ -0,0 +1,32 @@ +#!/bin/sh + +set -e + +set -e + +cd $1 + +git init + +git config user.email "CI@example.com" +git config user.name "CI" + +echo test1 > myfile1 +git add . +git commit -am "myfile1" +echo test2 > myfile2 +git add . +git commit -am "myfile2" +echo test3 > myfile3 +git add . +git commit -am "myfile3" +echo test4 > myfile4 +git add . +git commit -am "myfile4" + +cd .. +git clone --bare ./repo origin + +cd repo + +git reset --hard HEAD~2 diff --git a/test/integration/setUpstreamThroughPush/test.json b/test/integration/setUpstreamThroughPush/test.json new file mode 100644 index 000000000..11fdee3ab --- /dev/null +++ b/test/integration/setUpstreamThroughPush/test.json @@ -0,0 +1 @@ +{ "description": "allow setting the upstream of the current branch when pushing", "speed": 10 } diff --git a/test/integration/squash/expected/.git_keep/COMMIT_EDITMSG b/test/integration/squash/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/squash/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/squash/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/stashPop/expected/.git_keep/FETCH_HEAD b/test/integration/squash/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/stashPop/expected/.git_keep/FETCH_HEAD rename to test/integration/squash/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/squash/expected/repo/.git_keep/HEAD b/test/integration/squash/expected/repo/.git_keep/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/test/integration/squash/expected/repo/.git_keep/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/test/integration/squash/expected/.git_keep/ORIG_HEAD b/test/integration/squash/expected/repo/.git_keep/ORIG_HEAD similarity index 100% rename from test/integration/squash/expected/.git_keep/ORIG_HEAD rename to test/integration/squash/expected/repo/.git_keep/ORIG_HEAD diff --git a/test/integration/stagingTwo/expected/.git_keep/config b/test/integration/squash/expected/repo/.git_keep/config similarity index 100% rename from test/integration/stagingTwo/expected/.git_keep/config rename to test/integration/squash/expected/repo/.git_keep/config diff --git a/test/integration/tags/expected/.git_keep/description b/test/integration/squash/expected/repo/.git_keep/description similarity index 100% rename from test/integration/tags/expected/.git_keep/description rename to test/integration/squash/expected/repo/.git_keep/description diff --git a/test/integration/squash/expected/.git_keep/index b/test/integration/squash/expected/repo/.git_keep/index similarity index 100% rename from test/integration/squash/expected/.git_keep/index rename to test/integration/squash/expected/repo/.git_keep/index diff --git a/test/integration/submoduleAdd/expected/.git_keep/info/exclude b/test/integration/squash/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/submoduleAdd/expected/.git_keep/info/exclude rename to test/integration/squash/expected/repo/.git_keep/info/exclude diff --git a/test/integration/squash/expected/.git_keep/logs/HEAD b/test/integration/squash/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/squash/expected/.git_keep/logs/HEAD rename to test/integration/squash/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/squash/expected/.git_keep/logs/refs/heads/master b/test/integration/squash/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/squash/expected/.git_keep/logs/refs/heads/master rename to test/integration/squash/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/squash/expected/.git_keep/objects/07/5bd21694c75fd12e11cbd487eb64d831362e8c b/test/integration/squash/expected/repo/.git_keep/objects/07/5bd21694c75fd12e11cbd487eb64d831362e8c similarity index 100% rename from test/integration/squash/expected/.git_keep/objects/07/5bd21694c75fd12e11cbd487eb64d831362e8c rename to test/integration/squash/expected/repo/.git_keep/objects/07/5bd21694c75fd12e11cbd487eb64d831362e8c diff --git a/test/integration/squash/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/squash/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 new file mode 100644 index 000000000..7f2ebf4ee Binary files /dev/null and b/test/integration/squash/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 differ diff --git a/test/integration/submoduleReset/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/squash/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/squash/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/squash/expected/.git_keep/objects/1b/838df93e188ddacfce91d03dfcf1386ca57714 b/test/integration/squash/expected/repo/.git_keep/objects/1b/838df93e188ddacfce91d03dfcf1386ca57714 similarity index 100% rename from test/integration/squash/expected/.git_keep/objects/1b/838df93e188ddacfce91d03dfcf1386ca57714 rename to test/integration/squash/expected/repo/.git_keep/objects/1b/838df93e188ddacfce91d03dfcf1386ca57714 diff --git a/test/integration/squash/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce b/test/integration/squash/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce new file mode 100644 index 000000000..0a734f981 Binary files /dev/null and b/test/integration/squash/expected/repo/.git_keep/objects/2b/173c861df433fa43ffad13f80c8b312c5c8bce differ diff --git a/test/integration/squash/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 b/test/integration/squash/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 new file mode 100644 index 000000000..31ae3f5ba Binary files /dev/null and b/test/integration/squash/expected/repo/.git_keep/objects/2f/6174050380438f14b16658a356e762435ca591 differ diff --git a/test/integration/squash/expected/.git_keep/objects/30/a1ca3481fdec3245b02aeacfb72ddfe2a433be b/test/integration/squash/expected/repo/.git_keep/objects/30/a1ca3481fdec3245b02aeacfb72ddfe2a433be similarity index 100% rename from test/integration/squash/expected/.git_keep/objects/30/a1ca3481fdec3245b02aeacfb72ddfe2a433be rename to test/integration/squash/expected/repo/.git_keep/objects/30/a1ca3481fdec3245b02aeacfb72ddfe2a433be diff --git a/test/integration/squash/expected/.git_keep/objects/3c/752371dc0c58af7ff63f7a6c252da9f4d96251 b/test/integration/squash/expected/repo/.git_keep/objects/3c/752371dc0c58af7ff63f7a6c252da9f4d96251 similarity index 100% rename from test/integration/squash/expected/.git_keep/objects/3c/752371dc0c58af7ff63f7a6c252da9f4d96251 rename to test/integration/squash/expected/repo/.git_keep/objects/3c/752371dc0c58af7ff63f7a6c252da9f4d96251 diff --git a/test/integration/squash/expected/repo/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f b/test/integration/squash/expected/repo/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f new file mode 100644 index 000000000..953241815 Binary files /dev/null and b/test/integration/squash/expected/repo/.git_keep/objects/4f/346f1ad5ba2917da2109e2eaa2f2dfbb86f10f differ diff --git a/test/integration/squash/expected/.git_keep/objects/88/fb48b35f6ece4da3ad62dd3426bca0240d63a5 b/test/integration/squash/expected/repo/.git_keep/objects/88/fb48b35f6ece4da3ad62dd3426bca0240d63a5 similarity index 100% rename from test/integration/squash/expected/.git_keep/objects/88/fb48b35f6ece4da3ad62dd3426bca0240d63a5 rename to test/integration/squash/expected/repo/.git_keep/objects/88/fb48b35f6ece4da3ad62dd3426bca0240d63a5 diff --git a/test/integration/squash/expected/.git_keep/objects/9f/83377e9068d956fe3085934bb32ce22aeb4bf7 b/test/integration/squash/expected/repo/.git_keep/objects/9f/83377e9068d956fe3085934bb32ce22aeb4bf7 similarity index 100% rename from test/integration/squash/expected/.git_keep/objects/9f/83377e9068d956fe3085934bb32ce22aeb4bf7 rename to test/integration/squash/expected/repo/.git_keep/objects/9f/83377e9068d956fe3085934bb32ce22aeb4bf7 diff --git a/test/integration/squash/expected/.git_keep/objects/a1/cf7798606057d592f8ef1bee884165b6f629f1 b/test/integration/squash/expected/repo/.git_keep/objects/a1/cf7798606057d592f8ef1bee884165b6f629f1 similarity index 100% rename from test/integration/squash/expected/.git_keep/objects/a1/cf7798606057d592f8ef1bee884165b6f629f1 rename to test/integration/squash/expected/repo/.git_keep/objects/a1/cf7798606057d592f8ef1bee884165b6f629f1 diff --git a/test/integration/squash/expected/.git_keep/objects/a5/9b3d4800dcbf39ab31887402dc178e7b7f82a5 b/test/integration/squash/expected/repo/.git_keep/objects/a5/9b3d4800dcbf39ab31887402dc178e7b7f82a5 similarity index 100% rename from test/integration/squash/expected/.git_keep/objects/a5/9b3d4800dcbf39ab31887402dc178e7b7f82a5 rename to test/integration/squash/expected/repo/.git_keep/objects/a5/9b3d4800dcbf39ab31887402dc178e7b7f82a5 diff --git a/test/integration/tags2/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/squash/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/tags2/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/squash/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/squash/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/squash/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 new file mode 100644 index 000000000..96d2e71a6 Binary files /dev/null and b/test/integration/squash/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 differ diff --git a/test/integration/squash/expected/.git_keep/objects/c5/9791a0d43d3e0a7ed0a40a62b7929acf675bf0 b/test/integration/squash/expected/repo/.git_keep/objects/c5/9791a0d43d3e0a7ed0a40a62b7929acf675bf0 similarity index 100% rename from test/integration/squash/expected/.git_keep/objects/c5/9791a0d43d3e0a7ed0a40a62b7929acf675bf0 rename to test/integration/squash/expected/repo/.git_keep/objects/c5/9791a0d43d3e0a7ed0a40a62b7929acf675bf0 diff --git a/test/integration/squash/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 b/test/integration/squash/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 new file mode 100644 index 000000000..d39fa7d2f Binary files /dev/null and b/test/integration/squash/expected/repo/.git_keep/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 differ diff --git a/test/integration/squash/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/squash/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b new file mode 100644 index 000000000..9b771fc2f Binary files /dev/null and b/test/integration/squash/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b differ diff --git a/test/integration/squash/expected/.git_keep/refs/heads/master b/test/integration/squash/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/squash/expected/.git_keep/refs/heads/master rename to test/integration/squash/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/tags3/expected/file1 b/test/integration/squash/expected/repo/myfile1 similarity index 100% rename from test/integration/tags3/expected/file1 rename to test/integration/squash/expected/repo/myfile1 diff --git a/test/integration/reflogHardReset/expected/file2 b/test/integration/squash/expected/repo/myfile2 similarity index 100% rename from test/integration/reflogHardReset/expected/file2 rename to test/integration/squash/expected/repo/myfile2 diff --git a/test/integration/squash/expected/repo/myfile3 b/test/integration/squash/expected/repo/myfile3 new file mode 100644 index 000000000..df6b0d2bc --- /dev/null +++ b/test/integration/squash/expected/repo/myfile3 @@ -0,0 +1 @@ +test3 diff --git a/test/integration/squash/expected/myfile5 b/test/integration/squash/expected/repo/myfile5 similarity index 100% rename from test/integration/squash/expected/myfile5 rename to test/integration/squash/expected/repo/myfile5 diff --git a/test/integration/staginWithDiffContextChange/expected/.git_keep/COMMIT_EDITMSG b/test/integration/staginWithDiffContextChange/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/staginWithDiffContextChange/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/staginWithDiffContextChange/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/stash_Copy/expected/.git_keep/FETCH_HEAD b/test/integration/staginWithDiffContextChange/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/stash_Copy/expected/.git_keep/FETCH_HEAD rename to test/integration/staginWithDiffContextChange/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/staginWithDiffContextChange/expected/repo/.git_keep/HEAD b/test/integration/staginWithDiffContextChange/expected/repo/.git_keep/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/test/integration/staginWithDiffContextChange/expected/repo/.git_keep/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/test/integration/stash/expected/.git_keep/config b/test/integration/staginWithDiffContextChange/expected/repo/.git_keep/config similarity index 100% rename from test/integration/stash/expected/.git_keep/config rename to test/integration/staginWithDiffContextChange/expected/repo/.git_keep/config diff --git a/test/integration/tags2/expected/.git_keep/description b/test/integration/staginWithDiffContextChange/expected/repo/.git_keep/description similarity index 100% rename from test/integration/tags2/expected/.git_keep/description rename to test/integration/staginWithDiffContextChange/expected/repo/.git_keep/description diff --git a/test/integration/staginWithDiffContextChange/expected/.git_keep/index b/test/integration/staginWithDiffContextChange/expected/repo/.git_keep/index similarity index 100% rename from test/integration/staginWithDiffContextChange/expected/.git_keep/index rename to test/integration/staginWithDiffContextChange/expected/repo/.git_keep/index diff --git a/test/integration/submoduleAdd/expected/.git_keep/modules/blah/info/exclude b/test/integration/staginWithDiffContextChange/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/submoduleAdd/expected/.git_keep/modules/blah/info/exclude rename to test/integration/staginWithDiffContextChange/expected/repo/.git_keep/info/exclude diff --git a/test/integration/staginWithDiffContextChange/expected/.git_keep/logs/HEAD b/test/integration/staginWithDiffContextChange/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/staginWithDiffContextChange/expected/.git_keep/logs/HEAD rename to test/integration/staginWithDiffContextChange/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/staginWithDiffContextChange/expected/.git_keep/logs/refs/heads/master b/test/integration/staginWithDiffContextChange/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/staginWithDiffContextChange/expected/.git_keep/logs/refs/heads/master rename to test/integration/staginWithDiffContextChange/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/staginWithDiffContextChange/expected/.git_keep/objects/15/8e9a9c1a9627ea0ef4de8b00a503ed0f80a09e b/test/integration/staginWithDiffContextChange/expected/repo/.git_keep/objects/15/8e9a9c1a9627ea0ef4de8b00a503ed0f80a09e similarity index 100% rename from test/integration/staginWithDiffContextChange/expected/.git_keep/objects/15/8e9a9c1a9627ea0ef4de8b00a503ed0f80a09e rename to test/integration/staginWithDiffContextChange/expected/repo/.git_keep/objects/15/8e9a9c1a9627ea0ef4de8b00a503ed0f80a09e diff --git a/test/integration/staginWithDiffContextChange/expected/.git_keep/objects/18/54ab416d299cda0227d62b9ab0765e5551ef57 b/test/integration/staginWithDiffContextChange/expected/repo/.git_keep/objects/18/54ab416d299cda0227d62b9ab0765e5551ef57 similarity index 100% rename from test/integration/staginWithDiffContextChange/expected/.git_keep/objects/18/54ab416d299cda0227d62b9ab0765e5551ef57 rename to test/integration/staginWithDiffContextChange/expected/repo/.git_keep/objects/18/54ab416d299cda0227d62b9ab0765e5551ef57 diff --git a/test/integration/staginWithDiffContextChange/expected/.git_keep/objects/2c/484c0a45f3726375600319f73978221a74b783 b/test/integration/staginWithDiffContextChange/expected/repo/.git_keep/objects/2c/484c0a45f3726375600319f73978221a74b783 similarity index 100% rename from test/integration/staginWithDiffContextChange/expected/.git_keep/objects/2c/484c0a45f3726375600319f73978221a74b783 rename to test/integration/staginWithDiffContextChange/expected/repo/.git_keep/objects/2c/484c0a45f3726375600319f73978221a74b783 diff --git a/test/integration/staginWithDiffContextChange/expected/.git_keep/objects/7b/9c2149f16c706cea79b03234cb67fde7e9b68f b/test/integration/staginWithDiffContextChange/expected/repo/.git_keep/objects/7b/9c2149f16c706cea79b03234cb67fde7e9b68f similarity index 100% rename from test/integration/staginWithDiffContextChange/expected/.git_keep/objects/7b/9c2149f16c706cea79b03234cb67fde7e9b68f rename to test/integration/staginWithDiffContextChange/expected/repo/.git_keep/objects/7b/9c2149f16c706cea79b03234cb67fde7e9b68f diff --git a/test/integration/staginWithDiffContextChange/expected/.git_keep/objects/8a/af931e5367e5af9d2e2c014800d22190352b14 b/test/integration/staginWithDiffContextChange/expected/repo/.git_keep/objects/8a/af931e5367e5af9d2e2c014800d22190352b14 similarity index 100% rename from test/integration/staginWithDiffContextChange/expected/.git_keep/objects/8a/af931e5367e5af9d2e2c014800d22190352b14 rename to test/integration/staginWithDiffContextChange/expected/repo/.git_keep/objects/8a/af931e5367e5af9d2e2c014800d22190352b14 diff --git a/test/integration/staginWithDiffContextChange/expected/.git_keep/objects/fd/c28832bb15c80146150a24a018088c9df4f8cd b/test/integration/staginWithDiffContextChange/expected/repo/.git_keep/objects/fd/c28832bb15c80146150a24a018088c9df4f8cd similarity index 100% rename from test/integration/staginWithDiffContextChange/expected/.git_keep/objects/fd/c28832bb15c80146150a24a018088c9df4f8cd rename to test/integration/staginWithDiffContextChange/expected/repo/.git_keep/objects/fd/c28832bb15c80146150a24a018088c9df4f8cd diff --git a/test/integration/staginWithDiffContextChange/expected/.git_keep/refs/heads/master b/test/integration/staginWithDiffContextChange/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/staginWithDiffContextChange/expected/.git_keep/refs/heads/master rename to test/integration/staginWithDiffContextChange/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/staginWithDiffContextChange/expected/one.txt b/test/integration/staginWithDiffContextChange/expected/repo/one.txt similarity index 100% rename from test/integration/staginWithDiffContextChange/expected/one.txt rename to test/integration/staginWithDiffContextChange/expected/repo/one.txt diff --git a/test/integration/staginWithDiffContextChange/setup.sh b/test/integration/staginWithDiffContextChange/setup.sh index ac450f8d2..9b1f6fb8c 100644 --- a/test/integration/staginWithDiffContextChange/setup.sh +++ b/test/integration/staginWithDiffContextChange/setup.sh @@ -9,8 +9,8 @@ git init git config user.email "CI@example.com" git config user.name "CI" -cp ../files/one.txt one.txt +cp ../../files/one.txt one.txt git add . git commit -am file1 -cp ../files/one_new.txt one.txt +cp ../../files/one_new.txt one.txt diff --git a/test/integration/staging/expected/.git_keep/index b/test/integration/staging/expected/.git_keep/index deleted file mode 100644 index 3735bb8d9..000000000 Binary files a/test/integration/staging/expected/.git_keep/index and /dev/null differ diff --git a/test/integration/staging/expected/.git_keep/logs/HEAD b/test/integration/staging/expected/.git_keep/logs/HEAD deleted file mode 100644 index fea22e271..000000000 --- a/test/integration/staging/expected/.git_keep/logs/HEAD +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 6f7e9e66f080162af7ebab016d02550145cfda66 CI 1642499582 +1100 commit (initial): file1 -6f7e9e66f080162af7ebab016d02550145cfda66 0b6860367a6e7794985007cadf0aaf04c801e59e CI 1642499609 +1100 commit: test diff --git a/test/integration/staging/expected/.git_keep/logs/refs/heads/master b/test/integration/staging/expected/.git_keep/logs/refs/heads/master deleted file mode 100644 index fea22e271..000000000 --- a/test/integration/staging/expected/.git_keep/logs/refs/heads/master +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 6f7e9e66f080162af7ebab016d02550145cfda66 CI 1642499582 +1100 commit (initial): file1 -6f7e9e66f080162af7ebab016d02550145cfda66 0b6860367a6e7794985007cadf0aaf04c801e59e CI 1642499609 +1100 commit: test diff --git a/test/integration/staging/expected/.git_keep/objects/05/9586b468b89bf98e3b62126f455ab15bea4a5f b/test/integration/staging/expected/.git_keep/objects/05/9586b468b89bf98e3b62126f455ab15bea4a5f deleted file mode 100644 index 08eb1a0d1..000000000 Binary files a/test/integration/staging/expected/.git_keep/objects/05/9586b468b89bf98e3b62126f455ab15bea4a5f and /dev/null differ diff --git a/test/integration/staging/expected/.git_keep/objects/0b/6860367a6e7794985007cadf0aaf04c801e59e b/test/integration/staging/expected/.git_keep/objects/0b/6860367a6e7794985007cadf0aaf04c801e59e deleted file mode 100644 index 330f8f8f7..000000000 Binary files a/test/integration/staging/expected/.git_keep/objects/0b/6860367a6e7794985007cadf0aaf04c801e59e and /dev/null differ diff --git a/test/integration/staging/expected/.git_keep/objects/3e/95c983db9349a26b20fccbdaa933e805ff817e b/test/integration/staging/expected/.git_keep/objects/3e/95c983db9349a26b20fccbdaa933e805ff817e deleted file mode 100644 index 2da57d308..000000000 Binary files a/test/integration/staging/expected/.git_keep/objects/3e/95c983db9349a26b20fccbdaa933e805ff817e and /dev/null differ diff --git a/test/integration/staging/expected/.git_keep/objects/40/ce5b93f72e04cb876afaaf91398c2821260b95 b/test/integration/staging/expected/.git_keep/objects/40/ce5b93f72e04cb876afaaf91398c2821260b95 deleted file mode 100644 index 8c6fa3ec6..000000000 Binary files a/test/integration/staging/expected/.git_keep/objects/40/ce5b93f72e04cb876afaaf91398c2821260b95 and /dev/null differ diff --git a/test/integration/staging/expected/.git_keep/objects/6f/7e9e66f080162af7ebab016d02550145cfda66 b/test/integration/staging/expected/.git_keep/objects/6f/7e9e66f080162af7ebab016d02550145cfda66 deleted file mode 100644 index 729fbdfbc..000000000 Binary files a/test/integration/staging/expected/.git_keep/objects/6f/7e9e66f080162af7ebab016d02550145cfda66 and /dev/null differ diff --git a/test/integration/staging/expected/.git_keep/objects/a4/7182dc057408b3c6b1749cb46db0e0c5fd626b b/test/integration/staging/expected/.git_keep/objects/a4/7182dc057408b3c6b1749cb46db0e0c5fd626b deleted file mode 100644 index 49bb3dd6b..000000000 Binary files a/test/integration/staging/expected/.git_keep/objects/a4/7182dc057408b3c6b1749cb46db0e0c5fd626b and /dev/null differ diff --git a/test/integration/staging/expected/.git_keep/objects/b6/77e3e5777e122a22ebb001532c5017b199b0c0 b/test/integration/staging/expected/.git_keep/objects/b6/77e3e5777e122a22ebb001532c5017b199b0c0 deleted file mode 100644 index a50f73636..000000000 --- a/test/integration/staging/expected/.git_keep/objects/b6/77e3e5777e122a22ebb001532c5017b199b0c0 +++ /dev/null @@ -1,2 +0,0 @@ -xM’żnÜ0 Ć;ű)ľN·řŚNš©@‡Lą:Ëm '‹®Dťp["O')Ą4EC˙üńŁçŔ3ľ<|ş8J4˘ŇéF¨&\ÉâWńBX“§hĂĺ€0ľ“7â|^ŚŔrŤ0ŃB˝Q˝88żŹXCĚAĂ=˙‡I–ŁÖu>#>7ě”óY|Ěđ\śćOĂEot§¬D‡Ś±=ĚF°ŢĆ“ &mHÓđD§VRô+ú¨qĚ%’Ü)\KĐÇ›#;Ľ¸dŽHaÂOB6 -QťÂ»ż† ĽĘ8h¬*©%ÖK žŕĚMíŹ}’ĺކ‹ĘŇŐQý2"ÝHG´ßÁkĎź[Í`:DíBUu‘ŮJëňO=‹+ű4<3˛Zž’poŰ®~ąÂlFU<©šWJyúŻţ·ßݏF®MdqÚn&EÚŰž¸´ĽÓ8|Óím©í/)xĘ_ßŐ ł8‰‹Ĺę7עłJźU랎˙ÂĘ Áß(?"˛´#šo -˙΢Ő@ \ No newline at end of file diff --git a/test/integration/staging/expected/.git_keep/objects/dc/02541428fdc15b30bd2174fcbcd43d388eab82 b/test/integration/staging/expected/.git_keep/objects/dc/02541428fdc15b30bd2174fcbcd43d388eab82 deleted file mode 100644 index 232769986..000000000 Binary files a/test/integration/staging/expected/.git_keep/objects/dc/02541428fdc15b30bd2174fcbcd43d388eab82 and /dev/null differ diff --git a/test/integration/staging/expected/.git_keep/refs/heads/master b/test/integration/staging/expected/.git_keep/refs/heads/master deleted file mode 100644 index 9da93ce1c..000000000 --- a/test/integration/staging/expected/.git_keep/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -0b6860367a6e7794985007cadf0aaf04c801e59e diff --git a/test/integration/staging/expected/.git_keep/COMMIT_EDITMSG b/test/integration/staging/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/staging/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/staging/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/submoduleAdd/expected/.git_keep/FETCH_HEAD b/test/integration/staging/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/submoduleAdd/expected/.git_keep/FETCH_HEAD rename to test/integration/staging/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/staging/expected/repo/.git_keep/HEAD b/test/integration/staging/expected/repo/.git_keep/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/test/integration/staging/expected/repo/.git_keep/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/test/integration/stashDrop/expected/.git_keep/config b/test/integration/staging/expected/repo/.git_keep/config similarity index 100% rename from test/integration/stashDrop/expected/.git_keep/config rename to test/integration/staging/expected/repo/.git_keep/config diff --git a/test/integration/tags3/expected/.git_keep/description b/test/integration/staging/expected/repo/.git_keep/description similarity index 100% rename from test/integration/tags3/expected/.git_keep/description rename to test/integration/staging/expected/repo/.git_keep/description diff --git a/test/integration/staging/expected/repo/.git_keep/index b/test/integration/staging/expected/repo/.git_keep/index new file mode 100644 index 000000000..694ca5da2 Binary files /dev/null and b/test/integration/staging/expected/repo/.git_keep/index differ diff --git a/test/integration/submoduleEnter/expected/.git_keep/info/exclude b/test/integration/staging/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/submoduleEnter/expected/.git_keep/info/exclude rename to test/integration/staging/expected/repo/.git_keep/info/exclude diff --git a/test/integration/staging/expected/repo/.git_keep/logs/HEAD b/test/integration/staging/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..fee95f75d --- /dev/null +++ b/test/integration/staging/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,2 @@ +0000000000000000000000000000000000000000 6497d00f0447159947a805f3a38e8c44ed2865b1 CI 1659701362 +1000 commit (initial): file1 +6497d00f0447159947a805f3a38e8c44ed2865b1 a6985076907d3ed64cf59480bb2eec313ea221cf CI 1659701393 +1000 commit: test diff --git a/test/integration/staging/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/staging/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..fee95f75d --- /dev/null +++ b/test/integration/staging/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,2 @@ +0000000000000000000000000000000000000000 6497d00f0447159947a805f3a38e8c44ed2865b1 CI 1659701362 +1000 commit (initial): file1 +6497d00f0447159947a805f3a38e8c44ed2865b1 a6985076907d3ed64cf59480bb2eec313ea221cf CI 1659701393 +1000 commit: test diff --git a/test/integration/staging/expected/.git_keep/objects/12/c4186053ecd4056526743060a8fe87429b7306 b/test/integration/staging/expected/repo/.git_keep/objects/12/c4186053ecd4056526743060a8fe87429b7306 similarity index 100% rename from test/integration/staging/expected/.git_keep/objects/12/c4186053ecd4056526743060a8fe87429b7306 rename to test/integration/staging/expected/repo/.git_keep/objects/12/c4186053ecd4056526743060a8fe87429b7306 diff --git a/test/integration/staging/expected/.git_keep/objects/63/5b45efaba0c2415658bc121de201ec43a47920 b/test/integration/staging/expected/repo/.git_keep/objects/63/5b45efaba0c2415658bc121de201ec43a47920 similarity index 100% rename from test/integration/staging/expected/.git_keep/objects/63/5b45efaba0c2415658bc121de201ec43a47920 rename to test/integration/staging/expected/repo/.git_keep/objects/63/5b45efaba0c2415658bc121de201ec43a47920 diff --git a/test/integration/staging/expected/repo/.git_keep/objects/64/97d00f0447159947a805f3a38e8c44ed2865b1 b/test/integration/staging/expected/repo/.git_keep/objects/64/97d00f0447159947a805f3a38e8c44ed2865b1 new file mode 100644 index 000000000..181690514 Binary files /dev/null and b/test/integration/staging/expected/repo/.git_keep/objects/64/97d00f0447159947a805f3a38e8c44ed2865b1 differ diff --git a/test/integration/staging/expected/repo/.git_keep/objects/73/f226ec630e261c016df5bd80e3156eaba42d7e b/test/integration/staging/expected/repo/.git_keep/objects/73/f226ec630e261c016df5bd80e3156eaba42d7e new file mode 100644 index 000000000..95c2b37c3 Binary files /dev/null and b/test/integration/staging/expected/repo/.git_keep/objects/73/f226ec630e261c016df5bd80e3156eaba42d7e differ diff --git a/test/integration/staging/expected/.git_keep/objects/79/8369253f104fe8cdc91db6f7d3525be532218e b/test/integration/staging/expected/repo/.git_keep/objects/79/8369253f104fe8cdc91db6f7d3525be532218e similarity index 100% rename from test/integration/staging/expected/.git_keep/objects/79/8369253f104fe8cdc91db6f7d3525be532218e rename to test/integration/staging/expected/repo/.git_keep/objects/79/8369253f104fe8cdc91db6f7d3525be532218e diff --git a/test/integration/staging/expected/.git_keep/objects/a0/425534134de68284a0a7250b83b0e6303f0ed7 b/test/integration/staging/expected/repo/.git_keep/objects/a0/425534134de68284a0a7250b83b0e6303f0ed7 similarity index 100% rename from test/integration/staging/expected/.git_keep/objects/a0/425534134de68284a0a7250b83b0e6303f0ed7 rename to test/integration/staging/expected/repo/.git_keep/objects/a0/425534134de68284a0a7250b83b0e6303f0ed7 diff --git a/test/integration/staging/expected/.git_keep/objects/a4/8a7caa799e7859b8f21d373e3f01b06002d42f b/test/integration/staging/expected/repo/.git_keep/objects/a4/8a7caa799e7859b8f21d373e3f01b06002d42f similarity index 100% rename from test/integration/staging/expected/.git_keep/objects/a4/8a7caa799e7859b8f21d373e3f01b06002d42f rename to test/integration/staging/expected/repo/.git_keep/objects/a4/8a7caa799e7859b8f21d373e3f01b06002d42f diff --git a/test/integration/staging/expected/repo/.git_keep/objects/a6/985076907d3ed64cf59480bb2eec313ea221cf b/test/integration/staging/expected/repo/.git_keep/objects/a6/985076907d3ed64cf59480bb2eec313ea221cf new file mode 100644 index 000000000..0e957b419 Binary files /dev/null and b/test/integration/staging/expected/repo/.git_keep/objects/a6/985076907d3ed64cf59480bb2eec313ea221cf differ diff --git a/test/integration/staging/expected/repo/.git_keep/objects/ac/43b10fa95a2d2ee6a028c0d0ea878f887d7c51 b/test/integration/staging/expected/repo/.git_keep/objects/ac/43b10fa95a2d2ee6a028c0d0ea878f887d7c51 new file mode 100644 index 000000000..2b24d35c6 Binary files /dev/null and b/test/integration/staging/expected/repo/.git_keep/objects/ac/43b10fa95a2d2ee6a028c0d0ea878f887d7c51 differ diff --git a/test/integration/staging/expected/repo/.git_keep/objects/b7/9b845289f08703b6ffb8927da9665efda4356f b/test/integration/staging/expected/repo/.git_keep/objects/b7/9b845289f08703b6ffb8927da9665efda4356f new file mode 100644 index 000000000..734b08fe0 --- /dev/null +++ b/test/integration/staging/expected/repo/.git_keep/objects/b7/9b845289f08703b6ffb8927da9665efda4356f @@ -0,0 +1,2 @@ +x=’=ŽŰ0…Sëo+7˛»Ý"©¤Řj`‹­)q$¦9 +,¸Ë!rÂś$Ź Ľ€ @óű˝7š‚Nxyyţr®ĹI’»n‚Ý„‹XüŞľ–ä%ÚpGÝP?Ä7âxŢMŐ=ÂD F%b÷ĹÁůëY5ôÄîő?M˛9×ůŚĽů|\q•śŹĹÇ ˇ5Á±ţ4|tý˛°tX“pCq~ľ@m«ÔĄŹšŇ'Ň™QąK¦Ž­Ś(¬Î|™U`˝Ť‡‚=SNĂ«eđ©ljôS AJîě®°yub‡w—Ě%śđ!ť¦šI¶;B‘.j1A—2’ťaźKčy¤8să÷cM÷`ľwŽáLC»Żt>#ĘM(#ĘőŢ$’=?µ™ÁtŰ-ŢłÖ¶ĺÓw –pőzŢ™_^ElĆÓEĹĄągVCż ^y‡MwIąůý?âďď?¸DÝŰyŠă:ZĎó&ŢŠ'ÖÚVčUĆá;˙Čí&ĺŻ˙í3;lI«ĹâW×:'úźi8¦ ŤŹßhŃ„ŕo’ż!ji F´ŘZý?<éÇ \ No newline at end of file diff --git a/test/integration/staging/expected/repo/.git_keep/objects/d6/9b45d6d14e1864411d17930012210271c400c3 b/test/integration/staging/expected/repo/.git_keep/objects/d6/9b45d6d14e1864411d17930012210271c400c3 new file mode 100644 index 000000000..b8ca4e19d --- /dev/null +++ b/test/integration/staging/expected/repo/.git_keep/objects/d6/9b45d6d14e1864411d17930012210271c400c3 @@ -0,0 +1,2 @@ +x=’;ŽÜ0DëĺhÍdŢŔŽ 8ŘhÇŔSbK$†bËüŚ0™áú$.Ňęď«jMA'#ĘM¨#Ęvo ź?·™ÁtŰ=>łÖ¶ĺĂx –pu;ŻŠĚ//‰"vCí<ßµŮgVCĂ ^x]Iąţ?âďď?¸F=Ú}ŠăşIJ!ŇÖN¬µmĐMĆá;Ďłđô‰ŕ)ýď†ŮaOZ-żş–ťč¦ß˝ żŃ˘ Áß$ë‡á‚-¶„V˙véż \ No newline at end of file diff --git a/test/integration/staging/expected/repo/.git_keep/objects/e7/86ecad3cea3651947e6c2648f6dae87372276b b/test/integration/staging/expected/repo/.git_keep/objects/e7/86ecad3cea3651947e6c2648f6dae87372276b new file mode 100644 index 000000000..b70a7418c Binary files /dev/null and b/test/integration/staging/expected/repo/.git_keep/objects/e7/86ecad3cea3651947e6c2648f6dae87372276b differ diff --git a/test/integration/staging/expected/.git_keep/objects/e8/aaa2f356eb341c693e239467fd200d0117b487 b/test/integration/staging/expected/repo/.git_keep/objects/e8/aaa2f356eb341c693e239467fd200d0117b487 similarity index 100% rename from test/integration/staging/expected/.git_keep/objects/e8/aaa2f356eb341c693e239467fd200d0117b487 rename to test/integration/staging/expected/repo/.git_keep/objects/e8/aaa2f356eb341c693e239467fd200d0117b487 diff --git a/test/integration/staging/expected/repo/.git_keep/objects/eb/38d1e424df18868f73407ca8087b6350b59f3e b/test/integration/staging/expected/repo/.git_keep/objects/eb/38d1e424df18868f73407ca8087b6350b59f3e new file mode 100644 index 000000000..185fa81ec Binary files /dev/null and b/test/integration/staging/expected/repo/.git_keep/objects/eb/38d1e424df18868f73407ca8087b6350b59f3e differ diff --git a/test/integration/staging/expected/.git_keep/objects/fb/e09a11933b44ea60b46bd0f3d44142cb6189a4 b/test/integration/staging/expected/repo/.git_keep/objects/fb/e09a11933b44ea60b46bd0f3d44142cb6189a4 similarity index 100% rename from test/integration/staging/expected/.git_keep/objects/fb/e09a11933b44ea60b46bd0f3d44142cb6189a4 rename to test/integration/staging/expected/repo/.git_keep/objects/fb/e09a11933b44ea60b46bd0f3d44142cb6189a4 diff --git a/test/integration/staging/expected/repo/.git_keep/refs/heads/master b/test/integration/staging/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..a5323f973 --- /dev/null +++ b/test/integration/staging/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +a6985076907d3ed64cf59480bb2eec313ea221cf diff --git a/test/integration/staging/expected/one.txt b/test/integration/staging/expected/repo/one.txt similarity index 100% rename from test/integration/staging/expected/one.txt rename to test/integration/staging/expected/repo/one.txt diff --git a/test/integration/staging/expected/three.txt b/test/integration/staging/expected/repo/three.txt similarity index 97% rename from test/integration/staging/expected/three.txt rename to test/integration/staging/expected/repo/three.txt index 3158e329a..500ce9c2b 100644 --- a/test/integration/staging/expected/three.txt +++ b/test/integration/staging/expected/repo/three.txt @@ -9,17 +9,18 @@ import ( "github.com/jesseduffield/lazygit/pkg/commands/loaders" "github.com/jesseduffield/lazygit/pkg/commands/models" "github.com/jesseduffield/lazygit/pkg/config" - "github.com/jesseduffield/lazygit/pkg/gui/filetree" + "github.com/jesseduffield/lazygit/pkg/gui/nodetree" "github.com/jesseduffield/lazygit/pkg/utils" ) // list panel functions +func (gui *Gui) getSelectednodeNode() *nodetree.nodeNode { + selectedLine := gui.State.Panels.nodes.SelectedLineIdx if selectedLine == -1 { return nil } - return gui.State.FileManager.GetItemAtIndex(selectedLine) return gui.State.nodeManager.GetItemAtIndex(selectedLine) } @@ -40,8 +41,6 @@ func (gui *Gui) getSelectedPath() string { return node.GetPath() } -func (gui *Gui) filesRenderToMain() error { - node := gui.getSelectedFileNode() func (gui *Gui) nodesRenderToMain() error { node := gui.getSelectednodeNode() diff --git a/test/integration/staging/expected/repo/two.txt b/test/integration/staging/expected/repo/two.txt new file mode 100644 index 000000000..73f226ec6 --- /dev/null +++ b/test/integration/staging/expected/repo/two.txt @@ -0,0 +1,33 @@ +type createMenuOptions struct { + showCancel bool +} + +func (gui *Gui) createMenu(title string, items []*menuItem, createMenuOptions createMenuOptions) error { + if createMenuOptions.showCancel { + // this is mutative but I'm okay with that for now + items = append(items, &menuItem{ + displayStrings: []string{gui.Tr.LcCancel}, + onPress: func() error { + return nil + }, + }) + } + + gui.State.MenuItems = items + + stringArrays := make([][]string, len(items)) + for i, item := range items { + if item.opensMenu && item.displayStrings != nil { + return errors.New("Message for the developer of this app: you've set opensMenu with displaystrings on the menu panel. Bad developer!. Apologies, user") + } + + if item.displayStrings == nil { + styledStr := item.displayString + if item.opensMenu { + styledStr = opensMenuStyle(styledStr) + } + stringArrays[0] = []str0ng{styledStr} + } else { + str0ngArrays[0] = item.displayStrings + } + } diff --git a/test/integration/staging/expected/two.txt b/test/integration/staging/expected/two.txt deleted file mode 100644 index b4ebbd4f1..000000000 --- a/test/integration/staging/expected/two.txt +++ /dev/null @@ -1,33 +0,0 @@ -type createMenuOptions struct { - showCancel bool -} - -func (gui *Gui) createMenu(title string, items []*menuItem, createMenuOptions createMenuOptions) error { - if createMenuOptions.showCancel { - // this is mutative but I'm okay with that for now - items = app(items, &menuItem{ - d: []string{gui.Tr.LcCancel}, - onPress: func() error { - return nil - }, - }) - } - - gui.State.MenuItems = items - - stringArrays := make([][]string, len(items)) - for i, items := range items { - if items.opensMenu && item.displayStrings != nil { - return errors.New("Message for the developer of this app: you've set opensMenu with displaystrings on the menu panel. Bad developer!. Apologies, user") - } - - if item.displayStrings == nil { - styledStr := item.displayString - if item.opensMenu { - styledStr = opensMenuStyle(styledStr) - } - stringArrays[i] = []string{styledStr} - } else { - stringArrays[i] = item.displayStrings - } - } diff --git a/test/integration/staging/recording.json b/test/integration/staging/recording.json index 912fe35b0..73d7e58d1 100644 --- a/test/integration/staging/recording.json +++ b/test/integration/staging/recording.json @@ -1 +1 @@ -{"KeyEvents":[{"Timestamp":671,"Mod":0,"Key":13,"Ch":13},{"Timestamp":1095,"Mod":0,"Key":256,"Ch":32},{"Timestamp":1447,"Mod":0,"Key":256,"Ch":32},{"Timestamp":2608,"Mod":0,"Key":258,"Ch":0},{"Timestamp":2743,"Mod":0,"Key":258,"Ch":0},{"Timestamp":2973,"Mod":0,"Key":256,"Ch":118},{"Timestamp":3078,"Mod":0,"Key":258,"Ch":0},{"Timestamp":3215,"Mod":0,"Key":258,"Ch":0},{"Timestamp":3415,"Mod":0,"Key":256,"Ch":32},{"Timestamp":3920,"Mod":0,"Key":9,"Ch":9},{"Timestamp":4287,"Mod":0,"Key":257,"Ch":0},{"Timestamp":4431,"Mod":0,"Key":257,"Ch":0},{"Timestamp":4559,"Mod":0,"Key":257,"Ch":0},{"Timestamp":4848,"Mod":0,"Key":256,"Ch":32},{"Timestamp":5774,"Mod":0,"Key":9,"Ch":9},{"Timestamp":6031,"Mod":0,"Key":258,"Ch":0},{"Timestamp":6294,"Mod":0,"Key":257,"Ch":0},{"Timestamp":6374,"Mod":0,"Key":256,"Ch":118},{"Timestamp":6463,"Mod":0,"Key":258,"Ch":0},{"Timestamp":6591,"Mod":0,"Key":258,"Ch":0},{"Timestamp":6711,"Mod":0,"Key":256,"Ch":32},{"Timestamp":7274,"Mod":0,"Key":27,"Ch":0},{"Timestamp":7591,"Mod":0,"Key":258,"Ch":0},{"Timestamp":7968,"Mod":0,"Key":13,"Ch":13},{"Timestamp":8735,"Mod":0,"Key":256,"Ch":97},{"Timestamp":9039,"Mod":0,"Key":256,"Ch":32},{"Timestamp":9327,"Mod":0,"Key":258,"Ch":0},{"Timestamp":9478,"Mod":0,"Key":258,"Ch":0},{"Timestamp":9815,"Mod":0,"Key":256,"Ch":32},{"Timestamp":10439,"Mod":0,"Key":9,"Ch":9},{"Timestamp":11383,"Mod":0,"Key":256,"Ch":97},{"Timestamp":12095,"Mod":0,"Key":256,"Ch":97},{"Timestamp":12319,"Mod":0,"Key":257,"Ch":0},{"Timestamp":13039,"Mod":0,"Key":256,"Ch":32},{"Timestamp":14109,"Mod":0,"Key":27,"Ch":0},{"Timestamp":15119,"Mod":0,"Key":13,"Ch":13},{"Timestamp":15543,"Mod":0,"Key":256,"Ch":100},{"Timestamp":15855,"Mod":0,"Key":13,"Ch":13},{"Timestamp":16183,"Mod":0,"Key":256,"Ch":100},{"Timestamp":16415,"Mod":0,"Key":13,"Ch":13},{"Timestamp":16832,"Mod":0,"Key":258,"Ch":0},{"Timestamp":17150,"Mod":0,"Key":258,"Ch":0},{"Timestamp":17519,"Mod":0,"Key":256,"Ch":118},{"Timestamp":17654,"Mod":0,"Key":258,"Ch":0},{"Timestamp":17784,"Mod":0,"Key":258,"Ch":0},{"Timestamp":17903,"Mod":0,"Key":258,"Ch":0},{"Timestamp":18015,"Mod":0,"Key":258,"Ch":0},{"Timestamp":18150,"Mod":0,"Key":258,"Ch":0},{"Timestamp":18272,"Mod":0,"Key":258,"Ch":0},{"Timestamp":18567,"Mod":0,"Key":256,"Ch":100},{"Timestamp":18759,"Mod":0,"Key":13,"Ch":13},{"Timestamp":19254,"Mod":0,"Key":258,"Ch":0},{"Timestamp":19736,"Mod":0,"Key":259,"Ch":0},{"Timestamp":20358,"Mod":0,"Key":256,"Ch":100},{"Timestamp":20552,"Mod":0,"Key":13,"Ch":13},{"Timestamp":20871,"Mod":0,"Key":256,"Ch":100},{"Timestamp":20991,"Mod":0,"Key":13,"Ch":13},{"Timestamp":21433,"Mod":0,"Key":27,"Ch":0},{"Timestamp":21647,"Mod":0,"Key":258,"Ch":0},{"Timestamp":21943,"Mod":0,"Key":13,"Ch":13},{"Timestamp":22663,"Mod":0,"Key":256,"Ch":97},{"Timestamp":23207,"Mod":0,"Key":258,"Ch":0},{"Timestamp":23383,"Mod":0,"Key":258,"Ch":0},{"Timestamp":24039,"Mod":0,"Key":256,"Ch":100},{"Timestamp":24391,"Mod":0,"Key":13,"Ch":13},{"Timestamp":25141,"Mod":0,"Key":27,"Ch":0},{"Timestamp":25695,"Mod":0,"Key":256,"Ch":99},{"Timestamp":25959,"Mod":0,"Key":256,"Ch":116},{"Timestamp":26007,"Mod":0,"Key":256,"Ch":101},{"Timestamp":26191,"Mod":0,"Key":256,"Ch":115},{"Timestamp":26214,"Mod":0,"Key":256,"Ch":116},{"Timestamp":26464,"Mod":0,"Key":13,"Ch":13},{"Timestamp":27367,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":272,"Height":74}]} \ No newline at end of file +{"KeyEvents":[{"Timestamp":699,"Mod":0,"Key":13,"Ch":13},{"Timestamp":1521,"Mod":0,"Key":256,"Ch":32},{"Timestamp":1825,"Mod":0,"Key":256,"Ch":32},{"Timestamp":2154,"Mod":0,"Key":256,"Ch":118},{"Timestamp":2338,"Mod":0,"Key":258,"Ch":0},{"Timestamp":2560,"Mod":0,"Key":256,"Ch":32},{"Timestamp":3210,"Mod":0,"Key":9,"Ch":9},{"Timestamp":3610,"Mod":0,"Key":256,"Ch":118},{"Timestamp":3762,"Mod":0,"Key":258,"Ch":0},{"Timestamp":3907,"Mod":0,"Key":258,"Ch":0},{"Timestamp":4034,"Mod":0,"Key":258,"Ch":0},{"Timestamp":4328,"Mod":0,"Key":256,"Ch":32},{"Timestamp":5857,"Mod":0,"Key":258,"Ch":0},{"Timestamp":6019,"Mod":0,"Key":258,"Ch":0},{"Timestamp":6170,"Mod":0,"Key":258,"Ch":0},{"Timestamp":6314,"Mod":0,"Key":258,"Ch":0},{"Timestamp":6474,"Mod":0,"Key":258,"Ch":0},{"Timestamp":6626,"Mod":0,"Key":258,"Ch":0},{"Timestamp":6778,"Mod":0,"Key":258,"Ch":0},{"Timestamp":6930,"Mod":0,"Key":258,"Ch":0},{"Timestamp":7074,"Mod":0,"Key":258,"Ch":0},{"Timestamp":7218,"Mod":0,"Key":258,"Ch":0},{"Timestamp":7368,"Mod":0,"Key":258,"Ch":0},{"Timestamp":8064,"Mod":0,"Key":256,"Ch":32},{"Timestamp":8586,"Mod":0,"Key":258,"Ch":0},{"Timestamp":8930,"Mod":0,"Key":256,"Ch":118},{"Timestamp":9130,"Mod":0,"Key":258,"Ch":0},{"Timestamp":9354,"Mod":0,"Key":256,"Ch":32},{"Timestamp":10488,"Mod":0,"Key":27,"Ch":0},{"Timestamp":11354,"Mod":0,"Key":258,"Ch":0},{"Timestamp":11650,"Mod":0,"Key":13,"Ch":13},{"Timestamp":12194,"Mod":0,"Key":256,"Ch":97},{"Timestamp":12841,"Mod":0,"Key":256,"Ch":32},{"Timestamp":14144,"Mod":0,"Key":9,"Ch":9},{"Timestamp":14698,"Mod":0,"Key":256,"Ch":97},{"Timestamp":15082,"Mod":0,"Key":256,"Ch":32},{"Timestamp":15993,"Mod":0,"Key":256,"Ch":97},{"Timestamp":16330,"Mod":0,"Key":256,"Ch":32},{"Timestamp":16850,"Mod":0,"Key":256,"Ch":32},{"Timestamp":17594,"Mod":0,"Key":256,"Ch":32},{"Timestamp":18405,"Mod":0,"Key":27,"Ch":0},{"Timestamp":18858,"Mod":0,"Key":258,"Ch":0},{"Timestamp":20379,"Mod":0,"Key":13,"Ch":13},{"Timestamp":23458,"Mod":0,"Key":256,"Ch":118},{"Timestamp":23675,"Mod":0,"Key":258,"Ch":0},{"Timestamp":23824,"Mod":0,"Key":258,"Ch":0},{"Timestamp":23968,"Mod":0,"Key":258,"Ch":0},{"Timestamp":24338,"Mod":0,"Key":256,"Ch":100},{"Timestamp":24747,"Mod":0,"Key":13,"Ch":13},{"Timestamp":25281,"Mod":0,"Key":256,"Ch":97},{"Timestamp":25651,"Mod":0,"Key":256,"Ch":100},{"Timestamp":26050,"Mod":0,"Key":13,"Ch":13},{"Timestamp":27056,"Mod":0,"Key":256,"Ch":32},{"Timestamp":27849,"Mod":0,"Key":27,"Ch":0},{"Timestamp":28746,"Mod":0,"Key":256,"Ch":99},{"Timestamp":29019,"Mod":0,"Key":256,"Ch":116},{"Timestamp":29074,"Mod":0,"Key":256,"Ch":101},{"Timestamp":29273,"Mod":0,"Key":256,"Ch":115},{"Timestamp":29297,"Mod":0,"Key":256,"Ch":116},{"Timestamp":29538,"Mod":0,"Key":13,"Ch":13},{"Timestamp":30098,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":118,"Height":61}]} \ No newline at end of file diff --git a/test/integration/staging/setup.sh b/test/integration/staging/setup.sh index 5ede99e27..da73083d2 100644 --- a/test/integration/staging/setup.sh +++ b/test/integration/staging/setup.sh @@ -7,12 +7,12 @@ git init git config user.email "CI@example.com" git config user.name "CI" -cp ../files/one.txt one.txt -cp ../files/two.txt two.txt -cp ../files/three.txt three.txt +cp ../../files/one.txt one.txt +cp ../../files/two.txt two.txt +cp ../../files/three.txt three.txt git add . git commit -am file1 -cp ../files/one_new.txt one.txt -cp ../files/two_new.txt two.txt -cp ../files/three_new.txt three.txt +cp ../../files/one_new.txt one.txt +cp ../../files/two_new.txt two.txt +cp ../../files/three_new.txt three.txt diff --git a/test/integration/staging/test.json b/test/integration/staging/test.json index c0f750c29..f93f82f13 100644 --- a/test/integration/staging/test.json +++ b/test/integration/staging/test.json @@ -1,4 +1,4 @@ { - "description": "Staging a file line-by-line", + "description": "Staging a file via the patch explorer", "speed": 30 } diff --git a/test/integration/stagingTwo/expected/.git_keep/COMMIT_EDITMSG b/test/integration/stagingDiscard/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/stagingTwo/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/stagingDiscard/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/submoduleEnter/expected/.git_keep/FETCH_HEAD b/test/integration/stagingDiscard/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/submoduleEnter/expected/.git_keep/FETCH_HEAD rename to test/integration/stagingDiscard/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/stagingDiscard/expected/repo/.git_keep/HEAD b/test/integration/stagingDiscard/expected/repo/.git_keep/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/test/integration/stagingDiscard/expected/repo/.git_keep/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/test/integration/stashNewBranch/expected/.git_keep/config b/test/integration/stagingDiscard/expected/repo/.git_keep/config similarity index 100% rename from test/integration/stashNewBranch/expected/.git_keep/config rename to test/integration/stagingDiscard/expected/repo/.git_keep/config diff --git a/test/integration/tags4/expected/.git_keep/description b/test/integration/stagingDiscard/expected/repo/.git_keep/description similarity index 100% rename from test/integration/tags4/expected/.git_keep/description rename to test/integration/stagingDiscard/expected/repo/.git_keep/description diff --git a/test/integration/stagingDiscard/expected/repo/.git_keep/index b/test/integration/stagingDiscard/expected/repo/.git_keep/index new file mode 100644 index 000000000..b80cdaea2 Binary files /dev/null and b/test/integration/stagingDiscard/expected/repo/.git_keep/index differ diff --git a/test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/info/exclude b/test/integration/stagingDiscard/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/info/exclude rename to test/integration/stagingDiscard/expected/repo/.git_keep/info/exclude diff --git a/test/integration/stagingDiscard/expected/repo/.git_keep/logs/HEAD b/test/integration/stagingDiscard/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..2f8312a35 --- /dev/null +++ b/test/integration/stagingDiscard/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 adf0c68f5e5508ce3fc598d5f01a53486bd9d287 CI 1659736149 +1000 commit (initial): file1 diff --git a/test/integration/stagingDiscard/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/stagingDiscard/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..2f8312a35 --- /dev/null +++ b/test/integration/stagingDiscard/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 adf0c68f5e5508ce3fc598d5f01a53486bd9d287 CI 1659736149 +1000 commit (initial): file1 diff --git a/test/integration/stagingTwo/expected/.git_keep/objects/15/8e9a9c1a9627ea0ef4de8b00a503ed0f80a09e b/test/integration/stagingDiscard/expected/repo/.git_keep/objects/15/8e9a9c1a9627ea0ef4de8b00a503ed0f80a09e similarity index 100% rename from test/integration/stagingTwo/expected/.git_keep/objects/15/8e9a9c1a9627ea0ef4de8b00a503ed0f80a09e rename to test/integration/stagingDiscard/expected/repo/.git_keep/objects/15/8e9a9c1a9627ea0ef4de8b00a503ed0f80a09e diff --git a/test/integration/stagingTwo/expected/.git_keep/objects/7b/9c2149f16c706cea79b03234cb67fde7e9b68f b/test/integration/stagingDiscard/expected/repo/.git_keep/objects/7b/9c2149f16c706cea79b03234cb67fde7e9b68f similarity index 100% rename from test/integration/stagingTwo/expected/.git_keep/objects/7b/9c2149f16c706cea79b03234cb67fde7e9b68f rename to test/integration/stagingDiscard/expected/repo/.git_keep/objects/7b/9c2149f16c706cea79b03234cb67fde7e9b68f diff --git a/test/integration/stagingDiscard/expected/repo/.git_keep/objects/ad/f0c68f5e5508ce3fc598d5f01a53486bd9d287 b/test/integration/stagingDiscard/expected/repo/.git_keep/objects/ad/f0c68f5e5508ce3fc598d5f01a53486bd9d287 new file mode 100644 index 000000000..e09a17564 Binary files /dev/null and b/test/integration/stagingDiscard/expected/repo/.git_keep/objects/ad/f0c68f5e5508ce3fc598d5f01a53486bd9d287 differ diff --git a/test/integration/stagingDiscard/expected/repo/.git_keep/refs/heads/master b/test/integration/stagingDiscard/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..ddab060df --- /dev/null +++ b/test/integration/stagingDiscard/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +adf0c68f5e5508ce3fc598d5f01a53486bd9d287 diff --git a/test/integration/stagingTwo/expected/one.txt b/test/integration/stagingDiscard/expected/repo/one.txt similarity index 100% rename from test/integration/stagingTwo/expected/one.txt rename to test/integration/stagingDiscard/expected/repo/one.txt diff --git a/test/integration/stagingTwo/files/one.txt b/test/integration/stagingDiscard/files/one.txt similarity index 100% rename from test/integration/stagingTwo/files/one.txt rename to test/integration/stagingDiscard/files/one.txt diff --git a/test/integration/stagingTwo/files/one_new.txt b/test/integration/stagingDiscard/files/one_new.txt similarity index 100% rename from test/integration/stagingTwo/files/one_new.txt rename to test/integration/stagingDiscard/files/one_new.txt diff --git a/test/integration/stagingDiscard/recording.json b/test/integration/stagingDiscard/recording.json new file mode 100644 index 000000000..b123b242c --- /dev/null +++ b/test/integration/stagingDiscard/recording.json @@ -0,0 +1 @@ +{"KeyEvents":[{"Timestamp":771,"Mod":0,"Key":13,"Ch":13},{"Timestamp":1187,"Mod":0,"Key":256,"Ch":118},{"Timestamp":1428,"Mod":0,"Key":258,"Ch":0},{"Timestamp":1604,"Mod":0,"Key":258,"Ch":0},{"Timestamp":1901,"Mod":0,"Key":256,"Ch":100},{"Timestamp":2213,"Mod":0,"Key":13,"Ch":13},{"Timestamp":2947,"Mod":0,"Key":27,"Ch":0},{"Timestamp":3555,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":118,"Height":61}]} \ No newline at end of file diff --git a/test/integration/stagingDiscard/setup.sh b/test/integration/stagingDiscard/setup.sh new file mode 100644 index 000000000..9b1f6fb8c --- /dev/null +++ b/test/integration/stagingDiscard/setup.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +set -e + +cd $1 + +git init + +git config user.email "CI@example.com" +git config user.name "CI" + +cp ../../files/one.txt one.txt +git add . +git commit -am file1 + +cp ../../files/one_new.txt one.txt diff --git a/test/integration/stagingDiscard/test.json b/test/integration/stagingDiscard/test.json new file mode 100644 index 000000000..63bb457ce --- /dev/null +++ b/test/integration/stagingDiscard/test.json @@ -0,0 +1,4 @@ +{ + "description": "Discard a chunk of code", + "speed": 20 +} diff --git a/test/integration/tags/expected/.git_keep/COMMIT_EDITMSG b/test/integration/stagingDiscardAll/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/tags/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/stagingDiscardAll/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/submoduleRemove/expected/.git_keep/FETCH_HEAD b/test/integration/stagingDiscardAll/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/submoduleRemove/expected/.git_keep/FETCH_HEAD rename to test/integration/stagingDiscardAll/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/stagingDiscardAll/expected/repo/.git_keep/HEAD b/test/integration/stagingDiscardAll/expected/repo/.git_keep/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/test/integration/stagingDiscardAll/expected/repo/.git_keep/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/test/integration/stashPop/expected/.git_keep/config b/test/integration/stagingDiscardAll/expected/repo/.git_keep/config similarity index 100% rename from test/integration/stashPop/expected/.git_keep/config rename to test/integration/stagingDiscardAll/expected/repo/.git_keep/config diff --git a/test/integration/undo/expected/.git_keep/description b/test/integration/stagingDiscardAll/expected/repo/.git_keep/description similarity index 100% rename from test/integration/undo/expected/.git_keep/description rename to test/integration/stagingDiscardAll/expected/repo/.git_keep/description diff --git a/test/integration/stagingDiscardAll/expected/repo/.git_keep/index b/test/integration/stagingDiscardAll/expected/repo/.git_keep/index new file mode 100644 index 000000000..a0c00de83 Binary files /dev/null and b/test/integration/stagingDiscardAll/expected/repo/.git_keep/index differ diff --git a/test/integration/submoduleRemove/expected/.git_keep/info/exclude b/test/integration/stagingDiscardAll/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/submoduleRemove/expected/.git_keep/info/exclude rename to test/integration/stagingDiscardAll/expected/repo/.git_keep/info/exclude diff --git a/test/integration/stagingDiscardAll/expected/repo/.git_keep/logs/HEAD b/test/integration/stagingDiscardAll/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..55d603f68 --- /dev/null +++ b/test/integration/stagingDiscardAll/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 bccb06809b2f0e67bb3d3dd22c2b95882e72cbbb CI 1659736351 +1000 commit (initial): file1 diff --git a/test/integration/stagingDiscardAll/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/stagingDiscardAll/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..55d603f68 --- /dev/null +++ b/test/integration/stagingDiscardAll/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 bccb06809b2f0e67bb3d3dd22c2b95882e72cbbb CI 1659736351 +1000 commit (initial): file1 diff --git a/test/integration/stagingDiscardAll/expected/repo/.git_keep/objects/15/8e9a9c1a9627ea0ef4de8b00a503ed0f80a09e b/test/integration/stagingDiscardAll/expected/repo/.git_keep/objects/15/8e9a9c1a9627ea0ef4de8b00a503ed0f80a09e new file mode 100644 index 000000000..2c00719b0 Binary files /dev/null and b/test/integration/stagingDiscardAll/expected/repo/.git_keep/objects/15/8e9a9c1a9627ea0ef4de8b00a503ed0f80a09e differ diff --git a/test/integration/stagingDiscardAll/expected/repo/.git_keep/objects/39/a5edebb09b8ebc0269f35c60e2e963b71de9d1 b/test/integration/stagingDiscardAll/expected/repo/.git_keep/objects/39/a5edebb09b8ebc0269f35c60e2e963b71de9d1 new file mode 100644 index 000000000..f506978c5 Binary files /dev/null and b/test/integration/stagingDiscardAll/expected/repo/.git_keep/objects/39/a5edebb09b8ebc0269f35c60e2e963b71de9d1 differ diff --git a/test/integration/stagingDiscardAll/expected/repo/.git_keep/objects/bb/e897baa83fd0099ba30daf3a97edc97d8c86b5 b/test/integration/stagingDiscardAll/expected/repo/.git_keep/objects/bb/e897baa83fd0099ba30daf3a97edc97d8c86b5 new file mode 100644 index 000000000..b878ef1b2 Binary files /dev/null and b/test/integration/stagingDiscardAll/expected/repo/.git_keep/objects/bb/e897baa83fd0099ba30daf3a97edc97d8c86b5 differ diff --git a/test/integration/stagingDiscardAll/expected/repo/.git_keep/objects/bc/cb06809b2f0e67bb3d3dd22c2b95882e72cbbb b/test/integration/stagingDiscardAll/expected/repo/.git_keep/objects/bc/cb06809b2f0e67bb3d3dd22c2b95882e72cbbb new file mode 100644 index 000000000..24ceec3ca --- /dev/null +++ b/test/integration/stagingDiscardAll/expected/repo/.git_keep/objects/bc/cb06809b2f0e67bb3d3dd22c2b95882e72cbbb @@ -0,0 +1,4 @@ +xŤÍM +0†á®sŠŮĘŚ1±E +®©`H +żˇŰ—ŢTKYIßßÚŐŕ#k|"&îĽ.Ö%Ďč ŢĆA24‹ ßö©M3˝¦ůŤ3”}Ă#Ő2’x§őÖ Ý…™ÍUŻIĂźÜ,ë1?Ô,O \ No newline at end of file diff --git a/test/integration/stagingDiscardAll/expected/repo/.git_keep/refs/heads/master b/test/integration/stagingDiscardAll/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..044f5dd99 --- /dev/null +++ b/test/integration/stagingDiscardAll/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +bccb06809b2f0e67bb3d3dd22c2b95882e72cbbb diff --git a/test/integration/stagingDiscardAll/expected/repo/one.txt b/test/integration/stagingDiscardAll/expected/repo/one.txt new file mode 100644 index 000000000..158e9a9c1 --- /dev/null +++ b/test/integration/stagingDiscardAll/expected/repo/one.txt @@ -0,0 +1,63 @@ +package oscommands + +import ( + "github.com/jesseduffield/lazygit/pkg/common" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +// NewDummyOSCommand creates a new dummy OSCommand for testing +func NewDummyOSCommand() *OSCommand { + osCmd := NewOSCommand(utils.NewDummyCommon(), dummyPlatform, NewNullGuiIO(utils.NewDummyLog())) + + return osCmd +} + +type OSCommandDeps struct { + Common *common.Common + Platform *Platform + GetenvFn func(string) string + RemoveFileFn func(string) error + Cmd *CmdObjBuilder +} + +func NewDummyOSCommandWithDeps(deps OSCommandDeps) *OSCommand { + common := deps.Common + if common == nil { + common = utils.NewDummyCommon() + } + + platform := deps.Platform + if platform == nil { + platform = dummyPlatform + } + + return &OSCommand{ + Common: common, + Platform: platform, + getenvFn: deps.GetenvFn, + removeFileFn: deps.RemoveFileFn, + guiIO: NewNullGuiIO(utils.NewDummyLog()), + } +} + +func NewDummyCmdObjBuilder(runner ICmdObjRunner) *CmdObjBuilder { + return &CmdObjBuilder{ + runner: runner, + platform: dummyPlatform, + } +} + +var dummyPlatform = &Platform{ + OS: "darwin", + Shell: "bash", + ShellArg: "-c", + OpenCommand: "open {{filename}}", + OpenLinkCommand: "open {{link}}", +} + +func NewDummyOSCommandWithRunner(runner *FakeCmdObjRunner) *OSCommand { + osCommand := NewOSCommand(utils.NewDummyCommon(), dummyPlatform, NewNullGuiIO(utils.NewDummyLog())) + osCommand.Cmd = NewDummyCmdObjBuilder(runner) + + return osCommand +} diff --git a/test/integration/stagingDiscardAll/expected/repo/two.txt b/test/integration/stagingDiscardAll/expected/repo/two.txt new file mode 100644 index 000000000..c3323cfc9 --- /dev/null +++ b/test/integration/stagingDiscardAll/expected/repo/two.txt @@ -0,0 +1,67 @@ +package oscommands + +import ( + "github.com/jesseduffield/lazygit/pkg/common" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +// NewDummyOSCommand creates a new dummy OSCommand for testing +func NewDummyOSCommand() *OSCommand { + osCmd := NewOSCommand(utils.NewDummyCommon(), dummyPlatform, NewNullGuiIO(utils.NewDummyLog())) + + return osCmd +} + +type OSCommandDeps struct { + Common *common.Common + Platform *Platform + GetenvFn func(string) string + RemoveFileFn func(string) error + Cmd *CmdObjBuilder +} + +func NewDummyOSCommandWithDeps(deps OSCommandDeps) *OSCommand { + if deps.Cmd == nil { + panic("WHAT") + } + common := deps.Common + if common == nil { + common = utils.NewDummyCommon() + } + + platform := deps.Platform + if platform == nil { + platform = dummyPlatform + } + + return &OSCommand{ + Common: common, + Platform: platform, + getenvFn: deps.GetenvFn, + removeFileFn: deps.RemoveFileFn, + guiIO: NewNullGuiIO(utils.NewDummyLog()), + Cmd: deps.Cmd, + } +} + +func NewDummyCmdObjBuilder(runner ICmdObjRunner) *CmdObjBuilder { + return &CmdObjBuilder{ + runner: runner, + platform: dummyPlatform, + } +} + +var dummyPlatform = &Platform{ + OS: "darwin", + Shell: "bash", + ShellArg: "-c", + OpenCommand: "open {{filename}}", + OpenLinkCommand: "open {{link}}", +} + +func NewDummyOSCommandWithRunner(runner *FakeCmdObjRunner) *OSCommand { + osCommand := NewOSCommand(utils.NewDummyCommon(), dummyPlatform, NewNullGuiIO(utils.NewDummyLog())) + osCommand.Cmd = NewDummyCmdObjBuilder(runner) + + return osCommand +} diff --git a/test/integration/stagingDiscardAll/files/one.txt b/test/integration/stagingDiscardAll/files/one.txt new file mode 100644 index 000000000..158e9a9c1 --- /dev/null +++ b/test/integration/stagingDiscardAll/files/one.txt @@ -0,0 +1,63 @@ +package oscommands + +import ( + "github.com/jesseduffield/lazygit/pkg/common" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +// NewDummyOSCommand creates a new dummy OSCommand for testing +func NewDummyOSCommand() *OSCommand { + osCmd := NewOSCommand(utils.NewDummyCommon(), dummyPlatform, NewNullGuiIO(utils.NewDummyLog())) + + return osCmd +} + +type OSCommandDeps struct { + Common *common.Common + Platform *Platform + GetenvFn func(string) string + RemoveFileFn func(string) error + Cmd *CmdObjBuilder +} + +func NewDummyOSCommandWithDeps(deps OSCommandDeps) *OSCommand { + common := deps.Common + if common == nil { + common = utils.NewDummyCommon() + } + + platform := deps.Platform + if platform == nil { + platform = dummyPlatform + } + + return &OSCommand{ + Common: common, + Platform: platform, + getenvFn: deps.GetenvFn, + removeFileFn: deps.RemoveFileFn, + guiIO: NewNullGuiIO(utils.NewDummyLog()), + } +} + +func NewDummyCmdObjBuilder(runner ICmdObjRunner) *CmdObjBuilder { + return &CmdObjBuilder{ + runner: runner, + platform: dummyPlatform, + } +} + +var dummyPlatform = &Platform{ + OS: "darwin", + Shell: "bash", + ShellArg: "-c", + OpenCommand: "open {{filename}}", + OpenLinkCommand: "open {{link}}", +} + +func NewDummyOSCommandWithRunner(runner *FakeCmdObjRunner) *OSCommand { + osCommand := NewOSCommand(utils.NewDummyCommon(), dummyPlatform, NewNullGuiIO(utils.NewDummyLog())) + osCommand.Cmd = NewDummyCmdObjBuilder(runner) + + return osCommand +} diff --git a/test/integration/stagingDiscardAll/files/one_new.txt b/test/integration/stagingDiscardAll/files/one_new.txt new file mode 100644 index 000000000..c3323cfc9 --- /dev/null +++ b/test/integration/stagingDiscardAll/files/one_new.txt @@ -0,0 +1,67 @@ +package oscommands + +import ( + "github.com/jesseduffield/lazygit/pkg/common" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +// NewDummyOSCommand creates a new dummy OSCommand for testing +func NewDummyOSCommand() *OSCommand { + osCmd := NewOSCommand(utils.NewDummyCommon(), dummyPlatform, NewNullGuiIO(utils.NewDummyLog())) + + return osCmd +} + +type OSCommandDeps struct { + Common *common.Common + Platform *Platform + GetenvFn func(string) string + RemoveFileFn func(string) error + Cmd *CmdObjBuilder +} + +func NewDummyOSCommandWithDeps(deps OSCommandDeps) *OSCommand { + if deps.Cmd == nil { + panic("WHAT") + } + common := deps.Common + if common == nil { + common = utils.NewDummyCommon() + } + + platform := deps.Platform + if platform == nil { + platform = dummyPlatform + } + + return &OSCommand{ + Common: common, + Platform: platform, + getenvFn: deps.GetenvFn, + removeFileFn: deps.RemoveFileFn, + guiIO: NewNullGuiIO(utils.NewDummyLog()), + Cmd: deps.Cmd, + } +} + +func NewDummyCmdObjBuilder(runner ICmdObjRunner) *CmdObjBuilder { + return &CmdObjBuilder{ + runner: runner, + platform: dummyPlatform, + } +} + +var dummyPlatform = &Platform{ + OS: "darwin", + Shell: "bash", + ShellArg: "-c", + OpenCommand: "open {{filename}}", + OpenLinkCommand: "open {{link}}", +} + +func NewDummyOSCommandWithRunner(runner *FakeCmdObjRunner) *OSCommand { + osCommand := NewOSCommand(utils.NewDummyCommon(), dummyPlatform, NewNullGuiIO(utils.NewDummyLog())) + osCommand.Cmd = NewDummyCmdObjBuilder(runner) + + return osCommand +} diff --git a/test/integration/stagingDiscardAll/recording.json b/test/integration/stagingDiscardAll/recording.json new file mode 100644 index 000000000..037222739 --- /dev/null +++ b/test/integration/stagingDiscardAll/recording.json @@ -0,0 +1 @@ +{"KeyEvents":[{"Timestamp":472,"Mod":0,"Key":13,"Ch":13},{"Timestamp":720,"Mod":0,"Key":256,"Ch":97},{"Timestamp":944,"Mod":0,"Key":256,"Ch":100},{"Timestamp":1192,"Mod":0,"Key":13,"Ch":13},{"Timestamp":1494,"Mod":0,"Key":256,"Ch":100},{"Timestamp":1782,"Mod":0,"Key":13,"Ch":13},{"Timestamp":2368,"Mod":0,"Key":256,"Ch":32},{"Timestamp":3038,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":118,"Height":61}]} \ No newline at end of file diff --git a/test/integration/stagingDiscardAll/setup.sh b/test/integration/stagingDiscardAll/setup.sh new file mode 100644 index 000000000..31adabafe --- /dev/null +++ b/test/integration/stagingDiscardAll/setup.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +set -e + +cd $1 + +git init + +git config user.email "CI@example.com" +git config user.name "CI" + +cp ../../files/one.txt one.txt +cp ../../files/one.txt two.txt +git add . +git commit -am file1 + +cp ../../files/one_new.txt one.txt +cp ../../files/one_new.txt two.txt diff --git a/test/integration/stagingDiscardAll/test.json b/test/integration/stagingDiscardAll/test.json new file mode 100644 index 000000000..3b35675f6 --- /dev/null +++ b/test/integration/stagingDiscardAll/test.json @@ -0,0 +1,4 @@ +{ + "description": "Discard all changes in a file via staging panel and expect to end up in the staging panel for the next file.", + "speed": 20 +} diff --git a/test/integration/tags4/expected/.git_keep/COMMIT_EDITMSG b/test/integration/stagingEnterSecondary/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/tags4/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/stagingEnterSecondary/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/submoduleReset/expected/.git_keep/FETCH_HEAD b/test/integration/stagingEnterSecondary/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/FETCH_HEAD rename to test/integration/stagingEnterSecondary/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/stagingEnterSecondary/expected/repo/.git_keep/HEAD b/test/integration/stagingEnterSecondary/expected/repo/.git_keep/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/test/integration/stagingEnterSecondary/expected/repo/.git_keep/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/test/integration/stash_Copy/expected/.git_keep/config b/test/integration/stagingEnterSecondary/expected/repo/.git_keep/config similarity index 100% rename from test/integration/stash_Copy/expected/.git_keep/config rename to test/integration/stagingEnterSecondary/expected/repo/.git_keep/config diff --git a/test/integration/undo2/expected/.git_keep/description b/test/integration/stagingEnterSecondary/expected/repo/.git_keep/description similarity index 100% rename from test/integration/undo2/expected/.git_keep/description rename to test/integration/stagingEnterSecondary/expected/repo/.git_keep/description diff --git a/test/integration/stagingEnterSecondary/expected/repo/.git_keep/index b/test/integration/stagingEnterSecondary/expected/repo/.git_keep/index new file mode 100644 index 000000000..f3a2f5731 Binary files /dev/null and b/test/integration/stagingEnterSecondary/expected/repo/.git_keep/index differ diff --git a/test/integration/submoduleReset/expected/.git_keep/info/exclude b/test/integration/stagingEnterSecondary/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/info/exclude rename to test/integration/stagingEnterSecondary/expected/repo/.git_keep/info/exclude diff --git a/test/integration/stagingEnterSecondary/expected/repo/.git_keep/logs/HEAD b/test/integration/stagingEnterSecondary/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..82a2a1a3f --- /dev/null +++ b/test/integration/stagingEnterSecondary/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 68a4bb206023fd2396e04e1ccdf9b853cda4ac70 CI 1659736184 +1000 commit (initial): file1 diff --git a/test/integration/stagingEnterSecondary/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/stagingEnterSecondary/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..82a2a1a3f --- /dev/null +++ b/test/integration/stagingEnterSecondary/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 68a4bb206023fd2396e04e1ccdf9b853cda4ac70 CI 1659736184 +1000 commit (initial): file1 diff --git a/test/integration/stagingEnterSecondary/expected/repo/.git_keep/objects/15/8e9a9c1a9627ea0ef4de8b00a503ed0f80a09e b/test/integration/stagingEnterSecondary/expected/repo/.git_keep/objects/15/8e9a9c1a9627ea0ef4de8b00a503ed0f80a09e new file mode 100644 index 000000000..2c00719b0 Binary files /dev/null and b/test/integration/stagingEnterSecondary/expected/repo/.git_keep/objects/15/8e9a9c1a9627ea0ef4de8b00a503ed0f80a09e differ diff --git a/test/integration/stagingEnterSecondary/expected/repo/.git_keep/objects/68/a4bb206023fd2396e04e1ccdf9b853cda4ac70 b/test/integration/stagingEnterSecondary/expected/repo/.git_keep/objects/68/a4bb206023fd2396e04e1ccdf9b853cda4ac70 new file mode 100644 index 000000000..75a0d2a51 Binary files /dev/null and b/test/integration/stagingEnterSecondary/expected/repo/.git_keep/objects/68/a4bb206023fd2396e04e1ccdf9b853cda4ac70 differ diff --git a/test/integration/stagingEnterSecondary/expected/repo/.git_keep/objects/7b/9c2149f16c706cea79b03234cb67fde7e9b68f b/test/integration/stagingEnterSecondary/expected/repo/.git_keep/objects/7b/9c2149f16c706cea79b03234cb67fde7e9b68f new file mode 100644 index 000000000..611ed37a4 Binary files /dev/null and b/test/integration/stagingEnterSecondary/expected/repo/.git_keep/objects/7b/9c2149f16c706cea79b03234cb67fde7e9b68f differ diff --git a/test/integration/stagingEnterSecondary/expected/repo/.git_keep/objects/ad/92dc7671a5129b87f0f5c70c90b488ae0ceea6 b/test/integration/stagingEnterSecondary/expected/repo/.git_keep/objects/ad/92dc7671a5129b87f0f5c70c90b488ae0ceea6 new file mode 100644 index 000000000..191ffe162 Binary files /dev/null and b/test/integration/stagingEnterSecondary/expected/repo/.git_keep/objects/ad/92dc7671a5129b87f0f5c70c90b488ae0ceea6 differ diff --git a/test/integration/stagingEnterSecondary/expected/repo/.git_keep/objects/c3/323cfc94775013acea4145545f47ac1af5c9d2 b/test/integration/stagingEnterSecondary/expected/repo/.git_keep/objects/c3/323cfc94775013acea4145545f47ac1af5c9d2 new file mode 100644 index 000000000..530b393a0 Binary files /dev/null and b/test/integration/stagingEnterSecondary/expected/repo/.git_keep/objects/c3/323cfc94775013acea4145545f47ac1af5c9d2 differ diff --git a/test/integration/stagingEnterSecondary/expected/repo/.git_keep/refs/heads/master b/test/integration/stagingEnterSecondary/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..995be4311 --- /dev/null +++ b/test/integration/stagingEnterSecondary/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +68a4bb206023fd2396e04e1ccdf9b853cda4ac70 diff --git a/test/integration/stagingEnterSecondary/expected/repo/one.txt b/test/integration/stagingEnterSecondary/expected/repo/one.txt new file mode 100644 index 000000000..c3323cfc9 --- /dev/null +++ b/test/integration/stagingEnterSecondary/expected/repo/one.txt @@ -0,0 +1,67 @@ +package oscommands + +import ( + "github.com/jesseduffield/lazygit/pkg/common" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +// NewDummyOSCommand creates a new dummy OSCommand for testing +func NewDummyOSCommand() *OSCommand { + osCmd := NewOSCommand(utils.NewDummyCommon(), dummyPlatform, NewNullGuiIO(utils.NewDummyLog())) + + return osCmd +} + +type OSCommandDeps struct { + Common *common.Common + Platform *Platform + GetenvFn func(string) string + RemoveFileFn func(string) error + Cmd *CmdObjBuilder +} + +func NewDummyOSCommandWithDeps(deps OSCommandDeps) *OSCommand { + if deps.Cmd == nil { + panic("WHAT") + } + common := deps.Common + if common == nil { + common = utils.NewDummyCommon() + } + + platform := deps.Platform + if platform == nil { + platform = dummyPlatform + } + + return &OSCommand{ + Common: common, + Platform: platform, + getenvFn: deps.GetenvFn, + removeFileFn: deps.RemoveFileFn, + guiIO: NewNullGuiIO(utils.NewDummyLog()), + Cmd: deps.Cmd, + } +} + +func NewDummyCmdObjBuilder(runner ICmdObjRunner) *CmdObjBuilder { + return &CmdObjBuilder{ + runner: runner, + platform: dummyPlatform, + } +} + +var dummyPlatform = &Platform{ + OS: "darwin", + Shell: "bash", + ShellArg: "-c", + OpenCommand: "open {{filename}}", + OpenLinkCommand: "open {{link}}", +} + +func NewDummyOSCommandWithRunner(runner *FakeCmdObjRunner) *OSCommand { + osCommand := NewOSCommand(utils.NewDummyCommon(), dummyPlatform, NewNullGuiIO(utils.NewDummyLog())) + osCommand.Cmd = NewDummyCmdObjBuilder(runner) + + return osCommand +} diff --git a/test/integration/stagingEnterSecondary/files/one.txt b/test/integration/stagingEnterSecondary/files/one.txt new file mode 100644 index 000000000..158e9a9c1 --- /dev/null +++ b/test/integration/stagingEnterSecondary/files/one.txt @@ -0,0 +1,63 @@ +package oscommands + +import ( + "github.com/jesseduffield/lazygit/pkg/common" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +// NewDummyOSCommand creates a new dummy OSCommand for testing +func NewDummyOSCommand() *OSCommand { + osCmd := NewOSCommand(utils.NewDummyCommon(), dummyPlatform, NewNullGuiIO(utils.NewDummyLog())) + + return osCmd +} + +type OSCommandDeps struct { + Common *common.Common + Platform *Platform + GetenvFn func(string) string + RemoveFileFn func(string) error + Cmd *CmdObjBuilder +} + +func NewDummyOSCommandWithDeps(deps OSCommandDeps) *OSCommand { + common := deps.Common + if common == nil { + common = utils.NewDummyCommon() + } + + platform := deps.Platform + if platform == nil { + platform = dummyPlatform + } + + return &OSCommand{ + Common: common, + Platform: platform, + getenvFn: deps.GetenvFn, + removeFileFn: deps.RemoveFileFn, + guiIO: NewNullGuiIO(utils.NewDummyLog()), + } +} + +func NewDummyCmdObjBuilder(runner ICmdObjRunner) *CmdObjBuilder { + return &CmdObjBuilder{ + runner: runner, + platform: dummyPlatform, + } +} + +var dummyPlatform = &Platform{ + OS: "darwin", + Shell: "bash", + ShellArg: "-c", + OpenCommand: "open {{filename}}", + OpenLinkCommand: "open {{link}}", +} + +func NewDummyOSCommandWithRunner(runner *FakeCmdObjRunner) *OSCommand { + osCommand := NewOSCommand(utils.NewDummyCommon(), dummyPlatform, NewNullGuiIO(utils.NewDummyLog())) + osCommand.Cmd = NewDummyCmdObjBuilder(runner) + + return osCommand +} diff --git a/test/integration/stagingEnterSecondary/files/one_new.txt b/test/integration/stagingEnterSecondary/files/one_new.txt new file mode 100644 index 000000000..c3323cfc9 --- /dev/null +++ b/test/integration/stagingEnterSecondary/files/one_new.txt @@ -0,0 +1,67 @@ +package oscommands + +import ( + "github.com/jesseduffield/lazygit/pkg/common" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +// NewDummyOSCommand creates a new dummy OSCommand for testing +func NewDummyOSCommand() *OSCommand { + osCmd := NewOSCommand(utils.NewDummyCommon(), dummyPlatform, NewNullGuiIO(utils.NewDummyLog())) + + return osCmd +} + +type OSCommandDeps struct { + Common *common.Common + Platform *Platform + GetenvFn func(string) string + RemoveFileFn func(string) error + Cmd *CmdObjBuilder +} + +func NewDummyOSCommandWithDeps(deps OSCommandDeps) *OSCommand { + if deps.Cmd == nil { + panic("WHAT") + } + common := deps.Common + if common == nil { + common = utils.NewDummyCommon() + } + + platform := deps.Platform + if platform == nil { + platform = dummyPlatform + } + + return &OSCommand{ + Common: common, + Platform: platform, + getenvFn: deps.GetenvFn, + removeFileFn: deps.RemoveFileFn, + guiIO: NewNullGuiIO(utils.NewDummyLog()), + Cmd: deps.Cmd, + } +} + +func NewDummyCmdObjBuilder(runner ICmdObjRunner) *CmdObjBuilder { + return &CmdObjBuilder{ + runner: runner, + platform: dummyPlatform, + } +} + +var dummyPlatform = &Platform{ + OS: "darwin", + Shell: "bash", + ShellArg: "-c", + OpenCommand: "open {{filename}}", + OpenLinkCommand: "open {{link}}", +} + +func NewDummyOSCommandWithRunner(runner *FakeCmdObjRunner) *OSCommand { + osCommand := NewOSCommand(utils.NewDummyCommon(), dummyPlatform, NewNullGuiIO(utils.NewDummyLog())) + osCommand.Cmd = NewDummyCmdObjBuilder(runner) + + return osCommand +} diff --git a/test/integration/stagingEnterSecondary/recording.json b/test/integration/stagingEnterSecondary/recording.json new file mode 100644 index 000000000..8bac345be --- /dev/null +++ b/test/integration/stagingEnterSecondary/recording.json @@ -0,0 +1 @@ +{"KeyEvents":[{"Timestamp":704,"Mod":0,"Key":256,"Ch":32},{"Timestamp":1719,"Mod":0,"Key":13,"Ch":13},{"Timestamp":3183,"Mod":0,"Key":256,"Ch":118},{"Timestamp":3504,"Mod":0,"Key":258,"Ch":0},{"Timestamp":3976,"Mod":0,"Key":256,"Ch":32},{"Timestamp":4944,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":118,"Height":61}]} \ No newline at end of file diff --git a/test/integration/stagingEnterSecondary/setup.sh b/test/integration/stagingEnterSecondary/setup.sh new file mode 100644 index 000000000..9b1f6fb8c --- /dev/null +++ b/test/integration/stagingEnterSecondary/setup.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +set -e + +cd $1 + +git init + +git config user.email "CI@example.com" +git config user.name "CI" + +cp ../../files/one.txt one.txt +git add . +git commit -am file1 + +cp ../../files/one_new.txt one.txt diff --git a/test/integration/stagingEnterSecondary/test.json b/test/integration/stagingEnterSecondary/test.json new file mode 100644 index 000000000..03bdc4b46 --- /dev/null +++ b/test/integration/stagingEnterSecondary/test.json @@ -0,0 +1,4 @@ +{ + "description": "Hit enter on a fully staged file to end up in the secondary staging panel.", + "speed": 20 +} diff --git a/test/integration/stagingForcedToggle/expected/repo/.git_keep/COMMIT_EDITMSG b/test/integration/stagingForcedToggle/expected/repo/.git_keep/COMMIT_EDITMSG new file mode 100644 index 000000000..e2129701f --- /dev/null +++ b/test/integration/stagingForcedToggle/expected/repo/.git_keep/COMMIT_EDITMSG @@ -0,0 +1 @@ +file1 diff --git a/test/integration/switchTabFromMenu/expected/.git_keep/FETCH_HEAD b/test/integration/stagingForcedToggle/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/switchTabFromMenu/expected/.git_keep/FETCH_HEAD rename to test/integration/stagingForcedToggle/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/stagingForcedToggle/expected/repo/.git_keep/HEAD b/test/integration/stagingForcedToggle/expected/repo/.git_keep/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/test/integration/stagingForcedToggle/expected/repo/.git_keep/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/test/integration/submoduleRemove/expected/.git_keep/config b/test/integration/stagingForcedToggle/expected/repo/.git_keep/config similarity index 100% rename from test/integration/submoduleRemove/expected/.git_keep/config rename to test/integration/stagingForcedToggle/expected/repo/.git_keep/config diff --git a/test/integration/stagingForcedToggle/expected/repo/.git_keep/description b/test/integration/stagingForcedToggle/expected/repo/.git_keep/description new file mode 100644 index 000000000..498b267a8 --- /dev/null +++ b/test/integration/stagingForcedToggle/expected/repo/.git_keep/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/integration/stagingForcedToggle/expected/repo/.git_keep/index b/test/integration/stagingForcedToggle/expected/repo/.git_keep/index new file mode 100644 index 000000000..5f7e35196 Binary files /dev/null and b/test/integration/stagingForcedToggle/expected/repo/.git_keep/index differ diff --git a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/info/exclude b/test/integration/stagingForcedToggle/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/modules/other_repo/info/exclude rename to test/integration/stagingForcedToggle/expected/repo/.git_keep/info/exclude diff --git a/test/integration/stagingForcedToggle/expected/repo/.git_keep/logs/HEAD b/test/integration/stagingForcedToggle/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..e60ea548f --- /dev/null +++ b/test/integration/stagingForcedToggle/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 de59eafcc9bdb8fe9080f70e5252936832b13afe CI 1659736228 +1000 commit (initial): file1 diff --git a/test/integration/stagingForcedToggle/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/stagingForcedToggle/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..e60ea548f --- /dev/null +++ b/test/integration/stagingForcedToggle/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 de59eafcc9bdb8fe9080f70e5252936832b13afe CI 1659736228 +1000 commit (initial): file1 diff --git a/test/integration/stagingForcedToggle/expected/repo/.git_keep/objects/15/8e9a9c1a9627ea0ef4de8b00a503ed0f80a09e b/test/integration/stagingForcedToggle/expected/repo/.git_keep/objects/15/8e9a9c1a9627ea0ef4de8b00a503ed0f80a09e new file mode 100644 index 000000000..2c00719b0 Binary files /dev/null and b/test/integration/stagingForcedToggle/expected/repo/.git_keep/objects/15/8e9a9c1a9627ea0ef4de8b00a503ed0f80a09e differ diff --git a/test/integration/stagingForcedToggle/expected/repo/.git_keep/objects/7b/9c2149f16c706cea79b03234cb67fde7e9b68f b/test/integration/stagingForcedToggle/expected/repo/.git_keep/objects/7b/9c2149f16c706cea79b03234cb67fde7e9b68f new file mode 100644 index 000000000..611ed37a4 Binary files /dev/null and b/test/integration/stagingForcedToggle/expected/repo/.git_keep/objects/7b/9c2149f16c706cea79b03234cb67fde7e9b68f differ diff --git a/test/integration/stagingForcedToggle/expected/repo/.git_keep/objects/80/b489d1f5a71c3e46c7e1a82fe264ffb0a4726f b/test/integration/stagingForcedToggle/expected/repo/.git_keep/objects/80/b489d1f5a71c3e46c7e1a82fe264ffb0a4726f new file mode 100644 index 000000000..992d06341 Binary files /dev/null and b/test/integration/stagingForcedToggle/expected/repo/.git_keep/objects/80/b489d1f5a71c3e46c7e1a82fe264ffb0a4726f differ diff --git a/test/integration/stagingForcedToggle/expected/repo/.git_keep/objects/bb/e897baa83fd0099ba30daf3a97edc97d8c86b5 b/test/integration/stagingForcedToggle/expected/repo/.git_keep/objects/bb/e897baa83fd0099ba30daf3a97edc97d8c86b5 new file mode 100644 index 000000000..b878ef1b2 Binary files /dev/null and b/test/integration/stagingForcedToggle/expected/repo/.git_keep/objects/bb/e897baa83fd0099ba30daf3a97edc97d8c86b5 differ diff --git a/test/integration/stagingForcedToggle/expected/repo/.git_keep/objects/c3/323cfc94775013acea4145545f47ac1af5c9d2 b/test/integration/stagingForcedToggle/expected/repo/.git_keep/objects/c3/323cfc94775013acea4145545f47ac1af5c9d2 new file mode 100644 index 000000000..530b393a0 Binary files /dev/null and b/test/integration/stagingForcedToggle/expected/repo/.git_keep/objects/c3/323cfc94775013acea4145545f47ac1af5c9d2 differ diff --git a/test/integration/stagingForcedToggle/expected/repo/.git_keep/objects/de/59eafcc9bdb8fe9080f70e5252936832b13afe b/test/integration/stagingForcedToggle/expected/repo/.git_keep/objects/de/59eafcc9bdb8fe9080f70e5252936832b13afe new file mode 100644 index 000000000..1aa8bed57 Binary files /dev/null and b/test/integration/stagingForcedToggle/expected/repo/.git_keep/objects/de/59eafcc9bdb8fe9080f70e5252936832b13afe differ diff --git a/test/integration/stagingForcedToggle/expected/repo/.git_keep/refs/heads/master b/test/integration/stagingForcedToggle/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..c9e76c463 --- /dev/null +++ b/test/integration/stagingForcedToggle/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +de59eafcc9bdb8fe9080f70e5252936832b13afe diff --git a/test/integration/stagingForcedToggle/expected/repo/one.txt b/test/integration/stagingForcedToggle/expected/repo/one.txt new file mode 100644 index 000000000..c3323cfc9 --- /dev/null +++ b/test/integration/stagingForcedToggle/expected/repo/one.txt @@ -0,0 +1,67 @@ +package oscommands + +import ( + "github.com/jesseduffield/lazygit/pkg/common" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +// NewDummyOSCommand creates a new dummy OSCommand for testing +func NewDummyOSCommand() *OSCommand { + osCmd := NewOSCommand(utils.NewDummyCommon(), dummyPlatform, NewNullGuiIO(utils.NewDummyLog())) + + return osCmd +} + +type OSCommandDeps struct { + Common *common.Common + Platform *Platform + GetenvFn func(string) string + RemoveFileFn func(string) error + Cmd *CmdObjBuilder +} + +func NewDummyOSCommandWithDeps(deps OSCommandDeps) *OSCommand { + if deps.Cmd == nil { + panic("WHAT") + } + common := deps.Common + if common == nil { + common = utils.NewDummyCommon() + } + + platform := deps.Platform + if platform == nil { + platform = dummyPlatform + } + + return &OSCommand{ + Common: common, + Platform: platform, + getenvFn: deps.GetenvFn, + removeFileFn: deps.RemoveFileFn, + guiIO: NewNullGuiIO(utils.NewDummyLog()), + Cmd: deps.Cmd, + } +} + +func NewDummyCmdObjBuilder(runner ICmdObjRunner) *CmdObjBuilder { + return &CmdObjBuilder{ + runner: runner, + platform: dummyPlatform, + } +} + +var dummyPlatform = &Platform{ + OS: "darwin", + Shell: "bash", + ShellArg: "-c", + OpenCommand: "open {{filename}}", + OpenLinkCommand: "open {{link}}", +} + +func NewDummyOSCommandWithRunner(runner *FakeCmdObjRunner) *OSCommand { + osCommand := NewOSCommand(utils.NewDummyCommon(), dummyPlatform, NewNullGuiIO(utils.NewDummyLog())) + osCommand.Cmd = NewDummyCmdObjBuilder(runner) + + return osCommand +} diff --git a/test/integration/stagingForcedToggle/files/one.txt b/test/integration/stagingForcedToggle/files/one.txt new file mode 100644 index 000000000..158e9a9c1 --- /dev/null +++ b/test/integration/stagingForcedToggle/files/one.txt @@ -0,0 +1,63 @@ +package oscommands + +import ( + "github.com/jesseduffield/lazygit/pkg/common" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +// NewDummyOSCommand creates a new dummy OSCommand for testing +func NewDummyOSCommand() *OSCommand { + osCmd := NewOSCommand(utils.NewDummyCommon(), dummyPlatform, NewNullGuiIO(utils.NewDummyLog())) + + return osCmd +} + +type OSCommandDeps struct { + Common *common.Common + Platform *Platform + GetenvFn func(string) string + RemoveFileFn func(string) error + Cmd *CmdObjBuilder +} + +func NewDummyOSCommandWithDeps(deps OSCommandDeps) *OSCommand { + common := deps.Common + if common == nil { + common = utils.NewDummyCommon() + } + + platform := deps.Platform + if platform == nil { + platform = dummyPlatform + } + + return &OSCommand{ + Common: common, + Platform: platform, + getenvFn: deps.GetenvFn, + removeFileFn: deps.RemoveFileFn, + guiIO: NewNullGuiIO(utils.NewDummyLog()), + } +} + +func NewDummyCmdObjBuilder(runner ICmdObjRunner) *CmdObjBuilder { + return &CmdObjBuilder{ + runner: runner, + platform: dummyPlatform, + } +} + +var dummyPlatform = &Platform{ + OS: "darwin", + Shell: "bash", + ShellArg: "-c", + OpenCommand: "open {{filename}}", + OpenLinkCommand: "open {{link}}", +} + +func NewDummyOSCommandWithRunner(runner *FakeCmdObjRunner) *OSCommand { + osCommand := NewOSCommand(utils.NewDummyCommon(), dummyPlatform, NewNullGuiIO(utils.NewDummyLog())) + osCommand.Cmd = NewDummyCmdObjBuilder(runner) + + return osCommand +} diff --git a/test/integration/stagingForcedToggle/files/one_new.txt b/test/integration/stagingForcedToggle/files/one_new.txt new file mode 100644 index 000000000..c3323cfc9 --- /dev/null +++ b/test/integration/stagingForcedToggle/files/one_new.txt @@ -0,0 +1,67 @@ +package oscommands + +import ( + "github.com/jesseduffield/lazygit/pkg/common" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +// NewDummyOSCommand creates a new dummy OSCommand for testing +func NewDummyOSCommand() *OSCommand { + osCmd := NewOSCommand(utils.NewDummyCommon(), dummyPlatform, NewNullGuiIO(utils.NewDummyLog())) + + return osCmd +} + +type OSCommandDeps struct { + Common *common.Common + Platform *Platform + GetenvFn func(string) string + RemoveFileFn func(string) error + Cmd *CmdObjBuilder +} + +func NewDummyOSCommandWithDeps(deps OSCommandDeps) *OSCommand { + if deps.Cmd == nil { + panic("WHAT") + } + common := deps.Common + if common == nil { + common = utils.NewDummyCommon() + } + + platform := deps.Platform + if platform == nil { + platform = dummyPlatform + } + + return &OSCommand{ + Common: common, + Platform: platform, + getenvFn: deps.GetenvFn, + removeFileFn: deps.RemoveFileFn, + guiIO: NewNullGuiIO(utils.NewDummyLog()), + Cmd: deps.Cmd, + } +} + +func NewDummyCmdObjBuilder(runner ICmdObjRunner) *CmdObjBuilder { + return &CmdObjBuilder{ + runner: runner, + platform: dummyPlatform, + } +} + +var dummyPlatform = &Platform{ + OS: "darwin", + Shell: "bash", + ShellArg: "-c", + OpenCommand: "open {{filename}}", + OpenLinkCommand: "open {{link}}", +} + +func NewDummyOSCommandWithRunner(runner *FakeCmdObjRunner) *OSCommand { + osCommand := NewOSCommand(utils.NewDummyCommon(), dummyPlatform, NewNullGuiIO(utils.NewDummyLog())) + osCommand.Cmd = NewDummyCmdObjBuilder(runner) + + return osCommand +} diff --git a/test/integration/stagingForcedToggle/recording.json b/test/integration/stagingForcedToggle/recording.json new file mode 100644 index 000000000..11e83b51c --- /dev/null +++ b/test/integration/stagingForcedToggle/recording.json @@ -0,0 +1 @@ +{"KeyEvents":[{"Timestamp":508,"Mod":0,"Key":13,"Ch":13},{"Timestamp":804,"Mod":0,"Key":256,"Ch":97},{"Timestamp":1094,"Mod":0,"Key":256,"Ch":32},{"Timestamp":1429,"Mod":0,"Key":256,"Ch":32},{"Timestamp":2398,"Mod":0,"Key":256,"Ch":32},{"Timestamp":3060,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":118,"Height":61}]} \ No newline at end of file diff --git a/test/integration/stagingForcedToggle/setup.sh b/test/integration/stagingForcedToggle/setup.sh new file mode 100644 index 000000000..9b1f6fb8c --- /dev/null +++ b/test/integration/stagingForcedToggle/setup.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +set -e + +cd $1 + +git init + +git config user.email "CI@example.com" +git config user.name "CI" + +cp ../../files/one.txt one.txt +git add . +git commit -am file1 + +cp ../../files/one_new.txt one.txt diff --git a/test/integration/stagingForcedToggle/test.json b/test/integration/stagingForcedToggle/test.json new file mode 100644 index 000000000..1f59de864 --- /dev/null +++ b/test/integration/stagingForcedToggle/test.json @@ -0,0 +1,4 @@ +{ + "description": "stage everything in a file so that you're forced to switch focus to the secondary panel", + "speed": 20 +} diff --git a/test/integration/stagingTwo/expected/.git_keep/index b/test/integration/stagingTwo/expected/.git_keep/index deleted file mode 100644 index 04a93cbaf..000000000 Binary files a/test/integration/stagingTwo/expected/.git_keep/index and /dev/null differ diff --git a/test/integration/stagingTwo/expected/.git_keep/logs/HEAD b/test/integration/stagingTwo/expected/.git_keep/logs/HEAD deleted file mode 100644 index 3e79e936b..000000000 --- a/test/integration/stagingTwo/expected/.git_keep/logs/HEAD +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 f793cf3fd99464dbd3499093e95197229b771b11 CI 1642495374 +1100 commit (initial): file1 diff --git a/test/integration/stagingTwo/expected/.git_keep/logs/refs/heads/master b/test/integration/stagingTwo/expected/.git_keep/logs/refs/heads/master deleted file mode 100644 index 3e79e936b..000000000 --- a/test/integration/stagingTwo/expected/.git_keep/logs/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 f793cf3fd99464dbd3499093e95197229b771b11 CI 1642495374 +1100 commit (initial): file1 diff --git a/test/integration/stagingTwo/expected/.git_keep/objects/f7/93cf3fd99464dbd3499093e95197229b771b11 b/test/integration/stagingTwo/expected/.git_keep/objects/f7/93cf3fd99464dbd3499093e95197229b771b11 deleted file mode 100644 index 85ed192ae..000000000 Binary files a/test/integration/stagingTwo/expected/.git_keep/objects/f7/93cf3fd99464dbd3499093e95197229b771b11 and /dev/null differ diff --git a/test/integration/stagingTwo/expected/.git_keep/refs/heads/master b/test/integration/stagingTwo/expected/.git_keep/refs/heads/master deleted file mode 100644 index 32457d556..000000000 --- a/test/integration/stagingTwo/expected/.git_keep/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -f793cf3fd99464dbd3499093e95197229b771b11 diff --git a/test/integration/stagingTwo/recording.json b/test/integration/stagingTwo/recording.json deleted file mode 100644 index c089a5783..000000000 --- a/test/integration/stagingTwo/recording.json +++ /dev/null @@ -1 +0,0 @@ -{"KeyEvents":[{"Timestamp":843,"Mod":0,"Key":13,"Ch":13},{"Timestamp":1122,"Mod":0,"Key":256,"Ch":118},{"Timestamp":1266,"Mod":0,"Key":258,"Ch":0},{"Timestamp":1386,"Mod":0,"Key":258,"Ch":0},{"Timestamp":1602,"Mod":0,"Key":256,"Ch":100},{"Timestamp":1851,"Mod":0,"Key":13,"Ch":13},{"Timestamp":2520,"Mod":0,"Key":27,"Ch":0},{"Timestamp":3195,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":272,"Height":74}]} \ No newline at end of file diff --git a/test/integration/stagingTwo/setup.sh b/test/integration/stagingTwo/setup.sh deleted file mode 100644 index ac450f8d2..000000000 --- a/test/integration/stagingTwo/setup.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh - -set -e - -cd $1 - -git init - -git config user.email "CI@example.com" -git config user.name "CI" - -cp ../files/one.txt one.txt -git add . -git commit -am file1 - -cp ../files/one_new.txt one.txt diff --git a/test/integration/stagingTwo/test.json b/test/integration/stagingTwo/test.json deleted file mode 100644 index 023d766c4..000000000 --- a/test/integration/stagingTwo/test.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "description": "Some more line-by-line staging", - "speed": 20 -} diff --git a/test/integration/stash/expected/.git_keep/ORIG_HEAD b/test/integration/stash/expected/.git_keep/ORIG_HEAD deleted file mode 100644 index 78e4eb58e..000000000 --- a/test/integration/stash/expected/.git_keep/ORIG_HEAD +++ /dev/null @@ -1 +0,0 @@ -f348ff60bdbb3695f2f519db6bc115b1b8d50886 diff --git a/test/integration/stash/expected/.git_keep/index b/test/integration/stash/expected/.git_keep/index deleted file mode 100644 index daebfa4ef..000000000 Binary files a/test/integration/stash/expected/.git_keep/index and /dev/null differ diff --git a/test/integration/stash/expected/.git_keep/logs/HEAD b/test/integration/stash/expected/.git_keep/logs/HEAD deleted file mode 100644 index f95cf06ac..000000000 --- a/test/integration/stash/expected/.git_keep/logs/HEAD +++ /dev/null @@ -1,6 +0,0 @@ -0000000000000000000000000000000000000000 a7dde526f2e93ffa08897fbfca2c98ce40a8fa5b CI 1643011553 +1100 commit (initial): file0 -a7dde526f2e93ffa08897fbfca2c98ce40a8fa5b 4cc838ea1466afc5be1d3bc3e7a937641ec84d7d CI 1643011553 +1100 commit: file1 -4cc838ea1466afc5be1d3bc3e7a937641ec84d7d f348ff60bdbb3695f2f519db6bc115b1b8d50886 CI 1643011553 +1100 commit: file2 -f348ff60bdbb3695f2f519db6bc115b1b8d50886 f348ff60bdbb3695f2f519db6bc115b1b8d50886 CI 1643011556 +1100 reset: moving to HEAD -f348ff60bdbb3695f2f519db6bc115b1b8d50886 f348ff60bdbb3695f2f519db6bc115b1b8d50886 CI 1643011556 +1100 reset: moving to HEAD -f348ff60bdbb3695f2f519db6bc115b1b8d50886 f348ff60bdbb3695f2f519db6bc115b1b8d50886 CI 1643011558 +1100 reset: moving to HEAD diff --git a/test/integration/stash/expected/.git_keep/logs/refs/heads/master b/test/integration/stash/expected/.git_keep/logs/refs/heads/master deleted file mode 100644 index d1bf421f8..000000000 --- a/test/integration/stash/expected/.git_keep/logs/refs/heads/master +++ /dev/null @@ -1,3 +0,0 @@ -0000000000000000000000000000000000000000 a7dde526f2e93ffa08897fbfca2c98ce40a8fa5b CI 1643011553 +1100 commit (initial): file0 -a7dde526f2e93ffa08897fbfca2c98ce40a8fa5b 4cc838ea1466afc5be1d3bc3e7a937641ec84d7d CI 1643011553 +1100 commit: file1 -4cc838ea1466afc5be1d3bc3e7a937641ec84d7d f348ff60bdbb3695f2f519db6bc115b1b8d50886 CI 1643011553 +1100 commit: file2 diff --git a/test/integration/stash/expected/.git_keep/logs/refs/stash b/test/integration/stash/expected/.git_keep/logs/refs/stash deleted file mode 100644 index 3f07cf22e..000000000 --- a/test/integration/stash/expected/.git_keep/logs/refs/stash +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 e09b4dfcd66bfa1c81feeaf67e04d55368a2b065 CI 1643011556 +1100 On master: asd -e09b4dfcd66bfa1c81feeaf67e04d55368a2b065 2efac8148440778cbddcd80ac7477981277dcffe CI 1643011558 +1100 On master: asd diff --git a/test/integration/stash/expected/.git_keep/objects/25/abc3e66a6aa505fb0a2ceb6ad5cda0cc89ecbc b/test/integration/stash/expected/.git_keep/objects/25/abc3e66a6aa505fb0a2ceb6ad5cda0cc89ecbc deleted file mode 100644 index aab767a08..000000000 Binary files a/test/integration/stash/expected/.git_keep/objects/25/abc3e66a6aa505fb0a2ceb6ad5cda0cc89ecbc and /dev/null differ diff --git a/test/integration/stash/expected/.git_keep/objects/2e/fac8148440778cbddcd80ac7477981277dcffe b/test/integration/stash/expected/.git_keep/objects/2e/fac8148440778cbddcd80ac7477981277dcffe deleted file mode 100644 index 54545b630..000000000 --- a/test/integration/stash/expected/.git_keep/objects/2e/fac8148440778cbddcd80ac7477981277dcffe +++ /dev/null @@ -1 +0,0 @@ -xŤĎAj1 …á®çÚŠě±4v)%UV=$Ë´PgÂÄ…żŢtßíăă‡g{ďźbĘOăp‡ŇâF[`ÎX,–`L ˶eQMlÍ,y´ĺ.‡ß´5ĺֵޮ\¨ĹFˇTeµHćJ3˙ůH˘¶:ł°!5E‰ćĘRÉę [.nj‹|ŹŹý€Ë^/׳˙Hżůłíý §gť2śB@\ć:O ˙'_ŢoĐĺ1ý ČŁţ—Kż \ No newline at end of file diff --git a/test/integration/stash/expected/.git_keep/objects/3b/29b35d4357f8e64cafd95140a70d7c9b25138a b/test/integration/stash/expected/.git_keep/objects/3b/29b35d4357f8e64cafd95140a70d7c9b25138a deleted file mode 100644 index 1b8805172..000000000 Binary files a/test/integration/stash/expected/.git_keep/objects/3b/29b35d4357f8e64cafd95140a70d7c9b25138a and /dev/null differ diff --git a/test/integration/stash/expected/.git_keep/objects/4c/c838ea1466afc5be1d3bc3e7a937641ec84d7d b/test/integration/stash/expected/.git_keep/objects/4c/c838ea1466afc5be1d3bc3e7a937641ec84d7d deleted file mode 100644 index bc099c320..000000000 Binary files a/test/integration/stash/expected/.git_keep/objects/4c/c838ea1466afc5be1d3bc3e7a937641ec84d7d and /dev/null differ diff --git a/test/integration/stash/expected/.git_keep/objects/9f/2757166809c291c65f09778abb46cfcc4e4a0c b/test/integration/stash/expected/.git_keep/objects/9f/2757166809c291c65f09778abb46cfcc4e4a0c deleted file mode 100644 index 539f97919..000000000 Binary files a/test/integration/stash/expected/.git_keep/objects/9f/2757166809c291c65f09778abb46cfcc4e4a0c and /dev/null differ diff --git a/test/integration/stash/expected/.git_keep/objects/a6/ada9f3d895e751ec289c69913a02146c0ca844 b/test/integration/stash/expected/.git_keep/objects/a6/ada9f3d895e751ec289c69913a02146c0ca844 deleted file mode 100644 index 0cdd88ea0..000000000 Binary files a/test/integration/stash/expected/.git_keep/objects/a6/ada9f3d895e751ec289c69913a02146c0ca844 and /dev/null differ diff --git a/test/integration/stash/expected/.git_keep/objects/a7/dde526f2e93ffa08897fbfca2c98ce40a8fa5b b/test/integration/stash/expected/.git_keep/objects/a7/dde526f2e93ffa08897fbfca2c98ce40a8fa5b deleted file mode 100644 index 9dcd075d6..000000000 Binary files a/test/integration/stash/expected/.git_keep/objects/a7/dde526f2e93ffa08897fbfca2c98ce40a8fa5b and /dev/null differ diff --git a/test/integration/stash/expected/.git_keep/objects/e0/9b4dfcd66bfa1c81feeaf67e04d55368a2b065 b/test/integration/stash/expected/.git_keep/objects/e0/9b4dfcd66bfa1c81feeaf67e04d55368a2b065 deleted file mode 100644 index f57ce417b..000000000 Binary files a/test/integration/stash/expected/.git_keep/objects/e0/9b4dfcd66bfa1c81feeaf67e04d55368a2b065 and /dev/null differ diff --git a/test/integration/stash/expected/.git_keep/objects/f3/48ff60bdbb3695f2f519db6bc115b1b8d50886 b/test/integration/stash/expected/.git_keep/objects/f3/48ff60bdbb3695f2f519db6bc115b1b8d50886 deleted file mode 100644 index 8faee1fcd..000000000 Binary files a/test/integration/stash/expected/.git_keep/objects/f3/48ff60bdbb3695f2f519db6bc115b1b8d50886 and /dev/null differ diff --git a/test/integration/stash/expected/.git_keep/refs/heads/master b/test/integration/stash/expected/.git_keep/refs/heads/master deleted file mode 100644 index 78e4eb58e..000000000 --- a/test/integration/stash/expected/.git_keep/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -f348ff60bdbb3695f2f519db6bc115b1b8d50886 diff --git a/test/integration/stash/expected/.git_keep/refs/stash b/test/integration/stash/expected/.git_keep/refs/stash deleted file mode 100644 index 9123248e5..000000000 --- a/test/integration/stash/expected/.git_keep/refs/stash +++ /dev/null @@ -1 +0,0 @@ -2efac8148440778cbddcd80ac7477981277dcffe diff --git a/test/integration/stash/expected/.git_keep/COMMIT_EDITMSG b/test/integration/stash/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/stash/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/stash/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/tags/expected/.git_keep/FETCH_HEAD b/test/integration/stash/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/tags/expected/.git_keep/FETCH_HEAD rename to test/integration/stash/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/stash/expected/repo/.git_keep/HEAD b/test/integration/stash/expected/repo/.git_keep/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/test/integration/stash/expected/repo/.git_keep/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/test/integration/stash/expected/repo/.git_keep/ORIG_HEAD b/test/integration/stash/expected/repo/.git_keep/ORIG_HEAD new file mode 100644 index 000000000..70b2d64a5 --- /dev/null +++ b/test/integration/stash/expected/repo/.git_keep/ORIG_HEAD @@ -0,0 +1 @@ +6b1f87e5b74cd77d755d213e0850f4de02b3cdce diff --git a/test/integration/stash/expected/repo/.git_keep/config b/test/integration/stash/expected/repo/.git_keep/config new file mode 100644 index 000000000..596ebaeb3 --- /dev/null +++ b/test/integration/stash/expected/repo/.git_keep/config @@ -0,0 +1,8 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[user] + email = CI@example.com + name = CI diff --git a/test/integration/stash/expected/repo/.git_keep/description b/test/integration/stash/expected/repo/.git_keep/description new file mode 100644 index 000000000..498b267a8 --- /dev/null +++ b/test/integration/stash/expected/repo/.git_keep/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/integration/stash/expected/repo/.git_keep/index b/test/integration/stash/expected/repo/.git_keep/index new file mode 100644 index 000000000..1e08e2596 Binary files /dev/null and b/test/integration/stash/expected/repo/.git_keep/index differ diff --git a/test/integration/stash/expected/repo/.git_keep/info/exclude b/test/integration/stash/expected/repo/.git_keep/info/exclude new file mode 100644 index 000000000..a5196d1be --- /dev/null +++ b/test/integration/stash/expected/repo/.git_keep/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/test/integration/stash/expected/repo/.git_keep/logs/HEAD b/test/integration/stash/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..d7185f04d --- /dev/null +++ b/test/integration/stash/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,5 @@ +0000000000000000000000000000000000000000 8c3123f6f4cee663b57398072df088c6f2dfeb9b CI 1650002552 +0200 commit (initial): file0 +8c3123f6f4cee663b57398072df088c6f2dfeb9b f7114350b59290905115d7918efe144eb2c62a76 CI 1650002552 +0200 commit: file1 +f7114350b59290905115d7918efe144eb2c62a76 6b1f87e5b74cd77d755d213e0850f4de02b3cdce CI 1650002552 +0200 commit: file2 +6b1f87e5b74cd77d755d213e0850f4de02b3cdce 6b1f87e5b74cd77d755d213e0850f4de02b3cdce CI 1650002559 +0200 reset: moving to HEAD +6b1f87e5b74cd77d755d213e0850f4de02b3cdce 6b1f87e5b74cd77d755d213e0850f4de02b3cdce CI 1650002567 +0200 reset: moving to HEAD diff --git a/test/integration/stash/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/stash/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..cacae4d5c --- /dev/null +++ b/test/integration/stash/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 8c3123f6f4cee663b57398072df088c6f2dfeb9b CI 1650002552 +0200 commit (initial): file0 +8c3123f6f4cee663b57398072df088c6f2dfeb9b f7114350b59290905115d7918efe144eb2c62a76 CI 1650002552 +0200 commit: file1 +f7114350b59290905115d7918efe144eb2c62a76 6b1f87e5b74cd77d755d213e0850f4de02b3cdce CI 1650002552 +0200 commit: file2 diff --git a/test/integration/stash/expected/repo/.git_keep/logs/refs/stash b/test/integration/stash/expected/repo/.git_keep/logs/refs/stash new file mode 100644 index 000000000..bcf0a385b --- /dev/null +++ b/test/integration/stash/expected/repo/.git_keep/logs/refs/stash @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 be485112173592dea7b39c7efc3a6f52f43b71b9 CI 1650002559 +0200 On master: asd diff --git a/test/integration/tags2/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/stash/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/tags2/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/stash/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/reflogHardReset/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/stash/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/stash/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/reflogHardReset/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/stash/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/reflogHardReset/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/stash/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/stash/expected/repo/.git_keep/objects/4f/9ff661c6c81b54d631d6d7c71399972e5c7a58 b/test/integration/stash/expected/repo/.git_keep/objects/4f/9ff661c6c81b54d631d6d7c71399972e5c7a58 new file mode 100644 index 000000000..258a8ab01 --- /dev/null +++ b/test/integration/stash/expected/repo/.git_keep/objects/4f/9ff661c6c81b54d631d6d7c71399972e5c7a58 @@ -0,0 +1,2 @@ +xŤŽK +1D]罤“I§Ł®0“aŚŕńÍƽۢęŐK­ÖąŃĽë›x‰X\r6K068o%•#ůcd-evÁ©5l˛tpQĎB‘mĘĚ™‰˛Ń“ ',‚&N)'QáÝmŰηűU>ˇ®O9¤V/ !˘!ǰÇqŞF:¤şüYWó’ĺm^cuúYA™źbÔ©aAň \ No newline at end of file diff --git a/test/integration/stashDrop/expected/.git_keep/objects/5c/ef9afea6a37d89f925e24ebf71adecb63d1f07 b/test/integration/stash/expected/repo/.git_keep/objects/5c/ef9afea6a37d89f925e24ebf71adecb63d1f07 similarity index 100% rename from test/integration/stashDrop/expected/.git_keep/objects/5c/ef9afea6a37d89f925e24ebf71adecb63d1f07 rename to test/integration/stash/expected/repo/.git_keep/objects/5c/ef9afea6a37d89f925e24ebf71adecb63d1f07 diff --git a/test/integration/stashDrop/expected/.git_keep/objects/66/bbc809cdafd867cf9320bfb7484bb8fa898448 b/test/integration/stash/expected/repo/.git_keep/objects/66/bbc809cdafd867cf9320bfb7484bb8fa898448 similarity index 100% rename from test/integration/stashDrop/expected/.git_keep/objects/66/bbc809cdafd867cf9320bfb7484bb8fa898448 rename to test/integration/stash/expected/repo/.git_keep/objects/66/bbc809cdafd867cf9320bfb7484bb8fa898448 diff --git a/test/integration/stash/expected/repo/.git_keep/objects/6b/1f87e5b74cd77d755d213e0850f4de02b3cdce b/test/integration/stash/expected/repo/.git_keep/objects/6b/1f87e5b74cd77d755d213e0850f4de02b3cdce new file mode 100644 index 000000000..51688c4dc Binary files /dev/null and b/test/integration/stash/expected/repo/.git_keep/objects/6b/1f87e5b74cd77d755d213e0850f4de02b3cdce differ diff --git a/test/integration/stash/expected/repo/.git_keep/objects/81/f9f45d5eca6c23bf25b4a53172bcfb5ceb3963 b/test/integration/stash/expected/repo/.git_keep/objects/81/f9f45d5eca6c23bf25b4a53172bcfb5ceb3963 new file mode 100644 index 000000000..b2cb857d0 --- /dev/null +++ b/test/integration/stash/expected/repo/.git_keep/objects/81/f9f45d5eca6c23bf25b4a53172bcfb5ceb3963 @@ -0,0 +1,2 @@ +xŤŽË +Â0E]ç+f/Č$Íc*"BWýŚ<&X0M©úůfăŢíąç‰µ”Ą’îÔvf°6„H8Ćäs"ëb…!§I‡@ŮÓHZ“ŘüÎkd&Ǧď19—ś1IÉ‘ fťUbŠ,ü§=ëÓ ·i~đáËöâK¬ĺŇDTĆŚpF…(:íQŤ˙ÔŲ&> ®Pü»ż®ż*ČË‹•ř»Bf \ No newline at end of file diff --git a/test/integration/stash/expected/repo/.git_keep/objects/8c/3123f6f4cee663b57398072df088c6f2dfeb9b b/test/integration/stash/expected/repo/.git_keep/objects/8c/3123f6f4cee663b57398072df088c6f2dfeb9b new file mode 100644 index 000000000..0ae4c30f4 --- /dev/null +++ b/test/integration/stash/expected/repo/.git_keep/objects/8c/3123f6f4cee663b57398072df088c6f2dfeb9b @@ -0,0 +1,3 @@ +xŤÍA +Â0Fa×9Ĺ왌“Ô€ĐUŹ‘4°Đ)züönĽąŐşt˛Ş—ľdq‡R!'ëłř‘Š–”‹hPýÓ6'zŽÓ{¬ß·ąŐYďYśş˛0›łž“Ž?ą)Ë +6Ö’+Đ \ No newline at end of file diff --git a/test/integration/stashPop/expected/.git_keep/objects/8e/b0f6c64dea2004a684ea55f9589b71b45d76a6 b/test/integration/stash/expected/repo/.git_keep/objects/8e/b0f6c64dea2004a684ea55f9589b71b45d76a6 similarity index 100% rename from test/integration/stashPop/expected/.git_keep/objects/8e/b0f6c64dea2004a684ea55f9589b71b45d76a6 rename to test/integration/stash/expected/repo/.git_keep/objects/8e/b0f6c64dea2004a684ea55f9589b71b45d76a6 diff --git a/test/integration/stash/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/stash/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c similarity index 100% rename from test/integration/stash/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c rename to test/integration/stash/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c diff --git a/test/integration/tags3/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/stash/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/tags3/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/stash/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/stash/expected/repo/.git_keep/objects/be/485112173592dea7b39c7efc3a6f52f43b71b9 b/test/integration/stash/expected/repo/.git_keep/objects/be/485112173592dea7b39c7efc3a6f52f43b71b9 new file mode 100644 index 000000000..59e0babdb Binary files /dev/null and b/test/integration/stash/expected/repo/.git_keep/objects/be/485112173592dea7b39c7efc3a6f52f43b71b9 differ diff --git a/test/integration/stash/expected/repo/.git_keep/objects/be/be684962b7b3a4d751f95173b31a051c7d46e7 b/test/integration/stash/expected/repo/.git_keep/objects/be/be684962b7b3a4d751f95173b31a051c7d46e7 new file mode 100644 index 000000000..99d6b4097 Binary files /dev/null and b/test/integration/stash/expected/repo/.git_keep/objects/be/be684962b7b3a4d751f95173b31a051c7d46e7 differ diff --git a/test/integration/stashDrop/expected/.git_keep/objects/c7/c7da3c64e86c3270f2639a1379e67e14891b6a b/test/integration/stash/expected/repo/.git_keep/objects/c7/c7da3c64e86c3270f2639a1379e67e14891b6a similarity index 100% rename from test/integration/stashDrop/expected/.git_keep/objects/c7/c7da3c64e86c3270f2639a1379e67e14891b6a rename to test/integration/stash/expected/repo/.git_keep/objects/c7/c7da3c64e86c3270f2639a1379e67e14891b6a diff --git a/test/integration/stash/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/stash/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 similarity index 100% rename from test/integration/stash/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 rename to test/integration/stash/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 diff --git a/test/integration/stash/expected/repo/.git_keep/objects/f7/114350b59290905115d7918efe144eb2c62a76 b/test/integration/stash/expected/repo/.git_keep/objects/f7/114350b59290905115d7918efe144eb2c62a76 new file mode 100644 index 000000000..734e0f0c1 Binary files /dev/null and b/test/integration/stash/expected/repo/.git_keep/objects/f7/114350b59290905115d7918efe144eb2c62a76 differ diff --git a/test/integration/stash/expected/repo/.git_keep/refs/heads/master b/test/integration/stash/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..70b2d64a5 --- /dev/null +++ b/test/integration/stash/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +6b1f87e5b74cd77d755d213e0850f4de02b3cdce diff --git a/test/integration/stash/expected/repo/.git_keep/refs/stash b/test/integration/stash/expected/repo/.git_keep/refs/stash new file mode 100644 index 000000000..e627ae765 --- /dev/null +++ b/test/integration/stash/expected/repo/.git_keep/refs/stash @@ -0,0 +1 @@ +be485112173592dea7b39c7efc3a6f52f43b71b9 diff --git a/test/integration/reflogHardReset/expected/file0 b/test/integration/stash/expected/repo/file0 similarity index 100% rename from test/integration/reflogHardReset/expected/file0 rename to test/integration/stash/expected/repo/file0 diff --git a/test/integration/stash/expected/file1 b/test/integration/stash/expected/repo/file1 similarity index 100% rename from test/integration/stash/expected/file1 rename to test/integration/stash/expected/repo/file1 diff --git a/test/integration/stashNewBranch/expected/file2 b/test/integration/stash/expected/repo/file2 similarity index 100% rename from test/integration/stashNewBranch/expected/file2 rename to test/integration/stash/expected/repo/file2 diff --git a/test/integration/stashPop/expected/file3 b/test/integration/stash/expected/repo/file3 similarity index 100% rename from test/integration/stashPop/expected/file3 rename to test/integration/stash/expected/repo/file3 diff --git a/test/integration/stash/recording.json b/test/integration/stash/recording.json index 48fc35158..cefefc363 100644 --- a/test/integration/stash/recording.json +++ b/test/integration/stash/recording.json @@ -1 +1 @@ -{"KeyEvents":[{"Timestamp":809,"Mod":0,"Key":256,"Ch":32},{"Timestamp":1369,"Mod":0,"Key":256,"Ch":83},{"Timestamp":1713,"Mod":0,"Key":258,"Ch":0},{"Timestamp":2087,"Mod":0,"Key":13,"Ch":13},{"Timestamp":2376,"Mod":0,"Key":256,"Ch":97},{"Timestamp":2440,"Mod":0,"Key":256,"Ch":115},{"Timestamp":2512,"Mod":0,"Key":256,"Ch":100},{"Timestamp":2793,"Mod":0,"Key":13,"Ch":13},{"Timestamp":3498,"Mod":0,"Key":258,"Ch":0},{"Timestamp":4113,"Mod":0,"Key":256,"Ch":32},{"Timestamp":4785,"Mod":0,"Key":256,"Ch":115},{"Timestamp":5145,"Mod":0,"Key":256,"Ch":97},{"Timestamp":5183,"Mod":0,"Key":256,"Ch":115},{"Timestamp":5249,"Mod":0,"Key":256,"Ch":100},{"Timestamp":5609,"Mod":0,"Key":13,"Ch":13},{"Timestamp":6216,"Mod":0,"Key":259,"Ch":0},{"Timestamp":6457,"Mod":0,"Key":259,"Ch":0},{"Timestamp":6728,"Mod":0,"Key":259,"Ch":0},{"Timestamp":7098,"Mod":0,"Key":258,"Ch":0},{"Timestamp":7408,"Mod":0,"Key":256,"Ch":32},{"Timestamp":8080,"Mod":0,"Key":13,"Ch":13},{"Timestamp":8752,"Mod":0,"Key":260,"Ch":0},{"Timestamp":8952,"Mod":0,"Key":260,"Ch":0},{"Timestamp":9145,"Mod":0,"Key":260,"Ch":0},{"Timestamp":9904,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":272,"Height":74}]} \ No newline at end of file +{"KeyEvents":[{"Timestamp":1303,"Mod":0,"Key":256,"Ch":32},{"Timestamp":1922,"Mod":0,"Key":256,"Ch":83},{"Timestamp":5480,"Mod":0,"Key":13,"Ch":13},{"Timestamp":6417,"Mod":0,"Key":256,"Ch":97},{"Timestamp":6506,"Mod":0,"Key":256,"Ch":115},{"Timestamp":6549,"Mod":0,"Key":256,"Ch":100},{"Timestamp":6874,"Mod":0,"Key":13,"Ch":13},{"Timestamp":7610,"Mod":0,"Key":256,"Ch":53},{"Timestamp":9010,"Mod":0,"Key":256,"Ch":32},{"Timestamp":10032,"Mod":0,"Key":13,"Ch":13},{"Timestamp":10900,"Mod":0,"Key":256,"Ch":50},{"Timestamp":11662,"Mod":0,"Key":256,"Ch":107},{"Timestamp":12360,"Mod":0,"Key":256,"Ch":32},{"Timestamp":12902,"Mod":0,"Key":256,"Ch":115},{"Timestamp":13687,"Mod":0,"Key":256,"Ch":97},{"Timestamp":13772,"Mod":0,"Key":256,"Ch":115},{"Timestamp":13837,"Mod":0,"Key":256,"Ch":100},{"Timestamp":14294,"Mod":0,"Key":13,"Ch":13},{"Timestamp":15489,"Mod":0,"Key":256,"Ch":53},{"Timestamp":16960,"Mod":0,"Key":256,"Ch":103},{"Timestamp":17726,"Mod":0,"Key":13,"Ch":13},{"Timestamp":18592,"Mod":0,"Key":256,"Ch":50},{"Timestamp":19603,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":239,"Height":56}]} \ No newline at end of file diff --git a/test/integration/stashDrop/expected/.git_keep/COMMIT_EDITMSG b/test/integration/stashAllChanges/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/stashDrop/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/stashAllChanges/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/tags2/expected/.git_keep/FETCH_HEAD b/test/integration/stashAllChanges/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/tags2/expected/.git_keep/FETCH_HEAD rename to test/integration/stashAllChanges/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/stashAllChanges/expected/repo/.git_keep/HEAD b/test/integration/stashAllChanges/expected/repo/.git_keep/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/test/integration/stashAllChanges/expected/repo/.git_keep/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/test/integration/stashAllChanges/expected/repo/.git_keep/ORIG_HEAD b/test/integration/stashAllChanges/expected/repo/.git_keep/ORIG_HEAD new file mode 100644 index 000000000..b6b4a34f7 --- /dev/null +++ b/test/integration/stashAllChanges/expected/repo/.git_keep/ORIG_HEAD @@ -0,0 +1 @@ +cb66567aecbd1ceb7caebf1c3a3d16db28f4a54c diff --git a/test/integration/stashAllChanges/expected/repo/.git_keep/config b/test/integration/stashAllChanges/expected/repo/.git_keep/config new file mode 100644 index 000000000..596ebaeb3 --- /dev/null +++ b/test/integration/stashAllChanges/expected/repo/.git_keep/config @@ -0,0 +1,8 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[user] + email = CI@example.com + name = CI diff --git a/test/integration/stashAllChanges/expected/repo/.git_keep/description b/test/integration/stashAllChanges/expected/repo/.git_keep/description new file mode 100644 index 000000000..498b267a8 --- /dev/null +++ b/test/integration/stashAllChanges/expected/repo/.git_keep/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/integration/stashAllChanges/expected/repo/.git_keep/index b/test/integration/stashAllChanges/expected/repo/.git_keep/index new file mode 100644 index 000000000..1d75c1b32 Binary files /dev/null and b/test/integration/stashAllChanges/expected/repo/.git_keep/index differ diff --git a/test/integration/stashAllChanges/expected/repo/.git_keep/info/exclude b/test/integration/stashAllChanges/expected/repo/.git_keep/info/exclude new file mode 100644 index 000000000..a5196d1be --- /dev/null +++ b/test/integration/stashAllChanges/expected/repo/.git_keep/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/test/integration/stashAllChanges/expected/repo/.git_keep/logs/HEAD b/test/integration/stashAllChanges/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..f29e0fda8 --- /dev/null +++ b/test/integration/stashAllChanges/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,6 @@ +0000000000000000000000000000000000000000 a52c63287cda99fcc917438c34ac8f9c67274d79 CI 1651830755 +0200 commit (initial): file0 +a52c63287cda99fcc917438c34ac8f9c67274d79 283a00085a0d95e814920f9eae7009789cee0eab CI 1651830755 +0200 commit: file1 +283a00085a0d95e814920f9eae7009789cee0eab cb66567aecbd1ceb7caebf1c3a3d16db28f4a54c CI 1651830755 +0200 commit: file2 +cb66567aecbd1ceb7caebf1c3a3d16db28f4a54c cb66567aecbd1ceb7caebf1c3a3d16db28f4a54c CI 1651830760 +0200 reset: moving to HEAD +cb66567aecbd1ceb7caebf1c3a3d16db28f4a54c cb66567aecbd1ceb7caebf1c3a3d16db28f4a54c CI 1651830769 +0200 reset: moving to HEAD +cb66567aecbd1ceb7caebf1c3a3d16db28f4a54c cb66567aecbd1ceb7caebf1c3a3d16db28f4a54c CI 1651830778 +0200 reset: moving to HEAD diff --git a/test/integration/stashAllChanges/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/stashAllChanges/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..3b9c06579 --- /dev/null +++ b/test/integration/stashAllChanges/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 a52c63287cda99fcc917438c34ac8f9c67274d79 CI 1651830755 +0200 commit (initial): file0 +a52c63287cda99fcc917438c34ac8f9c67274d79 283a00085a0d95e814920f9eae7009789cee0eab CI 1651830755 +0200 commit: file1 +283a00085a0d95e814920f9eae7009789cee0eab cb66567aecbd1ceb7caebf1c3a3d16db28f4a54c CI 1651830755 +0200 commit: file2 diff --git a/test/integration/stashAllChanges/expected/repo/.git_keep/logs/refs/stash b/test/integration/stashAllChanges/expected/repo/.git_keep/logs/refs/stash new file mode 100644 index 000000000..a3a868578 --- /dev/null +++ b/test/integration/stashAllChanges/expected/repo/.git_keep/logs/refs/stash @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 df9f3a300512205640e5ff10b624072a10afddde CI 1651830760 +0200 On master: stash all +df9f3a300512205640e5ff10b624072a10afddde 6b8c369acb1897a5787e72b4c15d597d346f2b6a CI 1651830769 +0200 On master: stash newly tracked +6b8c369acb1897a5787e72b4c15d597d346f2b6a 5a70ee314842fb5f46b452d16bc4d95e7154d4b4 CI 1651830778 +0200 On master: stash with staged diff --git a/test/integration/tags3/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/stashAllChanges/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/tags3/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/stashAllChanges/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/stash/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/stashAllChanges/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/stash/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/stashAllChanges/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/stashAllChanges/expected/repo/.git_keep/objects/28/3a00085a0d95e814920f9eae7009789cee0eab b/test/integration/stashAllChanges/expected/repo/.git_keep/objects/28/3a00085a0d95e814920f9eae7009789cee0eab new file mode 100644 index 000000000..45c762814 --- /dev/null +++ b/test/integration/stashAllChanges/expected/repo/.git_keep/objects/28/3a00085a0d95e814920f9eae7009789cee0eab @@ -0,0 +1,2 @@ +xŤŽK +Â0@]çł$˙É€ĐUŹ1N&X0¶”ßÁíă=x˛öľ päOcW…j1‹%f_CnA¦ÔjPlŽstfă]ß8yÉÁ”ĘDíHĆP$D–ŇH2zŚÉđg<צ®Ó|×/÷íĄYű \N®‹)ÁŮzkÍAŹ©ˇę¦-/u椧9Ą \ No newline at end of file diff --git a/test/integration/stashNewBranch/expected/.git_keep/objects/28/59c9a5f343c80929844d6e49d3792b9169c4da b/test/integration/stashAllChanges/expected/repo/.git_keep/objects/28/59c9a5f343c80929844d6e49d3792b9169c4da similarity index 100% rename from test/integration/stashNewBranch/expected/.git_keep/objects/28/59c9a5f343c80929844d6e49d3792b9169c4da rename to test/integration/stashAllChanges/expected/repo/.git_keep/objects/28/59c9a5f343c80929844d6e49d3792b9169c4da diff --git a/test/integration/stash/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/stashAllChanges/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/stash/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/stashAllChanges/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/stash/expected/.git_keep/objects/56/52247b638d1516506790d6648b864ba3447f68 b/test/integration/stashAllChanges/expected/repo/.git_keep/objects/56/52247b638d1516506790d6648b864ba3447f68 similarity index 100% rename from test/integration/stash/expected/.git_keep/objects/56/52247b638d1516506790d6648b864ba3447f68 rename to test/integration/stashAllChanges/expected/repo/.git_keep/objects/56/52247b638d1516506790d6648b864ba3447f68 diff --git a/test/integration/stashAllChanges/expected/repo/.git_keep/objects/56/6ddc4a6a06724993b2a55fec3f696c47b9dcce b/test/integration/stashAllChanges/expected/repo/.git_keep/objects/56/6ddc4a6a06724993b2a55fec3f696c47b9dcce new file mode 100644 index 000000000..3aa0ef009 Binary files /dev/null and b/test/integration/stashAllChanges/expected/repo/.git_keep/objects/56/6ddc4a6a06724993b2a55fec3f696c47b9dcce differ diff --git a/test/integration/stashAllChanges/expected/repo/.git_keep/objects/5a/70ee314842fb5f46b452d16bc4d95e7154d4b4 b/test/integration/stashAllChanges/expected/repo/.git_keep/objects/5a/70ee314842fb5f46b452d16bc4d95e7154d4b4 new file mode 100644 index 000000000..62afd0629 Binary files /dev/null and b/test/integration/stashAllChanges/expected/repo/.git_keep/objects/5a/70ee314842fb5f46b452d16bc4d95e7154d4b4 differ diff --git a/test/integration/stashPop/expected/.git_keep/objects/5c/ef9afea6a37d89f925e24ebf71adecb63d1f07 b/test/integration/stashAllChanges/expected/repo/.git_keep/objects/5c/ef9afea6a37d89f925e24ebf71adecb63d1f07 similarity index 100% rename from test/integration/stashPop/expected/.git_keep/objects/5c/ef9afea6a37d89f925e24ebf71adecb63d1f07 rename to test/integration/stashAllChanges/expected/repo/.git_keep/objects/5c/ef9afea6a37d89f925e24ebf71adecb63d1f07 diff --git a/test/integration/stashAllChanges/expected/repo/.git_keep/objects/65/e3f346ea03c8c2b0f1b8f6691abaed651fb77d b/test/integration/stashAllChanges/expected/repo/.git_keep/objects/65/e3f346ea03c8c2b0f1b8f6691abaed651fb77d new file mode 100644 index 000000000..2d46f6c29 --- /dev/null +++ b/test/integration/stashAllChanges/expected/repo/.git_keep/objects/65/e3f346ea03c8c2b0f1b8f6691abaed651fb77d @@ -0,0 +1,3 @@ +xŤŽË +Â0E]ç+f/Hž“("BWýŚI2ĹBÓ”ˇźo6îÝîážTK™hĺOmg‡Nkë#š•Sč$ú«Ě6Ä€6’±ÖOÄF;Ż RDtč‰SĚ*qô‰8N*2YaŽ:L–śM‚>íUwF¸ă“*Ű—TËú‹ +FzĽÂYj)E§=Şńźs1Ż™¨+zwëö«‚i^X‹/-6Av \ No newline at end of file diff --git a/test/integration/stashAllChanges/expected/repo/.git_keep/objects/6b/8c369acb1897a5787e72b4c15d597d346f2b6a b/test/integration/stashAllChanges/expected/repo/.git_keep/objects/6b/8c369acb1897a5787e72b4c15d597d346f2b6a new file mode 100644 index 000000000..e0f637f62 --- /dev/null +++ b/test/integration/stashAllChanges/expected/repo/.git_keep/objects/6b/8c369acb1897a5787e72b4c15d597d346f2b6a @@ -0,0 +1,2 @@ +xŤĎËJ1…a×ýµ$×Jjf5+źˇR©0â¤{莨oo6îÝ>~8˛őţ>Ŕax»*¸IcóÁK6ä(‡PQUźČ˛H*/wŢu 1bb•R­hIÂZšĎľZ¬Ĺĺ8ůóŐĎ6*›ŮWLł%7D˛\X+FŰJJuáĎqÝv8_ŕů|yŐoî÷›>ÉÖ_ŔN”˝IHđhś1Ë\牡˙äËŰ +ťŹéOp >®°ę×íĆÎňˇőz1QÄ \ No newline at end of file diff --git a/test/integration/stashAllChanges/expected/repo/.git_keep/objects/8e/b0f6c64dea2004a684ea55f9589b71b45d76a6 b/test/integration/stashAllChanges/expected/repo/.git_keep/objects/8e/b0f6c64dea2004a684ea55f9589b71b45d76a6 new file mode 100644 index 000000000..2a1928079 Binary files /dev/null and b/test/integration/stashAllChanges/expected/repo/.git_keep/objects/8e/b0f6c64dea2004a684ea55f9589b71b45d76a6 differ diff --git a/test/integration/stashDrop/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/stashAllChanges/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c similarity index 100% rename from test/integration/stashDrop/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c rename to test/integration/stashAllChanges/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c diff --git a/test/integration/stashAllChanges/expected/repo/.git_keep/objects/a5/2c63287cda99fcc917438c34ac8f9c67274d79 b/test/integration/stashAllChanges/expected/repo/.git_keep/objects/a5/2c63287cda99fcc917438c34ac8f9c67274d79 new file mode 100644 index 000000000..5edf24c6c Binary files /dev/null and b/test/integration/stashAllChanges/expected/repo/.git_keep/objects/a5/2c63287cda99fcc917438c34ac8f9c67274d79 differ diff --git a/test/integration/tags4/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/stashAllChanges/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/tags4/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/stashAllChanges/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/stashNewBranch/expected/.git_keep/objects/c7/c7da3c64e86c3270f2639a1379e67e14891b6a b/test/integration/stashAllChanges/expected/repo/.git_keep/objects/c7/c7da3c64e86c3270f2639a1379e67e14891b6a similarity index 100% rename from test/integration/stashNewBranch/expected/.git_keep/objects/c7/c7da3c64e86c3270f2639a1379e67e14891b6a rename to test/integration/stashAllChanges/expected/repo/.git_keep/objects/c7/c7da3c64e86c3270f2639a1379e67e14891b6a diff --git a/test/integration/stashAllChanges/expected/repo/.git_keep/objects/cb/66567aecbd1ceb7caebf1c3a3d16db28f4a54c b/test/integration/stashAllChanges/expected/repo/.git_keep/objects/cb/66567aecbd1ceb7caebf1c3a3d16db28f4a54c new file mode 100644 index 000000000..fa0541d87 Binary files /dev/null and b/test/integration/stashAllChanges/expected/repo/.git_keep/objects/cb/66567aecbd1ceb7caebf1c3a3d16db28f4a54c differ diff --git a/test/integration/stashDrop/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/stashAllChanges/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 similarity index 100% rename from test/integration/stashDrop/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 rename to test/integration/stashAllChanges/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 diff --git a/test/integration/stashAllChanges/expected/repo/.git_keep/objects/df/9f3a300512205640e5ff10b624072a10afddde b/test/integration/stashAllChanges/expected/repo/.git_keep/objects/df/9f3a300512205640e5ff10b624072a10afddde new file mode 100644 index 000000000..ffb320769 --- /dev/null +++ b/test/integration/stashAllChanges/expected/repo/.git_keep/objects/df/9f3a300512205640e5ff10b624072a10afddde @@ -0,0 +1,3 @@ +xŤĎ˝JA`ă}ŠÎ™ßžY.şČgčéNŘą=vGđńťÄܴ꣠xďýk@ČéiŞYm%SBŠEęjkČ’6+žDąao®,:ô>`±ĐlÄł¶Â4­çHÓˇ´P-QNüç5ůXjÄŰZ‹3Ň © +* +Ď Ö,ҢŮBßă¶pąÂŰĺúˇ?Ô›ľđŢßÁcö5ş‚ž]pn™é<1ôź|ůĽC§súW8ť7 mű$ŐO÷ \ No newline at end of file diff --git a/test/integration/stashAllChanges/expected/repo/.git_keep/objects/e4/13783635b9870fae2e48d6e6dccbdce5ddb3ff b/test/integration/stashAllChanges/expected/repo/.git_keep/objects/e4/13783635b9870fae2e48d6e6dccbdce5ddb3ff new file mode 100644 index 000000000..cd8006b21 Binary files /dev/null and b/test/integration/stashAllChanges/expected/repo/.git_keep/objects/e4/13783635b9870fae2e48d6e6dccbdce5ddb3ff differ diff --git a/test/integration/stashAllChanges/expected/repo/.git_keep/refs/heads/master b/test/integration/stashAllChanges/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..b6b4a34f7 --- /dev/null +++ b/test/integration/stashAllChanges/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +cb66567aecbd1ceb7caebf1c3a3d16db28f4a54c diff --git a/test/integration/stashAllChanges/expected/repo/.git_keep/refs/stash b/test/integration/stashAllChanges/expected/repo/.git_keep/refs/stash new file mode 100644 index 000000000..1b28de6fe --- /dev/null +++ b/test/integration/stashAllChanges/expected/repo/.git_keep/refs/stash @@ -0,0 +1 @@ +5a70ee314842fb5f46b452d16bc4d95e7154d4b4 diff --git a/test/integration/stash/expected/file0 b/test/integration/stashAllChanges/expected/repo/file0 similarity index 100% rename from test/integration/stash/expected/file0 rename to test/integration/stashAllChanges/expected/repo/file0 diff --git a/test/integration/stashNewBranch/expected/file1 b/test/integration/stashAllChanges/expected/repo/file1 similarity index 100% rename from test/integration/stashNewBranch/expected/file1 rename to test/integration/stashAllChanges/expected/repo/file1 diff --git a/test/integration/stashPop/expected/file1 b/test/integration/stashAllChanges/expected/repo/file2 similarity index 100% rename from test/integration/stashPop/expected/file1 rename to test/integration/stashAllChanges/expected/repo/file2 diff --git a/test/integration/stash_Copy/expected/file1 b/test/integration/stashAllChanges/expected/repo/file3 similarity index 100% rename from test/integration/stash_Copy/expected/file1 rename to test/integration/stashAllChanges/expected/repo/file3 diff --git a/test/integration/stashAllChanges/recording.json b/test/integration/stashAllChanges/recording.json new file mode 100644 index 000000000..f9c8f1305 --- /dev/null +++ b/test/integration/stashAllChanges/recording.json @@ -0,0 +1 @@ +{"KeyEvents":[{"Timestamp":1107,"Mod":0,"Key":256,"Ch":83},{"Timestamp":1736,"Mod":0,"Key":256,"Ch":97},{"Timestamp":2531,"Mod":0,"Key":256,"Ch":115},{"Timestamp":2623,"Mod":0,"Key":256,"Ch":116},{"Timestamp":2684,"Mod":0,"Key":256,"Ch":97},{"Timestamp":2784,"Mod":0,"Key":256,"Ch":115},{"Timestamp":3312,"Mod":0,"Key":256,"Ch":104},{"Timestamp":3400,"Mod":0,"Key":256,"Ch":32},{"Timestamp":3468,"Mod":0,"Key":256,"Ch":97},{"Timestamp":3583,"Mod":0,"Key":256,"Ch":108},{"Timestamp":3716,"Mod":0,"Key":256,"Ch":108},{"Timestamp":3913,"Mod":0,"Key":13,"Ch":13},{"Timestamp":4284,"Mod":0,"Key":256,"Ch":108},{"Timestamp":4420,"Mod":0,"Key":256,"Ch":108},{"Timestamp":4707,"Mod":0,"Key":256,"Ch":108},{"Timestamp":5231,"Mod":0,"Key":256,"Ch":32},{"Timestamp":5940,"Mod":0,"Key":13,"Ch":13},{"Timestamp":6733,"Mod":0,"Key":256,"Ch":50},{"Timestamp":7944,"Mod":0,"Key":256,"Ch":32},{"Timestamp":8694,"Mod":0,"Key":256,"Ch":83},{"Timestamp":9487,"Mod":0,"Key":256,"Ch":97},{"Timestamp":9952,"Mod":0,"Key":256,"Ch":115},{"Timestamp":10041,"Mod":0,"Key":256,"Ch":116},{"Timestamp":10092,"Mod":0,"Key":256,"Ch":97},{"Timestamp":10166,"Mod":0,"Key":256,"Ch":115},{"Timestamp":10253,"Mod":0,"Key":256,"Ch":104},{"Timestamp":10381,"Mod":0,"Key":256,"Ch":32},{"Timestamp":10610,"Mod":0,"Key":256,"Ch":110},{"Timestamp":10718,"Mod":0,"Key":256,"Ch":101},{"Timestamp":10869,"Mod":0,"Key":256,"Ch":119},{"Timestamp":10938,"Mod":0,"Key":256,"Ch":108},{"Timestamp":11071,"Mod":0,"Key":256,"Ch":121},{"Timestamp":11129,"Mod":0,"Key":256,"Ch":32},{"Timestamp":11279,"Mod":0,"Key":256,"Ch":116},{"Timestamp":11676,"Mod":0,"Key":256,"Ch":114},{"Timestamp":11753,"Mod":0,"Key":256,"Ch":97},{"Timestamp":11874,"Mod":0,"Key":256,"Ch":99},{"Timestamp":11984,"Mod":0,"Key":256,"Ch":107},{"Timestamp":12025,"Mod":0,"Key":256,"Ch":101},{"Timestamp":12125,"Mod":0,"Key":256,"Ch":100},{"Timestamp":12341,"Mod":0,"Key":13,"Ch":13},{"Timestamp":12925,"Mod":0,"Key":256,"Ch":53},{"Timestamp":14343,"Mod":0,"Key":256,"Ch":32},{"Timestamp":14871,"Mod":0,"Key":13,"Ch":13},{"Timestamp":15775,"Mod":0,"Key":256,"Ch":50},{"Timestamp":16168,"Mod":0,"Key":256,"Ch":106},{"Timestamp":16308,"Mod":0,"Key":256,"Ch":106},{"Timestamp":16515,"Mod":0,"Key":256,"Ch":32},{"Timestamp":16850,"Mod":0,"Key":256,"Ch":107},{"Timestamp":17159,"Mod":0,"Key":256,"Ch":32},{"Timestamp":18125,"Mod":0,"Key":256,"Ch":83},{"Timestamp":18639,"Mod":0,"Key":256,"Ch":97},{"Timestamp":18972,"Mod":0,"Key":256,"Ch":115},{"Timestamp":19060,"Mod":0,"Key":256,"Ch":116},{"Timestamp":19168,"Mod":0,"Key":256,"Ch":97},{"Timestamp":19236,"Mod":0,"Key":256,"Ch":115},{"Timestamp":19405,"Mod":0,"Key":256,"Ch":104},{"Timestamp":19593,"Mod":0,"Key":256,"Ch":32},{"Timestamp":19857,"Mod":0,"Key":256,"Ch":119},{"Timestamp":19942,"Mod":0,"Key":256,"Ch":105},{"Timestamp":20012,"Mod":0,"Key":256,"Ch":116},{"Timestamp":20072,"Mod":0,"Key":256,"Ch":104},{"Timestamp":20128,"Mod":0,"Key":256,"Ch":32},{"Timestamp":20188,"Mod":0,"Key":256,"Ch":115},{"Timestamp":20251,"Mod":0,"Key":256,"Ch":116},{"Timestamp":20335,"Mod":0,"Key":256,"Ch":97},{"Timestamp":20432,"Mod":0,"Key":256,"Ch":103},{"Timestamp":20471,"Mod":0,"Key":256,"Ch":101},{"Timestamp":20606,"Mod":0,"Key":256,"Ch":100},{"Timestamp":20789,"Mod":0,"Key":13,"Ch":13},{"Timestamp":21429,"Mod":0,"Key":256,"Ch":53},{"Timestamp":22402,"Mod":0,"Key":256,"Ch":32},{"Timestamp":23066,"Mod":0,"Key":13,"Ch":13},{"Timestamp":24259,"Mod":0,"Key":256,"Ch":104},{"Timestamp":24394,"Mod":0,"Key":256,"Ch":104},{"Timestamp":24532,"Mod":0,"Key":256,"Ch":104},{"Timestamp":24793,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":239,"Height":56}]} diff --git a/test/integration/stashAllChanges/setup.sh b/test/integration/stashAllChanges/setup.sh new file mode 100644 index 000000000..caff56b7d --- /dev/null +++ b/test/integration/stashAllChanges/setup.sh @@ -0,0 +1,26 @@ +#!/bin/sh + +set -e + +cd $1 + +git init + +git config user.email "CI@example.com" +git config user.name "CI" + +echo test0 > file0 +git add . +git commit -am file0 + +echo test1 > file1 +git add . +git commit -am file1 + +echo test2 > file2 +git add . +git commit -am file2 + +echo "hello there" > file1 +echo "hello there" > file2 +echo "hello there" > file3 diff --git a/test/integration/stashAllChanges/test.json b/test/integration/stashAllChanges/test.json new file mode 100644 index 000000000..645b63f7f --- /dev/null +++ b/test/integration/stashAllChanges/test.json @@ -0,0 +1 @@ +{ "description": "Stashing all files", "speed": 5 } diff --git a/test/integration/stashNewBranch/expected/.git_keep/COMMIT_EDITMSG b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/stashNewBranch/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/tags3/expected/.git_keep/FETCH_HEAD b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/tags3/expected/.git_keep/FETCH_HEAD rename to test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/HEAD b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/ORIG_HEAD b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/ORIG_HEAD new file mode 100644 index 000000000..5f3d4ba83 --- /dev/null +++ b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/ORIG_HEAD @@ -0,0 +1 @@ +056328ba39d0418acd7270389b9d5f253b98aabf diff --git a/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/config b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/config new file mode 100644 index 000000000..596ebaeb3 --- /dev/null +++ b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/config @@ -0,0 +1,8 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[user] + email = CI@example.com + name = CI diff --git a/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/description b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/description new file mode 100644 index 000000000..498b267a8 --- /dev/null +++ b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/index b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/index new file mode 100644 index 000000000..168c7d44f Binary files /dev/null and b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/index differ diff --git a/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/info/exclude b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/info/exclude new file mode 100644 index 000000000..a5196d1be --- /dev/null +++ b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/logs/HEAD b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..9861f89cf --- /dev/null +++ b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,4 @@ +0000000000000000000000000000000000000000 5c7a56ef74b1a692d67990b3f07a3af45a0e8f48 CI 1651830909 +0200 commit (initial): file0 +5c7a56ef74b1a692d67990b3f07a3af45a0e8f48 81f8f7653f26197f4f66641d6ab4ab99ac2a3391 CI 1651830909 +0200 commit: file1 +81f8f7653f26197f4f66641d6ab4ab99ac2a3391 056328ba39d0418acd7270389b9d5f253b98aabf CI 1651830909 +0200 commit: file2 +056328ba39d0418acd7270389b9d5f253b98aabf 056328ba39d0418acd7270389b9d5f253b98aabf CI 1651830915 +0200 reset: moving to HEAD diff --git a/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..24c7e3201 --- /dev/null +++ b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 5c7a56ef74b1a692d67990b3f07a3af45a0e8f48 CI 1651830909 +0200 commit (initial): file0 +5c7a56ef74b1a692d67990b3f07a3af45a0e8f48 81f8f7653f26197f4f66641d6ab4ab99ac2a3391 CI 1651830909 +0200 commit: file1 +81f8f7653f26197f4f66641d6ab4ab99ac2a3391 056328ba39d0418acd7270389b9d5f253b98aabf CI 1651830909 +0200 commit: file2 diff --git a/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/logs/refs/stash b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/logs/refs/stash new file mode 100644 index 000000000..a7bbabb68 --- /dev/null +++ b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/logs/refs/stash @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 c87c87eb867338ed9956f6b28c8c3a83a1802c16 CI 1651830915 +0200 On master: keep index diff --git a/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/05/6328ba39d0418acd7270389b9d5f253b98aabf b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/05/6328ba39d0418acd7270389b9d5f253b98aabf new file mode 100644 index 000000000..31a2717bd --- /dev/null +++ b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/05/6328ba39d0418acd7270389b9d5f253b98aabf @@ -0,0 +1,2 @@ +xŤÎA +Ă @Ń®=…űBqĆDG(ĄUŽ1ę Ä& =~s„n?ońËÖÚŇ-$ĽôCÄ&!âčjˇJX+˛f­ŁD# ˇĎ‹Ůůw·JĂ褨†¨óŔ9%.ČŢ'0üéŻí°ÓlďÓü”/·}•[ŮÚĂBĽK.Ů«CçĚYĎ©.rŁË*h~Łľ9° \ No newline at end of file diff --git a/test/integration/undo/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/undo/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/stashDrop/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/stashDrop/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/stashDrop/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/stashDrop/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/5c/7a56ef74b1a692d67990b3f07a3af45a0e8f48 b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/5c/7a56ef74b1a692d67990b3f07a3af45a0e8f48 new file mode 100644 index 000000000..648edc330 Binary files /dev/null and b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/5c/7a56ef74b1a692d67990b3f07a3af45a0e8f48 differ diff --git a/test/integration/stash_Copy/expected/.git_keep/objects/5c/ef9afea6a37d89f925e24ebf71adecb63d1f07 b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/5c/ef9afea6a37d89f925e24ebf71adecb63d1f07 similarity index 100% rename from test/integration/stash_Copy/expected/.git_keep/objects/5c/ef9afea6a37d89f925e24ebf71adecb63d1f07 rename to test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/5c/ef9afea6a37d89f925e24ebf71adecb63d1f07 diff --git a/test/integration/stashPop/expected/.git_keep/objects/66/bbc809cdafd867cf9320bfb7484bb8fa898448 b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/66/bbc809cdafd867cf9320bfb7484bb8fa898448 similarity index 100% rename from test/integration/stashPop/expected/.git_keep/objects/66/bbc809cdafd867cf9320bfb7484bb8fa898448 rename to test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/66/bbc809cdafd867cf9320bfb7484bb8fa898448 diff --git a/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/81/f8f7653f26197f4f66641d6ab4ab99ac2a3391 b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/81/f8f7653f26197f4f66641d6ab4ab99ac2a3391 new file mode 100644 index 000000000..a3abc271d Binary files /dev/null and b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/81/f8f7653f26197f4f66641d6ab4ab99ac2a3391 differ diff --git a/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/99/bcc624e9c596901f0dd572be23ba5df84ec0d5 b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/99/bcc624e9c596901f0dd572be23ba5df84ec0d5 new file mode 100644 index 000000000..7e40c36bb Binary files /dev/null and b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/99/bcc624e9c596901f0dd572be23ba5df84ec0d5 differ diff --git a/test/integration/stashNewBranch/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c similarity index 100% rename from test/integration/stashNewBranch/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c rename to test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c diff --git a/test/integration/undo/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/undo/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/stashPop/expected/.git_keep/objects/c7/c7da3c64e86c3270f2639a1379e67e14891b6a b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/c7/c7da3c64e86c3270f2639a1379e67e14891b6a similarity index 100% rename from test/integration/stashPop/expected/.git_keep/objects/c7/c7da3c64e86c3270f2639a1379e67e14891b6a rename to test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/c7/c7da3c64e86c3270f2639a1379e67e14891b6a diff --git a/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/c8/7c87eb867338ed9956f6b28c8c3a83a1802c16 b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/c8/7c87eb867338ed9956f6b28c8c3a83a1802c16 new file mode 100644 index 000000000..8b929b556 --- /dev/null +++ b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/c8/7c87eb867338ed9956f6b28c8c3a83a1802c16 @@ -0,0 +1 @@ +xŤĎAJ1…a×}ŠÚ RIş’”łš•g¨¤*8hş›6ÂßlÜ»}|üđęŢűm€'z§PµĆŇL˘„¤™{2żZiɉZ-1¨k–CNŰ Ĺŕs‘ŔŠ«ËR5ů„!saĄć)Î"ĄýyćRkśA®Ä‘q¶T)ůb>!myµŠJ‹üŚŹý„Ë^.×7»K?ľě©îý\$—˛#xDʏĚužöOľĽoĐĺ{úgř4;ŕ¶©ÝRN+ \ No newline at end of file diff --git a/test/integration/stashNewBranch/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 similarity index 100% rename from test/integration/stashNewBranch/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 rename to test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 diff --git a/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/refs/heads/master b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..5f3d4ba83 --- /dev/null +++ b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +056328ba39d0418acd7270389b9d5f253b98aabf diff --git a/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/refs/stash b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/refs/stash new file mode 100644 index 000000000..4a3424d55 --- /dev/null +++ b/test/integration/stashAllChangesKeepIndex/expected/repo/.git_keep/refs/stash @@ -0,0 +1 @@ +c87c87eb867338ed9956f6b28c8c3a83a1802c16 diff --git a/test/integration/stashDrop/expected/file0 b/test/integration/stashAllChangesKeepIndex/expected/repo/file0 similarity index 100% rename from test/integration/stashDrop/expected/file0 rename to test/integration/stashAllChangesKeepIndex/expected/repo/file0 diff --git a/test/integration/stashAllChangesKeepIndex/expected/repo/file1 b/test/integration/stashAllChangesKeepIndex/expected/repo/file1 new file mode 100644 index 000000000..c7c7da3c6 --- /dev/null +++ b/test/integration/stashAllChangesKeepIndex/expected/repo/file1 @@ -0,0 +1 @@ +hello there diff --git a/test/integration/stashAllChangesKeepIndex/expected/repo/file2 b/test/integration/stashAllChangesKeepIndex/expected/repo/file2 new file mode 100644 index 000000000..c7c7da3c6 --- /dev/null +++ b/test/integration/stashAllChangesKeepIndex/expected/repo/file2 @@ -0,0 +1 @@ +hello there diff --git a/test/integration/stashAllChangesKeepIndex/expected/repo/file3 b/test/integration/stashAllChangesKeepIndex/expected/repo/file3 new file mode 100644 index 000000000..c7c7da3c6 --- /dev/null +++ b/test/integration/stashAllChangesKeepIndex/expected/repo/file3 @@ -0,0 +1 @@ +hello there diff --git a/test/integration/stashAllChangesKeepIndex/recording.json b/test/integration/stashAllChangesKeepIndex/recording.json new file mode 100644 index 000000000..f9ae3f103 --- /dev/null +++ b/test/integration/stashAllChangesKeepIndex/recording.json @@ -0,0 +1 @@ +{"KeyEvents":[{"Timestamp":1343,"Mod":0,"Key":256,"Ch":32},{"Timestamp":1895,"Mod":0,"Key":256,"Ch":83},{"Timestamp":3116,"Mod":0,"Key":256,"Ch":105},{"Timestamp":4389,"Mod":0,"Key":256,"Ch":107},{"Timestamp":4458,"Mod":0,"Key":256,"Ch":101},{"Timestamp":4571,"Mod":0,"Key":256,"Ch":101},{"Timestamp":4656,"Mod":0,"Key":256,"Ch":112},{"Timestamp":4742,"Mod":0,"Key":256,"Ch":32},{"Timestamp":4834,"Mod":0,"Key":256,"Ch":105},{"Timestamp":4908,"Mod":0,"Key":256,"Ch":110},{"Timestamp":4965,"Mod":0,"Key":256,"Ch":100},{"Timestamp":5013,"Mod":0,"Key":256,"Ch":101},{"Timestamp":5162,"Mod":0,"Key":256,"Ch":120},{"Timestamp":5500,"Mod":0,"Key":13,"Ch":13},{"Timestamp":6822,"Mod":0,"Key":256,"Ch":53},{"Timestamp":8093,"Mod":0,"Key":256,"Ch":32},{"Timestamp":8985,"Mod":0,"Key":13,"Ch":13},{"Timestamp":9950,"Mod":0,"Key":256,"Ch":49},{"Timestamp":10588,"Mod":0,"Key":256,"Ch":106},{"Timestamp":11171,"Mod":0,"Key":256,"Ch":50},{"Timestamp":11581,"Mod":0,"Key":256,"Ch":32},{"Timestamp":12392,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":239,"Height":56}]} diff --git a/test/integration/stashAllChangesKeepIndex/setup.sh b/test/integration/stashAllChangesKeepIndex/setup.sh new file mode 100644 index 000000000..caff56b7d --- /dev/null +++ b/test/integration/stashAllChangesKeepIndex/setup.sh @@ -0,0 +1,26 @@ +#!/bin/sh + +set -e + +cd $1 + +git init + +git config user.email "CI@example.com" +git config user.name "CI" + +echo test0 > file0 +git add . +git commit -am file0 + +echo test1 > file1 +git add . +git commit -am file1 + +echo test2 > file2 +git add . +git commit -am file2 + +echo "hello there" > file1 +echo "hello there" > file2 +echo "hello there" > file3 diff --git a/test/integration/stash_Copy/test.json b/test/integration/stashAllChangesKeepIndex/test.json similarity index 100% rename from test/integration/stash_Copy/test.json rename to test/integration/stashAllChangesKeepIndex/test.json diff --git a/test/integration/stashDrop/expected/.git_keep/ORIG_HEAD b/test/integration/stashDrop/expected/.git_keep/ORIG_HEAD deleted file mode 100644 index 0a7c9cc2b..000000000 --- a/test/integration/stashDrop/expected/.git_keep/ORIG_HEAD +++ /dev/null @@ -1 +0,0 @@ -d22496528fe3c076a668c496ae7ba1f8136f1614 diff --git a/test/integration/stashDrop/expected/.git_keep/index b/test/integration/stashDrop/expected/.git_keep/index deleted file mode 100644 index 44fe0833f..000000000 Binary files a/test/integration/stashDrop/expected/.git_keep/index and /dev/null differ diff --git a/test/integration/stashDrop/expected/.git_keep/logs/HEAD b/test/integration/stashDrop/expected/.git_keep/logs/HEAD deleted file mode 100644 index b2e6d1769..000000000 --- a/test/integration/stashDrop/expected/.git_keep/logs/HEAD +++ /dev/null @@ -1,7 +0,0 @@ -0000000000000000000000000000000000000000 c00c9eb1ae239494475772c3f3dbae5ea4169575 CI 1643011799 +1100 commit (initial): file0 -c00c9eb1ae239494475772c3f3dbae5ea4169575 7605fecac5dee01fb9df55ca984dcc7a72810f48 CI 1643011799 +1100 commit: file1 -7605fecac5dee01fb9df55ca984dcc7a72810f48 d22496528fe3c076a668c496ae7ba1f8136f1614 CI 1643011799 +1100 commit: file2 -d22496528fe3c076a668c496ae7ba1f8136f1614 d22496528fe3c076a668c496ae7ba1f8136f1614 CI 1643011803 +1100 reset: moving to HEAD -d22496528fe3c076a668c496ae7ba1f8136f1614 d22496528fe3c076a668c496ae7ba1f8136f1614 CI 1643011803 +1100 reset: moving to HEAD -d22496528fe3c076a668c496ae7ba1f8136f1614 d22496528fe3c076a668c496ae7ba1f8136f1614 CI 1643011806 +1100 reset: moving to HEAD -d22496528fe3c076a668c496ae7ba1f8136f1614 d22496528fe3c076a668c496ae7ba1f8136f1614 CI 1643011806 +1100 reset: moving to HEAD diff --git a/test/integration/stashDrop/expected/.git_keep/logs/refs/heads/master b/test/integration/stashDrop/expected/.git_keep/logs/refs/heads/master deleted file mode 100644 index 62c5e5c79..000000000 --- a/test/integration/stashDrop/expected/.git_keep/logs/refs/heads/master +++ /dev/null @@ -1,3 +0,0 @@ -0000000000000000000000000000000000000000 c00c9eb1ae239494475772c3f3dbae5ea4169575 CI 1643011799 +1100 commit (initial): file0 -c00c9eb1ae239494475772c3f3dbae5ea4169575 7605fecac5dee01fb9df55ca984dcc7a72810f48 CI 1643011799 +1100 commit: file1 -7605fecac5dee01fb9df55ca984dcc7a72810f48 d22496528fe3c076a668c496ae7ba1f8136f1614 CI 1643011799 +1100 commit: file2 diff --git a/test/integration/stashDrop/expected/.git_keep/logs/refs/stash b/test/integration/stashDrop/expected/.git_keep/logs/refs/stash deleted file mode 100644 index 0b47b5c2e..000000000 --- a/test/integration/stashDrop/expected/.git_keep/logs/refs/stash +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 f4f81b6542e98a2f80269449674b0f8f454b74b0 CI 1643011806 +1100 On master: dsa diff --git a/test/integration/stashDrop/expected/.git_keep/objects/1e/6f4a55f3dd26848238337763f249681ef9397b b/test/integration/stashDrop/expected/.git_keep/objects/1e/6f4a55f3dd26848238337763f249681ef9397b deleted file mode 100644 index 24145cefe..000000000 Binary files a/test/integration/stashDrop/expected/.git_keep/objects/1e/6f4a55f3dd26848238337763f249681ef9397b and /dev/null differ diff --git a/test/integration/stashDrop/expected/.git_keep/objects/56/52247b638d1516506790d6648b864ba3447f68 b/test/integration/stashDrop/expected/.git_keep/objects/56/52247b638d1516506790d6648b864ba3447f68 deleted file mode 100644 index 8535af67c..000000000 Binary files a/test/integration/stashDrop/expected/.git_keep/objects/56/52247b638d1516506790d6648b864ba3447f68 and /dev/null differ diff --git a/test/integration/stashDrop/expected/.git_keep/objects/6d/c07da80aed51d01a56a89ef37f4411adbd75c5 b/test/integration/stashDrop/expected/.git_keep/objects/6d/c07da80aed51d01a56a89ef37f4411adbd75c5 deleted file mode 100644 index 6d84f0e3f..000000000 Binary files a/test/integration/stashDrop/expected/.git_keep/objects/6d/c07da80aed51d01a56a89ef37f4411adbd75c5 and /dev/null differ diff --git a/test/integration/stashDrop/expected/.git_keep/objects/76/05fecac5dee01fb9df55ca984dcc7a72810f48 b/test/integration/stashDrop/expected/.git_keep/objects/76/05fecac5dee01fb9df55ca984dcc7a72810f48 deleted file mode 100644 index 782d5f0ee..000000000 Binary files a/test/integration/stashDrop/expected/.git_keep/objects/76/05fecac5dee01fb9df55ca984dcc7a72810f48 and /dev/null differ diff --git a/test/integration/stashDrop/expected/.git_keep/objects/9f/2757166809c291c65f09778abb46cfcc4e4a0c b/test/integration/stashDrop/expected/.git_keep/objects/9f/2757166809c291c65f09778abb46cfcc4e4a0c deleted file mode 100644 index 539f97919..000000000 Binary files a/test/integration/stashDrop/expected/.git_keep/objects/9f/2757166809c291c65f09778abb46cfcc4e4a0c and /dev/null differ diff --git a/test/integration/stashDrop/expected/.git_keep/objects/a6/ed180e13649885eed39866051ca0e25c0ad6ac b/test/integration/stashDrop/expected/.git_keep/objects/a6/ed180e13649885eed39866051ca0e25c0ad6ac deleted file mode 100644 index 20498e40d..000000000 Binary files a/test/integration/stashDrop/expected/.git_keep/objects/a6/ed180e13649885eed39866051ca0e25c0ad6ac and /dev/null differ diff --git a/test/integration/stashDrop/expected/.git_keep/objects/c0/0c9eb1ae239494475772c3f3dbae5ea4169575 b/test/integration/stashDrop/expected/.git_keep/objects/c0/0c9eb1ae239494475772c3f3dbae5ea4169575 deleted file mode 100644 index 3a5979b5c..000000000 --- a/test/integration/stashDrop/expected/.git_keep/objects/c0/0c9eb1ae239494475772c3f3dbae5ea4169575 +++ /dev/null @@ -1,2 +0,0 @@ -xŤÍA -Â0Fa×9Ĺě™IÇġ«#iţ`ˇˇR"x|{·ŹŢĽµ¶tŐSß 1›YÉrŤ!ř–«VöąToPSő.}úkŰiśč>NO|S{ݏĚ[{X$šŃY„ŮőtüÉ]]V°űŰ?+î \ No newline at end of file diff --git a/test/integration/stashDrop/expected/.git_keep/objects/d2/2496528fe3c076a668c496ae7ba1f8136f1614 b/test/integration/stashDrop/expected/.git_keep/objects/d2/2496528fe3c076a668c496ae7ba1f8136f1614 deleted file mode 100644 index ce64e7f52..000000000 --- a/test/integration/stashDrop/expected/.git_keep/objects/d2/2496528fe3c076a668c496ae7ba1f8136f1614 +++ /dev/null @@ -1,3 +0,0 @@ -xŤÎ1 -Ă0 @ŃÎ>…÷B‘ś8–ˇ”B¦C‘%›\čń›#týĽáËVëŇ<ćpi‡ŞĎJÄ ŠPˇPJ`›­DŔ4¨%R$ -Ý,AÜ·ľ›ODSa‰EĐć\,FáL}Iś!XOŽ?íµ~śü}śžú庯z“­><})gEpg=§šţÉť-«÷0V:Ĺ \ No newline at end of file diff --git a/test/integration/stashDrop/expected/.git_keep/objects/e0/61c8716830532562f919dcb125ea804f87ca2b b/test/integration/stashDrop/expected/.git_keep/objects/e0/61c8716830532562f919dcb125ea804f87ca2b deleted file mode 100644 index 57420d027..000000000 Binary files a/test/integration/stashDrop/expected/.git_keep/objects/e0/61c8716830532562f919dcb125ea804f87ca2b and /dev/null differ diff --git a/test/integration/stashDrop/expected/.git_keep/objects/e5/cef1a548f3613b3e538bd0fc2b4ec88043fc25 b/test/integration/stashDrop/expected/.git_keep/objects/e5/cef1a548f3613b3e538bd0fc2b4ec88043fc25 deleted file mode 100644 index 965e28b60..000000000 Binary files a/test/integration/stashDrop/expected/.git_keep/objects/e5/cef1a548f3613b3e538bd0fc2b4ec88043fc25 and /dev/null differ diff --git a/test/integration/stashDrop/expected/.git_keep/objects/f4/f81b6542e98a2f80269449674b0f8f454b74b0 b/test/integration/stashDrop/expected/.git_keep/objects/f4/f81b6542e98a2f80269449674b0f8f454b74b0 deleted file mode 100644 index 0c09e49d2..000000000 Binary files a/test/integration/stashDrop/expected/.git_keep/objects/f4/f81b6542e98a2f80269449674b0f8f454b74b0 and /dev/null differ diff --git a/test/integration/stashDrop/expected/.git_keep/refs/heads/master b/test/integration/stashDrop/expected/.git_keep/refs/heads/master deleted file mode 100644 index 0a7c9cc2b..000000000 --- a/test/integration/stashDrop/expected/.git_keep/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -d22496528fe3c076a668c496ae7ba1f8136f1614 diff --git a/test/integration/stashDrop/expected/.git_keep/refs/stash b/test/integration/stashDrop/expected/.git_keep/refs/stash deleted file mode 100644 index 0a4ae7ab5..000000000 --- a/test/integration/stashDrop/expected/.git_keep/refs/stash +++ /dev/null @@ -1 +0,0 @@ -f4f81b6542e98a2f80269449674b0f8f454b74b0 diff --git a/test/integration/stashPop/expected/.git_keep/COMMIT_EDITMSG b/test/integration/stashDrop/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/stashPop/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/stashDrop/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/tags4/expected/.git_keep/FETCH_HEAD b/test/integration/stashDrop/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/tags4/expected/.git_keep/FETCH_HEAD rename to test/integration/stashDrop/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/stashDrop/expected/repo/.git_keep/HEAD b/test/integration/stashDrop/expected/repo/.git_keep/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/test/integration/stashDrop/expected/repo/.git_keep/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/test/integration/stashDrop/expected/repo/.git_keep/ORIG_HEAD b/test/integration/stashDrop/expected/repo/.git_keep/ORIG_HEAD new file mode 100644 index 000000000..11345d776 --- /dev/null +++ b/test/integration/stashDrop/expected/repo/.git_keep/ORIG_HEAD @@ -0,0 +1 @@ +91a35446b7de806c46cd84a8574b2302443a5868 diff --git a/test/integration/stashDrop/expected/repo/.git_keep/config b/test/integration/stashDrop/expected/repo/.git_keep/config new file mode 100644 index 000000000..596ebaeb3 --- /dev/null +++ b/test/integration/stashDrop/expected/repo/.git_keep/config @@ -0,0 +1,8 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[user] + email = CI@example.com + name = CI diff --git a/test/integration/stashDrop/expected/repo/.git_keep/description b/test/integration/stashDrop/expected/repo/.git_keep/description new file mode 100644 index 000000000..498b267a8 --- /dev/null +++ b/test/integration/stashDrop/expected/repo/.git_keep/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/integration/stashDrop/expected/repo/.git_keep/index b/test/integration/stashDrop/expected/repo/.git_keep/index new file mode 100644 index 000000000..a201208c8 Binary files /dev/null and b/test/integration/stashDrop/expected/repo/.git_keep/index differ diff --git a/test/integration/stashDrop/expected/repo/.git_keep/info/exclude b/test/integration/stashDrop/expected/repo/.git_keep/info/exclude new file mode 100644 index 000000000..a5196d1be --- /dev/null +++ b/test/integration/stashDrop/expected/repo/.git_keep/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/test/integration/stashDrop/expected/repo/.git_keep/logs/HEAD b/test/integration/stashDrop/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..b3b2d9888 --- /dev/null +++ b/test/integration/stashDrop/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,4 @@ +0000000000000000000000000000000000000000 bea28eaac7bdaf99371daf5b9a788061a12308f4 CI 1650270506 +0200 commit (initial): file0 +bea28eaac7bdaf99371daf5b9a788061a12308f4 0e84352ca8531152e477715812e6e275d986984e CI 1650270506 +0200 commit: file1 +0e84352ca8531152e477715812e6e275d986984e 91a35446b7de806c46cd84a8574b2302443a5868 CI 1650270506 +0200 commit: file2 +91a35446b7de806c46cd84a8574b2302443a5868 91a35446b7de806c46cd84a8574b2302443a5868 CI 1650270506 +0200 reset: moving to HEAD diff --git a/test/integration/stashDrop/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/stashDrop/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..06a7a9d1d --- /dev/null +++ b/test/integration/stashDrop/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 bea28eaac7bdaf99371daf5b9a788061a12308f4 CI 1650270506 +0200 commit (initial): file0 +bea28eaac7bdaf99371daf5b9a788061a12308f4 0e84352ca8531152e477715812e6e275d986984e CI 1650270506 +0200 commit: file1 +0e84352ca8531152e477715812e6e275d986984e 91a35446b7de806c46cd84a8574b2302443a5868 CI 1650270506 +0200 commit: file2 diff --git a/test/integration/stashDrop/expected/repo/.git_keep/objects/0e/84352ca8531152e477715812e6e275d986984e b/test/integration/stashDrop/expected/repo/.git_keep/objects/0e/84352ca8531152e477715812e6e275d986984e new file mode 100644 index 000000000..ad8496326 --- /dev/null +++ b/test/integration/stashDrop/expected/repo/.git_keep/objects/0e/84352ca8531152e477715812e6e275d986984e @@ -0,0 +1,3 @@ +xŤŽM +Â0F]çŮ 2ůĎ€ĐUŹ1™L°ĐÚR"x|sW<ŢŹ÷m[ş6h/ýŃRdFf@b"[]l…ahŐ‰u=účŤ:č”w×EČf!âT*5D—ĚŘPRÎ ™Ńäć}úk?ő4ëű4?ĺK۱ʍ÷íˇM `ú +@ :NuůSWmYŨű/:2 \ No newline at end of file diff --git a/test/integration/undo2/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/stashDrop/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 similarity index 100% rename from test/integration/undo2/expected/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 rename to test/integration/stashDrop/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 diff --git a/test/integration/stashNewBranch/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/stashDrop/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/stashNewBranch/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/stashDrop/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/stashNewBranch/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/stashDrop/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/stashNewBranch/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/stashDrop/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/stashDrop/expected/repo/.git_keep/objects/5a/0e5672e3ccb264c401de9b84957c53138cd32c b/test/integration/stashDrop/expected/repo/.git_keep/objects/5a/0e5672e3ccb264c401de9b84957c53138cd32c new file mode 100644 index 000000000..08f8bb690 Binary files /dev/null and b/test/integration/stashDrop/expected/repo/.git_keep/objects/5a/0e5672e3ccb264c401de9b84957c53138cd32c differ diff --git a/test/integration/stashDrop/expected/repo/.git_keep/objects/5c/ef9afea6a37d89f925e24ebf71adecb63d1f07 b/test/integration/stashDrop/expected/repo/.git_keep/objects/5c/ef9afea6a37d89f925e24ebf71adecb63d1f07 new file mode 100644 index 000000000..6a6f24362 Binary files /dev/null and b/test/integration/stashDrop/expected/repo/.git_keep/objects/5c/ef9afea6a37d89f925e24ebf71adecb63d1f07 differ diff --git a/test/integration/stashDrop/expected/repo/.git_keep/objects/75/a47f9be3d041530e975683cde13a62ddc65007 b/test/integration/stashDrop/expected/repo/.git_keep/objects/75/a47f9be3d041530e975683cde13a62ddc65007 new file mode 100644 index 000000000..e3f498c19 --- /dev/null +++ b/test/integration/stashDrop/expected/repo/.git_keep/objects/75/a47f9be3d041530e975683cde13a62ddc65007 @@ -0,0 +1,2 @@ +xŤĎ=j1 @áÔs +ő Ű’–[m•3Ȳ† ÄëaĆ?Ó¤Oűřš§Ł÷Ď žóÓÜÍ€ŐÖ"«I”Z.kńlž¬®ÉI3­14·bZ6Ůí1ˇ8 Lkj–1*Em™$s˘ęz˘ ścţó,h“· Z}$%tÍJÍT8)˛¶ŕu‘ďy;\ođz˝˝ŰŹôíË^tô7p‘Ń'dŚđŚq9ë91íź|ůx@—ăô8¦wÚ>¶_*+Mĺ \ No newline at end of file diff --git a/test/integration/stashDrop/expected/repo/.git_keep/objects/91/a35446b7de806c46cd84a8574b2302443a5868 b/test/integration/stashDrop/expected/repo/.git_keep/objects/91/a35446b7de806c46cd84a8574b2302443a5868 new file mode 100644 index 000000000..a216ac57d Binary files /dev/null and b/test/integration/stashDrop/expected/repo/.git_keep/objects/91/a35446b7de806c46cd84a8574b2302443a5868 differ diff --git a/test/integration/stashPop/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/stashDrop/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c similarity index 100% rename from test/integration/stashPop/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c rename to test/integration/stashDrop/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c diff --git a/test/integration/undo2/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/stashDrop/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 similarity index 100% rename from test/integration/undo2/expected/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 rename to test/integration/stashDrop/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 diff --git a/test/integration/stashDrop/expected/repo/.git_keep/objects/be/a28eaac7bdaf99371daf5b9a788061a12308f4 b/test/integration/stashDrop/expected/repo/.git_keep/objects/be/a28eaac7bdaf99371daf5b9a788061a12308f4 new file mode 100644 index 000000000..3ed6793af Binary files /dev/null and b/test/integration/stashDrop/expected/repo/.git_keep/objects/be/a28eaac7bdaf99371daf5b9a788061a12308f4 differ diff --git a/test/integration/stash_Copy/expected/.git_keep/objects/c7/c7da3c64e86c3270f2639a1379e67e14891b6a b/test/integration/stashDrop/expected/repo/.git_keep/objects/c7/c7da3c64e86c3270f2639a1379e67e14891b6a similarity index 100% rename from test/integration/stash_Copy/expected/.git_keep/objects/c7/c7da3c64e86c3270f2639a1379e67e14891b6a rename to test/integration/stashDrop/expected/repo/.git_keep/objects/c7/c7da3c64e86c3270f2639a1379e67e14891b6a diff --git a/test/integration/stashPop/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/stashDrop/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 similarity index 100% rename from test/integration/stashPop/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 rename to test/integration/stashDrop/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 diff --git a/test/integration/stashDrop/expected/repo/.git_keep/refs/heads/master b/test/integration/stashDrop/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..11345d776 --- /dev/null +++ b/test/integration/stashDrop/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +91a35446b7de806c46cd84a8574b2302443a5868 diff --git a/test/integration/stashNewBranch/expected/file0 b/test/integration/stashDrop/expected/repo/file0 similarity index 100% rename from test/integration/stashNewBranch/expected/file0 rename to test/integration/stashDrop/expected/repo/file0 diff --git a/test/integration/tags4/expected/file1 b/test/integration/stashDrop/expected/repo/file1 similarity index 100% rename from test/integration/tags4/expected/file1 rename to test/integration/stashDrop/expected/repo/file1 diff --git a/test/integration/stash/expected/file2 b/test/integration/stashDrop/expected/repo/file2 similarity index 100% rename from test/integration/stash/expected/file2 rename to test/integration/stashDrop/expected/repo/file2 diff --git a/test/integration/stashDrop/expected/repo/file3 b/test/integration/stashDrop/expected/repo/file3 new file mode 100644 index 000000000..c7c7da3c6 --- /dev/null +++ b/test/integration/stashDrop/expected/repo/file3 @@ -0,0 +1 @@ +hello there diff --git a/test/integration/stashDrop/recording.json b/test/integration/stashDrop/recording.json index c61c97b24..b3aa3e738 100644 --- a/test/integration/stashDrop/recording.json +++ b/test/integration/stashDrop/recording.json @@ -1 +1 @@ -{"KeyEvents":[{"Timestamp":1329,"Mod":0,"Key":256,"Ch":32},{"Timestamp":2003,"Mod":0,"Key":256,"Ch":83},{"Timestamp":2466,"Mod":0,"Key":258,"Ch":0},{"Timestamp":2754,"Mod":0,"Key":13,"Ch":13},{"Timestamp":2979,"Mod":0,"Key":256,"Ch":97},{"Timestamp":3051,"Mod":0,"Key":256,"Ch":115},{"Timestamp":3081,"Mod":0,"Key":256,"Ch":100},{"Timestamp":3386,"Mod":0,"Key":13,"Ch":13},{"Timestamp":3961,"Mod":0,"Key":258,"Ch":0},{"Timestamp":4186,"Mod":0,"Key":256,"Ch":32},{"Timestamp":4906,"Mod":0,"Key":256,"Ch":83},{"Timestamp":5394,"Mod":0,"Key":258,"Ch":0},{"Timestamp":5626,"Mod":0,"Key":13,"Ch":13},{"Timestamp":6002,"Mod":0,"Key":256,"Ch":100},{"Timestamp":6066,"Mod":0,"Key":256,"Ch":115},{"Timestamp":6113,"Mod":0,"Key":256,"Ch":97},{"Timestamp":6378,"Mod":0,"Key":13,"Ch":13},{"Timestamp":6842,"Mod":0,"Key":259,"Ch":0},{"Timestamp":7074,"Mod":0,"Key":259,"Ch":0},{"Timestamp":7315,"Mod":0,"Key":259,"Ch":0},{"Timestamp":7714,"Mod":0,"Key":258,"Ch":0},{"Timestamp":8114,"Mod":0,"Key":256,"Ch":100},{"Timestamp":8546,"Mod":0,"Key":13,"Ch":13},{"Timestamp":9379,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":272,"Height":74}]} \ No newline at end of file +{"KeyEvents":[{"Timestamp":767,"Mod":0,"Key":256,"Ch":53},{"Timestamp":1706,"Mod":0,"Key":256,"Ch":100},{"Timestamp":2841,"Mod":0,"Key":13,"Ch":13},{"Timestamp":3906,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":239,"Height":55}]} \ No newline at end of file diff --git a/test/integration/stashDrop/setup.sh b/test/integration/stashDrop/setup.sh index caff56b7d..2278d53d8 100644 --- a/test/integration/stashDrop/setup.sh +++ b/test/integration/stashDrop/setup.sh @@ -24,3 +24,5 @@ git commit -am file2 echo "hello there" > file1 echo "hello there" > file2 echo "hello there" > file3 + +git stash save "stash to drop" diff --git a/test/integration/stash_Copy/expected/.git_keep/COMMIT_EDITMSG b/test/integration/stashNewBranch/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/stash_Copy/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/stashNewBranch/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/undo/expected/.git_keep/FETCH_HEAD b/test/integration/stashNewBranch/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/undo/expected/.git_keep/FETCH_HEAD rename to test/integration/stashNewBranch/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/stashNewBranch/expected/.git_keep/HEAD b/test/integration/stashNewBranch/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/stashNewBranch/expected/.git_keep/HEAD rename to test/integration/stashNewBranch/expected/repo/.git_keep/HEAD diff --git a/test/integration/stashNewBranch/expected/.git_keep/ORIG_HEAD b/test/integration/stashNewBranch/expected/repo/.git_keep/ORIG_HEAD similarity index 100% rename from test/integration/stashNewBranch/expected/.git_keep/ORIG_HEAD rename to test/integration/stashNewBranch/expected/repo/.git_keep/ORIG_HEAD diff --git a/test/integration/tags/expected/.git_keep/config b/test/integration/stashNewBranch/expected/repo/.git_keep/config similarity index 100% rename from test/integration/tags/expected/.git_keep/config rename to test/integration/stashNewBranch/expected/repo/.git_keep/config diff --git a/test/integration/stashNewBranch/expected/repo/.git_keep/description b/test/integration/stashNewBranch/expected/repo/.git_keep/description new file mode 100644 index 000000000..498b267a8 --- /dev/null +++ b/test/integration/stashNewBranch/expected/repo/.git_keep/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/integration/stashNewBranch/expected/.git_keep/index b/test/integration/stashNewBranch/expected/repo/.git_keep/index similarity index 100% rename from test/integration/stashNewBranch/expected/.git_keep/index rename to test/integration/stashNewBranch/expected/repo/.git_keep/index diff --git a/test/integration/tags/expected/.git_keep/info/exclude b/test/integration/stashNewBranch/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/tags/expected/.git_keep/info/exclude rename to test/integration/stashNewBranch/expected/repo/.git_keep/info/exclude diff --git a/test/integration/stashNewBranch/expected/.git_keep/logs/HEAD b/test/integration/stashNewBranch/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/stashNewBranch/expected/.git_keep/logs/HEAD rename to test/integration/stashNewBranch/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/stashNewBranch/expected/.git_keep/logs/refs/heads/hello b/test/integration/stashNewBranch/expected/repo/.git_keep/logs/refs/heads/hello similarity index 100% rename from test/integration/stashNewBranch/expected/.git_keep/logs/refs/heads/hello rename to test/integration/stashNewBranch/expected/repo/.git_keep/logs/refs/heads/hello diff --git a/test/integration/stashNewBranch/expected/.git_keep/logs/refs/heads/master b/test/integration/stashNewBranch/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/stashNewBranch/expected/.git_keep/logs/refs/heads/master rename to test/integration/stashNewBranch/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/stashNewBranch/expected/.git_keep/logs/refs/stash b/test/integration/stashNewBranch/expected/repo/.git_keep/logs/refs/stash similarity index 100% rename from test/integration/stashNewBranch/expected/.git_keep/logs/refs/stash rename to test/integration/stashNewBranch/expected/repo/.git_keep/logs/refs/stash diff --git a/test/integration/stashNewBranch/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/stashNewBranch/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 new file mode 100644 index 000000000..f74bf2335 Binary files /dev/null and b/test/integration/stashNewBranch/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 differ diff --git a/test/integration/stashPop/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/stashNewBranch/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/stashPop/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/stashNewBranch/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/stashNewBranch/expected/repo/.git_keep/objects/28/59c9a5f343c80929844d6e49d3792b9169c4da b/test/integration/stashNewBranch/expected/repo/.git_keep/objects/28/59c9a5f343c80929844d6e49d3792b9169c4da new file mode 100644 index 000000000..ea6cd3866 Binary files /dev/null and b/test/integration/stashNewBranch/expected/repo/.git_keep/objects/28/59c9a5f343c80929844d6e49d3792b9169c4da differ diff --git a/test/integration/stashNewBranch/expected/.git_keep/objects/2a/b31642272ef6607700326d4ddb78f35e609d2b b/test/integration/stashNewBranch/expected/repo/.git_keep/objects/2a/b31642272ef6607700326d4ddb78f35e609d2b similarity index 100% rename from test/integration/stashNewBranch/expected/.git_keep/objects/2a/b31642272ef6607700326d4ddb78f35e609d2b rename to test/integration/stashNewBranch/expected/repo/.git_keep/objects/2a/b31642272ef6607700326d4ddb78f35e609d2b diff --git a/test/integration/stashPop/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/stashNewBranch/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/stashPop/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/stashNewBranch/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/stashNewBranch/expected/.git_keep/objects/5b/9d4ea51af3db649ff3ae4d92b9eacb84218368 b/test/integration/stashNewBranch/expected/repo/.git_keep/objects/5b/9d4ea51af3db649ff3ae4d92b9eacb84218368 similarity index 100% rename from test/integration/stashNewBranch/expected/.git_keep/objects/5b/9d4ea51af3db649ff3ae4d92b9eacb84218368 rename to test/integration/stashNewBranch/expected/repo/.git_keep/objects/5b/9d4ea51af3db649ff3ae4d92b9eacb84218368 diff --git a/test/integration/stashNewBranch/expected/.git_keep/objects/71/890c9b458697fbb4a6a9dde41614bea569aac8 b/test/integration/stashNewBranch/expected/repo/.git_keep/objects/71/890c9b458697fbb4a6a9dde41614bea569aac8 similarity index 100% rename from test/integration/stashNewBranch/expected/.git_keep/objects/71/890c9b458697fbb4a6a9dde41614bea569aac8 rename to test/integration/stashNewBranch/expected/repo/.git_keep/objects/71/890c9b458697fbb4a6a9dde41614bea569aac8 diff --git a/test/integration/stashNewBranch/expected/.git_keep/objects/79/7c030ec107d77fa39a1e453ad620235cb26725 b/test/integration/stashNewBranch/expected/repo/.git_keep/objects/79/7c030ec107d77fa39a1e453ad620235cb26725 similarity index 100% rename from test/integration/stashNewBranch/expected/.git_keep/objects/79/7c030ec107d77fa39a1e453ad620235cb26725 rename to test/integration/stashNewBranch/expected/repo/.git_keep/objects/79/7c030ec107d77fa39a1e453ad620235cb26725 diff --git a/test/integration/stash_Copy/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/stashNewBranch/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c similarity index 100% rename from test/integration/stash_Copy/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c rename to test/integration/stashNewBranch/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c diff --git a/test/integration/stashNewBranch/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/stashNewBranch/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 new file mode 100644 index 000000000..285df3e5f Binary files /dev/null and b/test/integration/stashNewBranch/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 differ diff --git a/test/integration/stashNewBranch/expected/.git_keep/objects/ac/b6fb50a77cf7bb6fb9cd5e45bc98010012d7c6 b/test/integration/stashNewBranch/expected/repo/.git_keep/objects/ac/b6fb50a77cf7bb6fb9cd5e45bc98010012d7c6 similarity index 100% rename from test/integration/stashNewBranch/expected/.git_keep/objects/ac/b6fb50a77cf7bb6fb9cd5e45bc98010012d7c6 rename to test/integration/stashNewBranch/expected/repo/.git_keep/objects/ac/b6fb50a77cf7bb6fb9cd5e45bc98010012d7c6 diff --git a/test/integration/stashNewBranch/expected/repo/.git_keep/objects/c7/c7da3c64e86c3270f2639a1379e67e14891b6a b/test/integration/stashNewBranch/expected/repo/.git_keep/objects/c7/c7da3c64e86c3270f2639a1379e67e14891b6a new file mode 100644 index 000000000..ee4385f12 Binary files /dev/null and b/test/integration/stashNewBranch/expected/repo/.git_keep/objects/c7/c7da3c64e86c3270f2639a1379e67e14891b6a differ diff --git a/test/integration/stash_Copy/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/stashNewBranch/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 similarity index 100% rename from test/integration/stash_Copy/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 rename to test/integration/stashNewBranch/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 diff --git a/test/integration/stashNewBranch/expected/.git_keep/refs/heads/hello b/test/integration/stashNewBranch/expected/repo/.git_keep/refs/heads/hello similarity index 100% rename from test/integration/stashNewBranch/expected/.git_keep/refs/heads/hello rename to test/integration/stashNewBranch/expected/repo/.git_keep/refs/heads/hello diff --git a/test/integration/stashNewBranch/expected/.git_keep/refs/heads/master b/test/integration/stashNewBranch/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/stashNewBranch/expected/.git_keep/refs/heads/master rename to test/integration/stashNewBranch/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/stashNewBranch/expected/.git_keep/refs/stash b/test/integration/stashNewBranch/expected/repo/.git_keep/refs/stash similarity index 100% rename from test/integration/stashNewBranch/expected/.git_keep/refs/stash rename to test/integration/stashNewBranch/expected/repo/.git_keep/refs/stash diff --git a/test/integration/stashPop/expected/file0 b/test/integration/stashNewBranch/expected/repo/file0 similarity index 100% rename from test/integration/stashPop/expected/file0 rename to test/integration/stashNewBranch/expected/repo/file0 diff --git a/test/integration/stashNewBranch/expected/repo/file1 b/test/integration/stashNewBranch/expected/repo/file1 new file mode 100644 index 000000000..c7c7da3c6 --- /dev/null +++ b/test/integration/stashNewBranch/expected/repo/file1 @@ -0,0 +1 @@ +hello there diff --git a/test/integration/stashNewBranch/expected/repo/file2 b/test/integration/stashNewBranch/expected/repo/file2 new file mode 100644 index 000000000..c7c7da3c6 --- /dev/null +++ b/test/integration/stashNewBranch/expected/repo/file2 @@ -0,0 +1 @@ +hello there diff --git a/test/integration/stashNewBranch/expected/repo/file3 b/test/integration/stashNewBranch/expected/repo/file3 new file mode 100644 index 000000000..c7c7da3c6 --- /dev/null +++ b/test/integration/stashNewBranch/expected/repo/file3 @@ -0,0 +1 @@ +hello there diff --git a/test/integration/stashPop/expected/.git_keep/ORIG_HEAD b/test/integration/stashPop/expected/.git_keep/ORIG_HEAD deleted file mode 100644 index 8e8f6abd0..000000000 --- a/test/integration/stashPop/expected/.git_keep/ORIG_HEAD +++ /dev/null @@ -1 +0,0 @@ -8634432ef171aa4b8d8e688fc1e5645245bf36ac diff --git a/test/integration/stashPop/expected/.git_keep/index b/test/integration/stashPop/expected/.git_keep/index deleted file mode 100644 index 1c25c6cf6..000000000 Binary files a/test/integration/stashPop/expected/.git_keep/index and /dev/null differ diff --git a/test/integration/stashPop/expected/.git_keep/logs/HEAD b/test/integration/stashPop/expected/.git_keep/logs/HEAD deleted file mode 100644 index 36f584bdf..000000000 --- a/test/integration/stashPop/expected/.git_keep/logs/HEAD +++ /dev/null @@ -1,7 +0,0 @@ -0000000000000000000000000000000000000000 8b081dcb0e1fd5e9862d1aa6891b805b101abe7b CI 1643011851 +1100 commit (initial): file0 -8b081dcb0e1fd5e9862d1aa6891b805b101abe7b 3ae4e5d4920afbb1bac23426afb237524c8dbe41 CI 1643011851 +1100 commit: file1 -3ae4e5d4920afbb1bac23426afb237524c8dbe41 8634432ef171aa4b8d8e688fc1e5645245bf36ac CI 1643011852 +1100 commit: file2 -8634432ef171aa4b8d8e688fc1e5645245bf36ac 8634432ef171aa4b8d8e688fc1e5645245bf36ac CI 1643011854 +1100 reset: moving to HEAD -8634432ef171aa4b8d8e688fc1e5645245bf36ac 8634432ef171aa4b8d8e688fc1e5645245bf36ac CI 1643011854 +1100 reset: moving to HEAD -8634432ef171aa4b8d8e688fc1e5645245bf36ac 8634432ef171aa4b8d8e688fc1e5645245bf36ac CI 1643011856 +1100 reset: moving to HEAD -8634432ef171aa4b8d8e688fc1e5645245bf36ac 8634432ef171aa4b8d8e688fc1e5645245bf36ac CI 1643011856 +1100 reset: moving to HEAD diff --git a/test/integration/stashPop/expected/.git_keep/logs/refs/heads/master b/test/integration/stashPop/expected/.git_keep/logs/refs/heads/master deleted file mode 100644 index 5493552ad..000000000 --- a/test/integration/stashPop/expected/.git_keep/logs/refs/heads/master +++ /dev/null @@ -1,3 +0,0 @@ -0000000000000000000000000000000000000000 8b081dcb0e1fd5e9862d1aa6891b805b101abe7b CI 1643011851 +1100 commit (initial): file0 -8b081dcb0e1fd5e9862d1aa6891b805b101abe7b 3ae4e5d4920afbb1bac23426afb237524c8dbe41 CI 1643011851 +1100 commit: file1 -3ae4e5d4920afbb1bac23426afb237524c8dbe41 8634432ef171aa4b8d8e688fc1e5645245bf36ac CI 1643011852 +1100 commit: file2 diff --git a/test/integration/stashPop/expected/.git_keep/logs/refs/stash b/test/integration/stashPop/expected/.git_keep/logs/refs/stash deleted file mode 100644 index 4a66ec164..000000000 --- a/test/integration/stashPop/expected/.git_keep/logs/refs/stash +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 437b9b0ca941f1e12c8b45958f5d6ebd11cdd41a CI 1643011856 +1100 On master: asd diff --git a/test/integration/stashPop/expected/.git_keep/objects/3a/e4e5d4920afbb1bac23426afb237524c8dbe41 b/test/integration/stashPop/expected/.git_keep/objects/3a/e4e5d4920afbb1bac23426afb237524c8dbe41 deleted file mode 100644 index aa0e72eed..000000000 Binary files a/test/integration/stashPop/expected/.git_keep/objects/3a/e4e5d4920afbb1bac23426afb237524c8dbe41 and /dev/null differ diff --git a/test/integration/stashPop/expected/.git_keep/objects/43/7b9b0ca941f1e12c8b45958f5d6ebd11cdd41a b/test/integration/stashPop/expected/.git_keep/objects/43/7b9b0ca941f1e12c8b45958f5d6ebd11cdd41a deleted file mode 100644 index 38198edd1..000000000 --- a/test/integration/stashPop/expected/.git_keep/objects/43/7b9b0ca941f1e12c8b45958f5d6ebd11cdd41a +++ /dev/null @@ -1 +0,0 @@ -xŤĎ±j1 €áÎ÷ŢE˛%YWJ dĘÔgm™ę\¸¸ĐÇďMť»ţ|Ë_·1>g¤OswęşTˇćČDÉŤąŻ¬kÉX[“ĺn»ßfPID)zÇŚfT´©‹jŻč,Ä‘¸ô$V˙|¬ő¨˛&óµëŕM­dŹ‘A©Ő†y±ďů±íár Ż—ëŮlÜżüąnă- PDe 'D€ĺ¨ÇÄôňĺý†=˙ěŃ~ÜcJ) \ No newline at end of file diff --git a/test/integration/stashPop/expected/.git_keep/objects/82/cc524693ae9fb40af0ed8ab7e22581084dcd17 b/test/integration/stashPop/expected/.git_keep/objects/82/cc524693ae9fb40af0ed8ab7e22581084dcd17 deleted file mode 100644 index 1794b8694..000000000 Binary files a/test/integration/stashPop/expected/.git_keep/objects/82/cc524693ae9fb40af0ed8ab7e22581084dcd17 and /dev/null differ diff --git a/test/integration/stashPop/expected/.git_keep/objects/86/34432ef171aa4b8d8e688fc1e5645245bf36ac b/test/integration/stashPop/expected/.git_keep/objects/86/34432ef171aa4b8d8e688fc1e5645245bf36ac deleted file mode 100644 index 24d309c9e..000000000 Binary files a/test/integration/stashPop/expected/.git_keep/objects/86/34432ef171aa4b8d8e688fc1e5645245bf36ac and /dev/null differ diff --git a/test/integration/stashPop/expected/.git_keep/objects/8b/081dcb0e1fd5e9862d1aa6891b805b101abe7b b/test/integration/stashPop/expected/.git_keep/objects/8b/081dcb0e1fd5e9862d1aa6891b805b101abe7b deleted file mode 100644 index e730193f1..000000000 Binary files a/test/integration/stashPop/expected/.git_keep/objects/8b/081dcb0e1fd5e9862d1aa6891b805b101abe7b and /dev/null differ diff --git a/test/integration/stashPop/expected/.git_keep/objects/8b/d86c566a91e9f8ace9883f7017f562c971b3f7 b/test/integration/stashPop/expected/.git_keep/objects/8b/d86c566a91e9f8ace9883f7017f562c971b3f7 deleted file mode 100644 index 4541e3cc9..000000000 Binary files a/test/integration/stashPop/expected/.git_keep/objects/8b/d86c566a91e9f8ace9883f7017f562c971b3f7 and /dev/null differ diff --git a/test/integration/stashPop/expected/.git_keep/objects/b0/00623a052b4d2226c43ba396b830738799740e b/test/integration/stashPop/expected/.git_keep/objects/b0/00623a052b4d2226c43ba396b830738799740e deleted file mode 100644 index 8ebf85670..000000000 Binary files a/test/integration/stashPop/expected/.git_keep/objects/b0/00623a052b4d2226c43ba396b830738799740e and /dev/null differ diff --git a/test/integration/stashPop/expected/.git_keep/objects/c6/a8d49b926afc9ff2b4c64398ee678c50c2c953 b/test/integration/stashPop/expected/.git_keep/objects/c6/a8d49b926afc9ff2b4c64398ee678c50c2c953 deleted file mode 100644 index 6f47ae7a5..000000000 --- a/test/integration/stashPop/expected/.git_keep/objects/c6/a8d49b926afc9ff2b4c64398ee678c50c2c953 +++ /dev/null @@ -1 +0,0 @@ -xŤŹ±j1 @;ßWh/Ë–e](Ąé¶lťe[¦8®.äósK;g}Ľ7Ľ˛ö~ŕŮżŚÍ IJk\Ş©wŽ”…Lcls”9'Ěkbĺ馛]˘ŕ­aBUĘRĹX¤´Č=ĹÜků÷});ĺ9¨Í-“Ó權ćdŢGA'TKĹ4éďř^78.đ~\>í®ýv±·˛ö@¦ŕ%2Ľ":7ítźö¤>}-'XŻĐőgoĐÎóř˛M} \ No newline at end of file diff --git a/test/integration/stashPop/expected/.git_keep/objects/e0/0e994a4acb98bcbe93ad478e09dcb3bed6b26c b/test/integration/stashPop/expected/.git_keep/objects/e0/0e994a4acb98bcbe93ad478e09dcb3bed6b26c deleted file mode 100644 index 026ea2da1..000000000 Binary files a/test/integration/stashPop/expected/.git_keep/objects/e0/0e994a4acb98bcbe93ad478e09dcb3bed6b26c and /dev/null differ diff --git a/test/integration/stashPop/expected/.git_keep/refs/heads/master b/test/integration/stashPop/expected/.git_keep/refs/heads/master deleted file mode 100644 index 8e8f6abd0..000000000 --- a/test/integration/stashPop/expected/.git_keep/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -8634432ef171aa4b8d8e688fc1e5645245bf36ac diff --git a/test/integration/stashPop/expected/.git_keep/refs/stash b/test/integration/stashPop/expected/.git_keep/refs/stash deleted file mode 100644 index 86ea2c9b3..000000000 --- a/test/integration/stashPop/expected/.git_keep/refs/stash +++ /dev/null @@ -1 +0,0 @@ -437b9b0ca941f1e12c8b45958f5d6ebd11cdd41a diff --git a/test/integration/undo2/expected/.git_keep/COMMIT_EDITMSG b/test/integration/stashPop/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/undo2/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/stashPop/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/undo2/expected/.git_keep/FETCH_HEAD b/test/integration/stashPop/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/undo2/expected/.git_keep/FETCH_HEAD rename to test/integration/stashPop/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/stashPop/expected/repo/.git_keep/HEAD b/test/integration/stashPop/expected/repo/.git_keep/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/test/integration/stashPop/expected/repo/.git_keep/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/test/integration/stashPop/expected/repo/.git_keep/ORIG_HEAD b/test/integration/stashPop/expected/repo/.git_keep/ORIG_HEAD new file mode 100644 index 000000000..3823b7b86 --- /dev/null +++ b/test/integration/stashPop/expected/repo/.git_keep/ORIG_HEAD @@ -0,0 +1 @@ +f9bd523df842e6b52de8880c366f7d15d6bab650 diff --git a/test/integration/stashPop/expected/repo/.git_keep/config b/test/integration/stashPop/expected/repo/.git_keep/config new file mode 100644 index 000000000..596ebaeb3 --- /dev/null +++ b/test/integration/stashPop/expected/repo/.git_keep/config @@ -0,0 +1,8 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[user] + email = CI@example.com + name = CI diff --git a/test/integration/stashPop/expected/repo/.git_keep/description b/test/integration/stashPop/expected/repo/.git_keep/description new file mode 100644 index 000000000..498b267a8 --- /dev/null +++ b/test/integration/stashPop/expected/repo/.git_keep/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/integration/stashPop/expected/repo/.git_keep/index b/test/integration/stashPop/expected/repo/.git_keep/index new file mode 100644 index 000000000..667aead25 Binary files /dev/null and b/test/integration/stashPop/expected/repo/.git_keep/index differ diff --git a/test/integration/stashPop/expected/repo/.git_keep/info/exclude b/test/integration/stashPop/expected/repo/.git_keep/info/exclude new file mode 100644 index 000000000..a5196d1be --- /dev/null +++ b/test/integration/stashPop/expected/repo/.git_keep/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/test/integration/stashPop/expected/repo/.git_keep/logs/HEAD b/test/integration/stashPop/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..f205db06f --- /dev/null +++ b/test/integration/stashPop/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,4 @@ +0000000000000000000000000000000000000000 4a80cc4f1537d7ce4f184f346c9ba7c51bb34aee CI 1650270548 +0200 commit (initial): file0 +4a80cc4f1537d7ce4f184f346c9ba7c51bb34aee f26e5e813038fe0c31c4733d57fcf93758736e71 CI 1650270548 +0200 commit: file1 +f26e5e813038fe0c31c4733d57fcf93758736e71 f9bd523df842e6b52de8880c366f7d15d6bab650 CI 1650270548 +0200 commit: file2 +f9bd523df842e6b52de8880c366f7d15d6bab650 f9bd523df842e6b52de8880c366f7d15d6bab650 CI 1650270548 +0200 reset: moving to HEAD diff --git a/test/integration/stashPop/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/stashPop/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..f3893791a --- /dev/null +++ b/test/integration/stashPop/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 4a80cc4f1537d7ce4f184f346c9ba7c51bb34aee CI 1650270548 +0200 commit (initial): file0 +4a80cc4f1537d7ce4f184f346c9ba7c51bb34aee f26e5e813038fe0c31c4733d57fcf93758736e71 CI 1650270548 +0200 commit: file1 +f26e5e813038fe0c31c4733d57fcf93758736e71 f9bd523df842e6b52de8880c366f7d15d6bab650 CI 1650270548 +0200 commit: file2 diff --git a/test/integration/stashPop/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/stashPop/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 new file mode 100644 index 000000000..f74bf2335 Binary files /dev/null and b/test/integration/stashPop/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 differ diff --git a/test/integration/stash_Copy/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/stashPop/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/stash_Copy/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/stashPop/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/stashPop/expected/repo/.git_keep/objects/2d/79a3b4f905a83d994f860d3d91625fab899422 b/test/integration/stashPop/expected/repo/.git_keep/objects/2d/79a3b4f905a83d994f860d3d91625fab899422 new file mode 100644 index 000000000..947808f26 --- /dev/null +++ b/test/integration/stashPop/expected/repo/.git_keep/objects/2d/79a3b4f905a83d994f860d3d91625fab899422 @@ -0,0 +1 @@ +xŤĎËJ1…a×ýµ$©ÜaVłň*©*F0“¦;‚Źo6îÝ>ümôţ9C~š‡„&ZH…"ąÄąhÁ čĄj˛ÄŇjtlŐ¤m§C´TčXłG‰5 KÎŮ4Ł&¶cĄůóU©iąIĚŐW5ž=/ÓŚĂě$Ző•iŁďy\ođz˝˝ËőýK^Účo`×&|†gĆlk]SţÉ·Źt:—żŔ9éĽĂŔÇŘš=P6 \ No newline at end of file diff --git a/test/integration/stash_Copy/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/stashPop/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/stash_Copy/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/stashPop/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/stashPop/expected/repo/.git_keep/objects/42/ffa95ec8ce68b4bf04d4dab6c03283e61f4bda b/test/integration/stashPop/expected/repo/.git_keep/objects/42/ffa95ec8ce68b4bf04d4dab6c03283e61f4bda new file mode 100644 index 000000000..425c6c04d --- /dev/null +++ b/test/integration/stashPop/expected/repo/.git_keep/objects/42/ffa95ec8ce68b4bf04d4dab6c03283e61f4bda @@ -0,0 +1,3 @@ +xŤŽÁ +Â0D=ç+ö.H˛m’UD„žúIv…¦-5B?ß\Ľ{ť™7Ľ´–2U@ăOu«Ż92cČ1łŐĆ;ÉžÄa&µ…]– +ůŮbÇ™z-r; ť:ç˛gcŮĹťŐ*|ękÝaá>ŚO9BŮfव<Ŕ´˝¶=ÁYŁÖŞĄMŞĘźs5-,¬ ”đnÔígyšŐ8Bj \ No newline at end of file diff --git a/test/integration/stashPop/expected/repo/.git_keep/objects/4a/80cc4f1537d7ce4f184f346c9ba7c51bb34aee b/test/integration/stashPop/expected/repo/.git_keep/objects/4a/80cc4f1537d7ce4f184f346c9ba7c51bb34aee new file mode 100644 index 000000000..6f2666e32 --- /dev/null +++ b/test/integration/stashPop/expected/repo/.git_keep/objects/4a/80cc4f1537d7ce4f184f346c9ba7c51bb34aee @@ -0,0 +1,2 @@ +xŤÍA +Ă Fá®=Ĺě e´ŁF(ˇUގń—"†`!ÇoŽĐíă·´Z×NZäÖ€4žp>…rŇÖ»5ŔC*Rؤ\L€Łâ·ÚAÓLŻi~ăŚußđXZI;ËĆł•îlŐUŻIÇź\•u«Úl+č \ No newline at end of file diff --git a/test/integration/stashPop/expected/repo/.git_keep/objects/5c/ef9afea6a37d89f925e24ebf71adecb63d1f07 b/test/integration/stashPop/expected/repo/.git_keep/objects/5c/ef9afea6a37d89f925e24ebf71adecb63d1f07 new file mode 100644 index 000000000..6a6f24362 Binary files /dev/null and b/test/integration/stashPop/expected/repo/.git_keep/objects/5c/ef9afea6a37d89f925e24ebf71adecb63d1f07 differ diff --git a/test/integration/tags2/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/stashPop/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c similarity index 100% rename from test/integration/tags2/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c rename to test/integration/stashPop/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c diff --git a/test/integration/stashPop/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/stashPop/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 new file mode 100644 index 000000000..285df3e5f Binary files /dev/null and b/test/integration/stashPop/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 differ diff --git a/test/integration/stashPop/expected/repo/.git_keep/objects/c7/c7da3c64e86c3270f2639a1379e67e14891b6a b/test/integration/stashPop/expected/repo/.git_keep/objects/c7/c7da3c64e86c3270f2639a1379e67e14891b6a new file mode 100644 index 000000000..ee4385f12 Binary files /dev/null and b/test/integration/stashPop/expected/repo/.git_keep/objects/c7/c7da3c64e86c3270f2639a1379e67e14891b6a differ diff --git a/test/integration/tags/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/stashPop/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 similarity index 100% rename from test/integration/tags/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 rename to test/integration/stashPop/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 diff --git a/test/integration/stashPop/expected/repo/.git_keep/objects/f2/6e5e813038fe0c31c4733d57fcf93758736e71 b/test/integration/stashPop/expected/repo/.git_keep/objects/f2/6e5e813038fe0c31c4733d57fcf93758736e71 new file mode 100644 index 000000000..9934ea2ee Binary files /dev/null and b/test/integration/stashPop/expected/repo/.git_keep/objects/f2/6e5e813038fe0c31c4733d57fcf93758736e71 differ diff --git a/test/integration/stashPop/expected/repo/.git_keep/objects/f9/bd523df842e6b52de8880c366f7d15d6bab650 b/test/integration/stashPop/expected/repo/.git_keep/objects/f9/bd523df842e6b52de8880c366f7d15d6bab650 new file mode 100644 index 000000000..c48bcf855 --- /dev/null +++ b/test/integration/stashPop/expected/repo/.git_keep/objects/f9/bd523df842e6b52de8880c366f7d15d6bab650 @@ -0,0 +1,2 @@ +xŤÎ1 +Ă0 @ŃÎ>…÷B‘ĄŘR ”B¦Ă‘eHš\čń›#týĽáë¶®sóˇÇK;Ě|o"™ˇ¨ÁR0ש–“U "H“˘ş=önľb˛hHŞRĐŽ‰J䪵'ŽÂ”ŚËźöÚ?Śţ>ŚOűću_ě¦Űúđ!E@†Ř‰ż¸łžSÍţä®Î‹ˇű“Ď9y \ No newline at end of file diff --git a/test/integration/stashPop/expected/repo/.git_keep/refs/heads/master b/test/integration/stashPop/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..3823b7b86 --- /dev/null +++ b/test/integration/stashPop/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +f9bd523df842e6b52de8880c366f7d15d6bab650 diff --git a/test/integration/stash_Copy/expected/file0 b/test/integration/stashPop/expected/repo/file0 similarity index 100% rename from test/integration/stash_Copy/expected/file0 rename to test/integration/stashPop/expected/repo/file0 diff --git a/test/integration/stashPop/expected/repo/file1 b/test/integration/stashPop/expected/repo/file1 new file mode 100644 index 000000000..c7c7da3c6 --- /dev/null +++ b/test/integration/stashPop/expected/repo/file1 @@ -0,0 +1 @@ +hello there diff --git a/test/integration/stashPop/expected/repo/file2 b/test/integration/stashPop/expected/repo/file2 new file mode 100644 index 000000000..c7c7da3c6 --- /dev/null +++ b/test/integration/stashPop/expected/repo/file2 @@ -0,0 +1 @@ +hello there diff --git a/test/integration/stashPop/expected/repo/file3 b/test/integration/stashPop/expected/repo/file3 new file mode 100644 index 000000000..c7c7da3c6 --- /dev/null +++ b/test/integration/stashPop/expected/repo/file3 @@ -0,0 +1 @@ +hello there diff --git a/test/integration/stashPop/recording.json b/test/integration/stashPop/recording.json index 8629fa444..272f83875 100644 --- a/test/integration/stashPop/recording.json +++ b/test/integration/stashPop/recording.json @@ -1 +1 @@ -{"KeyEvents":[{"Timestamp":752,"Mod":0,"Key":256,"Ch":32},{"Timestamp":1144,"Mod":0,"Key":256,"Ch":83},{"Timestamp":1424,"Mod":0,"Key":258,"Ch":0},{"Timestamp":1640,"Mod":0,"Key":13,"Ch":13},{"Timestamp":1742,"Mod":0,"Key":256,"Ch":97},{"Timestamp":1775,"Mod":0,"Key":256,"Ch":115},{"Timestamp":1832,"Mod":0,"Key":256,"Ch":100},{"Timestamp":2097,"Mod":0,"Key":13,"Ch":13},{"Timestamp":2552,"Mod":0,"Key":256,"Ch":32},{"Timestamp":3065,"Mod":0,"Key":256,"Ch":83},{"Timestamp":3425,"Mod":0,"Key":258,"Ch":0},{"Timestamp":3584,"Mod":0,"Key":13,"Ch":13},{"Timestamp":3840,"Mod":0,"Key":256,"Ch":97},{"Timestamp":3880,"Mod":0,"Key":256,"Ch":115},{"Timestamp":3967,"Mod":0,"Key":256,"Ch":100},{"Timestamp":4656,"Mod":0,"Key":13,"Ch":13},{"Timestamp":5121,"Mod":0,"Key":259,"Ch":0},{"Timestamp":5304,"Mod":0,"Key":259,"Ch":0},{"Timestamp":5608,"Mod":0,"Key":259,"Ch":0},{"Timestamp":6008,"Mod":0,"Key":258,"Ch":0},{"Timestamp":6921,"Mod":0,"Key":256,"Ch":103},{"Timestamp":7328,"Mod":0,"Key":13,"Ch":13},{"Timestamp":8304,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":272,"Height":74}]} \ No newline at end of file +{"KeyEvents":[{"Timestamp":658,"Mod":0,"Key":256,"Ch":53},{"Timestamp":1387,"Mod":0,"Key":256,"Ch":103},{"Timestamp":2364,"Mod":0,"Key":13,"Ch":13},{"Timestamp":3446,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":239,"Height":55}]} \ No newline at end of file diff --git a/test/integration/stashPop/setup.sh b/test/integration/stashPop/setup.sh index caff56b7d..2278d53d8 100644 --- a/test/integration/stashPop/setup.sh +++ b/test/integration/stashPop/setup.sh @@ -24,3 +24,5 @@ git commit -am file2 echo "hello there" > file1 echo "hello there" > file2 echo "hello there" > file3 + +git stash save "stash to drop" diff --git a/test/integration/stashStagedChanges/expected/repo/.git_keep/COMMIT_EDITMSG b/test/integration/stashStagedChanges/expected/repo/.git_keep/COMMIT_EDITMSG new file mode 100644 index 000000000..6c493ff74 --- /dev/null +++ b/test/integration/stashStagedChanges/expected/repo/.git_keep/COMMIT_EDITMSG @@ -0,0 +1 @@ +file2 diff --git a/test/integration/submoduleRemove/expected/.gitmodules_keep b/test/integration/stashStagedChanges/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/submoduleRemove/expected/.gitmodules_keep rename to test/integration/stashStagedChanges/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/stashStagedChanges/expected/repo/.git_keep/HEAD b/test/integration/stashStagedChanges/expected/repo/.git_keep/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/test/integration/stashStagedChanges/expected/repo/.git_keep/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/test/integration/stashStagedChanges/expected/repo/.git_keep/ORIG_HEAD b/test/integration/stashStagedChanges/expected/repo/.git_keep/ORIG_HEAD new file mode 100644 index 000000000..218f6a270 --- /dev/null +++ b/test/integration/stashStagedChanges/expected/repo/.git_keep/ORIG_HEAD @@ -0,0 +1 @@ +b71c3131aa943097c697d5194d0f4de01f82b743 diff --git a/test/integration/stashStagedChanges/expected/repo/.git_keep/config b/test/integration/stashStagedChanges/expected/repo/.git_keep/config new file mode 100644 index 000000000..596ebaeb3 --- /dev/null +++ b/test/integration/stashStagedChanges/expected/repo/.git_keep/config @@ -0,0 +1,8 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[user] + email = CI@example.com + name = CI diff --git a/test/integration/stashStagedChanges/expected/repo/.git_keep/description b/test/integration/stashStagedChanges/expected/repo/.git_keep/description new file mode 100644 index 000000000..498b267a8 --- /dev/null +++ b/test/integration/stashStagedChanges/expected/repo/.git_keep/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/integration/stashStagedChanges/expected/repo/.git_keep/index b/test/integration/stashStagedChanges/expected/repo/.git_keep/index new file mode 100644 index 000000000..09e14a6d2 Binary files /dev/null and b/test/integration/stashStagedChanges/expected/repo/.git_keep/index differ diff --git a/test/integration/stashStagedChanges/expected/repo/.git_keep/info/exclude b/test/integration/stashStagedChanges/expected/repo/.git_keep/info/exclude new file mode 100644 index 000000000..a5196d1be --- /dev/null +++ b/test/integration/stashStagedChanges/expected/repo/.git_keep/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/test/integration/stashStagedChanges/expected/repo/.git_keep/logs/HEAD b/test/integration/stashStagedChanges/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..4df45bbb4 --- /dev/null +++ b/test/integration/stashStagedChanges/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,5 @@ +0000000000000000000000000000000000000000 6cd167c43cd50ae47f776f182ed6ff0b0a4471e3 CI 1651831365 +0200 commit (initial): file0 +6cd167c43cd50ae47f776f182ed6ff0b0a4471e3 29d32b3857eab1a570b9fc534dd90b9876c5cd1a CI 1651831365 +0200 commit: file1 +29d32b3857eab1a570b9fc534dd90b9876c5cd1a b71c3131aa943097c697d5194d0f4de01f82b743 CI 1651831365 +0200 commit: file2 +b71c3131aa943097c697d5194d0f4de01f82b743 b71c3131aa943097c697d5194d0f4de01f82b743 CI 1651831372 +0200 reset: moving to HEAD +b71c3131aa943097c697d5194d0f4de01f82b743 b71c3131aa943097c697d5194d0f4de01f82b743 CI 1651831372 +0200 reset: moving to HEAD diff --git a/test/integration/stashStagedChanges/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/stashStagedChanges/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..106c3646d --- /dev/null +++ b/test/integration/stashStagedChanges/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 6cd167c43cd50ae47f776f182ed6ff0b0a4471e3 CI 1651831365 +0200 commit (initial): file0 +6cd167c43cd50ae47f776f182ed6ff0b0a4471e3 29d32b3857eab1a570b9fc534dd90b9876c5cd1a CI 1651831365 +0200 commit: file1 +29d32b3857eab1a570b9fc534dd90b9876c5cd1a b71c3131aa943097c697d5194d0f4de01f82b743 CI 1651831365 +0200 commit: file2 diff --git a/test/integration/stashStagedChanges/expected/repo/.git_keep/logs/refs/stash b/test/integration/stashStagedChanges/expected/repo/.git_keep/logs/refs/stash new file mode 100644 index 000000000..e5d15aef0 --- /dev/null +++ b/test/integration/stashStagedChanges/expected/repo/.git_keep/logs/refs/stash @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 cc4c970471739bc691d2e94cdb419f6e7932f396 CI 1651831372 +0200 On master: stash staged diff --git a/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 new file mode 100644 index 000000000..f74bf2335 Binary files /dev/null and b/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 differ diff --git a/test/integration/tags/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/tags/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/stashStagedChanges/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/28/59c9a5f343c80929844d6e49d3792b9169c4da b/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/28/59c9a5f343c80929844d6e49d3792b9169c4da new file mode 100644 index 000000000..ea6cd3866 Binary files /dev/null and b/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/28/59c9a5f343c80929844d6e49d3792b9169c4da differ diff --git a/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/29/d32b3857eab1a570b9fc534dd90b9876c5cd1a b/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/29/d32b3857eab1a570b9fc534dd90b9876c5cd1a new file mode 100644 index 000000000..7363877b2 --- /dev/null +++ b/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/29/d32b3857eab1a570b9fc534dd90b9876c5cd1a @@ -0,0 +1,3 @@ +xŤÎM +Â0@a×9Eö‚ĚägŇ€ĐUŹ1ťL°ĐŘR"x|{·Źońdkméł»ôCŐH$’E ł0»â©Î’8ÇZĽ:r €fçCßÝ’¤$ÁK‰ŔRM‰*N Ő +3p Őţô×vŘq˛÷qzę—ŰľęM¶ö°HŹž˘˝‚0g=§şţÉM]VEóÁŘ9ă \ No newline at end of file diff --git a/test/integration/tags/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/tags/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/stashStagedChanges/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/4f/301f03a7f9c5a3c98aa219dd0f184afec3f248 b/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/4f/301f03a7f9c5a3c98aa219dd0f184afec3f248 new file mode 100644 index 000000000..6dc24b6d3 Binary files /dev/null and b/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/4f/301f03a7f9c5a3c98aa219dd0f184afec3f248 differ diff --git a/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/67/9786f833f91434f42757cc4b3bfb9ee1c573c5 b/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/67/9786f833f91434f42757cc4b3bfb9ee1c573c5 new file mode 100644 index 000000000..add1a9479 --- /dev/null +++ b/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/67/9786f833f91434f42757cc4b3bfb9ee1c573c5 @@ -0,0 +1,2 @@ +xŤŽA +Â0E]çł$“I›DD„®zŚi2Á‚iKŤĐ㛍{·ź÷/®ĄĚ şSÝEŔfŇ5±Ë!vL1xf!%ťŃ[Î)ëŐĆ»,&‡‘9XŇÁĹ>¸Ôa°Ť·IšË›ÉYRü©Ďu‡a„Ű0>äಽä×rě;ôMâ śµŃZµµEUůWó’ä€uÂďöşţŞ Ď/1ę XKA \ No newline at end of file diff --git a/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/6c/d167c43cd50ae47f776f182ed6ff0b0a4471e3 b/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/6c/d167c43cd50ae47f776f182ed6ff0b0a4471e3 new file mode 100644 index 000000000..1cf887e68 Binary files /dev/null and b/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/6c/d167c43cd50ae47f776f182ed6ff0b0a4471e3 differ diff --git a/test/integration/tags3/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c similarity index 100% rename from test/integration/tags3/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c rename to test/integration/stashStagedChanges/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c diff --git a/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 new file mode 100644 index 000000000..285df3e5f Binary files /dev/null and b/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 differ diff --git a/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/b7/1c3131aa943097c697d5194d0f4de01f82b743 b/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/b7/1c3131aa943097c697d5194d0f4de01f82b743 new file mode 100644 index 000000000..a0d6edf73 Binary files /dev/null and b/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/b7/1c3131aa943097c697d5194d0f4de01f82b743 differ diff --git a/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/c7/c7da3c64e86c3270f2639a1379e67e14891b6a b/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/c7/c7da3c64e86c3270f2639a1379e67e14891b6a new file mode 100644 index 000000000..ee4385f12 Binary files /dev/null and b/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/c7/c7da3c64e86c3270f2639a1379e67e14891b6a differ diff --git a/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/cc/4c970471739bc691d2e94cdb419f6e7932f396 b/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/cc/4c970471739bc691d2e94cdb419f6e7932f396 new file mode 100644 index 000000000..8bc1b9af9 Binary files /dev/null and b/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/cc/4c970471739bc691d2e94cdb419f6e7932f396 differ diff --git a/test/integration/tags2/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 similarity index 100% rename from test/integration/tags2/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 rename to test/integration/stashStagedChanges/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 diff --git a/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/fb/0410e49f4f878fc7a57497556a45c7d052a63e b/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/fb/0410e49f4f878fc7a57497556a45c7d052a63e new file mode 100644 index 000000000..bd48dab01 --- /dev/null +++ b/test/integration/stashStagedChanges/expected/repo/.git_keep/objects/fb/0410e49f4f878fc7a57497556a45c7d052a63e @@ -0,0 +1 @@ +xŤŹ±j1 SďW¸[’-ë!pŐvéR۲LηÇĆ|~¶ą>ícĂč6Će:Hđ4w39ŠJ‰ 5{ÉD-IC¨’(µ˛ÜËn·é*Ĺ€ˇ!ôš„[ BÍwjćCĎP™đÁ'ΩgÄ.:GVĄŠµW1 5.ĺg~m»;ŻîőĽľŰo÷«˝č6Ţ\H1äCĘŕž=xżë1íźřňą~¸íćFů>>§Gë—«ÁÂ4LR \ No newline at end of file diff --git a/test/integration/stashStagedChanges/expected/repo/.git_keep/refs/heads/master b/test/integration/stashStagedChanges/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..218f6a270 --- /dev/null +++ b/test/integration/stashStagedChanges/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +b71c3131aa943097c697d5194d0f4de01f82b743 diff --git a/test/integration/stashStagedChanges/expected/repo/.git_keep/refs/stash b/test/integration/stashStagedChanges/expected/repo/.git_keep/refs/stash new file mode 100644 index 000000000..58354ed35 --- /dev/null +++ b/test/integration/stashStagedChanges/expected/repo/.git_keep/refs/stash @@ -0,0 +1 @@ +cc4c970471739bc691d2e94cdb419f6e7932f396 diff --git a/test/integration/tags/expected/file0 b/test/integration/stashStagedChanges/expected/repo/file0 similarity index 100% rename from test/integration/tags/expected/file0 rename to test/integration/stashStagedChanges/expected/repo/file0 diff --git a/test/integration/stashStagedChanges/expected/repo/file1 b/test/integration/stashStagedChanges/expected/repo/file1 new file mode 100644 index 000000000..c7c7da3c6 --- /dev/null +++ b/test/integration/stashStagedChanges/expected/repo/file1 @@ -0,0 +1 @@ +hello there diff --git a/test/integration/stashStagedChanges/expected/repo/file2 b/test/integration/stashStagedChanges/expected/repo/file2 new file mode 100644 index 000000000..c7c7da3c6 --- /dev/null +++ b/test/integration/stashStagedChanges/expected/repo/file2 @@ -0,0 +1 @@ +hello there diff --git a/test/integration/stashStagedChanges/expected/repo/file3 b/test/integration/stashStagedChanges/expected/repo/file3 new file mode 100644 index 000000000..c7c7da3c6 --- /dev/null +++ b/test/integration/stashStagedChanges/expected/repo/file3 @@ -0,0 +1 @@ +hello there diff --git a/test/integration/stashStagedChanges/recording.json b/test/integration/stashStagedChanges/recording.json new file mode 100644 index 000000000..70962d14a --- /dev/null +++ b/test/integration/stashStagedChanges/recording.json @@ -0,0 +1 @@ +{"KeyEvents":[{"Timestamp":1280,"Mod":0,"Key":256,"Ch":32},{"Timestamp":2255,"Mod":0,"Key":256,"Ch":106},{"Timestamp":2343,"Mod":0,"Key":256,"Ch":106},{"Timestamp":2674,"Mod":0,"Key":256,"Ch":32},{"Timestamp":3166,"Mod":0,"Key":256,"Ch":83},{"Timestamp":4209,"Mod":0,"Key":256,"Ch":115},{"Timestamp":4609,"Mod":0,"Key":256,"Ch":115},{"Timestamp":4677,"Mod":0,"Key":256,"Ch":116},{"Timestamp":4764,"Mod":0,"Key":256,"Ch":97},{"Timestamp":4831,"Mod":0,"Key":256,"Ch":115},{"Timestamp":4956,"Mod":0,"Key":256,"Ch":104},{"Timestamp":5090,"Mod":0,"Key":256,"Ch":32},{"Timestamp":5382,"Mod":0,"Key":256,"Ch":115},{"Timestamp":5442,"Mod":0,"Key":256,"Ch":116},{"Timestamp":5529,"Mod":0,"Key":256,"Ch":97},{"Timestamp":5632,"Mod":0,"Key":256,"Ch":103},{"Timestamp":5696,"Mod":0,"Key":256,"Ch":101},{"Timestamp":5836,"Mod":0,"Key":256,"Ch":100},{"Timestamp":6323,"Mod":0,"Key":13,"Ch":13},{"Timestamp":7236,"Mod":0,"Key":256,"Ch":53},{"Timestamp":8544,"Mod":0,"Key":256,"Ch":32},{"Timestamp":9140,"Mod":0,"Key":13,"Ch":13},{"Timestamp":10071,"Mod":0,"Key":256,"Ch":50},{"Timestamp":10936,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":239,"Height":56}]} diff --git a/test/integration/stashStagedChanges/setup.sh b/test/integration/stashStagedChanges/setup.sh new file mode 100644 index 000000000..caff56b7d --- /dev/null +++ b/test/integration/stashStagedChanges/setup.sh @@ -0,0 +1,26 @@ +#!/bin/sh + +set -e + +cd $1 + +git init + +git config user.email "CI@example.com" +git config user.name "CI" + +echo test0 > file0 +git add . +git commit -am file0 + +echo test1 > file1 +git add . +git commit -am file1 + +echo test2 > file2 +git add . +git commit -am file2 + +echo "hello there" > file1 +echo "hello there" > file2 +echo "hello there" > file3 diff --git a/test/integration/stashStagedChanges/test.json b/test/integration/stashStagedChanges/test.json new file mode 100644 index 000000000..4f9314caa --- /dev/null +++ b/test/integration/stashStagedChanges/test.json @@ -0,0 +1 @@ +{ "description": "Stashing some files", "speed": 5 } diff --git a/test/integration/stashUnstagedChanges/expected/repo/.git_keep/COMMIT_EDITMSG b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/COMMIT_EDITMSG new file mode 100644 index 000000000..a7a2e0039 --- /dev/null +++ b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/COMMIT_EDITMSG @@ -0,0 +1 @@ +[lazygit] stashing unstaged changes diff --git a/test/integration/switchTabFromMenu/expected/file0 b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/switchTabFromMenu/expected/file0 rename to test/integration/stashUnstagedChanges/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/stashUnstagedChanges/expected/repo/.git_keep/HEAD b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/test/integration/stashUnstagedChanges/expected/repo/.git_keep/ORIG_HEAD b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/ORIG_HEAD new file mode 100644 index 000000000..1a390f25a --- /dev/null +++ b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/ORIG_HEAD @@ -0,0 +1 @@ +70dfa7fd25e9af49b7277738270a61d5dfbbac53 diff --git a/test/integration/stashUnstagedChanges/expected/repo/.git_keep/config b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/config new file mode 100644 index 000000000..596ebaeb3 --- /dev/null +++ b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/config @@ -0,0 +1,8 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[user] + email = CI@example.com + name = CI diff --git a/test/integration/stashUnstagedChanges/expected/repo/.git_keep/description b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/description new file mode 100644 index 000000000..498b267a8 --- /dev/null +++ b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/integration/stashUnstagedChanges/expected/repo/.git_keep/index b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/index new file mode 100644 index 000000000..4421704b3 Binary files /dev/null and b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/index differ diff --git a/test/integration/stashUnstagedChanges/expected/repo/.git_keep/info/exclude b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/info/exclude new file mode 100644 index 000000000..a5196d1be --- /dev/null +++ b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/test/integration/stashUnstagedChanges/expected/repo/.git_keep/logs/HEAD b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..bf3da7509 --- /dev/null +++ b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,6 @@ +0000000000000000000000000000000000000000 f8e5bdb9f59bd7ae0c72bb4aa0bb9d6af96ec689 CI 1651831332 +0200 commit (initial): file0 +f8e5bdb9f59bd7ae0c72bb4aa0bb9d6af96ec689 e702e6113eff6883a33505e2b28cff2df3420fed CI 1651831332 +0200 commit: file1 +e702e6113eff6883a33505e2b28cff2df3420fed b245d3aa308ffdfdd194a94ad84a678a8a7a028c CI 1651831332 +0200 commit: file2 +b245d3aa308ffdfdd194a94ad84a678a8a7a028c 70dfa7fd25e9af49b7277738270a61d5dfbbac53 CI 1651831340 +0200 commit: [lazygit] stashing unstaged changes +70dfa7fd25e9af49b7277738270a61d5dfbbac53 70dfa7fd25e9af49b7277738270a61d5dfbbac53 CI 1651831340 +0200 reset: moving to HEAD +70dfa7fd25e9af49b7277738270a61d5dfbbac53 b245d3aa308ffdfdd194a94ad84a678a8a7a028c CI 1651831340 +0200 reset: moving to HEAD^ diff --git a/test/integration/stashUnstagedChanges/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..e46c60988 --- /dev/null +++ b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,5 @@ +0000000000000000000000000000000000000000 f8e5bdb9f59bd7ae0c72bb4aa0bb9d6af96ec689 CI 1651831332 +0200 commit (initial): file0 +f8e5bdb9f59bd7ae0c72bb4aa0bb9d6af96ec689 e702e6113eff6883a33505e2b28cff2df3420fed CI 1651831332 +0200 commit: file1 +e702e6113eff6883a33505e2b28cff2df3420fed b245d3aa308ffdfdd194a94ad84a678a8a7a028c CI 1651831332 +0200 commit: file2 +b245d3aa308ffdfdd194a94ad84a678a8a7a028c 70dfa7fd25e9af49b7277738270a61d5dfbbac53 CI 1651831340 +0200 commit: [lazygit] stashing unstaged changes +70dfa7fd25e9af49b7277738270a61d5dfbbac53 b245d3aa308ffdfdd194a94ad84a678a8a7a028c CI 1651831340 +0200 reset: moving to HEAD^ diff --git a/test/integration/stashUnstagedChanges/expected/repo/.git_keep/logs/refs/stash b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/logs/refs/stash new file mode 100644 index 000000000..869d2d514 --- /dev/null +++ b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/logs/refs/stash @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 80a20247e61d440004def8f284964334ee381d0a CI 1651831340 +0200 On master: unstaged diff --git a/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 new file mode 100644 index 000000000..f74bf2335 Binary files /dev/null and b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 differ diff --git a/test/integration/tags2/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/tags2/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/tags2/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/tags2/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/5c/ef9afea6a37d89f925e24ebf71adecb63d1f07 b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/5c/ef9afea6a37d89f925e24ebf71adecb63d1f07 new file mode 100644 index 000000000..6a6f24362 Binary files /dev/null and b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/5c/ef9afea6a37d89f925e24ebf71adecb63d1f07 differ diff --git a/test/integration/stash_Copy/expected/.git_keep/objects/66/bbc809cdafd867cf9320bfb7484bb8fa898448 b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/66/bbc809cdafd867cf9320bfb7484bb8fa898448 similarity index 100% rename from test/integration/stash_Copy/expected/.git_keep/objects/66/bbc809cdafd867cf9320bfb7484bb8fa898448 rename to test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/66/bbc809cdafd867cf9320bfb7484bb8fa898448 diff --git a/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/70/dfa7fd25e9af49b7277738270a61d5dfbbac53 b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/70/dfa7fd25e9af49b7277738270a61d5dfbbac53 new file mode 100644 index 000000000..9ba23ed1e --- /dev/null +++ b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/70/dfa7fd25e9af49b7277738270a61d5dfbbac53 @@ -0,0 +1,3 @@ +xŤŽË +Â0E]ç+f/H^¦Sşę7‹I&I }Ѧ ~˝ýá.‡ł¸aÇľ€ÖúTÖÁ9ďĘ:0%FW…T-}ň•Eë=&­E±Đ§^Ű+"#1%NĚŞ¶tŚŃ’«*’ ˝tó +M ·¦}Ä7ŤË/aď ÜUˇQĆJ8K-Ą8ěqŞÄ?sńčűÉ}yÁVhëú)Ă>#CčhĘq?”?F. \ No newline at end of file diff --git a/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/80/a20247e61d440004def8f284964334ee381d0a b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/80/a20247e61d440004def8f284964334ee381d0a new file mode 100644 index 000000000..8f444fade Binary files /dev/null and b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/80/a20247e61d440004def8f284964334ee381d0a differ diff --git a/test/integration/undo/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c similarity index 100% rename from test/integration/undo/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c rename to test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c diff --git a/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 new file mode 100644 index 000000000..285df3e5f Binary files /dev/null and b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 differ diff --git a/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/b2/45d3aa308ffdfdd194a94ad84a678a8a7a028c b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/b2/45d3aa308ffdfdd194a94ad84a678a8a7a028c new file mode 100644 index 000000000..847d9486a --- /dev/null +++ b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/b2/45d3aa308ffdfdd194a94ad84a678a8a7a028c @@ -0,0 +1,3 @@ +xŤÎM +Â0@a×9Eö‚ĚŹIFşę1Ňd Ť-%‚Ç·Gpűřݬ­ÍÝăŤN}Wő7É j‘*T+e›¬ŔŐ’(ŠO…ŠŰň®ďî5iDd5‹"ś™Ą‰¤Q5ľV—?ýµî~ý}źúÍm[ôRÖöđ +#3ů3€;ę1ŐőOîl^”ÜÔČ: \ No newline at end of file diff --git a/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/bc/4b1a5b9b60d70107fab9078137bad212e29567 b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/bc/4b1a5b9b60d70107fab9078137bad212e29567 new file mode 100644 index 000000000..07c62f2ce --- /dev/null +++ b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/bc/4b1a5b9b60d70107fab9078137bad212e29567 @@ -0,0 +1 @@ +xŤŽAjĂ0E»Ö)f(˛$kFĄ”BV9Céb$ŤlC$[¤§Ż7Ýw÷řĽ/­µ.ŚĂ—ľ‰€÷1&Ň!e.™<¦¬Ń±Dtäb¤ÂČ9R7ޤu@ť cÉf”ŔĹ…-Ôě‡<ć#§Ń*ľ÷yÝŕ|÷óĺS\oWyMký€ÁŹŮÁ: 'm´VÇzDuů§®––ĺkĘűńzű«‚Ż+˙<§ĄĂŢyź—6Á˝8I†4s›dWż¤íNy \ No newline at end of file diff --git a/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/c7/c7da3c64e86c3270f2639a1379e67e14891b6a b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/c7/c7da3c64e86c3270f2639a1379e67e14891b6a new file mode 100644 index 000000000..ee4385f12 Binary files /dev/null and b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/c7/c7da3c64e86c3270f2639a1379e67e14891b6a differ diff --git a/test/integration/tags3/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 similarity index 100% rename from test/integration/tags3/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 rename to test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 diff --git a/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/e7/02e6113eff6883a33505e2b28cff2df3420fed b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/e7/02e6113eff6883a33505e2b28cff2df3420fed new file mode 100644 index 000000000..f70dd165a --- /dev/null +++ b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/e7/02e6113eff6883a33505e2b28cff2df3420fed @@ -0,0 +1,3 @@ +xŤÎM +Â0@a×9Eö‚Lţ&şę1&“ Z[JŹoŹŕöń-žlë:wëČ_úˇj+d! f_¶"™)µÔŔHŁ3;úî¶ šJ-Ô•šYA˛/%2C)T‘ˇ +dřÓ_ŰaÇÉŢÇé©_^÷Eo˛­ë0ą!¸Ľ˝‚0g=§şţÉM›ućPţ; \ No newline at end of file diff --git a/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/f8/e5bdb9f59bd7ae0c72bb4aa0bb9d6af96ec689 b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/f8/e5bdb9f59bd7ae0c72bb4aa0bb9d6af96ec689 new file mode 100644 index 000000000..06d1efef3 Binary files /dev/null and b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/objects/f8/e5bdb9f59bd7ae0c72bb4aa0bb9d6af96ec689 differ diff --git a/test/integration/stashUnstagedChanges/expected/repo/.git_keep/refs/heads/master b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..eb757b2d0 --- /dev/null +++ b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +b245d3aa308ffdfdd194a94ad84a678a8a7a028c diff --git a/test/integration/stashUnstagedChanges/expected/repo/.git_keep/refs/stash b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/refs/stash new file mode 100644 index 000000000..607b99017 --- /dev/null +++ b/test/integration/stashUnstagedChanges/expected/repo/.git_keep/refs/stash @@ -0,0 +1 @@ +80a20247e61d440004def8f284964334ee381d0a diff --git a/test/integration/tags2/expected/file0 b/test/integration/stashUnstagedChanges/expected/repo/file0 similarity index 100% rename from test/integration/tags2/expected/file0 rename to test/integration/stashUnstagedChanges/expected/repo/file0 diff --git a/test/integration/stashUnstagedChanges/expected/repo/file1 b/test/integration/stashUnstagedChanges/expected/repo/file1 new file mode 100644 index 000000000..c7c7da3c6 --- /dev/null +++ b/test/integration/stashUnstagedChanges/expected/repo/file1 @@ -0,0 +1 @@ +hello there diff --git a/test/integration/stashUnstagedChanges/expected/repo/file2 b/test/integration/stashUnstagedChanges/expected/repo/file2 new file mode 100644 index 000000000..c7c7da3c6 --- /dev/null +++ b/test/integration/stashUnstagedChanges/expected/repo/file2 @@ -0,0 +1 @@ +hello there diff --git a/test/integration/stashUnstagedChanges/expected/repo/file3 b/test/integration/stashUnstagedChanges/expected/repo/file3 new file mode 100644 index 000000000..c7c7da3c6 --- /dev/null +++ b/test/integration/stashUnstagedChanges/expected/repo/file3 @@ -0,0 +1 @@ +hello there diff --git a/test/integration/stashUnstagedChanges/recording.json b/test/integration/stashUnstagedChanges/recording.json new file mode 100644 index 000000000..78feca750 --- /dev/null +++ b/test/integration/stashUnstagedChanges/recording.json @@ -0,0 +1 @@ +{"KeyEvents":[{"Timestamp":1319,"Mod":0,"Key":256,"Ch":32},{"Timestamp":2975,"Mod":0,"Key":256,"Ch":83},{"Timestamp":5557,"Mod":0,"Key":256,"Ch":117},{"Timestamp":7054,"Mod":0,"Key":256,"Ch":117},{"Timestamp":7219,"Mod":0,"Key":256,"Ch":110},{"Timestamp":7262,"Mod":0,"Key":256,"Ch":115},{"Timestamp":7319,"Mod":0,"Key":256,"Ch":116},{"Timestamp":7404,"Mod":0,"Key":256,"Ch":97},{"Timestamp":7492,"Mod":0,"Key":256,"Ch":103},{"Timestamp":7534,"Mod":0,"Key":256,"Ch":101},{"Timestamp":7679,"Mod":0,"Key":256,"Ch":100},{"Timestamp":7965,"Mod":0,"Key":13,"Ch":13},{"Timestamp":9053,"Mod":0,"Key":256,"Ch":53},{"Timestamp":10348,"Mod":0,"Key":256,"Ch":32},{"Timestamp":10979,"Mod":0,"Key":13,"Ch":13},{"Timestamp":12354,"Mod":0,"Key":256,"Ch":50},{"Timestamp":12874,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":239,"Height":56}]} diff --git a/test/integration/stashUnstagedChanges/setup.sh b/test/integration/stashUnstagedChanges/setup.sh new file mode 100644 index 000000000..caff56b7d --- /dev/null +++ b/test/integration/stashUnstagedChanges/setup.sh @@ -0,0 +1,26 @@ +#!/bin/sh + +set -e + +cd $1 + +git init + +git config user.email "CI@example.com" +git config user.name "CI" + +echo test0 > file0 +git add . +git commit -am file0 + +echo test1 > file1 +git add . +git commit -am file1 + +echo test2 > file2 +git add . +git commit -am file2 + +echo "hello there" > file1 +echo "hello there" > file2 +echo "hello there" > file3 diff --git a/test/integration/stashUnstagedChanges/test.json b/test/integration/stashUnstagedChanges/test.json new file mode 100644 index 000000000..4f9314caa --- /dev/null +++ b/test/integration/stashUnstagedChanges/test.json @@ -0,0 +1 @@ +{ "description": "Stashing some files", "speed": 5 } diff --git a/test/integration/stash_Copy/expected/.git_keep/ORIG_HEAD b/test/integration/stash_Copy/expected/.git_keep/ORIG_HEAD deleted file mode 100644 index 78e4eb58e..000000000 --- a/test/integration/stash_Copy/expected/.git_keep/ORIG_HEAD +++ /dev/null @@ -1 +0,0 @@ -f348ff60bdbb3695f2f519db6bc115b1b8d50886 diff --git a/test/integration/stash_Copy/expected/.git_keep/index b/test/integration/stash_Copy/expected/.git_keep/index deleted file mode 100644 index daebfa4ef..000000000 Binary files a/test/integration/stash_Copy/expected/.git_keep/index and /dev/null differ diff --git a/test/integration/stash_Copy/expected/.git_keep/logs/HEAD b/test/integration/stash_Copy/expected/.git_keep/logs/HEAD deleted file mode 100644 index f95cf06ac..000000000 --- a/test/integration/stash_Copy/expected/.git_keep/logs/HEAD +++ /dev/null @@ -1,6 +0,0 @@ -0000000000000000000000000000000000000000 a7dde526f2e93ffa08897fbfca2c98ce40a8fa5b CI 1643011553 +1100 commit (initial): file0 -a7dde526f2e93ffa08897fbfca2c98ce40a8fa5b 4cc838ea1466afc5be1d3bc3e7a937641ec84d7d CI 1643011553 +1100 commit: file1 -4cc838ea1466afc5be1d3bc3e7a937641ec84d7d f348ff60bdbb3695f2f519db6bc115b1b8d50886 CI 1643011553 +1100 commit: file2 -f348ff60bdbb3695f2f519db6bc115b1b8d50886 f348ff60bdbb3695f2f519db6bc115b1b8d50886 CI 1643011556 +1100 reset: moving to HEAD -f348ff60bdbb3695f2f519db6bc115b1b8d50886 f348ff60bdbb3695f2f519db6bc115b1b8d50886 CI 1643011556 +1100 reset: moving to HEAD -f348ff60bdbb3695f2f519db6bc115b1b8d50886 f348ff60bdbb3695f2f519db6bc115b1b8d50886 CI 1643011558 +1100 reset: moving to HEAD diff --git a/test/integration/stash_Copy/expected/.git_keep/logs/refs/heads/master b/test/integration/stash_Copy/expected/.git_keep/logs/refs/heads/master deleted file mode 100644 index d1bf421f8..000000000 --- a/test/integration/stash_Copy/expected/.git_keep/logs/refs/heads/master +++ /dev/null @@ -1,3 +0,0 @@ -0000000000000000000000000000000000000000 a7dde526f2e93ffa08897fbfca2c98ce40a8fa5b CI 1643011553 +1100 commit (initial): file0 -a7dde526f2e93ffa08897fbfca2c98ce40a8fa5b 4cc838ea1466afc5be1d3bc3e7a937641ec84d7d CI 1643011553 +1100 commit: file1 -4cc838ea1466afc5be1d3bc3e7a937641ec84d7d f348ff60bdbb3695f2f519db6bc115b1b8d50886 CI 1643011553 +1100 commit: file2 diff --git a/test/integration/stash_Copy/expected/.git_keep/logs/refs/stash b/test/integration/stash_Copy/expected/.git_keep/logs/refs/stash deleted file mode 100644 index 3f07cf22e..000000000 --- a/test/integration/stash_Copy/expected/.git_keep/logs/refs/stash +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 e09b4dfcd66bfa1c81feeaf67e04d55368a2b065 CI 1643011556 +1100 On master: asd -e09b4dfcd66bfa1c81feeaf67e04d55368a2b065 2efac8148440778cbddcd80ac7477981277dcffe CI 1643011558 +1100 On master: asd diff --git a/test/integration/stash_Copy/expected/.git_keep/objects/25/abc3e66a6aa505fb0a2ceb6ad5cda0cc89ecbc b/test/integration/stash_Copy/expected/.git_keep/objects/25/abc3e66a6aa505fb0a2ceb6ad5cda0cc89ecbc deleted file mode 100644 index aab767a08..000000000 Binary files a/test/integration/stash_Copy/expected/.git_keep/objects/25/abc3e66a6aa505fb0a2ceb6ad5cda0cc89ecbc and /dev/null differ diff --git a/test/integration/stash_Copy/expected/.git_keep/objects/2e/fac8148440778cbddcd80ac7477981277dcffe b/test/integration/stash_Copy/expected/.git_keep/objects/2e/fac8148440778cbddcd80ac7477981277dcffe deleted file mode 100644 index 54545b630..000000000 --- a/test/integration/stash_Copy/expected/.git_keep/objects/2e/fac8148440778cbddcd80ac7477981277dcffe +++ /dev/null @@ -1 +0,0 @@ -xŤĎAj1 …á®çÚŠě±4v)%UV=$Ë´PgÂÄ…żŢtßíăă‡g{ďźbĘOăp‡ŇâF[`ÎX,–`L ˶eQMlÍ,y´ĺ.‡ß´5ĺֵޮ\¨ĹFˇTeµHćJ3˙ůH˘¶:ł°!5E‰ćĘRÉę [.nj‹|ŹŹý€Ë^/׳˙Hżůłíý §gť2śB@\ć:O ˙'_ŢoĐĺ1ý ČŁţ—Kż \ No newline at end of file diff --git a/test/integration/stash_Copy/expected/.git_keep/objects/3b/29b35d4357f8e64cafd95140a70d7c9b25138a b/test/integration/stash_Copy/expected/.git_keep/objects/3b/29b35d4357f8e64cafd95140a70d7c9b25138a deleted file mode 100644 index 1b8805172..000000000 Binary files a/test/integration/stash_Copy/expected/.git_keep/objects/3b/29b35d4357f8e64cafd95140a70d7c9b25138a and /dev/null differ diff --git a/test/integration/stash_Copy/expected/.git_keep/objects/4c/c838ea1466afc5be1d3bc3e7a937641ec84d7d b/test/integration/stash_Copy/expected/.git_keep/objects/4c/c838ea1466afc5be1d3bc3e7a937641ec84d7d deleted file mode 100644 index bc099c320..000000000 Binary files a/test/integration/stash_Copy/expected/.git_keep/objects/4c/c838ea1466afc5be1d3bc3e7a937641ec84d7d and /dev/null differ diff --git a/test/integration/stash_Copy/expected/.git_keep/objects/56/52247b638d1516506790d6648b864ba3447f68 b/test/integration/stash_Copy/expected/.git_keep/objects/56/52247b638d1516506790d6648b864ba3447f68 deleted file mode 100644 index 8535af67c..000000000 Binary files a/test/integration/stash_Copy/expected/.git_keep/objects/56/52247b638d1516506790d6648b864ba3447f68 and /dev/null differ diff --git a/test/integration/stash_Copy/expected/.git_keep/objects/9f/2757166809c291c65f09778abb46cfcc4e4a0c b/test/integration/stash_Copy/expected/.git_keep/objects/9f/2757166809c291c65f09778abb46cfcc4e4a0c deleted file mode 100644 index 539f97919..000000000 Binary files a/test/integration/stash_Copy/expected/.git_keep/objects/9f/2757166809c291c65f09778abb46cfcc4e4a0c and /dev/null differ diff --git a/test/integration/stash_Copy/expected/.git_keep/objects/a6/ada9f3d895e751ec289c69913a02146c0ca844 b/test/integration/stash_Copy/expected/.git_keep/objects/a6/ada9f3d895e751ec289c69913a02146c0ca844 deleted file mode 100644 index 0cdd88ea0..000000000 Binary files a/test/integration/stash_Copy/expected/.git_keep/objects/a6/ada9f3d895e751ec289c69913a02146c0ca844 and /dev/null differ diff --git a/test/integration/stash_Copy/expected/.git_keep/objects/a7/dde526f2e93ffa08897fbfca2c98ce40a8fa5b b/test/integration/stash_Copy/expected/.git_keep/objects/a7/dde526f2e93ffa08897fbfca2c98ce40a8fa5b deleted file mode 100644 index 9dcd075d6..000000000 Binary files a/test/integration/stash_Copy/expected/.git_keep/objects/a7/dde526f2e93ffa08897fbfca2c98ce40a8fa5b and /dev/null differ diff --git a/test/integration/stash_Copy/expected/.git_keep/objects/e0/9b4dfcd66bfa1c81feeaf67e04d55368a2b065 b/test/integration/stash_Copy/expected/.git_keep/objects/e0/9b4dfcd66bfa1c81feeaf67e04d55368a2b065 deleted file mode 100644 index f57ce417b..000000000 Binary files a/test/integration/stash_Copy/expected/.git_keep/objects/e0/9b4dfcd66bfa1c81feeaf67e04d55368a2b065 and /dev/null differ diff --git a/test/integration/stash_Copy/expected/.git_keep/objects/f3/48ff60bdbb3695f2f519db6bc115b1b8d50886 b/test/integration/stash_Copy/expected/.git_keep/objects/f3/48ff60bdbb3695f2f519db6bc115b1b8d50886 deleted file mode 100644 index 8faee1fcd..000000000 Binary files a/test/integration/stash_Copy/expected/.git_keep/objects/f3/48ff60bdbb3695f2f519db6bc115b1b8d50886 and /dev/null differ diff --git a/test/integration/stash_Copy/expected/.git_keep/refs/heads/master b/test/integration/stash_Copy/expected/.git_keep/refs/heads/master deleted file mode 100644 index 78e4eb58e..000000000 --- a/test/integration/stash_Copy/expected/.git_keep/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -f348ff60bdbb3695f2f519db6bc115b1b8d50886 diff --git a/test/integration/stash_Copy/expected/.git_keep/refs/stash b/test/integration/stash_Copy/expected/.git_keep/refs/stash deleted file mode 100644 index 9123248e5..000000000 --- a/test/integration/stash_Copy/expected/.git_keep/refs/stash +++ /dev/null @@ -1 +0,0 @@ -2efac8148440778cbddcd80ac7477981277dcffe diff --git a/test/integration/stash_Copy/recording.json b/test/integration/stash_Copy/recording.json deleted file mode 100644 index 48fc35158..000000000 --- a/test/integration/stash_Copy/recording.json +++ /dev/null @@ -1 +0,0 @@ -{"KeyEvents":[{"Timestamp":809,"Mod":0,"Key":256,"Ch":32},{"Timestamp":1369,"Mod":0,"Key":256,"Ch":83},{"Timestamp":1713,"Mod":0,"Key":258,"Ch":0},{"Timestamp":2087,"Mod":0,"Key":13,"Ch":13},{"Timestamp":2376,"Mod":0,"Key":256,"Ch":97},{"Timestamp":2440,"Mod":0,"Key":256,"Ch":115},{"Timestamp":2512,"Mod":0,"Key":256,"Ch":100},{"Timestamp":2793,"Mod":0,"Key":13,"Ch":13},{"Timestamp":3498,"Mod":0,"Key":258,"Ch":0},{"Timestamp":4113,"Mod":0,"Key":256,"Ch":32},{"Timestamp":4785,"Mod":0,"Key":256,"Ch":115},{"Timestamp":5145,"Mod":0,"Key":256,"Ch":97},{"Timestamp":5183,"Mod":0,"Key":256,"Ch":115},{"Timestamp":5249,"Mod":0,"Key":256,"Ch":100},{"Timestamp":5609,"Mod":0,"Key":13,"Ch":13},{"Timestamp":6216,"Mod":0,"Key":259,"Ch":0},{"Timestamp":6457,"Mod":0,"Key":259,"Ch":0},{"Timestamp":6728,"Mod":0,"Key":259,"Ch":0},{"Timestamp":7098,"Mod":0,"Key":258,"Ch":0},{"Timestamp":7408,"Mod":0,"Key":256,"Ch":32},{"Timestamp":8080,"Mod":0,"Key":13,"Ch":13},{"Timestamp":8752,"Mod":0,"Key":260,"Ch":0},{"Timestamp":8952,"Mod":0,"Key":260,"Ch":0},{"Timestamp":9145,"Mod":0,"Key":260,"Ch":0},{"Timestamp":9904,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":272,"Height":74}]} \ No newline at end of file diff --git a/test/integration/submoduleAdd/expected/.git_keep/config b/test/integration/submoduleAdd/expected/.git_keep/config deleted file mode 100644 index 3770f8692..000000000 --- a/test/integration/submoduleAdd/expected/.git_keep/config +++ /dev/null @@ -1,13 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true - precomposeunicode = true -[user] - email = CI@example.com - name = CI -[submodule "blah"] - url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleAdd/other_repo - active = true diff --git a/test/integration/submoduleAdd/expected/.git_keep/index b/test/integration/submoduleAdd/expected/.git_keep/index deleted file mode 100644 index df11fba0b..000000000 Binary files a/test/integration/submoduleAdd/expected/.git_keep/index and /dev/null differ diff --git a/test/integration/submoduleAdd/expected/.git_keep/logs/HEAD b/test/integration/submoduleAdd/expected/.git_keep/logs/HEAD deleted file mode 100644 index df53976dc..000000000 --- a/test/integration/submoduleAdd/expected/.git_keep/logs/HEAD +++ /dev/null @@ -1,3 +0,0 @@ -0000000000000000000000000000000000000000 a50a5125768001a3ea263ffb7cafbc421a508153 CI 1534792759 +0100 commit (initial): myfile1 -a50a5125768001a3ea263ffb7cafbc421a508153 42530e986dbb65877ed8d61ca0c816e425e5c62e CI 1534792759 +0100 commit: myfile2 -42530e986dbb65877ed8d61ca0c816e425e5c62e 6de70e35394a99cc437d1bc70b0852b70c5bb03d CI 1617797593 +1000 commit: test diff --git a/test/integration/submoduleAdd/expected/.git_keep/logs/refs/heads/master b/test/integration/submoduleAdd/expected/.git_keep/logs/refs/heads/master deleted file mode 100644 index df53976dc..000000000 --- a/test/integration/submoduleAdd/expected/.git_keep/logs/refs/heads/master +++ /dev/null @@ -1,3 +0,0 @@ -0000000000000000000000000000000000000000 a50a5125768001a3ea263ffb7cafbc421a508153 CI 1534792759 +0100 commit (initial): myfile1 -a50a5125768001a3ea263ffb7cafbc421a508153 42530e986dbb65877ed8d61ca0c816e425e5c62e CI 1534792759 +0100 commit: myfile2 -42530e986dbb65877ed8d61ca0c816e425e5c62e 6de70e35394a99cc437d1bc70b0852b70c5bb03d CI 1617797593 +1000 commit: test diff --git a/test/integration/submoduleAdd/expected/.git_keep/modules/blah/config b/test/integration/submoduleAdd/expected/.git_keep/modules/blah/config deleted file mode 100644 index 91988eba6..000000000 --- a/test/integration/submoduleAdd/expected/.git_keep/modules/blah/config +++ /dev/null @@ -1,14 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true - precomposeunicode = true - worktree = ../../../haha -[remote "origin"] - url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleAdd/other_repo - fetch = +refs/heads/*:refs/remotes/origin/* -[branch "master"] - remote = origin - merge = refs/heads/master diff --git a/test/integration/submoduleAdd/expected/.git_keep/modules/blah/index b/test/integration/submoduleAdd/expected/.git_keep/modules/blah/index deleted file mode 100644 index 64a52c781..000000000 Binary files a/test/integration/submoduleAdd/expected/.git_keep/modules/blah/index and /dev/null differ diff --git a/test/integration/submoduleAdd/expected/.git_keep/modules/blah/logs/HEAD b/test/integration/submoduleAdd/expected/.git_keep/modules/blah/logs/HEAD deleted file mode 100644 index 0ed3aba82..000000000 --- a/test/integration/submoduleAdd/expected/.git_keep/modules/blah/logs/HEAD +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 42530e986dbb65877ed8d61ca0c816e425e5c62e Jesse Duffield 1617797593 +1000 clone: from /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleAdd/other_repo diff --git a/test/integration/submoduleAdd/expected/.git_keep/modules/blah/logs/refs/heads/master b/test/integration/submoduleAdd/expected/.git_keep/modules/blah/logs/refs/heads/master deleted file mode 100644 index 0ed3aba82..000000000 --- a/test/integration/submoduleAdd/expected/.git_keep/modules/blah/logs/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 42530e986dbb65877ed8d61ca0c816e425e5c62e Jesse Duffield 1617797593 +1000 clone: from /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleAdd/other_repo diff --git a/test/integration/submoduleAdd/expected/.git_keep/modules/blah/logs/refs/remotes/origin/HEAD b/test/integration/submoduleAdd/expected/.git_keep/modules/blah/logs/refs/remotes/origin/HEAD deleted file mode 100644 index 0ed3aba82..000000000 --- a/test/integration/submoduleAdd/expected/.git_keep/modules/blah/logs/refs/remotes/origin/HEAD +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 42530e986dbb65877ed8d61ca0c816e425e5c62e Jesse Duffield 1617797593 +1000 clone: from /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleAdd/other_repo diff --git a/test/integration/submoduleAdd/expected/.git_keep/objects/6d/e70e35394a99cc437d1bc70b0852b70c5bb03d b/test/integration/submoduleAdd/expected/.git_keep/objects/6d/e70e35394a99cc437d1bc70b0852b70c5bb03d deleted file mode 100644 index 8545bdc31..000000000 Binary files a/test/integration/submoduleAdd/expected/.git_keep/objects/6d/e70e35394a99cc437d1bc70b0852b70c5bb03d and /dev/null differ diff --git a/test/integration/submoduleAdd/expected/.git_keep/refs/heads/master b/test/integration/submoduleAdd/expected/.git_keep/refs/heads/master deleted file mode 100644 index d41df026f..000000000 --- a/test/integration/submoduleAdd/expected/.git_keep/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -6de70e35394a99cc437d1bc70b0852b70c5bb03d diff --git a/test/integration/submoduleAdd/expected/other_repo/HEAD b/test/integration/submoduleAdd/expected/other_repo/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/test/integration/submoduleAdd/expected/other_repo/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/test/integration/submoduleAdd/expected/other_repo/config b/test/integration/submoduleAdd/expected/other_repo/config new file mode 100644 index 000000000..e5abd1a6d --- /dev/null +++ b/test/integration/submoduleAdd/expected/other_repo/config @@ -0,0 +1,8 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleAdd/actual/./repo diff --git a/test/integration/submoduleAdd/expected/other_repo/description b/test/integration/submoduleAdd/expected/other_repo/description new file mode 100644 index 000000000..498b267a8 --- /dev/null +++ b/test/integration/submoduleAdd/expected/other_repo/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/integration/tags2/expected/.git_keep/info/exclude b/test/integration/submoduleAdd/expected/other_repo/info/exclude similarity index 100% rename from test/integration/tags2/expected/.git_keep/info/exclude rename to test/integration/submoduleAdd/expected/other_repo/info/exclude diff --git a/test/integration/submoduleAdd/expected/other_repo/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/submoduleAdd/expected/other_repo/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 new file mode 100644 index 000000000..7f2ebf4ee Binary files /dev/null and b/test/integration/submoduleAdd/expected/other_repo/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 differ diff --git a/test/integration/submoduleAdd/expected/other_repo/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/submoduleAdd/expected/other_repo/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 new file mode 100644 index 000000000..f74bf2335 Binary files /dev/null and b/test/integration/submoduleAdd/expected/other_repo/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 differ diff --git a/test/integration/submoduleAdd/expected/.git_keep/modules/blah/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e b/test/integration/submoduleAdd/expected/other_repo/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e similarity index 100% rename from test/integration/submoduleAdd/expected/.git_keep/modules/blah/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e rename to test/integration/submoduleAdd/expected/other_repo/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e diff --git a/test/integration/submoduleAdd/expected/.git_keep/modules/blah/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 b/test/integration/submoduleAdd/expected/other_repo/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 similarity index 100% rename from test/integration/submoduleAdd/expected/.git_keep/modules/blah/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 rename to test/integration/submoduleAdd/expected/other_repo/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 diff --git a/test/integration/submoduleAdd/expected/other_repo/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/submoduleAdd/expected/other_repo/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 new file mode 100644 index 000000000..285df3e5f Binary files /dev/null and b/test/integration/submoduleAdd/expected/other_repo/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 differ diff --git a/test/integration/submoduleAdd/expected/other_repo/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/submoduleAdd/expected/other_repo/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 new file mode 100644 index 000000000..96d2e71a6 Binary files /dev/null and b/test/integration/submoduleAdd/expected/other_repo/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 differ diff --git a/test/integration/submoduleAdd/expected/other_repo/packed-refs b/test/integration/submoduleAdd/expected/other_repo/packed-refs new file mode 100644 index 000000000..62f6568b2 --- /dev/null +++ b/test/integration/submoduleAdd/expected/other_repo/packed-refs @@ -0,0 +1,2 @@ +# pack-refs with: peeled fully-peeled sorted +42530e986dbb65877ed8d61ca0c816e425e5c62e refs/heads/master diff --git a/test/integration/submoduleAdd/expected/.git_keep/COMMIT_EDITMSG b/test/integration/submoduleAdd/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/submoduleAdd/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/submoduleAdd/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/switchTabFromMenu/expected/file1 b/test/integration/submoduleAdd/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from test/integration/switchTabFromMenu/expected/file1 rename to test/integration/submoduleAdd/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/submoduleAdd/expected/repo/.git_keep/HEAD b/test/integration/submoduleAdd/expected/repo/.git_keep/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/test/integration/submoduleAdd/expected/repo/.git_keep/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/test/integration/submoduleAdd/expected/repo/.git_keep/config b/test/integration/submoduleAdd/expected/repo/.git_keep/config new file mode 100644 index 000000000..22f6527ea --- /dev/null +++ b/test/integration/submoduleAdd/expected/repo/.git_keep/config @@ -0,0 +1,13 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[user] + email = CI@example.com + name = CI +[submodule "blah"] + url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleAdd/actual/other_repo + active = true diff --git a/test/integration/submoduleAdd/expected/repo/.git_keep/description b/test/integration/submoduleAdd/expected/repo/.git_keep/description new file mode 100644 index 000000000..498b267a8 --- /dev/null +++ b/test/integration/submoduleAdd/expected/repo/.git_keep/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/integration/submoduleAdd/expected/repo/.git_keep/index b/test/integration/submoduleAdd/expected/repo/.git_keep/index new file mode 100644 index 000000000..4690b27b1 Binary files /dev/null and b/test/integration/submoduleAdd/expected/repo/.git_keep/index differ diff --git a/test/integration/tags3/expected/.git_keep/info/exclude b/test/integration/submoduleAdd/expected/repo/.git_keep/info/exclude similarity index 100% rename from test/integration/tags3/expected/.git_keep/info/exclude rename to test/integration/submoduleAdd/expected/repo/.git_keep/info/exclude diff --git a/test/integration/submoduleAdd/expected/repo/.git_keep/logs/HEAD b/test/integration/submoduleAdd/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..58db0ace2 --- /dev/null +++ b/test/integration/submoduleAdd/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 a50a5125768001a3ea263ffb7cafbc421a508153 CI 1534792759 +0100 commit (initial): myfile1 +a50a5125768001a3ea263ffb7cafbc421a508153 42530e986dbb65877ed8d61ca0c816e425e5c62e CI 1534792759 +0100 commit: myfile2 +42530e986dbb65877ed8d61ca0c816e425e5c62e dc5bde4a09968b0819f34d193f6780df295d71cf CI 1648348101 +1100 commit: test diff --git a/test/integration/submoduleAdd/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/submoduleAdd/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..58db0ace2 --- /dev/null +++ b/test/integration/submoduleAdd/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 a50a5125768001a3ea263ffb7cafbc421a508153 CI 1534792759 +0100 commit (initial): myfile1 +a50a5125768001a3ea263ffb7cafbc421a508153 42530e986dbb65877ed8d61ca0c816e425e5c62e CI 1534792759 +0100 commit: myfile2 +42530e986dbb65877ed8d61ca0c816e425e5c62e dc5bde4a09968b0819f34d193f6780df295d71cf CI 1648348101 +1100 commit: test diff --git a/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/HEAD b/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/config b/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/config new file mode 100644 index 000000000..39065f535 --- /dev/null +++ b/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/config @@ -0,0 +1,14 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true + worktree = ../../../haha +[remote "origin"] + url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleAdd/actual/other_repo + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "master"] + remote = origin + merge = refs/heads/master diff --git a/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/description b/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/description new file mode 100644 index 000000000..498b267a8 --- /dev/null +++ b/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/index b/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/index new file mode 100644 index 000000000..27523e56e Binary files /dev/null and b/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/index differ diff --git a/test/integration/undo/expected/.git_keep/info/exclude b/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/info/exclude similarity index 100% rename from test/integration/undo/expected/.git_keep/info/exclude rename to test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/info/exclude diff --git a/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/logs/HEAD b/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/logs/HEAD new file mode 100644 index 000000000..502ae05d9 --- /dev/null +++ b/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/logs/HEAD @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 42530e986dbb65877ed8d61ca0c816e425e5c62e Jesse Duffield 1648348097 +1100 clone: from /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleAdd/actual/other_repo diff --git a/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/logs/refs/heads/master b/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/logs/refs/heads/master new file mode 100644 index 000000000..502ae05d9 --- /dev/null +++ b/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/logs/refs/heads/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 42530e986dbb65877ed8d61ca0c816e425e5c62e Jesse Duffield 1648348097 +1100 clone: from /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleAdd/actual/other_repo diff --git a/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/logs/refs/remotes/origin/HEAD b/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/logs/refs/remotes/origin/HEAD new file mode 100644 index 000000000..502ae05d9 --- /dev/null +++ b/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/logs/refs/remotes/origin/HEAD @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 42530e986dbb65877ed8d61ca0c816e425e5c62e Jesse Duffield 1648348097 +1100 clone: from /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleAdd/actual/other_repo diff --git a/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 new file mode 100644 index 000000000..7f2ebf4ee Binary files /dev/null and b/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 differ diff --git a/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 new file mode 100644 index 000000000..f74bf2335 Binary files /dev/null and b/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 differ diff --git a/test/integration/submoduleAdd/expected/.git_keep/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e b/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e similarity index 100% rename from test/integration/submoduleAdd/expected/.git_keep/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e rename to test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e diff --git a/test/integration/submoduleAdd/expected/.git_keep/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 b/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 similarity index 100% rename from test/integration/submoduleAdd/expected/.git_keep/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 rename to test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 diff --git a/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 new file mode 100644 index 000000000..285df3e5f Binary files /dev/null and b/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 differ diff --git a/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 new file mode 100644 index 000000000..96d2e71a6 Binary files /dev/null and b/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 differ diff --git a/test/integration/submoduleAdd/expected/.git_keep/modules/blah/packed-refs b/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/packed-refs similarity index 100% rename from test/integration/submoduleAdd/expected/.git_keep/modules/blah/packed-refs rename to test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/packed-refs diff --git a/test/integration/submoduleAdd/expected/.git_keep/modules/blah/refs/heads/master b/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/refs/heads/master similarity index 100% rename from test/integration/submoduleAdd/expected/.git_keep/modules/blah/refs/heads/master rename to test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/refs/heads/master diff --git a/test/integration/submoduleAdd/expected/.git_keep/modules/blah/refs/remotes/origin/HEAD b/test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/refs/remotes/origin/HEAD similarity index 100% rename from test/integration/submoduleAdd/expected/.git_keep/modules/blah/refs/remotes/origin/HEAD rename to test/integration/submoduleAdd/expected/repo/.git_keep/modules/blah/refs/remotes/origin/HEAD diff --git a/test/integration/submoduleAdd/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/submoduleAdd/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 new file mode 100644 index 000000000..7f2ebf4ee Binary files /dev/null and b/test/integration/submoduleAdd/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 differ diff --git a/test/integration/submoduleAdd/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/submoduleAdd/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 new file mode 100644 index 000000000..f74bf2335 Binary files /dev/null and b/test/integration/submoduleAdd/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 differ diff --git a/test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e b/test/integration/submoduleAdd/expected/repo/.git_keep/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e similarity index 100% rename from test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e rename to test/integration/submoduleAdd/expected/repo/.git_keep/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e diff --git a/test/integration/submoduleAdd/expected/.git_keep/objects/5f/77fb3622a1035782a7dacc0cca12e674066b9e b/test/integration/submoduleAdd/expected/repo/.git_keep/objects/5f/77fb3622a1035782a7dacc0cca12e674066b9e similarity index 100% rename from test/integration/submoduleAdd/expected/.git_keep/objects/5f/77fb3622a1035782a7dacc0cca12e674066b9e rename to test/integration/submoduleAdd/expected/repo/.git_keep/objects/5f/77fb3622a1035782a7dacc0cca12e674066b9e diff --git a/test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 b/test/integration/submoduleAdd/expected/repo/.git_keep/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 similarity index 100% rename from test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 rename to test/integration/submoduleAdd/expected/repo/.git_keep/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 diff --git a/test/integration/submoduleAdd/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/submoduleAdd/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 new file mode 100644 index 000000000..285df3e5f Binary files /dev/null and b/test/integration/submoduleAdd/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 differ diff --git a/test/integration/submoduleAdd/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/submoduleAdd/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 new file mode 100644 index 000000000..96d2e71a6 Binary files /dev/null and b/test/integration/submoduleAdd/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 differ diff --git a/test/integration/submoduleAdd/expected/.git_keep/objects/b9/7660affc790464b00ad45c7186a882238d77fb b/test/integration/submoduleAdd/expected/repo/.git_keep/objects/b9/7660affc790464b00ad45c7186a882238d77fb similarity index 100% rename from test/integration/submoduleAdd/expected/.git_keep/objects/b9/7660affc790464b00ad45c7186a882238d77fb rename to test/integration/submoduleAdd/expected/repo/.git_keep/objects/b9/7660affc790464b00ad45c7186a882238d77fb diff --git a/test/integration/submoduleAdd/expected/repo/.git_keep/objects/dc/5bde4a09968b0819f34d193f6780df295d71cf b/test/integration/submoduleAdd/expected/repo/.git_keep/objects/dc/5bde4a09968b0819f34d193f6780df295d71cf new file mode 100644 index 000000000..dabb1ddd8 Binary files /dev/null and b/test/integration/submoduleAdd/expected/repo/.git_keep/objects/dc/5bde4a09968b0819f34d193f6780df295d71cf differ diff --git a/test/integration/submoduleAdd/expected/repo/.git_keep/refs/heads/master b/test/integration/submoduleAdd/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..d13f91cc3 --- /dev/null +++ b/test/integration/submoduleAdd/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +dc5bde4a09968b0819f34d193f6780df295d71cf diff --git a/test/integration/submoduleAdd/expected/.gitmodules_keep b/test/integration/submoduleAdd/expected/repo/.gitmodules_keep similarity index 100% rename from test/integration/submoduleAdd/expected/.gitmodules_keep rename to test/integration/submoduleAdd/expected/repo/.gitmodules_keep diff --git a/test/integration/submoduleAdd/expected/haha/.git_keep b/test/integration/submoduleAdd/expected/repo/haha/.git_keep similarity index 100% rename from test/integration/submoduleAdd/expected/haha/.git_keep rename to test/integration/submoduleAdd/expected/repo/haha/.git_keep diff --git a/test/integration/undo/expected/file1 b/test/integration/submoduleAdd/expected/repo/haha/myfile1 similarity index 100% rename from test/integration/undo/expected/file1 rename to test/integration/submoduleAdd/expected/repo/haha/myfile1 diff --git a/test/integration/stashPop/expected/file2 b/test/integration/submoduleAdd/expected/repo/haha/myfile2 similarity index 100% rename from test/integration/stashPop/expected/file2 rename to test/integration/submoduleAdd/expected/repo/haha/myfile2 diff --git a/test/integration/undo2/expected/file1 b/test/integration/submoduleAdd/expected/repo/myfile1 similarity index 100% rename from test/integration/undo2/expected/file1 rename to test/integration/submoduleAdd/expected/repo/myfile1 diff --git a/test/integration/stash_Copy/expected/file2 b/test/integration/submoduleAdd/expected/repo/myfile2 similarity index 100% rename from test/integration/stash_Copy/expected/file2 rename to test/integration/submoduleAdd/expected/repo/myfile2 diff --git a/test/integration/submoduleAdd/setup.sh b/test/integration/submoduleAdd/setup.sh index b5dc60ab7..47c92bd27 100644 --- a/test/integration/submoduleAdd/setup.sh +++ b/test/integration/submoduleAdd/setup.sh @@ -20,5 +20,5 @@ git add . git commit -am "myfile2" cd .. -git clone --bare ./actual other_repo -cd actual +git clone --bare ./repo other_repo +cd repo diff --git a/test/integration/submoduleEnter/expected/.git_keep/config b/test/integration/submoduleEnter/expected/.git_keep/config deleted file mode 100644 index 6806f15bd..000000000 --- a/test/integration/submoduleEnter/expected/.git_keep/config +++ /dev/null @@ -1,13 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true - precomposeunicode = true -[user] - email = CI@example.com - name = CI -[submodule "other_repo"] - url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleEnter/other_repo - active = true diff --git a/test/integration/submoduleEnter/expected/.git_keep/index b/test/integration/submoduleEnter/expected/.git_keep/index deleted file mode 100644 index 588f51460..000000000 Binary files a/test/integration/submoduleEnter/expected/.git_keep/index and /dev/null differ diff --git a/test/integration/submoduleEnter/expected/.git_keep/logs/HEAD b/test/integration/submoduleEnter/expected/.git_keep/logs/HEAD deleted file mode 100644 index 123fc35c9..000000000 --- a/test/integration/submoduleEnter/expected/.git_keep/logs/HEAD +++ /dev/null @@ -1,5 +0,0 @@ -0000000000000000000000000000000000000000 a50a5125768001a3ea263ffb7cafbc421a508153 CI 1534792759 +0100 commit (initial): myfile1 -a50a5125768001a3ea263ffb7cafbc421a508153 42530e986dbb65877ed8d61ca0c816e425e5c62e CI 1534792759 +0100 commit: myfile2 -42530e986dbb65877ed8d61ca0c816e425e5c62e fc4712e93d74ad4fb68e2fd219ac253ae03e19a4 CI 1534792759 +0100 commit: myfile3 -fc4712e93d74ad4fb68e2fd219ac253ae03e19a4 e1eb418c0ff98940d4ea817eebcff5dcdde645ce CI 1534792759 +0100 commit: add submodule -e1eb418c0ff98940d4ea817eebcff5dcdde645ce c83cc777cf98a8c0f3c0995d7c1b21db92a71c66 CI 1643370762 +1100 commit: test diff --git a/test/integration/submoduleEnter/expected/.git_keep/logs/refs/heads/master b/test/integration/submoduleEnter/expected/.git_keep/logs/refs/heads/master deleted file mode 100644 index 123fc35c9..000000000 --- a/test/integration/submoduleEnter/expected/.git_keep/logs/refs/heads/master +++ /dev/null @@ -1,5 +0,0 @@ -0000000000000000000000000000000000000000 a50a5125768001a3ea263ffb7cafbc421a508153 CI 1534792759 +0100 commit (initial): myfile1 -a50a5125768001a3ea263ffb7cafbc421a508153 42530e986dbb65877ed8d61ca0c816e425e5c62e CI 1534792759 +0100 commit: myfile2 -42530e986dbb65877ed8d61ca0c816e425e5c62e fc4712e93d74ad4fb68e2fd219ac253ae03e19a4 CI 1534792759 +0100 commit: myfile3 -fc4712e93d74ad4fb68e2fd219ac253ae03e19a4 e1eb418c0ff98940d4ea817eebcff5dcdde645ce CI 1534792759 +0100 commit: add submodule -e1eb418c0ff98940d4ea817eebcff5dcdde645ce c83cc777cf98a8c0f3c0995d7c1b21db92a71c66 CI 1643370762 +1100 commit: test diff --git a/test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/config b/test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/config deleted file mode 100644 index 153285317..000000000 --- a/test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/config +++ /dev/null @@ -1,14 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true - precomposeunicode = true - worktree = ../../../other_repo -[remote "origin"] - url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleEnter/other_repo - fetch = +refs/heads/*:refs/remotes/origin/* -[branch "master"] - remote = origin - merge = refs/heads/master diff --git a/test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/index b/test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/index deleted file mode 100644 index 385fd7bf9..000000000 Binary files a/test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/index and /dev/null differ diff --git a/test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/logs/HEAD b/test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/logs/HEAD deleted file mode 100644 index 149d30cef..000000000 --- a/test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/logs/HEAD +++ /dev/null @@ -1,5 +0,0 @@ -0000000000000000000000000000000000000000 fc4712e93d74ad4fb68e2fd219ac253ae03e19a4 Jesse Duffield 1534792759 +0100 clone: from /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleEnter/other_repo -fc4712e93d74ad4fb68e2fd219ac253ae03e19a4 42530e986dbb65877ed8d61ca0c816e425e5c62e Jesse Duffield 1643370757 +1100 rebase -i (start): checkout 42530e986dbb65877ed8d61ca0c816e425e5c62e -42530e986dbb65877ed8d61ca0c816e425e5c62e 42530e986dbb65877ed8d61ca0c816e425e5c62e Jesse Duffield 1643370757 +1100 rebase -i (finish): returning to refs/heads/master -42530e986dbb65877ed8d61ca0c816e425e5c62e a50a5125768001a3ea263ffb7cafbc421a508153 Jesse Duffield 1643370757 +1100 rebase -i (start): checkout a50a5125768001a3ea263ffb7cafbc421a508153 -a50a5125768001a3ea263ffb7cafbc421a508153 a50a5125768001a3ea263ffb7cafbc421a508153 Jesse Duffield 1643370757 +1100 rebase -i (finish): returning to refs/heads/master diff --git a/test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/logs/refs/heads/master b/test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/logs/refs/heads/master deleted file mode 100644 index b88258014..000000000 --- a/test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/logs/refs/heads/master +++ /dev/null @@ -1,3 +0,0 @@ -0000000000000000000000000000000000000000 fc4712e93d74ad4fb68e2fd219ac253ae03e19a4 Jesse Duffield 1534792759 +0100 clone: from /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleEnter/other_repo -fc4712e93d74ad4fb68e2fd219ac253ae03e19a4 42530e986dbb65877ed8d61ca0c816e425e5c62e Jesse Duffield 1643370757 +1100 rebase -i (finish): refs/heads/master onto 42530e986dbb65877ed8d61ca0c816e425e5c62e -42530e986dbb65877ed8d61ca0c816e425e5c62e a50a5125768001a3ea263ffb7cafbc421a508153 Jesse Duffield 1643370757 +1100 rebase -i (finish): refs/heads/master onto a50a5125768001a3ea263ffb7cafbc421a508153 diff --git a/test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/logs/refs/remotes/origin/HEAD b/test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/logs/refs/remotes/origin/HEAD deleted file mode 100644 index d08b838c1..000000000 --- a/test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/logs/refs/remotes/origin/HEAD +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 fc4712e93d74ad4fb68e2fd219ac253ae03e19a4 Jesse Duffield 1534792759 +0100 clone: from /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleEnter/other_repo diff --git a/test/integration/submoduleEnter/expected/.git_keep/objects/c8/3cc777cf98a8c0f3c0995d7c1b21db92a71c66 b/test/integration/submoduleEnter/expected/.git_keep/objects/c8/3cc777cf98a8c0f3c0995d7c1b21db92a71c66 deleted file mode 100644 index 7da492489..000000000 --- a/test/integration/submoduleEnter/expected/.git_keep/objects/c8/3cc777cf98a8c0f3c0995d7c1b21db92a71c66 +++ /dev/null @@ -1,2 +0,0 @@ -xŤÎK -Â0FaÇYEć‚ÜŰäć"‚Ł.#Ź?([j—o—ŕôđ NYz Í‘c4“oÖ>DÉ`rˇ›ÉŐ&RŚHŠuŠ™Őš6Ľ†#[…Z‹!ZŞ)°riMj©ÎJJźq_6}›őů6_ńM}}âT–~Ńě¬1žĽ›ô‘™Híuźř“«÷P?"Ű9ľ \ No newline at end of file diff --git a/test/integration/submoduleEnter/expected/.git_keep/refs/heads/master b/test/integration/submoduleEnter/expected/.git_keep/refs/heads/master deleted file mode 100644 index d109221f5..000000000 --- a/test/integration/submoduleEnter/expected/.git_keep/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -c83cc777cf98a8c0f3c0995d7c1b21db92a71c66 diff --git a/test/integration/submoduleEnter/expected/other_repo/HEAD b/test/integration/submoduleEnter/expected/other_repo/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/test/integration/submoduleEnter/expected/other_repo/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/test/integration/submoduleEnter/expected/other_repo/config b/test/integration/submoduleEnter/expected/other_repo/config new file mode 100644 index 000000000..f3148fc2f --- /dev/null +++ b/test/integration/submoduleEnter/expected/other_repo/config @@ -0,0 +1,8 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleEnter/actual/./repo diff --git a/test/integration/submoduleEnter/expected/other_repo/description b/test/integration/submoduleEnter/expected/other_repo/description new file mode 100644 index 000000000..498b267a8 --- /dev/null +++ b/test/integration/submoduleEnter/expected/other_repo/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/integration/undo2/expected/.git_keep/info/exclude b/test/integration/submoduleEnter/expected/other_repo/info/exclude similarity index 100% rename from test/integration/undo2/expected/.git_keep/info/exclude rename to test/integration/submoduleEnter/expected/other_repo/info/exclude diff --git a/test/integration/submoduleEnter/expected/other_repo/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/submoduleEnter/expected/other_repo/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 new file mode 100644 index 000000000..7f2ebf4ee Binary files /dev/null and b/test/integration/submoduleEnter/expected/other_repo/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 differ diff --git a/test/integration/submoduleEnter/expected/other_repo/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/submoduleEnter/expected/other_repo/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 new file mode 100644 index 000000000..f74bf2335 Binary files /dev/null and b/test/integration/submoduleEnter/expected/other_repo/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 differ diff --git a/test/integration/submoduleEnter/expected/.git_keep/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e b/test/integration/submoduleEnter/expected/other_repo/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e similarity index 100% rename from test/integration/submoduleEnter/expected/.git_keep/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e rename to test/integration/submoduleEnter/expected/other_repo/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e diff --git a/test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/objects/96/c588f28aac5a8ebd6430526697e82e46b3180c b/test/integration/submoduleEnter/expected/other_repo/objects/96/c588f28aac5a8ebd6430526697e82e46b3180c similarity index 100% rename from test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/objects/96/c588f28aac5a8ebd6430526697e82e46b3180c rename to test/integration/submoduleEnter/expected/other_repo/objects/96/c588f28aac5a8ebd6430526697e82e46b3180c diff --git a/test/integration/submoduleEnter/expected/.git_keep/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 b/test/integration/submoduleEnter/expected/other_repo/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 similarity index 100% rename from test/integration/submoduleEnter/expected/.git_keep/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 rename to test/integration/submoduleEnter/expected/other_repo/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 diff --git a/test/integration/submoduleEnter/expected/other_repo/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/submoduleEnter/expected/other_repo/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 new file mode 100644 index 000000000..285df3e5f Binary files /dev/null and b/test/integration/submoduleEnter/expected/other_repo/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 differ diff --git a/test/integration/submoduleEnter/expected/other_repo/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/submoduleEnter/expected/other_repo/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 new file mode 100644 index 000000000..96d2e71a6 Binary files /dev/null and b/test/integration/submoduleEnter/expected/other_repo/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 differ diff --git a/test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/objects/fc/4712e93d74ad4fb68e2fd219ac253ae03e19a4 b/test/integration/submoduleEnter/expected/other_repo/objects/fc/4712e93d74ad4fb68e2fd219ac253ae03e19a4 similarity index 100% rename from test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/objects/fc/4712e93d74ad4fb68e2fd219ac253ae03e19a4 rename to test/integration/submoduleEnter/expected/other_repo/objects/fc/4712e93d74ad4fb68e2fd219ac253ae03e19a4 diff --git a/test/integration/submoduleEnter/expected/other_repo/packed-refs b/test/integration/submoduleEnter/expected/other_repo/packed-refs new file mode 100644 index 000000000..83e031563 --- /dev/null +++ b/test/integration/submoduleEnter/expected/other_repo/packed-refs @@ -0,0 +1,2 @@ +# pack-refs with: peeled fully-peeled sorted +fc4712e93d74ad4fb68e2fd219ac253ae03e19a4 refs/heads/master diff --git a/test/integration/submoduleEnter/expected/.git_keep/COMMIT_EDITMSG b/test/integration/submoduleEnter/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/submoduleEnter/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/submoduleEnter/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/vendor/github.com/xo/terminfo/go.sum b/test/integration/submoduleEnter/expected/repo/.git_keep/FETCH_HEAD similarity index 100% rename from vendor/github.com/xo/terminfo/go.sum rename to test/integration/submoduleEnter/expected/repo/.git_keep/FETCH_HEAD diff --git a/test/integration/submoduleEnter/expected/repo/.git_keep/HEAD b/test/integration/submoduleEnter/expected/repo/.git_keep/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/test/integration/submoduleEnter/expected/repo/.git_keep/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/test/integration/submoduleEnter/expected/repo/.git_keep/config b/test/integration/submoduleEnter/expected/repo/.git_keep/config new file mode 100644 index 000000000..053d8f942 --- /dev/null +++ b/test/integration/submoduleEnter/expected/repo/.git_keep/config @@ -0,0 +1,13 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[user] + email = CI@example.com + name = CI +[submodule "other_repo"] + url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleEnter/actual/other_repo + active = true diff --git a/test/integration/submoduleEnter/expected/repo/.git_keep/description b/test/integration/submoduleEnter/expected/repo/.git_keep/description new file mode 100644 index 000000000..498b267a8 --- /dev/null +++ b/test/integration/submoduleEnter/expected/repo/.git_keep/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/integration/submoduleEnter/expected/repo/.git_keep/index b/test/integration/submoduleEnter/expected/repo/.git_keep/index new file mode 100644 index 000000000..0b75986af Binary files /dev/null and b/test/integration/submoduleEnter/expected/repo/.git_keep/index differ diff --git a/test/integration/submoduleEnter/expected/repo/.git_keep/info/exclude b/test/integration/submoduleEnter/expected/repo/.git_keep/info/exclude new file mode 100644 index 000000000..8e9f2071f --- /dev/null +++ b/test/integration/submoduleEnter/expected/repo/.git_keep/info/exclude @@ -0,0 +1,7 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ +.DS_Store diff --git a/test/integration/submoduleEnter/expected/repo/.git_keep/logs/HEAD b/test/integration/submoduleEnter/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..bcb2bf2e8 --- /dev/null +++ b/test/integration/submoduleEnter/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,5 @@ +0000000000000000000000000000000000000000 a50a5125768001a3ea263ffb7cafbc421a508153 CI 1534792759 +0100 commit (initial): myfile1 +a50a5125768001a3ea263ffb7cafbc421a508153 42530e986dbb65877ed8d61ca0c816e425e5c62e CI 1534792759 +0100 commit: myfile2 +42530e986dbb65877ed8d61ca0c816e425e5c62e fc4712e93d74ad4fb68e2fd219ac253ae03e19a4 CI 1534792759 +0100 commit: myfile3 +fc4712e93d74ad4fb68e2fd219ac253ae03e19a4 e1eb418c0ff98940d4ea817eebcff5dcdde645ce CI 1534792759 +0100 commit: add submodule +e1eb418c0ff98940d4ea817eebcff5dcdde645ce fd65a5c96edfc884a78bfe3d0240cb8a7ea0a31a CI 1648348036 +1100 commit: test diff --git a/test/integration/submoduleEnter/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/submoduleEnter/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..bcb2bf2e8 --- /dev/null +++ b/test/integration/submoduleEnter/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,5 @@ +0000000000000000000000000000000000000000 a50a5125768001a3ea263ffb7cafbc421a508153 CI 1534792759 +0100 commit (initial): myfile1 +a50a5125768001a3ea263ffb7cafbc421a508153 42530e986dbb65877ed8d61ca0c816e425e5c62e CI 1534792759 +0100 commit: myfile2 +42530e986dbb65877ed8d61ca0c816e425e5c62e fc4712e93d74ad4fb68e2fd219ac253ae03e19a4 CI 1534792759 +0100 commit: myfile3 +fc4712e93d74ad4fb68e2fd219ac253ae03e19a4 e1eb418c0ff98940d4ea817eebcff5dcdde645ce CI 1534792759 +0100 commit: add submodule +e1eb418c0ff98940d4ea817eebcff5dcdde645ce fd65a5c96edfc884a78bfe3d0240cb8a7ea0a31a CI 1648348036 +1100 commit: test diff --git a/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/HEAD b/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/ORIG_HEAD b/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/ORIG_HEAD similarity index 100% rename from test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/ORIG_HEAD rename to test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/ORIG_HEAD diff --git a/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/config b/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/config new file mode 100644 index 000000000..d14d72ba1 --- /dev/null +++ b/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/config @@ -0,0 +1,14 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true + worktree = ../../../other_repo +[remote "origin"] + url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleEnter/actual/other_repo + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "master"] + remote = origin + merge = refs/heads/master diff --git a/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/description b/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/description new file mode 100644 index 000000000..498b267a8 --- /dev/null +++ b/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/index b/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/index new file mode 100644 index 000000000..304e77844 Binary files /dev/null and b/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/index differ diff --git a/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/info/exclude b/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/info/exclude new file mode 100644 index 000000000..8e9f2071f --- /dev/null +++ b/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/info/exclude @@ -0,0 +1,7 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ +.DS_Store diff --git a/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/logs/HEAD b/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/logs/HEAD new file mode 100644 index 000000000..ed71cbd0f --- /dev/null +++ b/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/logs/HEAD @@ -0,0 +1,5 @@ +0000000000000000000000000000000000000000 fc4712e93d74ad4fb68e2fd219ac253ae03e19a4 Jesse Duffield 1534792759 +0100 clone: from /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleEnter/actual/other_repo +fc4712e93d74ad4fb68e2fd219ac253ae03e19a4 42530e986dbb65877ed8d61ca0c816e425e5c62e Jesse Duffield 1648348031 +1100 rebase -i (start): checkout 42530e986dbb65877ed8d61ca0c816e425e5c62e +42530e986dbb65877ed8d61ca0c816e425e5c62e 42530e986dbb65877ed8d61ca0c816e425e5c62e Jesse Duffield 1648348031 +1100 rebase -i (finish): returning to refs/heads/master +42530e986dbb65877ed8d61ca0c816e425e5c62e a50a5125768001a3ea263ffb7cafbc421a508153 Jesse Duffield 1648348032 +1100 rebase -i (start): checkout a50a5125768001a3ea263ffb7cafbc421a508153 +a50a5125768001a3ea263ffb7cafbc421a508153 a50a5125768001a3ea263ffb7cafbc421a508153 Jesse Duffield 1648348032 +1100 rebase -i (finish): returning to refs/heads/master diff --git a/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/logs/refs/heads/master b/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/logs/refs/heads/master new file mode 100644 index 000000000..36662576a --- /dev/null +++ b/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/logs/refs/heads/master @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 fc4712e93d74ad4fb68e2fd219ac253ae03e19a4 Jesse Duffield 1534792759 +0100 clone: from /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleEnter/actual/other_repo +fc4712e93d74ad4fb68e2fd219ac253ae03e19a4 42530e986dbb65877ed8d61ca0c816e425e5c62e Jesse Duffield 1648348031 +1100 rebase -i (finish): refs/heads/master onto 42530e986dbb65877ed8d61ca0c816e425e5c62e +42530e986dbb65877ed8d61ca0c816e425e5c62e a50a5125768001a3ea263ffb7cafbc421a508153 Jesse Duffield 1648348032 +1100 rebase -i (finish): refs/heads/master onto a50a5125768001a3ea263ffb7cafbc421a508153 diff --git a/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/logs/refs/remotes/origin/HEAD b/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/logs/refs/remotes/origin/HEAD new file mode 100644 index 000000000..259f2e9f2 --- /dev/null +++ b/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/logs/refs/remotes/origin/HEAD @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 fc4712e93d74ad4fb68e2fd219ac253ae03e19a4 Jesse Duffield 1534792759 +0100 clone: from /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleEnter/actual/other_repo diff --git a/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 new file mode 100644 index 000000000..7f2ebf4ee Binary files /dev/null and b/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 differ diff --git a/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 new file mode 100644 index 000000000..f74bf2335 Binary files /dev/null and b/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 differ diff --git a/test/integration/submoduleRemove/expected/.git_keep/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e b/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e similarity index 100% rename from test/integration/submoduleRemove/expected/.git_keep/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e rename to test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e diff --git a/test/integration/submoduleEnter/expected/.git_keep/objects/96/c588f28aac5a8ebd6430526697e82e46b3180c b/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/objects/96/c588f28aac5a8ebd6430526697e82e46b3180c similarity index 100% rename from test/integration/submoduleEnter/expected/.git_keep/objects/96/c588f28aac5a8ebd6430526697e82e46b3180c rename to test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/objects/96/c588f28aac5a8ebd6430526697e82e46b3180c diff --git a/test/integration/submoduleRemove/expected/.git_keep/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 b/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 similarity index 100% rename from test/integration/submoduleRemove/expected/.git_keep/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 rename to test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 diff --git a/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 new file mode 100644 index 000000000..285df3e5f Binary files /dev/null and b/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 differ diff --git a/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 new file mode 100644 index 000000000..96d2e71a6 Binary files /dev/null and b/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 differ diff --git a/test/integration/submoduleEnter/expected/.git_keep/objects/fc/4712e93d74ad4fb68e2fd219ac253ae03e19a4 b/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/objects/fc/4712e93d74ad4fb68e2fd219ac253ae03e19a4 similarity index 100% rename from test/integration/submoduleEnter/expected/.git_keep/objects/fc/4712e93d74ad4fb68e2fd219ac253ae03e19a4 rename to test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/objects/fc/4712e93d74ad4fb68e2fd219ac253ae03e19a4 diff --git a/test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/packed-refs b/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/packed-refs similarity index 100% rename from test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/packed-refs rename to test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/packed-refs diff --git a/test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/refs/heads/master b/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/refs/heads/master similarity index 100% rename from test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/refs/heads/master rename to test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/refs/heads/master diff --git a/test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/refs/remotes/origin/HEAD b/test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/refs/remotes/origin/HEAD similarity index 100% rename from test/integration/submoduleEnter/expected/.git_keep/modules/other_repo/refs/remotes/origin/HEAD rename to test/integration/submoduleEnter/expected/repo/.git_keep/modules/other_repo/refs/remotes/origin/HEAD diff --git a/test/integration/submoduleEnter/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/submoduleEnter/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 new file mode 100644 index 000000000..7f2ebf4ee Binary files /dev/null and b/test/integration/submoduleEnter/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 differ diff --git a/test/integration/submoduleEnter/expected/.git_keep/objects/10/7f435787895be1068f01326df55c355a9d29b1 b/test/integration/submoduleEnter/expected/repo/.git_keep/objects/10/7f435787895be1068f01326df55c355a9d29b1 similarity index 100% rename from test/integration/submoduleEnter/expected/.git_keep/objects/10/7f435787895be1068f01326df55c355a9d29b1 rename to test/integration/submoduleEnter/expected/repo/.git_keep/objects/10/7f435787895be1068f01326df55c355a9d29b1 diff --git a/test/integration/submoduleEnter/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/submoduleEnter/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 new file mode 100644 index 000000000..f74bf2335 Binary files /dev/null and b/test/integration/submoduleEnter/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 differ diff --git a/test/integration/submoduleEnter/expected/.git_keep/objects/2b/864257bf2d49adbad8785540d85030a60852ff b/test/integration/submoduleEnter/expected/repo/.git_keep/objects/2b/864257bf2d49adbad8785540d85030a60852ff similarity index 100% rename from test/integration/submoduleEnter/expected/.git_keep/objects/2b/864257bf2d49adbad8785540d85030a60852ff rename to test/integration/submoduleEnter/expected/repo/.git_keep/objects/2b/864257bf2d49adbad8785540d85030a60852ff diff --git a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e b/test/integration/submoduleEnter/expected/repo/.git_keep/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/modules/other_repo/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e rename to test/integration/submoduleEnter/expected/repo/.git_keep/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e diff --git a/test/integration/submoduleEnter/expected/.git_keep/objects/59/a9aee220657762e2d1c60799a0f5b03137d906 b/test/integration/submoduleEnter/expected/repo/.git_keep/objects/59/a9aee220657762e2d1c60799a0f5b03137d906 similarity index 100% rename from test/integration/submoduleEnter/expected/.git_keep/objects/59/a9aee220657762e2d1c60799a0f5b03137d906 rename to test/integration/submoduleEnter/expected/repo/.git_keep/objects/59/a9aee220657762e2d1c60799a0f5b03137d906 diff --git a/test/integration/submoduleEnter/expected/repo/.git_keep/objects/96/c588f28aac5a8ebd6430526697e82e46b3180c b/test/integration/submoduleEnter/expected/repo/.git_keep/objects/96/c588f28aac5a8ebd6430526697e82e46b3180c new file mode 100644 index 000000000..56590efa1 Binary files /dev/null and b/test/integration/submoduleEnter/expected/repo/.git_keep/objects/96/c588f28aac5a8ebd6430526697e82e46b3180c differ diff --git a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 b/test/integration/submoduleEnter/expected/repo/.git_keep/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/modules/other_repo/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 rename to test/integration/submoduleEnter/expected/repo/.git_keep/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 diff --git a/test/integration/submoduleEnter/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/submoduleEnter/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 new file mode 100644 index 000000000..285df3e5f Binary files /dev/null and b/test/integration/submoduleEnter/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 differ diff --git a/test/integration/submoduleEnter/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/submoduleEnter/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 new file mode 100644 index 000000000..96d2e71a6 Binary files /dev/null and b/test/integration/submoduleEnter/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 differ diff --git a/test/integration/submoduleEnter/expected/.git_keep/objects/e1/eb418c0ff98940d4ea817eebcff5dcdde645ce b/test/integration/submoduleEnter/expected/repo/.git_keep/objects/e1/eb418c0ff98940d4ea817eebcff5dcdde645ce similarity index 100% rename from test/integration/submoduleEnter/expected/.git_keep/objects/e1/eb418c0ff98940d4ea817eebcff5dcdde645ce rename to test/integration/submoduleEnter/expected/repo/.git_keep/objects/e1/eb418c0ff98940d4ea817eebcff5dcdde645ce diff --git a/test/integration/submoduleEnter/expected/repo/.git_keep/objects/fc/4712e93d74ad4fb68e2fd219ac253ae03e19a4 b/test/integration/submoduleEnter/expected/repo/.git_keep/objects/fc/4712e93d74ad4fb68e2fd219ac253ae03e19a4 new file mode 100644 index 000000000..95d1a3bc9 --- /dev/null +++ b/test/integration/submoduleEnter/expected/repo/.git_keep/objects/fc/4712e93d74ad4fb68e2fd219ac253ae03e19a4 @@ -0,0 +1,2 @@ +xŤŽK +Â0@]çŮ ’ßL&PDčŞÇH&S,4¶”z{{·ď˝Ĺă­µĄk›ÂĄ":!Ńě(g†LR*oŔ!¦(ä$`ń– «=ňę:8đFa-b”J-gĂdQN-ŔčDĺwn‡'=ŚÓC>ąí«ÜxkwmÁ‡\„¤ŻĆŁNzNuů3Wí;/«xő•¶9ç \ No newline at end of file diff --git a/test/integration/submoduleEnter/expected/repo/.git_keep/objects/fd/65a5c96edfc884a78bfe3d0240cb8a7ea0a31a b/test/integration/submoduleEnter/expected/repo/.git_keep/objects/fd/65a5c96edfc884a78bfe3d0240cb8a7ea0a31a new file mode 100644 index 000000000..f431c893b --- /dev/null +++ b/test/integration/submoduleEnter/expected/repo/.git_keep/objects/fd/65a5c96edfc884a78bfe3d0240cb8a7ea0a31a @@ -0,0 +1,4 @@ +xŤÎM +1 @a×=E÷‚$Ó¦MADp5ÇčOŠ‚u†1‚ÇwŽŕöń-^]Ćx¨Ĺ„ÝD,BěŢQäȉРî€n +­UG”S›RAłćM^jĄxä +˝'Nš—ĚEJíťZmM‚§*&ôľlö6ŰómľĘ7Źő)§şŚ‹ĹŕŮyěŔěuźRů“•·š$99Ć \ No newline at end of file diff --git a/test/integration/submoduleEnter/expected/repo/.git_keep/refs/heads/master b/test/integration/submoduleEnter/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..35e1a490a --- /dev/null +++ b/test/integration/submoduleEnter/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +fd65a5c96edfc884a78bfe3d0240cb8a7ea0a31a diff --git a/test/integration/submoduleEnter/expected/.gitmodules_keep b/test/integration/submoduleEnter/expected/repo/.gitmodules_keep similarity index 100% rename from test/integration/submoduleEnter/expected/.gitmodules_keep rename to test/integration/submoduleEnter/expected/repo/.gitmodules_keep diff --git a/test/integration/submoduleEnter/expected/repo/myfile1 b/test/integration/submoduleEnter/expected/repo/myfile1 new file mode 100644 index 000000000..a5bce3fd2 --- /dev/null +++ b/test/integration/submoduleEnter/expected/repo/myfile1 @@ -0,0 +1 @@ +test1 diff --git a/test/integration/submoduleEnter/expected/myfile3 b/test/integration/submoduleEnter/expected/repo/myfile2 similarity index 100% rename from test/integration/submoduleEnter/expected/myfile3 rename to test/integration/submoduleEnter/expected/repo/myfile2 diff --git a/test/integration/tags2/expected/file2 b/test/integration/submoduleEnter/expected/repo/myfile3 similarity index 100% rename from test/integration/tags2/expected/file2 rename to test/integration/submoduleEnter/expected/repo/myfile3 diff --git a/test/integration/submoduleEnter/expected/other_repo/.git_keep b/test/integration/submoduleEnter/expected/repo/other_repo/.git_keep similarity index 100% rename from test/integration/submoduleEnter/expected/other_repo/.git_keep rename to test/integration/submoduleEnter/expected/repo/other_repo/.git_keep diff --git a/test/integration/submoduleEnter/expected/repo/other_repo/myfile1 b/test/integration/submoduleEnter/expected/repo/other_repo/myfile1 new file mode 100644 index 000000000..a5bce3fd2 --- /dev/null +++ b/test/integration/submoduleEnter/expected/repo/other_repo/myfile1 @@ -0,0 +1 @@ +test1 diff --git a/test/integration/submoduleEnter/setup.sh b/test/integration/submoduleEnter/setup.sh index 2f876d8ae..307593a71 100644 --- a/test/integration/submoduleEnter/setup.sh +++ b/test/integration/submoduleEnter/setup.sh @@ -23,8 +23,8 @@ git add . git commit -am "myfile3" cd .. -git clone --bare ./actual other_repo -cd actual +git clone --bare ./repo other_repo +cd repo git submodule add ../other_repo git commit -am "add submodule" diff --git a/test/integration/submoduleRemove/expected/.git_keep/index b/test/integration/submoduleRemove/expected/.git_keep/index deleted file mode 100644 index 5a4c6431f..000000000 Binary files a/test/integration/submoduleRemove/expected/.git_keep/index and /dev/null differ diff --git a/test/integration/submoduleRemove/expected/.git_keep/logs/HEAD b/test/integration/submoduleRemove/expected/.git_keep/logs/HEAD deleted file mode 100644 index a38da0237..000000000 --- a/test/integration/submoduleRemove/expected/.git_keep/logs/HEAD +++ /dev/null @@ -1,4 +0,0 @@ -0000000000000000000000000000000000000000 a50a5125768001a3ea263ffb7cafbc421a508153 CI 1534792759 +0100 commit (initial): myfile1 -a50a5125768001a3ea263ffb7cafbc421a508153 42530e986dbb65877ed8d61ca0c816e425e5c62e CI 1534792759 +0100 commit: myfile2 -42530e986dbb65877ed8d61ca0c816e425e5c62e 9d10a5a0a21eb2cfdb6206f474ed57fd5cd51440 CI 1534792759 +0100 commit: add submodule -9d10a5a0a21eb2cfdb6206f474ed57fd5cd51440 40f121d7563ed318d461996b8d84e2ec8632687e CI 1643370773 +1100 commit: remove submodule diff --git a/test/integration/submoduleRemove/expected/.git_keep/logs/refs/heads/master b/test/integration/submoduleRemove/expected/.git_keep/logs/refs/heads/master deleted file mode 100644 index a38da0237..000000000 --- a/test/integration/submoduleRemove/expected/.git_keep/logs/refs/heads/master +++ /dev/null @@ -1,4 +0,0 @@ -0000000000000000000000000000000000000000 a50a5125768001a3ea263ffb7cafbc421a508153 CI 1534792759 +0100 commit (initial): myfile1 -a50a5125768001a3ea263ffb7cafbc421a508153 42530e986dbb65877ed8d61ca0c816e425e5c62e CI 1534792759 +0100 commit: myfile2 -42530e986dbb65877ed8d61ca0c816e425e5c62e 9d10a5a0a21eb2cfdb6206f474ed57fd5cd51440 CI 1534792759 +0100 commit: add submodule -9d10a5a0a21eb2cfdb6206f474ed57fd5cd51440 40f121d7563ed318d461996b8d84e2ec8632687e CI 1643370773 +1100 commit: remove submodule diff --git a/test/integration/submoduleRemove/expected/.git_keep/objects/40/f121d7563ed318d461996b8d84e2ec8632687e b/test/integration/submoduleRemove/expected/.git_keep/objects/40/f121d7563ed318d461996b8d84e2ec8632687e deleted file mode 100644 index 3fed8203a..000000000 --- a/test/integration/submoduleRemove/expected/.git_keep/objects/40/f121d7563ed318d461996b8d84e2ec8632687e +++ /dev/null @@ -1,2 +0,0 @@ -xŤŽK -Â0@]çŮ 2“Ż‚ĐUŹ1“LPhL‰©x|{—ďń/µZźC°‡ŃEtAgÁYfo#űh"íRaF:g,žŚ1Y­Ôĺ5ô%#' Â&•ĚÁ@(.:É>–ěSöč(ÚĆŁu=Íú:ÍwůR]9ĄVoł6BŚVÔn÷©!ćŞKmŃďŤkËŰ"ę!‘>] \ No newline at end of file diff --git a/test/integration/submoduleRemove/expected/.git_keep/refs/heads/master b/test/integration/submoduleRemove/expected/.git_keep/refs/heads/master deleted file mode 100644 index 0c4653c44..000000000 --- a/test/integration/submoduleRemove/expected/.git_keep/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -40f121d7563ed318d461996b8d84e2ec8632687e diff --git a/test/integration/submoduleRemove/expected/other_repo/HEAD b/test/integration/submoduleRemove/expected/other_repo/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/test/integration/submoduleRemove/expected/other_repo/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/test/integration/submoduleRemove/expected/other_repo/config b/test/integration/submoduleRemove/expected/other_repo/config new file mode 100644 index 000000000..e710ce53e --- /dev/null +++ b/test/integration/submoduleRemove/expected/other_repo/config @@ -0,0 +1,8 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleRemove/actual/./repo diff --git a/test/integration/submoduleRemove/expected/other_repo/description b/test/integration/submoduleRemove/expected/other_repo/description new file mode 100644 index 000000000..498b267a8 --- /dev/null +++ b/test/integration/submoduleRemove/expected/other_repo/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/integration/submoduleRemove/expected/other_repo/info/exclude b/test/integration/submoduleRemove/expected/other_repo/info/exclude new file mode 100644 index 000000000..8e9f2071f --- /dev/null +++ b/test/integration/submoduleRemove/expected/other_repo/info/exclude @@ -0,0 +1,7 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ +.DS_Store diff --git a/test/integration/submoduleRemove/expected/other_repo/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/submoduleRemove/expected/other_repo/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 new file mode 100644 index 000000000..7f2ebf4ee Binary files /dev/null and b/test/integration/submoduleRemove/expected/other_repo/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 differ diff --git a/test/integration/submoduleRemove/expected/other_repo/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/submoduleRemove/expected/other_repo/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 new file mode 100644 index 000000000..f74bf2335 Binary files /dev/null and b/test/integration/submoduleRemove/expected/other_repo/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 differ diff --git a/test/integration/submoduleReset/expected/.git_keep/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e b/test/integration/submoduleRemove/expected/other_repo/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e rename to test/integration/submoduleRemove/expected/other_repo/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e diff --git a/test/integration/submoduleReset/expected/.git_keep/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 b/test/integration/submoduleRemove/expected/other_repo/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 rename to test/integration/submoduleRemove/expected/other_repo/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 diff --git a/test/integration/submoduleRemove/expected/other_repo/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/submoduleRemove/expected/other_repo/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 new file mode 100644 index 000000000..285df3e5f Binary files /dev/null and b/test/integration/submoduleRemove/expected/other_repo/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 differ diff --git a/test/integration/submoduleRemove/expected/other_repo/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/submoduleRemove/expected/other_repo/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 new file mode 100644 index 000000000..96d2e71a6 Binary files /dev/null and b/test/integration/submoduleRemove/expected/other_repo/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 differ diff --git a/test/integration/submoduleRemove/expected/other_repo/packed-refs b/test/integration/submoduleRemove/expected/other_repo/packed-refs new file mode 100644 index 000000000..62f6568b2 --- /dev/null +++ b/test/integration/submoduleRemove/expected/other_repo/packed-refs @@ -0,0 +1,2 @@ +# pack-refs with: peeled fully-peeled sorted +42530e986dbb65877ed8d61ca0c816e425e5c62e refs/heads/master diff --git a/test/integration/submoduleRemove/expected/.git_keep/COMMIT_EDITMSG b/test/integration/submoduleRemove/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/submoduleRemove/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/submoduleRemove/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/submoduleRemove/expected/repo/.git_keep/FETCH_HEAD b/test/integration/submoduleRemove/expected/repo/.git_keep/FETCH_HEAD new file mode 100644 index 000000000..e69de29bb diff --git a/test/integration/submoduleRemove/expected/repo/.git_keep/HEAD b/test/integration/submoduleRemove/expected/repo/.git_keep/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/test/integration/submoduleRemove/expected/repo/.git_keep/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/test/integration/tags2/expected/.git_keep/config b/test/integration/submoduleRemove/expected/repo/.git_keep/config similarity index 100% rename from test/integration/tags2/expected/.git_keep/config rename to test/integration/submoduleRemove/expected/repo/.git_keep/config diff --git a/test/integration/submoduleRemove/expected/repo/.git_keep/description b/test/integration/submoduleRemove/expected/repo/.git_keep/description new file mode 100644 index 000000000..498b267a8 --- /dev/null +++ b/test/integration/submoduleRemove/expected/repo/.git_keep/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/integration/submoduleRemove/expected/repo/.git_keep/index b/test/integration/submoduleRemove/expected/repo/.git_keep/index new file mode 100644 index 000000000..93d0089f1 Binary files /dev/null and b/test/integration/submoduleRemove/expected/repo/.git_keep/index differ diff --git a/test/integration/submoduleRemove/expected/repo/.git_keep/info/exclude b/test/integration/submoduleRemove/expected/repo/.git_keep/info/exclude new file mode 100644 index 000000000..8e9f2071f --- /dev/null +++ b/test/integration/submoduleRemove/expected/repo/.git_keep/info/exclude @@ -0,0 +1,7 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ +.DS_Store diff --git a/test/integration/submoduleRemove/expected/repo/.git_keep/logs/HEAD b/test/integration/submoduleRemove/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..34e702d94 --- /dev/null +++ b/test/integration/submoduleRemove/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,4 @@ +0000000000000000000000000000000000000000 a50a5125768001a3ea263ffb7cafbc421a508153 CI 1534792759 +0100 commit (initial): myfile1 +a50a5125768001a3ea263ffb7cafbc421a508153 42530e986dbb65877ed8d61ca0c816e425e5c62e CI 1534792759 +0100 commit: myfile2 +42530e986dbb65877ed8d61ca0c816e425e5c62e 9d10a5a0a21eb2cfdb6206f474ed57fd5cd51440 CI 1534792759 +0100 commit: add submodule +9d10a5a0a21eb2cfdb6206f474ed57fd5cd51440 611cac756ef1944ab56d12f4ea3ae4623724c8cf CI 1648348134 +1100 commit: remove submodule diff --git a/test/integration/submoduleRemove/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/submoduleRemove/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..34e702d94 --- /dev/null +++ b/test/integration/submoduleRemove/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,4 @@ +0000000000000000000000000000000000000000 a50a5125768001a3ea263ffb7cafbc421a508153 CI 1534792759 +0100 commit (initial): myfile1 +a50a5125768001a3ea263ffb7cafbc421a508153 42530e986dbb65877ed8d61ca0c816e425e5c62e CI 1534792759 +0100 commit: myfile2 +42530e986dbb65877ed8d61ca0c816e425e5c62e 9d10a5a0a21eb2cfdb6206f474ed57fd5cd51440 CI 1534792759 +0100 commit: add submodule +9d10a5a0a21eb2cfdb6206f474ed57fd5cd51440 611cac756ef1944ab56d12f4ea3ae4623724c8cf CI 1648348134 +1100 commit: remove submodule diff --git a/test/integration/submoduleRemove/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/submoduleRemove/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 new file mode 100644 index 000000000..7f2ebf4ee Binary files /dev/null and b/test/integration/submoduleRemove/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 differ diff --git a/test/integration/submoduleRemove/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/submoduleRemove/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 new file mode 100644 index 000000000..f74bf2335 Binary files /dev/null and b/test/integration/submoduleRemove/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 differ diff --git a/test/integration/submoduleRemove/expected/.git_keep/objects/2b/864257bf2d49adbad8785540d85030a60852ff b/test/integration/submoduleRemove/expected/repo/.git_keep/objects/2b/864257bf2d49adbad8785540d85030a60852ff similarity index 100% rename from test/integration/submoduleRemove/expected/.git_keep/objects/2b/864257bf2d49adbad8785540d85030a60852ff rename to test/integration/submoduleRemove/expected/repo/.git_keep/objects/2b/864257bf2d49adbad8785540d85030a60852ff diff --git a/test/integration/submoduleRemove/expected/.git_keep/objects/2e/eb2c1e6451d1318b506eecddf936b59a5f32b8 b/test/integration/submoduleRemove/expected/repo/.git_keep/objects/2e/eb2c1e6451d1318b506eecddf936b59a5f32b8 similarity index 100% rename from test/integration/submoduleRemove/expected/.git_keep/objects/2e/eb2c1e6451d1318b506eecddf936b59a5f32b8 rename to test/integration/submoduleRemove/expected/repo/.git_keep/objects/2e/eb2c1e6451d1318b506eecddf936b59a5f32b8 diff --git a/test/integration/submoduleRemove/expected/repo/.git_keep/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e b/test/integration/submoduleRemove/expected/repo/.git_keep/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e new file mode 100644 index 000000000..64d20cb1e Binary files /dev/null and b/test/integration/submoduleRemove/expected/repo/.git_keep/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e differ diff --git a/test/integration/submoduleRemove/expected/repo/.git_keep/objects/61/1cac756ef1944ab56d12f4ea3ae4623724c8cf b/test/integration/submoduleRemove/expected/repo/.git_keep/objects/61/1cac756ef1944ab56d12f4ea3ae4623724c8cf new file mode 100644 index 000000000..6c2492dc7 Binary files /dev/null and b/test/integration/submoduleRemove/expected/repo/.git_keep/objects/61/1cac756ef1944ab56d12f4ea3ae4623724c8cf differ diff --git a/test/integration/submoduleRemove/expected/.git_keep/objects/9d/10a5a0a21eb2cfdb6206f474ed57fd5cd51440 b/test/integration/submoduleRemove/expected/repo/.git_keep/objects/9d/10a5a0a21eb2cfdb6206f474ed57fd5cd51440 similarity index 100% rename from test/integration/submoduleRemove/expected/.git_keep/objects/9d/10a5a0a21eb2cfdb6206f474ed57fd5cd51440 rename to test/integration/submoduleRemove/expected/repo/.git_keep/objects/9d/10a5a0a21eb2cfdb6206f474ed57fd5cd51440 diff --git a/test/integration/submoduleRemove/expected/repo/.git_keep/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 b/test/integration/submoduleRemove/expected/repo/.git_keep/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 new file mode 100644 index 000000000..5dd5f3236 --- /dev/null +++ b/test/integration/submoduleRemove/expected/repo/.git_keep/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 @@ -0,0 +1,2 @@ +xŤÍM +0@á®sŠŮJ&Nţ Á•Ç“  IˇŢľˇŰÇ/µZ×HîÖĐâRŃě%d"Áŕr@ĂX<-4dG…“5Š?ýÝfxNó(_®ű&ŹÔę ĐäŁń6Â]ŁÖęŞ×¤Ëź\Őł¬› ú5,ß \ No newline at end of file diff --git a/test/integration/submoduleRemove/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/submoduleRemove/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 new file mode 100644 index 000000000..285df3e5f Binary files /dev/null and b/test/integration/submoduleRemove/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 differ diff --git a/test/integration/submoduleRemove/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/submoduleRemove/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 new file mode 100644 index 000000000..96d2e71a6 Binary files /dev/null and b/test/integration/submoduleRemove/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 differ diff --git a/test/integration/submoduleRemove/expected/.git_keep/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 b/test/integration/submoduleRemove/expected/repo/.git_keep/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 similarity index 100% rename from test/integration/submoduleRemove/expected/.git_keep/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 rename to test/integration/submoduleRemove/expected/repo/.git_keep/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/test/integration/submoduleRemove/expected/.git_keep/objects/f1/43043bb53b17b5727a43b6cfbb1a8d1f5a222d b/test/integration/submoduleRemove/expected/repo/.git_keep/objects/f1/43043bb53b17b5727a43b6cfbb1a8d1f5a222d similarity index 100% rename from test/integration/submoduleRemove/expected/.git_keep/objects/f1/43043bb53b17b5727a43b6cfbb1a8d1f5a222d rename to test/integration/submoduleRemove/expected/repo/.git_keep/objects/f1/43043bb53b17b5727a43b6cfbb1a8d1f5a222d diff --git a/test/integration/submoduleRemove/expected/repo/.git_keep/refs/heads/master b/test/integration/submoduleRemove/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..6c6578e0b --- /dev/null +++ b/test/integration/submoduleRemove/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +611cac756ef1944ab56d12f4ea3ae4623724c8cf diff --git a/test/integration/submoduleRemove/expected/repo/.gitmodules_keep b/test/integration/submoduleRemove/expected/repo/.gitmodules_keep new file mode 100644 index 000000000..e69de29bb diff --git a/test/integration/submoduleRemove/expected/repo/myfile1 b/test/integration/submoduleRemove/expected/repo/myfile1 new file mode 100644 index 000000000..a5bce3fd2 --- /dev/null +++ b/test/integration/submoduleRemove/expected/repo/myfile1 @@ -0,0 +1 @@ +test1 diff --git a/test/integration/undo/expected/file2 b/test/integration/submoduleRemove/expected/repo/myfile2 similarity index 100% rename from test/integration/undo/expected/file2 rename to test/integration/submoduleRemove/expected/repo/myfile2 diff --git a/test/integration/submoduleRemove/setup.sh b/test/integration/submoduleRemove/setup.sh index 250092ed1..2525abf31 100644 --- a/test/integration/submoduleRemove/setup.sh +++ b/test/integration/submoduleRemove/setup.sh @@ -20,8 +20,8 @@ git add . git commit -am "myfile2" cd .. -git clone --bare ./actual other_repo -cd actual +git clone --bare ./repo other_repo +cd repo git submodule add ../other_repo git commit -am "add submodule" diff --git a/test/integration/submoduleReset/expected/.git_keep/config b/test/integration/submoduleReset/expected/.git_keep/config deleted file mode 100644 index 30e8aeba3..000000000 --- a/test/integration/submoduleReset/expected/.git_keep/config +++ /dev/null @@ -1,13 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true - precomposeunicode = true -[user] - email = CI@example.com - name = CI -[submodule "other_repo"] - url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleReset/other_repo - active = true diff --git a/test/integration/submoduleReset/expected/.git_keep/index b/test/integration/submoduleReset/expected/.git_keep/index deleted file mode 100644 index 8997e61f4..000000000 Binary files a/test/integration/submoduleReset/expected/.git_keep/index and /dev/null differ diff --git a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/config b/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/config deleted file mode 100644 index 3ffcf6005..000000000 --- a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/config +++ /dev/null @@ -1,14 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true - precomposeunicode = true - worktree = ../../../other_repo -[remote "origin"] - url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleReset/other_repo - fetch = +refs/heads/*:refs/remotes/origin/* -[branch "master"] - remote = origin - merge = refs/heads/master diff --git a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/index b/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/index deleted file mode 100644 index 407447e94..000000000 Binary files a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/index and /dev/null differ diff --git a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/logs/HEAD b/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/logs/HEAD deleted file mode 100644 index 2d343313b..000000000 --- a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/logs/HEAD +++ /dev/null @@ -1,5 +0,0 @@ -0000000000000000000000000000000000000000 42530e986dbb65877ed8d61ca0c816e425e5c62e Jesse Duffield 1534792759 +0100 clone: from /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleReset/other_repo -42530e986dbb65877ed8d61ca0c816e425e5c62e a50a5125768001a3ea263ffb7cafbc421a508153 Jesse Duffield 1643370783 +1100 rebase -i (start): checkout a50a5125768001a3ea263ffb7cafbc421a508153 -a50a5125768001a3ea263ffb7cafbc421a508153 a50a5125768001a3ea263ffb7cafbc421a508153 Jesse Duffield 1643370783 +1100 rebase -i (finish): returning to refs/heads/master -a50a5125768001a3ea263ffb7cafbc421a508153 a50a5125768001a3ea263ffb7cafbc421a508153 Jesse Duffield 1643370791 +1100 reset: moving to HEAD -a50a5125768001a3ea263ffb7cafbc421a508153 42530e986dbb65877ed8d61ca0c816e425e5c62e Jesse Duffield 1643370791 +1100 checkout: moving from master to 42530e986dbb65877ed8d61ca0c816e425e5c62e diff --git a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/logs/refs/heads/master b/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/logs/refs/heads/master deleted file mode 100644 index 227bcfcb6..000000000 --- a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/logs/refs/heads/master +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 42530e986dbb65877ed8d61ca0c816e425e5c62e Jesse Duffield 1534792759 +0100 clone: from /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleReset/other_repo -42530e986dbb65877ed8d61ca0c816e425e5c62e a50a5125768001a3ea263ffb7cafbc421a508153 Jesse Duffield 1643370783 +1100 rebase -i (finish): refs/heads/master onto a50a5125768001a3ea263ffb7cafbc421a508153 diff --git a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/logs/refs/remotes/origin/HEAD b/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/logs/refs/remotes/origin/HEAD deleted file mode 100644 index c0c3c89d8..000000000 --- a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/logs/refs/remotes/origin/HEAD +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 42530e986dbb65877ed8d61ca0c816e425e5c62e Jesse Duffield 1534792759 +0100 clone: from /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleReset/other_repo diff --git a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/logs/refs/stash b/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/logs/refs/stash deleted file mode 100644 index 4d43eb072..000000000 --- a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/logs/refs/stash +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 f35aba17e85e3fe18f7b01c0f65306c9289c482e Jesse Duffield 1643370791 +1100 WIP on master: a50a512 myfile1 diff --git a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/objects/84/69b6d9b0a33be075f9e0df61c5a3ebba3ecfd2 b/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/objects/84/69b6d9b0a33be075f9e0df61c5a3ebba3ecfd2 deleted file mode 100644 index 50202f0c4..000000000 --- a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/objects/84/69b6d9b0a33be075f9e0df61c5a3ebba3ecfd2 +++ /dev/null @@ -1,2 +0,0 @@ -xĄŤK EłŠ771 -ĆŽÜź‡˘Ą$…Ü˝mâžs“sC-%wBíúLҡbĐRŻÉ[‡IIźLÔV“<‘´(™[úłÎp§ÖnKJ™Ćç×Ć1ţřú(.ʇP˸–ĂpÄŁĺ°ç‘­v˝îôW„-Sź]xS„”GjP'(®­Ő8…NqĺłMś}„óJł \ No newline at end of file diff --git a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/objects/9d/13001fc1d98cd178f9e604f6f2c2e52794079e b/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/objects/9d/13001fc1d98cd178f9e604f6f2c2e52794079e deleted file mode 100644 index 8700d75ac..000000000 Binary files a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/objects/9d/13001fc1d98cd178f9e604f6f2c2e52794079e and /dev/null differ diff --git a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/objects/f3/5aba17e85e3fe18f7b01c0f65306c9289c482e b/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/objects/f3/5aba17e85e3fe18f7b01c0f65306c9289c482e deleted file mode 100644 index e48c17184..000000000 Binary files a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/objects/f3/5aba17e85e3fe18f7b01c0f65306c9289c482e and /dev/null differ diff --git a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/refs/stash b/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/refs/stash deleted file mode 100644 index 4a83bf1dd..000000000 --- a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/refs/stash +++ /dev/null @@ -1 +0,0 @@ -f35aba17e85e3fe18f7b01c0f65306c9289c482e diff --git a/test/integration/submoduleReset/expected/other_repo/HEAD b/test/integration/submoduleReset/expected/other_repo/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/test/integration/submoduleReset/expected/other_repo/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/test/integration/submoduleReset/expected/other_repo/config b/test/integration/submoduleReset/expected/other_repo/config new file mode 100644 index 000000000..662e16b6c --- /dev/null +++ b/test/integration/submoduleReset/expected/other_repo/config @@ -0,0 +1,8 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleReset/actual/./repo diff --git a/test/integration/submoduleReset/expected/other_repo/description b/test/integration/submoduleReset/expected/other_repo/description new file mode 100644 index 000000000..498b267a8 --- /dev/null +++ b/test/integration/submoduleReset/expected/other_repo/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/integration/submoduleReset/expected/other_repo/info/exclude b/test/integration/submoduleReset/expected/other_repo/info/exclude new file mode 100644 index 000000000..8e9f2071f --- /dev/null +++ b/test/integration/submoduleReset/expected/other_repo/info/exclude @@ -0,0 +1,7 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ +.DS_Store diff --git a/test/integration/submoduleReset/expected/other_repo/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/submoduleReset/expected/other_repo/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 new file mode 100644 index 000000000..7f2ebf4ee Binary files /dev/null and b/test/integration/submoduleReset/expected/other_repo/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 differ diff --git a/test/integration/submoduleReset/expected/other_repo/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/submoduleReset/expected/other_repo/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 new file mode 100644 index 000000000..f74bf2335 Binary files /dev/null and b/test/integration/submoduleReset/expected/other_repo/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 differ diff --git a/test/integration/submoduleReset/expected/other_repo/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e b/test/integration/submoduleReset/expected/other_repo/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e new file mode 100644 index 000000000..64d20cb1e Binary files /dev/null and b/test/integration/submoduleReset/expected/other_repo/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e differ diff --git a/test/integration/submoduleReset/expected/other_repo/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 b/test/integration/submoduleReset/expected/other_repo/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 new file mode 100644 index 000000000..5dd5f3236 --- /dev/null +++ b/test/integration/submoduleReset/expected/other_repo/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 @@ -0,0 +1,2 @@ +xŤÍM +0@á®sŠŮJ&Nţ Á•Ç“  IˇŢľˇŰÇ/µZ×HîÖĐâRŃě%d"Áŕr@ĂX<-4dG…“5Š?ýÝfxNó(_®ű&ŹÔę ĐäŁń6Â]ŁÖęŞ×¤Ëź\Őł¬› ú5,ß \ No newline at end of file diff --git a/test/integration/submoduleReset/expected/other_repo/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/submoduleReset/expected/other_repo/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 new file mode 100644 index 000000000..285df3e5f Binary files /dev/null and b/test/integration/submoduleReset/expected/other_repo/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 differ diff --git a/test/integration/submoduleReset/expected/other_repo/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/submoduleReset/expected/other_repo/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 new file mode 100644 index 000000000..96d2e71a6 Binary files /dev/null and b/test/integration/submoduleReset/expected/other_repo/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 differ diff --git a/test/integration/submoduleReset/expected/other_repo/packed-refs b/test/integration/submoduleReset/expected/other_repo/packed-refs new file mode 100644 index 000000000..62f6568b2 --- /dev/null +++ b/test/integration/submoduleReset/expected/other_repo/packed-refs @@ -0,0 +1,2 @@ +# pack-refs with: peeled fully-peeled sorted +42530e986dbb65877ed8d61ca0c816e425e5c62e refs/heads/master diff --git a/test/integration/submoduleReset/expected/.git_keep/COMMIT_EDITMSG b/test/integration/submoduleReset/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/submoduleReset/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/submoduleReset/expected/repo/.git_keep/FETCH_HEAD b/test/integration/submoduleReset/expected/repo/.git_keep/FETCH_HEAD new file mode 100644 index 000000000..e69de29bb diff --git a/test/integration/submoduleReset/expected/repo/.git_keep/HEAD b/test/integration/submoduleReset/expected/repo/.git_keep/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/test/integration/submoduleReset/expected/repo/.git_keep/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/test/integration/submoduleReset/expected/repo/.git_keep/config b/test/integration/submoduleReset/expected/repo/.git_keep/config new file mode 100644 index 000000000..ff4ef7e1c --- /dev/null +++ b/test/integration/submoduleReset/expected/repo/.git_keep/config @@ -0,0 +1,13 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[user] + email = CI@example.com + name = CI +[submodule "other_repo"] + url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleReset/actual/other_repo + active = true diff --git a/test/integration/submoduleReset/expected/repo/.git_keep/description b/test/integration/submoduleReset/expected/repo/.git_keep/description new file mode 100644 index 000000000..498b267a8 --- /dev/null +++ b/test/integration/submoduleReset/expected/repo/.git_keep/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/integration/submoduleReset/expected/repo/.git_keep/index b/test/integration/submoduleReset/expected/repo/.git_keep/index new file mode 100644 index 000000000..479039f96 Binary files /dev/null and b/test/integration/submoduleReset/expected/repo/.git_keep/index differ diff --git a/test/integration/submoduleReset/expected/repo/.git_keep/info/exclude b/test/integration/submoduleReset/expected/repo/.git_keep/info/exclude new file mode 100644 index 000000000..8e9f2071f --- /dev/null +++ b/test/integration/submoduleReset/expected/repo/.git_keep/info/exclude @@ -0,0 +1,7 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ +.DS_Store diff --git a/test/integration/submoduleReset/expected/.git_keep/logs/HEAD b/test/integration/submoduleReset/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/logs/HEAD rename to test/integration/submoduleReset/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/submoduleReset/expected/.git_keep/logs/refs/heads/master b/test/integration/submoduleReset/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/logs/refs/heads/master rename to test/integration/submoduleReset/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/HEAD b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/HEAD similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/modules/other_repo/HEAD rename to test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/HEAD diff --git a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/ORIG_HEAD b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/ORIG_HEAD similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/modules/other_repo/ORIG_HEAD rename to test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/ORIG_HEAD diff --git a/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/config b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/config new file mode 100644 index 000000000..57da72856 --- /dev/null +++ b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/config @@ -0,0 +1,14 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true + worktree = ../../../other_repo +[remote "origin"] + url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleReset/actual/other_repo + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "master"] + remote = origin + merge = refs/heads/master diff --git a/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/description b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/description new file mode 100644 index 000000000..498b267a8 --- /dev/null +++ b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/index b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/index new file mode 100644 index 000000000..e02fb9711 Binary files /dev/null and b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/index differ diff --git a/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/info/exclude b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/info/exclude new file mode 100644 index 000000000..8e9f2071f --- /dev/null +++ b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/info/exclude @@ -0,0 +1,7 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ +.DS_Store diff --git a/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/logs/HEAD b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/logs/HEAD new file mode 100644 index 000000000..a5e1c88ec --- /dev/null +++ b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/logs/HEAD @@ -0,0 +1,5 @@ +0000000000000000000000000000000000000000 42530e986dbb65877ed8d61ca0c816e425e5c62e Jesse Duffield 1534792759 +0100 clone: from /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleReset/actual/other_repo +42530e986dbb65877ed8d61ca0c816e425e5c62e a50a5125768001a3ea263ffb7cafbc421a508153 Jesse Duffield 1648348154 +1100 rebase -i (start): checkout a50a5125768001a3ea263ffb7cafbc421a508153 +a50a5125768001a3ea263ffb7cafbc421a508153 a50a5125768001a3ea263ffb7cafbc421a508153 Jesse Duffield 1648348154 +1100 rebase -i (finish): returning to refs/heads/master +a50a5125768001a3ea263ffb7cafbc421a508153 a50a5125768001a3ea263ffb7cafbc421a508153 Jesse Duffield 1648348162 +1100 reset: moving to HEAD +a50a5125768001a3ea263ffb7cafbc421a508153 42530e986dbb65877ed8d61ca0c816e425e5c62e Jesse Duffield 1648348162 +1100 checkout: moving from master to 42530e986dbb65877ed8d61ca0c816e425e5c62e diff --git a/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/logs/refs/heads/master b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/logs/refs/heads/master new file mode 100644 index 000000000..07a1588f3 --- /dev/null +++ b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/logs/refs/heads/master @@ -0,0 +1,2 @@ +0000000000000000000000000000000000000000 42530e986dbb65877ed8d61ca0c816e425e5c62e Jesse Duffield 1534792759 +0100 clone: from /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleReset/actual/other_repo +42530e986dbb65877ed8d61ca0c816e425e5c62e a50a5125768001a3ea263ffb7cafbc421a508153 Jesse Duffield 1648348154 +1100 rebase -i (finish): refs/heads/master onto a50a5125768001a3ea263ffb7cafbc421a508153 diff --git a/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/logs/refs/remotes/origin/HEAD b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/logs/refs/remotes/origin/HEAD new file mode 100644 index 000000000..ac58921d8 --- /dev/null +++ b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/logs/refs/remotes/origin/HEAD @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 42530e986dbb65877ed8d61ca0c816e425e5c62e Jesse Duffield 1534792759 +0100 clone: from /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/submoduleReset/actual/other_repo diff --git a/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/logs/refs/stash b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/logs/refs/stash new file mode 100644 index 000000000..455599518 --- /dev/null +++ b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/logs/refs/stash @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 874e570cb4ea7387ba59054b315aa584038cacea Jesse Duffield 1648348162 +1100 WIP on master: a50a512 myfile1 diff --git a/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 new file mode 100644 index 000000000..7f2ebf4ee Binary files /dev/null and b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 differ diff --git a/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/17/a177705e91137f8c55965c9c8818dd55e97c89 b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/17/a177705e91137f8c55965c9c8818dd55e97c89 new file mode 100644 index 000000000..20341dac7 --- /dev/null +++ b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/17/a177705e91137f8c55965c9c8818dd55e97c89 @@ -0,0 +1,2 @@ +xĄŤA E]sŠŮ›ŔPcŚ WŢb€AŃR’BŢŢ6ń.ßűÉűˇ–’;hmv}fôN›,ęŕ-ű¤•lĐ'í ťKž‰‚–ţ¬3Üą5†Ű’Rć1ÂůµqŚ?ľ> +ĺńją€˛čŽč”Ő°WJJ±Úőşó_±L}¦đć)ŹÜ NP¨­Ő‘d”†ňŮ&%ľ†J· \ No newline at end of file diff --git a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/objects/17/defcd0e1f9ad96542aa66845e53cb46c91c30d b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/17/defcd0e1f9ad96542aa66845e53cb46c91c30d similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/modules/other_repo/objects/17/defcd0e1f9ad96542aa66845e53cb46c91c30d rename to test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/17/defcd0e1f9ad96542aa66845e53cb46c91c30d diff --git a/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 new file mode 100644 index 000000000..f74bf2335 Binary files /dev/null and b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 differ diff --git a/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e new file mode 100644 index 000000000..64d20cb1e Binary files /dev/null and b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e differ diff --git a/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 new file mode 100644 index 000000000..adf64119a Binary files /dev/null and b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 differ diff --git a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/objects/5a/d28e22767f979da2c198dc6c1003b25964e3da b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/5a/d28e22767f979da2c198dc6c1003b25964e3da similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/modules/other_repo/objects/5a/d28e22767f979da2c198dc6c1003b25964e3da rename to test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/5a/d28e22767f979da2c198dc6c1003b25964e3da diff --git a/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/87/4e570cb4ea7387ba59054b315aa584038cacea b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/87/4e570cb4ea7387ba59054b315aa584038cacea new file mode 100644 index 000000000..27b770b53 --- /dev/null +++ b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/87/4e570cb4ea7387ba59054b315aa584038cacea @@ -0,0 +1,2 @@ +xĄ1OĹ0 „™ű+˛#ˇ8‰!ÄŔłc;Ľ˘öµ}˙ž ń~ăÝ}:['ë˛L‡‹oŽÍĚAQk˘Ţ Ť¬cĆs¦„†QjĘ2‚DŻĂov>Łg„€%“÷ŔŃ8äŘZ-­J +ĐŚW^CčA#%_«–TE©łF …}”Ö/`˝ňÝ…RŠGbi$ý+…H{P„Ć/ÇiÝÜ«í»ąçKk“Íę>µęź~úXxšďd]äD1äŕnĽşŰ§8ě_%ĂűË›[Ďná˝7Ý_÷qËw›f™WnĆ \ No newline at end of file diff --git a/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 new file mode 100644 index 000000000..5dd5f3236 --- /dev/null +++ b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 @@ -0,0 +1,2 @@ +xŤÍM +0@á®sŠŮJ&Nţ Á•Ç“  IˇŢľˇŰÇ/µZ×HîÖĐâRŃě%d"Áŕr@ĂX<-4dG…“5Š?ýÝfxNó(_®ű&ŹÔę ĐäŁń6Â]ŁÖęŞ×¤Ëź\Őł¬› ú5,ß \ No newline at end of file diff --git a/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 new file mode 100644 index 000000000..285df3e5f Binary files /dev/null and b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 differ diff --git a/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 new file mode 100644 index 000000000..96d2e71a6 Binary files /dev/null and b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 differ diff --git a/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/d2/2afbf8d80bbd74bcd87cae8a17a0315cfc915b b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/d2/2afbf8d80bbd74bcd87cae8a17a0315cfc915b new file mode 100644 index 000000000..7b37fd58d Binary files /dev/null and b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/objects/d2/2afbf8d80bbd74bcd87cae8a17a0315cfc915b differ diff --git a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/packed-refs b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/packed-refs similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/modules/other_repo/packed-refs rename to test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/packed-refs diff --git a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/refs/heads/master b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/refs/heads/master similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/modules/other_repo/refs/heads/master rename to test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/refs/heads/master diff --git a/test/integration/submoduleReset/expected/.git_keep/modules/other_repo/refs/remotes/origin/HEAD b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/refs/remotes/origin/HEAD similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/modules/other_repo/refs/remotes/origin/HEAD rename to test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/refs/remotes/origin/HEAD diff --git a/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/refs/stash b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/refs/stash new file mode 100644 index 000000000..5d3437a08 --- /dev/null +++ b/test/integration/submoduleReset/expected/repo/.git_keep/modules/other_repo/refs/stash @@ -0,0 +1 @@ +874e570cb4ea7387ba59054b315aa584038cacea diff --git a/test/integration/submoduleReset/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/submoduleReset/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 new file mode 100644 index 000000000..7f2ebf4ee Binary files /dev/null and b/test/integration/submoduleReset/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 differ diff --git a/test/integration/submoduleReset/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/submoduleReset/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 new file mode 100644 index 000000000..f74bf2335 Binary files /dev/null and b/test/integration/submoduleReset/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 differ diff --git a/test/integration/submoduleReset/expected/.git_keep/objects/2b/864257bf2d49adbad8785540d85030a60852ff b/test/integration/submoduleReset/expected/repo/.git_keep/objects/2b/864257bf2d49adbad8785540d85030a60852ff similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/objects/2b/864257bf2d49adbad8785540d85030a60852ff rename to test/integration/submoduleReset/expected/repo/.git_keep/objects/2b/864257bf2d49adbad8785540d85030a60852ff diff --git a/test/integration/submoduleReset/expected/.git_keep/objects/2e/eb2c1e6451d1318b506eecddf936b59a5f32b8 b/test/integration/submoduleReset/expected/repo/.git_keep/objects/2e/eb2c1e6451d1318b506eecddf936b59a5f32b8 similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/objects/2e/eb2c1e6451d1318b506eecddf936b59a5f32b8 rename to test/integration/submoduleReset/expected/repo/.git_keep/objects/2e/eb2c1e6451d1318b506eecddf936b59a5f32b8 diff --git a/test/integration/submoduleReset/expected/repo/.git_keep/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e b/test/integration/submoduleReset/expected/repo/.git_keep/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e new file mode 100644 index 000000000..64d20cb1e Binary files /dev/null and b/test/integration/submoduleReset/expected/repo/.git_keep/objects/42/530e986dbb65877ed8d61ca0c816e425e5c62e differ diff --git a/test/integration/submoduleReset/expected/.git_keep/objects/9d/10a5a0a21eb2cfdb6206f474ed57fd5cd51440 b/test/integration/submoduleReset/expected/repo/.git_keep/objects/9d/10a5a0a21eb2cfdb6206f474ed57fd5cd51440 similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/objects/9d/10a5a0a21eb2cfdb6206f474ed57fd5cd51440 rename to test/integration/submoduleReset/expected/repo/.git_keep/objects/9d/10a5a0a21eb2cfdb6206f474ed57fd5cd51440 diff --git a/test/integration/submoduleReset/expected/repo/.git_keep/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 b/test/integration/submoduleReset/expected/repo/.git_keep/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 new file mode 100644 index 000000000..5dd5f3236 --- /dev/null +++ b/test/integration/submoduleReset/expected/repo/.git_keep/objects/a5/0a5125768001a3ea263ffb7cafbc421a508153 @@ -0,0 +1,2 @@ +xŤÍM +0@á®sŠŮJ&Nţ Á•Ç“  IˇŢľˇŰÇ/µZ×HîÖĐâRŃě%d"Áŕr@ĂX<-4dG…“5Š?ýÝfxNó(_®ű&ŹÔę ĐäŁń6Â]ŁÖęŞ×¤Ëź\Őł¬› ú5,ß \ No newline at end of file diff --git a/test/integration/submoduleReset/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/submoduleReset/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 new file mode 100644 index 000000000..285df3e5f Binary files /dev/null and b/test/integration/submoduleReset/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 differ diff --git a/test/integration/submoduleReset/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 b/test/integration/submoduleReset/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 new file mode 100644 index 000000000..96d2e71a6 Binary files /dev/null and b/test/integration/submoduleReset/expected/repo/.git_keep/objects/a7/341a59f0ddeef969e69fb6368266d22b0f2416 differ diff --git a/test/integration/submoduleReset/expected/.git_keep/refs/heads/master b/test/integration/submoduleReset/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/submoduleReset/expected/.git_keep/refs/heads/master rename to test/integration/submoduleReset/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/submoduleReset/expected/.gitmodules_keep b/test/integration/submoduleReset/expected/repo/.gitmodules_keep similarity index 100% rename from test/integration/submoduleReset/expected/.gitmodules_keep rename to test/integration/submoduleReset/expected/repo/.gitmodules_keep diff --git a/test/integration/submoduleReset/expected/repo/myfile1 b/test/integration/submoduleReset/expected/repo/myfile1 new file mode 100644 index 000000000..a5bce3fd2 --- /dev/null +++ b/test/integration/submoduleReset/expected/repo/myfile1 @@ -0,0 +1 @@ +test1 diff --git a/test/integration/undo2/expected/file2 b/test/integration/submoduleReset/expected/repo/myfile2 similarity index 100% rename from test/integration/undo2/expected/file2 rename to test/integration/submoduleReset/expected/repo/myfile2 diff --git a/test/integration/submoduleReset/expected/other_repo/.git_keep b/test/integration/submoduleReset/expected/repo/other_repo/.git_keep similarity index 100% rename from test/integration/submoduleReset/expected/other_repo/.git_keep rename to test/integration/submoduleReset/expected/repo/other_repo/.git_keep diff --git a/test/integration/submoduleReset/expected/repo/other_repo/myfile1 b/test/integration/submoduleReset/expected/repo/other_repo/myfile1 new file mode 100644 index 000000000..a5bce3fd2 --- /dev/null +++ b/test/integration/submoduleReset/expected/repo/other_repo/myfile1 @@ -0,0 +1 @@ +test1 diff --git a/test/integration/submoduleReset/expected/repo/other_repo/myfile2 b/test/integration/submoduleReset/expected/repo/other_repo/myfile2 new file mode 100644 index 000000000..180cf8328 --- /dev/null +++ b/test/integration/submoduleReset/expected/repo/other_repo/myfile2 @@ -0,0 +1 @@ +test2 diff --git a/test/integration/submoduleReset/setup.sh b/test/integration/submoduleReset/setup.sh index 250092ed1..2525abf31 100644 --- a/test/integration/submoduleReset/setup.sh +++ b/test/integration/submoduleReset/setup.sh @@ -20,8 +20,8 @@ git add . git commit -am "myfile2" cd .. -git clone --bare ./actual other_repo -cd actual +git clone --bare ./repo other_repo +cd repo git submodule add ../other_repo git commit -am "add submodule" diff --git a/test/integration/switchTabFromMenu/expected/.git_keep/COMMIT_EDITMSG b/test/integration/switchTabFromMenu/expected/.git_keep/COMMIT_EDITMSG deleted file mode 100644 index dc3ab4abe..000000000 --- a/test/integration/switchTabFromMenu/expected/.git_keep/COMMIT_EDITMSG +++ /dev/null @@ -1 +0,0 @@ -file0 diff --git a/test/integration/branchSuggestions/expected/.git_keep/COMMIT_EDITMSG b/test/integration/switchTabFromMenu/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/branchSuggestions/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/switchTabFromMenu/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/switchTabFromMenu/expected/repo/.git_keep/FETCH_HEAD b/test/integration/switchTabFromMenu/expected/repo/.git_keep/FETCH_HEAD new file mode 100644 index 000000000..e69de29bb diff --git a/test/integration/switchTabFromMenu/expected/.git_keep/HEAD b/test/integration/switchTabFromMenu/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/switchTabFromMenu/expected/.git_keep/HEAD rename to test/integration/switchTabFromMenu/expected/repo/.git_keep/HEAD diff --git a/test/integration/switchTabFromMenu/expected/repo/.git_keep/config b/test/integration/switchTabFromMenu/expected/repo/.git_keep/config new file mode 100644 index 000000000..596ebaeb3 --- /dev/null +++ b/test/integration/switchTabFromMenu/expected/repo/.git_keep/config @@ -0,0 +1,8 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[user] + email = CI@example.com + name = CI diff --git a/test/integration/switchTabFromMenu/expected/repo/.git_keep/description b/test/integration/switchTabFromMenu/expected/repo/.git_keep/description new file mode 100644 index 000000000..498b267a8 --- /dev/null +++ b/test/integration/switchTabFromMenu/expected/repo/.git_keep/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/integration/switchTabFromMenu/expected/.git_keep/index b/test/integration/switchTabFromMenu/expected/repo/.git_keep/index similarity index 100% rename from test/integration/switchTabFromMenu/expected/.git_keep/index rename to test/integration/switchTabFromMenu/expected/repo/.git_keep/index diff --git a/test/integration/switchTabFromMenu/expected/repo/.git_keep/info/exclude b/test/integration/switchTabFromMenu/expected/repo/.git_keep/info/exclude new file mode 100644 index 000000000..a5196d1be --- /dev/null +++ b/test/integration/switchTabFromMenu/expected/repo/.git_keep/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/test/integration/switchTabFromMenu/expected/.git_keep/logs/HEAD b/test/integration/switchTabFromMenu/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/switchTabFromMenu/expected/.git_keep/logs/HEAD rename to test/integration/switchTabFromMenu/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/switchTabFromMenu/expected/.git_keep/logs/refs/heads/master b/test/integration/switchTabFromMenu/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/switchTabFromMenu/expected/.git_keep/logs/refs/heads/master rename to test/integration/switchTabFromMenu/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/switchTabFromMenu/expected/.git_keep/objects/09/767bd3484e22b41138116992cc1cb5bc45fb7f b/test/integration/switchTabFromMenu/expected/repo/.git_keep/objects/09/767bd3484e22b41138116992cc1cb5bc45fb7f similarity index 100% rename from test/integration/switchTabFromMenu/expected/.git_keep/objects/09/767bd3484e22b41138116992cc1cb5bc45fb7f rename to test/integration/switchTabFromMenu/expected/repo/.git_keep/objects/09/767bd3484e22b41138116992cc1cb5bc45fb7f diff --git a/test/integration/switchTabFromMenu/expected/.git_keep/objects/72/068e9a852a790a9b867e8b5d21cb4ede3ba4d7 b/test/integration/switchTabFromMenu/expected/repo/.git_keep/objects/72/068e9a852a790a9b867e8b5d21cb4ede3ba4d7 similarity index 100% rename from test/integration/switchTabFromMenu/expected/.git_keep/objects/72/068e9a852a790a9b867e8b5d21cb4ede3ba4d7 rename to test/integration/switchTabFromMenu/expected/repo/.git_keep/objects/72/068e9a852a790a9b867e8b5d21cb4ede3ba4d7 diff --git a/test/integration/switchTabFromMenu/expected/.git_keep/objects/c4/534c51b41b7c85f4fad4657885792d95797e8c b/test/integration/switchTabFromMenu/expected/repo/.git_keep/objects/c4/534c51b41b7c85f4fad4657885792d95797e8c similarity index 100% rename from test/integration/switchTabFromMenu/expected/.git_keep/objects/c4/534c51b41b7c85f4fad4657885792d95797e8c rename to test/integration/switchTabFromMenu/expected/repo/.git_keep/objects/c4/534c51b41b7c85f4fad4657885792d95797e8c diff --git a/test/integration/switchTabFromMenu/expected/.git_keep/objects/e0/aeb3ba0b32392aaf7d88a5190aca76be967225 b/test/integration/switchTabFromMenu/expected/repo/.git_keep/objects/e0/aeb3ba0b32392aaf7d88a5190aca76be967225 similarity index 100% rename from test/integration/switchTabFromMenu/expected/.git_keep/objects/e0/aeb3ba0b32392aaf7d88a5190aca76be967225 rename to test/integration/switchTabFromMenu/expected/repo/.git_keep/objects/e0/aeb3ba0b32392aaf7d88a5190aca76be967225 diff --git a/test/integration/switchTabFromMenu/expected/.git_keep/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 b/test/integration/switchTabFromMenu/expected/repo/.git_keep/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 similarity index 100% rename from test/integration/switchTabFromMenu/expected/.git_keep/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 rename to test/integration/switchTabFromMenu/expected/repo/.git_keep/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/test/integration/switchTabFromMenu/expected/.git_keep/refs/heads/master b/test/integration/switchTabFromMenu/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/switchTabFromMenu/expected/.git_keep/refs/heads/master rename to test/integration/switchTabFromMenu/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/switchTabFromMenu/expected/.git_keep/refs/tags/0.0.1 b/test/integration/switchTabFromMenu/expected/repo/.git_keep/refs/tags/0.0.1 similarity index 100% rename from test/integration/switchTabFromMenu/expected/.git_keep/refs/tags/0.0.1 rename to test/integration/switchTabFromMenu/expected/repo/.git_keep/refs/tags/0.0.1 diff --git a/test/integration/switchTabFromMenu/expected/.git_keep/refs/tags/0.0.2 b/test/integration/switchTabFromMenu/expected/repo/.git_keep/refs/tags/0.0.2 similarity index 100% rename from test/integration/switchTabFromMenu/expected/.git_keep/refs/tags/0.0.2 rename to test/integration/switchTabFromMenu/expected/repo/.git_keep/refs/tags/0.0.2 diff --git a/test/integration/switchTabFromMenu/expected/repo/file0 b/test/integration/switchTabFromMenu/expected/repo/file0 new file mode 100644 index 000000000..e69de29bb diff --git a/test/integration/switchTabFromMenu/expected/repo/file1 b/test/integration/switchTabFromMenu/expected/repo/file1 new file mode 100644 index 000000000..e69de29bb diff --git a/test/integration/tags/expected/repo/.git_keep/COMMIT_EDITMSG b/test/integration/tags/expected/repo/.git_keep/COMMIT_EDITMSG new file mode 100644 index 000000000..e2129701f --- /dev/null +++ b/test/integration/tags/expected/repo/.git_keep/COMMIT_EDITMSG @@ -0,0 +1 @@ +file1 diff --git a/test/integration/tags/expected/repo/.git_keep/FETCH_HEAD b/test/integration/tags/expected/repo/.git_keep/FETCH_HEAD new file mode 100644 index 000000000..e69de29bb diff --git a/test/integration/tags/expected/repo/.git_keep/HEAD b/test/integration/tags/expected/repo/.git_keep/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/test/integration/tags/expected/repo/.git_keep/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/test/integration/tags3/expected/.git_keep/config b/test/integration/tags/expected/repo/.git_keep/config similarity index 100% rename from test/integration/tags3/expected/.git_keep/config rename to test/integration/tags/expected/repo/.git_keep/config diff --git a/test/integration/tags/expected/repo/.git_keep/description b/test/integration/tags/expected/repo/.git_keep/description new file mode 100644 index 000000000..498b267a8 --- /dev/null +++ b/test/integration/tags/expected/repo/.git_keep/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/integration/tags/expected/.git_keep/index b/test/integration/tags/expected/repo/.git_keep/index similarity index 100% rename from test/integration/tags/expected/.git_keep/index rename to test/integration/tags/expected/repo/.git_keep/index diff --git a/test/integration/tags/expected/repo/.git_keep/info/exclude b/test/integration/tags/expected/repo/.git_keep/info/exclude new file mode 100644 index 000000000..8e9f2071f --- /dev/null +++ b/test/integration/tags/expected/repo/.git_keep/info/exclude @@ -0,0 +1,7 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ +.DS_Store diff --git a/test/integration/tags/expected/.git_keep/logs/HEAD b/test/integration/tags/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/tags/expected/.git_keep/logs/HEAD rename to test/integration/tags/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/tags/expected/.git_keep/logs/refs/heads/master b/test/integration/tags/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/tags/expected/.git_keep/logs/refs/heads/master rename to test/integration/tags/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/tags/expected/.git_keep/objects/07/b4cadb018ce914237e3f31ee264c9555acc1d1 b/test/integration/tags/expected/repo/.git_keep/objects/07/b4cadb018ce914237e3f31ee264c9555acc1d1 similarity index 100% rename from test/integration/tags/expected/.git_keep/objects/07/b4cadb018ce914237e3f31ee264c9555acc1d1 rename to test/integration/tags/expected/repo/.git_keep/objects/07/b4cadb018ce914237e3f31ee264c9555acc1d1 diff --git a/test/integration/tags3/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/tags/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/tags3/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/tags/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/tags3/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/tags/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/tags3/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/tags/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/tags/expected/.git_keep/objects/3e/46e87f3ca37fad40d7dd6aca00223d7f49e424 b/test/integration/tags/expected/repo/.git_keep/objects/3e/46e87f3ca37fad40d7dd6aca00223d7f49e424 similarity index 100% rename from test/integration/tags/expected/.git_keep/objects/3e/46e87f3ca37fad40d7dd6aca00223d7f49e424 rename to test/integration/tags/expected/repo/.git_keep/objects/3e/46e87f3ca37fad40d7dd6aca00223d7f49e424 diff --git a/test/integration/tags/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/tags/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 new file mode 100644 index 000000000..285df3e5f Binary files /dev/null and b/test/integration/tags/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 differ diff --git a/test/integration/tags4/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/tags/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 similarity index 100% rename from test/integration/tags4/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 rename to test/integration/tags/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 diff --git a/test/integration/tags4/expected/.git_keep/packed-refs b/test/integration/tags/expected/repo/.git_keep/packed-refs similarity index 100% rename from test/integration/tags4/expected/.git_keep/packed-refs rename to test/integration/tags/expected/repo/.git_keep/packed-refs diff --git a/test/integration/tags/expected/.git_keep/refs/heads/master b/test/integration/tags/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/tags/expected/.git_keep/refs/heads/master rename to test/integration/tags/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/tags/expected/.git_keep/refs/tags/tag1 b/test/integration/tags/expected/repo/.git_keep/refs/tags/tag1 similarity index 100% rename from test/integration/tags/expected/.git_keep/refs/tags/tag1 rename to test/integration/tags/expected/repo/.git_keep/refs/tags/tag1 diff --git a/test/integration/tags/expected/.git_keep/refs/tags/tag3 b/test/integration/tags/expected/repo/.git_keep/refs/tags/tag3 similarity index 100% rename from test/integration/tags/expected/.git_keep/refs/tags/tag3 rename to test/integration/tags/expected/repo/.git_keep/refs/tags/tag3 diff --git a/test/integration/tags/expected/.git_keep/refs/tags/tag4 b/test/integration/tags/expected/repo/.git_keep/refs/tags/tag4 similarity index 100% rename from test/integration/tags/expected/.git_keep/refs/tags/tag4 rename to test/integration/tags/expected/repo/.git_keep/refs/tags/tag4 diff --git a/test/integration/tags3/expected/file0 b/test/integration/tags/expected/repo/file0 similarity index 100% rename from test/integration/tags3/expected/file0 rename to test/integration/tags/expected/repo/file0 diff --git a/test/integration/tags/expected/repo/file1 b/test/integration/tags/expected/repo/file1 new file mode 100644 index 000000000..a5bce3fd2 --- /dev/null +++ b/test/integration/tags/expected/repo/file1 @@ -0,0 +1 @@ +test1 diff --git a/test/integration/tags2/expected/.git_keep/COMMIT_EDITMSG b/test/integration/tags2/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/tags2/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/tags2/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/tags2/expected/repo/.git_keep/FETCH_HEAD b/test/integration/tags2/expected/repo/.git_keep/FETCH_HEAD new file mode 100644 index 000000000..e69de29bb diff --git a/test/integration/tags2/expected/.git_keep/HEAD b/test/integration/tags2/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/tags2/expected/.git_keep/HEAD rename to test/integration/tags2/expected/repo/.git_keep/HEAD diff --git a/test/integration/tags2/expected/.git_keep/ORIG_HEAD b/test/integration/tags2/expected/repo/.git_keep/ORIG_HEAD similarity index 100% rename from test/integration/tags2/expected/.git_keep/ORIG_HEAD rename to test/integration/tags2/expected/repo/.git_keep/ORIG_HEAD diff --git a/test/integration/undo/expected/.git_keep/config b/test/integration/tags2/expected/repo/.git_keep/config similarity index 100% rename from test/integration/undo/expected/.git_keep/config rename to test/integration/tags2/expected/repo/.git_keep/config diff --git a/test/integration/tags2/expected/repo/.git_keep/description b/test/integration/tags2/expected/repo/.git_keep/description new file mode 100644 index 000000000..498b267a8 --- /dev/null +++ b/test/integration/tags2/expected/repo/.git_keep/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/integration/tags2/expected/.git_keep/index b/test/integration/tags2/expected/repo/.git_keep/index similarity index 100% rename from test/integration/tags2/expected/.git_keep/index rename to test/integration/tags2/expected/repo/.git_keep/index diff --git a/test/integration/tags2/expected/repo/.git_keep/info/exclude b/test/integration/tags2/expected/repo/.git_keep/info/exclude new file mode 100644 index 000000000..8e9f2071f --- /dev/null +++ b/test/integration/tags2/expected/repo/.git_keep/info/exclude @@ -0,0 +1,7 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ +.DS_Store diff --git a/test/integration/tags2/expected/.git_keep/logs/HEAD b/test/integration/tags2/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/tags2/expected/.git_keep/logs/HEAD rename to test/integration/tags2/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/tags2/expected/.git_keep/logs/refs/heads/master b/test/integration/tags2/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/tags2/expected/.git_keep/logs/refs/heads/master rename to test/integration/tags2/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/tags2/expected/.git_keep/objects/17/50e9a4016c985ef97d002ae40ed554e3db6c87 b/test/integration/tags2/expected/repo/.git_keep/objects/17/50e9a4016c985ef97d002ae40ed554e3db6c87 similarity index 100% rename from test/integration/tags2/expected/.git_keep/objects/17/50e9a4016c985ef97d002ae40ed554e3db6c87 rename to test/integration/tags2/expected/repo/.git_keep/objects/17/50e9a4016c985ef97d002ae40ed554e3db6c87 diff --git a/test/integration/tags2/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/tags2/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 new file mode 100644 index 000000000..f74bf2335 Binary files /dev/null and b/test/integration/tags2/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 differ diff --git a/test/integration/tags4/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/tags2/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/tags4/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/tags2/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/tags4/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/tags2/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/tags4/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/tags2/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/tags2/expected/.git_keep/objects/44/e5064a45438ffa3e6e4a0f1444552e2199be97 b/test/integration/tags2/expected/repo/.git_keep/objects/44/e5064a45438ffa3e6e4a0f1444552e2199be97 similarity index 100% rename from test/integration/tags2/expected/.git_keep/objects/44/e5064a45438ffa3e6e4a0f1444552e2199be97 rename to test/integration/tags2/expected/repo/.git_keep/objects/44/e5064a45438ffa3e6e4a0f1444552e2199be97 diff --git a/test/integration/tags2/expected/.git_keep/objects/56/a89d6aebdfa4f2d717efc0d115656cc9b602e7 b/test/integration/tags2/expected/repo/.git_keep/objects/56/a89d6aebdfa4f2d717efc0d115656cc9b602e7 similarity index 100% rename from test/integration/tags2/expected/.git_keep/objects/56/a89d6aebdfa4f2d717efc0d115656cc9b602e7 rename to test/integration/tags2/expected/repo/.git_keep/objects/56/a89d6aebdfa4f2d717efc0d115656cc9b602e7 diff --git a/test/integration/undo2/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/tags2/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c similarity index 100% rename from test/integration/undo2/expected/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c rename to test/integration/tags2/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c diff --git a/test/integration/tags2/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/tags2/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 new file mode 100644 index 000000000..285df3e5f Binary files /dev/null and b/test/integration/tags2/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 differ diff --git a/test/integration/tags2/expected/.git_keep/objects/ae/fe968910ad84a58bfac631b56eb422968766fb b/test/integration/tags2/expected/repo/.git_keep/objects/ae/fe968910ad84a58bfac631b56eb422968766fb similarity index 100% rename from test/integration/tags2/expected/.git_keep/objects/ae/fe968910ad84a58bfac631b56eb422968766fb rename to test/integration/tags2/expected/repo/.git_keep/objects/ae/fe968910ad84a58bfac631b56eb422968766fb diff --git a/test/integration/undo/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/tags2/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 similarity index 100% rename from test/integration/undo/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 rename to test/integration/tags2/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 diff --git a/test/integration/tags2/expected/.git_keep/objects/dc/b11a2a23383bd5f4a1085bf3a64e73e5bd963a b/test/integration/tags2/expected/repo/.git_keep/objects/dc/b11a2a23383bd5f4a1085bf3a64e73e5bd963a similarity index 100% rename from test/integration/tags2/expected/.git_keep/objects/dc/b11a2a23383bd5f4a1085bf3a64e73e5bd963a rename to test/integration/tags2/expected/repo/.git_keep/objects/dc/b11a2a23383bd5f4a1085bf3a64e73e5bd963a diff --git a/test/integration/tags2/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/tags2/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b new file mode 100644 index 000000000..9b771fc2f Binary files /dev/null and b/test/integration/tags2/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b differ diff --git a/test/integration/tags2/expected/.git_keep/refs/heads/master b/test/integration/tags2/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/tags2/expected/.git_keep/refs/heads/master rename to test/integration/tags2/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/tags2/expected/.git_keep/refs/tags/one b/test/integration/tags2/expected/repo/.git_keep/refs/tags/one similarity index 100% rename from test/integration/tags2/expected/.git_keep/refs/tags/one rename to test/integration/tags2/expected/repo/.git_keep/refs/tags/one diff --git a/test/integration/tags2/expected/.git_keep/refs/tags/two b/test/integration/tags2/expected/repo/.git_keep/refs/tags/two similarity index 100% rename from test/integration/tags2/expected/.git_keep/refs/tags/two rename to test/integration/tags2/expected/repo/.git_keep/refs/tags/two diff --git a/test/integration/tags4/expected/file0 b/test/integration/tags2/expected/repo/file0 similarity index 100% rename from test/integration/tags4/expected/file0 rename to test/integration/tags2/expected/repo/file0 diff --git a/test/integration/tags2/expected/repo/file1 b/test/integration/tags2/expected/repo/file1 new file mode 100644 index 000000000..a5bce3fd2 --- /dev/null +++ b/test/integration/tags2/expected/repo/file1 @@ -0,0 +1 @@ +test1 diff --git a/test/integration/tags2/expected/repo/file2 b/test/integration/tags2/expected/repo/file2 new file mode 100644 index 000000000..180cf8328 --- /dev/null +++ b/test/integration/tags2/expected/repo/file2 @@ -0,0 +1 @@ +test2 diff --git a/test/integration/tags3/expected/.git_keep/COMMIT_EDITMSG b/test/integration/tags3/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/tags3/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/tags3/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/tags3/expected/repo/.git_keep/FETCH_HEAD b/test/integration/tags3/expected/repo/.git_keep/FETCH_HEAD new file mode 100644 index 000000000..e69de29bb diff --git a/test/integration/tags3/expected/.git_keep/HEAD b/test/integration/tags3/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/tags3/expected/.git_keep/HEAD rename to test/integration/tags3/expected/repo/.git_keep/HEAD diff --git a/test/integration/undo2/expected/.git_keep/config b/test/integration/tags3/expected/repo/.git_keep/config similarity index 100% rename from test/integration/undo2/expected/.git_keep/config rename to test/integration/tags3/expected/repo/.git_keep/config diff --git a/test/integration/tags3/expected/repo/.git_keep/description b/test/integration/tags3/expected/repo/.git_keep/description new file mode 100644 index 000000000..498b267a8 --- /dev/null +++ b/test/integration/tags3/expected/repo/.git_keep/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/integration/tags3/expected/.git_keep/index b/test/integration/tags3/expected/repo/.git_keep/index similarity index 100% rename from test/integration/tags3/expected/.git_keep/index rename to test/integration/tags3/expected/repo/.git_keep/index diff --git a/test/integration/tags3/expected/repo/.git_keep/info/exclude b/test/integration/tags3/expected/repo/.git_keep/info/exclude new file mode 100644 index 000000000..8e9f2071f --- /dev/null +++ b/test/integration/tags3/expected/repo/.git_keep/info/exclude @@ -0,0 +1,7 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ +.DS_Store diff --git a/test/integration/tags3/expected/.git_keep/logs/HEAD b/test/integration/tags3/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/tags3/expected/.git_keep/logs/HEAD rename to test/integration/tags3/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/tags3/expected/.git_keep/logs/refs/heads/master b/test/integration/tags3/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/tags3/expected/.git_keep/logs/refs/heads/master rename to test/integration/tags3/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/tags3/expected/.git_keep/logs/refs/heads/test b/test/integration/tags3/expected/repo/.git_keep/logs/refs/heads/test similarity index 100% rename from test/integration/tags3/expected/.git_keep/logs/refs/heads/test rename to test/integration/tags3/expected/repo/.git_keep/logs/refs/heads/test diff --git a/test/integration/tags3/expected/.git_keep/objects/08/c28e4e15f3de3b024524894d9235dfcdb48c19 b/test/integration/tags3/expected/repo/.git_keep/objects/08/c28e4e15f3de3b024524894d9235dfcdb48c19 similarity index 100% rename from test/integration/tags3/expected/.git_keep/objects/08/c28e4e15f3de3b024524894d9235dfcdb48c19 rename to test/integration/tags3/expected/repo/.git_keep/objects/08/c28e4e15f3de3b024524894d9235dfcdb48c19 diff --git a/test/integration/tags3/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/tags3/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 new file mode 100644 index 000000000..f74bf2335 Binary files /dev/null and b/test/integration/tags3/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 differ diff --git a/test/integration/undo/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/tags3/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/undo/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/tags3/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/tags3/expected/.git_keep/objects/25/15eabac6791725f4a3326676a1491f09664afc b/test/integration/tags3/expected/repo/.git_keep/objects/25/15eabac6791725f4a3326676a1491f09664afc similarity index 100% rename from test/integration/tags3/expected/.git_keep/objects/25/15eabac6791725f4a3326676a1491f09664afc rename to test/integration/tags3/expected/repo/.git_keep/objects/25/15eabac6791725f4a3326676a1491f09664afc diff --git a/test/integration/undo/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/tags3/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/undo/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/tags3/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/tags3/expected/.git_keep/objects/44/e5064a45438ffa3e6e4a0f1444552e2199be97 b/test/integration/tags3/expected/repo/.git_keep/objects/44/e5064a45438ffa3e6e4a0f1444552e2199be97 similarity index 100% rename from test/integration/tags3/expected/.git_keep/objects/44/e5064a45438ffa3e6e4a0f1444552e2199be97 rename to test/integration/tags3/expected/repo/.git_keep/objects/44/e5064a45438ffa3e6e4a0f1444552e2199be97 diff --git a/test/integration/tags3/expected/.git_keep/objects/46/b4990797fac897fb135dd639a4cad3b0269f2d b/test/integration/tags3/expected/repo/.git_keep/objects/46/b4990797fac897fb135dd639a4cad3b0269f2d similarity index 100% rename from test/integration/tags3/expected/.git_keep/objects/46/b4990797fac897fb135dd639a4cad3b0269f2d rename to test/integration/tags3/expected/repo/.git_keep/objects/46/b4990797fac897fb135dd639a4cad3b0269f2d diff --git a/test/integration/tags3/expected/.git_keep/objects/88/d7a40883abd57297127b3777a2a7ec3696c33a b/test/integration/tags3/expected/repo/.git_keep/objects/88/d7a40883abd57297127b3777a2a7ec3696c33a similarity index 100% rename from test/integration/tags3/expected/.git_keep/objects/88/d7a40883abd57297127b3777a2a7ec3696c33a rename to test/integration/tags3/expected/repo/.git_keep/objects/88/d7a40883abd57297127b3777a2a7ec3696c33a diff --git a/test/integration/tags3/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/tags3/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c new file mode 100644 index 000000000..0e95eb06d Binary files /dev/null and b/test/integration/tags3/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c differ diff --git a/test/integration/tags3/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/tags3/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 new file mode 100644 index 000000000..285df3e5f Binary files /dev/null and b/test/integration/tags3/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 differ diff --git a/test/integration/undo2/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/tags3/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 similarity index 100% rename from test/integration/undo2/expected/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 rename to test/integration/tags3/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 diff --git a/test/integration/tags3/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b b/test/integration/tags3/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b new file mode 100644 index 000000000..9b771fc2f Binary files /dev/null and b/test/integration/tags3/expected/repo/.git_keep/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b differ diff --git a/test/integration/tags3/expected/.git_keep/refs/heads/master b/test/integration/tags3/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/tags3/expected/.git_keep/refs/heads/master rename to test/integration/tags3/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/tags3/expected/.git_keep/refs/heads/test b/test/integration/tags3/expected/repo/.git_keep/refs/heads/test similarity index 100% rename from test/integration/tags3/expected/.git_keep/refs/heads/test rename to test/integration/tags3/expected/repo/.git_keep/refs/heads/test diff --git a/test/integration/tags3/expected/.git_keep/refs/tags/one b/test/integration/tags3/expected/repo/.git_keep/refs/tags/one similarity index 100% rename from test/integration/tags3/expected/.git_keep/refs/tags/one rename to test/integration/tags3/expected/repo/.git_keep/refs/tags/one diff --git a/test/integration/undo/expected/file0 b/test/integration/tags3/expected/repo/file0 similarity index 100% rename from test/integration/undo/expected/file0 rename to test/integration/tags3/expected/repo/file0 diff --git a/test/integration/tags3/expected/repo/file1 b/test/integration/tags3/expected/repo/file1 new file mode 100644 index 000000000..a5bce3fd2 --- /dev/null +++ b/test/integration/tags3/expected/repo/file1 @@ -0,0 +1 @@ +test1 diff --git a/test/integration/tags4/expected/repo/.git_keep/COMMIT_EDITMSG b/test/integration/tags4/expected/repo/.git_keep/COMMIT_EDITMSG new file mode 100644 index 000000000..e2129701f --- /dev/null +++ b/test/integration/tags4/expected/repo/.git_keep/COMMIT_EDITMSG @@ -0,0 +1 @@ +file1 diff --git a/test/integration/tags4/expected/repo/.git_keep/FETCH_HEAD b/test/integration/tags4/expected/repo/.git_keep/FETCH_HEAD new file mode 100644 index 000000000..e69de29bb diff --git a/test/integration/tags4/expected/repo/.git_keep/HEAD b/test/integration/tags4/expected/repo/.git_keep/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/test/integration/tags4/expected/repo/.git_keep/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/test/integration/tags4/expected/repo/.git_keep/config b/test/integration/tags4/expected/repo/.git_keep/config new file mode 100644 index 000000000..596ebaeb3 --- /dev/null +++ b/test/integration/tags4/expected/repo/.git_keep/config @@ -0,0 +1,8 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[user] + email = CI@example.com + name = CI diff --git a/test/integration/tags4/expected/repo/.git_keep/description b/test/integration/tags4/expected/repo/.git_keep/description new file mode 100644 index 000000000..498b267a8 --- /dev/null +++ b/test/integration/tags4/expected/repo/.git_keep/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/integration/tags4/expected/.git_keep/index b/test/integration/tags4/expected/repo/.git_keep/index similarity index 100% rename from test/integration/tags4/expected/.git_keep/index rename to test/integration/tags4/expected/repo/.git_keep/index diff --git a/test/integration/tags4/expected/repo/.git_keep/info/exclude b/test/integration/tags4/expected/repo/.git_keep/info/exclude new file mode 100644 index 000000000..a5196d1be --- /dev/null +++ b/test/integration/tags4/expected/repo/.git_keep/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/test/integration/tags4/expected/.git_keep/logs/HEAD b/test/integration/tags4/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/tags4/expected/.git_keep/logs/HEAD rename to test/integration/tags4/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/tags4/expected/.git_keep/logs/refs/heads/master b/test/integration/tags4/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/tags4/expected/.git_keep/logs/refs/heads/master rename to test/integration/tags4/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/undo2/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/tags4/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 similarity index 100% rename from test/integration/undo2/expected/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 rename to test/integration/tags4/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 diff --git a/test/integration/undo2/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/tags4/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da similarity index 100% rename from test/integration/undo2/expected/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da rename to test/integration/tags4/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da diff --git a/test/integration/tags4/expected/.git_keep/objects/3a/64c1649510c0dcaca3815291e3d43980f1bb99 b/test/integration/tags4/expected/repo/.git_keep/objects/3a/64c1649510c0dcaca3815291e3d43980f1bb99 similarity index 100% rename from test/integration/tags4/expected/.git_keep/objects/3a/64c1649510c0dcaca3815291e3d43980f1bb99 rename to test/integration/tags4/expected/repo/.git_keep/objects/3a/64c1649510c0dcaca3815291e3d43980f1bb99 diff --git a/test/integration/tags4/expected/.git_keep/objects/56/18f31c7550111a878fb63f6079e8462ae94c42 b/test/integration/tags4/expected/repo/.git_keep/objects/56/18f31c7550111a878fb63f6079e8462ae94c42 similarity index 100% rename from test/integration/tags4/expected/.git_keep/objects/56/18f31c7550111a878fb63f6079e8462ae94c42 rename to test/integration/tags4/expected/repo/.git_keep/objects/56/18f31c7550111a878fb63f6079e8462ae94c42 diff --git a/test/integration/tags4/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/tags4/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 new file mode 100644 index 000000000..285df3e5f Binary files /dev/null and b/test/integration/tags4/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 differ diff --git a/test/integration/tags4/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/tags4/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 new file mode 100644 index 000000000..2e9066287 --- /dev/null +++ b/test/integration/tags4/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 @@ -0,0 +1,2 @@ +x+)JMU03c040031QHËĚI5`°±ş˛ŕźÖ¶wÁ‡Ţw.˝ůhďTÓ[H + –îyüW5őĆ—Đ(ž|§ ^-ÝW(x9 \ No newline at end of file diff --git a/test/integration/tags4/expected/.git_keep/objects/db/03048dbacea165536b49c030c9aaca108cc571 b/test/integration/tags4/expected/repo/.git_keep/objects/db/03048dbacea165536b49c030c9aaca108cc571 similarity index 100% rename from test/integration/tags4/expected/.git_keep/objects/db/03048dbacea165536b49c030c9aaca108cc571 rename to test/integration/tags4/expected/repo/.git_keep/objects/db/03048dbacea165536b49c030c9aaca108cc571 diff --git a/test/integration/tags4/expected/.git_keep/objects/f0/4e94a59e6159acf554fc1268742df10fe6b0d3 b/test/integration/tags4/expected/repo/.git_keep/objects/f0/4e94a59e6159acf554fc1268742df10fe6b0d3 similarity index 100% rename from test/integration/tags4/expected/.git_keep/objects/f0/4e94a59e6159acf554fc1268742df10fe6b0d3 rename to test/integration/tags4/expected/repo/.git_keep/objects/f0/4e94a59e6159acf554fc1268742df10fe6b0d3 diff --git a/test/integration/tags4/expected/repo/.git_keep/packed-refs b/test/integration/tags4/expected/repo/.git_keep/packed-refs new file mode 100644 index 000000000..250f18738 --- /dev/null +++ b/test/integration/tags4/expected/repo/.git_keep/packed-refs @@ -0,0 +1 @@ +# pack-refs with: peeled fully-peeled sorted diff --git a/test/integration/tags4/expected/.git_keep/refs/heads/master b/test/integration/tags4/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/tags4/expected/.git_keep/refs/heads/master rename to test/integration/tags4/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/tags4/expected/.git_keep/refs/tags/atag2 b/test/integration/tags4/expected/repo/.git_keep/refs/tags/atag2 similarity index 100% rename from test/integration/tags4/expected/.git_keep/refs/tags/atag2 rename to test/integration/tags4/expected/repo/.git_keep/refs/tags/atag2 diff --git a/test/integration/undo2/expected/file0 b/test/integration/tags4/expected/repo/file0 similarity index 100% rename from test/integration/undo2/expected/file0 rename to test/integration/tags4/expected/repo/file0 diff --git a/test/integration/tags4/expected/repo/file1 b/test/integration/tags4/expected/repo/file1 new file mode 100644 index 000000000..a5bce3fd2 --- /dev/null +++ b/test/integration/tags4/expected/repo/file1 @@ -0,0 +1 @@ +test1 diff --git a/test/integration/undo/expected/.git_keep/COMMIT_EDITMSG b/test/integration/undo/expected/repo/.git_keep/COMMIT_EDITMSG similarity index 100% rename from test/integration/undo/expected/.git_keep/COMMIT_EDITMSG rename to test/integration/undo/expected/repo/.git_keep/COMMIT_EDITMSG diff --git a/test/integration/undo/expected/repo/.git_keep/FETCH_HEAD b/test/integration/undo/expected/repo/.git_keep/FETCH_HEAD new file mode 100644 index 000000000..e69de29bb diff --git a/test/integration/undo/expected/.git_keep/HEAD b/test/integration/undo/expected/repo/.git_keep/HEAD similarity index 100% rename from test/integration/undo/expected/.git_keep/HEAD rename to test/integration/undo/expected/repo/.git_keep/HEAD diff --git a/test/integration/undo/expected/.git_keep/ORIG_HEAD b/test/integration/undo/expected/repo/.git_keep/ORIG_HEAD similarity index 100% rename from test/integration/undo/expected/.git_keep/ORIG_HEAD rename to test/integration/undo/expected/repo/.git_keep/ORIG_HEAD diff --git a/test/integration/undo/expected/repo/.git_keep/config b/test/integration/undo/expected/repo/.git_keep/config new file mode 100644 index 000000000..8ae104545 --- /dev/null +++ b/test/integration/undo/expected/repo/.git_keep/config @@ -0,0 +1,10 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[user] + email = CI@example.com + name = CI diff --git a/test/integration/undo/expected/repo/.git_keep/description b/test/integration/undo/expected/repo/.git_keep/description new file mode 100644 index 000000000..498b267a8 --- /dev/null +++ b/test/integration/undo/expected/repo/.git_keep/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/integration/undo/expected/.git_keep/index b/test/integration/undo/expected/repo/.git_keep/index similarity index 100% rename from test/integration/undo/expected/.git_keep/index rename to test/integration/undo/expected/repo/.git_keep/index diff --git a/test/integration/undo/expected/repo/.git_keep/info/exclude b/test/integration/undo/expected/repo/.git_keep/info/exclude new file mode 100644 index 000000000..8e9f2071f --- /dev/null +++ b/test/integration/undo/expected/repo/.git_keep/info/exclude @@ -0,0 +1,7 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ +.DS_Store diff --git a/test/integration/undo/expected/.git_keep/logs/HEAD b/test/integration/undo/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/undo/expected/.git_keep/logs/HEAD rename to test/integration/undo/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/undo/expected/.git_keep/logs/refs/heads/branch2 b/test/integration/undo/expected/repo/.git_keep/logs/refs/heads/branch2 similarity index 100% rename from test/integration/undo/expected/.git_keep/logs/refs/heads/branch2 rename to test/integration/undo/expected/repo/.git_keep/logs/refs/heads/branch2 diff --git a/test/integration/undo/expected/.git_keep/logs/refs/heads/master b/test/integration/undo/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/undo/expected/.git_keep/logs/refs/heads/master rename to test/integration/undo/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/undo/expected/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 b/test/integration/undo/expected/repo/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 similarity index 100% rename from test/integration/undo/expected/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 rename to test/integration/undo/expected/repo/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 diff --git a/test/integration/undo/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/undo/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 new file mode 100644 index 000000000..f74bf2335 Binary files /dev/null and b/test/integration/undo/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 differ diff --git a/test/integration/undo/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/undo/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 new file mode 100644 index 000000000..79fcadf67 Binary files /dev/null and b/test/integration/undo/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 differ diff --git a/test/integration/undo/expected/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 b/test/integration/undo/expected/repo/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 similarity index 100% rename from test/integration/undo/expected/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 rename to test/integration/undo/expected/repo/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 diff --git a/test/integration/undo/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/undo/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da new file mode 100644 index 000000000..06c9cb73d Binary files /dev/null and b/test/integration/undo/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da differ diff --git a/test/integration/undo/expected/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a b/test/integration/undo/expected/repo/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a similarity index 100% rename from test/integration/undo/expected/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a rename to test/integration/undo/expected/repo/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a diff --git a/test/integration/undo/expected/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b b/test/integration/undo/expected/repo/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b similarity index 100% rename from test/integration/undo/expected/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b rename to test/integration/undo/expected/repo/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b diff --git a/test/integration/undo/expected/.git_keep/objects/3e/4f2b1aeb076cff592279f94b1f495442690521 b/test/integration/undo/expected/repo/.git_keep/objects/3e/4f2b1aeb076cff592279f94b1f495442690521 similarity index 100% rename from test/integration/undo/expected/.git_keep/objects/3e/4f2b1aeb076cff592279f94b1f495442690521 rename to test/integration/undo/expected/repo/.git_keep/objects/3e/4f2b1aeb076cff592279f94b1f495442690521 diff --git a/test/integration/undo/expected/.git_keep/objects/4f/77a25a15ccca0273baa522f7281727f31ceeb8 b/test/integration/undo/expected/repo/.git_keep/objects/4f/77a25a15ccca0273baa522f7281727f31ceeb8 similarity index 100% rename from test/integration/undo/expected/.git_keep/objects/4f/77a25a15ccca0273baa522f7281727f31ceeb8 rename to test/integration/undo/expected/repo/.git_keep/objects/4f/77a25a15ccca0273baa522f7281727f31ceeb8 diff --git a/test/integration/undo/expected/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 b/test/integration/undo/expected/repo/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 similarity index 100% rename from test/integration/undo/expected/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 rename to test/integration/undo/expected/repo/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 diff --git a/test/integration/undo/expected/.git_keep/objects/5d/2b236ff0e8342ef1e531506f6f99070d53cf25 b/test/integration/undo/expected/repo/.git_keep/objects/5d/2b236ff0e8342ef1e531506f6f99070d53cf25 similarity index 100% rename from test/integration/undo/expected/.git_keep/objects/5d/2b236ff0e8342ef1e531506f6f99070d53cf25 rename to test/integration/undo/expected/repo/.git_keep/objects/5d/2b236ff0e8342ef1e531506f6f99070d53cf25 diff --git a/test/integration/undo/expected/.git_keep/objects/68/ac4e416c01408d37c59465852aa1856a4abdb1 b/test/integration/undo/expected/repo/.git_keep/objects/68/ac4e416c01408d37c59465852aa1856a4abdb1 similarity index 100% rename from test/integration/undo/expected/.git_keep/objects/68/ac4e416c01408d37c59465852aa1856a4abdb1 rename to test/integration/undo/expected/repo/.git_keep/objects/68/ac4e416c01408d37c59465852aa1856a4abdb1 diff --git a/test/integration/undo/expected/.git_keep/objects/6d/95d7a7842625152ba887482879dfdaf247f591 b/test/integration/undo/expected/repo/.git_keep/objects/6d/95d7a7842625152ba887482879dfdaf247f591 similarity index 100% rename from test/integration/undo/expected/.git_keep/objects/6d/95d7a7842625152ba887482879dfdaf247f591 rename to test/integration/undo/expected/repo/.git_keep/objects/6d/95d7a7842625152ba887482879dfdaf247f591 diff --git a/test/integration/undo/expected/.git_keep/objects/7c/e8eac65e3ae50cb50a570dc775b745464f3a3e b/test/integration/undo/expected/repo/.git_keep/objects/7c/e8eac65e3ae50cb50a570dc775b745464f3a3e similarity index 100% rename from test/integration/undo/expected/.git_keep/objects/7c/e8eac65e3ae50cb50a570dc775b745464f3a3e rename to test/integration/undo/expected/repo/.git_keep/objects/7c/e8eac65e3ae50cb50a570dc775b745464f3a3e diff --git a/test/integration/undo/expected/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 b/test/integration/undo/expected/repo/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 similarity index 100% rename from test/integration/undo/expected/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 rename to test/integration/undo/expected/repo/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 diff --git a/test/integration/undo/expected/.git_keep/objects/99/36b8f380c2937bb457ade468bfc7dc850293f9 b/test/integration/undo/expected/repo/.git_keep/objects/99/36b8f380c2937bb457ade468bfc7dc850293f9 similarity index 100% rename from test/integration/undo/expected/.git_keep/objects/99/36b8f380c2937bb457ade468bfc7dc850293f9 rename to test/integration/undo/expected/repo/.git_keep/objects/99/36b8f380c2937bb457ade468bfc7dc850293f9 diff --git a/test/integration/undo/expected/.git_keep/objects/9d/187b7f4819a69996dd27e3d66a5224e05d9f41 b/test/integration/undo/expected/repo/.git_keep/objects/9d/187b7f4819a69996dd27e3d66a5224e05d9f41 similarity index 100% rename from test/integration/undo/expected/.git_keep/objects/9d/187b7f4819a69996dd27e3d66a5224e05d9f41 rename to test/integration/undo/expected/repo/.git_keep/objects/9d/187b7f4819a69996dd27e3d66a5224e05d9f41 diff --git a/test/integration/undo/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/undo/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c new file mode 100644 index 000000000..0e95eb06d Binary files /dev/null and b/test/integration/undo/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c differ diff --git a/test/integration/undo/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/undo/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 new file mode 100644 index 000000000..285df3e5f Binary files /dev/null and b/test/integration/undo/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 differ diff --git a/test/integration/undo/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/undo/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 new file mode 100644 index 000000000..2e9066287 --- /dev/null +++ b/test/integration/undo/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 @@ -0,0 +1,2 @@ +x+)JMU03c040031QHËĚI5`°±ş˛ŕźÖ¶wÁ‡Ţw.˝ůhďTÓ[H + –îyüW5őĆ—Đ(ž|§ ^-ÝW(x9 \ No newline at end of file diff --git a/test/integration/undo/expected/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 b/test/integration/undo/expected/repo/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 similarity index 100% rename from test/integration/undo/expected/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 rename to test/integration/undo/expected/repo/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 diff --git a/test/integration/undo/expected/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a b/test/integration/undo/expected/repo/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a similarity index 100% rename from test/integration/undo/expected/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a rename to test/integration/undo/expected/repo/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a diff --git a/test/integration/undo/expected/.git_keep/objects/fc/f46511d7819220e0cc310ae6d891fadfdb79aa b/test/integration/undo/expected/repo/.git_keep/objects/fc/f46511d7819220e0cc310ae6d891fadfdb79aa similarity index 100% rename from test/integration/undo/expected/.git_keep/objects/fc/f46511d7819220e0cc310ae6d891fadfdb79aa rename to test/integration/undo/expected/repo/.git_keep/objects/fc/f46511d7819220e0cc310ae6d891fadfdb79aa diff --git a/test/integration/undo/expected/.git_keep/refs/heads/branch2 b/test/integration/undo/expected/repo/.git_keep/refs/heads/branch2 similarity index 100% rename from test/integration/undo/expected/.git_keep/refs/heads/branch2 rename to test/integration/undo/expected/repo/.git_keep/refs/heads/branch2 diff --git a/test/integration/undo/expected/.git_keep/refs/heads/master b/test/integration/undo/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/undo/expected/.git_keep/refs/heads/master rename to test/integration/undo/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/undo/expected/repo/file0 b/test/integration/undo/expected/repo/file0 new file mode 100644 index 000000000..38143ad4a --- /dev/null +++ b/test/integration/undo/expected/repo/file0 @@ -0,0 +1 @@ +test0 diff --git a/test/integration/undo/expected/repo/file1 b/test/integration/undo/expected/repo/file1 new file mode 100644 index 000000000..a5bce3fd2 --- /dev/null +++ b/test/integration/undo/expected/repo/file1 @@ -0,0 +1 @@ +test1 diff --git a/test/integration/undo/expected/repo/file2 b/test/integration/undo/expected/repo/file2 new file mode 100644 index 000000000..180cf8328 --- /dev/null +++ b/test/integration/undo/expected/repo/file2 @@ -0,0 +1 @@ +test2 diff --git a/test/integration/undo/expected/file4 b/test/integration/undo/expected/repo/file4 similarity index 100% rename from test/integration/undo/expected/file4 rename to test/integration/undo/expected/repo/file4 diff --git a/test/integration/undo2/expected/repo/.git_keep/COMMIT_EDITMSG b/test/integration/undo2/expected/repo/.git_keep/COMMIT_EDITMSG new file mode 100644 index 000000000..6c493ff74 --- /dev/null +++ b/test/integration/undo2/expected/repo/.git_keep/COMMIT_EDITMSG @@ -0,0 +1 @@ +file2 diff --git a/test/integration/undo2/expected/repo/.git_keep/FETCH_HEAD b/test/integration/undo2/expected/repo/.git_keep/FETCH_HEAD new file mode 100644 index 000000000..e69de29bb diff --git a/test/integration/undo2/expected/repo/.git_keep/HEAD b/test/integration/undo2/expected/repo/.git_keep/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/test/integration/undo2/expected/repo/.git_keep/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/test/integration/undo2/expected/.git_keep/ORIG_HEAD b/test/integration/undo2/expected/repo/.git_keep/ORIG_HEAD similarity index 100% rename from test/integration/undo2/expected/.git_keep/ORIG_HEAD rename to test/integration/undo2/expected/repo/.git_keep/ORIG_HEAD diff --git a/test/integration/undo2/expected/repo/.git_keep/config b/test/integration/undo2/expected/repo/.git_keep/config new file mode 100644 index 000000000..8ae104545 --- /dev/null +++ b/test/integration/undo2/expected/repo/.git_keep/config @@ -0,0 +1,10 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[user] + email = CI@example.com + name = CI diff --git a/test/integration/undo2/expected/repo/.git_keep/description b/test/integration/undo2/expected/repo/.git_keep/description new file mode 100644 index 000000000..498b267a8 --- /dev/null +++ b/test/integration/undo2/expected/repo/.git_keep/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/integration/undo2/expected/.git_keep/index b/test/integration/undo2/expected/repo/.git_keep/index similarity index 100% rename from test/integration/undo2/expected/.git_keep/index rename to test/integration/undo2/expected/repo/.git_keep/index diff --git a/test/integration/undo2/expected/repo/.git_keep/info/exclude b/test/integration/undo2/expected/repo/.git_keep/info/exclude new file mode 100644 index 000000000..8e9f2071f --- /dev/null +++ b/test/integration/undo2/expected/repo/.git_keep/info/exclude @@ -0,0 +1,7 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ +.DS_Store diff --git a/test/integration/undo2/expected/.git_keep/logs/HEAD b/test/integration/undo2/expected/repo/.git_keep/logs/HEAD similarity index 100% rename from test/integration/undo2/expected/.git_keep/logs/HEAD rename to test/integration/undo2/expected/repo/.git_keep/logs/HEAD diff --git a/test/integration/undo2/expected/.git_keep/logs/refs/heads/branch2 b/test/integration/undo2/expected/repo/.git_keep/logs/refs/heads/branch2 similarity index 100% rename from test/integration/undo2/expected/.git_keep/logs/refs/heads/branch2 rename to test/integration/undo2/expected/repo/.git_keep/logs/refs/heads/branch2 diff --git a/test/integration/undo2/expected/.git_keep/logs/refs/heads/master b/test/integration/undo2/expected/repo/.git_keep/logs/refs/heads/master similarity index 100% rename from test/integration/undo2/expected/.git_keep/logs/refs/heads/master rename to test/integration/undo2/expected/repo/.git_keep/logs/refs/heads/master diff --git a/test/integration/undo2/expected/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 b/test/integration/undo2/expected/repo/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 similarity index 100% rename from test/integration/undo2/expected/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 rename to test/integration/undo2/expected/repo/.git_keep/objects/0c/2aa38e0600e0d2df09c2f84664d8a14f899879 diff --git a/test/integration/undo2/expected/.git_keep/objects/0e/2680a41392859e5159716b50525850017c6a59 b/test/integration/undo2/expected/repo/.git_keep/objects/0e/2680a41392859e5159716b50525850017c6a59 similarity index 100% rename from test/integration/undo2/expected/.git_keep/objects/0e/2680a41392859e5159716b50525850017c6a59 rename to test/integration/undo2/expected/repo/.git_keep/objects/0e/2680a41392859e5159716b50525850017c6a59 diff --git a/test/integration/undo2/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/undo2/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 new file mode 100644 index 000000000..f74bf2335 Binary files /dev/null and b/test/integration/undo2/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 differ diff --git a/test/integration/undo2/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/undo2/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 new file mode 100644 index 000000000..79fcadf67 Binary files /dev/null and b/test/integration/undo2/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 differ diff --git a/test/integration/undo2/expected/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 b/test/integration/undo2/expected/repo/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 similarity index 100% rename from test/integration/undo2/expected/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 rename to test/integration/undo2/expected/repo/.git_keep/objects/2d/00bd505971a8bc7318d98e003aee708a367c85 diff --git a/test/integration/undo2/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/undo2/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da new file mode 100644 index 000000000..06c9cb73d Binary files /dev/null and b/test/integration/undo2/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da differ diff --git a/test/integration/undo2/expected/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a b/test/integration/undo2/expected/repo/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a similarity index 100% rename from test/integration/undo2/expected/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a rename to test/integration/undo2/expected/repo/.git_keep/objects/3b/aaa732b89ed46a1af1b24d0d4e3b8c7375684a diff --git a/test/integration/undo2/expected/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b b/test/integration/undo2/expected/repo/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b similarity index 100% rename from test/integration/undo2/expected/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b rename to test/integration/undo2/expected/repo/.git_keep/objects/3d/b2086f780b1cf632eec29111ef395913a8ab2b diff --git a/test/integration/undo2/expected/.git_keep/objects/48/1ce2cf9d037b83acb1d452973695764bf7b95e b/test/integration/undo2/expected/repo/.git_keep/objects/48/1ce2cf9d037b83acb1d452973695764bf7b95e similarity index 100% rename from test/integration/undo2/expected/.git_keep/objects/48/1ce2cf9d037b83acb1d452973695764bf7b95e rename to test/integration/undo2/expected/repo/.git_keep/objects/48/1ce2cf9d037b83acb1d452973695764bf7b95e diff --git a/test/integration/undo2/expected/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 b/test/integration/undo2/expected/repo/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 similarity index 100% rename from test/integration/undo2/expected/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 rename to test/integration/undo2/expected/repo/.git_keep/objects/59/a0ec98e1847ca72dc35b7ab8b84f527b6af280 diff --git a/test/integration/undo2/expected/.git_keep/objects/8d/31a10ce1a1a1606ab02e8a2a59a6c56808f7c5 b/test/integration/undo2/expected/repo/.git_keep/objects/8d/31a10ce1a1a1606ab02e8a2a59a6c56808f7c5 similarity index 100% rename from test/integration/undo2/expected/.git_keep/objects/8d/31a10ce1a1a1606ab02e8a2a59a6c56808f7c5 rename to test/integration/undo2/expected/repo/.git_keep/objects/8d/31a10ce1a1a1606ab02e8a2a59a6c56808f7c5 diff --git a/test/integration/undo2/expected/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 b/test/integration/undo2/expected/repo/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 similarity index 100% rename from test/integration/undo2/expected/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 rename to test/integration/undo2/expected/repo/.git_keep/objects/8e/4cb0cd56d785ba4442a5b20e7ae5de5ae33723 diff --git a/test/integration/undo2/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/undo2/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c new file mode 100644 index 000000000..0e95eb06d Binary files /dev/null and b/test/integration/undo2/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c differ diff --git a/test/integration/undo2/expected/.git_keep/objects/a3/bf51bf610771f997de1d3f313ab7c43e20bef5 b/test/integration/undo2/expected/repo/.git_keep/objects/a3/bf51bf610771f997de1d3f313ab7c43e20bef5 similarity index 100% rename from test/integration/undo2/expected/.git_keep/objects/a3/bf51bf610771f997de1d3f313ab7c43e20bef5 rename to test/integration/undo2/expected/repo/.git_keep/objects/a3/bf51bf610771f997de1d3f313ab7c43e20bef5 diff --git a/test/integration/undo2/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/undo2/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 new file mode 100644 index 000000000..285df3e5f Binary files /dev/null and b/test/integration/undo2/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 differ diff --git a/test/integration/undo2/expected/.git_keep/objects/bc/e6c0c795a3d37c0a2c382a6d9c146b1889f86c b/test/integration/undo2/expected/repo/.git_keep/objects/bc/e6c0c795a3d37c0a2c382a6d9c146b1889f86c similarity index 100% rename from test/integration/undo2/expected/.git_keep/objects/bc/e6c0c795a3d37c0a2c382a6d9c146b1889f86c rename to test/integration/undo2/expected/repo/.git_keep/objects/bc/e6c0c795a3d37c0a2c382a6d9c146b1889f86c diff --git a/test/integration/undo2/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/undo2/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 new file mode 100644 index 000000000..2e9066287 --- /dev/null +++ b/test/integration/undo2/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 @@ -0,0 +1,2 @@ +x+)JMU03c040031QHËĚI5`°±ş˛ŕźÖ¶wÁ‡Ţw.˝ůhďTÓ[H + –îyüW5őĆ—Đ(ž|§ ^-ÝW(x9 \ No newline at end of file diff --git a/test/integration/undo2/expected/.git_keep/objects/df/1876c035ade1ba199afadd399a6d4273190cd8 b/test/integration/undo2/expected/repo/.git_keep/objects/df/1876c035ade1ba199afadd399a6d4273190cd8 similarity index 100% rename from test/integration/undo2/expected/.git_keep/objects/df/1876c035ade1ba199afadd399a6d4273190cd8 rename to test/integration/undo2/expected/repo/.git_keep/objects/df/1876c035ade1ba199afadd399a6d4273190cd8 diff --git a/test/integration/undo2/expected/.git_keep/objects/e5/1d8e24ead991fdd7fd9b9d90924c2e24576981 b/test/integration/undo2/expected/repo/.git_keep/objects/e5/1d8e24ead991fdd7fd9b9d90924c2e24576981 similarity index 100% rename from test/integration/undo2/expected/.git_keep/objects/e5/1d8e24ead991fdd7fd9b9d90924c2e24576981 rename to test/integration/undo2/expected/repo/.git_keep/objects/e5/1d8e24ead991fdd7fd9b9d90924c2e24576981 diff --git a/test/integration/undo2/expected/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 b/test/integration/undo2/expected/repo/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 similarity index 100% rename from test/integration/undo2/expected/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 rename to test/integration/undo2/expected/repo/.git_keep/objects/e5/c5c5583f49a34e86ce622b59363df99e09d4c6 diff --git a/test/integration/undo2/expected/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a b/test/integration/undo2/expected/repo/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a similarity index 100% rename from test/integration/undo2/expected/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a rename to test/integration/undo2/expected/repo/.git_keep/objects/e7/76522ac28860d2eba6fe98fa4fad67e798419a diff --git a/test/integration/undo2/expected/.git_keep/refs/heads/branch2 b/test/integration/undo2/expected/repo/.git_keep/refs/heads/branch2 similarity index 100% rename from test/integration/undo2/expected/.git_keep/refs/heads/branch2 rename to test/integration/undo2/expected/repo/.git_keep/refs/heads/branch2 diff --git a/test/integration/undo2/expected/.git_keep/refs/heads/master b/test/integration/undo2/expected/repo/.git_keep/refs/heads/master similarity index 100% rename from test/integration/undo2/expected/.git_keep/refs/heads/master rename to test/integration/undo2/expected/repo/.git_keep/refs/heads/master diff --git a/test/integration/undo2/expected/repo/file0 b/test/integration/undo2/expected/repo/file0 new file mode 100644 index 000000000..38143ad4a --- /dev/null +++ b/test/integration/undo2/expected/repo/file0 @@ -0,0 +1 @@ +test0 diff --git a/test/integration/undo2/expected/repo/file1 b/test/integration/undo2/expected/repo/file1 new file mode 100644 index 000000000..a5bce3fd2 --- /dev/null +++ b/test/integration/undo2/expected/repo/file1 @@ -0,0 +1 @@ +test1 diff --git a/test/integration/undo2/expected/repo/file2 b/test/integration/undo2/expected/repo/file2 new file mode 100644 index 000000000..180cf8328 --- /dev/null +++ b/test/integration/undo2/expected/repo/file2 @@ -0,0 +1 @@ +test2 diff --git a/test/integration/undo2/expected/file4 b/test/integration/undo2/expected/repo/file4 similarity index 100% rename from test/integration/undo2/expected/file4 rename to test/integration/undo2/expected/repo/file4 diff --git a/test/integration/unsetUpstream/expected/origin/HEAD b/test/integration/unsetUpstream/expected/origin/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/test/integration/unsetUpstream/expected/origin/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/test/integration/unsetUpstream/expected/origin/config b/test/integration/unsetUpstream/expected/origin/config new file mode 100644 index 000000000..56c5e2484 --- /dev/null +++ b/test/integration/unsetUpstream/expected/origin/config @@ -0,0 +1,6 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true +[remote "origin"] + url = /home/mark/Downloads/gits/lazygit/test/integration/unsetUpstream/actual/./repo diff --git a/test/integration/unsetUpstream/expected/origin/description b/test/integration/unsetUpstream/expected/origin/description new file mode 100644 index 000000000..498b267a8 --- /dev/null +++ b/test/integration/unsetUpstream/expected/origin/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/integration/unsetUpstream/expected/origin/info/exclude b/test/integration/unsetUpstream/expected/origin/info/exclude new file mode 100644 index 000000000..a5196d1be --- /dev/null +++ b/test/integration/unsetUpstream/expected/origin/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/test/integration/unsetUpstream/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/unsetUpstream/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 new file mode 100644 index 000000000..7f2ebf4ee Binary files /dev/null and b/test/integration/unsetUpstream/expected/origin/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 differ diff --git a/test/integration/unsetUpstream/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/unsetUpstream/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 new file mode 100644 index 000000000..f74bf2335 Binary files /dev/null and b/test/integration/unsetUpstream/expected/origin/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 differ diff --git a/test/integration/unsetUpstream/expected/origin/objects/24/351b001b63ca15b6b83542ffb765567e17df23 b/test/integration/unsetUpstream/expected/origin/objects/24/351b001b63ca15b6b83542ffb765567e17df23 new file mode 100644 index 000000000..5167b74e4 Binary files /dev/null and b/test/integration/unsetUpstream/expected/origin/objects/24/351b001b63ca15b6b83542ffb765567e17df23 differ diff --git a/test/integration/unsetUpstream/expected/origin/objects/28/9b2354ac3770d96fc3fcfd2a8026fc78a32cc5 b/test/integration/unsetUpstream/expected/origin/objects/28/9b2354ac3770d96fc3fcfd2a8026fc78a32cc5 new file mode 100644 index 000000000..8283ae159 --- /dev/null +++ b/test/integration/unsetUpstream/expected/origin/objects/28/9b2354ac3770d96fc3fcfd2a8026fc78a32cc5 @@ -0,0 +1,3 @@ +xŤÍA +Â0@Q×9Ĺ왉ÓI +"BW=FšL°Đ!R"čííÜ~üÜĚÖÄrę»* J®d ŁĆ¬ĄDň‰jŕ…ŻE¸¦ 1650269774 +0200 commit (initial): myfile1 +289b2354ac3770d96fc3fcfd2a8026fc78a32cc5 7010e33e20178a1a179853948691a9036d48e562 CI 1650269774 +0200 commit: myfile2 +7010e33e20178a1a179853948691a9036d48e562 994a4733eacc0000721e01a177704e2f26216510 CI 1650269774 +0200 commit: myfile3 +994a4733eacc0000721e01a177704e2f26216510 24351b001b63ca15b6b83542ffb765567e17df23 CI 1650269774 +0200 commit: myfile4 +24351b001b63ca15b6b83542ffb765567e17df23 7010e33e20178a1a179853948691a9036d48e562 CI 1650269774 +0200 reset: moving to HEAD~2 diff --git a/test/integration/unsetUpstream/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/unsetUpstream/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..1bc609ea6 --- /dev/null +++ b/test/integration/unsetUpstream/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,5 @@ +0000000000000000000000000000000000000000 289b2354ac3770d96fc3fcfd2a8026fc78a32cc5 CI 1650269774 +0200 commit (initial): myfile1 +289b2354ac3770d96fc3fcfd2a8026fc78a32cc5 7010e33e20178a1a179853948691a9036d48e562 CI 1650269774 +0200 commit: myfile2 +7010e33e20178a1a179853948691a9036d48e562 994a4733eacc0000721e01a177704e2f26216510 CI 1650269774 +0200 commit: myfile3 +994a4733eacc0000721e01a177704e2f26216510 24351b001b63ca15b6b83542ffb765567e17df23 CI 1650269774 +0200 commit: myfile4 +24351b001b63ca15b6b83542ffb765567e17df23 7010e33e20178a1a179853948691a9036d48e562 CI 1650269774 +0200 reset: moving to HEAD~2 diff --git a/test/integration/unsetUpstream/expected/repo/.git_keep/logs/refs/remotes/origin/master b/test/integration/unsetUpstream/expected/repo/.git_keep/logs/refs/remotes/origin/master new file mode 100644 index 000000000..cbf8607af --- /dev/null +++ b/test/integration/unsetUpstream/expected/repo/.git_keep/logs/refs/remotes/origin/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 24351b001b63ca15b6b83542ffb765567e17df23 CI 1650269774 +0200 fetch origin: storing head diff --git a/test/integration/unsetUpstream/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 b/test/integration/unsetUpstream/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 new file mode 100644 index 000000000..7f2ebf4ee Binary files /dev/null and b/test/integration/unsetUpstream/expected/repo/.git_keep/objects/0e/6cf0a6b79e8d44e186d812a1f74b43d64fac52 differ diff --git a/test/integration/unsetUpstream/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/unsetUpstream/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 new file mode 100644 index 000000000..f74bf2335 Binary files /dev/null and b/test/integration/unsetUpstream/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 differ diff --git a/test/integration/unsetUpstream/expected/repo/.git_keep/objects/24/351b001b63ca15b6b83542ffb765567e17df23 b/test/integration/unsetUpstream/expected/repo/.git_keep/objects/24/351b001b63ca15b6b83542ffb765567e17df23 new file mode 100644 index 000000000..5167b74e4 Binary files /dev/null and b/test/integration/unsetUpstream/expected/repo/.git_keep/objects/24/351b001b63ca15b6b83542ffb765567e17df23 differ diff --git a/test/integration/unsetUpstream/expected/repo/.git_keep/objects/28/9b2354ac3770d96fc3fcfd2a8026fc78a32cc5 b/test/integration/unsetUpstream/expected/repo/.git_keep/objects/28/9b2354ac3770d96fc3fcfd2a8026fc78a32cc5 new file mode 100644 index 000000000..8283ae159 --- /dev/null +++ b/test/integration/unsetUpstream/expected/repo/.git_keep/objects/28/9b2354ac3770d96fc3fcfd2a8026fc78a32cc5 @@ -0,0 +1,3 @@ +xŤÍA +Â0@Q×9Ĺ왉ÓI +"BW=FšL°Đ!R"čííÜ~üÜĚÖÄrę»* J®d ŁĆ¬ĄDň‰jŕ…ŻE¸¦ myfile1 +git add . +git commit -am "myfile1" +echo test2 > myfile2 +git add . +git commit -am "myfile2" +echo test3 > myfile3 +git add . +git commit -am "myfile3" +echo test4 > myfile4 +git add . +git commit -am "myfile4" + +cd .. +git clone --bare ./repo origin + +cd repo + +git reset --hard HEAD~2 +git remote add origin ../origin +git fetch origin +git branch --set-upstream-to=origin/master + diff --git a/test/integration/unsetUpstream/test.json b/test/integration/unsetUpstream/test.json new file mode 100644 index 000000000..dffe129cd --- /dev/null +++ b/test/integration/unsetUpstream/test.json @@ -0,0 +1 @@ +{ "description": "allow unsetting the upstream of the current branch", "speed": 10 } diff --git a/test/integration_new/branch/suggestions/expected/repo/.git_keep/COMMIT_EDITMSG b/test/integration_new/branch/suggestions/expected/repo/.git_keep/COMMIT_EDITMSG new file mode 100644 index 000000000..8a744b4fe --- /dev/null +++ b/test/integration_new/branch/suggestions/expected/repo/.git_keep/COMMIT_EDITMSG @@ -0,0 +1 @@ +my commit message diff --git a/test/integration_new/branch/suggestions/expected/repo/.git_keep/FETCH_HEAD b/test/integration_new/branch/suggestions/expected/repo/.git_keep/FETCH_HEAD new file mode 100644 index 000000000..e69de29bb diff --git a/test/integration_new/branch/suggestions/expected/repo/.git_keep/HEAD b/test/integration_new/branch/suggestions/expected/repo/.git_keep/HEAD new file mode 100644 index 000000000..3b627c921 --- /dev/null +++ b/test/integration_new/branch/suggestions/expected/repo/.git_keep/HEAD @@ -0,0 +1 @@ +ref: refs/heads/branch-to-checkout diff --git a/test/integration_new/branch/suggestions/expected/repo/.git_keep/config b/test/integration_new/branch/suggestions/expected/repo/.git_keep/config new file mode 100644 index 000000000..8ae104545 --- /dev/null +++ b/test/integration_new/branch/suggestions/expected/repo/.git_keep/config @@ -0,0 +1,10 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[user] + email = CI@example.com + name = CI diff --git a/test/integration_new/branch/suggestions/expected/repo/.git_keep/description b/test/integration_new/branch/suggestions/expected/repo/.git_keep/description new file mode 100644 index 000000000..498b267a8 --- /dev/null +++ b/test/integration_new/branch/suggestions/expected/repo/.git_keep/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/integration_new/branch/suggestions/expected/repo/.git_keep/index b/test/integration_new/branch/suggestions/expected/repo/.git_keep/index new file mode 100644 index 000000000..65d675154 Binary files /dev/null and b/test/integration_new/branch/suggestions/expected/repo/.git_keep/index differ diff --git a/test/integration_new/branch/suggestions/expected/repo/.git_keep/info/exclude b/test/integration_new/branch/suggestions/expected/repo/.git_keep/info/exclude new file mode 100644 index 000000000..8e9f2071f --- /dev/null +++ b/test/integration_new/branch/suggestions/expected/repo/.git_keep/info/exclude @@ -0,0 +1,7 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ +.DS_Store diff --git a/test/integration_new/branch/suggestions/expected/repo/.git_keep/logs/HEAD b/test/integration_new/branch/suggestions/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..e97c3aa0e --- /dev/null +++ b/test/integration_new/branch/suggestions/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,8 @@ +0000000000000000000000000000000000000000 1682dc1949e1937af44b5270fec5c1ac9256c6a1 CI 1659873850 +1000 commit (initial): my commit message +1682dc1949e1937af44b5270fec5c1ac9256c6a1 1682dc1949e1937af44b5270fec5c1ac9256c6a1 CI 1659873850 +1000 checkout: moving from master to new-branch +1682dc1949e1937af44b5270fec5c1ac9256c6a1 1682dc1949e1937af44b5270fec5c1ac9256c6a1 CI 1659873850 +1000 checkout: moving from new-branch to new-branch-2 +1682dc1949e1937af44b5270fec5c1ac9256c6a1 1682dc1949e1937af44b5270fec5c1ac9256c6a1 CI 1659873850 +1000 checkout: moving from new-branch-2 to new-branch-3 +1682dc1949e1937af44b5270fec5c1ac9256c6a1 1682dc1949e1937af44b5270fec5c1ac9256c6a1 CI 1659873850 +1000 checkout: moving from new-branch-3 to branch-to-checkout +1682dc1949e1937af44b5270fec5c1ac9256c6a1 1682dc1949e1937af44b5270fec5c1ac9256c6a1 CI 1659873850 +1000 checkout: moving from branch-to-checkout to other-new-branch-2 +1682dc1949e1937af44b5270fec5c1ac9256c6a1 1682dc1949e1937af44b5270fec5c1ac9256c6a1 CI 1659873850 +1000 checkout: moving from other-new-branch-2 to other-new-branch-3 +1682dc1949e1937af44b5270fec5c1ac9256c6a1 1682dc1949e1937af44b5270fec5c1ac9256c6a1 CI 1659873850 +1000 checkout: moving from other-new-branch-3 to branch-to-checkout diff --git a/test/integration_new/branch/suggestions/expected/repo/.git_keep/logs/refs/heads/branch-to-checkout b/test/integration_new/branch/suggestions/expected/repo/.git_keep/logs/refs/heads/branch-to-checkout new file mode 100644 index 000000000..6b7fc9713 --- /dev/null +++ b/test/integration_new/branch/suggestions/expected/repo/.git_keep/logs/refs/heads/branch-to-checkout @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 1682dc1949e1937af44b5270fec5c1ac9256c6a1 CI 1659873850 +1000 branch: Created from HEAD diff --git a/test/integration_new/branch/suggestions/expected/repo/.git_keep/logs/refs/heads/master b/test/integration_new/branch/suggestions/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..7475970dc --- /dev/null +++ b/test/integration_new/branch/suggestions/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 1682dc1949e1937af44b5270fec5c1ac9256c6a1 CI 1659873850 +1000 commit (initial): my commit message diff --git a/test/integration_new/branch/suggestions/expected/repo/.git_keep/logs/refs/heads/new-branch b/test/integration_new/branch/suggestions/expected/repo/.git_keep/logs/refs/heads/new-branch new file mode 100644 index 000000000..6b7fc9713 --- /dev/null +++ b/test/integration_new/branch/suggestions/expected/repo/.git_keep/logs/refs/heads/new-branch @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 1682dc1949e1937af44b5270fec5c1ac9256c6a1 CI 1659873850 +1000 branch: Created from HEAD diff --git a/test/integration_new/branch/suggestions/expected/repo/.git_keep/logs/refs/heads/new-branch-2 b/test/integration_new/branch/suggestions/expected/repo/.git_keep/logs/refs/heads/new-branch-2 new file mode 100644 index 000000000..6b7fc9713 --- /dev/null +++ b/test/integration_new/branch/suggestions/expected/repo/.git_keep/logs/refs/heads/new-branch-2 @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 1682dc1949e1937af44b5270fec5c1ac9256c6a1 CI 1659873850 +1000 branch: Created from HEAD diff --git a/test/integration_new/branch/suggestions/expected/repo/.git_keep/logs/refs/heads/new-branch-3 b/test/integration_new/branch/suggestions/expected/repo/.git_keep/logs/refs/heads/new-branch-3 new file mode 100644 index 000000000..6b7fc9713 --- /dev/null +++ b/test/integration_new/branch/suggestions/expected/repo/.git_keep/logs/refs/heads/new-branch-3 @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 1682dc1949e1937af44b5270fec5c1ac9256c6a1 CI 1659873850 +1000 branch: Created from HEAD diff --git a/test/integration_new/branch/suggestions/expected/repo/.git_keep/logs/refs/heads/other-new-branch-2 b/test/integration_new/branch/suggestions/expected/repo/.git_keep/logs/refs/heads/other-new-branch-2 new file mode 100644 index 000000000..6b7fc9713 --- /dev/null +++ b/test/integration_new/branch/suggestions/expected/repo/.git_keep/logs/refs/heads/other-new-branch-2 @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 1682dc1949e1937af44b5270fec5c1ac9256c6a1 CI 1659873850 +1000 branch: Created from HEAD diff --git a/test/integration_new/branch/suggestions/expected/repo/.git_keep/logs/refs/heads/other-new-branch-3 b/test/integration_new/branch/suggestions/expected/repo/.git_keep/logs/refs/heads/other-new-branch-3 new file mode 100644 index 000000000..6b7fc9713 --- /dev/null +++ b/test/integration_new/branch/suggestions/expected/repo/.git_keep/logs/refs/heads/other-new-branch-3 @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 1682dc1949e1937af44b5270fec5c1ac9256c6a1 CI 1659873850 +1000 branch: Created from HEAD diff --git a/test/integration_new/branch/suggestions/expected/repo/.git_keep/objects/16/82dc1949e1937af44b5270fec5c1ac9256c6a1 b/test/integration_new/branch/suggestions/expected/repo/.git_keep/objects/16/82dc1949e1937af44b5270fec5c1ac9256c6a1 new file mode 100644 index 000000000..45c339c12 Binary files /dev/null and b/test/integration_new/branch/suggestions/expected/repo/.git_keep/objects/16/82dc1949e1937af44b5270fec5c1ac9256c6a1 differ diff --git a/test/integration_new/branch/suggestions/expected/repo/.git_keep/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 b/test/integration_new/branch/suggestions/expected/repo/.git_keep/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 new file mode 100644 index 000000000..adf64119a Binary files /dev/null and b/test/integration_new/branch/suggestions/expected/repo/.git_keep/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 differ diff --git a/test/integration_new/branch/suggestions/expected/repo/.git_keep/refs/heads/branch-to-checkout b/test/integration_new/branch/suggestions/expected/repo/.git_keep/refs/heads/branch-to-checkout new file mode 100644 index 000000000..23eeb4fdc --- /dev/null +++ b/test/integration_new/branch/suggestions/expected/repo/.git_keep/refs/heads/branch-to-checkout @@ -0,0 +1 @@ +1682dc1949e1937af44b5270fec5c1ac9256c6a1 diff --git a/test/integration_new/branch/suggestions/expected/repo/.git_keep/refs/heads/master b/test/integration_new/branch/suggestions/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..23eeb4fdc --- /dev/null +++ b/test/integration_new/branch/suggestions/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +1682dc1949e1937af44b5270fec5c1ac9256c6a1 diff --git a/test/integration_new/branch/suggestions/expected/repo/.git_keep/refs/heads/new-branch b/test/integration_new/branch/suggestions/expected/repo/.git_keep/refs/heads/new-branch new file mode 100644 index 000000000..23eeb4fdc --- /dev/null +++ b/test/integration_new/branch/suggestions/expected/repo/.git_keep/refs/heads/new-branch @@ -0,0 +1 @@ +1682dc1949e1937af44b5270fec5c1ac9256c6a1 diff --git a/test/integration_new/branch/suggestions/expected/repo/.git_keep/refs/heads/new-branch-2 b/test/integration_new/branch/suggestions/expected/repo/.git_keep/refs/heads/new-branch-2 new file mode 100644 index 000000000..23eeb4fdc --- /dev/null +++ b/test/integration_new/branch/suggestions/expected/repo/.git_keep/refs/heads/new-branch-2 @@ -0,0 +1 @@ +1682dc1949e1937af44b5270fec5c1ac9256c6a1 diff --git a/test/integration_new/branch/suggestions/expected/repo/.git_keep/refs/heads/new-branch-3 b/test/integration_new/branch/suggestions/expected/repo/.git_keep/refs/heads/new-branch-3 new file mode 100644 index 000000000..23eeb4fdc --- /dev/null +++ b/test/integration_new/branch/suggestions/expected/repo/.git_keep/refs/heads/new-branch-3 @@ -0,0 +1 @@ +1682dc1949e1937af44b5270fec5c1ac9256c6a1 diff --git a/test/integration_new/branch/suggestions/expected/repo/.git_keep/refs/heads/other-new-branch-2 b/test/integration_new/branch/suggestions/expected/repo/.git_keep/refs/heads/other-new-branch-2 new file mode 100644 index 000000000..23eeb4fdc --- /dev/null +++ b/test/integration_new/branch/suggestions/expected/repo/.git_keep/refs/heads/other-new-branch-2 @@ -0,0 +1 @@ +1682dc1949e1937af44b5270fec5c1ac9256c6a1 diff --git a/test/integration_new/branch/suggestions/expected/repo/.git_keep/refs/heads/other-new-branch-3 b/test/integration_new/branch/suggestions/expected/repo/.git_keep/refs/heads/other-new-branch-3 new file mode 100644 index 000000000..23eeb4fdc --- /dev/null +++ b/test/integration_new/branch/suggestions/expected/repo/.git_keep/refs/heads/other-new-branch-3 @@ -0,0 +1 @@ +1682dc1949e1937af44b5270fec5c1ac9256c6a1 diff --git a/test/integration_new/commit/commit/expected/repo/.git_keep/COMMIT_EDITMSG b/test/integration_new/commit/commit/expected/repo/.git_keep/COMMIT_EDITMSG new file mode 100644 index 000000000..8a744b4fe --- /dev/null +++ b/test/integration_new/commit/commit/expected/repo/.git_keep/COMMIT_EDITMSG @@ -0,0 +1 @@ +my commit message diff --git a/test/integration_new/commit/commit/expected/repo/.git_keep/FETCH_HEAD b/test/integration_new/commit/commit/expected/repo/.git_keep/FETCH_HEAD new file mode 100644 index 000000000..e69de29bb diff --git a/test/integration_new/commit/commit/expected/repo/.git_keep/HEAD b/test/integration_new/commit/commit/expected/repo/.git_keep/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/test/integration_new/commit/commit/expected/repo/.git_keep/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/test/integration_new/commit/commit/expected/repo/.git_keep/config b/test/integration_new/commit/commit/expected/repo/.git_keep/config new file mode 100644 index 000000000..8ae104545 --- /dev/null +++ b/test/integration_new/commit/commit/expected/repo/.git_keep/config @@ -0,0 +1,10 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[user] + email = CI@example.com + name = CI diff --git a/test/integration_new/commit/commit/expected/repo/.git_keep/description b/test/integration_new/commit/commit/expected/repo/.git_keep/description new file mode 100644 index 000000000..498b267a8 --- /dev/null +++ b/test/integration_new/commit/commit/expected/repo/.git_keep/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/integration_new/commit/commit/expected/repo/.git_keep/index b/test/integration_new/commit/commit/expected/repo/.git_keep/index new file mode 100644 index 000000000..31a81c209 Binary files /dev/null and b/test/integration_new/commit/commit/expected/repo/.git_keep/index differ diff --git a/test/integration_new/commit/commit/expected/repo/.git_keep/info/exclude b/test/integration_new/commit/commit/expected/repo/.git_keep/info/exclude new file mode 100644 index 000000000..8e9f2071f --- /dev/null +++ b/test/integration_new/commit/commit/expected/repo/.git_keep/info/exclude @@ -0,0 +1,7 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ +.DS_Store diff --git a/test/integration_new/commit/commit/expected/repo/.git_keep/logs/HEAD b/test/integration_new/commit/commit/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..925bffbb2 --- /dev/null +++ b/test/integration_new/commit/commit/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 944b9ea58bef8f6352c3a081a1d0037125bcaabc CI 1660133266 +1000 commit (initial): my commit message diff --git a/test/integration_new/commit/commit/expected/repo/.git_keep/logs/refs/heads/master b/test/integration_new/commit/commit/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..925bffbb2 --- /dev/null +++ b/test/integration_new/commit/commit/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 944b9ea58bef8f6352c3a081a1d0037125bcaabc CI 1660133266 +1000 commit (initial): my commit message diff --git a/test/integration_new/commit/commit/expected/repo/.git_keep/objects/3a/e2df795236e3c84cb1faa242d3268838603515 b/test/integration_new/commit/commit/expected/repo/.git_keep/objects/3a/e2df795236e3c84cb1faa242d3268838603515 new file mode 100644 index 000000000..57198442f Binary files /dev/null and b/test/integration_new/commit/commit/expected/repo/.git_keep/objects/3a/e2df795236e3c84cb1faa242d3268838603515 differ diff --git a/test/integration_new/commit/commit/expected/repo/.git_keep/objects/94/4b9ea58bef8f6352c3a081a1d0037125bcaabc b/test/integration_new/commit/commit/expected/repo/.git_keep/objects/94/4b9ea58bef8f6352c3a081a1d0037125bcaabc new file mode 100644 index 000000000..edba03fb8 Binary files /dev/null and b/test/integration_new/commit/commit/expected/repo/.git_keep/objects/94/4b9ea58bef8f6352c3a081a1d0037125bcaabc differ diff --git a/test/integration_new/commit/commit/expected/repo/.git_keep/objects/97/04090f88911a4083ef7d5907e38b9f45e43b16 b/test/integration_new/commit/commit/expected/repo/.git_keep/objects/97/04090f88911a4083ef7d5907e38b9f45e43b16 new file mode 100644 index 000000000..c4b48a2f0 Binary files /dev/null and b/test/integration_new/commit/commit/expected/repo/.git_keep/objects/97/04090f88911a4083ef7d5907e38b9f45e43b16 differ diff --git a/test/integration_new/commit/commit/expected/repo/.git_keep/objects/ad/a5661567ddf0a64f589cad3cd0cffd7e79af99 b/test/integration_new/commit/commit/expected/repo/.git_keep/objects/ad/a5661567ddf0a64f589cad3cd0cffd7e79af99 new file mode 100644 index 000000000..98345f609 Binary files /dev/null and b/test/integration_new/commit/commit/expected/repo/.git_keep/objects/ad/a5661567ddf0a64f589cad3cd0cffd7e79af99 differ diff --git a/test/integration_new/commit/commit/expected/repo/.git_keep/refs/heads/master b/test/integration_new/commit/commit/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..7b10e3bcb --- /dev/null +++ b/test/integration_new/commit/commit/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +944b9ea58bef8f6352c3a081a1d0037125bcaabc diff --git a/test/integration_new/commit/commit/expected/repo/myfile b/test/integration_new/commit/commit/expected/repo/myfile new file mode 100644 index 000000000..ada566156 --- /dev/null +++ b/test/integration_new/commit/commit/expected/repo/myfile @@ -0,0 +1 @@ +myfile content \ No newline at end of file diff --git a/test/integration_new/commit/commit/expected/repo/myfile2 b/test/integration_new/commit/commit/expected/repo/myfile2 new file mode 100644 index 000000000..9704090f8 --- /dev/null +++ b/test/integration_new/commit/commit/expected/repo/myfile2 @@ -0,0 +1 @@ +myfile2 content \ No newline at end of file diff --git a/test/integration_new/commit/new_branch/expected/repo/.git_keep/COMMIT_EDITMSG b/test/integration_new/commit/new_branch/expected/repo/.git_keep/COMMIT_EDITMSG new file mode 100644 index 000000000..68d1ef3ef --- /dev/null +++ b/test/integration_new/commit/new_branch/expected/repo/.git_keep/COMMIT_EDITMSG @@ -0,0 +1 @@ +commit 3 diff --git a/test/integration_new/commit/new_branch/expected/repo/.git_keep/FETCH_HEAD b/test/integration_new/commit/new_branch/expected/repo/.git_keep/FETCH_HEAD new file mode 100644 index 000000000..e69de29bb diff --git a/test/integration_new/commit/new_branch/expected/repo/.git_keep/HEAD b/test/integration_new/commit/new_branch/expected/repo/.git_keep/HEAD new file mode 100644 index 000000000..634a851e9 --- /dev/null +++ b/test/integration_new/commit/new_branch/expected/repo/.git_keep/HEAD @@ -0,0 +1 @@ +ref: refs/heads/my-branch-name diff --git a/test/integration_new/commit/new_branch/expected/repo/.git_keep/config b/test/integration_new/commit/new_branch/expected/repo/.git_keep/config new file mode 100644 index 000000000..8ae104545 --- /dev/null +++ b/test/integration_new/commit/new_branch/expected/repo/.git_keep/config @@ -0,0 +1,10 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[user] + email = CI@example.com + name = CI diff --git a/test/integration_new/commit/new_branch/expected/repo/.git_keep/description b/test/integration_new/commit/new_branch/expected/repo/.git_keep/description new file mode 100644 index 000000000..498b267a8 --- /dev/null +++ b/test/integration_new/commit/new_branch/expected/repo/.git_keep/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/integration_new/commit/new_branch/expected/repo/.git_keep/index b/test/integration_new/commit/new_branch/expected/repo/.git_keep/index new file mode 100644 index 000000000..65d675154 Binary files /dev/null and b/test/integration_new/commit/new_branch/expected/repo/.git_keep/index differ diff --git a/test/integration_new/commit/new_branch/expected/repo/.git_keep/info/exclude b/test/integration_new/commit/new_branch/expected/repo/.git_keep/info/exclude new file mode 100644 index 000000000..8e9f2071f --- /dev/null +++ b/test/integration_new/commit/new_branch/expected/repo/.git_keep/info/exclude @@ -0,0 +1,7 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ +.DS_Store diff --git a/test/integration_new/commit/new_branch/expected/repo/.git_keep/logs/HEAD b/test/integration_new/commit/new_branch/expected/repo/.git_keep/logs/HEAD new file mode 100644 index 000000000..189a2b0bc --- /dev/null +++ b/test/integration_new/commit/new_branch/expected/repo/.git_keep/logs/HEAD @@ -0,0 +1,4 @@ +0000000000000000000000000000000000000000 4e72cd440eec154569568bff8d4c955052ae246c CI 1660125381 +1000 commit (initial): commit 1 +4e72cd440eec154569568bff8d4c955052ae246c 563414ba32c967cfbe21a17fe892d6118c1c58e8 CI 1660125381 +1000 commit: commit 2 +563414ba32c967cfbe21a17fe892d6118c1c58e8 0af36e404e6fec1c3a4d887e30622238e5ea0b2b CI 1660125381 +1000 commit: commit 3 +0af36e404e6fec1c3a4d887e30622238e5ea0b2b 563414ba32c967cfbe21a17fe892d6118c1c58e8 CI 1660125382 +1000 checkout: moving from master to my-branch-name diff --git a/test/integration_new/commit/new_branch/expected/repo/.git_keep/logs/refs/heads/master b/test/integration_new/commit/new_branch/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..0e17a4008 --- /dev/null +++ b/test/integration_new/commit/new_branch/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 4e72cd440eec154569568bff8d4c955052ae246c CI 1660125381 +1000 commit (initial): commit 1 +4e72cd440eec154569568bff8d4c955052ae246c 563414ba32c967cfbe21a17fe892d6118c1c58e8 CI 1660125381 +1000 commit: commit 2 +563414ba32c967cfbe21a17fe892d6118c1c58e8 0af36e404e6fec1c3a4d887e30622238e5ea0b2b CI 1660125381 +1000 commit: commit 3 diff --git a/test/integration_new/commit/new_branch/expected/repo/.git_keep/logs/refs/heads/my-branch-name b/test/integration_new/commit/new_branch/expected/repo/.git_keep/logs/refs/heads/my-branch-name new file mode 100644 index 000000000..6f401d926 --- /dev/null +++ b/test/integration_new/commit/new_branch/expected/repo/.git_keep/logs/refs/heads/my-branch-name @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 563414ba32c967cfbe21a17fe892d6118c1c58e8 CI 1660125382 +1000 branch: Created from 563414ba32c967cfbe21a17fe892d6118c1c58e8 diff --git a/test/integration_new/commit/new_branch/expected/repo/.git_keep/objects/0a/f36e404e6fec1c3a4d887e30622238e5ea0b2b b/test/integration_new/commit/new_branch/expected/repo/.git_keep/objects/0a/f36e404e6fec1c3a4d887e30622238e5ea0b2b new file mode 100644 index 000000000..eb9800f0a Binary files /dev/null and b/test/integration_new/commit/new_branch/expected/repo/.git_keep/objects/0a/f36e404e6fec1c3a4d887e30622238e5ea0b2b differ diff --git a/test/integration_new/commit/new_branch/expected/repo/.git_keep/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 b/test/integration_new/commit/new_branch/expected/repo/.git_keep/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 new file mode 100644 index 000000000..adf64119a Binary files /dev/null and b/test/integration_new/commit/new_branch/expected/repo/.git_keep/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 differ diff --git a/test/integration_new/commit/new_branch/expected/repo/.git_keep/objects/4e/72cd440eec154569568bff8d4c955052ae246c b/test/integration_new/commit/new_branch/expected/repo/.git_keep/objects/4e/72cd440eec154569568bff8d4c955052ae246c new file mode 100644 index 000000000..40f7e1d72 Binary files /dev/null and b/test/integration_new/commit/new_branch/expected/repo/.git_keep/objects/4e/72cd440eec154569568bff8d4c955052ae246c differ diff --git a/test/integration_new/commit/new_branch/expected/repo/.git_keep/objects/56/3414ba32c967cfbe21a17fe892d6118c1c58e8 b/test/integration_new/commit/new_branch/expected/repo/.git_keep/objects/56/3414ba32c967cfbe21a17fe892d6118c1c58e8 new file mode 100644 index 000000000..1a610226f --- /dev/null +++ b/test/integration_new/commit/new_branch/expected/repo/.git_keep/objects/56/3414ba32c967cfbe21a17fe892d6118c1c58e8 @@ -0,0 +1,2 @@ +xŤÎA +1 @Q×=Eö‚¤1‰-®ćm&‚u†ˇ‚ÇwŔíç-ľÍ­=:Ä,»ľş×D2š2YUŻą ˘ ×)Ťš)Ą©şsFKYýŐýD62Ł»EaŃ,šę´q¶,‚BʼnŐBy÷űĽÂm€óm¸ú§´ĺé›Ű˘*F’cаŹ¶şMu˙“˙ 1660123588 +1000 commit (initial): commit 01 +cc9defb8ae9134f1a9a6c28a0006dc8c8cd78347 2e2cd25ffdec58d32b5d549f8402bd054e22cc2a CI 1660123588 +1000 commit: commit 02 +2e2cd25ffdec58d32b5d549f8402bd054e22cc2a 90fda12ce101e7d0d4594a879e5bbd1be3c857a8 CI 1660123588 +1000 commit: commit 03 +90fda12ce101e7d0d4594a879e5bbd1be3c857a8 da71be1afbb03f46e91ab5de17d69f148bb009f3 CI 1660123588 +1000 commit: commit 04 +da71be1afbb03f46e91ab5de17d69f148bb009f3 8a3839811a7a9f4c678090c9def892d1e7ad7e54 CI 1660123589 +1000 commit: commit 05 +8a3839811a7a9f4c678090c9def892d1e7ad7e54 cc9defb8ae9134f1a9a6c28a0006dc8c8cd78347 CI 1660123589 +1000 rebase (start): checkout cc9defb8ae9134f1a9a6c28a0006dc8c8cd78347 +cc9defb8ae9134f1a9a6c28a0006dc8c8cd78347 2e2cd25ffdec58d32b5d549f8402bd054e22cc2a CI 1660123589 +1000 rebase: fast-forward +2e2cd25ffdec58d32b5d549f8402bd054e22cc2a b85535ebf12659044c33386376121d76756ceb59 CI 1660123590 +1000 rebase (continue) (fixup): # This is a combination of 2 commits. +b85535ebf12659044c33386376121d76756ceb59 aba3469fd6fc584a6af9c0073873005ffaaea56c CI 1660123590 +1000 rebase (continue) (squash): commit 02 +aba3469fd6fc584a6af9c0073873005ffaaea56c aba3469fd6fc584a6af9c0073873005ffaaea56c CI 1660123590 +1000 rebase (continue) (finish): returning to refs/heads/master diff --git a/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/logs/refs/heads/master b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..c6c18ee5a --- /dev/null +++ b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1,6 @@ +0000000000000000000000000000000000000000 cc9defb8ae9134f1a9a6c28a0006dc8c8cd78347 CI 1660123588 +1000 commit (initial): commit 01 +cc9defb8ae9134f1a9a6c28a0006dc8c8cd78347 2e2cd25ffdec58d32b5d549f8402bd054e22cc2a CI 1660123588 +1000 commit: commit 02 +2e2cd25ffdec58d32b5d549f8402bd054e22cc2a 90fda12ce101e7d0d4594a879e5bbd1be3c857a8 CI 1660123588 +1000 commit: commit 03 +90fda12ce101e7d0d4594a879e5bbd1be3c857a8 da71be1afbb03f46e91ab5de17d69f148bb009f3 CI 1660123588 +1000 commit: commit 04 +da71be1afbb03f46e91ab5de17d69f148bb009f3 8a3839811a7a9f4c678090c9def892d1e7ad7e54 CI 1660123589 +1000 commit: commit 05 +8a3839811a7a9f4c678090c9def892d1e7ad7e54 aba3469fd6fc584a6af9c0073873005ffaaea56c CI 1660123590 +1000 rebase (continue) (finish): refs/heads/master onto cc9defb8ae9134f1a9a6c28a0006dc8c8cd78347 diff --git a/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/06/47fe4b7302efbfb235b8f0681b592cc3389d36 b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/06/47fe4b7302efbfb235b8f0681b592cc3389d36 new file mode 100644 index 000000000..a8a2b586d Binary files /dev/null and b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/06/47fe4b7302efbfb235b8f0681b592cc3389d36 differ diff --git a/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/2e/2cd25ffdec58d32b5d549f8402bd054e22cc2a b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/2e/2cd25ffdec58d32b5d549f8402bd054e22cc2a new file mode 100644 index 000000000..20504e122 --- /dev/null +++ b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/2e/2cd25ffdec58d32b5d549f8402bd054e22cc2a @@ -0,0 +1,3 @@ +xŤÎA +Â0P×9ĹěÉ$1™€ĐUŹ1™LQ0¶”ß,<€üÝç}ř˛¶öč€9ú® +lť„âc‰T—d ńě9Yą—T\Đ‹Ůx×W‘\u)Ěчˇ2GqÄÖÚX…Fj"’áwżŻ;L3\¦ů¦nŰSO˛¶+`Śť?ÁÇĐŚvśęú'˙y°Î|̱;u \ No newline at end of file diff --git a/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/35/da65f29bc0b48aa80bd3a02cff623cf4355fd3 b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/35/da65f29bc0b48aa80bd3a02cff623cf4355fd3 new file mode 100644 index 000000000..350af2800 Binary files /dev/null and b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/35/da65f29bc0b48aa80bd3a02cff623cf4355fd3 differ diff --git a/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/3b/f868a389d0073e715e848f0ee33d71064539ca b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/3b/f868a389d0073e715e848f0ee33d71064539ca new file mode 100644 index 000000000..07b07e91f Binary files /dev/null and b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/3b/f868a389d0073e715e848f0ee33d71064539ca differ diff --git a/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/47/d78ad7a27fc7fe483389512ebf7ea34c5514bc b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/47/d78ad7a27fc7fe483389512ebf7ea34c5514bc new file mode 100644 index 000000000..c562d38cc Binary files /dev/null and b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/47/d78ad7a27fc7fe483389512ebf7ea34c5514bc differ diff --git a/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/55/3197193920043fb04f3e39e825916990955204 b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/55/3197193920043fb04f3e39e825916990955204 new file mode 100644 index 000000000..ac90c394a Binary files /dev/null and b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/55/3197193920043fb04f3e39e825916990955204 differ diff --git a/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/8a/3839811a7a9f4c678090c9def892d1e7ad7e54 b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/8a/3839811a7a9f4c678090c9def892d1e7ad7e54 new file mode 100644 index 000000000..f518dcc89 Binary files /dev/null and b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/8a/3839811a7a9f4c678090c9def892d1e7ad7e54 differ diff --git a/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/90/fda12ce101e7d0d4594a879e5bbd1be3c857a8 b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/90/fda12ce101e7d0d4594a879e5bbd1be3c857a8 new file mode 100644 index 000000000..71b49be64 Binary files /dev/null and b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/90/fda12ce101e7d0d4594a879e5bbd1be3c857a8 differ diff --git a/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/a0/2c4b36b68df7081152282cf1aabcab7b24e69b b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/a0/2c4b36b68df7081152282cf1aabcab7b24e69b new file mode 100644 index 000000000..85866acd8 Binary files /dev/null and b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/a0/2c4b36b68df7081152282cf1aabcab7b24e69b differ diff --git a/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/ab/a3469fd6fc584a6af9c0073873005ffaaea56c b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/ab/a3469fd6fc584a6af9c0073873005ffaaea56c new file mode 100644 index 000000000..6f0bc9bd3 --- /dev/null +++ b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/ab/a3469fd6fc584a6af9c0073873005ffaaea56c @@ -0,0 +1,3 @@ +x}ŽÍ +Â0„=ç)ö.Čćwzęc¬Ű- +Ć–ÁÇ7‡âQfĂđ Ś,µ>8¤CŰTA‹ĎČ^(: 7RŠa–€N4:ŹŽJänłň¦Ż"eŇů–Y‹őa¶\8‰ËŚi’Ü5Qö żŰ}Ů`á<ŚWýp]źz’Ą^Ŕ¦„Öů3mšŢöSM˙ăw|çťůĹhľý-=ä \ No newline at end of file diff --git a/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/b8/5535ebf12659044c33386376121d76756ceb59 b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/b8/5535ebf12659044c33386376121d76756ceb59 new file mode 100644 index 000000000..085f6e554 Binary files /dev/null and b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/b8/5535ebf12659044c33386376121d76756ceb59 differ diff --git a/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/c2/55cf4ef7fd5661a9d68b717243a978e42b05ac b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/c2/55cf4ef7fd5661a9d68b717243a978e42b05ac new file mode 100644 index 000000000..6ac1f71b1 Binary files /dev/null and b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/c2/55cf4ef7fd5661a9d68b717243a978e42b05ac differ diff --git a/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/cc/9defb8ae9134f1a9a6c28a0006dc8c8cd78347 b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/cc/9defb8ae9134f1a9a6c28a0006dc8c8cd78347 new file mode 100644 index 000000000..3fa86426f Binary files /dev/null and b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/cc/9defb8ae9134f1a9a6c28a0006dc8c8cd78347 differ diff --git a/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/da/71be1afbb03f46e91ab5de17d69f148bb009f3 b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/da/71be1afbb03f46e91ab5de17d69f148bb009f3 new file mode 100644 index 000000000..ad0dddaa0 --- /dev/null +++ b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/da/71be1afbb03f46e91ab5de17d69f148bb009f3 @@ -0,0 +1,4 @@ +xŤÎA +1 @Q×=Eö‚$mÓiAD•ÇHŰë CŹď,<€ŰĎ[ü˛ôţ@)Ʀ +Ž«n6ĺ‚ŮG‘ą:A[Z Ö•ćs«Î¬˛ék@ÂV…lQBŇ©bőśĽÄ))ç\)«+‘'‰FŢăľl0ßŕ<ß®ú‘ľ>őT–~ +É:ŽŽ„fŻűÔĐ?ůĎzóĎŁ;v \ No newline at end of file diff --git a/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/e2/1978e5aaff3752bdeeb635c1667ec59c5bbde1 b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/e2/1978e5aaff3752bdeeb635c1667ec59c5bbde1 new file mode 100644 index 000000000..37f59fe0f Binary files /dev/null and b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/e2/1978e5aaff3752bdeeb635c1667ec59c5bbde1 differ diff --git a/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/e6/db1f58c2bb5ead41049a8ef3910360eead21e2 b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/e6/db1f58c2bb5ead41049a8ef3910360eead21e2 new file mode 100644 index 000000000..8bcfafeb6 Binary files /dev/null and b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/e6/db1f58c2bb5ead41049a8ef3910360eead21e2 differ diff --git a/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/e9/380a3c752e4b7c7e754fc402ce52302795a95a b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/e9/380a3c752e4b7c7e754fc402ce52302795a95a new file mode 100644 index 000000000..a75ffaf35 Binary files /dev/null and b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/e9/380a3c752e4b7c7e754fc402ce52302795a95a differ diff --git a/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/f2/c01a881661486f147e47f5be82914c5d0c0030 b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/f2/c01a881661486f147e47f5be82914c5d0c0030 new file mode 100644 index 000000000..7e30b2e35 Binary files /dev/null and b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/objects/f2/c01a881661486f147e47f5be82914c5d0c0030 differ diff --git a/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/refs/heads/master b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/refs/heads/master new file mode 100644 index 000000000..93319ec4d --- /dev/null +++ b/test/integration_new/interactive_rebase/one/expected/repo/.git_keep/refs/heads/master @@ -0,0 +1 @@ +aba3469fd6fc584a6af9c0073873005ffaaea56c diff --git a/test/integration_new/interactive_rebase/one/expected/repo/file01.txt b/test/integration_new/interactive_rebase/one/expected/repo/file01.txt new file mode 100644 index 000000000..47d78ad7a --- /dev/null +++ b/test/integration_new/interactive_rebase/one/expected/repo/file01.txt @@ -0,0 +1 @@ +file01 content \ No newline at end of file diff --git a/test/integration_new/interactive_rebase/one/expected/repo/file02.txt b/test/integration_new/interactive_rebase/one/expected/repo/file02.txt new file mode 100644 index 000000000..0647fe4b7 --- /dev/null +++ b/test/integration_new/interactive_rebase/one/expected/repo/file02.txt @@ -0,0 +1 @@ +file02 content \ No newline at end of file diff --git a/test/integration_new/interactive_rebase/one/expected/repo/file03.txt b/test/integration_new/interactive_rebase/one/expected/repo/file03.txt new file mode 100644 index 000000000..3bf868a38 --- /dev/null +++ b/test/integration_new/interactive_rebase/one/expected/repo/file03.txt @@ -0,0 +1 @@ +file03 content \ No newline at end of file diff --git a/test/integration_new/interactive_rebase/one/expected/repo/file05.txt b/test/integration_new/interactive_rebase/one/expected/repo/file05.txt new file mode 100644 index 000000000..c255cf4ef --- /dev/null +++ b/test/integration_new/interactive_rebase/one/expected/repo/file05.txt @@ -0,0 +1 @@ +file05 content \ No newline at end of file diff --git a/test/lazyintegration/main.go b/test/lazyintegration/main.go deleted file mode 100644 index 2d8e4a4a9..000000000 --- a/test/lazyintegration/main.go +++ /dev/null @@ -1,419 +0,0 @@ -package main - -import ( - "fmt" - "log" - "os" - "os/exec" - "path/filepath" - - "github.com/jesseduffield/gocui" - "github.com/jesseduffield/lazygit/pkg/gui" - "github.com/jesseduffield/lazygit/pkg/gui/style" - "github.com/jesseduffield/lazygit/pkg/integration" - "github.com/jesseduffield/lazygit/pkg/secureexec" -) - -// this program lets you manage integration tests in a TUI. - -type App struct { - tests []*integration.Test - itemIdx int - testDir string - editing bool - g *gocui.Gui -} - -func (app *App) getCurrentTest() *integration.Test { - if len(app.tests) > 0 { - return app.tests[app.itemIdx] - } - return nil -} - -func (app *App) refreshTests() { - app.loadTests() - app.g.Update(func(*gocui.Gui) error { - listView, err := app.g.View("list") - if err != nil { - return err - } - - listView.Clear() - for _, test := range app.tests { - fmt.Fprintln(listView, test.Name) - } - - return nil - }) -} - -func (app *App) loadTests() { - tests, err := integration.LoadTests(app.testDir) - if err != nil { - log.Panicln(err) - } - - app.tests = tests - if app.itemIdx > len(app.tests)-1 { - app.itemIdx = len(app.tests) - 1 - } -} - -func main() { - rootDir := integration.GetRootDirectory() - testDir := filepath.Join(rootDir, "test", "integration") - - app := &App{testDir: testDir} - app.loadTests() - - g, err := gocui.NewGui(gocui.OutputTrue, false, gocui.NORMAL, false, gui.RuneReplacements) - if err != nil { - log.Panicln(err) - } - - g.Cursor = false - - app.g = g - - g.SetManagerFunc(app.layout) - - if err := g.SetKeybinding("list", nil, gocui.KeyArrowUp, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { - if app.itemIdx > 0 { - app.itemIdx-- - } - listView, err := g.View("list") - if err != nil { - return err - } - listView.FocusPoint(0, app.itemIdx) - return nil - }); err != nil { - log.Panicln(err) - } - - if err := g.SetKeybinding("list", nil, gocui.KeyCtrlC, gocui.ModNone, quit); err != nil { - log.Panicln(err) - } - - if err := g.SetKeybinding("list", nil, 'q', gocui.ModNone, quit); err != nil { - log.Panicln(err) - } - - if err := g.SetKeybinding("list", nil, 'r', gocui.ModNone, func(*gocui.Gui, *gocui.View) error { - currentTest := app.getCurrentTest() - if currentTest == nil { - return nil - } - - cmd := secureexec.Command("sh", "-c", fmt.Sprintf("INCLUDE_SKIPPED=true MODE=record go run test/runner/main.go %s", currentTest.Name)) - app.runSubprocess(cmd) - - return nil - }); err != nil { - log.Panicln(err) - } - - if err := g.SetKeybinding("list", nil, 's', gocui.ModNone, func(*gocui.Gui, *gocui.View) error { - currentTest := app.getCurrentTest() - if currentTest == nil { - return nil - } - - cmd := secureexec.Command("sh", "-c", fmt.Sprintf("INCLUDE_SKIPPED=true MODE=sandbox go run test/runner/main.go %s", currentTest.Name)) - app.runSubprocess(cmd) - - return nil - }); err != nil { - log.Panicln(err) - } - - if err := g.SetKeybinding("list", nil, gocui.KeyEnter, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { - currentTest := app.getCurrentTest() - if currentTest == nil { - return nil - } - - cmd := secureexec.Command("sh", "-c", fmt.Sprintf("INCLUDE_SKIPPED=true go run test/runner/main.go %s", currentTest.Name)) - app.runSubprocess(cmd) - - return nil - }); err != nil { - log.Panicln(err) - } - - if err := g.SetKeybinding("list", nil, 'u', gocui.ModNone, func(*gocui.Gui, *gocui.View) error { - currentTest := app.getCurrentTest() - if currentTest == nil { - return nil - } - - cmd := secureexec.Command("sh", "-c", fmt.Sprintf("INCLUDE_SKIPPED=true MODE=updateSnapshot go run test/runner/main.go %s", currentTest.Name)) - app.runSubprocess(cmd) - - return nil - }); err != nil { - log.Panicln(err) - } - - if err := g.SetKeybinding("list", nil, 't', gocui.ModNone, func(*gocui.Gui, *gocui.View) error { - currentTest := app.getCurrentTest() - if currentTest == nil { - return nil - } - - cmd := secureexec.Command("sh", "-c", fmt.Sprintf("INCLUDE_SKIPPED=true SPEED=1 go run test/runner/main.go %s", currentTest.Name)) - app.runSubprocess(cmd) - - return nil - }); err != nil { - log.Panicln(err) - } - - if err := g.SetKeybinding("list", nil, 'o', gocui.ModNone, func(*gocui.Gui, *gocui.View) error { - currentTest := app.getCurrentTest() - if currentTest == nil { - return nil - } - - cmd := secureexec.Command("sh", "-c", fmt.Sprintf("code -r %s/%s/test.json", app.testDir, currentTest.Name)) - if err := cmd.Run(); err != nil { - return err - } - - return nil - }); err != nil { - log.Panicln(err) - } - - if err := g.SetKeybinding("list", nil, 'n', gocui.ModNone, func(*gocui.Gui, *gocui.View) error { - currentTest := app.getCurrentTest() - if currentTest == nil { - return nil - } - - // need to duplicate that folder and then re-fetch our tests. - dir := app.testDir + "/" + app.getCurrentTest().Name - newDir := dir + "_Copy" - - cmd := secureexec.Command("sh", "-c", fmt.Sprintf("cp -r %s %s", dir, newDir)) - if err := cmd.Run(); err != nil { - return err - } - - app.loadTests() - - app.refreshTests() - return nil - }); err != nil { - log.Panicln(err) - } - - if err := g.SetKeybinding("list", nil, 'm', gocui.ModNone, func(*gocui.Gui, *gocui.View) error { - currentTest := app.getCurrentTest() - if currentTest == nil { - return nil - } - - app.editing = true - if _, err := g.SetCurrentView("editor"); err != nil { - return err - } - editorView, err := g.View("editor") - if err != nil { - return err - } - editorView.Clear() - fmt.Fprint(editorView, currentTest.Name) - - return nil - }); err != nil { - log.Panicln(err) - } - - if err := g.SetKeybinding("list", nil, 'd', gocui.ModNone, func(*gocui.Gui, *gocui.View) error { - currentTest := app.getCurrentTest() - if currentTest == nil { - return nil - } - - dir := app.testDir + "/" + app.getCurrentTest().Name - - cmd := secureexec.Command("sh", "-c", fmt.Sprintf("rm -rf %s", dir)) - if err := cmd.Run(); err != nil { - return err - } - - app.refreshTests() - - return nil - }); err != nil { - log.Panicln(err) - } - - if err := g.SetKeybinding("editor", nil, gocui.KeyEnter, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { - currentTest := app.getCurrentTest() - if currentTest == nil { - return nil - } - - app.editing = false - if _, err := g.SetCurrentView("list"); err != nil { - return err - } - - editorView, err := g.View("editor") - if err != nil { - return err - } - - dir := app.testDir + "/" + app.getCurrentTest().Name - newDir := app.testDir + "/" + editorView.Buffer() - - cmd := secureexec.Command("sh", "-c", fmt.Sprintf("mv %s %s", dir, newDir)) - if err := cmd.Run(); err != nil { - return err - } - - editorView.Clear() - - app.refreshTests() - return nil - }); err != nil { - log.Panicln(err) - } - - if err := g.SetKeybinding("editor", nil, gocui.KeyEsc, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { - app.editing = false - if _, err := g.SetCurrentView("list"); err != nil { - return err - } - - return nil - }); err != nil { - log.Panicln(err) - } - - err = g.MainLoop() - g.Close() - switch err { - case gocui.ErrQuit: - return - default: - log.Panicln(err) - } -} - -func (app *App) runSubprocess(cmd *exec.Cmd) { - if err := gocui.Screen.Suspend(); err != nil { - panic(err) - } - - cmd.Stdin = os.Stdin - cmd.Stderr = os.Stderr - cmd.Stdout = os.Stdout - if err := cmd.Run(); err != nil { - log.Println(err.Error()) - } - cmd.Stdin = nil - cmd.Stderr = nil - cmd.Stdout = nil - - fmt.Fprintf(os.Stdout, "\n%s", style.FgGreen.Sprint("press enter to return")) - fmt.Scanln() // wait for enter press - - if err := gocui.Screen.Resume(); err != nil { - panic(err) - } -} - -func (app *App) layout(g *gocui.Gui) error { - maxX, maxY := g.Size() - descriptionViewHeight := 7 - keybindingsViewHeight := 3 - editorViewHeight := 3 - if !app.editing { - editorViewHeight = 0 - } else { - descriptionViewHeight = 0 - keybindingsViewHeight = 0 - } - g.Cursor = app.editing - g.FgColor = gocui.ColorGreen - listView, err := g.SetView("list", 0, 0, maxX-1, maxY-descriptionViewHeight-keybindingsViewHeight-editorViewHeight-1, 0) - if err != nil { - if err.Error() != "unknown view" { - return err - } - listView.Highlight = true - listView.Clear() - for _, test := range app.tests { - fmt.Fprintln(listView, test.Name) - } - listView.Title = "Tests" - listView.FgColor = gocui.ColorDefault - if _, err := g.SetCurrentView("list"); err != nil { - return err - } - } - - descriptionView, err := g.SetViewBeneath("description", "list", descriptionViewHeight) - if err != nil { - if err.Error() != "unknown view" { - return err - } - descriptionView.Title = "Test description" - descriptionView.Wrap = true - descriptionView.FgColor = gocui.ColorDefault - } - - keybindingsView, err := g.SetViewBeneath("keybindings", "description", keybindingsViewHeight) - if err != nil { - if err.Error() != "unknown view" { - return err - } - keybindingsView.Title = "Keybindings" - keybindingsView.Wrap = true - keybindingsView.FgColor = gocui.ColorDefault - fmt.Fprintln(keybindingsView, "up/down: navigate, enter: run test, u: run test and update snapshots, r: record test, s: sandbox, o: open test config, n: duplicate test, m: rename test, d: delete test, t: run test at original speed") - } - - editorView, err := g.SetViewBeneath("editor", "keybindings", editorViewHeight) - if err != nil { - if err.Error() != "unknown view" { - return err - } - editorView.Title = "Enter Name" - editorView.FgColor = gocui.ColorDefault - editorView.Editable = true - } - - currentTest := app.getCurrentTest() - if currentTest == nil { - return nil - } - - descriptionView.Clear() - fmt.Fprintf(descriptionView, "Speed: %f. %s", currentTest.Speed, currentTest.Description) - - if err := g.SetKeybinding("list", nil, gocui.KeyArrowDown, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { - if app.itemIdx < len(app.tests)-1 { - app.itemIdx++ - } - - listView, err := g.View("list") - if err != nil { - return err - } - listView.FocusPoint(0, app.itemIdx) - return nil - }); err != nil { - log.Panicln(err) - } - - return nil -} - -func quit(g *gocui.Gui, v *gocui.View) error { - return gocui.ErrQuit -} diff --git a/test/repos/unicode_characters.sh b/test/repos/unicode_characters.sh index 3ae129751..3d1707d56 100755 --- a/test/repos/unicode_characters.sh +++ b/test/repos/unicode_characters.sh @@ -6,7 +6,7 @@ git config user.email "test@example.com" git config user.name "Lazygit Tester" -# Add some ansi, unicode, zero width joiner caracters +# Add some ansi, unicode, zero width joiner characters cat <> charstest.txt ANSI Ĺ’ (U+0152 Œ Latin capital ligature OE Latin Extended-A) ÂĄ (0xA5 U+00A5 ¥ yes sign) diff --git a/test/runner/main.go b/test/runner/main.go deleted file mode 100644 index af6195cbc..000000000 --- a/test/runner/main.go +++ /dev/null @@ -1,63 +0,0 @@ -package main - -import ( - "fmt" - "log" - "os" - "os/exec" - "testing" - - "github.com/jesseduffield/lazygit/pkg/integration" - "github.com/stretchr/testify/assert" -) - -// see https://github.com/jesseduffield/lazygit/blob/master/docs/Integration_Tests.md -// This file can be invoked directly, but you might find it easier to go through -// test/lazyintegration/main.go, which provides a convenient gui wrapper to integration tests. -// -// If invoked directly, you can specify a test by passing it as the first argument. -// You can also specify that you want to record a test by passing MODE=record -// as an env var. - -func main() { - mode := integration.GetModeFromEnv() - speedEnv := os.Getenv("SPEED") - includeSkipped := os.Getenv("INCLUDE_SKIPPED") == "true" - selectedTestName := os.Args[1] - - err := integration.RunTests( - log.Printf, - runCmdInTerminal, - func(test *integration.Test, f func(*testing.T) error) { - if selectedTestName != "" && test.Name != selectedTestName { - return - } - if err := f(nil); err != nil { - log.Print(err.Error()) - } - }, - mode, - speedEnv, - func(_t *testing.T, expected string, actual string, prefix string) { - assert.Equal(MockTestingT{}, expected, actual, fmt.Sprintf("Unexpected %s. Expected:\n%s\nActual:\n%s\n", prefix, expected, actual)) - }, - includeSkipped, - ) - if err != nil { - log.Print(err.Error()) - } -} - -type MockTestingT struct{} - -func (t MockTestingT) Errorf(format string, args ...interface{}) { - fmt.Printf(format, args...) -} - -func runCmdInTerminal(cmd *exec.Cmd) error { - cmd.Stdout = os.Stdout - cmd.Stdin = os.Stdin - cmd.Stderr = os.Stderr - - return cmd.Run() -} diff --git a/vendor/github.com/OpenPeeDeeP/xdg/go.mod b/vendor/github.com/OpenPeeDeeP/xdg/go.mod deleted file mode 100644 index 94df76372..000000000 --- a/vendor/github.com/OpenPeeDeeP/xdg/go.mod +++ /dev/null @@ -1,8 +0,0 @@ -module github.com/OpenPeeDeeP/xdg - -require ( - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/stretchr/objx v0.1.1 // indirect - github.com/stretchr/testify v1.2.2 -) diff --git a/vendor/github.com/OpenPeeDeeP/xdg/go.sum b/vendor/github.com/OpenPeeDeeP/xdg/go.sum deleted file mode 100644 index 604d09fa8..000000000 --- a/vendor/github.com/OpenPeeDeeP/xdg/go.sum +++ /dev/null @@ -1,8 +0,0 @@ -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= diff --git a/vendor/github.com/atotto/clipboard/go.mod b/vendor/github.com/atotto/clipboard/go.mod deleted file mode 100644 index 68ec980e7..000000000 --- a/vendor/github.com/atotto/clipboard/go.mod +++ /dev/null @@ -1 +0,0 @@ -module github.com/atotto/clipboard diff --git a/vendor/github.com/aybabtme/humanlog/go.mod b/vendor/github.com/aybabtme/humanlog/go.mod deleted file mode 100644 index 594f15ab1..000000000 --- a/vendor/github.com/aybabtme/humanlog/go.mod +++ /dev/null @@ -1,14 +0,0 @@ -module github.com/aybabtme/humanlog - -go 1.13 - -require ( - github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59 - github.com/fatih/color v1.7.1-0.20180516100307-2d684516a886 - github.com/go-logfmt/logfmt v0.4.0 - github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 - github.com/mattn/go-colorable v0.1.0 - github.com/mattn/go-isatty v0.0.4 // indirect - github.com/urfave/cli v1.20.1-0.20180226030253-8e01ec4cd3e2 - golang.org/x/sys v0.0.0-20170407050850-f3918c30c5c2 // indirect -) diff --git a/vendor/github.com/aybabtme/humanlog/go.sum b/vendor/github.com/aybabtme/humanlog/go.sum deleted file mode 100644 index 8359a61f6..000000000 --- a/vendor/github.com/aybabtme/humanlog/go.sum +++ /dev/null @@ -1,16 +0,0 @@ -github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59 h1:WWB576BN5zNSZc/M9d/10pqEx5VHNhaQ/yOVAkmj5Yo= -github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I= -github.com/fatih/color v1.7.1-0.20180516100307-2d684516a886 h1:NAFoy+QgUpERgK3y1xiVh5HcOvSeZHpXTTo5qnvnuK4= -github.com/fatih/color v1.7.1-0.20180516100307-2d684516a886/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/go-logfmt/logfmt v0.4.0 h1:MP4Eh7ZCb31lleYCFuwm0oe4/YGak+5l1vA2NOE80nA= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/mattn/go-colorable v0.1.0 h1:v2XXALHHh6zHfYTJ+cSkwtyffnaOyR1MXaA91mTrb8o= -github.com/mattn/go-colorable v0.1.0/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-isatty v0.0.4 h1:bnP0vzxcAdeI1zdubAl5PjU6zsERjGZb7raWodagDYs= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/urfave/cli v1.20.1-0.20180226030253-8e01ec4cd3e2 h1:xAkHCttGHKXIr10OSiFzNt0XOJyHMdng0ylSynT8sMo= -github.com/urfave/cli v1.20.1-0.20180226030253-8e01ec4cd3e2/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -golang.org/x/sys v0.0.0-20170407050850-f3918c30c5c2 h1:niKkabq6kYToDafvvFw9MeTkT4ifSvpOCRP6pFxOCZE= -golang.org/x/sys v0.0.0-20170407050850-f3918c30c5c2/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/vendor/github.com/cli/safeexec/go.mod b/vendor/github.com/cli/safeexec/go.mod deleted file mode 100644 index 266fab447..000000000 --- a/vendor/github.com/cli/safeexec/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/cli/safeexec - -go 1.15 diff --git a/vendor/github.com/creack/pty/go.mod b/vendor/github.com/creack/pty/go.mod deleted file mode 100644 index e48decaf4..000000000 --- a/vendor/github.com/creack/pty/go.mod +++ /dev/null @@ -1,4 +0,0 @@ -module github.com/creack/pty - -go 1.13 - diff --git a/vendor/github.com/fatih/color/go.mod b/vendor/github.com/fatih/color/go.mod deleted file mode 100644 index bc0df7545..000000000 --- a/vendor/github.com/fatih/color/go.mod +++ /dev/null @@ -1,8 +0,0 @@ -module github.com/fatih/color - -go 1.13 - -require ( - github.com/mattn/go-colorable v0.1.4 - github.com/mattn/go-isatty v0.0.11 -) diff --git a/vendor/github.com/fatih/color/go.sum b/vendor/github.com/fatih/color/go.sum deleted file mode 100644 index 44328a8db..000000000 --- a/vendor/github.com/fatih/color/go.sum +++ /dev/null @@ -1,8 +0,0 @@ -github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.11 h1:FxPOTFNqGkuDUGi3H/qkUbQO4ZiBa2brKq5r0l8TGeM= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/github.com/fsmiamoto/git-todo-parser/todo/parse.go b/vendor/github.com/fsmiamoto/git-todo-parser/todo/parse.go new file mode 100644 index 000000000..8203d3151 --- /dev/null +++ b/vendor/github.com/fsmiamoto/git-todo-parser/todo/parse.go @@ -0,0 +1,141 @@ +package todo + +import ( + "bufio" + "errors" + "fmt" + "io" + "strings" +) + +var ( + ErrUnexpectedCommand = errors.New("unexpected command") + ErrMissingLabel = errors.New("missing label") + ErrMissingCommit = errors.New("missing commit") + ErrMissingExecCmd = errors.New("missing command for exec") +) + +func Parse(f io.Reader) ([]Todo, error) { + var result []Todo + + scanner := bufio.NewScanner(f) + scanner.Split(bufio.ScanLines) + + for scanner.Scan() { + line := scanner.Text() + + trimmed := strings.TrimSpace(line) + if trimmed == "" { + continue + } + + cmd, err := parseLine(line) + if err != nil { + return nil, fmt.Errorf("failed to parse line %q: %w", line, err) + } + + result = append(result, cmd) + } + + if err := scanner.Err(); err != nil { + return nil, fmt.Errorf("failed to parse input: %w", err) + } + + return result, nil +} + +func parseLine(line string) (Todo, error) { + var todo Todo + + if strings.HasPrefix(line, CommentChar) { + todo.Command = Comment + todo.Comment = strings.TrimLeft(line, CommentChar) + return todo, nil + } + + fields := strings.Fields(line) + + for i := TodoCommand(Pick); i < Comment; i++ { + if isCommand(i, fields[0]) { + todo.Command = TodoCommand(i) + fields = fields[1:] + break + } + } + + if todo.Command == 0 { + // unexpected command + return todo, ErrUnexpectedCommand + } + + if todo.Command == Break { + return todo, nil + } + + if todo.Command == Label || todo.Command == Reset { + if len(fields) == 0 { + return todo, ErrMissingLabel + } + todo.Label = fields[0] + return todo, nil + } + + if todo.Command == Exec { + if len(fields) == 0 { + return todo, ErrMissingExecCmd + } + todo.ExecCommand = strings.Join(fields, " ") + return todo, nil + } + + if todo.Command == Merge { + if fields[0] == "-C" || fields[0] == "-c" { + fields = fields[1:] + if len(fields) == 0 { + return todo, ErrMissingCommit + } + todo.Commit = fields[0] + fields = fields[1:] + } + if len(fields) == 0 { + return todo, ErrMissingLabel + } + todo.Label = fields[0] + fields = fields[1:] + if fields[0] == "#" { + fields = fields[1:] + todo.Msg = strings.Join(fields, " ") + } + return todo, nil + } + + if todo.Command == Fixup { + if len(fields) == 0 { + return todo, ErrMissingCommit + } + // Skip flags + if fields[0] == "-C" || fields[0] == "-c" { + fields = fields[1:] + } + } + + if len(fields) == 0 { + return todo, ErrMissingCommit + } + + todo.Commit = fields[0] + fields = fields[1:] + + // Trim # and whitespace + todo.Msg = strings.TrimPrefix(strings.Join(fields, " "), CommentChar+" ") + + return todo, nil +} + +func isCommand(i TodoCommand, s string) bool { + if i < 0 || i > Comment { + return false + } + return len(s) > 0 && + (todoCommandInfo[i].cmd == s || todoCommandInfo[i].nickname == s) +} diff --git a/vendor/github.com/fsmiamoto/git-todo-parser/todo/todo.go b/vendor/github.com/fsmiamoto/git-todo-parser/todo/todo.go new file mode 100644 index 000000000..ce16652db --- /dev/null +++ b/vendor/github.com/fsmiamoto/git-todo-parser/todo/todo.go @@ -0,0 +1,75 @@ +package todo + +type TodoCommand int + +const ( + Pick TodoCommand = iota + 1 + Revert + Edit + Reword + Fixup + Squash + + Exec + Break + Label + Reset + Merge + + NoOp + Drop + + Comment +) + +const CommentChar = "#" + +type Todo struct { + Command TodoCommand + Commit string + Comment string + ExecCommand string + Label string + Msg string +} + +func (t TodoCommand) String() string { + return commandToString[t] +} + +var commandToString = map[TodoCommand]string{ + Pick: "pick", + Revert: "revert", + Edit: "edit", + Reword: "reword", + Fixup: "fixup", + Squash: "squash", + Exec: "exec", + Break: "break", + Label: "label", + Reset: "reset", + Merge: "merge", + NoOp: "noop", + Drop: "drop", + Comment: "comment", +} + +var todoCommandInfo = [14]struct { + nickname string + cmd string +}{ + {"", ""}, // dummy value since we're using 1-based indexing + {"p", "pick"}, + {"", "revert"}, + {"e", "edit"}, + {"r", "reword"}, + {"f", "fixup"}, + {"s", "squash"}, + {"x", "exec"}, + {"b", "break"}, + {"l", "label"}, + {"t", "reset"}, + {"m", "merge"}, + {"", "noop"}, + {"d", "drop"}, +} diff --git a/vendor/github.com/gdamore/encoding/go.mod b/vendor/github.com/gdamore/encoding/go.mod deleted file mode 100644 index e91b30d5a..000000000 --- a/vendor/github.com/gdamore/encoding/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module github.com/gdamore/encoding - -go 1.9 - -require golang.org/x/text v0.3.0 diff --git a/vendor/github.com/gdamore/encoding/go.sum b/vendor/github.com/gdamore/encoding/go.sum deleted file mode 100644 index 6bad37b2a..000000000 --- a/vendor/github.com/gdamore/encoding/go.sum +++ /dev/null @@ -1,2 +0,0 @@ -golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/vendor/github.com/gdamore/tcell/v2/README.md b/vendor/github.com/gdamore/tcell/v2/README.md index 1d422e984..e5efb98d2 100644 --- a/vendor/github.com/gdamore/tcell/v2/README.md +++ b/vendor/github.com/gdamore/tcell/v2/README.md @@ -1,5 +1,12 @@ + + + -# ![Tcell](logos/tcell.png) + + +Please see [here](UKRAINE.md) for an important message for the people of Russia. + +# Tcell _Tcell_ is a _Go_ package that provides a cell based view for text terminals, like _XTerm_. It was inspired by _termbox_, but includes many additional improvements. @@ -17,6 +24,7 @@ Version 1.x remains available using the import `github.com/gdamore/tcell`. ## Tutorial A brief, and still somewhat rough, [tutorial](TUTORIAL.md) is available. + ## Examples * [proxima5](https://github.com/gdamore/proxima5) - space shooter ([video](https://youtu.be/jNxKTCmY_bQ)) @@ -45,6 +53,7 @@ A brief, and still somewhat rough, [tutorial](TUTORIAL.md) is available. * [gorss](https://github.com/lallassu/gorss) - RSS/Atom feed reader * [memoryalike](https://github.com/Bios-Marcel/memoryalike) - memorization game * [lf](https://github.com/gokcehan/lf) - file manager +* [goful](https://github.com/anmitsu/goful) - CUI file manager * [gokeybr](https://github.com/bunyk/gokeybr) - deliberately practice your typing * [gonano](https://github.com/jbaramidze/gonano) - editor, mimics _nano_ * [uchess](https://github.com/tmountain/uchess) - UCI chess client @@ -53,9 +62,10 @@ A brief, and still somewhat rough, [tutorial](TUTORIAL.md) is available. * [tmux-wormhole](https://github.com/gcla/tmux-wormhole) - _tmux_ plugin to transfer files * [gruid-tcell](https://github.com/anaseto/gruid-tcell) - driver for the grid based UI and game framework * [aretext](https://github.com/aretext/aretext) - minimalist text editor with _vim_ key bindings -* [sync](https://github.com/kyprifog/sync) - github repo synchronization tool +* [sync](https://github.com/kyprifog/sync) - GitHub repo synchronization tool * [statusbar](https://github.com/kyprifog/statusbar) - statusbar motivation tool for tracking periodic tasks/goals * [todo](https://github.com/kyprifog/todo) - simple todo app +* [gosnakego](https://github.com/liweiyi88/gosnakego) - a snake game ## Pure Go Terminfo Database diff --git a/vendor/github.com/gdamore/tcell/v2/UKRAINE.md b/vendor/github.com/gdamore/tcell/v2/UKRAINE.md new file mode 100644 index 000000000..d86d3e126 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/v2/UKRAINE.md @@ -0,0 +1,77 @@ +# Ukraine, Russia, and a World Tragedy + +## A message to those inside Russia + +### Written March 4, 2022. + +It is with a very heavy heart that I write this. I am normally opposed to the use of open source +projects to communicate political positions or advocate for things outside the immediate relevancy +to that project. + +However, the events occurring in Ukraine, and specifically the unprecedented invasion of Ukraine by +Russian forces operating under orders from Russian President Vladimir Putin compel me to speak out. + +Those who know me, know that I have family, friends, and colleagues in Russia, and Ukraine both. My closest friends +have historically been Russian friends my wife's hometown of Chelyabinsk. I myself have in the past +frequently traveled to Russia, and indeed operated a software development firm with offices in St. Petersburg. +I had a special kinship with Russia and its people. + +I say "had", because I fear that the actions of Putin, and the massive disinformation campaign that his regime +has waged inside Russia, mean that it's likely that I won't see those friends again. At present, I'm not sure +my wife will see her own mother again. We no longer feel it's safe for either of us to return Russia given +actions taken by the regime to crack down on those who express disagreement. + +Russian citizens are being led to believe it is acting purely defensively, and that only legitimate military +targets are being targeted, and that all the information we have received in the West are fakes. + +I am confident that nothing could be further from the truth. + +This has caused many in Russia, including people whom I respect and believe to be smarter than this, to +stand by Putin, and endorse his actions. The claim is that the entirety of NATO is operating at the behest +of the USA, and that the entirety of Europe was poised to attack Russia. While this is clearly absurd to those +of us with any understanding of western politics, Russian citizens are being fed this lie, and believing it. + +If you're reading this from inside Russia -- YOU are the person that I hope this message reaches. Your +government is LYING to you. Of course, all governments lie all the time. But consider this. Almost the +entire world has condemned the invasion of Ukraine as criminal, and has applied sanctions. Even countries +which have poor relations with the US sanctioning Russia, as well as nations which historically have remained +neutral. (Famously neutral -- even during World War II, Switzerland has acted to apply sanctions in +concert with the rest of the world.) + +Ask yourself, why does Putin fear a free press so much, if what he says is true? Why the crack-downs on +children expressing only a desire for peace with Ukraine? Why would the entire world unified against him, +if Putin was in the right? Why would the only countries that stood with Russia against +the UN resolution to condemn these acts as crimes be Belarus, North Korea, and Syria? Even countries normally +allied to Russia could not bring themselves to do more than abstain from the vote to condemn it. + +To be clear, I do not claim that the actions taken by the West or by the Ukrainian government were completely +blameless. On the contrary, I understand that Western media is biased, and the truth is rarely exactly +as reported. I believe that there is a kernel of truth in the claims of fascists and ultra-nationalist +militias operating in Ukraine and specifically Donbas. However, I am also equally certain that Putin's +response is out of proportion, and that concerns about such militias are principally just a pretext to justify +an invasion. + +Europe is at war, unlike we've seen in my lifetime. The world is more divided, and closer to nuclear holocaust +than it has been since the Cold War. And that is 100% the fault of Putin. + +While Putin remains in power, there cannot really be any way for Russian international relations to return +to normal. Putin has set your country on a path to return to the Cold War, likely because he fancies himself +to be a new Stalin. However, unlike the Soviet Union, the Russian economy does not have the wherewithal to +stand on its own, and the invasion of Ukraine has fully ensured that Russia will not find any friends anywhere +else in Europe, and probably few places in Asia. + +The *only* paths forward for Russia are either a Russia without Putin (and those who would support his agenda), +or a complete breakdown of Russian prosperity, likely followed by the increasing international conflict that will +be the natural escalation from a country that is isolated and impoverished. Those of us observing from the West are +gravely concerned, because we cannot see any end to this madness that does not result in nuclear conflict, +unless from within. + +In the meantime, the worst prices will be paid for by innocents in Ukraine, and by young Russian mean +forced to carry out the orders of Putin's corrupt regime. + +And *that* is why I write this -- to appeal to those within Russia to open your eyes, and think with +your minds. It is right and proper to be proud of your country and its rich heritage. But it is also +right and proper to look for ways to save it from the ruinous path that its current leadership has set it upon, +and to recognize when that leadership is no longer acting in interest of the country or its people. + + - Garrett D'Amore, March 4, 2022 \ No newline at end of file diff --git a/vendor/github.com/gdamore/tcell/v2/console_win.go b/vendor/github.com/gdamore/tcell/v2/console_win.go index a901a1255..5f0063e26 100644 --- a/vendor/github.com/gdamore/tcell/v2/console_win.go +++ b/vendor/github.com/gdamore/tcell/v2/console_win.go @@ -1,6 +1,7 @@ +//go:build windows // +build windows -// Copyright 2021 The TCell Authors +// Copyright 2022 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. @@ -46,11 +47,12 @@ type cScreen struct { w int h int - oscreen consoleInfo - ocursor cursorInfo - oimode uint32 - oomode uint32 - cells CellBuffer + oscreen consoleInfo + ocursor cursorInfo + cursorStyle CursorStyle + oimode uint32 + oomode uint32 + cells CellBuffer finiOnce sync.Once @@ -113,22 +115,23 @@ var ( // characters (Unicode) are in use. The documentation refers to them // without this suffix, as the resolution is made via preprocessor. var ( - procReadConsoleInput = k32.NewProc("ReadConsoleInputW") - procWaitForMultipleObjects = k32.NewProc("WaitForMultipleObjects") - procCreateEvent = k32.NewProc("CreateEventW") - procSetEvent = k32.NewProc("SetEvent") - procGetConsoleCursorInfo = k32.NewProc("GetConsoleCursorInfo") - procSetConsoleCursorInfo = k32.NewProc("SetConsoleCursorInfo") - procSetConsoleCursorPosition = k32.NewProc("SetConsoleCursorPosition") - procSetConsoleMode = k32.NewProc("SetConsoleMode") - procGetConsoleMode = k32.NewProc("GetConsoleMode") - procGetConsoleScreenBufferInfo = k32.NewProc("GetConsoleScreenBufferInfo") - procFillConsoleOutputAttribute = k32.NewProc("FillConsoleOutputAttribute") - procFillConsoleOutputCharacter = k32.NewProc("FillConsoleOutputCharacterW") - procSetConsoleWindowInfo = k32.NewProc("SetConsoleWindowInfo") - procSetConsoleScreenBufferSize = k32.NewProc("SetConsoleScreenBufferSize") - procSetConsoleTextAttribute = k32.NewProc("SetConsoleTextAttribute") - procMessageBeep = u32.NewProc("MessageBeep") + procReadConsoleInput = k32.NewProc("ReadConsoleInputW") + procWaitForMultipleObjects = k32.NewProc("WaitForMultipleObjects") + procCreateEvent = k32.NewProc("CreateEventW") + procSetEvent = k32.NewProc("SetEvent") + procGetConsoleCursorInfo = k32.NewProc("GetConsoleCursorInfo") + procSetConsoleCursorInfo = k32.NewProc("SetConsoleCursorInfo") + procSetConsoleCursorPosition = k32.NewProc("SetConsoleCursorPosition") + procSetConsoleMode = k32.NewProc("SetConsoleMode") + procGetConsoleMode = k32.NewProc("GetConsoleMode") + procGetConsoleScreenBufferInfo = k32.NewProc("GetConsoleScreenBufferInfo") + procFillConsoleOutputAttribute = k32.NewProc("FillConsoleOutputAttribute") + procFillConsoleOutputCharacter = k32.NewProc("FillConsoleOutputCharacterW") + procSetConsoleWindowInfo = k32.NewProc("SetConsoleWindowInfo") + procSetConsoleScreenBufferSize = k32.NewProc("SetConsoleScreenBufferSize") + procSetConsoleTextAttribute = k32.NewProc("SetConsoleTextAttribute") + procGetLargestConsoleWindowSize = k32.NewProc("GetLargestConsoleWindowSize") + procMessageBeep = u32.NewProc("MessageBeep") ) const ( @@ -138,20 +141,37 @@ const ( const ( // VT100/XTerm escapes understood by the console - vtShowCursor = "\x1b[?25h" - vtHideCursor = "\x1b[?25l" - vtCursorPos = "\x1b[%d;%dH" // Note that it is Y then X - vtSgr0 = "\x1b[0m" - vtBold = "\x1b[1m" - vtUnderline = "\x1b[4m" - vtBlink = "\x1b[5m" // Not sure this is processed - vtReverse = "\x1b[7m" - vtSetFg = "\x1b[38;5;%dm" - vtSetBg = "\x1b[48;5;%dm" - vtSetFgRGB = "\x1b[38;2;%d;%d;%dm" // RGB - vtSetBgRGB = "\x1b[48;2;%d;%d;%dm" // RGB + vtShowCursor = "\x1b[?25h" + vtHideCursor = "\x1b[?25l" + vtCursorPos = "\x1b[%d;%dH" // Note that it is Y then X + vtSgr0 = "\x1b[0m" + vtBold = "\x1b[1m" + vtUnderline = "\x1b[4m" + vtBlink = "\x1b[5m" // Not sure this is processed + vtReverse = "\x1b[7m" + vtSetFg = "\x1b[38;5;%dm" + vtSetBg = "\x1b[48;5;%dm" + vtSetFgRGB = "\x1b[38;2;%d;%d;%dm" // RGB + vtSetBgRGB = "\x1b[48;2;%d;%d;%dm" // RGB + vtCursorDefault = "\x1b[0 q" + vtCursorBlinkingBlock = "\x1b[1 q" + vtCursorSteadyBlock = "\x1b[2 q" + vtCursorBlinkingUnderline = "\x1b[3 q" + vtCursorSteadyUnderline = "\x1b[4 q" + vtCursorBlinkingBar = "\x1b[5 q" + vtCursorSteadyBar = "\x1b[6 q" ) +var vtCursorStyles = map[CursorStyle]string{ + CursorStyleDefault: vtCursorDefault, + CursorStyleBlinkingBlock: vtCursorBlinkingBlock, + CursorStyleSteadyBlock: vtCursorSteadyBlock, + CursorStyleBlinkingUnderline: vtCursorBlinkingUnderline, + CursorStyleSteadyUnderline: vtCursorSteadyUnderline, + CursorStyleBlinkingBar: vtCursorBlinkingBar, + CursorStyleSteadyBar: vtCursorSteadyBar, +} + // NewConsoleScreen returns a Screen for the Windows console associated // with the current process. The Screen makes use of the Windows Console // API to display content and read events. @@ -171,7 +191,7 @@ func (s *cScreen) Init() error { s.in = in out, e := syscall.Open("CONOUT$", syscall.O_RDWR, 0) if e != nil { - syscall.Close(s.in) + _ = syscall.Close(s.in) return e } s.out = out @@ -206,15 +226,15 @@ func (s *cScreen) Init() error { s.resize() s.fini = false - s.setInMode(modeResizeEn | modeExtndFlg) + s.setInMode(modeResizeEn | modeExtendFlg) // 24-bit color is opt-in for now, because we can't figure out // to make it work consistently. if s.truecolor { s.setOutMode(modeVtOutput | modeNoAutoNL | modeCookedOut) - var omode uint32 - s.getOutMode(&omode) - if omode&modeVtOutput == modeVtOutput { + var om uint32 + s.getOutMode(&om) + if om&modeVtOutput == modeVtOutput { s.vten = true } else { s.truecolor = false @@ -250,9 +270,9 @@ func (s *cScreen) DisableMouse() { func (s *cScreen) enableMouse(on bool) { if on { - s.setInMode(modeResizeEn | modeMouseEn | modeExtndFlg) + s.setInMode(modeResizeEn | modeMouseEn | modeExtendFlg) } else { - s.setInMode(modeResizeEn | modeExtndFlg) + s.setInMode(modeResizeEn | modeExtendFlg) } } @@ -274,19 +294,22 @@ func (s *cScreen) disengage() { } s.running = false stopQ := s.stopQ - procSetEvent.Call(uintptr(s.cancelflag)) + _, _, _ = procSetEvent.Call(uintptr(s.cancelflag)) close(stopQ) s.Unlock() s.wg.Wait() + if s.vten { + s.emitVtString(vtCursorStyles[CursorStyleDefault]) + } s.setInMode(s.oimode) s.setOutMode(s.oomode) s.setBufferSize(int(s.oscreen.size.x), int(s.oscreen.size.y)) s.clearScreen(StyleDefault, false) s.setCursorPos(0, 0, false) s.setCursorInfo(&s.ocursor) - procSetConsoleTextAttribute.Call( + _, _, _ = procSetConsoleTextAttribute.Call( uintptr(s.out), uintptr(s.mapStyle(StyleDefault))) } @@ -400,12 +423,13 @@ type rect struct { func (s *cScreen) emitVtString(vs string) { esc := utf16.Encode([]rune(vs)) - syscall.WriteConsole(s.out, &esc[0], uint32(len(esc)), nil, nil) + _ = syscall.WriteConsole(s.out, &esc[0], uint32(len(esc)), nil, nil) } func (s *cScreen) showCursor() { if s.vten { s.emitVtString(vtShowCursor) + s.emitVtString(vtCursorStyles[s.cursorStyle]) } else { s.setCursorInfo(&cursorInfo{size: 100, visible: 1}) } @@ -429,6 +453,17 @@ func (s *cScreen) ShowCursor(x, y int) { s.Unlock() } +func (s *cScreen) SetCursorStyle(cs CursorStyle) { + s.Lock() + if !s.fini { + if _, ok := vtCursorStyles[cs]; ok { + s.cursorStyle = cs + s.doCursor() + } + } + s.Unlock() +} + func (s *cScreen) doCursor() { x, y := s.curx, s.cury @@ -454,8 +489,8 @@ const ( keyEvent uint16 = 1 mouseEvent uint16 = 2 resizeEvent uint16 = 4 - menuEvent uint16 = 8 // don't use - focusEvent uint16 = 16 // don't use + // menuEvent uint16 = 8 // don't use + // focusEvent uint16 = 16 // don't use ) type mouseRecord struct { @@ -467,10 +502,10 @@ type mouseRecord struct { } const ( - mouseDoubleClick uint32 = 0x2 - mouseHWheeled uint32 = 0x8 - mouseVWheeled uint32 = 0x4 - mouseMoved uint32 = 0x1 + mouseHWheeled uint32 = 0x8 + mouseVWheeled uint32 = 0x4 + // mouseDoubleClick uint32 = 0x2 + // mouseMoved uint32 = 0x1 ) type resizeRecord struct { @@ -557,6 +592,8 @@ var vkKeys = map[uint16]Key{ vkInsert: KeyInsert, vkDelete: KeyDelete, vkHelp: KeyHelp, + vkEscape: KeyEscape, + vkSpace: ' ', vkF1: KeyF1, vkF2: KeyF2, vkF3: KeyF3, @@ -773,11 +810,11 @@ func (s *cScreen) scanInput(stopQ chan struct{}) { } } -// Windows console can display 8 characters, in either low or high intensity func (s *cScreen) Colors() int { if s.vten { return 1 << 24 } + // Windows console can display 8 colors, in either low or high intensity return 16 } @@ -835,10 +872,10 @@ func (s *cScreen) mapStyle(style Style) uint16 { // views. if a&AttrReverse != 0 { attr = ba - attr |= (fa << 4) + attr |= fa << 4 } else { attr = fa - attr |= (ba << 4) + attr |= ba << 4 } if a&AttrBold != 0 { attr |= 0x8 @@ -862,19 +899,19 @@ func (s *cScreen) SetCell(x, y int, style Style, ch ...rune) { } } -func (s *cScreen) SetContent(x, y int, mainc rune, combc []rune, style Style) { +func (s *cScreen) SetContent(x, y int, primary rune, combining []rune, style Style) { s.Lock() if !s.fini { - s.cells.SetContent(x, y, mainc, combc, style) + s.cells.SetContent(x, y, primary, combining, style) } s.Unlock() } func (s *cScreen) GetContent(x, y int) (rune, []rune, Style, int) { s.Lock() - mainc, combc, style, width := s.cells.GetContent(x, y) + primary, combining, style, width := s.cells.GetContent(x, y) s.Unlock() - return mainc, combc, style, width + return primary, combining, style, width } func (s *cScreen) sendVtStyle(style Style) { @@ -898,15 +935,15 @@ func (s *cScreen) sendVtStyle(style Style) { } if fg.IsRGB() { r, g, b := fg.RGB() - fmt.Fprintf(esc, vtSetFgRGB, r, g, b) + _, _ = fmt.Fprintf(esc, vtSetFgRGB, r, g, b) } else if fg.Valid() { - fmt.Fprintf(esc, vtSetFg, fg&0xff) + _, _ = fmt.Fprintf(esc, vtSetFg, fg&0xff) } if bg.IsRGB() { r, g, b := bg.RGB() - fmt.Fprintf(esc, vtSetBgRGB, r, g, b) + _, _ = fmt.Fprintf(esc, vtSetBgRGB, r, g, b) } else if bg.Valid() { - fmt.Fprintf(esc, vtSetBg, bg&0xff) + _, _ = fmt.Fprintf(esc, vtSetBg, bg&0xff) } s.emitVtString(esc.String()) } @@ -921,16 +958,16 @@ func (s *cScreen) writeString(x, y int, style Style, ch []uint16) { if s.vten { s.sendVtStyle(style) } else { - procSetConsoleTextAttribute.Call( + _, _, _ = procSetConsoleTextAttribute.Call( uintptr(s.out), uintptr(s.mapStyle(style))) } - syscall.WriteConsole(s.out, &ch[0], uint32(len(ch)), nil, nil) + _ = syscall.WriteConsole(s.out, &ch[0], uint32(len(ch)), nil, nil) } func (s *cScreen) draw() { // allocate a scratch line bit enough for no combining chars. - // if you have combining characters, you may pay for extra allocs. + // if you have combining characters, you may pay for extra allocations. if s.clear { s.clearScreen(s.style, s.vten) s.clear = false @@ -1020,19 +1057,19 @@ type consoleInfo struct { } func (s *cScreen) getConsoleInfo(info *consoleInfo) { - procGetConsoleScreenBufferInfo.Call( + _, _, _ = procGetConsoleScreenBufferInfo.Call( uintptr(s.out), uintptr(unsafe.Pointer(info))) } func (s *cScreen) getCursorInfo(info *cursorInfo) { - procGetConsoleCursorInfo.Call( + _, _, _ = procGetConsoleCursorInfo.Call( uintptr(s.out), uintptr(unsafe.Pointer(info))) } func (s *cScreen) setCursorInfo(info *cursorInfo) { - procSetConsoleCursorInfo.Call( + _, _, _ = procSetConsoleCursorInfo.Call( uintptr(s.out), uintptr(unsafe.Pointer(info))) @@ -1043,14 +1080,14 @@ func (s *cScreen) setCursorPos(x, y int, vtEnable bool) { // Note that the string is Y first. Origin is 1,1. s.emitVtString(fmt.Sprintf(vtCursorPos, y+1, x+1)) } else { - procSetConsoleCursorPosition.Call( + _, _, _ = procSetConsoleCursorPosition.Call( uintptr(s.out), coord{int16(x), int16(y)}.uintptr()) } } func (s *cScreen) setBufferSize(x, y int) { - procSetConsoleScreenBufferSize.Call( + _, _, _ = procSetConsoleScreenBufferSize.Call( uintptr(s.out), coord{int16(x), int16(y)}.uintptr()) } @@ -1063,6 +1100,37 @@ func (s *cScreen) Size() (int, int) { return w, h } +func (s *cScreen) SetSize(w, h int) { + xy, _, _ := procGetLargestConsoleWindowSize.Call(uintptr(s.out)) + + // xy is little endian packed + y := int(xy >> 16) + x := int(xy & 0xffff) + + if x == 0 || y == 0 { + return + } + + // This is a hacky workaround for Windows Terminal. + // Essentially Windows Terminal (Windows 11) does not support application + // initiated resizing. To detect this, we look for an extremely large size + // for the maximum width. If it is > 500, then this is almost certainly + // Windows Terminal, and won't support this. (Note that the legacy console + // does support application resizing.) + if x >= 500 { + return + } + + s.setBufferSize(x, y) + r := rect{0, 0, int16(w - 1), int16(h - 1)} + _, _, _ = procSetConsoleWindowInfo.Call( + uintptr(s.out), + uintptr(1), + uintptr(unsafe.Pointer(&r))) + + s.resize() +} + func (s *cScreen) resize() { info := consoleInfo{} s.getConsoleInfo(&info) @@ -1081,11 +1149,11 @@ func (s *cScreen) resize() { s.setBufferSize(w, h) r := rect{0, 0, int16(w - 1), int16(h - 1)} - procSetConsoleWindowInfo.Call( + _, _, _ = procSetConsoleWindowInfo.Call( uintptr(s.out), uintptr(1), uintptr(unsafe.Pointer(&r))) - s.PostEvent(NewEventResize(w, h)) + _ = s.PostEvent(NewEventResize(w, h)) } func (s *cScreen) Clear() { @@ -1118,13 +1186,13 @@ func (s *cScreen) clearScreen(style Style, vtEnable bool) { scratch := uint32(0) count := uint32(x * y) - procFillConsoleOutputAttribute.Call( + _, _, _ = procFillConsoleOutputAttribute.Call( uintptr(s.out), uintptr(attr), uintptr(count), pos.uintptr(), uintptr(unsafe.Pointer(&scratch))) - procFillConsoleOutputCharacter.Call( + _, _, _ = procFillConsoleOutputCharacter.Call( uintptr(s.out), uintptr(' '), uintptr(count), @@ -1135,47 +1203,39 @@ func (s *cScreen) clearScreen(style Style, vtEnable bool) { const ( // Input modes - modeExtndFlg uint32 = 0x0080 - modeMouseEn = 0x0010 - modeResizeEn = 0x0008 - modeCooked = 0x0001 - modeVtInput = 0x0200 + modeExtendFlg uint32 = 0x0080 + modeMouseEn = 0x0010 + modeResizeEn = 0x0008 + // modeCooked = 0x0001 + // modeVtInput = 0x0200 // Output modes modeCookedOut uint32 = 0x0001 - modeWrapEOL = 0x0002 modeVtOutput = 0x0004 modeNoAutoNL = 0x0008 + // modeWrapEOL = 0x0002 ) -func (s *cScreen) setInMode(mode uint32) error { - rv, _, err := procSetConsoleMode.Call( +func (s *cScreen) setInMode(mode uint32) { + _, _, _ = procSetConsoleMode.Call( uintptr(s.in), uintptr(mode)) - if rv == 0 { - return err - } - return nil } -func (s *cScreen) setOutMode(mode uint32) error { - rv, _, err := procSetConsoleMode.Call( +func (s *cScreen) setOutMode(mode uint32) { + _, _, _ = procSetConsoleMode.Call( uintptr(s.out), uintptr(mode)) - if rv == 0 { - return err - } - return nil } func (s *cScreen) getInMode(v *uint32) { - procGetConsoleMode.Call( + _, _, _ = procGetConsoleMode.Call( uintptr(s.in), uintptr(unsafe.Pointer(v))) } func (s *cScreen) getOutMode(v *uint32) { - procGetConsoleMode.Call( + _, _, _ = procGetConsoleMode.Call( uintptr(s.out), uintptr(unsafe.Pointer(v))) } @@ -1188,15 +1248,15 @@ func (s *cScreen) SetStyle(style Style) { // No fallback rune support, since we have Unicode. Yay! -func (s *cScreen) RegisterRuneFallback(r rune, subst string) { +func (s *cScreen) RegisterRuneFallback(_ rune, _ string) { } -func (s *cScreen) UnregisterRuneFallback(r rune) { +func (s *cScreen) UnregisterRuneFallback(_ rune) { } -func (s *cScreen) CanDisplay(r rune, checkFallbacks bool) bool { +func (s *cScreen) CanDisplay(_ rune, _ bool) bool { // We presume we can display anything -- we're Unicode. - // (Sadly this not precisely true. Combinings are especially + // (Sadly this not precisely true. Combining characters are especially // poorly supported under Windows.) return true } diff --git a/vendor/github.com/gdamore/tcell/v2/go.mod b/vendor/github.com/gdamore/tcell/v2/go.mod deleted file mode 100644 index ac4b10db4..000000000 --- a/vendor/github.com/gdamore/tcell/v2/go.mod +++ /dev/null @@ -1,12 +0,0 @@ -module github.com/gdamore/tcell/v2 - -go 1.12 - -require ( - github.com/gdamore/encoding v1.0.0 - github.com/lucasb-eyer/go-colorful v1.2.0 - github.com/mattn/go-runewidth v0.0.13 - golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 - golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf - golang.org/x/text v0.3.7 -) diff --git a/vendor/github.com/gdamore/tcell/v2/go.sum b/vendor/github.com/gdamore/tcell/v2/go.sum deleted file mode 100644 index b25da2aa5..000000000 --- a/vendor/github.com/gdamore/tcell/v2/go.sum +++ /dev/null @@ -1,16 +0,0 @@ -github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= -github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= -github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= -github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= -github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= -github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= -golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/vendor/github.com/gdamore/tcell/v2/paste.go b/vendor/github.com/gdamore/tcell/v2/paste.go index 71cf8b1cc..cbe6979f9 100644 --- a/vendor/github.com/gdamore/tcell/v2/paste.go +++ b/vendor/github.com/gdamore/tcell/v2/paste.go @@ -27,7 +27,7 @@ type EventPaste struct { t time.Time } -// When returns the time when this EventMouse was created. +// When returns the time when this EventPaste was created. func (ev *EventPaste) When() time.Time { return ev.t } diff --git a/vendor/github.com/gdamore/tcell/v2/screen.go b/vendor/github.com/gdamore/tcell/v2/screen.go index 15cfbf022..43c3a54b1 100644 --- a/vendor/github.com/gdamore/tcell/v2/screen.go +++ b/vendor/github.com/gdamore/tcell/v2/screen.go @@ -1,4 +1,4 @@ -// Copyright 2021 The TCell Authors +// Copyright 2022 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. @@ -43,7 +43,7 @@ type Screen interface { // be displayed if Show() or Sync() is called. The width is the width // in screen cells; most often this will be 1, but some East Asian // characters require two cells. - GetContent(x, y int) (mainc rune, combc []rune, style Style, width int) + GetContent(x, y int) (primary rune, combining []rune, style Style, width int) // SetContent sets the contents of the given cell location. If // the coordinates are out of range, then the operation is ignored. @@ -52,13 +52,13 @@ type Screen interface { // that follows is a possible list of combining characters to append, // and will usually be nil (no combining characters.) // - // The results are not displayd until Show() or Sync() is called. + // The results are not displayed until Show() or Sync() is called. // // Note that wide (East Asian full width) runes occupy two cells, // and attempts to place character at next cell to the right will have // undefined effects. Wide runes that are printed in the // last column will be replaced with a single width space on output. - SetContent(x int, y int, mainc rune, combc []rune, style Style) + SetContent(x int, y int, primary rune, combining []rune, style Style) // SetStyle sets the default style to use when clearing the screen // or when StyleDefault is specified. If it is also StyleDefault, @@ -70,10 +70,15 @@ type Screen interface { // dimensions of the screen, the cursor will be hidden. ShowCursor(x int, y int) - // HideCursor is used to hide the cursor. Its an alias for - // ShowCursor(-1, -1). + // HideCursor is used to hide the cursor. It's an alias for + // ShowCursor(-1, -1).sim HideCursor() + // SetCursorStyle is used to set the cursor style. If the style + // is not supported (or cursor styles are not supported at all), + // then this will have no effect. + SetCursorStyle(CursorStyle) + // Size returns the screen size as width, height. This changes in // response to a call to Clear or Flush. Size() (width, height int) @@ -134,7 +139,7 @@ type Screen interface { DisablePaste() // HasMouse returns true if the terminal (apparently) supports a - // mouse. Note that the a return value of true doesn't guarantee that + // mouse. Note that the return value of true doesn't guarantee that // a mouse/pointing device is present; a false return definitely // indicates no mouse support is available. HasMouse() bool @@ -156,8 +161,8 @@ type Screen interface { // internal model. This may be both expensive and visually jarring, // so it should only be used when believed to actually be necessary. // - // Typically this is called as a result of a user-requested redraw - // (e.g. to clear up on screen corruption caused by some other program), + // Typically, this is called as a result of a user-requested redraw + // (e.g. to clear up on-screen corruption caused by some other program), // or during a resize event. Sync() @@ -173,13 +178,13 @@ type Screen interface { // o as a fallback for ø. This should be done cautiously for // characters that might be displayed ordinarily in language // specific text -- characters that could change the meaning of - // of written text would be dangerous. The intention here is to + // written text would be dangerous. The intention here is to // facilitate fallback characters in pseudo-graphical applications. // // If the terminal has fallbacks already in place via an alternate // character set, those are used in preference. Also, standard - // fallbacks for graphical characters in the ACSC terminfo string - // are registered implicitly. + // fallbacks for graphical characters in the alternate character set + // terminfo string are registered implicitly. // // The display string should be the same width as original rune. // This makes it possible to register two character replacements @@ -198,7 +203,7 @@ type Screen interface { UnregisterRuneFallback(r rune) // CanDisplay returns true if the given rune can be displayed on - // this screen. Note that this is a best guess effort -- whether + // this screen. Note that this is a best-guess effort -- whether // your fonts support the character or not may be questionable. // Mostly this is for folks who work outside of Unicode. // @@ -208,7 +213,7 @@ type Screen interface { // one that is visually indistinguishable from the one requested. CanDisplay(r rune, checkFallbacks bool) bool - // Resize does nothing, since its generally not possible to + // Resize does nothing, since it's generally not possible to // ask a screen to resize, but it allows the Screen to implement // the View interface. Resize(int, int, int, int) @@ -234,6 +239,15 @@ type Screen interface { // Beep attempts to sound an OS-dependent audible alert and returns an error // when unsuccessful. Beep() error + + // SetSize attempts to resize the window. It also invalidates the cells and + // calls the resize function. Note that if the window size is changed, it will + // not be restored upon application exit. + // + // Many terminals cannot support this. Perversely, the "modern" Windows Terminal + // does not support application-initiated resizing, whereas the legacy terminal does. + // Also, some emulators can support this but may have it disabled by default. + SetSize(int, int) } // NewScreen returns a default Screen suitable for the user's terminal @@ -250,7 +264,7 @@ func NewScreen() (Screen, error) { } // MouseFlags are options to modify the handling of mouse events. -// Actual events can be or'd together. +// Actual events can be ORed together. type MouseFlags int const ( @@ -258,3 +272,17 @@ const ( MouseDragEvents = MouseFlags(2) // Click-drag events (includes button events) MouseMotionEvents = MouseFlags(4) // All mouse events (includes click and drag events) ) + +// CursorStyle represents a given cursor style, which can include the shape and +// whether the cursor blinks or is solid. Support for changing this is not universal. +type CursorStyle int + +const ( + CursorStyleDefault = CursorStyle(iota) // The default + CursorStyleBlinkingBlock + CursorStyleSteadyBlock + CursorStyleBlinkingUnderline + CursorStyleSteadyUnderline + CursorStyleBlinkingBar + CursorStyleSteadyBar +) diff --git a/vendor/github.com/gdamore/tcell/v2/simulation.go b/vendor/github.com/gdamore/tcell/v2/simulation.go index 451460be2..9ad6131ec 100644 --- a/vendor/github.com/gdamore/tcell/v2/simulation.go +++ b/vendor/github.com/gdamore/tcell/v2/simulation.go @@ -1,4 +1,4 @@ -// Copyright 2021 The TCell Authors +// Copyright 2022 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. @@ -49,13 +49,6 @@ type SimulationScreen interface { // InjectMouse injects a mouse event. InjectMouse(x, y int, buttons ButtonMask, mod ModMask) - // SetSize resizes the underlying physical screen. It also causes - // a resize event to be injected during the next Show() or Sync(). - // A new physical contents array will be allocated (with data from - // the old copied), so any prior value obtained with GetContents - // won't be used anymore - SetSize(width, height int) - // GetContents returns screen contents as an array of // cells, along with the physical width & height. Note that the // physical contents will be used until the next time SetSize() @@ -281,6 +274,8 @@ func (s *simscreen) hideCursor() { s.cursorvis = false } +func (s *simscreen) SetCursorStyle(CursorStyle) {} + func (s *simscreen) Show() { s.Lock() s.resize() diff --git a/vendor/github.com/gdamore/tcell/v2/style.go b/vendor/github.com/gdamore/tcell/v2/style.go index 8359e28c6..ad4b47f21 100644 --- a/vendor/github.com/gdamore/tcell/v2/style.go +++ b/vendor/github.com/gdamore/tcell/v2/style.go @@ -1,4 +1,4 @@ -// Copyright 2020 The TCell Authors +// Copyright 2022 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. @@ -26,6 +26,7 @@ type Style struct { fg Color bg Color attrs AttrMask + url string } // StyleDefault represents a default style, based upon the context. @@ -42,6 +43,7 @@ func (s Style) Foreground(c Color) Style { fg: c, bg: s.bg, attrs: s.attrs, + url: s.url, } } @@ -52,11 +54,12 @@ func (s Style) Background(c Color) Style { fg: s.fg, bg: c, attrs: s.attrs, + url: s.url, } } // Decompose breaks a style up, returning the foreground, background, -// and other attributes. +// and other attributes. The URL if set is not included. func (s Style) Decompose() (fg Color, bg Color, attr AttrMask) { return s.fg, s.bg, s.attrs } @@ -67,12 +70,14 @@ func (s Style) setAttrs(attrs AttrMask, on bool) Style { fg: s.fg, bg: s.bg, attrs: s.attrs | attrs, + url: s.url, } } return Style{ fg: s.fg, bg: s.bg, attrs: s.attrs &^ attrs, + url: s.url, } } @@ -133,5 +138,18 @@ func (s Style) Attributes(attrs AttrMask) Style { fg: s.fg, bg: s.bg, attrs: attrs, + url: s.url, + } +} + +// Url returns a style with the Url set. If the provided Url is not empty, +// and the terminal supports it, text will typically be marked up as a clickable +// link to that Url. If the Url is empty, then this mode is turned off. +func (s Style) Url(url string) Style { + return Style{ + fg: s.fg, + bg: s.bg, + attrs: s.attrs, + url: url, } } diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/f/foot/foot.go b/vendor/github.com/gdamore/tcell/v2/terminfo/f/foot/foot.go index fb734cbdc..3197d8285 100644 --- a/vendor/github.com/gdamore/tcell/v2/terminfo/f/foot/foot.go +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/f/foot/foot.go @@ -9,6 +9,7 @@ func init() { // foot terminal emulator terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "foot", + Aliases: []string{"foot-extra"}, Columns: 80, Lines: 24, Colors: 256, diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/t/tmux/term.go b/vendor/github.com/gdamore/tcell/v2/terminfo/t/tmux/term.go index 44975d69a..2da0c3cfb 100644 --- a/vendor/github.com/gdamore/tcell/v2/terminfo/t/tmux/term.go +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/t/tmux/term.go @@ -68,4 +68,65 @@ func init() { Modifiers: 1, AutoMargin: true, }) + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "tmux-256color", + Columns: 80, + Lines: 24, + Colors: 256, + Bell: "\a", + Clear: "\x1b[H\x1b[J", + EnterCA: "\x1b[?1049h", + ExitCA: "\x1b[?1049l", + ShowCursor: "\x1b[34h\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[m\x0f", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Italic: "\x1b[3m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", + SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", + SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", + ResetFgBg: "\x1b[39;49m", + PadChar: "\x00", + AltChars: "++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x0e", + ExitAcs: "\x0f", + EnableAcs: "\x1b(B\x1b)0", + StrikeThrough: "\x1b[9m", + Mouse: "\x1b[M", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1bM", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\u007f", + KeyHome: "\x1b[1~", + KeyEnd: "\x1b[4~", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyBacktab: "\x1b[Z", + Modifiers: 1, + AutoMargin: true, + }) } diff --git a/vendor/github.com/gdamore/tcell/v2/terminfo/terminfo.go b/vendor/github.com/gdamore/tcell/v2/terminfo/terminfo.go index 7e17352cc..7028b51be 100644 --- a/vendor/github.com/gdamore/tcell/v2/terminfo/terminfo.go +++ b/vendor/github.com/gdamore/tcell/v2/terminfo/terminfo.go @@ -1,4 +1,4 @@ -// Copyright 2021 The TCell Authors +// Copyright 2022 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. @@ -167,59 +167,69 @@ type Terminfo struct { // Terminal support for these are going to vary amongst XTerm // emulations, so don't depend too much on them in your application. - StrikeThrough string // smxx - SetFgBg string // setfgbg - SetFgBgRGB string // setfgbgrgb - SetFgRGB string // setfrgb - SetBgRGB string // setbrgb - KeyShfUp string // shift-up - KeyShfDown string // shift-down - KeyShfPgUp string // shift-kpp - KeyShfPgDn string // shift-knp - KeyCtrlUp string // ctrl-up - KeyCtrlDown string // ctrl-left - KeyCtrlRight string // ctrl-right - KeyCtrlLeft string // ctrl-left - KeyMetaUp string // meta-up - KeyMetaDown string // meta-left - KeyMetaRight string // meta-right - KeyMetaLeft string // meta-left - KeyAltUp string // alt-up - KeyAltDown string // alt-left - KeyAltRight string // alt-right - KeyAltLeft string // alt-left - KeyCtrlHome string - KeyCtrlEnd string - KeyMetaHome string - KeyMetaEnd string - KeyAltHome string - KeyAltEnd string - KeyAltShfUp string - KeyAltShfDown string - KeyAltShfLeft string - KeyAltShfRight string - KeyMetaShfUp string - KeyMetaShfDown string - KeyMetaShfLeft string - KeyMetaShfRight string - KeyCtrlShfUp string - KeyCtrlShfDown string - KeyCtrlShfLeft string - KeyCtrlShfRight string - KeyCtrlShfHome string - KeyCtrlShfEnd string - KeyAltShfHome string - KeyAltShfEnd string - KeyMetaShfHome string - KeyMetaShfEnd string - EnablePaste string // bracketed paste mode - DisablePaste string - PasteStart string - PasteEnd string - Modifiers int - InsertChar string // string to insert a character (ich1) - AutoMargin bool // true if writing to last cell in line advances - TrueColor bool // true if the terminal supports direct color + StrikeThrough string // smxx + SetFgBg string // setfgbg + SetFgBgRGB string // setfgbgrgb + SetFgRGB string // setfrgb + SetBgRGB string // setbrgb + KeyShfUp string // shift-up + KeyShfDown string // shift-down + KeyShfPgUp string // shift-kpp + KeyShfPgDn string // shift-knp + KeyCtrlUp string // ctrl-up + KeyCtrlDown string // ctrl-left + KeyCtrlRight string // ctrl-right + KeyCtrlLeft string // ctrl-left + KeyMetaUp string // meta-up + KeyMetaDown string // meta-left + KeyMetaRight string // meta-right + KeyMetaLeft string // meta-left + KeyAltUp string // alt-up + KeyAltDown string // alt-left + KeyAltRight string // alt-right + KeyAltLeft string // alt-left + KeyCtrlHome string + KeyCtrlEnd string + KeyMetaHome string + KeyMetaEnd string + KeyAltHome string + KeyAltEnd string + KeyAltShfUp string + KeyAltShfDown string + KeyAltShfLeft string + KeyAltShfRight string + KeyMetaShfUp string + KeyMetaShfDown string + KeyMetaShfLeft string + KeyMetaShfRight string + KeyCtrlShfUp string + KeyCtrlShfDown string + KeyCtrlShfLeft string + KeyCtrlShfRight string + KeyCtrlShfHome string + KeyCtrlShfEnd string + KeyAltShfHome string + KeyAltShfEnd string + KeyMetaShfHome string + KeyMetaShfEnd string + EnablePaste string // bracketed paste mode + DisablePaste string + PasteStart string + PasteEnd string + Modifiers int + InsertChar string // string to insert a character (ich1) + AutoMargin bool // true if writing to last cell in line advances + TrueColor bool // true if the terminal supports direct color + CursorDefault string + CursorBlinkingBlock string + CursorSteadyBlock string + CursorBlinkingUnderline string + CursorSteadyUnderline string + CursorBlinkingBar string + CursorSteadyBar string + EnterUrl string + ExitUrl string + SetWindowSize string } const ( @@ -227,93 +237,75 @@ const ( ModifiersXTerm = 1 ) -type stackElem struct { - s string - i int - isStr bool - isInt bool +type stack []interface{} + +func (st stack) Push(v interface{}) stack { + return append(st, v) } -type stack []stackElem - -func (st stack) Push(v string) stack { - e := stackElem{ - s: v, - isStr: true, - } - return append(st, e) -} - -func (st stack) Pop() (string, stack) { - v := "" +func (st stack) Pop() (interface{}, stack) { if len(st) > 0 { e := st[len(st)-1] - st = st[:len(st)-1] - if e.isStr { - v = e.s - } else { - v = strconv.Itoa(e.i) - } + return e, st[:len(st)-1] } - return v, st + return 0, st } +func (st stack) PopString() (string, stack) { + if len(st) > 0 { + e := st[len(st)-1] + var s string + switch v := e.(type) { + case int: + s = strconv.Itoa(v) + case bool: + s = strconv.FormatBool(v) + case string: + s = v + } + return s, st[:len(st)-1] + } + return "", st + +} func (st stack) PopInt() (int, stack) { if len(st) > 0 { e := st[len(st)-1] - st = st[:len(st)-1] - if e.isInt { - return e.i, st - } else if e.isStr { - // If the string that was pushed was the representation - // of a number e.g. '123', then return the number. If the - // conversion doesn't work, assume the string pushed was - // intended to return, as an int, the ascii representation - // of the (one and only) character. - i, err := strconv.Atoi(e.s) - if err == nil { - return i, st - } else if len(e.s) >= 1 { - return int(e.s[0]), st + var i int + switch v := e.(type) { + case int: + i = v + case bool: + if v { + i = 1 + } else { + i = 0 } + case string: + i, _ = strconv.Atoi(v) } + return i, st[:len(st)-1] } return 0, st } func (st stack) PopBool() (bool, stack) { + var b bool if len(st) > 0 { e := st[len(st)-1] - st = st[:len(st)-1] - if e.isStr { - if e.s == "1" { - return true, st - } - return false, st - } else if e.i == 1 { - return true, st - } else { - return false, st + switch v := e.(type) { + case int: + b = v != 0 + case bool: + b = v + case string: + b = v != "" && v != "false" } + return b, st[:len(st)-1] } return false, st } -func (st stack) PushInt(i int) stack { - e := stackElem{ - i: i, - isInt: true, - } - return append(st, e) -} - -func (st stack) PushBool(i bool) stack { - if i { - return st.PushInt(1) - } - return st.PushInt(0) -} - // static vars var svars [26]string @@ -365,13 +357,13 @@ var pb = ¶msBuffer{} // TParm takes a terminfo parameterized string, such as setaf or cup, and // evaluates the string, and returns the result with the parameter // applied. -func (t *Terminfo) TParm(s string, p ...int) string { +func (t *Terminfo) TParm(s string, p ...interface{}) string { var stk stack var a, b string var ai, bi int var ab bool var dvars [26]string - var params [9]int + var params [9]interface{} pb.Start(s) @@ -406,14 +398,18 @@ func (t *Terminfo) TParm(s string, p ...int) string { pb.PutCh(ch) case 'i': // increment both parameters (ANSI cup support) - params[0]++ - params[1]++ + if i, ok := params[0].(int); ok { + params[0] = i + 1 + } + if i, ok := params[1].(int); ok { + params[1] = i + 1 + } case 'c', 's': // NB: these, and 'd' below are special cased for // efficiency. They could be handled by the richer // format support below, less efficiently. - a, stk = stk.Pop() + a, stk = stk.PopString() pb.PutString(a) case 'd': @@ -424,7 +420,7 @@ func (t *Terminfo) TParm(s string, p ...int) string { // This is pretty suboptimal, but this is rarely used. // None of the mainstream terminals use any of this, // and it would surprise me if this code is ever - // executed outside of test cases. + // executed outside test cases. f := "%" if ch == ':' { ch, _ = pb.NextCh() @@ -443,7 +439,7 @@ func (t *Terminfo) TParm(s string, p ...int) string { ai, stk = stk.PopInt() pb.PutString(fmt.Sprintf(f, ai)) case 'c', 's': - a, stk = stk.Pop() + a, stk = stk.PopString() pb.PutString(fmt.Sprintf(f, a)) } @@ -451,17 +447,17 @@ func (t *Terminfo) TParm(s string, p ...int) string { ch, _ = pb.NextCh() ai = int(ch - '1') if ai >= 0 && ai < len(params) { - stk = stk.PushInt(params[ai]) + stk = stk.Push(params[ai]) } else { - stk = stk.PushInt(0) + stk = stk.Push(0) } case 'P': // pop & store variable ch, _ = pb.NextCh() if ch >= 'A' && ch <= 'Z' { - svars[int(ch-'A')], stk = stk.Pop() + svars[int(ch-'A')], stk = stk.PopString() } else if ch >= 'a' && ch <= 'z' { - dvars[int(ch-'a')], stk = stk.Pop() + dvars[int(ch-'a')], stk = stk.PopString() } case 'g': // recall & push variable @@ -474,7 +470,7 @@ func (t *Terminfo) TParm(s string, p ...int) string { case '\'': // push(char) ch, _ = pb.NextCh() - pb.NextCh() // must be ' but we don't check + _, _ = pb.NextCh() // must be ' but we don't check stk = stk.Push(string(ch)) case '{': // push(int) @@ -486,82 +482,82 @@ func (t *Terminfo) TParm(s string, p ...int) string { ch, _ = pb.NextCh() } // ch must be '}' but no verification - stk = stk.PushInt(ai) + stk = stk.Push(ai) case 'l': // push(strlen(pop)) - a, stk = stk.Pop() - stk = stk.PushInt(len(a)) + a, stk = stk.PopString() + stk = stk.Push(len(a)) case '+': bi, stk = stk.PopInt() ai, stk = stk.PopInt() - stk = stk.PushInt(ai + bi) + stk = stk.Push(ai + bi) case '-': bi, stk = stk.PopInt() ai, stk = stk.PopInt() - stk = stk.PushInt(ai - bi) + stk = stk.Push(ai - bi) case '*': bi, stk = stk.PopInt() ai, stk = stk.PopInt() - stk = stk.PushInt(ai * bi) + stk = stk.Push(ai * bi) case '/': bi, stk = stk.PopInt() ai, stk = stk.PopInt() if bi != 0 { - stk = stk.PushInt(ai / bi) + stk = stk.Push(ai / bi) } else { - stk = stk.PushInt(0) + stk = stk.Push(0) } case 'm': // push(pop mod pop) bi, stk = stk.PopInt() ai, stk = stk.PopInt() if bi != 0 { - stk = stk.PushInt(ai % bi) + stk = stk.Push(ai % bi) } else { - stk = stk.PushInt(0) + stk = stk.Push(0) } case '&': // AND bi, stk = stk.PopInt() ai, stk = stk.PopInt() - stk = stk.PushInt(ai & bi) + stk = stk.Push(ai & bi) case '|': // OR bi, stk = stk.PopInt() ai, stk = stk.PopInt() - stk = stk.PushInt(ai | bi) + stk = stk.Push(ai | bi) case '^': // XOR bi, stk = stk.PopInt() ai, stk = stk.PopInt() - stk = stk.PushInt(ai ^ bi) + stk = stk.Push(ai ^ bi) case '~': // bit complement ai, stk = stk.PopInt() - stk = stk.PushInt(ai ^ -1) + stk = stk.Push(ai ^ -1) case '!': // logical NOT ai, stk = stk.PopInt() - stk = stk.PushBool(ai != 0) + stk = stk.Push(ai != 0) case '=': // numeric compare or string compare - b, stk = stk.Pop() - a, stk = stk.Pop() - stk = stk.PushBool(a == b) + b, stk = stk.PopString() + a, stk = stk.PopString() + stk = stk.Push(a == b) case '>': // greater than, numeric bi, stk = stk.PopInt() ai, stk = stk.PopInt() - stk = stk.PushBool(ai > bi) + stk = stk.Push(ai > bi) case '<': // less than, numeric bi, stk = stk.PopInt() ai, stk = stk.PopInt() - stk = stk.PushBool(ai < bi) + stk = stk.Push(ai < bi) case '?': // start conditional @@ -643,15 +639,15 @@ func (t *Terminfo) TPuts(w io.Writer, s string) { beg := strings.Index(s, "$<") if beg < 0 { // Most strings don't need padding, which is good news! - io.WriteString(w, s) + _, _ = io.WriteString(w, s) return } - io.WriteString(w, s[:beg]) + _, _ = io.WriteString(w, s[:beg]) s = s[beg+2:] end := strings.Index(s, ">") if end < 0 { // unterminated.. just emit bytes unadulterated - io.WriteString(w, "$<"+s) + _, _ = io.WriteString(w, "$<"+s) return } val := s[:end] @@ -722,7 +718,6 @@ func (t *Terminfo) TColor(fi, bi int) string { var ( dblock sync.Mutex terminfos = make(map[string]*Terminfo) - aliases = make(map[string]string) ) // AddTerminfo can be called to register a new Terminfo entry. diff --git a/vendor/github.com/gdamore/tcell/v2/tscreen.go b/vendor/github.com/gdamore/tcell/v2/tscreen.go index d0f73e54e..dcde34edd 100644 --- a/vendor/github.com/gdamore/tcell/v2/tscreen.go +++ b/vendor/github.com/gdamore/tcell/v2/tscreen.go @@ -1,4 +1,4 @@ -// Copyright 2021 The TCell Authors +// Copyright 2022 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. @@ -148,6 +148,11 @@ type tScreen struct { finiOnce sync.Once enablePaste string disablePaste string + enterUrl string + exitUrl string + setWinSize string + cursorStyles map[CursorStyle]string + cursorStyle CursorStyle saved *term.State stopQ chan struct{} running bool @@ -332,6 +337,54 @@ func (t *tScreen) prepareBracketedPaste() { } } +func (t *tScreen) prepareExtendedOSC() { + // More stuff for limits in terminfo. This time we are applying + // the most common OSC (operating system commands). Generally + // terminals that don't understand these will ignore them. + // Again, we condition this based on mouse capabilities. + if t.ti.EnterUrl != "" { + t.enterUrl = t.ti.EnterUrl + t.exitUrl = t.ti.ExitUrl + } else if t.ti.Mouse != "" { + t.enterUrl = "\x1b]8;;%p1%s\x1b\\" + t.exitUrl = "\x1b]8;;\x1b\\" + } + + if t.ti.SetWindowSize != "" { + t.setWinSize = t.ti.SetWindowSize + } else if t.ti.Mouse != "" { + t.setWinSize = "\x1b[8;%p1%p2%d;%dt" + } +} + +func (t *tScreen) prepareCursorStyles() { + // Another workaround for lack of reporting in terminfo. + // We assume if the terminal has a mouse entry, that it + // offers bracketed paste. But we allow specific overrides + // via our terminal database. + if t.ti.CursorDefault != "" { + t.cursorStyles = map[CursorStyle]string{ + CursorStyleDefault: t.ti.CursorDefault, + CursorStyleBlinkingBlock: t.ti.CursorBlinkingBlock, + CursorStyleSteadyBlock: t.ti.CursorSteadyBlock, + CursorStyleBlinkingUnderline: t.ti.CursorBlinkingUnderline, + CursorStyleSteadyUnderline: t.ti.CursorSteadyUnderline, + CursorStyleBlinkingBar: t.ti.CursorBlinkingBar, + CursorStyleSteadyBar: t.ti.CursorSteadyBar, + } + } else if t.ti.Mouse != "" { + t.cursorStyles = map[CursorStyle]string{ + CursorStyleDefault: "\x1b[0 q", + CursorStyleBlinkingBlock: "\x1b[1 q", + CursorStyleSteadyBlock: "\x1b[2 q", + CursorStyleBlinkingUnderline: "\x1b[3 q", + CursorStyleSteadyUnderline: "\x1b[4 q", + CursorStyleBlinkingBar: "\x1b[5 q", + CursorStyleSteadyBar: "\x1b[6 q", + } + } +} + func (t *tScreen) prepareKey(key Key, val string) { t.prepareKeyMod(key, ModNone, val) } @@ -471,6 +524,8 @@ func (t *tScreen) prepareKeys() { t.prepareKey(keyPasteEnd, ti.PasteEnd) t.prepareXtermModifiers() t.prepareBracketedPaste() + t.prepareCursorStyles() + t.prepareExtendedOSC() outer: // Add key mappings for control keys. @@ -517,6 +572,18 @@ func (t *tScreen) SetStyle(style Style) { func (t *tScreen) Clear() { t.Fill(' ', t.style) + t.Lock() + t.clear = true + w, h := t.cells.Size() + // because we are going to clear (see t.clear) in the next cycle, + // let's also unmark the dirty bit so that we don't waste cycles + // drawing things that are already dealt with via the clear escape sequence. + for row := 0; row < h; row++ { + for col := 0; col < w; col++ { + t.cells.SetDirty(col, row, false) + } + } + t.Unlock() } func (t *tScreen) Fill(r rune, style Style) { @@ -580,11 +647,27 @@ func (t *tScreen) encodeRune(r rune, buf []byte) []byte { return buf } -func (t *tScreen) sendFgBg(fg Color, bg Color) { +func (t *tScreen) sendFgBg(fg Color, bg Color, attr AttrMask) AttrMask { ti := t.ti if ti.Colors == 0 { - return + // foreground vs background, we calculate luminance + // and possibly do a reverse video + if !fg.Valid() { + return attr + } + v, ok := t.colors[fg] + if !ok { + v = FindColor(fg, []Color{ColorBlack, ColorWhite}) + t.colors[fg] = v + } + switch v { + case ColorWhite: + return attr + case ColorBlack: + return attr ^ AttrReverse + } } + if fg == ColorReset || bg == ColorReset { t.TPuts(ti.ResetFgBg) } @@ -595,7 +678,7 @@ func (t *tScreen) sendFgBg(fg Color, bg Color) { t.TPuts(ti.TParm(ti.SetFgBgRGB, int(r1), int(g1), int(b1), int(r2), int(g2), int(b2))) - return + return attr } if fg.IsRGB() && ti.SetFgRGB != "" { @@ -642,6 +725,7 @@ func (t *tScreen) sendFgBg(fg Color, bg Color) { t.TPuts(ti.TParm(ti.SetBg, int(bg&0xff))) } } + return attr } func (t *tScreen) drawCell(x, y int) int { @@ -684,7 +768,7 @@ func (t *tScreen) drawCell(x, y int) int { t.TPuts(ti.AttrOff) - t.sendFgBg(fg, bg) + attrs = t.sendFgBg(fg, bg, attrs) if attrs&AttrBold != 0 { t.TPuts(ti.Bold) } @@ -706,8 +790,19 @@ func (t *tScreen) drawCell(x, y int) int { if attrs&AttrStrikeThrough != 0 { t.TPuts(ti.StrikeThrough) } + + // URL string can be long, so don't send it unless we really need to + if t.enterUrl != "" && t.curstyle != style { + if style.url != "" { + t.TPuts(ti.TParm(t.enterUrl, style.url)) + } else { + t.TPuts(t.exitUrl) + } + } + t.curstyle = style } + // now emit runes - taking care to not overrun width with a // wide character, and to ensure that we emit exactly one regular // character followed up by any residual combing characters @@ -754,6 +849,12 @@ func (t *tScreen) ShowCursor(x, y int) { t.Unlock() } +func (t *tScreen) SetCursorStyle(cs CursorStyle) { + t.Lock() + t.cursorStyle = cs + t.Unlock() +} + func (t *tScreen) HideCursor() { t.ShowCursor(-1, -1) } @@ -768,6 +869,11 @@ func (t *tScreen) showCursor() { } t.TPuts(t.ti.TGoto(x, y)) t.TPuts(t.ti.ShowCursor) + if t.cursorStyles != nil { + if esc, ok := t.cursorStyles[t.cursorStyle]; ok { + t.TPuts(esc) + } + } t.cx = x t.cy = y } @@ -804,8 +910,10 @@ func (t *tScreen) Show() { } func (t *tScreen) clearScreen() { + t.TPuts(t.ti.AttrOff) + t.TPuts(t.exitUrl) fg, bg, _ := t.style.Decompose() - t.sendFgBg(fg, bg) + _ = t.sendFgBg(fg, bg, AttrNone) t.TPuts(t.ti.Clear) t.clear = false } @@ -823,9 +931,11 @@ func (t *tScreen) hideCursor() { } func (t *tScreen) draw() { - // clobber cursor position, because we're gonna change it all + // clobber cursor position, because we're going to change it all t.cx = -1 t.cy = -1 + // make no style assumptions + t.curstyle = styleInvalid t.buf.Reset() t.buffering = true @@ -894,8 +1004,9 @@ func (t *tScreen) enableMouse(f MouseFlags) { if f&MouseMotionEvents != 0 { t.TPuts("\x1b[?1003h") } - - t.TPuts("\x1b[?1006h") + if f&(MouseButtonEvents|MouseDragEvents|MouseMotionEvents) != 0 { + t.TPuts("\x1b[?1006h") + } } } @@ -1008,7 +1119,7 @@ func (t *tScreen) HasPendingEvent() bool { // the terminals Alternate Character Set to represent other glyphs. // For example, the upper left corner of the box drawing set can be // displayed by printing "l" while in the alternate character set. -// Its not quite that simple, since the "l" is the terminfo name, +// It's not quite that simple, since the "l" is the terminfo name, // and it may be necessary to use a different character based on // the terminal implementation (or the terminal may lack support for // this altogether). See buildAcsMap below for detail. @@ -1529,7 +1640,7 @@ func (t *tScreen) mainLoop(stopQ chan struct{}) { case <-t.keytimer.C: // If the timer fired, and the current time // is after the expiration of the escape sequence, - // then we assume the escape sequence reached it's + // then we assume the escape sequence reached its // conclusion, and process the chunk independently. // This lets us detect conflicts such as a lone ESC. if buf.Len() > 0 { @@ -1658,6 +1769,14 @@ func (t *tScreen) HasKey(k Key) bool { return t.keyexist[k] } +func (t *tScreen) SetSize(w, h int) { + if t.setWinSize != "" { + t.TPuts(t.ti.TParm(t.setWinSize, w, h)) + } + t.cells.Invalidate() + t.resize() +} + func (t *tScreen) Resize(int, int, int, int) {} func (t *tScreen) Suspend() error { @@ -1670,7 +1789,7 @@ func (t *tScreen) Resume() error { } // engage is used to place the terminal in raw mode and establish screen size, etc. -// Thing of this is as tcell "engaging" the clutch, as it's going to be driving the +// Think of this is as tcell "engaging" the clutch, as it's going to be driving the // terminal interface. func (t *tScreen) engage() error { t.Lock() @@ -1737,6 +1856,9 @@ func (t *tScreen) disengage() { ti := t.ti t.cells.Resize(0, 0) t.TPuts(ti.ShowCursor) + if t.cursorStyles != nil && t.cursorStyle != CursorStyleDefault { + t.TPuts(t.cursorStyles[t.cursorStyle]) + } t.TPuts(ti.ResetFgBg) t.TPuts(ti.AttrOff) t.TPuts(ti.Clear) diff --git a/vendor/github.com/gdamore/tcell/v2/tty_unix.go b/vendor/github.com/gdamore/tcell/v2/tty_unix.go index dbd961bbf..aa6b7d5a8 100644 --- a/vendor/github.com/gdamore/tcell/v2/tty_unix.go +++ b/vendor/github.com/gdamore/tcell/v2/tty_unix.go @@ -72,7 +72,6 @@ func (tty *devTty) Start() error { if tty.f, err = os.OpenFile(tty.dev, os.O_RDWR, 0); err != nil { return err } - tty.fd = int(tty.f.Fd()) if !term.IsTerminal(tty.fd) { return errors.New("device is not a terminal") diff --git a/vendor/github.com/go-errors/errors/README.md b/vendor/github.com/go-errors/errors/README.md index 2ee13f117..3d7852594 100644 --- a/vendor/github.com/go-errors/errors/README.md +++ b/vendor/github.com/go-errors/errors/README.md @@ -79,3 +79,4 @@ This package is licensed under the MIT license, see LICENSE.MIT for details. > ``` * v1.4.0 *BREAKING* v1.4.0 reverted all changes from v1.3.0 and is identical to v1.2.0 * v1.4.1 no code change, but now without an unnecessary cover.out file. +* v1.4.2 performance improvement to ErrorStack() to avoid unnecessary work https://github.com/go-errors/errors/pull/40 diff --git a/vendor/github.com/go-errors/errors/go.mod b/vendor/github.com/go-errors/errors/go.mod deleted file mode 100644 index a70bad1b2..000000000 --- a/vendor/github.com/go-errors/errors/go.mod +++ /dev/null @@ -1,6 +0,0 @@ -module github.com/go-errors/errors - -go 1.14 - -// Was not API-compatible with earlier or later releases. -retract v1.3.0 diff --git a/vendor/github.com/go-errors/errors/stackframe.go b/vendor/github.com/go-errors/errors/stackframe.go index f420849d2..ef4a8b3f3 100644 --- a/vendor/github.com/go-errors/errors/stackframe.go +++ b/vendor/github.com/go-errors/errors/stackframe.go @@ -53,7 +53,7 @@ func (frame *StackFrame) Func() *runtime.Func { func (frame *StackFrame) String() string { str := fmt.Sprintf("%s:%d (0x%x)\n", frame.File, frame.LineNumber, frame.ProgramCounter) - source, err := frame.SourceLine() + source, err := frame.sourceLine() if err != nil { return str } @@ -63,13 +63,21 @@ func (frame *StackFrame) String() string { // SourceLine gets the line of code (from File and Line) of the original source if possible. func (frame *StackFrame) SourceLine() (string, error) { + source, err := frame.sourceLine() + if err != nil { + return source, New(err) + } + return source, err +} + +func (frame *StackFrame) sourceLine() (string, error) { if frame.LineNumber <= 0 { return "???", nil } file, err := os.Open(frame.File) if err != nil { - return "", New(err) + return "", err } defer file.Close() @@ -82,7 +90,7 @@ func (frame *StackFrame) SourceLine() (string, error) { currentLine++ } if err := scanner.Err(); err != nil { - return "", New(err) + return "", err } return "???", nil diff --git a/vendor/github.com/go-git/go-billy/v5/go.mod b/vendor/github.com/go-git/go-billy/v5/go.mod deleted file mode 100644 index 78ce0af2a..000000000 --- a/vendor/github.com/go-git/go-billy/v5/go.mod +++ /dev/null @@ -1,10 +0,0 @@ -module github.com/go-git/go-billy/v5 - -require ( - github.com/kr/text v0.2.0 // indirect - github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect - golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 - gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f -) - -go 1.13 diff --git a/vendor/github.com/go-git/go-billy/v5/go.sum b/vendor/github.com/go-git/go-billy/v5/go.sum deleted file mode 100644 index cdc052bc7..000000000 --- a/vendor/github.com/go-git/go-billy/v5/go.sum +++ /dev/null @@ -1,14 +0,0 @@ -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/go-git/go-billy v1.0.0 h1:bXR6Zu3opPSg0R4dDxqaLglY4rxw7ja7wS16qSpOKL4= -github.com/go-git/go-billy v3.1.0+incompatible h1:dwrJ8G2Jt1srYgIJs+lRjA36qBY68O2Lg5idKG8ef5M= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 h1:uYVVQ9WP/Ds2ROhcaGPeIdVq0RIXVLwsHlnvJ+cT1So= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/vendor/github.com/go-logfmt/logfmt/go.mod b/vendor/github.com/go-logfmt/logfmt/go.mod deleted file mode 100644 index df7192988..000000000 --- a/vendor/github.com/go-logfmt/logfmt/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/go-logfmt/logfmt - -go 1.13 diff --git a/vendor/github.com/golang-collections/collections/LICENSE b/vendor/github.com/golang-collections/collections/LICENSE deleted file mode 100644 index 863a984da..000000000 --- a/vendor/github.com/golang-collections/collections/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2012 Caleb Doxsey - -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. \ No newline at end of file diff --git a/vendor/github.com/golang-collections/collections/stack/stack.go b/vendor/github.com/golang-collections/collections/stack/stack.go deleted file mode 100644 index 11f472a9b..000000000 --- a/vendor/github.com/golang-collections/collections/stack/stack.go +++ /dev/null @@ -1,44 +0,0 @@ -package stack - -type ( - Stack struct { - top *node - length int - } - node struct { - value interface{} - prev *node - } -) -// Create a new stack -func New() *Stack { - return &Stack{nil,0} -} -// Return the number of items in the stack -func (this *Stack) Len() int { - return this.length -} -// View the top item on the stack -func (this *Stack) Peek() interface{} { - if this.length == 0 { - return nil - } - return this.top.value -} -// Pop the top item of the stack and return it -func (this *Stack) Pop() interface{} { - if this.length == 0 { - return nil - } - - n := this.top - this.top = n.prev - this.length-- - return n.value -} -// Push a value onto the top of the stack -func (this *Stack) Push(value interface{}) { - n := &node{value,this.top} - this.top = n - this.length++ -} \ No newline at end of file diff --git a/vendor/github.com/gookit/color/go.mod b/vendor/github.com/gookit/color/go.mod deleted file mode 100644 index cd94efc3a..000000000 --- a/vendor/github.com/gookit/color/go.mod +++ /dev/null @@ -1,9 +0,0 @@ -module github.com/gookit/color - -go 1.12 - -require ( - github.com/stretchr/testify v1.6.1 - github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 - golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44 -) diff --git a/vendor/github.com/gookit/color/go.sum b/vendor/github.com/gookit/color/go.sum deleted file mode 100644 index 2d67cba01..000000000 --- a/vendor/github.com/gookit/color/go.sum +++ /dev/null @@ -1,15 +0,0 @@ -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8= -github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44 h1:Bli41pIlzTzf3KEY06n+xnzK/BESIg2ze4Pgfh/aI8c= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/vendor/github.com/imdario/mergo/go.mod b/vendor/github.com/imdario/mergo/go.mod deleted file mode 100644 index 3d689d93e..000000000 --- a/vendor/github.com/imdario/mergo/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module github.com/imdario/mergo - -go 1.13 - -require gopkg.in/yaml.v2 v2.3.0 diff --git a/vendor/github.com/imdario/mergo/go.sum b/vendor/github.com/imdario/mergo/go.sum deleted file mode 100644 index 168980da5..000000000 --- a/vendor/github.com/imdario/mergo/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/integrii/flaggy/go.mod b/vendor/github.com/integrii/flaggy/go.mod deleted file mode 100644 index 5f87729d1..000000000 --- a/vendor/github.com/integrii/flaggy/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/integrii/flaggy - -go 1.12 diff --git a/vendor/github.com/jesseduffield/generics/LICENSE b/vendor/github.com/jesseduffield/generics/LICENSE new file mode 100644 index 000000000..2a7175dcc --- /dev/null +++ b/vendor/github.com/jesseduffield/generics/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Jesse Duffield + +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. diff --git a/vendor/github.com/jesseduffield/generics/maps/maps.go b/vendor/github.com/jesseduffield/generics/maps/maps.go new file mode 100644 index 000000000..9d41a3303 --- /dev/null +++ b/vendor/github.com/jesseduffield/generics/maps/maps.go @@ -0,0 +1,53 @@ +package maps + +func Keys[Key comparable, Value any](m map[Key]Value) []Key { + keys := make([]Key, 0, len(m)) + for key := range m { + keys = append(keys, key) + } + return keys +} + +func Values[Key comparable, Value any](m map[Key]Value) []Value { + values := make([]Value, 0, len(m)) + for _, value := range m { + values = append(values, value) + } + return values +} + +func TransformValues[Key comparable, Value any, NewValue any]( + m map[Key]Value, fn func(Value) NewValue, +) map[Key]NewValue { + output := make(map[Key]NewValue) + for key, value := range m { + output[key] = fn(value) + } + return output +} + +func TransformKeys[Key comparable, Value any, NewKey comparable](m map[Key]Value, fn func(Key) NewKey) map[NewKey]Value { + output := make(map[NewKey]Value) + for key, value := range m { + output[fn(key)] = value + } + return output +} + +func MapToSlice[Key comparable, Value any, Mapped any](m map[Key]Value, f func(Key, Value) Mapped) []Mapped { + output := make([]Mapped, 0, len(m)) + for key, value := range m { + output = append(output, f(key, value)) + } + return output +} + +func Filter[Key comparable, Value any](m map[Key]Value, f func(Key, Value) bool) map[Key]Value { + output := map[Key]Value{} + for key, value := range m { + if f(key, value) { + output[key] = value + } + } + return output +} diff --git a/vendor/github.com/jesseduffield/generics/set/set.go b/vendor/github.com/jesseduffield/generics/set/set.go new file mode 100644 index 000000000..3e1bb69a3 --- /dev/null +++ b/vendor/github.com/jesseduffield/generics/set/set.go @@ -0,0 +1,45 @@ +package set + +import "github.com/jesseduffield/generics/maps" + +type Set[T comparable] struct { + hashMap map[T]bool +} + +func New[T comparable]() *Set[T] { + return &Set[T]{hashMap: make(map[T]bool)} +} + +func NewFromSlice[T comparable](slice []T) *Set[T] { + hashMap := make(map[T]bool) + for _, value := range slice { + hashMap[value] = true + } + + return &Set[T]{hashMap: hashMap} +} + +func (s *Set[T]) Add(values ...T) { + for _, value := range values { + s.hashMap[value] = true + } +} + +func (s *Set[T]) Remove(value T) { + delete(s.hashMap, value) +} + +func (s *Set[T]) RemoveSlice(slice []T) { + for _, value := range slice { + s.Remove(value) + } +} + +func (s *Set[T]) Includes(value T) bool { + return s.hashMap[value] +} + +// output slice is not necessarily in the same order that items were added +func (s *Set[T]) ToSlice() []T { + return maps.Keys(s.hashMap) +} diff --git a/vendor/github.com/jesseduffield/generics/slices/delegated_slices.go b/vendor/github.com/jesseduffield/generics/slices/delegated_slices.go new file mode 100644 index 000000000..015935331 --- /dev/null +++ b/vendor/github.com/jesseduffield/generics/slices/delegated_slices.go @@ -0,0 +1,117 @@ +package slices + +import ( + "golang.org/x/exp/constraints" + "golang.org/x/exp/slices" +) + +// This file delegates to the official slices package, so that we end up with a superset of the official API. + +// Equal reports whether two slices are equal: the same length and all +// elements equal. If the lengths are different, Equal returns false. +// Otherwise, the elements are compared in increasing index order, and the +// comparison stops at the first unequal pair. +// Floating point NaNs are not considered equal. +func Equal[E comparable](s1, s2 []E) bool { + return slices.Equal(s1, s2) +} + +// EqualFunc reports whether two slices are equal using a comparison +// function on each pair of elements. If the lengths are different, +// EqualFunc returns false. Otherwise, the elements are compared in +// increasing index order, and the comparison stops at the first index +// for which eq returns false. +func EqualFunc[E1, E2 any](s1 []E1, s2 []E2, eq func(E1, E2) bool) bool { + return slices.EqualFunc(s1, s2, eq) +} + +// Compare compares the elements of s1 and s2. +// The elements are compared sequentially, starting at index 0, +// until one element is not equal to the other. +// The result of comparing the first non-matching elements is returned. +// If both slices are equal until one of them ends, the shorter slice is +// considered less than the longer one. +// The result is 0 if s1 == s2, -1 if s1 < s2, and +1 if s1 > s2. +// Comparisons involving floating point NaNs are ignored. +func Compare[E constraints.Ordered](s1, s2 []E) int { + return slices.Compare(s1, s2) +} + +// CompareFunc is like Compare but uses a comparison function +// on each pair of elements. The elements are compared in increasing +// index order, and the comparisons stop after the first time cmp +// returns non-zero. +// The result is the first non-zero result of cmp; if cmp always +// returns 0 the result is 0 if len(s1) == len(s2), -1 if len(s1) < len(s2), +// and +1 if len(s1) > len(s2). +func CompareFunc[E1, E2 any](s1 []E1, s2 []E2, cmp func(E1, E2) int) int { + return slices.CompareFunc(s1, s2, cmp) +} + +// Index returns the index of the first occurrence of v in s, +// or -1 if not present. +func Index[E comparable](s []E, v E) int { + return slices.Index(s, v) +} + +// IndexFunc returns the first index i satisfying f(s[i]), +// or -1 if none do. +func IndexFunc[E any](s []E, f func(E) bool) int { + return slices.IndexFunc(s, f) +} + +// Contains reports whether v is present in s. +func Contains[E comparable](s []E, v E) bool { + return slices.Contains(s, v) +} + +// Insert inserts the values v... into s at index i, +// returning the modified slice. +// In the returned slice r, r[i] == v[0]. +// Insert panics if i is out of range. +// This function is O(len(s) + len(v)). +func Insert[S ~[]E, E any](s S, i int, v ...E) S { + return slices.Insert(s, i, v...) +} + +// Delete removes the elements s[i:j] from s, returning the modified slice. +// Delete panics if s[i:j] is not a valid slice of s. +// Delete modifies the contents of the slice s; it does not create a new slice. +// Delete is O(len(s)-(j-i)), so if many items must be deleted, it is better to +// make a single call deleting them all together than to delete one at a time. +func Delete[S ~[]E, E any](s S, i, j int) S { + return slices.Delete(s, i, j) +} + +// Clone returns a copy of the slice. +// The elements are copied using assignment, so this is a shallow clone. +func Clone[S ~[]E, E any](s S) S { + return slices.Clone(s) +} + +// Compact replaces consecutive runs of equal elements with a single copy. +// This is like the uniq command found on Unix. +// Compact modifies the contents of the slice s; it does not create a new slice. +// Intended usage is to assign the result back to the input slice. +func Compact[S ~[]E, E comparable](s S) S { + return slices.Compact(s) +} + +// CompactFunc is like Compact but uses a comparison function. +func CompactFunc[S ~[]E, E any](s S, eq func(E, E) bool) S { + return slices.CompactFunc(s, eq) +} + +// Grow increases the slice's capacity, if necessary, to guarantee space for +// another n elements. After Grow(n), at least n elements can be appended +// to the slice without another allocation. Grow may modify elements of the +// slice between the length and the capacity. If n is negative or too large to +// allocate the memory, Grow panics. +func Grow[S ~[]E, E any](s S, n int) S { + return slices.Grow(s, n) +} + +// Clip removes unused capacity from the slice, returning s[:len(s):len(s)]. +func Clip[S ~[]E, E any](s S) S { + return slices.Clip(s) +} diff --git a/vendor/github.com/jesseduffield/generics/slices/delegated_sort.go b/vendor/github.com/jesseduffield/generics/slices/delegated_sort.go new file mode 100644 index 000000000..0741f0c55 --- /dev/null +++ b/vendor/github.com/jesseduffield/generics/slices/delegated_sort.go @@ -0,0 +1,57 @@ +package slices + +import ( + "golang.org/x/exp/constraints" + "golang.org/x/exp/slices" +) + +// This file delegates to the official slices package, so that we end up with a superset of the official API. + +// Sort sorts a slice of any ordered type in ascending order. +func Sort[E constraints.Ordered](x []E) { + slices.Sort(x) +} + +// Sort sorts the slice x in ascending order as determined by the less function. +// This sort is not guaranteed to be stable. +func SortFunc[E any](x []E, less func(a, b E) bool) { + slices.SortFunc(x, less) +} + +// SortStable sorts the slice x while keeping the original order of equal +// elements, using less to compare elements. +func SortStableFunc[E any](x []E, less func(a, b E) bool) { + slices.SortStableFunc(x, less) +} + +// IsSorted reports whether x is sorted in ascending order. +func IsSorted[E constraints.Ordered](x []E) bool { + return slices.IsSorted(x) +} + +// IsSortedFunc reports whether x is sorted in ascending order, with less as the +// comparison function. +func IsSortedFunc[E any](x []E, less func(a, b E) bool) bool { + return slices.IsSortedFunc(x, less) +} + +// BinarySearch searches for target in a sorted slice and returns the smallest +// index at which target is found. If the target is not found, the index at +// which it could be inserted into the slice is returned; therefore, if the +// intention is to find target itself a separate check for equality with the +// element at the returned index is required. +func BinarySearch[E constraints.Ordered](x []E, target E) int { + return slices.BinarySearch(x, target) +} + +// BinarySearchFunc uses binary search to find and return the smallest index i +// in [0, n) at which ok(i) is true, assuming that on the range [0, n), +// ok(i) == true implies ok(i+1) == true. That is, BinarySearchFunc requires +// that ok is false for some (possibly empty) prefix of the input range [0, n) +// and then true for the (possibly empty) remainder; BinarySearchFunc returns +// the first true index. If there is no such index, BinarySearchFunc returns n. +// (Note that the "not found" return value is not -1 as in, for instance, +// strings.Index.) Search calls ok(i) only for i in the range [0, n). +func BinarySearchFunc[E any](x []E, ok func(E) bool) int { + return slices.BinarySearchFunc(x, ok) +} diff --git a/vendor/github.com/jesseduffield/generics/slices/slices.go b/vendor/github.com/jesseduffield/generics/slices/slices.go new file mode 100644 index 000000000..5bfb19968 --- /dev/null +++ b/vendor/github.com/jesseduffield/generics/slices/slices.go @@ -0,0 +1,408 @@ +package slices + +import ( + "golang.org/x/exp/constraints" + "golang.org/x/exp/slices" +) + +// This file contains the new functions that do not live in the official slices package. + +func Some[T any](slice []T, test func(T) bool) bool { + for _, value := range slice { + if test(value) { + return true + } + } + + return false +} + +func Every[T any](slice []T, test func(T) bool) bool { + for _, value := range slice { + if !test(value) { + return false + } + } + + return true +} + +// Produces a new slice, leaves the input slice untouched. +func Map[T any, V any](slice []T, f func(T) V) []V { + result := make([]V, 0, len(slice)) + for _, value := range slice { + result = append(result, f(value)) + } + + return result +} + +// Produces a new slice, leaves the input slice untouched. +func MapWithIndex[T any, V any](slice []T, f func(T, int) V) []V { + result := make([]V, 0, len(slice)) + for i, value := range slice { + result = append(result, f(value, i)) + } + + return result +} + +func TryMap[T any, V any](slice []T, f func(T) (V, error)) ([]V, error) { + result := make([]V, 0, len(slice)) + for _, value := range slice { + output, err := f(value) + if err != nil { + return nil, err + } + result = append(result, output) + } + + return result, nil +} + +func TryMapWithIndex[T any, V any](slice []T, f func(T, int) (V, error)) ([]V, error) { + result := make([]V, 0, len(slice)) + for i, value := range slice { + output, err := f(value, i) + if err != nil { + return nil, err + } + result = append(result, output) + } + + return result, nil +} + +// Produces a new slice, leaves the input slice untouched. +func FlatMap[T any, V any](slice []T, f func(T) []V) []V { + // impossible to know how long this slice will be in the end but the length + // of the original slice is the lower bound + result := make([]V, 0, len(slice)) + for _, value := range slice { + result = append(result, f(value)...) + } + + return result +} + +func FlatMapWithIndex[T any, V any](slice []T, f func(T, int) []V) []V { + // impossible to know how long this slice will be in the end but the length + // of the original slice is the lower bound + result := make([]V, 0, len(slice)) + for i, value := range slice { + result = append(result, f(value, i)...) + } + + return result +} + +func Flatten[T any](slice [][]T) []T { + result := make([]T, 0, len(slice)) + for _, subSlice := range slice { + result = append(result, subSlice...) + } + return result +} + +func MapInPlace[T any](slice []T, f func(T) T) { + for i, value := range slice { + slice[i] = f(value) + } +} + +// Produces a new slice, leaves the input slice untouched. +func Filter[T any](slice []T, test func(T) bool) []T { + result := make([]T, 0) + for _, element := range slice { + if test(element) { + result = append(result, element) + } + } + return result +} + +// Produces a new slice, leaves the input slice untouched. +func FilterWithIndex[T any](slice []T, f func(T, int) bool) []T { + result := make([]T, 0, len(slice)) + for i, value := range slice { + if f(value, i) { + result = append(result, value) + } + } + + return result +} + +func TryFilter[T any](slice []T, test func(T) (bool, error)) ([]T, error) { + result := make([]T, 0) + for _, element := range slice { + ok, err := test(element) + if err != nil { + return nil, err + } + if ok { + result = append(result, element) + } + } + return result, nil +} + +func TryFilterWithIndex[T any](slice []T, test func(T, int) (bool, error)) ([]T, error) { + result := make([]T, 0) + for i, element := range slice { + ok, err := test(element, i) + if err != nil { + return nil, err + } + if ok { + result = append(result, element) + } + } + return result, nil +} + +// Mutates original slice. Intended usage is to reassign the slice result to the input slice. +func FilterInPlace[T any](slice []T, test func(T) bool) []T { + newLength := 0 + for _, element := range slice { + if test(element) { + slice[newLength] = element + newLength++ + } + } + + return slice[:newLength] +} + +// Produces a new slice, leaves the input slice untouched +func Reverse[T any](slice []T) []T { + result := make([]T, len(slice)) + for i := range slice { + result[i] = slice[len(slice)-1-i] + } + return result +} + +func ReverseInPlace[T any](slice []T) { + for i, j := 0, len(slice)-1; i < j; i, j = i+1, j-1 { + slice[i], slice[j] = slice[j], slice[i] + } +} + +// Produces a new slice, leaves the input slice untouched. +func FilterMap[T any, E any](slice []T, test func(T) (E, bool)) []E { + result := make([]E, 0, len(slice)) + for _, element := range slice { + mapped, ok := test(element) + if ok { + result = append(result, mapped) + } + } + + return result +} + +func FilterMapWithIndex[T any, E any](slice []T, test func(T, int) (E, bool)) []E { + result := make([]E, 0, len(slice)) + for i, element := range slice { + mapped, ok := test(element, i) + if ok { + result = append(result, mapped) + } + } + + return result +} + +func TryFilterMap[T any, E any](slice []T, test func(T) (E, bool, error)) ([]E, error) { + result := make([]E, 0, len(slice)) + for _, element := range slice { + mapped, ok, err := test(element) + if err != nil { + return nil, err + } + if ok { + result = append(result, mapped) + } + } + + return result, nil +} + +func TryFilterMapWithIndex[T any, E any](slice []T, test func(T, int) (E, bool, error)) ([]E, error) { + result := make([]E, 0, len(slice)) + for i, element := range slice { + mapped, ok, err := test(element, i) + if err != nil { + return nil, err + } + if ok { + result = append(result, mapped) + } + } + + return result, nil +} + +// Prepends items to the beginning of a slice. +// E.g. Prepend([]int{1,2}, 3, 4) = []int{3,4,1,2} +// Mutates original slice. Intended usage is to reassign the slice result to the input slice. +func Prepend[T any](slice []T, values ...T) []T { + return append(values, slice...) +} + +// Removes the element at the given index. Intended usage is to reassign the result to the input slice. +func Remove[T any](slice []T, index int) []T { + return slices.Delete(slice, index, index+1) +} + +// Removes the element at the 'fromIndex' and then inserts it at 'toIndex'. +// Operates on the input slice. Expected use is to reassign the result to the input slice. +func Move[T any](slice []T, fromIndex int, toIndex int) []T { + item := slice[fromIndex] + slice = Remove(slice, fromIndex) + return slices.Insert(slice, toIndex, item) +} + +// Swaps two elements at the given indices. +// Operates on the input slice. +func Swap[T any](slice []T, index1 int, index2 int) { + slice[index1], slice[index2] = slice[index2], slice[index1] +} + +// Similar to Append but we leave the original slice untouched and return a new slice +func Concat[T any](slice []T, values ...T) []T { + newSlice := make([]T, 0, len(slice)+len(values)) + newSlice = append(newSlice, slice...) + newSlice = append(newSlice, values...) + return newSlice +} + +func ContainsFunc[T any](slice []T, f func(T) bool) bool { + return IndexFunc(slice, f) != -1 +} + +// Pops item from the end of the slice and returns it, along with the updated slice +// Mutates original slice. Intended usage is to reassign the slice result to the input slice. +func Pop[T any](slice []T) (T, []T) { + index := len(slice) - 1 + value := slice[index] + slice = slice[0:index] + return value, slice +} + +// Shifts item from the beginning of the slice and returns it, along with the updated slice. +// Mutates original slice. Intended usage is to reassign the slice result to the input slice. +func Shift[T any](slice []T) (T, []T) { + value := slice[0] + slice = slice[1:] + return value, slice +} + +func Partition[T any](slice []T, test func(T) bool) ([]T, []T) { + left := make([]T, 0, len(slice)) + right := make([]T, 0, len(slice)) + + for _, value := range slice { + if test(value) { + left = append(left, value) + } else { + right = append(right, value) + } + } + + return left, right +} + +func MaxBy[T any, V constraints.Ordered](slice []T, f func(T) V) V { + if len(slice) == 0 { + return zero[V]() + } + + max := f(slice[0]) + for _, element := range slice[1:] { + value := f(element) + if value > max { + max = value + } + } + return max +} + +func MinBy[T any, V constraints.Ordered](slice []T, f func(T) V) V { + if len(slice) == 0 { + return zero[V]() + } + + min := f(slice[0]) + for _, element := range slice[1:] { + value := f(element) + if value < min { + min = value + } + } + return min +} + +func Find[T any](slice []T, f func(T) bool) (T, bool) { + for _, element := range slice { + if f(element) { + return element, true + } + } + return zero[T](), false +} + +// Sometimes you need to find an element and then map it to some other value based on +// information you obtained while finding it. This function lets you do that +func FindMap[T any, V any](slice []T, f func(T) (V, bool)) (V, bool) { + for _, element := range slice { + if value, ok := f(element); ok { + return value, true + } + } + return zero[V](), false +} + +func ForEach[T any](slice []T, f func(T)) { + for _, element := range slice { + f(element) + } +} + +func ForEachWithIndex[T any](slice []T, f func(T, int)) { + for i, element := range slice { + f(element, i) + } +} + +func TryForEach[T any](slice []T, f func(T) error) error { + for _, element := range slice { + if err := f(element); err != nil { + return err + } + } + return nil +} + +func TryForEachWithIndex[T any](slice []T, f func(T, int) error) error { + for i, element := range slice { + if err := f(element, i); err != nil { + return err + } + } + return nil +} + +func Sum[T constraints.Ordered](i []T) T { + sum := zero[T]() + for _, value := range i { + sum += value + } + return sum +} + +func zero[T any]() T { + var value T + return value +} diff --git a/vendor/github.com/jesseduffield/go-git/v5/go.mod b/vendor/github.com/jesseduffield/go-git/v5/go.mod deleted file mode 100644 index c6a9be01f..000000000 --- a/vendor/github.com/jesseduffield/go-git/v5/go.mod +++ /dev/null @@ -1,28 +0,0 @@ -module github.com/jesseduffield/go-git/v5 - -require ( - github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 // indirect - github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 - github.com/emirpasic/gods v1.12.0 - github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 // indirect - github.com/gliderlabs/ssh v0.2.2 - github.com/go-git/gcfg v1.5.0 - github.com/go-git/go-billy/v5 v5.0.0 - github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12 - github.com/google/go-cmp v0.3.0 - github.com/imdario/mergo v0.3.9 - github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 - github.com/jessevdk/go-flags v1.4.0 - github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd - github.com/mitchellh/go-homedir v1.1.0 - github.com/pkg/errors v0.8.1 // indirect - github.com/sergi/go-diff v1.1.0 - github.com/xanzy/ssh-agent v0.2.1 - golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073 - golang.org/x/net v0.0.0-20200301022130-244492dfa37a - golang.org/x/text v0.3.2 - gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f - gopkg.in/warnings.v0 v0.1.2 // indirect -) - -go 1.13 diff --git a/vendor/github.com/jesseduffield/go-git/v5/go.sum b/vendor/github.com/jesseduffield/go-git/v5/go.sum deleted file mode 100644 index 9af1b0611..000000000 --- a/vendor/github.com/jesseduffield/go-git/v5/go.sum +++ /dev/null @@ -1,82 +0,0 @@ -github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= -github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= -github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= -github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= -github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= -github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= -github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= -github.com/go-git/go-billy/v5 v5.0.0 h1:7NQHvd9FVid8VL4qVUMm8XifBK+2xCoZ2lSk0agRrHM= -github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= -github.com/go-git/go-git-fixtures/v4 v4.0.1 h1:q+IFMfLx200Q3scvt2hN79JsEzy4AmBTp/pqnefH+Bc= -github.com/go-git/go-git-fixtures/v4 v4.0.1/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw= -github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12 h1:PbKy9zOy4aAKrJ5pibIRpVO2BXnK1Tlcg+caKI7Ox5M= -github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw= -github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg= -github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY= -github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70= -github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= -golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073 h1:xMPOj6Pz6UipU1wXLkrtqpHbR0AVFnyPEQq/wRWz9lM= -golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a h1:GuSPYbZzB5/dcLNCwLQLsg3obCJtX9IJhpXkvY7kzk0= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 h1:uYVVQ9WP/Ds2ROhcaGPeIdVq0RIXVLwsHlnvJ+cT1So= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/jesseduffield/gocui/edit.go b/vendor/github.com/jesseduffield/gocui/edit.go index 8c4b74adf..dde27e76a 100644 --- a/vendor/github.com/jesseduffield/gocui/edit.go +++ b/vendor/github.com/jesseduffield/gocui/edit.go @@ -24,10 +24,10 @@ func (f EditorFunc) Edit(v *View, key Key, ch rune, mod Modifier) bool { } // DefaultEditor is the default editor. -var DefaultEditor Editor = EditorFunc(simpleEditor) +var DefaultEditor Editor = EditorFunc(SimpleEditor) -// simpleEditor is used as the default gocui editor. -func simpleEditor(v *View, key Key, ch rune, mod Modifier) bool { +// SimpleEditor is used as the default gocui editor. +func SimpleEditor(v *View, key Key, ch rune, mod Modifier) bool { switch { case key == KeyBackspace || key == KeyBackspace2: v.TextArea.BackSpaceChar() diff --git a/vendor/github.com/jesseduffield/gocui/escape.go b/vendor/github.com/jesseduffield/gocui/escape.go index a9739f641..0085d0eb4 100644 --- a/vendor/github.com/jesseduffield/gocui/escape.go +++ b/vendor/github.com/jesseduffield/gocui/escape.go @@ -19,11 +19,6 @@ type escapeInterpreter struct { instruction instruction } -const ( - NONE = 1 << iota - ERASE_IN_LINE -) - type ( escapeState int fontEffect int diff --git a/vendor/github.com/jesseduffield/gocui/go.mod b/vendor/github.com/jesseduffield/gocui/go.mod deleted file mode 100644 index d7f11d16c..000000000 --- a/vendor/github.com/jesseduffield/gocui/go.mod +++ /dev/null @@ -1,10 +0,0 @@ -module github.com/jesseduffield/gocui - -go 1.12 - -require ( - github.com/gdamore/tcell/v2 v2.4.0 - github.com/go-errors/errors v1.0.2 - github.com/mattn/go-runewidth v0.0.10 - github.com/stretchr/testify v1.7.0 -) diff --git a/vendor/github.com/jesseduffield/gocui/go.sum b/vendor/github.com/jesseduffield/gocui/go.sum deleted file mode 100644 index 8ed3f9b35..000000000 --- a/vendor/github.com/jesseduffield/gocui/go.sum +++ /dev/null @@ -1,29 +0,0 @@ -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= -github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= -github.com/gdamore/tcell/v2 v2.4.0 h1:W6dxJEmaxYvhICFoTY3WrLLEXsQ11SaFnKGVEXW57KM= -github.com/gdamore/tcell/v2 v2.4.0/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6oBpwHp4fU= -github.com/go-errors/errors v1.0.2 h1:xMxH9j2fNg/L4hLn/4y3M0IUsn0M6Wbu/Uh9QlOfBh4= -github.com/go-errors/errors v1.0.2/go.mod h1:psDX2osz5VnTOnFWbDeWwS7yejl+uV3FEWEp4lssFEs= -github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= -github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= -github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= -github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY= -github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= -golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/vendor/github.com/jesseduffield/gocui/gui.go b/vendor/github.com/jesseduffield/gocui/gui.go index 86d1393bd..0c76bfee7 100644 --- a/vendor/github.com/jesseduffield/gocui/gui.go +++ b/vendor/github.com/jesseduffield/gocui/gui.go @@ -69,6 +69,31 @@ type tabClickBinding struct { handler tabClickHandler } +// TODO: would be good to define inbound and outbound click handlers e.g. +// clicking on a file is an inbound thing where we don't care what context you're +// in when it happens, whereas clicking on the main view from the files view is an +// outbound click with a specific handler. But this requires more thinking about +// where handlers should live. +type ViewMouseBinding struct { + // the view that is clicked + ViewName string + + // the view that has focus when the click occurs. + FocusedView string + + Handler func(ViewMouseBindingOpts) error + + Modifier Modifier + + // must be a mouse key + Key Key +} + +type ViewMouseBindingOpts struct { + X int // i.e. origin x + cursor x + Y int // i.e. origin y + cursor y +} + type GuiMutexes struct { // tickingMutex ensures we don't have two loops ticking. The point of 'ticking' // is to refresh the gui rapidly so that loader characters can be animated. @@ -83,6 +108,8 @@ const ( NORMAL PlayMode = iota RECORDING REPLAYING + // for the new form of integration tests + REPLAYING_NEW ) type Recording struct { @@ -91,8 +118,8 @@ type Recording struct { } type replayedEvents struct { - keys chan *TcellKeyEventWrapper - resizes chan *TcellResizeEventWrapper + Keys chan *TcellKeyEventWrapper + Resizes chan *TcellResizeEventWrapper } type RecordingConfig struct { @@ -110,17 +137,18 @@ type Gui struct { PlayMode PlayMode StartTime time.Time - tabClickBindings []*tabClickBinding - gEvents chan GocuiEvent - userEvents chan userEvent - views []*View - currentView *View - managers []Manager - keybindings []*keybinding - maxX, maxY int - outputMode OutputMode - stop chan struct{} - blacklist []Key + tabClickBindings []*tabClickBinding + viewMouseBindings []*ViewMouseBinding + gEvents chan GocuiEvent + userEvents chan userEvent + views []*View + currentView *View + managers []Manager + keybindings []*keybinding + maxX, maxY int + outputMode OutputMode + stop chan struct{} + blacklist []Key // BgColor and FgColor allow to configure the background and foreground // colors of the GUI. @@ -190,10 +218,10 @@ func NewGui(mode OutputMode, supportOverlaps bool, playMode PlayMode, headless b KeyEvents: []*TcellKeyEventWrapper{}, ResizeEvents: []*TcellResizeEventWrapper{}, } - } else if playMode == REPLAYING { + } else if playMode == REPLAYING || playMode == REPLAYING_NEW { g.ReplayedEvents = replayedEvents{ - keys: make(chan *TcellKeyEventWrapper), - resizes: make(chan *TcellResizeEventWrapper), + Keys: make(chan *TcellKeyEventWrapper), + Resizes: make(chan *TcellResizeEventWrapper), } } @@ -335,6 +363,45 @@ func (g *Gui) SetViewOnBottom(name string) (*View, error) { return nil, errors.Wrap(ErrUnknownView, 0) } +func (g *Gui) SetViewOnTopOf(toMove string, other string) error { + g.Mutexes.ViewsMutex.Lock() + defer g.Mutexes.ViewsMutex.Unlock() + + if toMove == other { + return nil + } + + // need to find the two current positions and then move toMove before other in the list. + toMoveIndex := -1 + otherIndex := -1 + + for i, v := range g.views { + if v.name == toMove { + toMoveIndex = i + } + + if v.name == other { + otherIndex = i + } + } + + if toMoveIndex == -1 || otherIndex == -1 { + return errors.Wrap(ErrUnknownView, 0) + } + + // already on top + if toMoveIndex > otherIndex { + return nil + } + + // need to actually do it the other way around. Last is highest + viewToMove := g.views[toMoveIndex] + + g.views = append(g.views[:toMoveIndex], g.views[toMoveIndex+1:]...) + g.views = append(g.views[:otherIndex], append([]*View{viewToMove}, g.views[otherIndex:]...)...) + return nil +} + // Views returns all the views in the GUI. func (g *Gui) Views() []*View { return g.views @@ -435,7 +502,7 @@ func (g *Gui) CurrentView() *View { // It behaves differently on different platforms. Somewhere it doesn't register Alt key press, // on others it might report Ctrl as Alt. It's not consistent and therefore it's not recommended // to use with mouse keys. -func (g *Gui) SetKeybinding(viewname string, contexts []string, key interface{}, mod Modifier, handler func(*Gui, *View) error) error { +func (g *Gui) SetKeybinding(viewname string, key interface{}, mod Modifier, handler func(*Gui, *View) error) error { var kb *keybinding k, ch, err := getKey(key) @@ -447,7 +514,7 @@ func (g *Gui) SetKeybinding(viewname string, contexts []string, key interface{}, return ErrBlacklisted } - kb = newKeybinding(viewname, contexts, k, ch, mod, handler) + kb = newKeybinding(viewname, k, ch, mod, handler) g.keybindings = append(g.keybindings, kb) return nil } @@ -469,7 +536,14 @@ func (g *Gui) DeleteKeybinding(viewname string, key interface{}, mod Modifier) e } // DeleteKeybindings deletes all keybindings of view. -func (g *Gui) DeleteKeybindings(viewname string) { +func (g *Gui) DeleteAllKeybindings() { + g.keybindings = []*keybinding{} + g.tabClickBindings = []*tabClickBinding{} + g.viewMouseBindings = []*ViewMouseBinding{} +} + +// DeleteKeybindings deletes all keybindings of view. +func (g *Gui) DeleteViewKeybindings(viewname string) { var s []*keybinding for _, kb := range g.keybindings { if kb.viewName != viewname { @@ -489,6 +563,12 @@ func (g *Gui) SetTabClickBinding(viewName string, handler tabClickHandler) error return nil } +func (g *Gui) SetViewClickBinding(binding *ViewMouseBinding) error { + g.viewMouseBindings = append(g.viewMouseBindings, binding) + + return nil +} + // BlackListKeybinding adds a keybinding to the blacklist func (g *Gui) BlacklistKeybinding(k Key) error { for _, j := range g.blacklist { @@ -583,7 +663,6 @@ func (g *Gui) SetManagerFunc(manager func(*Gui) error) { // MainLoop runs the main loop until an error is returned. A successful // finish should return ErrQuit. func (g *Gui) MainLoop() error { - g.StartTime = time.Now() if g.PlayMode == REPLAYING { go g.replayRecording() @@ -696,6 +775,8 @@ func (g *Gui) drawFrameEdges(v *View, fgColor, bgColor Attribute) error { } } } + + showScrollbar, realScrollbarStart, realScrollbarEnd := calcRealScrollbarStartEnd(v) for y := v.y0 + 1; y < v.y1 && y < g.maxY; y++ { if y < 0 { continue @@ -706,7 +787,9 @@ func (g *Gui) drawFrameEdges(v *View, fgColor, bgColor Attribute) error { } } if v.x1 > -1 && v.x1 < g.maxX { - if err := g.SetRune(v.x1, y, runeV, fgColor, bgColor); err != nil { + runeToPrint := calcScrollbarRune(showScrollbar, realScrollbarStart, realScrollbarEnd, v.y0+1, v.y1-1, y, runeV) + + if err := g.SetRune(v.x1, y, runeToPrint, fgColor, bgColor); err != nil { return err } } @@ -714,6 +797,44 @@ func (g *Gui) drawFrameEdges(v *View, fgColor, bgColor Attribute) error { return nil } +func calcScrollbarRune(showScrollbar bool, scrollbarStart int, scrollbarEnd int, rangeStart int, rangeEnd int, position int, runeV rune) rune { + if !showScrollbar { + return runeV + } else if position == rangeStart { + return 'â–˛' + } else if position == rangeEnd { + return 'â–Ľ' + } else if position > scrollbarStart && position < scrollbarEnd { + return 'â–' + } else if position > rangeStart && position < rangeEnd { + // keeping this as a separate branch in case we later want to render something different here. + return runeV + } else { + return runeV + } +} + +func calcRealScrollbarStartEnd(v *View) (bool, int, int) { + height := v.InnerHeight() + 1 + fullHeight := v.ViewLinesHeight() - v.scrollMargin() + + if v.CanScrollPastBottom { + fullHeight += height + } + + if height < 2 || height >= fullHeight { + return false, 0, 0 + } + + originY := v.OriginY() + scrollbarStart, scrollbarHeight := calcScrollbar(fullHeight, height, originY, height-1) + top := v.y0 + 1 + realScrollbarStart := top + scrollbarStart + realScrollbarEnd := realScrollbarStart + scrollbarHeight + + return true, realScrollbarStart, realScrollbarEnd +} + func cornerRune(index byte) rune { return []rune{' ', '│', '│', '│', '─', 'â”', 'â”', '┤', '─', 'â””', '┌', '├', '├', 'â”´', '┬', '┼'}[index] } @@ -868,9 +989,6 @@ func (g *Gui) drawTitle(v *View, fgColor, bgColor Attribute) error { if v != g.currentView { currentFgColor -= AttrBold } - if v.HighlightSelectedTabWithoutFocus || v == g.CurrentView() { - currentBgColor = v.SelBgColor - } } if err := g.SetRune(x, v.y0, ch, currentFgColor, currentBgColor); err != nil { return err @@ -934,7 +1052,6 @@ func (g *Gui) drawListFooter(v *View, fgColor, bgColor Attribute) error { // flush updates the gui, re-drawing frames and buffers. func (g *Gui) flush() error { - // pretty sure we don't need this, but keeping it here in case we get weird visual artifacts // g.clear(g.FgColor, g.BgColor) @@ -968,9 +1085,43 @@ func (g *Gui) draw(v *View) error { return nil } - if !v.Visible || v.y1 < v.y0 { + if !v.Visible || v.y1 < v.y0 || v.x1 < v.x0 { return nil } + + if g.Cursor { + if curview := g.currentView; curview != nil { + vMaxX, vMaxY := curview.Size() + if curview.cx < 0 { + curview.cx = 0 + } else if curview.cx >= vMaxX { + curview.cx = vMaxX - 1 + } + if curview.cy < 0 { + curview.cy = 0 + } else if curview.cy >= vMaxY { + curview.cy = vMaxY - 1 + } + + gMaxX, gMaxY := g.Size() + cx, cy := curview.x0+curview.cx+1, curview.y0+curview.cy+1 + // This test probably doesn't need to be here. + // tcell is hiding cursor by setting coordinates outside of screen. + // Keeping it here for now, as I'm not 100% sure :) + if cx >= 0 && cx < gMaxX && cy >= 0 && cy < gMaxY { + Screen.ShowCursor(cx, cy) + } else { + Screen.HideCursor() + } + } + } else { + Screen.HideCursor() + } + + if err := v.draw(); err != nil { + return err + } + if v.Frame { var fgColor, bgColor, frameColor Attribute if g.Highlight && v == g.currentView { @@ -1014,38 +1165,6 @@ func (g *Gui) draw(v *View) error { } } - if g.Cursor { - if curview := g.currentView; curview != nil { - vMaxX, vMaxY := curview.Size() - if curview.cx < 0 { - curview.cx = 0 - } else if curview.cx >= vMaxX { - curview.cx = vMaxX - 1 - } - if curview.cy < 0 { - curview.cy = 0 - } else if curview.cy >= vMaxY { - curview.cy = vMaxY - 1 - } - - gMaxX, gMaxY := g.Size() - cx, cy := curview.x0+curview.cx+1, curview.y0+curview.cy+1 - // This test probably doesn't need to be here. - // tcell is hiding cursor by setting coordinates outside of screen. - // Keeping it here for now, as I'm not 100% sure :) - if cx >= 0 && cx < gMaxX && cy >= 0 && cy < gMaxY { - Screen.ShowCursor(cx, cy) - } else { - Screen.HideCursor() - } - } - } else { - Screen.HideCursor() - } - - if err := v.draw(); err != nil { - return err - } return nil } @@ -1071,9 +1190,11 @@ func (g *Gui) onKey(ev *GocuiEvent) error { if len(v.Tabs) > 0 { tabIndex := v.GetClickedTabIndex(mx - v.x0) - for _, binding := range g.tabClickBindings { - if binding.viewName == v.Name() { - return binding.handler(tabIndex) + if tabIndex >= 0 { + for _, binding := range g.tabClickBindings { + if binding.viewName == v.Name() { + return binding.handler(tabIndex) + } } } } @@ -1092,6 +1213,17 @@ func (g *Gui) onKey(ev *GocuiEvent) error { return err } + if IsMouseKey(ev.Key) { + opts := ViewMouseBindingOpts{X: newCx + v.ox, Y: newCy + v.oy} + matched, err := g.execMouseKeybindings(v, ev, opts) + if err != nil { + return err + } + if matched { + return nil + } + } + if _, err := g.execKeybindings(v, ev); err != nil { return err } @@ -1100,6 +1232,46 @@ func (g *Gui) onKey(ev *GocuiEvent) error { return nil } +func (g *Gui) execMouseKeybindings(view *View, ev *GocuiEvent, opts ViewMouseBindingOpts) (bool, error) { + isMatch := func(binding *ViewMouseBinding) bool { + return binding.ViewName == view.Name() && + ev.Key == binding.Key && + ev.Mod == binding.Modifier + } + + // first pass looks for ones that match the focused view + for _, binding := range g.viewMouseBindings { + if isMatch(binding) && binding.FocusedView != "" && binding.FocusedView == g.currentView.Name() { + return true, binding.Handler(opts) + } + } + + for _, binding := range g.viewMouseBindings { + if isMatch(binding) && binding.FocusedView == "" { + return true, binding.Handler(opts) + } + } + + return false, nil +} + +func IsMouseKey(key interface{}) bool { + switch key { + case + MouseLeft, + MouseRight, + MouseMiddle, + MouseRelease, + MouseWheelUp, + MouseWheelDown, + MouseWheelLeft, + MouseWheelRight: + return true + default: + return false + } +} + // execKeybindings executes the keybinding handlers that match the passed view // and event. The value of matched is true if there is a match and no errors. func (g *Gui) execKeybindings(v *View, ev *GocuiEvent) (matched bool, err error) { @@ -1130,10 +1302,10 @@ func (g *Gui) execKeybindings(v *View, ev *GocuiEvent) (matched bool, err error) if !kb.matchKeypress(Key(ev.Key), ev.Ch, Modifier(ev.Mod)) { continue } - if kb.matchView(v) { + if g.matchView(v, kb) { return g.execKeybinding(v, kb) } - if v != nil && kb.matchView(v.ParentView) { + if v != nil && g.matchView(v.ParentView, kb) { matchingParentViewKb = kb } if globalKb == nil && kb.viewName == "" && ((v != nil && !v.Editable) || (kb.ch == 0 && kb.key != KeyCtrlU && kb.key != KeyCtrlA && kb.key != KeyCtrlE)) { @@ -1250,7 +1422,7 @@ func (g *Gui) replayRecording() { case <-ticker.C: timeWaited += 1 if timeWaited >= timeToWait { - g.ReplayedEvents.keys <- event + g.ReplayedEvents.Keys <- event break middle } case <-g.stop: @@ -1283,7 +1455,7 @@ func (g *Gui) replayRecording() { case <-ticker.C: timeWaited += 1 if timeWaited >= timeToWait { - g.ReplayedEvents.resizes <- event + g.ReplayedEvents.Resizes <- event break middle2 } case <-g.stop: @@ -1334,3 +1506,18 @@ func (g *Gui) Resume() error { return g.screen.Resume() } + +// matchView returns if the keybinding matches the current view (and the view's context) +func (g *Gui) matchView(v *View, kb *keybinding) bool { + // if the user is typing in a field, ignore char keys + if v == nil { + return false + } + if v.Editable == true && kb.ch != 0 { + return false + } + if kb.viewName != v.name { + return false + } + return true +} diff --git a/vendor/github.com/jesseduffield/gocui/keybinding.go b/vendor/github.com/jesseduffield/gocui/keybinding.go index 95857656e..bee180aea 100644 --- a/vendor/github.com/jesseduffield/gocui/keybinding.go +++ b/vendor/github.com/jesseduffield/gocui/keybinding.go @@ -20,7 +20,6 @@ type Modifier tcell.ModMask // Keybidings are used to link a given key-press event with a handler. type keybinding struct { viewName string - contexts []string key Key ch rune mod Modifier @@ -93,10 +92,9 @@ func MustParseAll(input []string) map[interface{}]Modifier { } // newKeybinding returns a new Keybinding object. -func newKeybinding(viewname string, contexts []string, key Key, ch rune, mod Modifier, handler func(*Gui, *View) error) (kb *keybinding) { +func newKeybinding(viewname string, key Key, ch rune, mod Modifier, handler func(*Gui, *View) error) (kb *keybinding) { kb = &keybinding{ viewName: viewname, - contexts: contexts, key: key, ch: ch, mod: mod, @@ -124,30 +122,6 @@ func (kb *keybinding) matchKeypress(key Key, ch rune, mod Modifier) bool { return kb.key == key && kb.ch == ch && kb.mod == mod } -// matchView returns if the keybinding matches the current view (and the view's context) -func (kb *keybinding) matchView(v *View) bool { - // if the user is typing in a field, ignore char keys - if v == nil { - return false - } - if v.Editable == true && kb.ch != 0 { - return false - } - if kb.viewName != v.name { - return false - } - // if the keybinding doesn't specify contexts, it applies for all contexts - if len(kb.contexts) == 0 { - return true - } - for _, context := range kb.contexts { - if context == v.Context { - return true - } - } - return false -} - // translations for strings to keys var translate = map[string]Key{ "F1": KeyF1, diff --git a/vendor/github.com/jesseduffield/gocui/scrollbar.go b/vendor/github.com/jesseduffield/gocui/scrollbar.go new file mode 100644 index 000000000..3bdb4a45c --- /dev/null +++ b/vendor/github.com/jesseduffield/gocui/scrollbar.go @@ -0,0 +1,33 @@ +package gocui + +import "math" + +// returns start and height of scrollbar +// `max` is the maximum possible value of `position` +func calcScrollbar(listSize int, pageSize int, position int, scrollAreaSize int) (int, int) { + height := calcScrollbarHeight(listSize, pageSize, scrollAreaSize) + // assume we can't scroll past the last item + maxPosition := listSize - pageSize + if maxPosition <= 0 { + return 0, height + } + if position == maxPosition { + return scrollAreaSize - height, height + } + // we only want to show the scrollbar at the top or bottom positions if we're at the end. Hence the .Ceil (for moving the scrollbar once we scroll down) and the -1 (for pretending there's a smaller range than we actually have, with the above condition ensuring we snap to the bottom once we're at the end of the list) + start := int(math.Ceil(((float64(position) / float64(maxPosition)) * float64(scrollAreaSize-height-1)))) + return start, height +} + +func calcScrollbarHeight(listSize int, pageSize int, scrollAreaSize int) int { + if pageSize >= listSize { + return scrollAreaSize + } + height := int((float64(pageSize) / float64(listSize)) * float64(scrollAreaSize)) + minHeight := 2 + if height < minHeight { + return minHeight + } + + return height +} diff --git a/vendor/github.com/jesseduffield/gocui/tcell_driver.go b/vendor/github.com/jesseduffield/gocui/tcell_driver.go index c5555e30d..81d30fe91 100644 --- a/vendor/github.com/jesseduffield/gocui/tcell_driver.go +++ b/vendor/github.com/jesseduffield/gocui/tcell_driver.go @@ -232,11 +232,11 @@ func (g *Gui) timeSinceStart() int64 { // pollEvent get tcell.Event and transform it into gocuiEvent func (g *Gui) pollEvent() GocuiEvent { var tev tcell.Event - if g.PlayMode == REPLAYING { + if g.PlayMode == REPLAYING || g.PlayMode == REPLAYING_NEW { select { - case ev := <-g.ReplayedEvents.keys: + case ev := <-g.ReplayedEvents.Keys: tev = (ev).toTcellEvent() - case ev := <-g.ReplayedEvents.resizes: + case ev := <-g.ReplayedEvents.Resizes: tev = (ev).toTcellEvent() } } else { diff --git a/vendor/github.com/jesseduffield/gocui/view.go b/vendor/github.com/jesseduffield/gocui/view.go index 1316ced2e..95c7ef4b1 100644 --- a/vendor/github.com/jesseduffield/gocui/view.go +++ b/vendor/github.com/jesseduffield/gocui/view.go @@ -25,11 +25,9 @@ const ( RIGHT = 8 // view is overlapping at right edge ) -var ( - // ErrInvalidPoint is returned when client passed invalid coordinates of a cell. - // Most likely client has passed negative coordinates of a cell. - ErrInvalidPoint = errors.New("invalid point") -) +// ErrInvalidPoint is returned when client passed invalid coordinates of a cell. +// Most likely client has passed negative coordinates of a cell. +var ErrInvalidPoint = errors.New("invalid point") // A View is a window. It maintains its own internal buffer and cursor // position. @@ -125,8 +123,7 @@ type View struct { Tabs []string TabIndex int - // HighlightTabWithoutFocus allows you to show which tab is selected without the view being focused - HighlightSelectedTabWithoutFocus bool + // TitleColor allow to configure the color of title and subtitle for the view. TitleColor Attribute @@ -149,8 +146,6 @@ type View struct { // ParentView is the view which catches events bubbled up from the given view if there's no matching handler ParentView *View - Context string // this is for assigning keybindings to a view only in certain contexts - searcher *searcher // KeybindOnEdit should be set to true when you want to execute keybindings even when the view is editable @@ -161,6 +156,9 @@ type View struct { // something like '1 of 20' for a list view Footer string + + // if true, the user can scroll all the way past the last item until it appears at the top of the view + CanScrollPastBottom bool } // call this in the event of a view resize, or if you want to render new content @@ -467,6 +465,14 @@ func (v *View) Cursor() (x, y int) { return v.cx, v.cy } +func (v *View) CursorX() int { + return v.cx +} + +func (v *View) CursorY() int { + return v.cy +} + // SetOrigin sets the origin position of the view's internal buffer, // so the buffer starts to be printed from this point, which means that // it is linked with the origin point of view. It can be used to @@ -680,7 +686,11 @@ func (v *View) parseInput(ch rune) (bool, []cell) { if _, ok := v.ei.instruction.(eraseInLineFromCursor); ok { // fill rest of line v.ei.instructionRead() - repeatCount = v.InnerWidth() - v.wx + cx := 0 + for _, cell := range v.lines[v.wy] { + cx += runewidth.RuneWidth(cell.chr) + } + repeatCount = v.InnerWidth() - cx ch = ' ' moveCursor = false } else if isEscape { @@ -834,7 +844,7 @@ func (v *View) updateSearchPositions() { v.searcher.searchPositions = []cellPos{} for y, line := range v.lines { lineLoop: - for x, _ := range line { + for x := range line { if normalizeRune(line[x].chr) == rune(normalizedSearchStr[0]) { for offset := 1; offset < len(normalizedSearchStr); offset++ { if len(line)-1 < x+offset { @@ -920,19 +930,35 @@ func (v *View) draw() error { } y := 0 + emptyCell := cell{chr: ' ', fgColor: ColorDefault, bgColor: ColorDefault} + var prevFgColor Attribute for _, vline := range v.viewLines[start:] { if y >= maxY { break } x := 0 - for j, c := range vline.line { + j := 0 + var c cell + for { if j < v.ox { + j++ continue } if x >= maxX { break } + if j > len(vline.line)-1 { + c = emptyCell + c.fgColor = prevFgColor + } else { + c = vline.line[j] + // capturing previous foreground colour so that if we're using the reverse + // attribute we honour the final character's colour and don't awkwardly switch + // to a new background colour for the remainder of the line + prevFgColor = c.fgColor + } + fgColor := c.fgColor if fgColor == ColorDefault { fgColor = v.FgColor @@ -956,6 +982,7 @@ func (v *View) draw() error { // Not sure why the previous code was here but it caused problems // when typing wide characters in an editor x += runewidth.RuneWidth(c.chr) + j++ } y++ } @@ -1193,15 +1220,22 @@ func (v *View) GetClickedTabIndex(x int) int { return 0 } - charIndex := 0 + charX := 1 + if x <= charX { + return -1 + } for i, tab := range v.Tabs { - charIndex += len(tab + " - ") - if x < charIndex { + charX += runewidth.StringWidth(tab) + if x <= charX { return i } + charX += runewidth.StringWidth(" - ") + if x <= charX { + return -1 + } } - return 0 + return -1 } func (v *View) SelectedLineIdx() int { @@ -1209,6 +1243,13 @@ func (v *View) SelectedLineIdx() int { return seletedLineIdx } +// expected to only be used in tests +func (v *View) SelectedLine() string { + line := v.lines[v.SelectedLineIdx()] + str := lineType(line).String() + return strings.Replace(str, "\x00", " ", -1) +} + func (v *View) SelectedPoint() (int, int) { cx, cy := v.Cursor() ox, oy := v.Origin() @@ -1269,3 +1310,69 @@ func (v *View) OverwriteLines(y int, content string) { lines := strings.Replace(content, "\n", "\x1b[K\n", -1) v.writeString(lines) } + +func (v *View) ScrollUp(amount int) { + newOy := v.oy - amount + if newOy < 0 { + newOy = 0 + } + v.oy = newOy +} + +// ensures we don't scroll past the end of the view's content +func (v *View) ScrollDown(amount int) { + adjustedAmount := v.adjustDownwardScrollAmount(amount) + if adjustedAmount > 0 { + v.oy += adjustedAmount + } +} + +func (v *View) ScrollLeft(amount int) { + newOx := v.ox - amount + if newOx < 0 { + newOx = 0 + } + v.ox = newOx +} + +// not applying any limits to this +func (v *View) ScrollRight(amount int) { + v.ox += amount +} + +func (v *View) adjustDownwardScrollAmount(scrollHeight int) int { + _, oy := v.Origin() + y := oy + if !v.CanScrollPastBottom { + _, sy := v.Size() + y += sy + } + scrollableLines := v.ViewLinesHeight() - y + if scrollableLines < 0 { + return 0 + } + + margin := v.scrollMargin() + if scrollableLines-margin < scrollHeight { + scrollHeight = scrollableLines - margin + } + if oy+scrollHeight < 0 { + return 0 + } else { + return scrollHeight + } +} + +// scrollMargin is about how many lines must still appear if you scroll +// all the way down. We'll subtract this from the total amount of scrollable lines +func (v *View) scrollMargin() int { + if v.CanScrollPastBottom { + // Setting to 2 because of the newline at the end of the file that we're likely showing. + // If we want to scroll past bottom outside the context of reading a file's contents, + // we should make this into a field on the view to be configured by the client. + // For now we're hardcoding it. + return 2 + } else { + return 0 + } +} diff --git a/vendor/github.com/jesseduffield/kill/LICENSE b/vendor/github.com/jesseduffield/kill/LICENSE new file mode 100644 index 000000000..2a7175dcc --- /dev/null +++ b/vendor/github.com/jesseduffield/kill/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Jesse Duffield + +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. diff --git a/vendor/github.com/jesseduffield/kill/README.md b/vendor/github.com/jesseduffield/kill/README.md new file mode 100644 index 000000000..75ca05db4 --- /dev/null +++ b/vendor/github.com/jesseduffield/kill/README.md @@ -0,0 +1,3 @@ +# Kill + +Go package for killing processes across different platforms. Handles killing children of processes as well as the process itself. diff --git a/vendor/github.com/jesseduffield/kill/kill_default_platform.go b/vendor/github.com/jesseduffield/kill/kill_default_platform.go new file mode 100644 index 000000000..6fb5a313a --- /dev/null +++ b/vendor/github.com/jesseduffield/kill/kill_default_platform.go @@ -0,0 +1,33 @@ +//go:build !windows +// +build !windows + +package kill + +import ( + "os/exec" + "syscall" +) + +// Kill kills a process. If the process has Setpgid == true, then we have anticipated that it might spawn its own child processes, so we've given it a process group ID (PGID) equal to its process id (PID) and given its child processes will inherit the PGID, we can kill that group, rather than killing the process itself. +func Kill(cmd *exec.Cmd) error { + if cmd.Process == nil { + // You can't kill a person with no body + return nil + } + + if cmd.SysProcAttr != nil && cmd.SysProcAttr.Setpgid { + // minus sign means we're talking about a PGID as opposed to a PID + return syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL) + } + + return cmd.Process.Kill() +} + +// PrepareForChildren ensures that child processes of this parent process will share the same group id +// as the parent, meaning when the call Kill on the parent process, we'll kill +// the whole group, parent and children both. Gruesome when you think about it. +func PrepareForChildren(cmd *exec.Cmd) { + cmd.SysProcAttr = &syscall.SysProcAttr{ + Setpgid: true, + } +} diff --git a/vendor/github.com/jesseduffield/kill/kill_windows.go b/vendor/github.com/jesseduffield/kill/kill_windows.go new file mode 100644 index 000000000..1ac08a125 --- /dev/null +++ b/vendor/github.com/jesseduffield/kill/kill_windows.go @@ -0,0 +1,136 @@ +// adapted from https://blog.csdn.net/fyxichen/article/details/51857864 + +package kill + +import ( + "os" + "os/exec" + "syscall" + "unsafe" +) + +// Kill kills a process, along with any child processes it may have spawned. +func Kill(cmd *exec.Cmd) error { + if cmd.Process == nil { + // You can't kill a person with no body + return nil + } + + pids := Getppids(uint32(cmd.Process.Pid)) + for _, pid := range pids { + pro, err := os.FindProcess(int(pid)) + if err != nil { + continue + } + + pro.Kill() + } + + return nil +} + +// PrepareForChildren ensures that child processes of this parent process will share the same group id +// as the parent, meaning when the call Kill on the parent process, we'll kill +// the whole group, parent and children both. Gruesome when you think about it. +func PrepareForChildren(cmd *exec.Cmd) { + // do nothing because on windows our Kill function handles children by default. +} + +const ( + MAX_PATH = 260 + TH32CS_SNAPPROCESS = 0x00000002 +) + +type ProcessInfo struct { + Name string + Pid uint32 + PPid uint32 +} + +type PROCESSENTRY32 struct { + DwSize uint32 + CntUsage uint32 + Th32ProcessID uint32 + Th32DefaultHeapID uintptr + Th32ModuleID uint32 + CntThreads uint32 + Th32ParentProcessID uint32 + PcPriClassBase int32 + DwFlags uint32 + SzExeFile [MAX_PATH]uint16 +} + +type HANDLE uintptr + +var ( + modkernel32 = syscall.NewLazyDLL("kernel32.dll") + procCreateToolhelp32Snapshot = modkernel32.NewProc("CreateToolhelp32Snapshot") + procProcess32First = modkernel32.NewProc("Process32FirstW") + procProcess32Next = modkernel32.NewProc("Process32NextW") + procCloseHandle = modkernel32.NewProc("CloseHandle") +) + +func Getppids(pid uint32) []uint32 { + infos, err := GetProcs() + if err != nil { + return []uint32{pid} + } + var pids []uint32 = make([]uint32, 0, len(infos)) + var index int = 0 + pids = append(pids, pid) + + var length int = len(pids) + for index < length { + for _, info := range infos { + if info.PPid == pids[index] { + pids = append(pids, info.Pid) + } + } + index += 1 + length = len(pids) + } + return pids +} + +func GetProcs() (procs []ProcessInfo, err error) { + snap := createToolhelp32Snapshot(TH32CS_SNAPPROCESS, uint32(0)) + if snap == 0 { + err = syscall.GetLastError() + return + } + defer closeHandle(snap) + var pe32 PROCESSENTRY32 + pe32.DwSize = uint32(unsafe.Sizeof(pe32)) + if process32First(snap, &pe32) == false { + err = syscall.GetLastError() + return + } + procs = append(procs, ProcessInfo{syscall.UTF16ToString(pe32.SzExeFile[:260]), pe32.Th32ProcessID, pe32.Th32ParentProcessID}) + for process32Next(snap, &pe32) { + procs = append(procs, ProcessInfo{syscall.UTF16ToString(pe32.SzExeFile[:260]), pe32.Th32ProcessID, pe32.Th32ParentProcessID}) + } + return +} + +func createToolhelp32Snapshot(flags, processId uint32) HANDLE { + ret, _, _ := procCreateToolhelp32Snapshot.Call(uintptr(flags), uintptr(processId)) + if ret <= 0 { + return HANDLE(0) + } + return HANDLE(ret) +} + +func process32First(snapshot HANDLE, pe *PROCESSENTRY32) bool { + ret, _, _ := procProcess32First.Call(uintptr(snapshot), uintptr(unsafe.Pointer(pe))) + return ret != 0 +} + +func process32Next(snapshot HANDLE, pe *PROCESSENTRY32) bool { + ret, _, _ := procProcess32Next.Call(uintptr(snapshot), uintptr(unsafe.Pointer(pe))) + return ret != 0 +} + +func closeHandle(object HANDLE) bool { + ret, _, _ := procCloseHandle.Call(uintptr(object)) + return ret != 0 +} diff --git a/vendor/github.com/jesseduffield/minimal/gitignore/go.mod b/vendor/github.com/jesseduffield/minimal/gitignore/go.mod deleted file mode 100644 index 0137e6b0f..000000000 --- a/vendor/github.com/jesseduffield/minimal/gitignore/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module github.com/jesseduffield/minimal/gitignore - -go 1.15 - -require github.com/gobwas/glob v0.2.3 diff --git a/vendor/github.com/jesseduffield/minimal/gitignore/go.sum b/vendor/github.com/jesseduffield/minimal/gitignore/go.sum deleted file mode 100644 index 39fa9fa07..000000000 --- a/vendor/github.com/jesseduffield/minimal/gitignore/go.sum +++ /dev/null @@ -1,2 +0,0 @@ -github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= diff --git a/vendor/github.com/kardianos/osext/go.mod b/vendor/github.com/kardianos/osext/go.mod deleted file mode 100644 index 66c73d7c2..000000000 --- a/vendor/github.com/kardianos/osext/go.mod +++ /dev/null @@ -1 +0,0 @@ -module github.com/kardianos/osext diff --git a/vendor/github.com/konsorten/go-windows-terminal-sequences/go.mod b/vendor/github.com/konsorten/go-windows-terminal-sequences/go.mod deleted file mode 100644 index 716c61312..000000000 --- a/vendor/github.com/konsorten/go-windows-terminal-sequences/go.mod +++ /dev/null @@ -1 +0,0 @@ -module github.com/konsorten/go-windows-terminal-sequences diff --git a/vendor/github.com/kyokomi/emoji/v2/go.mod b/vendor/github.com/kyokomi/emoji/v2/go.mod deleted file mode 100644 index f18dda204..000000000 --- a/vendor/github.com/kyokomi/emoji/v2/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/kyokomi/emoji/v2 - -go 1.14 diff --git a/vendor/github.com/lucasb-eyer/go-colorful/go.mod b/vendor/github.com/lucasb-eyer/go-colorful/go.mod deleted file mode 100644 index 35925f3d7..000000000 --- a/vendor/github.com/lucasb-eyer/go-colorful/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/lucasb-eyer/go-colorful - -go 1.12 diff --git a/vendor/github.com/mattn/go-colorable/go.mod b/vendor/github.com/mattn/go-colorable/go.mod deleted file mode 100644 index 27351c027..000000000 --- a/vendor/github.com/mattn/go-colorable/go.mod +++ /dev/null @@ -1,8 +0,0 @@ -module github.com/mattn/go-colorable - -require ( - github.com/mattn/go-isatty v0.0.14 - golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6 // indirect -) - -go 1.13 diff --git a/vendor/github.com/mattn/go-colorable/go.sum b/vendor/github.com/mattn/go-colorable/go.sum deleted file mode 100644 index 40c33b333..000000000 --- a/vendor/github.com/mattn/go-colorable/go.sum +++ /dev/null @@ -1,5 +0,0 @@ -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6 h1:foEbQz/B0Oz6YIqu/69kfXPYeFQAuuMYFkjaqXzl5Wo= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/vendor/github.com/mattn/go-isatty/go.mod b/vendor/github.com/mattn/go-isatty/go.mod deleted file mode 100644 index c9a20b7f3..000000000 --- a/vendor/github.com/mattn/go-isatty/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module github.com/mattn/go-isatty - -go 1.12 - -require golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c diff --git a/vendor/github.com/mattn/go-isatty/go.sum b/vendor/github.com/mattn/go-isatty/go.sum deleted file mode 100644 index 912e29cbc..000000000 --- a/vendor/github.com/mattn/go-isatty/go.sum +++ /dev/null @@ -1,2 +0,0 @@ -golang.org/x/sys v0.0.0-20200116001909-b77594299b42 h1:vEOn+mP2zCOVzKckCZy6YsCtDblrpj/w7B9nxGNELpg= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/github.com/mattn/go-runewidth/go.mod b/vendor/github.com/mattn/go-runewidth/go.mod deleted file mode 100644 index 62dba1bfc..000000000 --- a/vendor/github.com/mattn/go-runewidth/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module github.com/mattn/go-runewidth - -go 1.9 - -require github.com/rivo/uniseg v0.2.0 diff --git a/vendor/github.com/mattn/go-runewidth/go.sum b/vendor/github.com/mattn/go-runewidth/go.sum deleted file mode 100644 index 03f902d56..000000000 --- a/vendor/github.com/mattn/go-runewidth/go.sum +++ /dev/null @@ -1,2 +0,0 @@ -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= diff --git a/vendor/github.com/mitchellh/go-homedir/go.mod b/vendor/github.com/mitchellh/go-homedir/go.mod deleted file mode 100644 index 7efa09a04..000000000 --- a/vendor/github.com/mitchellh/go-homedir/go.mod +++ /dev/null @@ -1 +0,0 @@ -module github.com/mitchellh/go-homedir diff --git a/vendor/github.com/petermattis/goid/.gitignore b/vendor/github.com/petermattis/goid/.gitignore new file mode 100644 index 000000000..2b9d6b552 --- /dev/null +++ b/vendor/github.com/petermattis/goid/.gitignore @@ -0,0 +1,4 @@ +*~ +*.test +.*.swp +.DS_Store diff --git a/vendor/github.com/petermattis/goid/LICENSE b/vendor/github.com/petermattis/goid/LICENSE new file mode 100644 index 000000000..e06d20818 --- /dev/null +++ b/vendor/github.com/petermattis/goid/LICENSE @@ -0,0 +1,202 @@ +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. + diff --git a/vendor/github.com/petermattis/goid/README.md b/vendor/github.com/petermattis/goid/README.md new file mode 100644 index 000000000..828fe9528 --- /dev/null +++ b/vendor/github.com/petermattis/goid/README.md @@ -0,0 +1,5 @@ +# goid [![Build Status](https://travis-ci.org/petermattis/goid.svg?branch=master)](https://travis-ci.org/petermattis/goid) + +Programatically retrieve the current goroutine's ID. See [the CI +configuration](.travis.yml) for supported Go versions. In addition, +gccgo 7.2.1 (Go 1.8.3) is supported. diff --git a/vendor/github.com/petermattis/goid/goid.go b/vendor/github.com/petermattis/goid/goid.go new file mode 100644 index 000000000..408e61992 --- /dev/null +++ b/vendor/github.com/petermattis/goid/goid.go @@ -0,0 +1,35 @@ +// Copyright 2016 Peter Mattis. +// +// 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. See the AUTHORS file +// for names of contributors. + +package goid + +import ( + "bytes" + "runtime" + "strconv" +) + +func ExtractGID(s []byte) int64 { + s = s[len("goroutine "):] + s = s[:bytes.IndexByte(s, ' ')] + gid, _ := strconv.ParseInt(string(s), 10, 64) + return gid +} + +// Parse the goid from runtime.Stack() output. Slow, but it works. +func getSlow() int64 { + var buf [64]byte + return ExtractGID(buf[:runtime.Stack(buf[:], false)]) +} diff --git a/vendor/github.com/petermattis/goid/goid_gccgo.go b/vendor/github.com/petermattis/goid/goid_gccgo.go new file mode 100644 index 000000000..e655e0687 --- /dev/null +++ b/vendor/github.com/petermattis/goid/goid_gccgo.go @@ -0,0 +1,25 @@ +// Copyright 2018 Peter Mattis. +// +// 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. See the AUTHORS file +// for names of contributors. + +// +build gccgo + +package goid + +//extern runtime.getg +func getg() *g + +func Get() int64 { + return getg().goid +} diff --git a/vendor/github.com/petermattis/goid/goid_go1.3.c b/vendor/github.com/petermattis/goid/goid_go1.3.c new file mode 100644 index 000000000..2e3f7ab79 --- /dev/null +++ b/vendor/github.com/petermattis/goid/goid_go1.3.c @@ -0,0 +1,23 @@ +// Copyright 2015 Peter Mattis. +// +// 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. See the AUTHORS file +// for names of contributors. + +// +build !go1.4 + +#include + +void ·Get(int64 ret) { + ret = g->goid; + USED(&ret); +} diff --git a/vendor/github.com/petermattis/goid/goid_go1.3.go b/vendor/github.com/petermattis/goid/goid_go1.3.go new file mode 100644 index 000000000..9202099e8 --- /dev/null +++ b/vendor/github.com/petermattis/goid/goid_go1.3.go @@ -0,0 +1,21 @@ +// Copyright 2015 Peter Mattis. +// +// 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. See the AUTHORS file +// for names of contributors. + +// +build !go1.4 + +package goid + +// Get returns the id of the current goroutine. +func Get() int64 diff --git a/vendor/github.com/petermattis/goid/goid_go1.4.go b/vendor/github.com/petermattis/goid/goid_go1.4.go new file mode 100644 index 000000000..ec7fc52d4 --- /dev/null +++ b/vendor/github.com/petermattis/goid/goid_go1.4.go @@ -0,0 +1,34 @@ +// Copyright 2015 Peter Mattis. +// +// 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. See the AUTHORS file +// for names of contributors. + +// +build go1.4,!go1.5 + +package goid + +import "unsafe" + +var pointerSize = unsafe.Sizeof(uintptr(0)) + +// Backdoor access to runtime·getg(). +func getg() uintptr // in goid_go1.4.s + +// Get returns the id of the current goroutine. +func Get() int64 { + // The goid is the 16th field in the G struct where each field is a + // pointer, uintptr or padded to that size. See runtime.h from the + // Go sources. I'm not aware of a cleaner way to determine the + // offset. + return *(*int64)(unsafe.Pointer(getg() + 16*pointerSize)) +} diff --git a/vendor/github.com/petermattis/goid/goid_go1.4.s b/vendor/github.com/petermattis/goid/goid_go1.4.s new file mode 100644 index 000000000..21a07d662 --- /dev/null +++ b/vendor/github.com/petermattis/goid/goid_go1.4.s @@ -0,0 +1,18 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Assembly to get into package runtime without using exported symbols. +// See https://github.com/golang/go/blob/release-branch.go1.4/misc/cgo/test/backdoor/thunk.s + +// +build amd64 amd64p32 arm 386 +// +build go1.4,!go1.5 + +#include "textflag.h" + +#ifdef GOARCH_arm +#define JMP B +#endif + +TEXT ·getg(SB),NOSPLIT,$0-0 + JMP runtime·getg(SB) diff --git a/vendor/github.com/petermattis/goid/goid_go1.5_amd64.go b/vendor/github.com/petermattis/goid/goid_go1.5_amd64.go new file mode 100644 index 000000000..269abb3f5 --- /dev/null +++ b/vendor/github.com/petermattis/goid/goid_go1.5_amd64.go @@ -0,0 +1,21 @@ +// Copyright 2016 Peter Mattis. +// +// 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. See the AUTHORS file +// for names of contributors. + +// +build amd64 amd64p32 +// +build gc,go1.5 + +package goid + +func Get() int64 diff --git a/vendor/github.com/petermattis/goid/goid_go1.5_amd64.s b/vendor/github.com/petermattis/goid/goid_go1.5_amd64.s new file mode 100644 index 000000000..416665dd9 --- /dev/null +++ b/vendor/github.com/petermattis/goid/goid_go1.5_amd64.s @@ -0,0 +1,29 @@ +// Copyright 2016 Peter Mattis. +// +// 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. See the AUTHORS file +// for names of contributors. + +// Assembly to mimic runtime.getg. + +// +build amd64 amd64p32 +// +build gc,go1.5 + +#include "go_asm.h" +#include "textflag.h" + +// func Get() int64 +TEXT ·Get(SB),NOSPLIT,$0-8 + MOVQ (TLS), R14 + MOVQ g_goid(R14), R13 + MOVQ R13, ret+0(FP) + RET diff --git a/vendor/github.com/petermattis/goid/goid_go1.5_arm.go b/vendor/github.com/petermattis/goid/goid_go1.5_arm.go new file mode 100644 index 000000000..97fb81659 --- /dev/null +++ b/vendor/github.com/petermattis/goid/goid_go1.5_arm.go @@ -0,0 +1,26 @@ +// Copyright 2016 Peter Mattis. +// +// 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. See the AUTHORS file +// for names of contributors. + +// +build arm +// +build gc,go1.5 + +package goid + +// Backdoor access to runtime·getg(). +func getg() *g // in goid_go1.5plus.s + +func Get() int64 { + return getg().goid +} diff --git a/vendor/github.com/petermattis/goid/goid_go1.5_arm.s b/vendor/github.com/petermattis/goid/goid_go1.5_arm.s new file mode 100644 index 000000000..edab4d80f --- /dev/null +++ b/vendor/github.com/petermattis/goid/goid_go1.5_arm.s @@ -0,0 +1,27 @@ +// Copyright 2016 Peter Mattis. +// +// 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. See the AUTHORS file +// for names of contributors. + +// Assembly to mimic runtime.getg. +// This should work on arm64 as well, but it hasn't been tested. + +// +build arm +// +build gc,go1.5 + +#include "textflag.h" + +// func getg() *g +TEXT ·getg(SB),NOSPLIT,$0-8 + MOVW g, ret+0(FP) + RET diff --git a/vendor/github.com/petermattis/goid/goid_slow.go b/vendor/github.com/petermattis/goid/goid_slow.go new file mode 100644 index 000000000..d2d37650a --- /dev/null +++ b/vendor/github.com/petermattis/goid/goid_slow.go @@ -0,0 +1,23 @@ +// Copyright 2016 Peter Mattis. +// +// 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. See the AUTHORS file +// for names of contributors. + +// +build go1.4,!go1.5,!amd64,!amd64p32,!arm,!386 go1.5,!go1.6,!amd64,!amd64p32,!arm go1.6,!amd64,!amd64p32,!arm go1.9,!amd64,!amd64p32,!arm + +package goid + +// Get returns the id of the current goroutine. +func Get() int64 { + return getSlow() +} diff --git a/vendor/github.com/petermattis/goid/runtime_gccgo_go1.8.go b/vendor/github.com/petermattis/goid/runtime_gccgo_go1.8.go new file mode 100644 index 000000000..42c12bcc2 --- /dev/null +++ b/vendor/github.com/petermattis/goid/runtime_gccgo_go1.8.go @@ -0,0 +1,16 @@ +// +build gccgo,go1.8 + +package goid + +// https://github.com/gcc-mirror/gcc/blob/gcc-7-branch/libgo/go/runtime/runtime2.go#L329-L422 + +type g struct { + _panic uintptr + _defer uintptr + m uintptr + syscallsp uintptr + syscallpc uintptr + param uintptr + atomicstatus uint32 + goid int64 // Here it is! +} diff --git a/vendor/github.com/petermattis/goid/runtime_go1.5.go b/vendor/github.com/petermattis/goid/runtime_go1.5.go new file mode 100644 index 000000000..e1279a017 --- /dev/null +++ b/vendor/github.com/petermattis/goid/runtime_go1.5.go @@ -0,0 +1,56 @@ +// Copyright 2016 Peter Mattis. +// +// 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. See the AUTHORS file +// for names of contributors. + +// +build go1.5,!go1.6 + +package goid + +// Just enough of the structs from runtime/runtime2.go to get the offset to goid. +// See https://github.com/golang/go/blob/release-branch.go1.5/src/runtime/runtime2.go + +type stack struct { + lo uintptr + hi uintptr +} + +type gobuf struct { + sp uintptr + pc uintptr + g uintptr + ctxt uintptr + ret uintptr + lr uintptr + bp uintptr +} + +type g struct { + stack stack + stackguard0 uintptr + stackguard1 uintptr + + _panic uintptr + _defer uintptr + m uintptr + stackAlloc uintptr + sched gobuf + syscallsp uintptr + syscallpc uintptr + stkbar []uintptr + stkbarPos uintptr + param uintptr + atomicstatus uint32 + stackLock uint32 + goid int64 // Here it is! +} diff --git a/vendor/github.com/petermattis/goid/runtime_go1.6.go b/vendor/github.com/petermattis/goid/runtime_go1.6.go new file mode 100644 index 000000000..6b0067b1f --- /dev/null +++ b/vendor/github.com/petermattis/goid/runtime_go1.6.go @@ -0,0 +1,42 @@ +// +build gc,go1.6,!go1.9 + +package goid + +// Just enough of the structs from runtime/runtime2.go to get the offset to goid. +// See https://github.com/golang/go/blob/release-branch.go1.6/src/runtime/runtime2.go + +type stack struct { + lo uintptr + hi uintptr +} + +type gobuf struct { + sp uintptr + pc uintptr + g uintptr + ctxt uintptr + ret uintptr + lr uintptr + bp uintptr +} + +type g struct { + stack stack + stackguard0 uintptr + stackguard1 uintptr + + _panic uintptr + _defer uintptr + m uintptr + stackAlloc uintptr + sched gobuf + syscallsp uintptr + syscallpc uintptr + stkbar []uintptr + stkbarPos uintptr + stktopsp uintptr + param uintptr + atomicstatus uint32 + stackLock uint32 + goid int64 // Here it is! +} diff --git a/vendor/github.com/petermattis/goid/runtime_go1.9.go b/vendor/github.com/petermattis/goid/runtime_go1.9.go new file mode 100644 index 000000000..bf2c69668 --- /dev/null +++ b/vendor/github.com/petermattis/goid/runtime_go1.9.go @@ -0,0 +1,36 @@ +// +build gc,go1.9 + +package goid + +type stack struct { + lo uintptr + hi uintptr +} + +type gobuf struct { + sp uintptr + pc uintptr + g uintptr + ctxt uintptr + ret uintptr + lr uintptr + bp uintptr +} + +type g struct { + stack stack + stackguard0 uintptr + stackguard1 uintptr + + _panic uintptr + _defer uintptr + m uintptr + sched gobuf + syscallsp uintptr + syscallpc uintptr + stktopsp uintptr + param uintptr + atomicstatus uint32 + stackLock uint32 + goid int64 // Here it is! +} diff --git a/vendor/github.com/rivo/uniseg/README.md b/vendor/github.com/rivo/uniseg/README.md index f8da293e1..89fc21a3d 100644 --- a/vendor/github.com/rivo/uniseg/README.md +++ b/vendor/github.com/rivo/uniseg/README.md @@ -1,14 +1,14 @@ # Unicode Text Segmentation for Go -[![Godoc Reference](https://img.shields.io/badge/godoc-reference-blue.svg)](https://godoc.org/github.com/rivo/uniseg) +[![Go Reference](https://pkg.go.dev/badge/github.com/rivo/uniseg.svg)](https://pkg.go.dev/github.com/rivo/uniseg) [![Go Report](https://img.shields.io/badge/go%20report-A%2B-brightgreen.svg)](https://goreportcard.com/report/github.com/rivo/uniseg) -This Go package implements Unicode Text Segmentation according to [Unicode Standard Annex #29](http://unicode.org/reports/tr29/) (Unicode version 12.0.0). - -At this point, only the determination of grapheme cluster boundaries is implemented. +This Go package implements Unicode Text Segmentation according to [Unicode Standard Annex #29](https://unicode.org/reports/tr29/) and Unicode Line Breaking according to [Unicode Standard Annex #14](https://unicode.org/reports/tr14/) (Unicode version 14.0.0). ## Background +### Grapheme Clusters + In Go, [strings are read-only slices of bytes](https://blog.golang.org/strings). They can be turned into Unicode code points using the `for` loop or by casting: `[]rune(str)`. However, multiple code points may be combined into one user-perceived character or what the Unicode specification calls "grapheme cluster". Here are some examples: |String|Bytes (UTF-8)|Code points (runes)|Grapheme clusters| @@ -17,7 +17,19 @@ In Go, [strings are read-only slices of bytes](https://blog.golang.org/strings). |🏳️‍đźŚ|14 bytes: `f0 9f 8f b3 ef b8 8f e2 80 8d f0 9f 8c 88`|4 code points: `1f3f3 fe0f 200d 1f308`|1 cluster: `[1f3f3 fe0f 200d 1f308]`| |🇩🇪|8 bytes: `f0 9f 87 a9 f0 9f 87 aa`|2 code points: `1f1e9 1f1ea`|1 cluster: `[1f1e9 1f1ea]`| -This package provides a tool to iterate over these grapheme clusters. This may be used to determine the number of user-perceived characters, to split strings in their intended places, or to extract individual characters which form a unit. +This package provides tools to iterate over these grapheme clusters. This may be used to determine the number of user-perceived characters, to split strings in their intended places, or to extract individual characters which form a unit. + +### Word Boundaries + +Word boundaries are used in a number of different contexts. The most familiar ones are selection (double-click mouse selection), cursor movement ("move to next word" control-arrow keys), and the dialog option "Whole Word Search" for search and replace. They are also used in database queries, to determine whether elements are within a certain number of words of one another. Searching may also use word boundaries in determining matching items. This package provides tools to determine word boundaries within strings. + +### Sentence Boundaries + +Sentence boundaries are often used for triple-click or some other method of selecting or iterating through blocks of text that are larger than single words. They are also used to determine whether words occur within the same sentence in database queries. This package provides tools to determine sentence boundaries within strings. + +### Line Breaking + +Line breaking, also known as word wrapping, is the process of breaking a section of text into lines such that it will fit in the available width of a page, window or other display area. This package provides tools to determine where a string may or may not be broken and where it must be broken (for example after newline characters). ## Installation @@ -25,38 +37,102 @@ This package provides a tool to iterate over these grapheme clusters. This may b go get github.com/rivo/uniseg ``` -## Basic Example +## Examples + +### Counting Characters in a String ```go -package uniseg - -import ( - "fmt" - - "github.com/rivo/uniseg" -) - -func main() { - gr := uniseg.NewGraphemes("👍🏼!") - for gr.Next() { - fmt.Printf("%x ", gr.Runes()) - } - // Output: [1f44d 1f3fc] [21] -} +n := uniseg.GraphemeClusterCount("🇩🇪🏳️‍đźŚ") +fmt.Println(n) +// 2 ``` +### Using the [`Graphemes`](https://pkg.go.dev/github.com/rivo/uniseg#Graphemes) Class + +This is the most convenient method of iterating over grapheme clusters: + +```go +gr := uniseg.NewGraphemes("👍🏼!") +for gr.Next() { + fmt.Printf("%x ", gr.Runes()) +} +// [1f44d 1f3fc] [21] +``` + +### Using the [`Step`](https://pkg.go.dev/github.com/rivo/uniseg#Step) or [`StepString`](https://pkg.go.dev/github.com/rivo/uniseg#StepString) Function + +This is orders of magnitude faster than the `Graphemes` class, but it requires the handling of states and boundaries: + +```go +str := "🇩🇪🏳️‍đźŚ" +state := -1 +var c string +for len(str) > 0 { + c, str, _, state = uniseg.StepString(str, state) + fmt.Printf("%x ", []rune(c)) +} +// [1f1e9 1f1ea] [1f3f3 fe0f 200d 1f308] +``` + +### Advanced Examples + +Breaking into grapheme clusters and evaluating line breaks: + +```go +str := "First line.\nSecond line." +state := -1 +var ( + c string + boundaries int +) +for len(str) > 0 { + c, str, boundaries, state = uniseg.StepString(str, state) + fmt.Print(c) + if boundaries&uniseg.MaskLine == uniseg.LineCanBreak { + fmt.Print("|") + } else if boundaries&uniseg.MaskLine == uniseg.LineMustBreak { + fmt.Print("‖") + } +} +// First |line. +// ‖Second |line.‖ +``` + +If you're only interested in word segmentation, use [`FirstWord`](https://pkg.go.dev/github.com/rivo/uniseg#FirstWord) or [`FirstWordInString`](https://pkg.go.dev/github.com/rivo/uniseg#FirstWordInString): + +```go +str := "Hello, world!" +state := -1 +var c string +for len(str) > 0 { + c, str, state = uniseg.FirstWordInString(str, state) + fmt.Printf("(%s)\n", c) +} +// (Hello) +// (,) +// ( ) +// (world) +// (!) +``` + +Similarly, use + +- [`FirstGraphemeCluster`](https://pkg.go.dev/github.com/rivo/uniseg#FirstGraphemeCluster) or [`FirstGraphemeClusterInString`](https://pkg.go.dev/github.com/rivo/uniseg#FirstGraphemeClusterInString) for grapheme cluster determination only, +- [`FirstSentence`](https://pkg.go.dev/github.com/rivo/uniseg#FirstSentence) or [`FirstSentenceInString`](https://pkg.go.dev/github.com/rivo/uniseg#FirstSentenceInString) for sentence segmentation only, and +- [`FirstLineSegment`](https://pkg.go.dev/github.com/rivo/uniseg#FirstLineSegment) or [`FirstLineSegmentInString`](https://pkg.go.dev/github.com/rivo/uniseg#FirstLineSegmentInString) for line breaking / word wrapping (although using [`Step`](https://pkg.go.dev/github.com/rivo/uniseg#Step) or [`StepString`](https://pkg.go.dev/github.com/rivo/uniseg#StepString) is preferred as it will observe grapheme cluster boundaries). + ## Documentation -Refer to https://godoc.org/github.com/rivo/uniseg for the package's documentation. +Refer to https://pkg.go.dev/github.com/rivo/uniseg for the package's documentation. ## Dependencies This package does not depend on any packages outside the standard library. +## Sponsor this Project + +[Become a Sponsor on GitHub](https://github.com/sponsors/rivo?metadata_source=uniseg_readme) to support this project! + ## Your Feedback -Add your issue here on GitHub. Feel free to get in touch if you have any questions. - -## Version - -Version tags will be introduced once Golang modules are official. Consider this version 0.1. +Add your issue here on GitHub, preferably before submitting any PR's. Feel free to get in touch if you have any questions. \ No newline at end of file diff --git a/vendor/github.com/rivo/uniseg/doc.go b/vendor/github.com/rivo/uniseg/doc.go index 60c737d7b..6c498ede1 100644 --- a/vendor/github.com/rivo/uniseg/doc.go +++ b/vendor/github.com/rivo/uniseg/doc.go @@ -1,8 +1,53 @@ /* -Package uniseg implements Unicode Text Segmentation according to Unicode -Standard Annex #29 (http://unicode.org/reports/tr29/). +Package uniseg implements Unicode Text Segmentation and Unicode Line Breaking. +Unicode Text Segmentation conforms to Unicode Standard Annex #29 +(https://unicode.org/reports/tr29/) and Unicode Line Breaking conforms to +Unicode Standard Annex #14 (https://unicode.org/reports/tr14/). + +In short, using this package, you can split a string into grapheme clusters +(what people would usually refer to as a "character"), into words, and into +sentences. Or, in its simplest case, this package allows you to count the number +of characters in a string, especially when it contains complex characters such +as emojis, combining characters, or characters from Asian, Arabic, Hebrew, or +other languages. Additionally, you can use it to implement line breaking (or +"word wrapping"), that is, to determine where text can be broken over to the +next line when the width of the line is not big enough to fit the entire text. + +Grapheme Clusters + +Consider the rainbow flag emoji: 🏳️‍đźŚ. On most modern systems, it appears as one +character. But its string representation actually has 14 bytes, so counting +bytes (or using len("🏳️‍đźŚ")) will not work as expected. Counting runes won't, +either: The flag has 4 Unicode code points, thus 4 runes. The stdlib function +utf8.RuneCountInString("🏳️‍đźŚ") and len([]rune("🏳️‍đźŚ")) will both return 4. + +The uniseg.GraphemeClusterCount(str) function will return 1 for the rainbow flag +emoji. The Graphemes class and a variety of functions in this package will allow +you to split strings into its grapheme clusters. + +Word Boundaries + +Word boundaries are used in a number of different contexts. The most familiar +ones are selection (double-click mouse selection), cursor movement ("move to +next word" control-arrow keys), and the dialog option "Whole Word Search" for +search and replace. This package provides methods for determining word +boundaries. + +Sentence Boundaries + +Sentence boundaries are often used for triple-click or some other method of +selecting or iterating through blocks of text that are larger than single words. +They are also used to determine whether words occur within the same sentence in +database queries. This package provides methods for determining sentence +boundaries. + +Line Breaking + +Line breaking, also known as word wrapping, is the process of breaking a section +of text into lines such that it will fit in the available width of a page, +window or other display area. This package provides methods to determine the +positions in a string where a line must be broken, may be broken, or must not be +broken. -At this point, only the determination of grapheme cluster boundaries is -implemented. */ package uniseg diff --git a/vendor/github.com/rivo/uniseg/eastasianwidth.go b/vendor/github.com/rivo/uniseg/eastasianwidth.go new file mode 100644 index 000000000..456c1cac5 --- /dev/null +++ b/vendor/github.com/rivo/uniseg/eastasianwidth.go @@ -0,0 +1,2553 @@ +package uniseg + +// Code generated via go generate from gen_properties.go. DO NOT EDIT. + +// eastAsianWidth are taken from +// https://www.unicode.org/Public/14.0.0/ucd/EastAsianWidth.txt +// on July 25, 2022. See https://www.unicode.org/license.html for the Unicode +// license agreement. +var eastAsianWidth = [][3]int{ + {0x0000, 0x001F, prN}, // Cc [32] .. + {0x0020, 0x0020, prNa}, // Zs SPACE + {0x0021, 0x0023, prNa}, // Po [3] EXCLAMATION MARK..NUMBER SIGN + {0x0024, 0x0024, prNa}, // Sc DOLLAR SIGN + {0x0025, 0x0027, prNa}, // Po [3] PERCENT SIGN..APOSTROPHE + {0x0028, 0x0028, prNa}, // Ps LEFT PARENTHESIS + {0x0029, 0x0029, prNa}, // Pe RIGHT PARENTHESIS + {0x002A, 0x002A, prNa}, // Po ASTERISK + {0x002B, 0x002B, prNa}, // Sm PLUS SIGN + {0x002C, 0x002C, prNa}, // Po COMMA + {0x002D, 0x002D, prNa}, // Pd HYPHEN-MINUS + {0x002E, 0x002F, prNa}, // Po [2] FULL STOP..SOLIDUS + {0x0030, 0x0039, prNa}, // Nd [10] DIGIT ZERO..DIGIT NINE + {0x003A, 0x003B, prNa}, // Po [2] COLON..SEMICOLON + {0x003C, 0x003E, prNa}, // Sm [3] LESS-THAN SIGN..GREATER-THAN SIGN + {0x003F, 0x0040, prNa}, // Po [2] QUESTION MARK..COMMERCIAL AT + {0x0041, 0x005A, prNa}, // Lu [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z + {0x005B, 0x005B, prNa}, // Ps LEFT SQUARE BRACKET + {0x005C, 0x005C, prNa}, // Po REVERSE SOLIDUS + {0x005D, 0x005D, prNa}, // Pe RIGHT SQUARE BRACKET + {0x005E, 0x005E, prNa}, // Sk CIRCUMFLEX ACCENT + {0x005F, 0x005F, prNa}, // Pc LOW LINE + {0x0060, 0x0060, prNa}, // Sk GRAVE ACCENT + {0x0061, 0x007A, prNa}, // Ll [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z + {0x007B, 0x007B, prNa}, // Ps LEFT CURLY BRACKET + {0x007C, 0x007C, prNa}, // Sm VERTICAL LINE + {0x007D, 0x007D, prNa}, // Pe RIGHT CURLY BRACKET + {0x007E, 0x007E, prNa}, // Sm TILDE + {0x007F, 0x007F, prN}, // Cc + {0x0080, 0x009F, prN}, // Cc [32] .. + {0x00A0, 0x00A0, prN}, // Zs NO-BREAK SPACE + {0x00A1, 0x00A1, prA}, // Po INVERTED EXCLAMATION MARK + {0x00A2, 0x00A3, prNa}, // Sc [2] CENT SIGN..POUND SIGN + {0x00A4, 0x00A4, prA}, // Sc CURRENCY SIGN + {0x00A5, 0x00A5, prNa}, // Sc YEN SIGN + {0x00A6, 0x00A6, prNa}, // So BROKEN BAR + {0x00A7, 0x00A7, prA}, // Po SECTION SIGN + {0x00A8, 0x00A8, prA}, // Sk DIAERESIS + {0x00A9, 0x00A9, prN}, // So COPYRIGHT SIGN + {0x00AA, 0x00AA, prA}, // Lo FEMININE ORDINAL INDICATOR + {0x00AB, 0x00AB, prN}, // Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + {0x00AC, 0x00AC, prNa}, // Sm NOT SIGN + {0x00AD, 0x00AD, prA}, // Cf SOFT HYPHEN + {0x00AE, 0x00AE, prA}, // So REGISTERED SIGN + {0x00AF, 0x00AF, prNa}, // Sk MACRON + {0x00B0, 0x00B0, prA}, // So DEGREE SIGN + {0x00B1, 0x00B1, prA}, // Sm PLUS-MINUS SIGN + {0x00B2, 0x00B3, prA}, // No [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE + {0x00B4, 0x00B4, prA}, // Sk ACUTE ACCENT + {0x00B5, 0x00B5, prN}, // Ll MICRO SIGN + {0x00B6, 0x00B7, prA}, // Po [2] PILCROW SIGN..MIDDLE DOT + {0x00B8, 0x00B8, prA}, // Sk CEDILLA + {0x00B9, 0x00B9, prA}, // No SUPERSCRIPT ONE + {0x00BA, 0x00BA, prA}, // Lo MASCULINE ORDINAL INDICATOR + {0x00BB, 0x00BB, prN}, // Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + {0x00BC, 0x00BE, prA}, // No [3] VULGAR FRACTION ONE QUARTER..VULGAR FRACTION THREE QUARTERS + {0x00BF, 0x00BF, prA}, // Po INVERTED QUESTION MARK + {0x00C0, 0x00C5, prN}, // Lu [6] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER A WITH RING ABOVE + {0x00C6, 0x00C6, prA}, // Lu LATIN CAPITAL LETTER AE + {0x00C7, 0x00CF, prN}, // Lu [9] LATIN CAPITAL LETTER C WITH CEDILLA..LATIN CAPITAL LETTER I WITH DIAERESIS + {0x00D0, 0x00D0, prA}, // Lu LATIN CAPITAL LETTER ETH + {0x00D1, 0x00D6, prN}, // Lu [6] LATIN CAPITAL LETTER N WITH TILDE..LATIN CAPITAL LETTER O WITH DIAERESIS + {0x00D7, 0x00D7, prA}, // Sm MULTIPLICATION SIGN + {0x00D8, 0x00D8, prA}, // Lu LATIN CAPITAL LETTER O WITH STROKE + {0x00D9, 0x00DD, prN}, // Lu [5] LATIN CAPITAL LETTER U WITH GRAVE..LATIN CAPITAL LETTER Y WITH ACUTE + {0x00DE, 0x00E1, prA}, // L& [4] LATIN CAPITAL LETTER THORN..LATIN SMALL LETTER A WITH ACUTE + {0x00E2, 0x00E5, prN}, // Ll [4] LATIN SMALL LETTER A WITH CIRCUMFLEX..LATIN SMALL LETTER A WITH RING ABOVE + {0x00E6, 0x00E6, prA}, // Ll LATIN SMALL LETTER AE + {0x00E7, 0x00E7, prN}, // Ll LATIN SMALL LETTER C WITH CEDILLA + {0x00E8, 0x00EA, prA}, // Ll [3] LATIN SMALL LETTER E WITH GRAVE..LATIN SMALL LETTER E WITH CIRCUMFLEX + {0x00EB, 0x00EB, prN}, // Ll LATIN SMALL LETTER E WITH DIAERESIS + {0x00EC, 0x00ED, prA}, // Ll [2] LATIN SMALL LETTER I WITH GRAVE..LATIN SMALL LETTER I WITH ACUTE + {0x00EE, 0x00EF, prN}, // Ll [2] LATIN SMALL LETTER I WITH CIRCUMFLEX..LATIN SMALL LETTER I WITH DIAERESIS + {0x00F0, 0x00F0, prA}, // Ll LATIN SMALL LETTER ETH + {0x00F1, 0x00F1, prN}, // Ll LATIN SMALL LETTER N WITH TILDE + {0x00F2, 0x00F3, prA}, // Ll [2] LATIN SMALL LETTER O WITH GRAVE..LATIN SMALL LETTER O WITH ACUTE + {0x00F4, 0x00F6, prN}, // Ll [3] LATIN SMALL LETTER O WITH CIRCUMFLEX..LATIN SMALL LETTER O WITH DIAERESIS + {0x00F7, 0x00F7, prA}, // Sm DIVISION SIGN + {0x00F8, 0x00FA, prA}, // Ll [3] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER U WITH ACUTE + {0x00FB, 0x00FB, prN}, // Ll LATIN SMALL LETTER U WITH CIRCUMFLEX + {0x00FC, 0x00FC, prA}, // Ll LATIN SMALL LETTER U WITH DIAERESIS + {0x00FD, 0x00FD, prN}, // Ll LATIN SMALL LETTER Y WITH ACUTE + {0x00FE, 0x00FE, prA}, // Ll LATIN SMALL LETTER THORN + {0x00FF, 0x00FF, prN}, // Ll LATIN SMALL LETTER Y WITH DIAERESIS + {0x0100, 0x0100, prN}, // Lu LATIN CAPITAL LETTER A WITH MACRON + {0x0101, 0x0101, prA}, // Ll LATIN SMALL LETTER A WITH MACRON + {0x0102, 0x0110, prN}, // L& [15] LATIN CAPITAL LETTER A WITH BREVE..LATIN CAPITAL LETTER D WITH STROKE + {0x0111, 0x0111, prA}, // Ll LATIN SMALL LETTER D WITH STROKE + {0x0112, 0x0112, prN}, // Lu LATIN CAPITAL LETTER E WITH MACRON + {0x0113, 0x0113, prA}, // Ll LATIN SMALL LETTER E WITH MACRON + {0x0114, 0x011A, prN}, // L& [7] LATIN CAPITAL LETTER E WITH BREVE..LATIN CAPITAL LETTER E WITH CARON + {0x011B, 0x011B, prA}, // Ll LATIN SMALL LETTER E WITH CARON + {0x011C, 0x0125, prN}, // L& [10] LATIN CAPITAL LETTER G WITH CIRCUMFLEX..LATIN SMALL LETTER H WITH CIRCUMFLEX + {0x0126, 0x0127, prA}, // L& [2] LATIN CAPITAL LETTER H WITH STROKE..LATIN SMALL LETTER H WITH STROKE + {0x0128, 0x012A, prN}, // L& [3] LATIN CAPITAL LETTER I WITH TILDE..LATIN CAPITAL LETTER I WITH MACRON + {0x012B, 0x012B, prA}, // Ll LATIN SMALL LETTER I WITH MACRON + {0x012C, 0x0130, prN}, // L& [5] LATIN CAPITAL LETTER I WITH BREVE..LATIN CAPITAL LETTER I WITH DOT ABOVE + {0x0131, 0x0133, prA}, // L& [3] LATIN SMALL LETTER DOTLESS I..LATIN SMALL LIGATURE IJ + {0x0134, 0x0137, prN}, // L& [4] LATIN CAPITAL LETTER J WITH CIRCUMFLEX..LATIN SMALL LETTER K WITH CEDILLA + {0x0138, 0x0138, prA}, // Ll LATIN SMALL LETTER KRA + {0x0139, 0x013E, prN}, // L& [6] LATIN CAPITAL LETTER L WITH ACUTE..LATIN SMALL LETTER L WITH CARON + {0x013F, 0x0142, prA}, // L& [4] LATIN CAPITAL LETTER L WITH MIDDLE DOT..LATIN SMALL LETTER L WITH STROKE + {0x0143, 0x0143, prN}, // Lu LATIN CAPITAL LETTER N WITH ACUTE + {0x0144, 0x0144, prA}, // Ll LATIN SMALL LETTER N WITH ACUTE + {0x0145, 0x0147, prN}, // L& [3] LATIN CAPITAL LETTER N WITH CEDILLA..LATIN CAPITAL LETTER N WITH CARON + {0x0148, 0x014B, prA}, // L& [4] LATIN SMALL LETTER N WITH CARON..LATIN SMALL LETTER ENG + {0x014C, 0x014C, prN}, // Lu LATIN CAPITAL LETTER O WITH MACRON + {0x014D, 0x014D, prA}, // Ll LATIN SMALL LETTER O WITH MACRON + {0x014E, 0x0151, prN}, // L& [4] LATIN CAPITAL LETTER O WITH BREVE..LATIN SMALL LETTER O WITH DOUBLE ACUTE + {0x0152, 0x0153, prA}, // L& [2] LATIN CAPITAL LIGATURE OE..LATIN SMALL LIGATURE OE + {0x0154, 0x0165, prN}, // L& [18] LATIN CAPITAL LETTER R WITH ACUTE..LATIN SMALL LETTER T WITH CARON + {0x0166, 0x0167, prA}, // L& [2] LATIN CAPITAL LETTER T WITH STROKE..LATIN SMALL LETTER T WITH STROKE + {0x0168, 0x016A, prN}, // L& [3] LATIN CAPITAL LETTER U WITH TILDE..LATIN CAPITAL LETTER U WITH MACRON + {0x016B, 0x016B, prA}, // Ll LATIN SMALL LETTER U WITH MACRON + {0x016C, 0x017F, prN}, // L& [20] LATIN CAPITAL LETTER U WITH BREVE..LATIN SMALL LETTER LONG S + {0x0180, 0x01BA, prN}, // L& [59] LATIN SMALL LETTER B WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL + {0x01BB, 0x01BB, prN}, // Lo LATIN LETTER TWO WITH STROKE + {0x01BC, 0x01BF, prN}, // L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN + {0x01C0, 0x01C3, prN}, // Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK + {0x01C4, 0x01CD, prN}, // L& [10] LATIN CAPITAL LETTER DZ WITH CARON..LATIN CAPITAL LETTER A WITH CARON + {0x01CE, 0x01CE, prA}, // Ll LATIN SMALL LETTER A WITH CARON + {0x01CF, 0x01CF, prN}, // Lu LATIN CAPITAL LETTER I WITH CARON + {0x01D0, 0x01D0, prA}, // Ll LATIN SMALL LETTER I WITH CARON + {0x01D1, 0x01D1, prN}, // Lu LATIN CAPITAL LETTER O WITH CARON + {0x01D2, 0x01D2, prA}, // Ll LATIN SMALL LETTER O WITH CARON + {0x01D3, 0x01D3, prN}, // Lu LATIN CAPITAL LETTER U WITH CARON + {0x01D4, 0x01D4, prA}, // Ll LATIN SMALL LETTER U WITH CARON + {0x01D5, 0x01D5, prN}, // Lu LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON + {0x01D6, 0x01D6, prA}, // Ll LATIN SMALL LETTER U WITH DIAERESIS AND MACRON + {0x01D7, 0x01D7, prN}, // Lu LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE + {0x01D8, 0x01D8, prA}, // Ll LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE + {0x01D9, 0x01D9, prN}, // Lu LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON + {0x01DA, 0x01DA, prA}, // Ll LATIN SMALL LETTER U WITH DIAERESIS AND CARON + {0x01DB, 0x01DB, prN}, // Lu LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE + {0x01DC, 0x01DC, prA}, // Ll LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE + {0x01DD, 0x024F, prN}, // L& [115] LATIN SMALL LETTER TURNED E..LATIN SMALL LETTER Y WITH STROKE + {0x0250, 0x0250, prN}, // Ll LATIN SMALL LETTER TURNED A + {0x0251, 0x0251, prA}, // Ll LATIN SMALL LETTER ALPHA + {0x0252, 0x0260, prN}, // Ll [15] LATIN SMALL LETTER TURNED ALPHA..LATIN SMALL LETTER G WITH HOOK + {0x0261, 0x0261, prA}, // Ll LATIN SMALL LETTER SCRIPT G + {0x0262, 0x0293, prN}, // Ll [50] LATIN LETTER SMALL CAPITAL G..LATIN SMALL LETTER EZH WITH CURL + {0x0294, 0x0294, prN}, // Lo LATIN LETTER GLOTTAL STOP + {0x0295, 0x02AF, prN}, // Ll [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL + {0x02B0, 0x02C1, prN}, // Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP + {0x02C2, 0x02C3, prN}, // Sk [2] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER RIGHT ARROWHEAD + {0x02C4, 0x02C4, prA}, // Sk MODIFIER LETTER UP ARROWHEAD + {0x02C5, 0x02C5, prN}, // Sk MODIFIER LETTER DOWN ARROWHEAD + {0x02C6, 0x02C6, prN}, // Lm MODIFIER LETTER CIRCUMFLEX ACCENT + {0x02C7, 0x02C7, prA}, // Lm CARON + {0x02C8, 0x02C8, prN}, // Lm MODIFIER LETTER VERTICAL LINE + {0x02C9, 0x02CB, prA}, // Lm [3] MODIFIER LETTER MACRON..MODIFIER LETTER GRAVE ACCENT + {0x02CC, 0x02CC, prN}, // Lm MODIFIER LETTER LOW VERTICAL LINE + {0x02CD, 0x02CD, prA}, // Lm MODIFIER LETTER LOW MACRON + {0x02CE, 0x02CF, prN}, // Lm [2] MODIFIER LETTER LOW GRAVE ACCENT..MODIFIER LETTER LOW ACUTE ACCENT + {0x02D0, 0x02D0, prA}, // Lm MODIFIER LETTER TRIANGULAR COLON + {0x02D1, 0x02D1, prN}, // Lm MODIFIER LETTER HALF TRIANGULAR COLON + {0x02D2, 0x02D7, prN}, // Sk [6] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER MINUS SIGN + {0x02D8, 0x02DB, prA}, // Sk [4] BREVE..OGONEK + {0x02DC, 0x02DC, prN}, // Sk SMALL TILDE + {0x02DD, 0x02DD, prA}, // Sk DOUBLE ACUTE ACCENT + {0x02DE, 0x02DE, prN}, // Sk MODIFIER LETTER RHOTIC HOOK + {0x02DF, 0x02DF, prA}, // Sk MODIFIER LETTER CROSS ACCENT + {0x02E0, 0x02E4, prN}, // Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP + {0x02E5, 0x02EB, prN}, // Sk [7] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER YANG DEPARTING TONE MARK + {0x02EC, 0x02EC, prN}, // Lm MODIFIER LETTER VOICING + {0x02ED, 0x02ED, prN}, // Sk MODIFIER LETTER UNASPIRATED + {0x02EE, 0x02EE, prN}, // Lm MODIFIER LETTER DOUBLE APOSTROPHE + {0x02EF, 0x02FF, prN}, // Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW + {0x0300, 0x036F, prA}, // Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X + {0x0370, 0x0373, prN}, // L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI + {0x0374, 0x0374, prN}, // Lm GREEK NUMERAL SIGN + {0x0375, 0x0375, prN}, // Sk GREEK LOWER NUMERAL SIGN + {0x0376, 0x0377, prN}, // L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA + {0x037A, 0x037A, prN}, // Lm GREEK YPOGEGRAMMENI + {0x037B, 0x037D, prN}, // Ll [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL + {0x037E, 0x037E, prN}, // Po GREEK QUESTION MARK + {0x037F, 0x037F, prN}, // Lu GREEK CAPITAL LETTER YOT + {0x0384, 0x0385, prN}, // Sk [2] GREEK TONOS..GREEK DIALYTIKA TONOS + {0x0386, 0x0386, prN}, // Lu GREEK CAPITAL LETTER ALPHA WITH TONOS + {0x0387, 0x0387, prN}, // Po GREEK ANO TELEIA + {0x0388, 0x038A, prN}, // Lu [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS + {0x038C, 0x038C, prN}, // Lu GREEK CAPITAL LETTER OMICRON WITH TONOS + {0x038E, 0x0390, prN}, // L& [3] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + {0x0391, 0x03A1, prA}, // Lu [17] GREEK CAPITAL LETTER ALPHA..GREEK CAPITAL LETTER RHO + {0x03A3, 0x03A9, prA}, // Lu [7] GREEK CAPITAL LETTER SIGMA..GREEK CAPITAL LETTER OMEGA + {0x03AA, 0x03B0, prN}, // L& [7] GREEK CAPITAL LETTER IOTA WITH DIALYTIKA..GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + {0x03B1, 0x03C1, prA}, // Ll [17] GREEK SMALL LETTER ALPHA..GREEK SMALL LETTER RHO + {0x03C2, 0x03C2, prN}, // Ll GREEK SMALL LETTER FINAL SIGMA + {0x03C3, 0x03C9, prA}, // Ll [7] GREEK SMALL LETTER SIGMA..GREEK SMALL LETTER OMEGA + {0x03CA, 0x03F5, prN}, // L& [44] GREEK SMALL LETTER IOTA WITH DIALYTIKA..GREEK LUNATE EPSILON SYMBOL + {0x03F6, 0x03F6, prN}, // Sm GREEK REVERSED LUNATE EPSILON SYMBOL + {0x03F7, 0x03FF, prN}, // L& [9] GREEK CAPITAL LETTER SHO..GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL + {0x0400, 0x0400, prN}, // Lu CYRILLIC CAPITAL LETTER IE WITH GRAVE + {0x0401, 0x0401, prA}, // Lu CYRILLIC CAPITAL LETTER IO + {0x0402, 0x040F, prN}, // Lu [14] CYRILLIC CAPITAL LETTER DJE..CYRILLIC CAPITAL LETTER DZHE + {0x0410, 0x044F, prA}, // L& [64] CYRILLIC CAPITAL LETTER A..CYRILLIC SMALL LETTER YA + {0x0450, 0x0450, prN}, // Ll CYRILLIC SMALL LETTER IE WITH GRAVE + {0x0451, 0x0451, prA}, // Ll CYRILLIC SMALL LETTER IO + {0x0452, 0x0481, prN}, // L& [48] CYRILLIC SMALL LETTER DJE..CYRILLIC SMALL LETTER KOPPA + {0x0482, 0x0482, prN}, // So CYRILLIC THOUSANDS SIGN + {0x0483, 0x0487, prN}, // Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE + {0x0488, 0x0489, prN}, // Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN + {0x048A, 0x04FF, prN}, // L& [118] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER HA WITH STROKE + {0x0500, 0x052F, prN}, // L& [48] CYRILLIC CAPITAL LETTER KOMI DE..CYRILLIC SMALL LETTER EL WITH DESCENDER + {0x0531, 0x0556, prN}, // Lu [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH + {0x0559, 0x0559, prN}, // Lm ARMENIAN MODIFIER LETTER LEFT HALF RING + {0x055A, 0x055F, prN}, // Po [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK + {0x0560, 0x0588, prN}, // Ll [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE + {0x0589, 0x0589, prN}, // Po ARMENIAN FULL STOP + {0x058A, 0x058A, prN}, // Pd ARMENIAN HYPHEN + {0x058D, 0x058E, prN}, // So [2] RIGHT-FACING ARMENIAN ETERNITY SIGN..LEFT-FACING ARMENIAN ETERNITY SIGN + {0x058F, 0x058F, prN}, // Sc ARMENIAN DRAM SIGN + {0x0591, 0x05BD, prN}, // Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG + {0x05BE, 0x05BE, prN}, // Pd HEBREW PUNCTUATION MAQAF + {0x05BF, 0x05BF, prN}, // Mn HEBREW POINT RAFE + {0x05C0, 0x05C0, prN}, // Po HEBREW PUNCTUATION PASEQ + {0x05C1, 0x05C2, prN}, // Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT + {0x05C3, 0x05C3, prN}, // Po HEBREW PUNCTUATION SOF PASUQ + {0x05C4, 0x05C5, prN}, // Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT + {0x05C6, 0x05C6, prN}, // Po HEBREW PUNCTUATION NUN HAFUKHA + {0x05C7, 0x05C7, prN}, // Mn HEBREW POINT QAMATS QATAN + {0x05D0, 0x05EA, prN}, // Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV + {0x05EF, 0x05F2, prN}, // Lo [4] HEBREW YOD TRIANGLE..HEBREW LIGATURE YIDDISH DOUBLE YOD + {0x05F3, 0x05F4, prN}, // Po [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM + {0x0600, 0x0605, prN}, // Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE + {0x0606, 0x0608, prN}, // Sm [3] ARABIC-INDIC CUBE ROOT..ARABIC RAY + {0x0609, 0x060A, prN}, // Po [2] ARABIC-INDIC PER MILLE SIGN..ARABIC-INDIC PER TEN THOUSAND SIGN + {0x060B, 0x060B, prN}, // Sc AFGHANI SIGN + {0x060C, 0x060D, prN}, // Po [2] ARABIC COMMA..ARABIC DATE SEPARATOR + {0x060E, 0x060F, prN}, // So [2] ARABIC POETIC VERSE SIGN..ARABIC SIGN MISRA + {0x0610, 0x061A, prN}, // Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA + {0x061B, 0x061B, prN}, // Po ARABIC SEMICOLON + {0x061C, 0x061C, prN}, // Cf ARABIC LETTER MARK + {0x061D, 0x061F, prN}, // Po [3] ARABIC END OF TEXT MARK..ARABIC QUESTION MARK + {0x0620, 0x063F, prN}, // Lo [32] ARABIC LETTER KASHMIRI YEH..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE + {0x0640, 0x0640, prN}, // Lm ARABIC TATWEEL + {0x0641, 0x064A, prN}, // Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH + {0x064B, 0x065F, prN}, // Mn [21] ARABIC FATHATAN..ARABIC WAVY HAMZA BELOW + {0x0660, 0x0669, prN}, // Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE + {0x066A, 0x066D, prN}, // Po [4] ARABIC PERCENT SIGN..ARABIC FIVE POINTED STAR + {0x066E, 0x066F, prN}, // Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF + {0x0670, 0x0670, prN}, // Mn ARABIC LETTER SUPERSCRIPT ALEF + {0x0671, 0x06D3, prN}, // Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE + {0x06D4, 0x06D4, prN}, // Po ARABIC FULL STOP + {0x06D5, 0x06D5, prN}, // Lo ARABIC LETTER AE + {0x06D6, 0x06DC, prN}, // Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN + {0x06DD, 0x06DD, prN}, // Cf ARABIC END OF AYAH + {0x06DE, 0x06DE, prN}, // So ARABIC START OF RUB EL HIZB + {0x06DF, 0x06E4, prN}, // Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA + {0x06E5, 0x06E6, prN}, // Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH + {0x06E7, 0x06E8, prN}, // Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON + {0x06E9, 0x06E9, prN}, // So ARABIC PLACE OF SAJDAH + {0x06EA, 0x06ED, prN}, // Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM + {0x06EE, 0x06EF, prN}, // Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V + {0x06F0, 0x06F9, prN}, // Nd [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE + {0x06FA, 0x06FC, prN}, // Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW + {0x06FD, 0x06FE, prN}, // So [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN + {0x06FF, 0x06FF, prN}, // Lo ARABIC LETTER HEH WITH INVERTED V + {0x0700, 0x070D, prN}, // Po [14] SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS + {0x070F, 0x070F, prN}, // Cf SYRIAC ABBREVIATION MARK + {0x0710, 0x0710, prN}, // Lo SYRIAC LETTER ALAPH + {0x0711, 0x0711, prN}, // Mn SYRIAC LETTER SUPERSCRIPT ALAPH + {0x0712, 0x072F, prN}, // Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH + {0x0730, 0x074A, prN}, // Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH + {0x074D, 0x074F, prN}, // Lo [3] SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE + {0x0750, 0x077F, prN}, // Lo [48] ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW..ARABIC LETTER KAF WITH TWO DOTS ABOVE + {0x0780, 0x07A5, prN}, // Lo [38] THAANA LETTER HAA..THAANA LETTER WAAVU + {0x07A6, 0x07B0, prN}, // Mn [11] THAANA ABAFILI..THAANA SUKUN + {0x07B1, 0x07B1, prN}, // Lo THAANA LETTER NAA + {0x07C0, 0x07C9, prN}, // Nd [10] NKO DIGIT ZERO..NKO DIGIT NINE + {0x07CA, 0x07EA, prN}, // Lo [33] NKO LETTER A..NKO LETTER JONA RA + {0x07EB, 0x07F3, prN}, // Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE + {0x07F4, 0x07F5, prN}, // Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE + {0x07F6, 0x07F6, prN}, // So NKO SYMBOL OO DENNEN + {0x07F7, 0x07F9, prN}, // Po [3] NKO SYMBOL GBAKURUNEN..NKO EXCLAMATION MARK + {0x07FA, 0x07FA, prN}, // Lm NKO LAJANYALAN + {0x07FD, 0x07FD, prN}, // Mn NKO DANTAYALAN + {0x07FE, 0x07FF, prN}, // Sc [2] NKO DOROME SIGN..NKO TAMAN SIGN + {0x0800, 0x0815, prN}, // Lo [22] SAMARITAN LETTER ALAF..SAMARITAN LETTER TAAF + {0x0816, 0x0819, prN}, // Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH + {0x081A, 0x081A, prN}, // Lm SAMARITAN MODIFIER LETTER EPENTHETIC YUT + {0x081B, 0x0823, prN}, // Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A + {0x0824, 0x0824, prN}, // Lm SAMARITAN MODIFIER LETTER SHORT A + {0x0825, 0x0827, prN}, // Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U + {0x0828, 0x0828, prN}, // Lm SAMARITAN MODIFIER LETTER I + {0x0829, 0x082D, prN}, // Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA + {0x0830, 0x083E, prN}, // Po [15] SAMARITAN PUNCTUATION NEQUDAA..SAMARITAN PUNCTUATION ANNAAU + {0x0840, 0x0858, prN}, // Lo [25] MANDAIC LETTER HALQA..MANDAIC LETTER AIN + {0x0859, 0x085B, prN}, // Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK + {0x085E, 0x085E, prN}, // Po MANDAIC PUNCTUATION + {0x0860, 0x086A, prN}, // Lo [11] SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA + {0x0870, 0x0887, prN}, // Lo [24] ARABIC LETTER ALEF WITH ATTACHED FATHA..ARABIC BASELINE ROUND DOT + {0x0888, 0x0888, prN}, // Sk ARABIC RAISED ROUND DOT + {0x0889, 0x088E, prN}, // Lo [6] ARABIC LETTER NOON WITH INVERTED SMALL V..ARABIC VERTICAL TAIL + {0x0890, 0x0891, prN}, // Cf [2] ARABIC POUND MARK ABOVE..ARABIC PIASTRE MARK ABOVE + {0x0898, 0x089F, prN}, // Mn [8] ARABIC SMALL HIGH WORD AL-JUZ..ARABIC HALF MADDA OVER MADDA + {0x08A0, 0x08C8, prN}, // Lo [41] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER GRAF + {0x08C9, 0x08C9, prN}, // Lm ARABIC SMALL FARSI YEH + {0x08CA, 0x08E1, prN}, // Mn [24] ARABIC SMALL HIGH FARSI YEH..ARABIC SMALL HIGH SIGN SAFHA + {0x08E2, 0x08E2, prN}, // Cf ARABIC DISPUTED END OF AYAH + {0x08E3, 0x08FF, prN}, // Mn [29] ARABIC TURNED DAMMA BELOW..ARABIC MARK SIDEWAYS NOON GHUNNA + {0x0900, 0x0902, prN}, // Mn [3] DEVANAGARI SIGN INVERTED CANDRABINDU..DEVANAGARI SIGN ANUSVARA + {0x0903, 0x0903, prN}, // Mc DEVANAGARI SIGN VISARGA + {0x0904, 0x0939, prN}, // Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA + {0x093A, 0x093A, prN}, // Mn DEVANAGARI VOWEL SIGN OE + {0x093B, 0x093B, prN}, // Mc DEVANAGARI VOWEL SIGN OOE + {0x093C, 0x093C, prN}, // Mn DEVANAGARI SIGN NUKTA + {0x093D, 0x093D, prN}, // Lo DEVANAGARI SIGN AVAGRAHA + {0x093E, 0x0940, prN}, // Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II + {0x0941, 0x0948, prN}, // Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI + {0x0949, 0x094C, prN}, // Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU + {0x094D, 0x094D, prN}, // Mn DEVANAGARI SIGN VIRAMA + {0x094E, 0x094F, prN}, // Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW + {0x0950, 0x0950, prN}, // Lo DEVANAGARI OM + {0x0951, 0x0957, prN}, // Mn [7] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN UUE + {0x0958, 0x0961, prN}, // Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL + {0x0962, 0x0963, prN}, // Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL + {0x0964, 0x0965, prN}, // Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA + {0x0966, 0x096F, prN}, // Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE + {0x0970, 0x0970, prN}, // Po DEVANAGARI ABBREVIATION SIGN + {0x0971, 0x0971, prN}, // Lm DEVANAGARI SIGN HIGH SPACING DOT + {0x0972, 0x097F, prN}, // Lo [14] DEVANAGARI LETTER CANDRA A..DEVANAGARI LETTER BBA + {0x0980, 0x0980, prN}, // Lo BENGALI ANJI + {0x0981, 0x0981, prN}, // Mn BENGALI SIGN CANDRABINDU + {0x0982, 0x0983, prN}, // Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA + {0x0985, 0x098C, prN}, // Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L + {0x098F, 0x0990, prN}, // Lo [2] BENGALI LETTER E..BENGALI LETTER AI + {0x0993, 0x09A8, prN}, // Lo [22] BENGALI LETTER O..BENGALI LETTER NA + {0x09AA, 0x09B0, prN}, // Lo [7] BENGALI LETTER PA..BENGALI LETTER RA + {0x09B2, 0x09B2, prN}, // Lo BENGALI LETTER LA + {0x09B6, 0x09B9, prN}, // Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA + {0x09BC, 0x09BC, prN}, // Mn BENGALI SIGN NUKTA + {0x09BD, 0x09BD, prN}, // Lo BENGALI SIGN AVAGRAHA + {0x09BE, 0x09C0, prN}, // Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II + {0x09C1, 0x09C4, prN}, // Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR + {0x09C7, 0x09C8, prN}, // Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI + {0x09CB, 0x09CC, prN}, // Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU + {0x09CD, 0x09CD, prN}, // Mn BENGALI SIGN VIRAMA + {0x09CE, 0x09CE, prN}, // Lo BENGALI LETTER KHANDA TA + {0x09D7, 0x09D7, prN}, // Mc BENGALI AU LENGTH MARK + {0x09DC, 0x09DD, prN}, // Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA + {0x09DF, 0x09E1, prN}, // Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL + {0x09E2, 0x09E3, prN}, // Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL + {0x09E6, 0x09EF, prN}, // Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE + {0x09F0, 0x09F1, prN}, // Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL + {0x09F2, 0x09F3, prN}, // Sc [2] BENGALI RUPEE MARK..BENGALI RUPEE SIGN + {0x09F4, 0x09F9, prN}, // No [6] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY DENOMINATOR SIXTEEN + {0x09FA, 0x09FA, prN}, // So BENGALI ISSHAR + {0x09FB, 0x09FB, prN}, // Sc BENGALI GANDA MARK + {0x09FC, 0x09FC, prN}, // Lo BENGALI LETTER VEDIC ANUSVARA + {0x09FD, 0x09FD, prN}, // Po BENGALI ABBREVIATION SIGN + {0x09FE, 0x09FE, prN}, // Mn BENGALI SANDHI MARK + {0x0A01, 0x0A02, prN}, // Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI + {0x0A03, 0x0A03, prN}, // Mc GURMUKHI SIGN VISARGA + {0x0A05, 0x0A0A, prN}, // Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU + {0x0A0F, 0x0A10, prN}, // Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI + {0x0A13, 0x0A28, prN}, // Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA + {0x0A2A, 0x0A30, prN}, // Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA + {0x0A32, 0x0A33, prN}, // Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA + {0x0A35, 0x0A36, prN}, // Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA + {0x0A38, 0x0A39, prN}, // Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA + {0x0A3C, 0x0A3C, prN}, // Mn GURMUKHI SIGN NUKTA + {0x0A3E, 0x0A40, prN}, // Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II + {0x0A41, 0x0A42, prN}, // Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU + {0x0A47, 0x0A48, prN}, // Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI + {0x0A4B, 0x0A4D, prN}, // Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA + {0x0A51, 0x0A51, prN}, // Mn GURMUKHI SIGN UDAAT + {0x0A59, 0x0A5C, prN}, // Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA + {0x0A5E, 0x0A5E, prN}, // Lo GURMUKHI LETTER FA + {0x0A66, 0x0A6F, prN}, // Nd [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE + {0x0A70, 0x0A71, prN}, // Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK + {0x0A72, 0x0A74, prN}, // Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR + {0x0A75, 0x0A75, prN}, // Mn GURMUKHI SIGN YAKASH + {0x0A76, 0x0A76, prN}, // Po GURMUKHI ABBREVIATION SIGN + {0x0A81, 0x0A82, prN}, // Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA + {0x0A83, 0x0A83, prN}, // Mc GUJARATI SIGN VISARGA + {0x0A85, 0x0A8D, prN}, // Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E + {0x0A8F, 0x0A91, prN}, // Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O + {0x0A93, 0x0AA8, prN}, // Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA + {0x0AAA, 0x0AB0, prN}, // Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA + {0x0AB2, 0x0AB3, prN}, // Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA + {0x0AB5, 0x0AB9, prN}, // Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA + {0x0ABC, 0x0ABC, prN}, // Mn GUJARATI SIGN NUKTA + {0x0ABD, 0x0ABD, prN}, // Lo GUJARATI SIGN AVAGRAHA + {0x0ABE, 0x0AC0, prN}, // Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II + {0x0AC1, 0x0AC5, prN}, // Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E + {0x0AC7, 0x0AC8, prN}, // Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI + {0x0AC9, 0x0AC9, prN}, // Mc GUJARATI VOWEL SIGN CANDRA O + {0x0ACB, 0x0ACC, prN}, // Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU + {0x0ACD, 0x0ACD, prN}, // Mn GUJARATI SIGN VIRAMA + {0x0AD0, 0x0AD0, prN}, // Lo GUJARATI OM + {0x0AE0, 0x0AE1, prN}, // Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL + {0x0AE2, 0x0AE3, prN}, // Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL + {0x0AE6, 0x0AEF, prN}, // Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE + {0x0AF0, 0x0AF0, prN}, // Po GUJARATI ABBREVIATION SIGN + {0x0AF1, 0x0AF1, prN}, // Sc GUJARATI RUPEE SIGN + {0x0AF9, 0x0AF9, prN}, // Lo GUJARATI LETTER ZHA + {0x0AFA, 0x0AFF, prN}, // Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE + {0x0B01, 0x0B01, prN}, // Mn ORIYA SIGN CANDRABINDU + {0x0B02, 0x0B03, prN}, // Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA + {0x0B05, 0x0B0C, prN}, // Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L + {0x0B0F, 0x0B10, prN}, // Lo [2] ORIYA LETTER E..ORIYA LETTER AI + {0x0B13, 0x0B28, prN}, // Lo [22] ORIYA LETTER O..ORIYA LETTER NA + {0x0B2A, 0x0B30, prN}, // Lo [7] ORIYA LETTER PA..ORIYA LETTER RA + {0x0B32, 0x0B33, prN}, // Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA + {0x0B35, 0x0B39, prN}, // Lo [5] ORIYA LETTER VA..ORIYA LETTER HA + {0x0B3C, 0x0B3C, prN}, // Mn ORIYA SIGN NUKTA + {0x0B3D, 0x0B3D, prN}, // Lo ORIYA SIGN AVAGRAHA + {0x0B3E, 0x0B3E, prN}, // Mc ORIYA VOWEL SIGN AA + {0x0B3F, 0x0B3F, prN}, // Mn ORIYA VOWEL SIGN I + {0x0B40, 0x0B40, prN}, // Mc ORIYA VOWEL SIGN II + {0x0B41, 0x0B44, prN}, // Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR + {0x0B47, 0x0B48, prN}, // Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI + {0x0B4B, 0x0B4C, prN}, // Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU + {0x0B4D, 0x0B4D, prN}, // Mn ORIYA SIGN VIRAMA + {0x0B55, 0x0B56, prN}, // Mn [2] ORIYA SIGN OVERLINE..ORIYA AI LENGTH MARK + {0x0B57, 0x0B57, prN}, // Mc ORIYA AU LENGTH MARK + {0x0B5C, 0x0B5D, prN}, // Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA + {0x0B5F, 0x0B61, prN}, // Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL + {0x0B62, 0x0B63, prN}, // Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL + {0x0B66, 0x0B6F, prN}, // Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE + {0x0B70, 0x0B70, prN}, // So ORIYA ISSHAR + {0x0B71, 0x0B71, prN}, // Lo ORIYA LETTER WA + {0x0B72, 0x0B77, prN}, // No [6] ORIYA FRACTION ONE QUARTER..ORIYA FRACTION THREE SIXTEENTHS + {0x0B82, 0x0B82, prN}, // Mn TAMIL SIGN ANUSVARA + {0x0B83, 0x0B83, prN}, // Lo TAMIL SIGN VISARGA + {0x0B85, 0x0B8A, prN}, // Lo [6] TAMIL LETTER A..TAMIL LETTER UU + {0x0B8E, 0x0B90, prN}, // Lo [3] TAMIL LETTER E..TAMIL LETTER AI + {0x0B92, 0x0B95, prN}, // Lo [4] TAMIL LETTER O..TAMIL LETTER KA + {0x0B99, 0x0B9A, prN}, // Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA + {0x0B9C, 0x0B9C, prN}, // Lo TAMIL LETTER JA + {0x0B9E, 0x0B9F, prN}, // Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA + {0x0BA3, 0x0BA4, prN}, // Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA + {0x0BA8, 0x0BAA, prN}, // Lo [3] TAMIL LETTER NA..TAMIL LETTER PA + {0x0BAE, 0x0BB9, prN}, // Lo [12] TAMIL LETTER MA..TAMIL LETTER HA + {0x0BBE, 0x0BBF, prN}, // Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I + {0x0BC0, 0x0BC0, prN}, // Mn TAMIL VOWEL SIGN II + {0x0BC1, 0x0BC2, prN}, // Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU + {0x0BC6, 0x0BC8, prN}, // Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI + {0x0BCA, 0x0BCC, prN}, // Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU + {0x0BCD, 0x0BCD, prN}, // Mn TAMIL SIGN VIRAMA + {0x0BD0, 0x0BD0, prN}, // Lo TAMIL OM + {0x0BD7, 0x0BD7, prN}, // Mc TAMIL AU LENGTH MARK + {0x0BE6, 0x0BEF, prN}, // Nd [10] TAMIL DIGIT ZERO..TAMIL DIGIT NINE + {0x0BF0, 0x0BF2, prN}, // No [3] TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND + {0x0BF3, 0x0BF8, prN}, // So [6] TAMIL DAY SIGN..TAMIL AS ABOVE SIGN + {0x0BF9, 0x0BF9, prN}, // Sc TAMIL RUPEE SIGN + {0x0BFA, 0x0BFA, prN}, // So TAMIL NUMBER SIGN + {0x0C00, 0x0C00, prN}, // Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE + {0x0C01, 0x0C03, prN}, // Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA + {0x0C04, 0x0C04, prN}, // Mn TELUGU SIGN COMBINING ANUSVARA ABOVE + {0x0C05, 0x0C0C, prN}, // Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L + {0x0C0E, 0x0C10, prN}, // Lo [3] TELUGU LETTER E..TELUGU LETTER AI + {0x0C12, 0x0C28, prN}, // Lo [23] TELUGU LETTER O..TELUGU LETTER NA + {0x0C2A, 0x0C39, prN}, // Lo [16] TELUGU LETTER PA..TELUGU LETTER HA + {0x0C3C, 0x0C3C, prN}, // Mn TELUGU SIGN NUKTA + {0x0C3D, 0x0C3D, prN}, // Lo TELUGU SIGN AVAGRAHA + {0x0C3E, 0x0C40, prN}, // Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II + {0x0C41, 0x0C44, prN}, // Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR + {0x0C46, 0x0C48, prN}, // Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI + {0x0C4A, 0x0C4D, prN}, // Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA + {0x0C55, 0x0C56, prN}, // Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK + {0x0C58, 0x0C5A, prN}, // Lo [3] TELUGU LETTER TSA..TELUGU LETTER RRRA + {0x0C5D, 0x0C5D, prN}, // Lo TELUGU LETTER NAKAARA POLLU + {0x0C60, 0x0C61, prN}, // Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL + {0x0C62, 0x0C63, prN}, // Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL + {0x0C66, 0x0C6F, prN}, // Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE + {0x0C77, 0x0C77, prN}, // Po TELUGU SIGN SIDDHAM + {0x0C78, 0x0C7E, prN}, // No [7] TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR..TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR + {0x0C7F, 0x0C7F, prN}, // So TELUGU SIGN TUUMU + {0x0C80, 0x0C80, prN}, // Lo KANNADA SIGN SPACING CANDRABINDU + {0x0C81, 0x0C81, prN}, // Mn KANNADA SIGN CANDRABINDU + {0x0C82, 0x0C83, prN}, // Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA + {0x0C84, 0x0C84, prN}, // Po KANNADA SIGN SIDDHAM + {0x0C85, 0x0C8C, prN}, // Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L + {0x0C8E, 0x0C90, prN}, // Lo [3] KANNADA LETTER E..KANNADA LETTER AI + {0x0C92, 0x0CA8, prN}, // Lo [23] KANNADA LETTER O..KANNADA LETTER NA + {0x0CAA, 0x0CB3, prN}, // Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA + {0x0CB5, 0x0CB9, prN}, // Lo [5] KANNADA LETTER VA..KANNADA LETTER HA + {0x0CBC, 0x0CBC, prN}, // Mn KANNADA SIGN NUKTA + {0x0CBD, 0x0CBD, prN}, // Lo KANNADA SIGN AVAGRAHA + {0x0CBE, 0x0CBE, prN}, // Mc KANNADA VOWEL SIGN AA + {0x0CBF, 0x0CBF, prN}, // Mn KANNADA VOWEL SIGN I + {0x0CC0, 0x0CC4, prN}, // Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR + {0x0CC6, 0x0CC6, prN}, // Mn KANNADA VOWEL SIGN E + {0x0CC7, 0x0CC8, prN}, // Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI + {0x0CCA, 0x0CCB, prN}, // Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO + {0x0CCC, 0x0CCD, prN}, // Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA + {0x0CD5, 0x0CD6, prN}, // Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK + {0x0CDD, 0x0CDE, prN}, // Lo [2] KANNADA LETTER NAKAARA POLLU..KANNADA LETTER FA + {0x0CE0, 0x0CE1, prN}, // Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL + {0x0CE2, 0x0CE3, prN}, // Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL + {0x0CE6, 0x0CEF, prN}, // Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE + {0x0CF1, 0x0CF2, prN}, // Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA + {0x0D00, 0x0D01, prN}, // Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU + {0x0D02, 0x0D03, prN}, // Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA + {0x0D04, 0x0D0C, prN}, // Lo [9] MALAYALAM LETTER VEDIC ANUSVARA..MALAYALAM LETTER VOCALIC L + {0x0D0E, 0x0D10, prN}, // Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI + {0x0D12, 0x0D3A, prN}, // Lo [41] MALAYALAM LETTER O..MALAYALAM LETTER TTTA + {0x0D3B, 0x0D3C, prN}, // Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA + {0x0D3D, 0x0D3D, prN}, // Lo MALAYALAM SIGN AVAGRAHA + {0x0D3E, 0x0D40, prN}, // Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II + {0x0D41, 0x0D44, prN}, // Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR + {0x0D46, 0x0D48, prN}, // Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI + {0x0D4A, 0x0D4C, prN}, // Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU + {0x0D4D, 0x0D4D, prN}, // Mn MALAYALAM SIGN VIRAMA + {0x0D4E, 0x0D4E, prN}, // Lo MALAYALAM LETTER DOT REPH + {0x0D4F, 0x0D4F, prN}, // So MALAYALAM SIGN PARA + {0x0D54, 0x0D56, prN}, // Lo [3] MALAYALAM LETTER CHILLU M..MALAYALAM LETTER CHILLU LLL + {0x0D57, 0x0D57, prN}, // Mc MALAYALAM AU LENGTH MARK + {0x0D58, 0x0D5E, prN}, // No [7] MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH..MALAYALAM FRACTION ONE FIFTH + {0x0D5F, 0x0D61, prN}, // Lo [3] MALAYALAM LETTER ARCHAIC II..MALAYALAM LETTER VOCALIC LL + {0x0D62, 0x0D63, prN}, // Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL + {0x0D66, 0x0D6F, prN}, // Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE + {0x0D70, 0x0D78, prN}, // No [9] MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE SIXTEENTHS + {0x0D79, 0x0D79, prN}, // So MALAYALAM DATE MARK + {0x0D7A, 0x0D7F, prN}, // Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K + {0x0D81, 0x0D81, prN}, // Mn SINHALA SIGN CANDRABINDU + {0x0D82, 0x0D83, prN}, // Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA + {0x0D85, 0x0D96, prN}, // Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA + {0x0D9A, 0x0DB1, prN}, // Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA + {0x0DB3, 0x0DBB, prN}, // Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA + {0x0DBD, 0x0DBD, prN}, // Lo SINHALA LETTER DANTAJA LAYANNA + {0x0DC0, 0x0DC6, prN}, // Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA + {0x0DCA, 0x0DCA, prN}, // Mn SINHALA SIGN AL-LAKUNA + {0x0DCF, 0x0DD1, prN}, // Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA + {0x0DD2, 0x0DD4, prN}, // Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA + {0x0DD6, 0x0DD6, prN}, // Mn SINHALA VOWEL SIGN DIGA PAA-PILLA + {0x0DD8, 0x0DDF, prN}, // Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA + {0x0DE6, 0x0DEF, prN}, // Nd [10] SINHALA LITH DIGIT ZERO..SINHALA LITH DIGIT NINE + {0x0DF2, 0x0DF3, prN}, // Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA + {0x0DF4, 0x0DF4, prN}, // Po SINHALA PUNCTUATION KUNDDALIYA + {0x0E01, 0x0E30, prN}, // Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A + {0x0E31, 0x0E31, prN}, // Mn THAI CHARACTER MAI HAN-AKAT + {0x0E32, 0x0E33, prN}, // Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM + {0x0E34, 0x0E3A, prN}, // Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU + {0x0E3F, 0x0E3F, prN}, // Sc THAI CURRENCY SYMBOL BAHT + {0x0E40, 0x0E45, prN}, // Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO + {0x0E46, 0x0E46, prN}, // Lm THAI CHARACTER MAIYAMOK + {0x0E47, 0x0E4E, prN}, // Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN + {0x0E4F, 0x0E4F, prN}, // Po THAI CHARACTER FONGMAN + {0x0E50, 0x0E59, prN}, // Nd [10] THAI DIGIT ZERO..THAI DIGIT NINE + {0x0E5A, 0x0E5B, prN}, // Po [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT + {0x0E81, 0x0E82, prN}, // Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG + {0x0E84, 0x0E84, prN}, // Lo LAO LETTER KHO TAM + {0x0E86, 0x0E8A, prN}, // Lo [5] LAO LETTER PALI GHA..LAO LETTER SO TAM + {0x0E8C, 0x0EA3, prN}, // Lo [24] LAO LETTER PALI JHA..LAO LETTER LO LING + {0x0EA5, 0x0EA5, prN}, // Lo LAO LETTER LO LOOT + {0x0EA7, 0x0EB0, prN}, // Lo [10] LAO LETTER WO..LAO VOWEL SIGN A + {0x0EB1, 0x0EB1, prN}, // Mn LAO VOWEL SIGN MAI KAN + {0x0EB2, 0x0EB3, prN}, // Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM + {0x0EB4, 0x0EBC, prN}, // Mn [9] LAO VOWEL SIGN I..LAO SEMIVOWEL SIGN LO + {0x0EBD, 0x0EBD, prN}, // Lo LAO SEMIVOWEL SIGN NYO + {0x0EC0, 0x0EC4, prN}, // Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI + {0x0EC6, 0x0EC6, prN}, // Lm LAO KO LA + {0x0EC8, 0x0ECD, prN}, // Mn [6] LAO TONE MAI EK..LAO NIGGAHITA + {0x0ED0, 0x0ED9, prN}, // Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE + {0x0EDC, 0x0EDF, prN}, // Lo [4] LAO HO NO..LAO LETTER KHMU NYO + {0x0F00, 0x0F00, prN}, // Lo TIBETAN SYLLABLE OM + {0x0F01, 0x0F03, prN}, // So [3] TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA + {0x0F04, 0x0F12, prN}, // Po [15] TIBETAN MARK INITIAL YIG MGO MDUN MA..TIBETAN MARK RGYA GRAM SHAD + {0x0F13, 0x0F13, prN}, // So TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN + {0x0F14, 0x0F14, prN}, // Po TIBETAN MARK GTER TSHEG + {0x0F15, 0x0F17, prN}, // So [3] TIBETAN LOGOTYPE SIGN CHAD RTAGS..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS + {0x0F18, 0x0F19, prN}, // Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS + {0x0F1A, 0x0F1F, prN}, // So [6] TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG + {0x0F20, 0x0F29, prN}, // Nd [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE + {0x0F2A, 0x0F33, prN}, // No [10] TIBETAN DIGIT HALF ONE..TIBETAN DIGIT HALF ZERO + {0x0F34, 0x0F34, prN}, // So TIBETAN MARK BSDUS RTAGS + {0x0F35, 0x0F35, prN}, // Mn TIBETAN MARK NGAS BZUNG NYI ZLA + {0x0F36, 0x0F36, prN}, // So TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN + {0x0F37, 0x0F37, prN}, // Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS + {0x0F38, 0x0F38, prN}, // So TIBETAN MARK CHE MGO + {0x0F39, 0x0F39, prN}, // Mn TIBETAN MARK TSA -PHRU + {0x0F3A, 0x0F3A, prN}, // Ps TIBETAN MARK GUG RTAGS GYON + {0x0F3B, 0x0F3B, prN}, // Pe TIBETAN MARK GUG RTAGS GYAS + {0x0F3C, 0x0F3C, prN}, // Ps TIBETAN MARK ANG KHANG GYON + {0x0F3D, 0x0F3D, prN}, // Pe TIBETAN MARK ANG KHANG GYAS + {0x0F3E, 0x0F3F, prN}, // Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES + {0x0F40, 0x0F47, prN}, // Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA + {0x0F49, 0x0F6C, prN}, // Lo [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA + {0x0F71, 0x0F7E, prN}, // Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO + {0x0F7F, 0x0F7F, prN}, // Mc TIBETAN SIGN RNAM BCAD + {0x0F80, 0x0F84, prN}, // Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA + {0x0F85, 0x0F85, prN}, // Po TIBETAN MARK PALUTA + {0x0F86, 0x0F87, prN}, // Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS + {0x0F88, 0x0F8C, prN}, // Lo [5] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN INVERTED MCHU CAN + {0x0F8D, 0x0F97, prN}, // Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA + {0x0F99, 0x0FBC, prN}, // Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA + {0x0FBE, 0x0FC5, prN}, // So [8] TIBETAN KU RU KHA..TIBETAN SYMBOL RDO RJE + {0x0FC6, 0x0FC6, prN}, // Mn TIBETAN SYMBOL PADMA GDAN + {0x0FC7, 0x0FCC, prN}, // So [6] TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL + {0x0FCE, 0x0FCF, prN}, // So [2] TIBETAN SIGN RDEL NAG RDEL DKAR..TIBETAN SIGN RDEL NAG GSUM + {0x0FD0, 0x0FD4, prN}, // Po [5] TIBETAN MARK BSKA- SHOG GI MGO RGYAN..TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA + {0x0FD5, 0x0FD8, prN}, // So [4] RIGHT-FACING SVASTI SIGN..LEFT-FACING SVASTI SIGN WITH DOTS + {0x0FD9, 0x0FDA, prN}, // Po [2] TIBETAN MARK LEADING MCHAN RTAGS..TIBETAN MARK TRAILING MCHAN RTAGS + {0x1000, 0x102A, prN}, // Lo [43] MYANMAR LETTER KA..MYANMAR LETTER AU + {0x102B, 0x102C, prN}, // Mc [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA + {0x102D, 0x1030, prN}, // Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU + {0x1031, 0x1031, prN}, // Mc MYANMAR VOWEL SIGN E + {0x1032, 0x1037, prN}, // Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW + {0x1038, 0x1038, prN}, // Mc MYANMAR SIGN VISARGA + {0x1039, 0x103A, prN}, // Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT + {0x103B, 0x103C, prN}, // Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA + {0x103D, 0x103E, prN}, // Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA + {0x103F, 0x103F, prN}, // Lo MYANMAR LETTER GREAT SA + {0x1040, 0x1049, prN}, // Nd [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE + {0x104A, 0x104F, prN}, // Po [6] MYANMAR SIGN LITTLE SECTION..MYANMAR SYMBOL GENITIVE + {0x1050, 0x1055, prN}, // Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL + {0x1056, 0x1057, prN}, // Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR + {0x1058, 0x1059, prN}, // Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL + {0x105A, 0x105D, prN}, // Lo [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE + {0x105E, 0x1060, prN}, // Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA + {0x1061, 0x1061, prN}, // Lo MYANMAR LETTER SGAW KAREN SHA + {0x1062, 0x1064, prN}, // Mc [3] MYANMAR VOWEL SIGN SGAW KAREN EU..MYANMAR TONE MARK SGAW KAREN KE PHO + {0x1065, 0x1066, prN}, // Lo [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA + {0x1067, 0x106D, prN}, // Mc [7] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR SIGN WESTERN PWO KAREN TONE-5 + {0x106E, 0x1070, prN}, // Lo [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA + {0x1071, 0x1074, prN}, // Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE + {0x1075, 0x1081, prN}, // Lo [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA + {0x1082, 0x1082, prN}, // Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA + {0x1083, 0x1084, prN}, // Mc [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E + {0x1085, 0x1086, prN}, // Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y + {0x1087, 0x108C, prN}, // Mc [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3 + {0x108D, 0x108D, prN}, // Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE + {0x108E, 0x108E, prN}, // Lo MYANMAR LETTER RUMAI PALAUNG FA + {0x108F, 0x108F, prN}, // Mc MYANMAR SIGN RUMAI PALAUNG TONE-5 + {0x1090, 0x1099, prN}, // Nd [10] MYANMAR SHAN DIGIT ZERO..MYANMAR SHAN DIGIT NINE + {0x109A, 0x109C, prN}, // Mc [3] MYANMAR SIGN KHAMTI TONE-1..MYANMAR VOWEL SIGN AITON A + {0x109D, 0x109D, prN}, // Mn MYANMAR VOWEL SIGN AITON AI + {0x109E, 0x109F, prN}, // So [2] MYANMAR SYMBOL SHAN ONE..MYANMAR SYMBOL SHAN EXCLAMATION + {0x10A0, 0x10C5, prN}, // Lu [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE + {0x10C7, 0x10C7, prN}, // Lu GEORGIAN CAPITAL LETTER YN + {0x10CD, 0x10CD, prN}, // Lu GEORGIAN CAPITAL LETTER AEN + {0x10D0, 0x10FA, prN}, // Ll [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN + {0x10FB, 0x10FB, prN}, // Po GEORGIAN PARAGRAPH SEPARATOR + {0x10FC, 0x10FC, prN}, // Lm MODIFIER LETTER GEORGIAN NAR + {0x10FD, 0x10FF, prN}, // Ll [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN + {0x1100, 0x115F, prW}, // Lo [96] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG FILLER + {0x1160, 0x11FF, prN}, // Lo [160] HANGUL JUNGSEONG FILLER..HANGUL JONGSEONG SSANGNIEUN + {0x1200, 0x1248, prN}, // Lo [73] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE QWA + {0x124A, 0x124D, prN}, // Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE + {0x1250, 0x1256, prN}, // Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO + {0x1258, 0x1258, prN}, // Lo ETHIOPIC SYLLABLE QHWA + {0x125A, 0x125D, prN}, // Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE + {0x1260, 0x1288, prN}, // Lo [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA + {0x128A, 0x128D, prN}, // Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE + {0x1290, 0x12B0, prN}, // Lo [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA + {0x12B2, 0x12B5, prN}, // Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE + {0x12B8, 0x12BE, prN}, // Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO + {0x12C0, 0x12C0, prN}, // Lo ETHIOPIC SYLLABLE KXWA + {0x12C2, 0x12C5, prN}, // Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE + {0x12C8, 0x12D6, prN}, // Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O + {0x12D8, 0x1310, prN}, // Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA + {0x1312, 0x1315, prN}, // Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE + {0x1318, 0x135A, prN}, // Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA + {0x135D, 0x135F, prN}, // Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK + {0x1360, 0x1368, prN}, // Po [9] ETHIOPIC SECTION MARK..ETHIOPIC PARAGRAPH SEPARATOR + {0x1369, 0x137C, prN}, // No [20] ETHIOPIC DIGIT ONE..ETHIOPIC NUMBER TEN THOUSAND + {0x1380, 0x138F, prN}, // Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE + {0x1390, 0x1399, prN}, // So [10] ETHIOPIC TONAL MARK YIZET..ETHIOPIC TONAL MARK KURT + {0x13A0, 0x13F5, prN}, // Lu [86] CHEROKEE LETTER A..CHEROKEE LETTER MV + {0x13F8, 0x13FD, prN}, // Ll [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV + {0x1400, 0x1400, prN}, // Pd CANADIAN SYLLABICS HYPHEN + {0x1401, 0x166C, prN}, // Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA + {0x166D, 0x166D, prN}, // So CANADIAN SYLLABICS CHI SIGN + {0x166E, 0x166E, prN}, // Po CANADIAN SYLLABICS FULL STOP + {0x166F, 0x167F, prN}, // Lo [17] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS BLACKFOOT W + {0x1680, 0x1680, prN}, // Zs OGHAM SPACE MARK + {0x1681, 0x169A, prN}, // Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH + {0x169B, 0x169B, prN}, // Ps OGHAM FEATHER MARK + {0x169C, 0x169C, prN}, // Pe OGHAM REVERSED FEATHER MARK + {0x16A0, 0x16EA, prN}, // Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X + {0x16EB, 0x16ED, prN}, // Po [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION + {0x16EE, 0x16F0, prN}, // Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL + {0x16F1, 0x16F8, prN}, // Lo [8] RUNIC LETTER K..RUNIC LETTER FRANKS CASKET AESC + {0x1700, 0x1711, prN}, // Lo [18] TAGALOG LETTER A..TAGALOG LETTER HA + {0x1712, 0x1714, prN}, // Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA + {0x1715, 0x1715, prN}, // Mc TAGALOG SIGN PAMUDPOD + {0x171F, 0x171F, prN}, // Lo TAGALOG LETTER ARCHAIC RA + {0x1720, 0x1731, prN}, // Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA + {0x1732, 0x1733, prN}, // Mn [2] HANUNOO VOWEL SIGN I..HANUNOO VOWEL SIGN U + {0x1734, 0x1734, prN}, // Mc HANUNOO SIGN PAMUDPOD + {0x1735, 0x1736, prN}, // Po [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION + {0x1740, 0x1751, prN}, // Lo [18] BUHID LETTER A..BUHID LETTER HA + {0x1752, 0x1753, prN}, // Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U + {0x1760, 0x176C, prN}, // Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA + {0x176E, 0x1770, prN}, // Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA + {0x1772, 0x1773, prN}, // Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U + {0x1780, 0x17B3, prN}, // Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU + {0x17B4, 0x17B5, prN}, // Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA + {0x17B6, 0x17B6, prN}, // Mc KHMER VOWEL SIGN AA + {0x17B7, 0x17BD, prN}, // Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA + {0x17BE, 0x17C5, prN}, // Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU + {0x17C6, 0x17C6, prN}, // Mn KHMER SIGN NIKAHIT + {0x17C7, 0x17C8, prN}, // Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU + {0x17C9, 0x17D3, prN}, // Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT + {0x17D4, 0x17D6, prN}, // Po [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH + {0x17D7, 0x17D7, prN}, // Lm KHMER SIGN LEK TOO + {0x17D8, 0x17DA, prN}, // Po [3] KHMER SIGN BEYYAL..KHMER SIGN KOOMUUT + {0x17DB, 0x17DB, prN}, // Sc KHMER CURRENCY SYMBOL RIEL + {0x17DC, 0x17DC, prN}, // Lo KHMER SIGN AVAKRAHASANYA + {0x17DD, 0x17DD, prN}, // Mn KHMER SIGN ATTHACAN + {0x17E0, 0x17E9, prN}, // Nd [10] KHMER DIGIT ZERO..KHMER DIGIT NINE + {0x17F0, 0x17F9, prN}, // No [10] KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON + {0x1800, 0x1805, prN}, // Po [6] MONGOLIAN BIRGA..MONGOLIAN FOUR DOTS + {0x1806, 0x1806, prN}, // Pd MONGOLIAN TODO SOFT HYPHEN + {0x1807, 0x180A, prN}, // Po [4] MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER..MONGOLIAN NIRUGU + {0x180B, 0x180D, prN}, // Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE + {0x180E, 0x180E, prN}, // Cf MONGOLIAN VOWEL SEPARATOR + {0x180F, 0x180F, prN}, // Mn MONGOLIAN FREE VARIATION SELECTOR FOUR + {0x1810, 0x1819, prN}, // Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE + {0x1820, 0x1842, prN}, // Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI + {0x1843, 0x1843, prN}, // Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN + {0x1844, 0x1878, prN}, // Lo [53] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER CHA WITH TWO DOTS + {0x1880, 0x1884, prN}, // Lo [5] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI INVERTED UBADAMA + {0x1885, 0x1886, prN}, // Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA + {0x1887, 0x18A8, prN}, // Lo [34] MONGOLIAN LETTER ALI GALI A..MONGOLIAN LETTER MANCHU ALI GALI BHA + {0x18A9, 0x18A9, prN}, // Mn MONGOLIAN LETTER ALI GALI DAGALGA + {0x18AA, 0x18AA, prN}, // Lo MONGOLIAN LETTER MANCHU ALI GALI LHA + {0x18B0, 0x18F5, prN}, // Lo [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S + {0x1900, 0x191E, prN}, // Lo [31] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER TRA + {0x1920, 0x1922, prN}, // Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U + {0x1923, 0x1926, prN}, // Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU + {0x1927, 0x1928, prN}, // Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O + {0x1929, 0x192B, prN}, // Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA + {0x1930, 0x1931, prN}, // Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA + {0x1932, 0x1932, prN}, // Mn LIMBU SMALL LETTER ANUSVARA + {0x1933, 0x1938, prN}, // Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA + {0x1939, 0x193B, prN}, // Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I + {0x1940, 0x1940, prN}, // So LIMBU SIGN LOO + {0x1944, 0x1945, prN}, // Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK + {0x1946, 0x194F, prN}, // Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE + {0x1950, 0x196D, prN}, // Lo [30] TAI LE LETTER KA..TAI LE LETTER AI + {0x1970, 0x1974, prN}, // Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 + {0x1980, 0x19AB, prN}, // Lo [44] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW SUA + {0x19B0, 0x19C9, prN}, // Lo [26] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE TONE MARK-2 + {0x19D0, 0x19D9, prN}, // Nd [10] NEW TAI LUE DIGIT ZERO..NEW TAI LUE DIGIT NINE + {0x19DA, 0x19DA, prN}, // No NEW TAI LUE THAM DIGIT ONE + {0x19DE, 0x19DF, prN}, // So [2] NEW TAI LUE SIGN LAE..NEW TAI LUE SIGN LAEV + {0x19E0, 0x19FF, prN}, // So [32] KHMER SYMBOL PATHAMASAT..KHMER SYMBOL DAP-PRAM ROC + {0x1A00, 0x1A16, prN}, // Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA + {0x1A17, 0x1A18, prN}, // Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U + {0x1A19, 0x1A1A, prN}, // Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O + {0x1A1B, 0x1A1B, prN}, // Mn BUGINESE VOWEL SIGN AE + {0x1A1E, 0x1A1F, prN}, // Po [2] BUGINESE PALLAWA..BUGINESE END OF SECTION + {0x1A20, 0x1A54, prN}, // Lo [53] TAI THAM LETTER HIGH KA..TAI THAM LETTER GREAT SA + {0x1A55, 0x1A55, prN}, // Mc TAI THAM CONSONANT SIGN MEDIAL RA + {0x1A56, 0x1A56, prN}, // Mn TAI THAM CONSONANT SIGN MEDIAL LA + {0x1A57, 0x1A57, prN}, // Mc TAI THAM CONSONANT SIGN LA TANG LAI + {0x1A58, 0x1A5E, prN}, // Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA + {0x1A60, 0x1A60, prN}, // Mn TAI THAM SIGN SAKOT + {0x1A61, 0x1A61, prN}, // Mc TAI THAM VOWEL SIGN A + {0x1A62, 0x1A62, prN}, // Mn TAI THAM VOWEL SIGN MAI SAT + {0x1A63, 0x1A64, prN}, // Mc [2] TAI THAM VOWEL SIGN AA..TAI THAM VOWEL SIGN TALL AA + {0x1A65, 0x1A6C, prN}, // Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW + {0x1A6D, 0x1A72, prN}, // Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI + {0x1A73, 0x1A7C, prN}, // Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN + {0x1A7F, 0x1A7F, prN}, // Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT + {0x1A80, 0x1A89, prN}, // Nd [10] TAI THAM HORA DIGIT ZERO..TAI THAM HORA DIGIT NINE + {0x1A90, 0x1A99, prN}, // Nd [10] TAI THAM THAM DIGIT ZERO..TAI THAM THAM DIGIT NINE + {0x1AA0, 0x1AA6, prN}, // Po [7] TAI THAM SIGN WIANG..TAI THAM SIGN REVERSED ROTATED RANA + {0x1AA7, 0x1AA7, prN}, // Lm TAI THAM SIGN MAI YAMOK + {0x1AA8, 0x1AAD, prN}, // Po [6] TAI THAM SIGN KAAN..TAI THAM SIGN CAANG + {0x1AB0, 0x1ABD, prN}, // Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW + {0x1ABE, 0x1ABE, prN}, // Me COMBINING PARENTHESES OVERLAY + {0x1ABF, 0x1ACE, prN}, // Mn [16] COMBINING LATIN SMALL LETTER W BELOW..COMBINING LATIN SMALL LETTER INSULAR T + {0x1B00, 0x1B03, prN}, // Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG + {0x1B04, 0x1B04, prN}, // Mc BALINESE SIGN BISAH + {0x1B05, 0x1B33, prN}, // Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA + {0x1B34, 0x1B34, prN}, // Mn BALINESE SIGN REREKAN + {0x1B35, 0x1B35, prN}, // Mc BALINESE VOWEL SIGN TEDUNG + {0x1B36, 0x1B3A, prN}, // Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA + {0x1B3B, 0x1B3B, prN}, // Mc BALINESE VOWEL SIGN RA REPA TEDUNG + {0x1B3C, 0x1B3C, prN}, // Mn BALINESE VOWEL SIGN LA LENGA + {0x1B3D, 0x1B41, prN}, // Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG + {0x1B42, 0x1B42, prN}, // Mn BALINESE VOWEL SIGN PEPET + {0x1B43, 0x1B44, prN}, // Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG + {0x1B45, 0x1B4C, prN}, // Lo [8] BALINESE LETTER KAF SASAK..BALINESE LETTER ARCHAIC JNYA + {0x1B50, 0x1B59, prN}, // Nd [10] BALINESE DIGIT ZERO..BALINESE DIGIT NINE + {0x1B5A, 0x1B60, prN}, // Po [7] BALINESE PANTI..BALINESE PAMENENG + {0x1B61, 0x1B6A, prN}, // So [10] BALINESE MUSICAL SYMBOL DONG..BALINESE MUSICAL SYMBOL DANG GEDE + {0x1B6B, 0x1B73, prN}, // Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG + {0x1B74, 0x1B7C, prN}, // So [9] BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG..BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING + {0x1B7D, 0x1B7E, prN}, // Po [2] BALINESE PANTI LANTANG..BALINESE PAMADA LANTANG + {0x1B80, 0x1B81, prN}, // Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR + {0x1B82, 0x1B82, prN}, // Mc SUNDANESE SIGN PANGWISAD + {0x1B83, 0x1BA0, prN}, // Lo [30] SUNDANESE LETTER A..SUNDANESE LETTER HA + {0x1BA1, 0x1BA1, prN}, // Mc SUNDANESE CONSONANT SIGN PAMINGKAL + {0x1BA2, 0x1BA5, prN}, // Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU + {0x1BA6, 0x1BA7, prN}, // Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG + {0x1BA8, 0x1BA9, prN}, // Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG + {0x1BAA, 0x1BAA, prN}, // Mc SUNDANESE SIGN PAMAAEH + {0x1BAB, 0x1BAD, prN}, // Mn [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA + {0x1BAE, 0x1BAF, prN}, // Lo [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA + {0x1BB0, 0x1BB9, prN}, // Nd [10] SUNDANESE DIGIT ZERO..SUNDANESE DIGIT NINE + {0x1BBA, 0x1BBF, prN}, // Lo [6] SUNDANESE AVAGRAHA..SUNDANESE LETTER FINAL M + {0x1BC0, 0x1BE5, prN}, // Lo [38] BATAK LETTER A..BATAK LETTER U + {0x1BE6, 0x1BE6, prN}, // Mn BATAK SIGN TOMPI + {0x1BE7, 0x1BE7, prN}, // Mc BATAK VOWEL SIGN E + {0x1BE8, 0x1BE9, prN}, // Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE + {0x1BEA, 0x1BEC, prN}, // Mc [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O + {0x1BED, 0x1BED, prN}, // Mn BATAK VOWEL SIGN KARO O + {0x1BEE, 0x1BEE, prN}, // Mc BATAK VOWEL SIGN U + {0x1BEF, 0x1BF1, prN}, // Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H + {0x1BF2, 0x1BF3, prN}, // Mc [2] BATAK PANGOLAT..BATAK PANONGONAN + {0x1BFC, 0x1BFF, prN}, // Po [4] BATAK SYMBOL BINDU NA METEK..BATAK SYMBOL BINDU PANGOLAT + {0x1C00, 0x1C23, prN}, // Lo [36] LEPCHA LETTER KA..LEPCHA LETTER A + {0x1C24, 0x1C2B, prN}, // Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU + {0x1C2C, 0x1C33, prN}, // Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T + {0x1C34, 0x1C35, prN}, // Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG + {0x1C36, 0x1C37, prN}, // Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA + {0x1C3B, 0x1C3F, prN}, // Po [5] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION TSHOOK + {0x1C40, 0x1C49, prN}, // Nd [10] LEPCHA DIGIT ZERO..LEPCHA DIGIT NINE + {0x1C4D, 0x1C4F, prN}, // Lo [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA + {0x1C50, 0x1C59, prN}, // Nd [10] OL CHIKI DIGIT ZERO..OL CHIKI DIGIT NINE + {0x1C5A, 0x1C77, prN}, // Lo [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH + {0x1C78, 0x1C7D, prN}, // Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD + {0x1C7E, 0x1C7F, prN}, // Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD + {0x1C80, 0x1C88, prN}, // Ll [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK + {0x1C90, 0x1CBA, prN}, // Lu [43] GEORGIAN MTAVRULI CAPITAL LETTER AN..GEORGIAN MTAVRULI CAPITAL LETTER AIN + {0x1CBD, 0x1CBF, prN}, // Lu [3] GEORGIAN MTAVRULI CAPITAL LETTER AEN..GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN + {0x1CC0, 0x1CC7, prN}, // Po [8] SUNDANESE PUNCTUATION BINDU SURYA..SUNDANESE PUNCTUATION BINDU BA SATANGA + {0x1CD0, 0x1CD2, prN}, // Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA + {0x1CD3, 0x1CD3, prN}, // Po VEDIC SIGN NIHSHVASA + {0x1CD4, 0x1CE0, prN}, // Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA + {0x1CE1, 0x1CE1, prN}, // Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA + {0x1CE2, 0x1CE8, prN}, // Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL + {0x1CE9, 0x1CEC, prN}, // Lo [4] VEDIC SIGN ANUSVARA ANTARGOMUKHA..VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL + {0x1CED, 0x1CED, prN}, // Mn VEDIC SIGN TIRYAK + {0x1CEE, 0x1CF3, prN}, // Lo [6] VEDIC SIGN HEXIFORM LONG ANUSVARA..VEDIC SIGN ROTATED ARDHAVISARGA + {0x1CF4, 0x1CF4, prN}, // Mn VEDIC TONE CANDRA ABOVE + {0x1CF5, 0x1CF6, prN}, // Lo [2] VEDIC SIGN JIHVAMULIYA..VEDIC SIGN UPADHMANIYA + {0x1CF7, 0x1CF7, prN}, // Mc VEDIC SIGN ATIKRAMA + {0x1CF8, 0x1CF9, prN}, // Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE + {0x1CFA, 0x1CFA, prN}, // Lo VEDIC SIGN DOUBLE ANUSVARA ANTARGOMUKHA + {0x1D00, 0x1D2B, prN}, // Ll [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL + {0x1D2C, 0x1D6A, prN}, // Lm [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI + {0x1D6B, 0x1D77, prN}, // Ll [13] LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G + {0x1D78, 0x1D78, prN}, // Lm MODIFIER LETTER CYRILLIC EN + {0x1D79, 0x1D7F, prN}, // Ll [7] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER UPSILON WITH STROKE + {0x1D80, 0x1D9A, prN}, // Ll [27] LATIN SMALL LETTER B WITH PALATAL HOOK..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK + {0x1D9B, 0x1DBF, prN}, // Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA + {0x1DC0, 0x1DFF, prN}, // Mn [64] COMBINING DOTTED GRAVE ACCENT..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW + {0x1E00, 0x1EFF, prN}, // L& [256] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER Y WITH LOOP + {0x1F00, 0x1F15, prN}, // L& [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA + {0x1F18, 0x1F1D, prN}, // Lu [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA + {0x1F20, 0x1F45, prN}, // L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA + {0x1F48, 0x1F4D, prN}, // Lu [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA + {0x1F50, 0x1F57, prN}, // Ll [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI + {0x1F59, 0x1F59, prN}, // Lu GREEK CAPITAL LETTER UPSILON WITH DASIA + {0x1F5B, 0x1F5B, prN}, // Lu GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA + {0x1F5D, 0x1F5D, prN}, // Lu GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA + {0x1F5F, 0x1F7D, prN}, // L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA + {0x1F80, 0x1FB4, prN}, // L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI + {0x1FB6, 0x1FBC, prN}, // L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI + {0x1FBD, 0x1FBD, prN}, // Sk GREEK KORONIS + {0x1FBE, 0x1FBE, prN}, // Ll GREEK PROSGEGRAMMENI + {0x1FBF, 0x1FC1, prN}, // Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI + {0x1FC2, 0x1FC4, prN}, // Ll [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI + {0x1FC6, 0x1FCC, prN}, // L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI + {0x1FCD, 0x1FCF, prN}, // Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI + {0x1FD0, 0x1FD3, prN}, // Ll [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA + {0x1FD6, 0x1FDB, prN}, // L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA + {0x1FDD, 0x1FDF, prN}, // Sk [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI + {0x1FE0, 0x1FEC, prN}, // L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA + {0x1FED, 0x1FEF, prN}, // Sk [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA + {0x1FF2, 0x1FF4, prN}, // Ll [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI + {0x1FF6, 0x1FFC, prN}, // L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI + {0x1FFD, 0x1FFE, prN}, // Sk [2] GREEK OXIA..GREEK DASIA + {0x2000, 0x200A, prN}, // Zs [11] EN QUAD..HAIR SPACE + {0x200B, 0x200F, prN}, // Cf [5] ZERO WIDTH SPACE..RIGHT-TO-LEFT MARK + {0x2010, 0x2010, prA}, // Pd HYPHEN + {0x2011, 0x2012, prN}, // Pd [2] NON-BREAKING HYPHEN..FIGURE DASH + {0x2013, 0x2015, prA}, // Pd [3] EN DASH..HORIZONTAL BAR + {0x2016, 0x2016, prA}, // Po DOUBLE VERTICAL LINE + {0x2017, 0x2017, prN}, // Po DOUBLE LOW LINE + {0x2018, 0x2018, prA}, // Pi LEFT SINGLE QUOTATION MARK + {0x2019, 0x2019, prA}, // Pf RIGHT SINGLE QUOTATION MARK + {0x201A, 0x201A, prN}, // Ps SINGLE LOW-9 QUOTATION MARK + {0x201B, 0x201B, prN}, // Pi SINGLE HIGH-REVERSED-9 QUOTATION MARK + {0x201C, 0x201C, prA}, // Pi LEFT DOUBLE QUOTATION MARK + {0x201D, 0x201D, prA}, // Pf RIGHT DOUBLE QUOTATION MARK + {0x201E, 0x201E, prN}, // Ps DOUBLE LOW-9 QUOTATION MARK + {0x201F, 0x201F, prN}, // Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK + {0x2020, 0x2022, prA}, // Po [3] DAGGER..BULLET + {0x2023, 0x2023, prN}, // Po TRIANGULAR BULLET + {0x2024, 0x2027, prA}, // Po [4] ONE DOT LEADER..HYPHENATION POINT + {0x2028, 0x2028, prN}, // Zl LINE SEPARATOR + {0x2029, 0x2029, prN}, // Zp PARAGRAPH SEPARATOR + {0x202A, 0x202E, prN}, // Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE + {0x202F, 0x202F, prN}, // Zs NARROW NO-BREAK SPACE + {0x2030, 0x2030, prA}, // Po PER MILLE SIGN + {0x2031, 0x2031, prN}, // Po PER TEN THOUSAND SIGN + {0x2032, 0x2033, prA}, // Po [2] PRIME..DOUBLE PRIME + {0x2034, 0x2034, prN}, // Po TRIPLE PRIME + {0x2035, 0x2035, prA}, // Po REVERSED PRIME + {0x2036, 0x2038, prN}, // Po [3] REVERSED DOUBLE PRIME..CARET + {0x2039, 0x2039, prN}, // Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK + {0x203A, 0x203A, prN}, // Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + {0x203B, 0x203B, prA}, // Po REFERENCE MARK + {0x203C, 0x203D, prN}, // Po [2] DOUBLE EXCLAMATION MARK..INTERROBANG + {0x203E, 0x203E, prA}, // Po OVERLINE + {0x203F, 0x2040, prN}, // Pc [2] UNDERTIE..CHARACTER TIE + {0x2041, 0x2043, prN}, // Po [3] CARET INSERTION POINT..HYPHEN BULLET + {0x2044, 0x2044, prN}, // Sm FRACTION SLASH + {0x2045, 0x2045, prN}, // Ps LEFT SQUARE BRACKET WITH QUILL + {0x2046, 0x2046, prN}, // Pe RIGHT SQUARE BRACKET WITH QUILL + {0x2047, 0x2051, prN}, // Po [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY + {0x2052, 0x2052, prN}, // Sm COMMERCIAL MINUS SIGN + {0x2053, 0x2053, prN}, // Po SWUNG DASH + {0x2054, 0x2054, prN}, // Pc INVERTED UNDERTIE + {0x2055, 0x205E, prN}, // Po [10] FLOWER PUNCTUATION MARK..VERTICAL FOUR DOTS + {0x205F, 0x205F, prN}, // Zs MEDIUM MATHEMATICAL SPACE + {0x2060, 0x2064, prN}, // Cf [5] WORD JOINER..INVISIBLE PLUS + {0x2066, 0x206F, prN}, // Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES + {0x2070, 0x2070, prN}, // No SUPERSCRIPT ZERO + {0x2071, 0x2071, prN}, // Lm SUPERSCRIPT LATIN SMALL LETTER I + {0x2074, 0x2074, prA}, // No SUPERSCRIPT FOUR + {0x2075, 0x2079, prN}, // No [5] SUPERSCRIPT FIVE..SUPERSCRIPT NINE + {0x207A, 0x207C, prN}, // Sm [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN + {0x207D, 0x207D, prN}, // Ps SUPERSCRIPT LEFT PARENTHESIS + {0x207E, 0x207E, prN}, // Pe SUPERSCRIPT RIGHT PARENTHESIS + {0x207F, 0x207F, prA}, // Lm SUPERSCRIPT LATIN SMALL LETTER N + {0x2080, 0x2080, prN}, // No SUBSCRIPT ZERO + {0x2081, 0x2084, prA}, // No [4] SUBSCRIPT ONE..SUBSCRIPT FOUR + {0x2085, 0x2089, prN}, // No [5] SUBSCRIPT FIVE..SUBSCRIPT NINE + {0x208A, 0x208C, prN}, // Sm [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN + {0x208D, 0x208D, prN}, // Ps SUBSCRIPT LEFT PARENTHESIS + {0x208E, 0x208E, prN}, // Pe SUBSCRIPT RIGHT PARENTHESIS + {0x2090, 0x209C, prN}, // Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T + {0x20A0, 0x20A8, prN}, // Sc [9] EURO-CURRENCY SIGN..RUPEE SIGN + {0x20A9, 0x20A9, prH}, // Sc WON SIGN + {0x20AA, 0x20AB, prN}, // Sc [2] NEW SHEQEL SIGN..DONG SIGN + {0x20AC, 0x20AC, prA}, // Sc EURO SIGN + {0x20AD, 0x20C0, prN}, // Sc [20] KIP SIGN..SOM SIGN + {0x20D0, 0x20DC, prN}, // Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE + {0x20DD, 0x20E0, prN}, // Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH + {0x20E1, 0x20E1, prN}, // Mn COMBINING LEFT RIGHT ARROW ABOVE + {0x20E2, 0x20E4, prN}, // Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE + {0x20E5, 0x20F0, prN}, // Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE + {0x2100, 0x2101, prN}, // So [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT + {0x2102, 0x2102, prN}, // Lu DOUBLE-STRUCK CAPITAL C + {0x2103, 0x2103, prA}, // So DEGREE CELSIUS + {0x2104, 0x2104, prN}, // So CENTRE LINE SYMBOL + {0x2105, 0x2105, prA}, // So CARE OF + {0x2106, 0x2106, prN}, // So CADA UNA + {0x2107, 0x2107, prN}, // Lu EULER CONSTANT + {0x2108, 0x2108, prN}, // So SCRUPLE + {0x2109, 0x2109, prA}, // So DEGREE FAHRENHEIT + {0x210A, 0x2112, prN}, // L& [9] SCRIPT SMALL G..SCRIPT CAPITAL L + {0x2113, 0x2113, prA}, // Ll SCRIPT SMALL L + {0x2114, 0x2114, prN}, // So L B BAR SYMBOL + {0x2115, 0x2115, prN}, // Lu DOUBLE-STRUCK CAPITAL N + {0x2116, 0x2116, prA}, // So NUMERO SIGN + {0x2117, 0x2117, prN}, // So SOUND RECORDING COPYRIGHT + {0x2118, 0x2118, prN}, // Sm SCRIPT CAPITAL P + {0x2119, 0x211D, prN}, // Lu [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R + {0x211E, 0x2120, prN}, // So [3] PRESCRIPTION TAKE..SERVICE MARK + {0x2121, 0x2122, prA}, // So [2] TELEPHONE SIGN..TRADE MARK SIGN + {0x2123, 0x2123, prN}, // So VERSICLE + {0x2124, 0x2124, prN}, // Lu DOUBLE-STRUCK CAPITAL Z + {0x2125, 0x2125, prN}, // So OUNCE SIGN + {0x2126, 0x2126, prA}, // Lu OHM SIGN + {0x2127, 0x2127, prN}, // So INVERTED OHM SIGN + {0x2128, 0x2128, prN}, // Lu BLACK-LETTER CAPITAL Z + {0x2129, 0x2129, prN}, // So TURNED GREEK SMALL LETTER IOTA + {0x212A, 0x212A, prN}, // Lu KELVIN SIGN + {0x212B, 0x212B, prA}, // Lu ANGSTROM SIGN + {0x212C, 0x212D, prN}, // Lu [2] SCRIPT CAPITAL B..BLACK-LETTER CAPITAL C + {0x212E, 0x212E, prN}, // So ESTIMATED SYMBOL + {0x212F, 0x2134, prN}, // L& [6] SCRIPT SMALL E..SCRIPT SMALL O + {0x2135, 0x2138, prN}, // Lo [4] ALEF SYMBOL..DALET SYMBOL + {0x2139, 0x2139, prN}, // Ll INFORMATION SOURCE + {0x213A, 0x213B, prN}, // So [2] ROTATED CAPITAL Q..FACSIMILE SIGN + {0x213C, 0x213F, prN}, // L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI + {0x2140, 0x2144, prN}, // Sm [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y + {0x2145, 0x2149, prN}, // L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J + {0x214A, 0x214A, prN}, // So PROPERTY LINE + {0x214B, 0x214B, prN}, // Sm TURNED AMPERSAND + {0x214C, 0x214D, prN}, // So [2] PER SIGN..AKTIESELSKAB + {0x214E, 0x214E, prN}, // Ll TURNED SMALL F + {0x214F, 0x214F, prN}, // So SYMBOL FOR SAMARITAN SOURCE + {0x2150, 0x2152, prN}, // No [3] VULGAR FRACTION ONE SEVENTH..VULGAR FRACTION ONE TENTH + {0x2153, 0x2154, prA}, // No [2] VULGAR FRACTION ONE THIRD..VULGAR FRACTION TWO THIRDS + {0x2155, 0x215A, prN}, // No [6] VULGAR FRACTION ONE FIFTH..VULGAR FRACTION FIVE SIXTHS + {0x215B, 0x215E, prA}, // No [4] VULGAR FRACTION ONE EIGHTH..VULGAR FRACTION SEVEN EIGHTHS + {0x215F, 0x215F, prN}, // No FRACTION NUMERATOR ONE + {0x2160, 0x216B, prA}, // Nl [12] ROMAN NUMERAL ONE..ROMAN NUMERAL TWELVE + {0x216C, 0x216F, prN}, // Nl [4] ROMAN NUMERAL FIFTY..ROMAN NUMERAL ONE THOUSAND + {0x2170, 0x2179, prA}, // Nl [10] SMALL ROMAN NUMERAL ONE..SMALL ROMAN NUMERAL TEN + {0x217A, 0x2182, prN}, // Nl [9] SMALL ROMAN NUMERAL ELEVEN..ROMAN NUMERAL TEN THOUSAND + {0x2183, 0x2184, prN}, // L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C + {0x2185, 0x2188, prN}, // Nl [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND + {0x2189, 0x2189, prA}, // No VULGAR FRACTION ZERO THIRDS + {0x218A, 0x218B, prN}, // So [2] TURNED DIGIT TWO..TURNED DIGIT THREE + {0x2190, 0x2194, prA}, // Sm [5] LEFTWARDS ARROW..LEFT RIGHT ARROW + {0x2195, 0x2199, prA}, // So [5] UP DOWN ARROW..SOUTH WEST ARROW + {0x219A, 0x219B, prN}, // Sm [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE + {0x219C, 0x219F, prN}, // So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW + {0x21A0, 0x21A0, prN}, // Sm RIGHTWARDS TWO HEADED ARROW + {0x21A1, 0x21A2, prN}, // So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL + {0x21A3, 0x21A3, prN}, // Sm RIGHTWARDS ARROW WITH TAIL + {0x21A4, 0x21A5, prN}, // So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR + {0x21A6, 0x21A6, prN}, // Sm RIGHTWARDS ARROW FROM BAR + {0x21A7, 0x21AD, prN}, // So [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW + {0x21AE, 0x21AE, prN}, // Sm LEFT RIGHT ARROW WITH STROKE + {0x21AF, 0x21B7, prN}, // So [9] DOWNWARDS ZIGZAG ARROW..CLOCKWISE TOP SEMICIRCLE ARROW + {0x21B8, 0x21B9, prA}, // So [2] NORTH WEST ARROW TO LONG BAR..LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR + {0x21BA, 0x21CD, prN}, // So [20] ANTICLOCKWISE OPEN CIRCLE ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE + {0x21CE, 0x21CF, prN}, // Sm [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE + {0x21D0, 0x21D1, prN}, // So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW + {0x21D2, 0x21D2, prA}, // Sm RIGHTWARDS DOUBLE ARROW + {0x21D3, 0x21D3, prN}, // So DOWNWARDS DOUBLE ARROW + {0x21D4, 0x21D4, prA}, // Sm LEFT RIGHT DOUBLE ARROW + {0x21D5, 0x21E6, prN}, // So [18] UP DOWN DOUBLE ARROW..LEFTWARDS WHITE ARROW + {0x21E7, 0x21E7, prA}, // So UPWARDS WHITE ARROW + {0x21E8, 0x21F3, prN}, // So [12] RIGHTWARDS WHITE ARROW..UP DOWN WHITE ARROW + {0x21F4, 0x21FF, prN}, // Sm [12] RIGHT ARROW WITH SMALL CIRCLE..LEFT RIGHT OPEN-HEADED ARROW + {0x2200, 0x2200, prA}, // Sm FOR ALL + {0x2201, 0x2201, prN}, // Sm COMPLEMENT + {0x2202, 0x2203, prA}, // Sm [2] PARTIAL DIFFERENTIAL..THERE EXISTS + {0x2204, 0x2206, prN}, // Sm [3] THERE DOES NOT EXIST..INCREMENT + {0x2207, 0x2208, prA}, // Sm [2] NABLA..ELEMENT OF + {0x2209, 0x220A, prN}, // Sm [2] NOT AN ELEMENT OF..SMALL ELEMENT OF + {0x220B, 0x220B, prA}, // Sm CONTAINS AS MEMBER + {0x220C, 0x220E, prN}, // Sm [3] DOES NOT CONTAIN AS MEMBER..END OF PROOF + {0x220F, 0x220F, prA}, // Sm N-ARY PRODUCT + {0x2210, 0x2210, prN}, // Sm N-ARY COPRODUCT + {0x2211, 0x2211, prA}, // Sm N-ARY SUMMATION + {0x2212, 0x2214, prN}, // Sm [3] MINUS SIGN..DOT PLUS + {0x2215, 0x2215, prA}, // Sm DIVISION SLASH + {0x2216, 0x2219, prN}, // Sm [4] SET MINUS..BULLET OPERATOR + {0x221A, 0x221A, prA}, // Sm SQUARE ROOT + {0x221B, 0x221C, prN}, // Sm [2] CUBE ROOT..FOURTH ROOT + {0x221D, 0x2220, prA}, // Sm [4] PROPORTIONAL TO..ANGLE + {0x2221, 0x2222, prN}, // Sm [2] MEASURED ANGLE..SPHERICAL ANGLE + {0x2223, 0x2223, prA}, // Sm DIVIDES + {0x2224, 0x2224, prN}, // Sm DOES NOT DIVIDE + {0x2225, 0x2225, prA}, // Sm PARALLEL TO + {0x2226, 0x2226, prN}, // Sm NOT PARALLEL TO + {0x2227, 0x222C, prA}, // Sm [6] LOGICAL AND..DOUBLE INTEGRAL + {0x222D, 0x222D, prN}, // Sm TRIPLE INTEGRAL + {0x222E, 0x222E, prA}, // Sm CONTOUR INTEGRAL + {0x222F, 0x2233, prN}, // Sm [5] SURFACE INTEGRAL..ANTICLOCKWISE CONTOUR INTEGRAL + {0x2234, 0x2237, prA}, // Sm [4] THEREFORE..PROPORTION + {0x2238, 0x223B, prN}, // Sm [4] DOT MINUS..HOMOTHETIC + {0x223C, 0x223D, prA}, // Sm [2] TILDE OPERATOR..REVERSED TILDE + {0x223E, 0x2247, prN}, // Sm [10] INVERTED LAZY S..NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO + {0x2248, 0x2248, prA}, // Sm ALMOST EQUAL TO + {0x2249, 0x224B, prN}, // Sm [3] NOT ALMOST EQUAL TO..TRIPLE TILDE + {0x224C, 0x224C, prA}, // Sm ALL EQUAL TO + {0x224D, 0x2251, prN}, // Sm [5] EQUIVALENT TO..GEOMETRICALLY EQUAL TO + {0x2252, 0x2252, prA}, // Sm APPROXIMATELY EQUAL TO OR THE IMAGE OF + {0x2253, 0x225F, prN}, // Sm [13] IMAGE OF OR APPROXIMATELY EQUAL TO..QUESTIONED EQUAL TO + {0x2260, 0x2261, prA}, // Sm [2] NOT EQUAL TO..IDENTICAL TO + {0x2262, 0x2263, prN}, // Sm [2] NOT IDENTICAL TO..STRICTLY EQUIVALENT TO + {0x2264, 0x2267, prA}, // Sm [4] LESS-THAN OR EQUAL TO..GREATER-THAN OVER EQUAL TO + {0x2268, 0x2269, prN}, // Sm [2] LESS-THAN BUT NOT EQUAL TO..GREATER-THAN BUT NOT EQUAL TO + {0x226A, 0x226B, prA}, // Sm [2] MUCH LESS-THAN..MUCH GREATER-THAN + {0x226C, 0x226D, prN}, // Sm [2] BETWEEN..NOT EQUIVALENT TO + {0x226E, 0x226F, prA}, // Sm [2] NOT LESS-THAN..NOT GREATER-THAN + {0x2270, 0x2281, prN}, // Sm [18] NEITHER LESS-THAN NOR EQUAL TO..DOES NOT SUCCEED + {0x2282, 0x2283, prA}, // Sm [2] SUBSET OF..SUPERSET OF + {0x2284, 0x2285, prN}, // Sm [2] NOT A SUBSET OF..NOT A SUPERSET OF + {0x2286, 0x2287, prA}, // Sm [2] SUBSET OF OR EQUAL TO..SUPERSET OF OR EQUAL TO + {0x2288, 0x2294, prN}, // Sm [13] NEITHER A SUBSET OF NOR EQUAL TO..SQUARE CUP + {0x2295, 0x2295, prA}, // Sm CIRCLED PLUS + {0x2296, 0x2298, prN}, // Sm [3] CIRCLED MINUS..CIRCLED DIVISION SLASH + {0x2299, 0x2299, prA}, // Sm CIRCLED DOT OPERATOR + {0x229A, 0x22A4, prN}, // Sm [11] CIRCLED RING OPERATOR..DOWN TACK + {0x22A5, 0x22A5, prA}, // Sm UP TACK + {0x22A6, 0x22BE, prN}, // Sm [25] ASSERTION..RIGHT ANGLE WITH ARC + {0x22BF, 0x22BF, prA}, // Sm RIGHT TRIANGLE + {0x22C0, 0x22FF, prN}, // Sm [64] N-ARY LOGICAL AND..Z NOTATION BAG MEMBERSHIP + {0x2300, 0x2307, prN}, // So [8] DIAMETER SIGN..WAVY LINE + {0x2308, 0x2308, prN}, // Ps LEFT CEILING + {0x2309, 0x2309, prN}, // Pe RIGHT CEILING + {0x230A, 0x230A, prN}, // Ps LEFT FLOOR + {0x230B, 0x230B, prN}, // Pe RIGHT FLOOR + {0x230C, 0x2311, prN}, // So [6] BOTTOM RIGHT CROP..SQUARE LOZENGE + {0x2312, 0x2312, prA}, // So ARC + {0x2313, 0x2319, prN}, // So [7] SEGMENT..TURNED NOT SIGN + {0x231A, 0x231B, prW}, // So [2] WATCH..HOURGLASS + {0x231C, 0x231F, prN}, // So [4] TOP LEFT CORNER..BOTTOM RIGHT CORNER + {0x2320, 0x2321, prN}, // Sm [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL + {0x2322, 0x2328, prN}, // So [7] FROWN..KEYBOARD + {0x2329, 0x2329, prW}, // Ps LEFT-POINTING ANGLE BRACKET + {0x232A, 0x232A, prW}, // Pe RIGHT-POINTING ANGLE BRACKET + {0x232B, 0x237B, prN}, // So [81] ERASE TO THE LEFT..NOT CHECK MARK + {0x237C, 0x237C, prN}, // Sm RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW + {0x237D, 0x239A, prN}, // So [30] SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL + {0x239B, 0x23B3, prN}, // Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM + {0x23B4, 0x23DB, prN}, // So [40] TOP SQUARE BRACKET..FUSE + {0x23DC, 0x23E1, prN}, // Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET + {0x23E2, 0x23E8, prN}, // So [7] WHITE TRAPEZIUM..DECIMAL EXPONENT SYMBOL + {0x23E9, 0x23EC, prW}, // So [4] BLACK RIGHT-POINTING DOUBLE TRIANGLE..BLACK DOWN-POINTING DOUBLE TRIANGLE + {0x23ED, 0x23EF, prN}, // So [3] BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR..BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR + {0x23F0, 0x23F0, prW}, // So ALARM CLOCK + {0x23F1, 0x23F2, prN}, // So [2] STOPWATCH..TIMER CLOCK + {0x23F3, 0x23F3, prW}, // So HOURGLASS WITH FLOWING SAND + {0x23F4, 0x23FF, prN}, // So [12] BLACK MEDIUM LEFT-POINTING TRIANGLE..OBSERVER EYE SYMBOL + {0x2400, 0x2426, prN}, // So [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO + {0x2440, 0x244A, prN}, // So [11] OCR HOOK..OCR DOUBLE BACKSLASH + {0x2460, 0x249B, prA}, // No [60] CIRCLED DIGIT ONE..NUMBER TWENTY FULL STOP + {0x249C, 0x24E9, prA}, // So [78] PARENTHESIZED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z + {0x24EA, 0x24EA, prN}, // No CIRCLED DIGIT ZERO + {0x24EB, 0x24FF, prA}, // No [21] NEGATIVE CIRCLED NUMBER ELEVEN..NEGATIVE CIRCLED DIGIT ZERO + {0x2500, 0x254B, prA}, // So [76] BOX DRAWINGS LIGHT HORIZONTAL..BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL + {0x254C, 0x254F, prN}, // So [4] BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL..BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL + {0x2550, 0x2573, prA}, // So [36] BOX DRAWINGS DOUBLE HORIZONTAL..BOX DRAWINGS LIGHT DIAGONAL CROSS + {0x2574, 0x257F, prN}, // So [12] BOX DRAWINGS LIGHT LEFT..BOX DRAWINGS HEAVY UP AND LIGHT DOWN + {0x2580, 0x258F, prA}, // So [16] UPPER HALF BLOCK..LEFT ONE EIGHTH BLOCK + {0x2590, 0x2591, prN}, // So [2] RIGHT HALF BLOCK..LIGHT SHADE + {0x2592, 0x2595, prA}, // So [4] MEDIUM SHADE..RIGHT ONE EIGHTH BLOCK + {0x2596, 0x259F, prN}, // So [10] QUADRANT LOWER LEFT..QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT + {0x25A0, 0x25A1, prA}, // So [2] BLACK SQUARE..WHITE SQUARE + {0x25A2, 0x25A2, prN}, // So WHITE SQUARE WITH ROUNDED CORNERS + {0x25A3, 0x25A9, prA}, // So [7] WHITE SQUARE CONTAINING BLACK SMALL SQUARE..SQUARE WITH DIAGONAL CROSSHATCH FILL + {0x25AA, 0x25B1, prN}, // So [8] BLACK SMALL SQUARE..WHITE PARALLELOGRAM + {0x25B2, 0x25B3, prA}, // So [2] BLACK UP-POINTING TRIANGLE..WHITE UP-POINTING TRIANGLE + {0x25B4, 0x25B5, prN}, // So [2] BLACK UP-POINTING SMALL TRIANGLE..WHITE UP-POINTING SMALL TRIANGLE + {0x25B6, 0x25B6, prA}, // So BLACK RIGHT-POINTING TRIANGLE + {0x25B7, 0x25B7, prA}, // Sm WHITE RIGHT-POINTING TRIANGLE + {0x25B8, 0x25BB, prN}, // So [4] BLACK RIGHT-POINTING SMALL TRIANGLE..WHITE RIGHT-POINTING POINTER + {0x25BC, 0x25BD, prA}, // So [2] BLACK DOWN-POINTING TRIANGLE..WHITE DOWN-POINTING TRIANGLE + {0x25BE, 0x25BF, prN}, // So [2] BLACK DOWN-POINTING SMALL TRIANGLE..WHITE DOWN-POINTING SMALL TRIANGLE + {0x25C0, 0x25C0, prA}, // So BLACK LEFT-POINTING TRIANGLE + {0x25C1, 0x25C1, prA}, // Sm WHITE LEFT-POINTING TRIANGLE + {0x25C2, 0x25C5, prN}, // So [4] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE LEFT-POINTING POINTER + {0x25C6, 0x25C8, prA}, // So [3] BLACK DIAMOND..WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND + {0x25C9, 0x25CA, prN}, // So [2] FISHEYE..LOZENGE + {0x25CB, 0x25CB, prA}, // So WHITE CIRCLE + {0x25CC, 0x25CD, prN}, // So [2] DOTTED CIRCLE..CIRCLE WITH VERTICAL FILL + {0x25CE, 0x25D1, prA}, // So [4] BULLSEYE..CIRCLE WITH RIGHT HALF BLACK + {0x25D2, 0x25E1, prN}, // So [16] CIRCLE WITH LOWER HALF BLACK..LOWER HALF CIRCLE + {0x25E2, 0x25E5, prA}, // So [4] BLACK LOWER RIGHT TRIANGLE..BLACK UPPER RIGHT TRIANGLE + {0x25E6, 0x25EE, prN}, // So [9] WHITE BULLET..UP-POINTING TRIANGLE WITH RIGHT HALF BLACK + {0x25EF, 0x25EF, prA}, // So LARGE CIRCLE + {0x25F0, 0x25F7, prN}, // So [8] WHITE SQUARE WITH UPPER LEFT QUADRANT..WHITE CIRCLE WITH UPPER RIGHT QUADRANT + {0x25F8, 0x25FC, prN}, // Sm [5] UPPER LEFT TRIANGLE..BLACK MEDIUM SQUARE + {0x25FD, 0x25FE, prW}, // Sm [2] WHITE MEDIUM SMALL SQUARE..BLACK MEDIUM SMALL SQUARE + {0x25FF, 0x25FF, prN}, // Sm LOWER RIGHT TRIANGLE + {0x2600, 0x2604, prN}, // So [5] BLACK SUN WITH RAYS..COMET + {0x2605, 0x2606, prA}, // So [2] BLACK STAR..WHITE STAR + {0x2607, 0x2608, prN}, // So [2] LIGHTNING..THUNDERSTORM + {0x2609, 0x2609, prA}, // So SUN + {0x260A, 0x260D, prN}, // So [4] ASCENDING NODE..OPPOSITION + {0x260E, 0x260F, prA}, // So [2] BLACK TELEPHONE..WHITE TELEPHONE + {0x2610, 0x2613, prN}, // So [4] BALLOT BOX..SALTIRE + {0x2614, 0x2615, prW}, // So [2] UMBRELLA WITH RAIN DROPS..HOT BEVERAGE + {0x2616, 0x261B, prN}, // So [6] WHITE SHOGI PIECE..BLACK RIGHT POINTING INDEX + {0x261C, 0x261C, prA}, // So WHITE LEFT POINTING INDEX + {0x261D, 0x261D, prN}, // So WHITE UP POINTING INDEX + {0x261E, 0x261E, prA}, // So WHITE RIGHT POINTING INDEX + {0x261F, 0x263F, prN}, // So [33] WHITE DOWN POINTING INDEX..MERCURY + {0x2640, 0x2640, prA}, // So FEMALE SIGN + {0x2641, 0x2641, prN}, // So EARTH + {0x2642, 0x2642, prA}, // So MALE SIGN + {0x2643, 0x2647, prN}, // So [5] JUPITER..PLUTO + {0x2648, 0x2653, prW}, // So [12] ARIES..PISCES + {0x2654, 0x265F, prN}, // So [12] WHITE CHESS KING..BLACK CHESS PAWN + {0x2660, 0x2661, prA}, // So [2] BLACK SPADE SUIT..WHITE HEART SUIT + {0x2662, 0x2662, prN}, // So WHITE DIAMOND SUIT + {0x2663, 0x2665, prA}, // So [3] BLACK CLUB SUIT..BLACK HEART SUIT + {0x2666, 0x2666, prN}, // So BLACK DIAMOND SUIT + {0x2667, 0x266A, prA}, // So [4] WHITE CLUB SUIT..EIGHTH NOTE + {0x266B, 0x266B, prN}, // So BEAMED EIGHTH NOTES + {0x266C, 0x266D, prA}, // So [2] BEAMED SIXTEENTH NOTES..MUSIC FLAT SIGN + {0x266E, 0x266E, prN}, // So MUSIC NATURAL SIGN + {0x266F, 0x266F, prA}, // Sm MUSIC SHARP SIGN + {0x2670, 0x267E, prN}, // So [15] WEST SYRIAC CROSS..PERMANENT PAPER SIGN + {0x267F, 0x267F, prW}, // So WHEELCHAIR SYMBOL + {0x2680, 0x2692, prN}, // So [19] DIE FACE-1..HAMMER AND PICK + {0x2693, 0x2693, prW}, // So ANCHOR + {0x2694, 0x269D, prN}, // So [10] CROSSED SWORDS..OUTLINED WHITE STAR + {0x269E, 0x269F, prA}, // So [2] THREE LINES CONVERGING RIGHT..THREE LINES CONVERGING LEFT + {0x26A0, 0x26A0, prN}, // So WARNING SIGN + {0x26A1, 0x26A1, prW}, // So HIGH VOLTAGE SIGN + {0x26A2, 0x26A9, prN}, // So [8] DOUBLED FEMALE SIGN..HORIZONTAL MALE WITH STROKE SIGN + {0x26AA, 0x26AB, prW}, // So [2] MEDIUM WHITE CIRCLE..MEDIUM BLACK CIRCLE + {0x26AC, 0x26BC, prN}, // So [17] MEDIUM SMALL WHITE CIRCLE..SESQUIQUADRATE + {0x26BD, 0x26BE, prW}, // So [2] SOCCER BALL..BASEBALL + {0x26BF, 0x26BF, prA}, // So SQUARED KEY + {0x26C0, 0x26C3, prN}, // So [4] WHITE DRAUGHTS MAN..BLACK DRAUGHTS KING + {0x26C4, 0x26C5, prW}, // So [2] SNOWMAN WITHOUT SNOW..SUN BEHIND CLOUD + {0x26C6, 0x26CD, prA}, // So [8] RAIN..DISABLED CAR + {0x26CE, 0x26CE, prW}, // So OPHIUCHUS + {0x26CF, 0x26D3, prA}, // So [5] PICK..CHAINS + {0x26D4, 0x26D4, prW}, // So NO ENTRY + {0x26D5, 0x26E1, prA}, // So [13] ALTERNATE ONE-WAY LEFT WAY TRAFFIC..RESTRICTED LEFT ENTRY-2 + {0x26E2, 0x26E2, prN}, // So ASTRONOMICAL SYMBOL FOR URANUS + {0x26E3, 0x26E3, prA}, // So HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE + {0x26E4, 0x26E7, prN}, // So [4] PENTAGRAM..INVERTED PENTAGRAM + {0x26E8, 0x26E9, prA}, // So [2] BLACK CROSS ON SHIELD..SHINTO SHRINE + {0x26EA, 0x26EA, prW}, // So CHURCH + {0x26EB, 0x26F1, prA}, // So [7] CASTLE..UMBRELLA ON GROUND + {0x26F2, 0x26F3, prW}, // So [2] FOUNTAIN..FLAG IN HOLE + {0x26F4, 0x26F4, prA}, // So FERRY + {0x26F5, 0x26F5, prW}, // So SAILBOAT + {0x26F6, 0x26F9, prA}, // So [4] SQUARE FOUR CORNERS..PERSON WITH BALL + {0x26FA, 0x26FA, prW}, // So TENT + {0x26FB, 0x26FC, prA}, // So [2] JAPANESE BANK SYMBOL..HEADSTONE GRAVEYARD SYMBOL + {0x26FD, 0x26FD, prW}, // So FUEL PUMP + {0x26FE, 0x26FF, prA}, // So [2] CUP ON BLACK SQUARE..WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE + {0x2700, 0x2704, prN}, // So [5] BLACK SAFETY SCISSORS..WHITE SCISSORS + {0x2705, 0x2705, prW}, // So WHITE HEAVY CHECK MARK + {0x2706, 0x2709, prN}, // So [4] TELEPHONE LOCATION SIGN..ENVELOPE + {0x270A, 0x270B, prW}, // So [2] RAISED FIST..RAISED HAND + {0x270C, 0x2727, prN}, // So [28] VICTORY HAND..WHITE FOUR POINTED STAR + {0x2728, 0x2728, prW}, // So SPARKLES + {0x2729, 0x273C, prN}, // So [20] STRESS OUTLINED WHITE STAR..OPEN CENTRE TEARDROP-SPOKED ASTERISK + {0x273D, 0x273D, prA}, // So HEAVY TEARDROP-SPOKED ASTERISK + {0x273E, 0x274B, prN}, // So [14] SIX PETALLED BLACK AND WHITE FLORETTE..HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK + {0x274C, 0x274C, prW}, // So CROSS MARK + {0x274D, 0x274D, prN}, // So SHADOWED WHITE CIRCLE + {0x274E, 0x274E, prW}, // So NEGATIVE SQUARED CROSS MARK + {0x274F, 0x2752, prN}, // So [4] LOWER RIGHT DROP-SHADOWED WHITE SQUARE..UPPER RIGHT SHADOWED WHITE SQUARE + {0x2753, 0x2755, prW}, // So [3] BLACK QUESTION MARK ORNAMENT..WHITE EXCLAMATION MARK ORNAMENT + {0x2756, 0x2756, prN}, // So BLACK DIAMOND MINUS WHITE X + {0x2757, 0x2757, prW}, // So HEAVY EXCLAMATION MARK SYMBOL + {0x2758, 0x2767, prN}, // So [16] LIGHT VERTICAL BAR..ROTATED FLORAL HEART BULLET + {0x2768, 0x2768, prN}, // Ps MEDIUM LEFT PARENTHESIS ORNAMENT + {0x2769, 0x2769, prN}, // Pe MEDIUM RIGHT PARENTHESIS ORNAMENT + {0x276A, 0x276A, prN}, // Ps MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT + {0x276B, 0x276B, prN}, // Pe MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT + {0x276C, 0x276C, prN}, // Ps MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT + {0x276D, 0x276D, prN}, // Pe MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT + {0x276E, 0x276E, prN}, // Ps HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT + {0x276F, 0x276F, prN}, // Pe HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT + {0x2770, 0x2770, prN}, // Ps HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT + {0x2771, 0x2771, prN}, // Pe HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT + {0x2772, 0x2772, prN}, // Ps LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT + {0x2773, 0x2773, prN}, // Pe LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT + {0x2774, 0x2774, prN}, // Ps MEDIUM LEFT CURLY BRACKET ORNAMENT + {0x2775, 0x2775, prN}, // Pe MEDIUM RIGHT CURLY BRACKET ORNAMENT + {0x2776, 0x277F, prA}, // No [10] DINGBAT NEGATIVE CIRCLED DIGIT ONE..DINGBAT NEGATIVE CIRCLED NUMBER TEN + {0x2780, 0x2793, prN}, // No [20] DINGBAT CIRCLED SANS-SERIF DIGIT ONE..DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN + {0x2794, 0x2794, prN}, // So HEAVY WIDE-HEADED RIGHTWARDS ARROW + {0x2795, 0x2797, prW}, // So [3] HEAVY PLUS SIGN..HEAVY DIVISION SIGN + {0x2798, 0x27AF, prN}, // So [24] HEAVY SOUTH EAST ARROW..NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW + {0x27B0, 0x27B0, prW}, // So CURLY LOOP + {0x27B1, 0x27BE, prN}, // So [14] NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW..OPEN-OUTLINED RIGHTWARDS ARROW + {0x27BF, 0x27BF, prW}, // So DOUBLE CURLY LOOP + {0x27C0, 0x27C4, prN}, // Sm [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET + {0x27C5, 0x27C5, prN}, // Ps LEFT S-SHAPED BAG DELIMITER + {0x27C6, 0x27C6, prN}, // Pe RIGHT S-SHAPED BAG DELIMITER + {0x27C7, 0x27E5, prN}, // Sm [31] OR WITH DOT INSIDE..WHITE SQUARE WITH RIGHTWARDS TICK + {0x27E6, 0x27E6, prNa}, // Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET + {0x27E7, 0x27E7, prNa}, // Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET + {0x27E8, 0x27E8, prNa}, // Ps MATHEMATICAL LEFT ANGLE BRACKET + {0x27E9, 0x27E9, prNa}, // Pe MATHEMATICAL RIGHT ANGLE BRACKET + {0x27EA, 0x27EA, prNa}, // Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET + {0x27EB, 0x27EB, prNa}, // Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET + {0x27EC, 0x27EC, prNa}, // Ps MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET + {0x27ED, 0x27ED, prNa}, // Pe MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET + {0x27EE, 0x27EE, prN}, // Ps MATHEMATICAL LEFT FLATTENED PARENTHESIS + {0x27EF, 0x27EF, prN}, // Pe MATHEMATICAL RIGHT FLATTENED PARENTHESIS + {0x27F0, 0x27FF, prN}, // Sm [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW + {0x2800, 0x28FF, prN}, // So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678 + {0x2900, 0x297F, prN}, // Sm [128] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..DOWN FISH TAIL + {0x2980, 0x2982, prN}, // Sm [3] TRIPLE VERTICAL BAR DELIMITER..Z NOTATION TYPE COLON + {0x2983, 0x2983, prN}, // Ps LEFT WHITE CURLY BRACKET + {0x2984, 0x2984, prN}, // Pe RIGHT WHITE CURLY BRACKET + {0x2985, 0x2985, prNa}, // Ps LEFT WHITE PARENTHESIS + {0x2986, 0x2986, prNa}, // Pe RIGHT WHITE PARENTHESIS + {0x2987, 0x2987, prN}, // Ps Z NOTATION LEFT IMAGE BRACKET + {0x2988, 0x2988, prN}, // Pe Z NOTATION RIGHT IMAGE BRACKET + {0x2989, 0x2989, prN}, // Ps Z NOTATION LEFT BINDING BRACKET + {0x298A, 0x298A, prN}, // Pe Z NOTATION RIGHT BINDING BRACKET + {0x298B, 0x298B, prN}, // Ps LEFT SQUARE BRACKET WITH UNDERBAR + {0x298C, 0x298C, prN}, // Pe RIGHT SQUARE BRACKET WITH UNDERBAR + {0x298D, 0x298D, prN}, // Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER + {0x298E, 0x298E, prN}, // Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER + {0x298F, 0x298F, prN}, // Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER + {0x2990, 0x2990, prN}, // Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER + {0x2991, 0x2991, prN}, // Ps LEFT ANGLE BRACKET WITH DOT + {0x2992, 0x2992, prN}, // Pe RIGHT ANGLE BRACKET WITH DOT + {0x2993, 0x2993, prN}, // Ps LEFT ARC LESS-THAN BRACKET + {0x2994, 0x2994, prN}, // Pe RIGHT ARC GREATER-THAN BRACKET + {0x2995, 0x2995, prN}, // Ps DOUBLE LEFT ARC GREATER-THAN BRACKET + {0x2996, 0x2996, prN}, // Pe DOUBLE RIGHT ARC LESS-THAN BRACKET + {0x2997, 0x2997, prN}, // Ps LEFT BLACK TORTOISE SHELL BRACKET + {0x2998, 0x2998, prN}, // Pe RIGHT BLACK TORTOISE SHELL BRACKET + {0x2999, 0x29D7, prN}, // Sm [63] DOTTED FENCE..BLACK HOURGLASS + {0x29D8, 0x29D8, prN}, // Ps LEFT WIGGLY FENCE + {0x29D9, 0x29D9, prN}, // Pe RIGHT WIGGLY FENCE + {0x29DA, 0x29DA, prN}, // Ps LEFT DOUBLE WIGGLY FENCE + {0x29DB, 0x29DB, prN}, // Pe RIGHT DOUBLE WIGGLY FENCE + {0x29DC, 0x29FB, prN}, // Sm [32] INCOMPLETE INFINITY..TRIPLE PLUS + {0x29FC, 0x29FC, prN}, // Ps LEFT-POINTING CURVED ANGLE BRACKET + {0x29FD, 0x29FD, prN}, // Pe RIGHT-POINTING CURVED ANGLE BRACKET + {0x29FE, 0x29FF, prN}, // Sm [2] TINY..MINY + {0x2A00, 0x2AFF, prN}, // Sm [256] N-ARY CIRCLED DOT OPERATOR..N-ARY WHITE VERTICAL BAR + {0x2B00, 0x2B1A, prN}, // So [27] NORTH EAST WHITE ARROW..DOTTED SQUARE + {0x2B1B, 0x2B1C, prW}, // So [2] BLACK LARGE SQUARE..WHITE LARGE SQUARE + {0x2B1D, 0x2B2F, prN}, // So [19] BLACK VERY SMALL SQUARE..WHITE VERTICAL ELLIPSE + {0x2B30, 0x2B44, prN}, // Sm [21] LEFT ARROW WITH SMALL CIRCLE..RIGHTWARDS ARROW THROUGH SUPERSET + {0x2B45, 0x2B46, prN}, // So [2] LEFTWARDS QUADRUPLE ARROW..RIGHTWARDS QUADRUPLE ARROW + {0x2B47, 0x2B4C, prN}, // Sm [6] REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR + {0x2B4D, 0x2B4F, prN}, // So [3] DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW..SHORT BACKSLANTED SOUTH ARROW + {0x2B50, 0x2B50, prW}, // So WHITE MEDIUM STAR + {0x2B51, 0x2B54, prN}, // So [4] BLACK SMALL STAR..WHITE RIGHT-POINTING PENTAGON + {0x2B55, 0x2B55, prW}, // So HEAVY LARGE CIRCLE + {0x2B56, 0x2B59, prA}, // So [4] HEAVY OVAL WITH OVAL INSIDE..HEAVY CIRCLED SALTIRE + {0x2B5A, 0x2B73, prN}, // So [26] SLANTED NORTH ARROW WITH HOOKED HEAD..DOWNWARDS TRIANGLE-HEADED ARROW TO BAR + {0x2B76, 0x2B95, prN}, // So [32] NORTH WEST TRIANGLE-HEADED ARROW TO BAR..RIGHTWARDS BLACK ARROW + {0x2B97, 0x2BFF, prN}, // So [105] SYMBOL FOR TYPE A ELECTRONICS..HELLSCHREIBER PAUSE SYMBOL + {0x2C00, 0x2C5F, prN}, // L& [96] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC SMALL LETTER CAUDATE CHRIVI + {0x2C60, 0x2C7B, prN}, // L& [28] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN LETTER SMALL CAPITAL TURNED E + {0x2C7C, 0x2C7D, prN}, // Lm [2] LATIN SUBSCRIPT SMALL LETTER J..MODIFIER LETTER CAPITAL V + {0x2C7E, 0x2C7F, prN}, // Lu [2] LATIN CAPITAL LETTER S WITH SWASH TAIL..LATIN CAPITAL LETTER Z WITH SWASH TAIL + {0x2C80, 0x2CE4, prN}, // L& [101] COPTIC CAPITAL LETTER ALFA..COPTIC SYMBOL KAI + {0x2CE5, 0x2CEA, prN}, // So [6] COPTIC SYMBOL MI RO..COPTIC SYMBOL SHIMA SIMA + {0x2CEB, 0x2CEE, prN}, // L& [4] COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI..COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA + {0x2CEF, 0x2CF1, prN}, // Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS + {0x2CF2, 0x2CF3, prN}, // L& [2] COPTIC CAPITAL LETTER BOHAIRIC KHEI..COPTIC SMALL LETTER BOHAIRIC KHEI + {0x2CF9, 0x2CFC, prN}, // Po [4] COPTIC OLD NUBIAN FULL STOP..COPTIC OLD NUBIAN VERSE DIVIDER + {0x2CFD, 0x2CFD, prN}, // No COPTIC FRACTION ONE HALF + {0x2CFE, 0x2CFF, prN}, // Po [2] COPTIC FULL STOP..COPTIC MORPHOLOGICAL DIVIDER + {0x2D00, 0x2D25, prN}, // Ll [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE + {0x2D27, 0x2D27, prN}, // Ll GEORGIAN SMALL LETTER YN + {0x2D2D, 0x2D2D, prN}, // Ll GEORGIAN SMALL LETTER AEN + {0x2D30, 0x2D67, prN}, // Lo [56] TIFINAGH LETTER YA..TIFINAGH LETTER YO + {0x2D6F, 0x2D6F, prN}, // Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK + {0x2D70, 0x2D70, prN}, // Po TIFINAGH SEPARATOR MARK + {0x2D7F, 0x2D7F, prN}, // Mn TIFINAGH CONSONANT JOINER + {0x2D80, 0x2D96, prN}, // Lo [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE + {0x2DA0, 0x2DA6, prN}, // Lo [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO + {0x2DA8, 0x2DAE, prN}, // Lo [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO + {0x2DB0, 0x2DB6, prN}, // Lo [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO + {0x2DB8, 0x2DBE, prN}, // Lo [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO + {0x2DC0, 0x2DC6, prN}, // Lo [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO + {0x2DC8, 0x2DCE, prN}, // Lo [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO + {0x2DD0, 0x2DD6, prN}, // Lo [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO + {0x2DD8, 0x2DDE, prN}, // Lo [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO + {0x2DE0, 0x2DFF, prN}, // Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS + {0x2E00, 0x2E01, prN}, // Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER + {0x2E02, 0x2E02, prN}, // Pi LEFT SUBSTITUTION BRACKET + {0x2E03, 0x2E03, prN}, // Pf RIGHT SUBSTITUTION BRACKET + {0x2E04, 0x2E04, prN}, // Pi LEFT DOTTED SUBSTITUTION BRACKET + {0x2E05, 0x2E05, prN}, // Pf RIGHT DOTTED SUBSTITUTION BRACKET + {0x2E06, 0x2E08, prN}, // Po [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER + {0x2E09, 0x2E09, prN}, // Pi LEFT TRANSPOSITION BRACKET + {0x2E0A, 0x2E0A, prN}, // Pf RIGHT TRANSPOSITION BRACKET + {0x2E0B, 0x2E0B, prN}, // Po RAISED SQUARE + {0x2E0C, 0x2E0C, prN}, // Pi LEFT RAISED OMISSION BRACKET + {0x2E0D, 0x2E0D, prN}, // Pf RIGHT RAISED OMISSION BRACKET + {0x2E0E, 0x2E16, prN}, // Po [9] EDITORIAL CORONIS..DOTTED RIGHT-POINTING ANGLE + {0x2E17, 0x2E17, prN}, // Pd DOUBLE OBLIQUE HYPHEN + {0x2E18, 0x2E19, prN}, // Po [2] INVERTED INTERROBANG..PALM BRANCH + {0x2E1A, 0x2E1A, prN}, // Pd HYPHEN WITH DIAERESIS + {0x2E1B, 0x2E1B, prN}, // Po TILDE WITH RING ABOVE + {0x2E1C, 0x2E1C, prN}, // Pi LEFT LOW PARAPHRASE BRACKET + {0x2E1D, 0x2E1D, prN}, // Pf RIGHT LOW PARAPHRASE BRACKET + {0x2E1E, 0x2E1F, prN}, // Po [2] TILDE WITH DOT ABOVE..TILDE WITH DOT BELOW + {0x2E20, 0x2E20, prN}, // Pi LEFT VERTICAL BAR WITH QUILL + {0x2E21, 0x2E21, prN}, // Pf RIGHT VERTICAL BAR WITH QUILL + {0x2E22, 0x2E22, prN}, // Ps TOP LEFT HALF BRACKET + {0x2E23, 0x2E23, prN}, // Pe TOP RIGHT HALF BRACKET + {0x2E24, 0x2E24, prN}, // Ps BOTTOM LEFT HALF BRACKET + {0x2E25, 0x2E25, prN}, // Pe BOTTOM RIGHT HALF BRACKET + {0x2E26, 0x2E26, prN}, // Ps LEFT SIDEWAYS U BRACKET + {0x2E27, 0x2E27, prN}, // Pe RIGHT SIDEWAYS U BRACKET + {0x2E28, 0x2E28, prN}, // Ps LEFT DOUBLE PARENTHESIS + {0x2E29, 0x2E29, prN}, // Pe RIGHT DOUBLE PARENTHESIS + {0x2E2A, 0x2E2E, prN}, // Po [5] TWO DOTS OVER ONE DOT PUNCTUATION..REVERSED QUESTION MARK + {0x2E2F, 0x2E2F, prN}, // Lm VERTICAL TILDE + {0x2E30, 0x2E39, prN}, // Po [10] RING POINT..TOP HALF SECTION SIGN + {0x2E3A, 0x2E3B, prN}, // Pd [2] TWO-EM DASH..THREE-EM DASH + {0x2E3C, 0x2E3F, prN}, // Po [4] STENOGRAPHIC FULL STOP..CAPITULUM + {0x2E40, 0x2E40, prN}, // Pd DOUBLE HYPHEN + {0x2E41, 0x2E41, prN}, // Po REVERSED COMMA + {0x2E42, 0x2E42, prN}, // Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK + {0x2E43, 0x2E4F, prN}, // Po [13] DASH WITH LEFT UPTURN..CORNISH VERSE DIVIDER + {0x2E50, 0x2E51, prN}, // So [2] CROSS PATTY WITH RIGHT CROSSBAR..CROSS PATTY WITH LEFT CROSSBAR + {0x2E52, 0x2E54, prN}, // Po [3] TIRONIAN SIGN CAPITAL ET..MEDIEVAL QUESTION MARK + {0x2E55, 0x2E55, prN}, // Ps LEFT SQUARE BRACKET WITH STROKE + {0x2E56, 0x2E56, prN}, // Pe RIGHT SQUARE BRACKET WITH STROKE + {0x2E57, 0x2E57, prN}, // Ps LEFT SQUARE BRACKET WITH DOUBLE STROKE + {0x2E58, 0x2E58, prN}, // Pe RIGHT SQUARE BRACKET WITH DOUBLE STROKE + {0x2E59, 0x2E59, prN}, // Ps TOP HALF LEFT PARENTHESIS + {0x2E5A, 0x2E5A, prN}, // Pe TOP HALF RIGHT PARENTHESIS + {0x2E5B, 0x2E5B, prN}, // Ps BOTTOM HALF LEFT PARENTHESIS + {0x2E5C, 0x2E5C, prN}, // Pe BOTTOM HALF RIGHT PARENTHESIS + {0x2E5D, 0x2E5D, prN}, // Pd OBLIQUE HYPHEN + {0x2E80, 0x2E99, prW}, // So [26] CJK RADICAL REPEAT..CJK RADICAL RAP + {0x2E9B, 0x2EF3, prW}, // So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE + {0x2F00, 0x2FD5, prW}, // So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE + {0x2FF0, 0x2FFB, prW}, // So [12] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID + {0x3000, 0x3000, prF}, // Zs IDEOGRAPHIC SPACE + {0x3001, 0x3003, prW}, // Po [3] IDEOGRAPHIC COMMA..DITTO MARK + {0x3004, 0x3004, prW}, // So JAPANESE INDUSTRIAL STANDARD SYMBOL + {0x3005, 0x3005, prW}, // Lm IDEOGRAPHIC ITERATION MARK + {0x3006, 0x3006, prW}, // Lo IDEOGRAPHIC CLOSING MARK + {0x3007, 0x3007, prW}, // Nl IDEOGRAPHIC NUMBER ZERO + {0x3008, 0x3008, prW}, // Ps LEFT ANGLE BRACKET + {0x3009, 0x3009, prW}, // Pe RIGHT ANGLE BRACKET + {0x300A, 0x300A, prW}, // Ps LEFT DOUBLE ANGLE BRACKET + {0x300B, 0x300B, prW}, // Pe RIGHT DOUBLE ANGLE BRACKET + {0x300C, 0x300C, prW}, // Ps LEFT CORNER BRACKET + {0x300D, 0x300D, prW}, // Pe RIGHT CORNER BRACKET + {0x300E, 0x300E, prW}, // Ps LEFT WHITE CORNER BRACKET + {0x300F, 0x300F, prW}, // Pe RIGHT WHITE CORNER BRACKET + {0x3010, 0x3010, prW}, // Ps LEFT BLACK LENTICULAR BRACKET + {0x3011, 0x3011, prW}, // Pe RIGHT BLACK LENTICULAR BRACKET + {0x3012, 0x3013, prW}, // So [2] POSTAL MARK..GETA MARK + {0x3014, 0x3014, prW}, // Ps LEFT TORTOISE SHELL BRACKET + {0x3015, 0x3015, prW}, // Pe RIGHT TORTOISE SHELL BRACKET + {0x3016, 0x3016, prW}, // Ps LEFT WHITE LENTICULAR BRACKET + {0x3017, 0x3017, prW}, // Pe RIGHT WHITE LENTICULAR BRACKET + {0x3018, 0x3018, prW}, // Ps LEFT WHITE TORTOISE SHELL BRACKET + {0x3019, 0x3019, prW}, // Pe RIGHT WHITE TORTOISE SHELL BRACKET + {0x301A, 0x301A, prW}, // Ps LEFT WHITE SQUARE BRACKET + {0x301B, 0x301B, prW}, // Pe RIGHT WHITE SQUARE BRACKET + {0x301C, 0x301C, prW}, // Pd WAVE DASH + {0x301D, 0x301D, prW}, // Ps REVERSED DOUBLE PRIME QUOTATION MARK + {0x301E, 0x301F, prW}, // Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK + {0x3020, 0x3020, prW}, // So POSTAL MARK FACE + {0x3021, 0x3029, prW}, // Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE + {0x302A, 0x302D, prW}, // Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK + {0x302E, 0x302F, prW}, // Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK + {0x3030, 0x3030, prW}, // Pd WAVY DASH + {0x3031, 0x3035, prW}, // Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF + {0x3036, 0x3037, prW}, // So [2] CIRCLED POSTAL MARK..IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL + {0x3038, 0x303A, prW}, // Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY + {0x303B, 0x303B, prW}, // Lm VERTICAL IDEOGRAPHIC ITERATION MARK + {0x303C, 0x303C, prW}, // Lo MASU MARK + {0x303D, 0x303D, prW}, // Po PART ALTERNATION MARK + {0x303E, 0x303E, prW}, // So IDEOGRAPHIC VARIATION INDICATOR + {0x303F, 0x303F, prN}, // So IDEOGRAPHIC HALF FILL SPACE + {0x3041, 0x3096, prW}, // Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE + {0x3099, 0x309A, prW}, // Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + {0x309B, 0x309C, prW}, // Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + {0x309D, 0x309E, prW}, // Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK + {0x309F, 0x309F, prW}, // Lo HIRAGANA DIGRAPH YORI + {0x30A0, 0x30A0, prW}, // Pd KATAKANA-HIRAGANA DOUBLE HYPHEN + {0x30A1, 0x30FA, prW}, // Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO + {0x30FB, 0x30FB, prW}, // Po KATAKANA MIDDLE DOT + {0x30FC, 0x30FE, prW}, // Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK + {0x30FF, 0x30FF, prW}, // Lo KATAKANA DIGRAPH KOTO + {0x3105, 0x312F, prW}, // Lo [43] BOPOMOFO LETTER B..BOPOMOFO LETTER NN + {0x3131, 0x318E, prW}, // Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE + {0x3190, 0x3191, prW}, // So [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK + {0x3192, 0x3195, prW}, // No [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK + {0x3196, 0x319F, prW}, // So [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK + {0x31A0, 0x31BF, prW}, // Lo [32] BOPOMOFO LETTER BU..BOPOMOFO LETTER AH + {0x31C0, 0x31E3, prW}, // So [36] CJK STROKE T..CJK STROKE Q + {0x31F0, 0x31FF, prW}, // Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO + {0x3200, 0x321E, prW}, // So [31] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED KOREAN CHARACTER O HU + {0x3220, 0x3229, prW}, // No [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN + {0x322A, 0x3247, prW}, // So [30] PARENTHESIZED IDEOGRAPH MOON..CIRCLED IDEOGRAPH KOTO + {0x3248, 0x324F, prA}, // No [8] CIRCLED NUMBER TEN ON BLACK SQUARE..CIRCLED NUMBER EIGHTY ON BLACK SQUARE + {0x3250, 0x3250, prW}, // So PARTNERSHIP SIGN + {0x3251, 0x325F, prW}, // No [15] CIRCLED NUMBER TWENTY ONE..CIRCLED NUMBER THIRTY FIVE + {0x3260, 0x327F, prW}, // So [32] CIRCLED HANGUL KIYEOK..KOREAN STANDARD SYMBOL + {0x3280, 0x3289, prW}, // No [10] CIRCLED IDEOGRAPH ONE..CIRCLED IDEOGRAPH TEN + {0x328A, 0x32B0, prW}, // So [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT + {0x32B1, 0x32BF, prW}, // No [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY + {0x32C0, 0x32FF, prW}, // So [64] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..SQUARE ERA NAME REIWA + {0x3300, 0x33FF, prW}, // So [256] SQUARE APAATO..SQUARE GAL + {0x3400, 0x4DBF, prW}, // Lo [6592] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DBF + {0x4DC0, 0x4DFF, prN}, // So [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION + {0x4E00, 0x9FFF, prW}, // Lo [20992] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FFF + {0xA000, 0xA014, prW}, // Lo [21] YI SYLLABLE IT..YI SYLLABLE E + {0xA015, 0xA015, prW}, // Lm YI SYLLABLE WU + {0xA016, 0xA48C, prW}, // Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR + {0xA490, 0xA4C6, prW}, // So [55] YI RADICAL QOT..YI RADICAL KE + {0xA4D0, 0xA4F7, prN}, // Lo [40] LISU LETTER BA..LISU LETTER OE + {0xA4F8, 0xA4FD, prN}, // Lm [6] LISU LETTER TONE MYA TI..LISU LETTER TONE MYA JEU + {0xA4FE, 0xA4FF, prN}, // Po [2] LISU PUNCTUATION COMMA..LISU PUNCTUATION FULL STOP + {0xA500, 0xA60B, prN}, // Lo [268] VAI SYLLABLE EE..VAI SYLLABLE NG + {0xA60C, 0xA60C, prN}, // Lm VAI SYLLABLE LENGTHENER + {0xA60D, 0xA60F, prN}, // Po [3] VAI COMMA..VAI QUESTION MARK + {0xA610, 0xA61F, prN}, // Lo [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG + {0xA620, 0xA629, prN}, // Nd [10] VAI DIGIT ZERO..VAI DIGIT NINE + {0xA62A, 0xA62B, prN}, // Lo [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO + {0xA640, 0xA66D, prN}, // L& [46] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O + {0xA66E, 0xA66E, prN}, // Lo CYRILLIC LETTER MULTIOCULAR O + {0xA66F, 0xA66F, prN}, // Mn COMBINING CYRILLIC VZMET + {0xA670, 0xA672, prN}, // Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN + {0xA673, 0xA673, prN}, // Po SLAVONIC ASTERISK + {0xA674, 0xA67D, prN}, // Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK + {0xA67E, 0xA67E, prN}, // Po CYRILLIC KAVYKA + {0xA67F, 0xA67F, prN}, // Lm CYRILLIC PAYEROK + {0xA680, 0xA69B, prN}, // L& [28] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER CROSSED O + {0xA69C, 0xA69D, prN}, // Lm [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER LETTER CYRILLIC SOFT SIGN + {0xA69E, 0xA69F, prN}, // Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E + {0xA6A0, 0xA6E5, prN}, // Lo [70] BAMUM LETTER A..BAMUM LETTER KI + {0xA6E6, 0xA6EF, prN}, // Nl [10] BAMUM LETTER MO..BAMUM LETTER KOGHOM + {0xA6F0, 0xA6F1, prN}, // Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS + {0xA6F2, 0xA6F7, prN}, // Po [6] BAMUM NJAEMLI..BAMUM QUESTION MARK + {0xA700, 0xA716, prN}, // Sk [23] MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR + {0xA717, 0xA71F, prN}, // Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK + {0xA720, 0xA721, prN}, // Sk [2] MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE + {0xA722, 0xA76F, prN}, // L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON + {0xA770, 0xA770, prN}, // Lm MODIFIER LETTER US + {0xA771, 0xA787, prN}, // L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T + {0xA788, 0xA788, prN}, // Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT + {0xA789, 0xA78A, prN}, // Sk [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN + {0xA78B, 0xA78E, prN}, // L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT + {0xA78F, 0xA78F, prN}, // Lo LATIN LETTER SINOLOGICAL DOT + {0xA790, 0xA7CA, prN}, // L& [59] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY + {0xA7D0, 0xA7D1, prN}, // L& [2] LATIN CAPITAL LETTER CLOSED INSULAR G..LATIN SMALL LETTER CLOSED INSULAR G + {0xA7D3, 0xA7D3, prN}, // Ll LATIN SMALL LETTER DOUBLE THORN + {0xA7D5, 0xA7D9, prN}, // L& [5] LATIN SMALL LETTER DOUBLE WYNN..LATIN SMALL LETTER SIGMOID S + {0xA7F2, 0xA7F4, prN}, // Lm [3] MODIFIER LETTER CAPITAL C..MODIFIER LETTER CAPITAL Q + {0xA7F5, 0xA7F6, prN}, // L& [2] LATIN CAPITAL LETTER REVERSED HALF H..LATIN SMALL LETTER REVERSED HALF H + {0xA7F7, 0xA7F7, prN}, // Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I + {0xA7F8, 0xA7F9, prN}, // Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE + {0xA7FA, 0xA7FA, prN}, // Ll LATIN LETTER SMALL CAPITAL TURNED M + {0xA7FB, 0xA7FF, prN}, // Lo [5] LATIN EPIGRAPHIC LETTER REVERSED F..LATIN EPIGRAPHIC LETTER ARCHAIC M + {0xA800, 0xA801, prN}, // Lo [2] SYLOTI NAGRI LETTER A..SYLOTI NAGRI LETTER I + {0xA802, 0xA802, prN}, // Mn SYLOTI NAGRI SIGN DVISVARA + {0xA803, 0xA805, prN}, // Lo [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O + {0xA806, 0xA806, prN}, // Mn SYLOTI NAGRI SIGN HASANTA + {0xA807, 0xA80A, prN}, // Lo [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO + {0xA80B, 0xA80B, prN}, // Mn SYLOTI NAGRI SIGN ANUSVARA + {0xA80C, 0xA822, prN}, // Lo [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO + {0xA823, 0xA824, prN}, // Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I + {0xA825, 0xA826, prN}, // Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E + {0xA827, 0xA827, prN}, // Mc SYLOTI NAGRI VOWEL SIGN OO + {0xA828, 0xA82B, prN}, // So [4] SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI POETRY MARK-4 + {0xA82C, 0xA82C, prN}, // Mn SYLOTI NAGRI SIGN ALTERNATE HASANTA + {0xA830, 0xA835, prN}, // No [6] NORTH INDIC FRACTION ONE QUARTER..NORTH INDIC FRACTION THREE SIXTEENTHS + {0xA836, 0xA837, prN}, // So [2] NORTH INDIC QUARTER MARK..NORTH INDIC PLACEHOLDER MARK + {0xA838, 0xA838, prN}, // Sc NORTH INDIC RUPEE MARK + {0xA839, 0xA839, prN}, // So NORTH INDIC QUANTITY MARK + {0xA840, 0xA873, prN}, // Lo [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU + {0xA874, 0xA877, prN}, // Po [4] PHAGS-PA SINGLE HEAD MARK..PHAGS-PA MARK DOUBLE SHAD + {0xA880, 0xA881, prN}, // Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA + {0xA882, 0xA8B3, prN}, // Lo [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA + {0xA8B4, 0xA8C3, prN}, // Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU + {0xA8C4, 0xA8C5, prN}, // Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU + {0xA8CE, 0xA8CF, prN}, // Po [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA + {0xA8D0, 0xA8D9, prN}, // Nd [10] SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE + {0xA8E0, 0xA8F1, prN}, // Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA + {0xA8F2, 0xA8F7, prN}, // Lo [6] DEVANAGARI SIGN SPACING CANDRABINDU..DEVANAGARI SIGN CANDRABINDU AVAGRAHA + {0xA8F8, 0xA8FA, prN}, // Po [3] DEVANAGARI SIGN PUSHPIKA..DEVANAGARI CARET + {0xA8FB, 0xA8FB, prN}, // Lo DEVANAGARI HEADSTROKE + {0xA8FC, 0xA8FC, prN}, // Po DEVANAGARI SIGN SIDDHAM + {0xA8FD, 0xA8FE, prN}, // Lo [2] DEVANAGARI JAIN OM..DEVANAGARI LETTER AY + {0xA8FF, 0xA8FF, prN}, // Mn DEVANAGARI VOWEL SIGN AY + {0xA900, 0xA909, prN}, // Nd [10] KAYAH LI DIGIT ZERO..KAYAH LI DIGIT NINE + {0xA90A, 0xA925, prN}, // Lo [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO + {0xA926, 0xA92D, prN}, // Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU + {0xA92E, 0xA92F, prN}, // Po [2] KAYAH LI SIGN CWI..KAYAH LI SIGN SHYA + {0xA930, 0xA946, prN}, // Lo [23] REJANG LETTER KA..REJANG LETTER A + {0xA947, 0xA951, prN}, // Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R + {0xA952, 0xA953, prN}, // Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA + {0xA95F, 0xA95F, prN}, // Po REJANG SECTION MARK + {0xA960, 0xA97C, prW}, // Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH + {0xA980, 0xA982, prN}, // Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR + {0xA983, 0xA983, prN}, // Mc JAVANESE SIGN WIGNYAN + {0xA984, 0xA9B2, prN}, // Lo [47] JAVANESE LETTER A..JAVANESE LETTER HA + {0xA9B3, 0xA9B3, prN}, // Mn JAVANESE SIGN CECAK TELU + {0xA9B4, 0xA9B5, prN}, // Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG + {0xA9B6, 0xA9B9, prN}, // Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT + {0xA9BA, 0xA9BB, prN}, // Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE + {0xA9BC, 0xA9BD, prN}, // Mn [2] JAVANESE VOWEL SIGN PEPET..JAVANESE CONSONANT SIGN KERET + {0xA9BE, 0xA9C0, prN}, // Mc [3] JAVANESE CONSONANT SIGN PENGKAL..JAVANESE PANGKON + {0xA9C1, 0xA9CD, prN}, // Po [13] JAVANESE LEFT RERENGGAN..JAVANESE TURNED PADA PISELEH + {0xA9CF, 0xA9CF, prN}, // Lm JAVANESE PANGRANGKEP + {0xA9D0, 0xA9D9, prN}, // Nd [10] JAVANESE DIGIT ZERO..JAVANESE DIGIT NINE + {0xA9DE, 0xA9DF, prN}, // Po [2] JAVANESE PADA TIRTA TUMETES..JAVANESE PADA ISEN-ISEN + {0xA9E0, 0xA9E4, prN}, // Lo [5] MYANMAR LETTER SHAN GHA..MYANMAR LETTER SHAN BHA + {0xA9E5, 0xA9E5, prN}, // Mn MYANMAR SIGN SHAN SAW + {0xA9E6, 0xA9E6, prN}, // Lm MYANMAR MODIFIER LETTER SHAN REDUPLICATION + {0xA9E7, 0xA9EF, prN}, // Lo [9] MYANMAR LETTER TAI LAING NYA..MYANMAR LETTER TAI LAING NNA + {0xA9F0, 0xA9F9, prN}, // Nd [10] MYANMAR TAI LAING DIGIT ZERO..MYANMAR TAI LAING DIGIT NINE + {0xA9FA, 0xA9FE, prN}, // Lo [5] MYANMAR LETTER TAI LAING LLA..MYANMAR LETTER TAI LAING BHA + {0xAA00, 0xAA28, prN}, // Lo [41] CHAM LETTER A..CHAM LETTER HA + {0xAA29, 0xAA2E, prN}, // Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE + {0xAA2F, 0xAA30, prN}, // Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI + {0xAA31, 0xAA32, prN}, // Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE + {0xAA33, 0xAA34, prN}, // Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA + {0xAA35, 0xAA36, prN}, // Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA + {0xAA40, 0xAA42, prN}, // Lo [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG + {0xAA43, 0xAA43, prN}, // Mn CHAM CONSONANT SIGN FINAL NG + {0xAA44, 0xAA4B, prN}, // Lo [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS + {0xAA4C, 0xAA4C, prN}, // Mn CHAM CONSONANT SIGN FINAL M + {0xAA4D, 0xAA4D, prN}, // Mc CHAM CONSONANT SIGN FINAL H + {0xAA50, 0xAA59, prN}, // Nd [10] CHAM DIGIT ZERO..CHAM DIGIT NINE + {0xAA5C, 0xAA5F, prN}, // Po [4] CHAM PUNCTUATION SPIRAL..CHAM PUNCTUATION TRIPLE DANDA + {0xAA60, 0xAA6F, prN}, // Lo [16] MYANMAR LETTER KHAMTI GA..MYANMAR LETTER KHAMTI FA + {0xAA70, 0xAA70, prN}, // Lm MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION + {0xAA71, 0xAA76, prN}, // Lo [6] MYANMAR LETTER KHAMTI XA..MYANMAR LOGOGRAM KHAMTI HM + {0xAA77, 0xAA79, prN}, // So [3] MYANMAR SYMBOL AITON EXCLAMATION..MYANMAR SYMBOL AITON TWO + {0xAA7A, 0xAA7A, prN}, // Lo MYANMAR LETTER AITON RA + {0xAA7B, 0xAA7B, prN}, // Mc MYANMAR SIGN PAO KAREN TONE + {0xAA7C, 0xAA7C, prN}, // Mn MYANMAR SIGN TAI LAING TONE-2 + {0xAA7D, 0xAA7D, prN}, // Mc MYANMAR SIGN TAI LAING TONE-5 + {0xAA7E, 0xAA7F, prN}, // Lo [2] MYANMAR LETTER SHWE PALAUNG CHA..MYANMAR LETTER SHWE PALAUNG SHA + {0xAA80, 0xAAAF, prN}, // Lo [48] TAI VIET LETTER LOW KO..TAI VIET LETTER HIGH O + {0xAAB0, 0xAAB0, prN}, // Mn TAI VIET MAI KANG + {0xAAB1, 0xAAB1, prN}, // Lo TAI VIET VOWEL AA + {0xAAB2, 0xAAB4, prN}, // Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U + {0xAAB5, 0xAAB6, prN}, // Lo [2] TAI VIET VOWEL E..TAI VIET VOWEL O + {0xAAB7, 0xAAB8, prN}, // Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA + {0xAAB9, 0xAABD, prN}, // Lo [5] TAI VIET VOWEL UEA..TAI VIET VOWEL AN + {0xAABE, 0xAABF, prN}, // Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK + {0xAAC0, 0xAAC0, prN}, // Lo TAI VIET TONE MAI NUENG + {0xAAC1, 0xAAC1, prN}, // Mn TAI VIET TONE MAI THO + {0xAAC2, 0xAAC2, prN}, // Lo TAI VIET TONE MAI SONG + {0xAADB, 0xAADC, prN}, // Lo [2] TAI VIET SYMBOL KON..TAI VIET SYMBOL NUENG + {0xAADD, 0xAADD, prN}, // Lm TAI VIET SYMBOL SAM + {0xAADE, 0xAADF, prN}, // Po [2] TAI VIET SYMBOL HO HOI..TAI VIET SYMBOL KOI KOI + {0xAAE0, 0xAAEA, prN}, // Lo [11] MEETEI MAYEK LETTER E..MEETEI MAYEK LETTER SSA + {0xAAEB, 0xAAEB, prN}, // Mc MEETEI MAYEK VOWEL SIGN II + {0xAAEC, 0xAAED, prN}, // Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI + {0xAAEE, 0xAAEF, prN}, // Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU + {0xAAF0, 0xAAF1, prN}, // Po [2] MEETEI MAYEK CHEIKHAN..MEETEI MAYEK AHANG KHUDAM + {0xAAF2, 0xAAF2, prN}, // Lo MEETEI MAYEK ANJI + {0xAAF3, 0xAAF4, prN}, // Lm [2] MEETEI MAYEK SYLLABLE REPETITION MARK..MEETEI MAYEK WORD REPETITION MARK + {0xAAF5, 0xAAF5, prN}, // Mc MEETEI MAYEK VOWEL SIGN VISARGA + {0xAAF6, 0xAAF6, prN}, // Mn MEETEI MAYEK VIRAMA + {0xAB01, 0xAB06, prN}, // Lo [6] ETHIOPIC SYLLABLE TTHU..ETHIOPIC SYLLABLE TTHO + {0xAB09, 0xAB0E, prN}, // Lo [6] ETHIOPIC SYLLABLE DDHU..ETHIOPIC SYLLABLE DDHO + {0xAB11, 0xAB16, prN}, // Lo [6] ETHIOPIC SYLLABLE DZU..ETHIOPIC SYLLABLE DZO + {0xAB20, 0xAB26, prN}, // Lo [7] ETHIOPIC SYLLABLE CCHHA..ETHIOPIC SYLLABLE CCHHO + {0xAB28, 0xAB2E, prN}, // Lo [7] ETHIOPIC SYLLABLE BBA..ETHIOPIC SYLLABLE BBO + {0xAB30, 0xAB5A, prN}, // Ll [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG + {0xAB5B, 0xAB5B, prN}, // Sk MODIFIER BREVE WITH INVERTED BREVE + {0xAB5C, 0xAB5F, prN}, // Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK + {0xAB60, 0xAB68, prN}, // Ll [9] LATIN SMALL LETTER SAKHA YAT..LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE + {0xAB69, 0xAB69, prN}, // Lm MODIFIER LETTER SMALL TURNED W + {0xAB6A, 0xAB6B, prN}, // Sk [2] MODIFIER LETTER LEFT TACK..MODIFIER LETTER RIGHT TACK + {0xAB70, 0xABBF, prN}, // Ll [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA + {0xABC0, 0xABE2, prN}, // Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM + {0xABE3, 0xABE4, prN}, // Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP + {0xABE5, 0xABE5, prN}, // Mn MEETEI MAYEK VOWEL SIGN ANAP + {0xABE6, 0xABE7, prN}, // Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP + {0xABE8, 0xABE8, prN}, // Mn MEETEI MAYEK VOWEL SIGN UNAP + {0xABE9, 0xABEA, prN}, // Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG + {0xABEB, 0xABEB, prN}, // Po MEETEI MAYEK CHEIKHEI + {0xABEC, 0xABEC, prN}, // Mc MEETEI MAYEK LUM IYEK + {0xABED, 0xABED, prN}, // Mn MEETEI MAYEK APUN IYEK + {0xABF0, 0xABF9, prN}, // Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT NINE + {0xAC00, 0xD7A3, prW}, // Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH + {0xD7B0, 0xD7C6, prN}, // Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E + {0xD7CB, 0xD7FB, prN}, // Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH + {0xD800, 0xDB7F, prN}, // Cs [896] .. + {0xDB80, 0xDBFF, prN}, // Cs [128] .. + {0xDC00, 0xDFFF, prN}, // Cs [1024] .. + {0xE000, 0xF8FF, prA}, // Co [6400] .. + {0xF900, 0xFA6D, prW}, // Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D + {0xFA6E, 0xFA6F, prW}, // Cn [2] .. + {0xFA70, 0xFAD9, prW}, // Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 + {0xFADA, 0xFAFF, prW}, // Cn [38] .. + {0xFB00, 0xFB06, prN}, // Ll [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST + {0xFB13, 0xFB17, prN}, // Ll [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH + {0xFB1D, 0xFB1D, prN}, // Lo HEBREW LETTER YOD WITH HIRIQ + {0xFB1E, 0xFB1E, prN}, // Mn HEBREW POINT JUDEO-SPANISH VARIKA + {0xFB1F, 0xFB28, prN}, // Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV + {0xFB29, 0xFB29, prN}, // Sm HEBREW LETTER ALTERNATIVE PLUS SIGN + {0xFB2A, 0xFB36, prN}, // Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH + {0xFB38, 0xFB3C, prN}, // Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH + {0xFB3E, 0xFB3E, prN}, // Lo HEBREW LETTER MEM WITH DAGESH + {0xFB40, 0xFB41, prN}, // Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH + {0xFB43, 0xFB44, prN}, // Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH + {0xFB46, 0xFB4F, prN}, // Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE ALEF LAMED + {0xFB50, 0xFBB1, prN}, // Lo [98] ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM + {0xFBB2, 0xFBC2, prN}, // Sk [17] ARABIC SYMBOL DOT ABOVE..ARABIC SYMBOL WASLA ABOVE + {0xFBD3, 0xFD3D, prN}, // Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM + {0xFD3E, 0xFD3E, prN}, // Pe ORNATE LEFT PARENTHESIS + {0xFD3F, 0xFD3F, prN}, // Ps ORNATE RIGHT PARENTHESIS + {0xFD40, 0xFD4F, prN}, // So [16] ARABIC LIGATURE RAHIMAHU ALLAAH..ARABIC LIGATURE RAHIMAHUM ALLAAH + {0xFD50, 0xFD8F, prN}, // Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM + {0xFD92, 0xFDC7, prN}, // Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM + {0xFDCF, 0xFDCF, prN}, // So ARABIC LIGATURE SALAAMUHU ALAYNAA + {0xFDF0, 0xFDFB, prN}, // Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU + {0xFDFC, 0xFDFC, prN}, // Sc RIAL SIGN + {0xFDFD, 0xFDFF, prN}, // So [3] ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM..ARABIC LIGATURE AZZA WA JALL + {0xFE00, 0xFE0F, prA}, // Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 + {0xFE10, 0xFE16, prW}, // Po [7] PRESENTATION FORM FOR VERTICAL COMMA..PRESENTATION FORM FOR VERTICAL QUESTION MARK + {0xFE17, 0xFE17, prW}, // Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET + {0xFE18, 0xFE18, prW}, // Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET + {0xFE19, 0xFE19, prW}, // Po PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS + {0xFE20, 0xFE2F, prN}, // Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF + {0xFE30, 0xFE30, prW}, // Po PRESENTATION FORM FOR VERTICAL TWO DOT LEADER + {0xFE31, 0xFE32, prW}, // Pd [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH + {0xFE33, 0xFE34, prW}, // Pc [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE + {0xFE35, 0xFE35, prW}, // Ps PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS + {0xFE36, 0xFE36, prW}, // Pe PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS + {0xFE37, 0xFE37, prW}, // Ps PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET + {0xFE38, 0xFE38, prW}, // Pe PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET + {0xFE39, 0xFE39, prW}, // Ps PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET + {0xFE3A, 0xFE3A, prW}, // Pe PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET + {0xFE3B, 0xFE3B, prW}, // Ps PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET + {0xFE3C, 0xFE3C, prW}, // Pe PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET + {0xFE3D, 0xFE3D, prW}, // Ps PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET + {0xFE3E, 0xFE3E, prW}, // Pe PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET + {0xFE3F, 0xFE3F, prW}, // Ps PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET + {0xFE40, 0xFE40, prW}, // Pe PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET + {0xFE41, 0xFE41, prW}, // Ps PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET + {0xFE42, 0xFE42, prW}, // Pe PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET + {0xFE43, 0xFE43, prW}, // Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET + {0xFE44, 0xFE44, prW}, // Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET + {0xFE45, 0xFE46, prW}, // Po [2] SESAME DOT..WHITE SESAME DOT + {0xFE47, 0xFE47, prW}, // Ps PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET + {0xFE48, 0xFE48, prW}, // Pe PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET + {0xFE49, 0xFE4C, prW}, // Po [4] DASHED OVERLINE..DOUBLE WAVY OVERLINE + {0xFE4D, 0xFE4F, prW}, // Pc [3] DASHED LOW LINE..WAVY LOW LINE + {0xFE50, 0xFE52, prW}, // Po [3] SMALL COMMA..SMALL FULL STOP + {0xFE54, 0xFE57, prW}, // Po [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK + {0xFE58, 0xFE58, prW}, // Pd SMALL EM DASH + {0xFE59, 0xFE59, prW}, // Ps SMALL LEFT PARENTHESIS + {0xFE5A, 0xFE5A, prW}, // Pe SMALL RIGHT PARENTHESIS + {0xFE5B, 0xFE5B, prW}, // Ps SMALL LEFT CURLY BRACKET + {0xFE5C, 0xFE5C, prW}, // Pe SMALL RIGHT CURLY BRACKET + {0xFE5D, 0xFE5D, prW}, // Ps SMALL LEFT TORTOISE SHELL BRACKET + {0xFE5E, 0xFE5E, prW}, // Pe SMALL RIGHT TORTOISE SHELL BRACKET + {0xFE5F, 0xFE61, prW}, // Po [3] SMALL NUMBER SIGN..SMALL ASTERISK + {0xFE62, 0xFE62, prW}, // Sm SMALL PLUS SIGN + {0xFE63, 0xFE63, prW}, // Pd SMALL HYPHEN-MINUS + {0xFE64, 0xFE66, prW}, // Sm [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN + {0xFE68, 0xFE68, prW}, // Po SMALL REVERSE SOLIDUS + {0xFE69, 0xFE69, prW}, // Sc SMALL DOLLAR SIGN + {0xFE6A, 0xFE6B, prW}, // Po [2] SMALL PERCENT SIGN..SMALL COMMERCIAL AT + {0xFE70, 0xFE74, prN}, // Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM + {0xFE76, 0xFEFC, prN}, // Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM + {0xFEFF, 0xFEFF, prN}, // Cf ZERO WIDTH NO-BREAK SPACE + {0xFF01, 0xFF03, prF}, // Po [3] FULLWIDTH EXCLAMATION MARK..FULLWIDTH NUMBER SIGN + {0xFF04, 0xFF04, prF}, // Sc FULLWIDTH DOLLAR SIGN + {0xFF05, 0xFF07, prF}, // Po [3] FULLWIDTH PERCENT SIGN..FULLWIDTH APOSTROPHE + {0xFF08, 0xFF08, prF}, // Ps FULLWIDTH LEFT PARENTHESIS + {0xFF09, 0xFF09, prF}, // Pe FULLWIDTH RIGHT PARENTHESIS + {0xFF0A, 0xFF0A, prF}, // Po FULLWIDTH ASTERISK + {0xFF0B, 0xFF0B, prF}, // Sm FULLWIDTH PLUS SIGN + {0xFF0C, 0xFF0C, prF}, // Po FULLWIDTH COMMA + {0xFF0D, 0xFF0D, prF}, // Pd FULLWIDTH HYPHEN-MINUS + {0xFF0E, 0xFF0F, prF}, // Po [2] FULLWIDTH FULL STOP..FULLWIDTH SOLIDUS + {0xFF10, 0xFF19, prF}, // Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE + {0xFF1A, 0xFF1B, prF}, // Po [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON + {0xFF1C, 0xFF1E, prF}, // Sm [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN + {0xFF1F, 0xFF20, prF}, // Po [2] FULLWIDTH QUESTION MARK..FULLWIDTH COMMERCIAL AT + {0xFF21, 0xFF3A, prF}, // Lu [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z + {0xFF3B, 0xFF3B, prF}, // Ps FULLWIDTH LEFT SQUARE BRACKET + {0xFF3C, 0xFF3C, prF}, // Po FULLWIDTH REVERSE SOLIDUS + {0xFF3D, 0xFF3D, prF}, // Pe FULLWIDTH RIGHT SQUARE BRACKET + {0xFF3E, 0xFF3E, prF}, // Sk FULLWIDTH CIRCUMFLEX ACCENT + {0xFF3F, 0xFF3F, prF}, // Pc FULLWIDTH LOW LINE + {0xFF40, 0xFF40, prF}, // Sk FULLWIDTH GRAVE ACCENT + {0xFF41, 0xFF5A, prF}, // Ll [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z + {0xFF5B, 0xFF5B, prF}, // Ps FULLWIDTH LEFT CURLY BRACKET + {0xFF5C, 0xFF5C, prF}, // Sm FULLWIDTH VERTICAL LINE + {0xFF5D, 0xFF5D, prF}, // Pe FULLWIDTH RIGHT CURLY BRACKET + {0xFF5E, 0xFF5E, prF}, // Sm FULLWIDTH TILDE + {0xFF5F, 0xFF5F, prF}, // Ps FULLWIDTH LEFT WHITE PARENTHESIS + {0xFF60, 0xFF60, prF}, // Pe FULLWIDTH RIGHT WHITE PARENTHESIS + {0xFF61, 0xFF61, prH}, // Po HALFWIDTH IDEOGRAPHIC FULL STOP + {0xFF62, 0xFF62, prH}, // Ps HALFWIDTH LEFT CORNER BRACKET + {0xFF63, 0xFF63, prH}, // Pe HALFWIDTH RIGHT CORNER BRACKET + {0xFF64, 0xFF65, prH}, // Po [2] HALFWIDTH IDEOGRAPHIC COMMA..HALFWIDTH KATAKANA MIDDLE DOT + {0xFF66, 0xFF6F, prH}, // Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU + {0xFF70, 0xFF70, prH}, // Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK + {0xFF71, 0xFF9D, prH}, // Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N + {0xFF9E, 0xFF9F, prH}, // Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK + {0xFFA0, 0xFFBE, prH}, // Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH + {0xFFC2, 0xFFC7, prH}, // Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E + {0xFFCA, 0xFFCF, prH}, // Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE + {0xFFD2, 0xFFD7, prH}, // Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU + {0xFFDA, 0xFFDC, prH}, // Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I + {0xFFE0, 0xFFE1, prF}, // Sc [2] FULLWIDTH CENT SIGN..FULLWIDTH POUND SIGN + {0xFFE2, 0xFFE2, prF}, // Sm FULLWIDTH NOT SIGN + {0xFFE3, 0xFFE3, prF}, // Sk FULLWIDTH MACRON + {0xFFE4, 0xFFE4, prF}, // So FULLWIDTH BROKEN BAR + {0xFFE5, 0xFFE6, prF}, // Sc [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN + {0xFFE8, 0xFFE8, prH}, // So HALFWIDTH FORMS LIGHT VERTICAL + {0xFFE9, 0xFFEC, prH}, // Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW + {0xFFED, 0xFFEE, prH}, // So [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE + {0xFFF9, 0xFFFB, prN}, // Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR + {0xFFFC, 0xFFFC, prN}, // So OBJECT REPLACEMENT CHARACTER + {0xFFFD, 0xFFFD, prA}, // So REPLACEMENT CHARACTER + {0x10000, 0x1000B, prN}, // Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE + {0x1000D, 0x10026, prN}, // Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO + {0x10028, 0x1003A, prN}, // Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO + {0x1003C, 0x1003D, prN}, // Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE + {0x1003F, 0x1004D, prN}, // Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO + {0x10050, 0x1005D, prN}, // Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 + {0x10080, 0x100FA, prN}, // Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 + {0x10100, 0x10102, prN}, // Po [3] AEGEAN WORD SEPARATOR LINE..AEGEAN CHECK MARK + {0x10107, 0x10133, prN}, // No [45] AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND + {0x10137, 0x1013F, prN}, // So [9] AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT + {0x10140, 0x10174, prN}, // Nl [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS + {0x10175, 0x10178, prN}, // No [4] GREEK ONE HALF SIGN..GREEK THREE QUARTERS SIGN + {0x10179, 0x10189, prN}, // So [17] GREEK YEAR SIGN..GREEK TRYBLION BASE SIGN + {0x1018A, 0x1018B, prN}, // No [2] GREEK ZERO SIGN..GREEK ONE QUARTER SIGN + {0x1018C, 0x1018E, prN}, // So [3] GREEK SINUSOID SIGN..NOMISMA SIGN + {0x10190, 0x1019C, prN}, // So [13] ROMAN SEXTANS SIGN..ASCIA SYMBOL + {0x101A0, 0x101A0, prN}, // So GREEK SYMBOL TAU RHO + {0x101D0, 0x101FC, prN}, // So [45] PHAISTOS DISC SIGN PEDESTRIAN..PHAISTOS DISC SIGN WAVY BAND + {0x101FD, 0x101FD, prN}, // Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE + {0x10280, 0x1029C, prN}, // Lo [29] LYCIAN LETTER A..LYCIAN LETTER X + {0x102A0, 0x102D0, prN}, // Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3 + {0x102E0, 0x102E0, prN}, // Mn COPTIC EPACT THOUSANDS MARK + {0x102E1, 0x102FB, prN}, // No [27] COPTIC EPACT DIGIT ONE..COPTIC EPACT NUMBER NINE HUNDRED + {0x10300, 0x1031F, prN}, // Lo [32] OLD ITALIC LETTER A..OLD ITALIC LETTER ESS + {0x10320, 0x10323, prN}, // No [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY + {0x1032D, 0x1032F, prN}, // Lo [3] OLD ITALIC LETTER YE..OLD ITALIC LETTER SOUTHERN TSE + {0x10330, 0x10340, prN}, // Lo [17] GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA + {0x10341, 0x10341, prN}, // Nl GOTHIC LETTER NINETY + {0x10342, 0x10349, prN}, // Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL + {0x1034A, 0x1034A, prN}, // Nl GOTHIC LETTER NINE HUNDRED + {0x10350, 0x10375, prN}, // Lo [38] OLD PERMIC LETTER AN..OLD PERMIC LETTER IA + {0x10376, 0x1037A, prN}, // Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII + {0x10380, 0x1039D, prN}, // Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU + {0x1039F, 0x1039F, prN}, // Po UGARITIC WORD DIVIDER + {0x103A0, 0x103C3, prN}, // Lo [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA + {0x103C8, 0x103CF, prN}, // Lo [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH + {0x103D0, 0x103D0, prN}, // Po OLD PERSIAN WORD DIVIDER + {0x103D1, 0x103D5, prN}, // Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED + {0x10400, 0x1044F, prN}, // L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW + {0x10450, 0x1047F, prN}, // Lo [48] SHAVIAN LETTER PEEP..SHAVIAN LETTER YEW + {0x10480, 0x1049D, prN}, // Lo [30] OSMANYA LETTER ALEF..OSMANYA LETTER OO + {0x104A0, 0x104A9, prN}, // Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE + {0x104B0, 0x104D3, prN}, // Lu [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA + {0x104D8, 0x104FB, prN}, // Ll [36] OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA + {0x10500, 0x10527, prN}, // Lo [40] ELBASAN LETTER A..ELBASAN LETTER KHE + {0x10530, 0x10563, prN}, // Lo [52] CAUCASIAN ALBANIAN LETTER ALT..CAUCASIAN ALBANIAN LETTER KIW + {0x1056F, 0x1056F, prN}, // Po CAUCASIAN ALBANIAN CITATION MARK + {0x10570, 0x1057A, prN}, // Lu [11] VITHKUQI CAPITAL LETTER A..VITHKUQI CAPITAL LETTER GA + {0x1057C, 0x1058A, prN}, // Lu [15] VITHKUQI CAPITAL LETTER HA..VITHKUQI CAPITAL LETTER RE + {0x1058C, 0x10592, prN}, // Lu [7] VITHKUQI CAPITAL LETTER SE..VITHKUQI CAPITAL LETTER XE + {0x10594, 0x10595, prN}, // Lu [2] VITHKUQI CAPITAL LETTER Y..VITHKUQI CAPITAL LETTER ZE + {0x10597, 0x105A1, prN}, // Ll [11] VITHKUQI SMALL LETTER A..VITHKUQI SMALL LETTER GA + {0x105A3, 0x105B1, prN}, // Ll [15] VITHKUQI SMALL LETTER HA..VITHKUQI SMALL LETTER RE + {0x105B3, 0x105B9, prN}, // Ll [7] VITHKUQI SMALL LETTER SE..VITHKUQI SMALL LETTER XE + {0x105BB, 0x105BC, prN}, // Ll [2] VITHKUQI SMALL LETTER Y..VITHKUQI SMALL LETTER ZE + {0x10600, 0x10736, prN}, // Lo [311] LINEAR A SIGN AB001..LINEAR A SIGN A664 + {0x10740, 0x10755, prN}, // Lo [22] LINEAR A SIGN A701 A..LINEAR A SIGN A732 JE + {0x10760, 0x10767, prN}, // Lo [8] LINEAR A SIGN A800..LINEAR A SIGN A807 + {0x10780, 0x10785, prN}, // Lm [6] MODIFIER LETTER SMALL CAPITAL AA..MODIFIER LETTER SMALL B WITH HOOK + {0x10787, 0x107B0, prN}, // Lm [42] MODIFIER LETTER SMALL DZ DIGRAPH..MODIFIER LETTER SMALL V WITH RIGHT HOOK + {0x107B2, 0x107BA, prN}, // Lm [9] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL S WITH CURL + {0x10800, 0x10805, prN}, // Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA + {0x10808, 0x10808, prN}, // Lo CYPRIOT SYLLABLE JO + {0x1080A, 0x10835, prN}, // Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO + {0x10837, 0x10838, prN}, // Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE + {0x1083C, 0x1083C, prN}, // Lo CYPRIOT SYLLABLE ZA + {0x1083F, 0x1083F, prN}, // Lo CYPRIOT SYLLABLE ZO + {0x10840, 0x10855, prN}, // Lo [22] IMPERIAL ARAMAIC LETTER ALEPH..IMPERIAL ARAMAIC LETTER TAW + {0x10857, 0x10857, prN}, // Po IMPERIAL ARAMAIC SECTION SIGN + {0x10858, 0x1085F, prN}, // No [8] IMPERIAL ARAMAIC NUMBER ONE..IMPERIAL ARAMAIC NUMBER TEN THOUSAND + {0x10860, 0x10876, prN}, // Lo [23] PALMYRENE LETTER ALEPH..PALMYRENE LETTER TAW + {0x10877, 0x10878, prN}, // So [2] PALMYRENE LEFT-POINTING FLEURON..PALMYRENE RIGHT-POINTING FLEURON + {0x10879, 0x1087F, prN}, // No [7] PALMYRENE NUMBER ONE..PALMYRENE NUMBER TWENTY + {0x10880, 0x1089E, prN}, // Lo [31] NABATAEAN LETTER FINAL ALEPH..NABATAEAN LETTER TAW + {0x108A7, 0x108AF, prN}, // No [9] NABATAEAN NUMBER ONE..NABATAEAN NUMBER ONE HUNDRED + {0x108E0, 0x108F2, prN}, // Lo [19] HATRAN LETTER ALEPH..HATRAN LETTER QOPH + {0x108F4, 0x108F5, prN}, // Lo [2] HATRAN LETTER SHIN..HATRAN LETTER TAW + {0x108FB, 0x108FF, prN}, // No [5] HATRAN NUMBER ONE..HATRAN NUMBER ONE HUNDRED + {0x10900, 0x10915, prN}, // Lo [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU + {0x10916, 0x1091B, prN}, // No [6] PHOENICIAN NUMBER ONE..PHOENICIAN NUMBER THREE + {0x1091F, 0x1091F, prN}, // Po PHOENICIAN WORD SEPARATOR + {0x10920, 0x10939, prN}, // Lo [26] LYDIAN LETTER A..LYDIAN LETTER C + {0x1093F, 0x1093F, prN}, // Po LYDIAN TRIANGULAR MARK + {0x10980, 0x1099F, prN}, // Lo [32] MEROITIC HIEROGLYPHIC LETTER A..MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2 + {0x109A0, 0x109B7, prN}, // Lo [24] MEROITIC CURSIVE LETTER A..MEROITIC CURSIVE LETTER DA + {0x109BC, 0x109BD, prN}, // No [2] MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS..MEROITIC CURSIVE FRACTION ONE HALF + {0x109BE, 0x109BF, prN}, // Lo [2] MEROITIC CURSIVE LOGOGRAM RMT..MEROITIC CURSIVE LOGOGRAM IMN + {0x109C0, 0x109CF, prN}, // No [16] MEROITIC CURSIVE NUMBER ONE..MEROITIC CURSIVE NUMBER SEVENTY + {0x109D2, 0x109FF, prN}, // No [46] MEROITIC CURSIVE NUMBER ONE HUNDRED..MEROITIC CURSIVE FRACTION TEN TWELFTHS + {0x10A00, 0x10A00, prN}, // Lo KHAROSHTHI LETTER A + {0x10A01, 0x10A03, prN}, // Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R + {0x10A05, 0x10A06, prN}, // Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O + {0x10A0C, 0x10A0F, prN}, // Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA + {0x10A10, 0x10A13, prN}, // Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA + {0x10A15, 0x10A17, prN}, // Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA + {0x10A19, 0x10A35, prN}, // Lo [29] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER VHA + {0x10A38, 0x10A3A, prN}, // Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW + {0x10A3F, 0x10A3F, prN}, // Mn KHAROSHTHI VIRAMA + {0x10A40, 0x10A48, prN}, // No [9] KHAROSHTHI DIGIT ONE..KHAROSHTHI FRACTION ONE HALF + {0x10A50, 0x10A58, prN}, // Po [9] KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION LINES + {0x10A60, 0x10A7C, prN}, // Lo [29] OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH + {0x10A7D, 0x10A7E, prN}, // No [2] OLD SOUTH ARABIAN NUMBER ONE..OLD SOUTH ARABIAN NUMBER FIFTY + {0x10A7F, 0x10A7F, prN}, // Po OLD SOUTH ARABIAN NUMERIC INDICATOR + {0x10A80, 0x10A9C, prN}, // Lo [29] OLD NORTH ARABIAN LETTER HEH..OLD NORTH ARABIAN LETTER ZAH + {0x10A9D, 0x10A9F, prN}, // No [3] OLD NORTH ARABIAN NUMBER ONE..OLD NORTH ARABIAN NUMBER TWENTY + {0x10AC0, 0x10AC7, prN}, // Lo [8] MANICHAEAN LETTER ALEPH..MANICHAEAN LETTER WAW + {0x10AC8, 0x10AC8, prN}, // So MANICHAEAN SIGN UD + {0x10AC9, 0x10AE4, prN}, // Lo [28] MANICHAEAN LETTER ZAYIN..MANICHAEAN LETTER TAW + {0x10AE5, 0x10AE6, prN}, // Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW + {0x10AEB, 0x10AEF, prN}, // No [5] MANICHAEAN NUMBER ONE..MANICHAEAN NUMBER ONE HUNDRED + {0x10AF0, 0x10AF6, prN}, // Po [7] MANICHAEAN PUNCTUATION STAR..MANICHAEAN PUNCTUATION LINE FILLER + {0x10B00, 0x10B35, prN}, // Lo [54] AVESTAN LETTER A..AVESTAN LETTER HE + {0x10B39, 0x10B3F, prN}, // Po [7] AVESTAN ABBREVIATION MARK..LARGE ONE RING OVER TWO RINGS PUNCTUATION + {0x10B40, 0x10B55, prN}, // Lo [22] INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW + {0x10B58, 0x10B5F, prN}, // No [8] INSCRIPTIONAL PARTHIAN NUMBER ONE..INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND + {0x10B60, 0x10B72, prN}, // Lo [19] INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW + {0x10B78, 0x10B7F, prN}, // No [8] INSCRIPTIONAL PAHLAVI NUMBER ONE..INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND + {0x10B80, 0x10B91, prN}, // Lo [18] PSALTER PAHLAVI LETTER ALEPH..PSALTER PAHLAVI LETTER TAW + {0x10B99, 0x10B9C, prN}, // Po [4] PSALTER PAHLAVI SECTION MARK..PSALTER PAHLAVI FOUR DOTS WITH DOT + {0x10BA9, 0x10BAF, prN}, // No [7] PSALTER PAHLAVI NUMBER ONE..PSALTER PAHLAVI NUMBER ONE HUNDRED + {0x10C00, 0x10C48, prN}, // Lo [73] OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH + {0x10C80, 0x10CB2, prN}, // Lu [51] OLD HUNGARIAN CAPITAL LETTER A..OLD HUNGARIAN CAPITAL LETTER US + {0x10CC0, 0x10CF2, prN}, // Ll [51] OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US + {0x10CFA, 0x10CFF, prN}, // No [6] OLD HUNGARIAN NUMBER ONE..OLD HUNGARIAN NUMBER ONE THOUSAND + {0x10D00, 0x10D23, prN}, // Lo [36] HANIFI ROHINGYA LETTER A..HANIFI ROHINGYA MARK NA KHONNA + {0x10D24, 0x10D27, prN}, // Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI + {0x10D30, 0x10D39, prN}, // Nd [10] HANIFI ROHINGYA DIGIT ZERO..HANIFI ROHINGYA DIGIT NINE + {0x10E60, 0x10E7E, prN}, // No [31] RUMI DIGIT ONE..RUMI FRACTION TWO THIRDS + {0x10E80, 0x10EA9, prN}, // Lo [42] YEZIDI LETTER ELIF..YEZIDI LETTER ET + {0x10EAB, 0x10EAC, prN}, // Mn [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK + {0x10EAD, 0x10EAD, prN}, // Pd YEZIDI HYPHENATION MARK + {0x10EB0, 0x10EB1, prN}, // Lo [2] YEZIDI LETTER LAM WITH DOT ABOVE..YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE + {0x10F00, 0x10F1C, prN}, // Lo [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL + {0x10F1D, 0x10F26, prN}, // No [10] OLD SOGDIAN NUMBER ONE..OLD SOGDIAN FRACTION ONE HALF + {0x10F27, 0x10F27, prN}, // Lo OLD SOGDIAN LIGATURE AYIN-DALETH + {0x10F30, 0x10F45, prN}, // Lo [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN + {0x10F46, 0x10F50, prN}, // Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW + {0x10F51, 0x10F54, prN}, // No [4] SOGDIAN NUMBER ONE..SOGDIAN NUMBER ONE HUNDRED + {0x10F55, 0x10F59, prN}, // Po [5] SOGDIAN PUNCTUATION TWO VERTICAL BARS..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT + {0x10F70, 0x10F81, prN}, // Lo [18] OLD UYGHUR LETTER ALEPH..OLD UYGHUR LETTER LESH + {0x10F82, 0x10F85, prN}, // Mn [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW + {0x10F86, 0x10F89, prN}, // Po [4] OLD UYGHUR PUNCTUATION BAR..OLD UYGHUR PUNCTUATION FOUR DOTS + {0x10FB0, 0x10FC4, prN}, // Lo [21] CHORASMIAN LETTER ALEPH..CHORASMIAN LETTER TAW + {0x10FC5, 0x10FCB, prN}, // No [7] CHORASMIAN NUMBER ONE..CHORASMIAN NUMBER ONE HUNDRED + {0x10FE0, 0x10FF6, prN}, // Lo [23] ELYMAIC LETTER ALEPH..ELYMAIC LIGATURE ZAYIN-YODH + {0x11000, 0x11000, prN}, // Mc BRAHMI SIGN CANDRABINDU + {0x11001, 0x11001, prN}, // Mn BRAHMI SIGN ANUSVARA + {0x11002, 0x11002, prN}, // Mc BRAHMI SIGN VISARGA + {0x11003, 0x11037, prN}, // Lo [53] BRAHMI SIGN JIHVAMULIYA..BRAHMI LETTER OLD TAMIL NNNA + {0x11038, 0x11046, prN}, // Mn [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA + {0x11047, 0x1104D, prN}, // Po [7] BRAHMI DANDA..BRAHMI PUNCTUATION LOTUS + {0x11052, 0x11065, prN}, // No [20] BRAHMI NUMBER ONE..BRAHMI NUMBER ONE THOUSAND + {0x11066, 0x1106F, prN}, // Nd [10] BRAHMI DIGIT ZERO..BRAHMI DIGIT NINE + {0x11070, 0x11070, prN}, // Mn BRAHMI SIGN OLD TAMIL VIRAMA + {0x11071, 0x11072, prN}, // Lo [2] BRAHMI LETTER OLD TAMIL SHORT E..BRAHMI LETTER OLD TAMIL SHORT O + {0x11073, 0x11074, prN}, // Mn [2] BRAHMI VOWEL SIGN OLD TAMIL SHORT E..BRAHMI VOWEL SIGN OLD TAMIL SHORT O + {0x11075, 0x11075, prN}, // Lo BRAHMI LETTER OLD TAMIL LLA + {0x1107F, 0x1107F, prN}, // Mn BRAHMI NUMBER JOINER + {0x11080, 0x11081, prN}, // Mn [2] KAITHI SIGN CANDRABINDU..KAITHI SIGN ANUSVARA + {0x11082, 0x11082, prN}, // Mc KAITHI SIGN VISARGA + {0x11083, 0x110AF, prN}, // Lo [45] KAITHI LETTER A..KAITHI LETTER HA + {0x110B0, 0x110B2, prN}, // Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II + {0x110B3, 0x110B6, prN}, // Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI + {0x110B7, 0x110B8, prN}, // Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU + {0x110B9, 0x110BA, prN}, // Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA + {0x110BB, 0x110BC, prN}, // Po [2] KAITHI ABBREVIATION SIGN..KAITHI ENUMERATION SIGN + {0x110BD, 0x110BD, prN}, // Cf KAITHI NUMBER SIGN + {0x110BE, 0x110C1, prN}, // Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA + {0x110C2, 0x110C2, prN}, // Mn KAITHI VOWEL SIGN VOCALIC R + {0x110CD, 0x110CD, prN}, // Cf KAITHI NUMBER SIGN ABOVE + {0x110D0, 0x110E8, prN}, // Lo [25] SORA SOMPENG LETTER SAH..SORA SOMPENG LETTER MAE + {0x110F0, 0x110F9, prN}, // Nd [10] SORA SOMPENG DIGIT ZERO..SORA SOMPENG DIGIT NINE + {0x11100, 0x11102, prN}, // Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA + {0x11103, 0x11126, prN}, // Lo [36] CHAKMA LETTER AA..CHAKMA LETTER HAA + {0x11127, 0x1112B, prN}, // Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU + {0x1112C, 0x1112C, prN}, // Mc CHAKMA VOWEL SIGN E + {0x1112D, 0x11134, prN}, // Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA + {0x11136, 0x1113F, prN}, // Nd [10] CHAKMA DIGIT ZERO..CHAKMA DIGIT NINE + {0x11140, 0x11143, prN}, // Po [4] CHAKMA SECTION MARK..CHAKMA QUESTION MARK + {0x11144, 0x11144, prN}, // Lo CHAKMA LETTER LHAA + {0x11145, 0x11146, prN}, // Mc [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI + {0x11147, 0x11147, prN}, // Lo CHAKMA LETTER VAA + {0x11150, 0x11172, prN}, // Lo [35] MAHAJANI LETTER A..MAHAJANI LETTER RRA + {0x11173, 0x11173, prN}, // Mn MAHAJANI SIGN NUKTA + {0x11174, 0x11175, prN}, // Po [2] MAHAJANI ABBREVIATION SIGN..MAHAJANI SECTION MARK + {0x11176, 0x11176, prN}, // Lo MAHAJANI LIGATURE SHRI + {0x11180, 0x11181, prN}, // Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA + {0x11182, 0x11182, prN}, // Mc SHARADA SIGN VISARGA + {0x11183, 0x111B2, prN}, // Lo [48] SHARADA LETTER A..SHARADA LETTER HA + {0x111B3, 0x111B5, prN}, // Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II + {0x111B6, 0x111BE, prN}, // Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O + {0x111BF, 0x111C0, prN}, // Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA + {0x111C1, 0x111C4, prN}, // Lo [4] SHARADA SIGN AVAGRAHA..SHARADA OM + {0x111C5, 0x111C8, prN}, // Po [4] SHARADA DANDA..SHARADA SEPARATOR + {0x111C9, 0x111CC, prN}, // Mn [4] SHARADA SANDHI MARK..SHARADA EXTRA SHORT VOWEL MARK + {0x111CD, 0x111CD, prN}, // Po SHARADA SUTRA MARK + {0x111CE, 0x111CE, prN}, // Mc SHARADA VOWEL SIGN PRISHTHAMATRA E + {0x111CF, 0x111CF, prN}, // Mn SHARADA SIGN INVERTED CANDRABINDU + {0x111D0, 0x111D9, prN}, // Nd [10] SHARADA DIGIT ZERO..SHARADA DIGIT NINE + {0x111DA, 0x111DA, prN}, // Lo SHARADA EKAM + {0x111DB, 0x111DB, prN}, // Po SHARADA SIGN SIDDHAM + {0x111DC, 0x111DC, prN}, // Lo SHARADA HEADSTROKE + {0x111DD, 0x111DF, prN}, // Po [3] SHARADA CONTINUATION SIGN..SHARADA SECTION MARK-2 + {0x111E1, 0x111F4, prN}, // No [20] SINHALA ARCHAIC DIGIT ONE..SINHALA ARCHAIC NUMBER ONE THOUSAND + {0x11200, 0x11211, prN}, // Lo [18] KHOJKI LETTER A..KHOJKI LETTER JJA + {0x11213, 0x1122B, prN}, // Lo [25] KHOJKI LETTER NYA..KHOJKI LETTER LLA + {0x1122C, 0x1122E, prN}, // Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II + {0x1122F, 0x11231, prN}, // Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI + {0x11232, 0x11233, prN}, // Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU + {0x11234, 0x11234, prN}, // Mn KHOJKI SIGN ANUSVARA + {0x11235, 0x11235, prN}, // Mc KHOJKI SIGN VIRAMA + {0x11236, 0x11237, prN}, // Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA + {0x11238, 0x1123D, prN}, // Po [6] KHOJKI DANDA..KHOJKI ABBREVIATION SIGN + {0x1123E, 0x1123E, prN}, // Mn KHOJKI SIGN SUKUN + {0x11280, 0x11286, prN}, // Lo [7] MULTANI LETTER A..MULTANI LETTER GA + {0x11288, 0x11288, prN}, // Lo MULTANI LETTER GHA + {0x1128A, 0x1128D, prN}, // Lo [4] MULTANI LETTER CA..MULTANI LETTER JJA + {0x1128F, 0x1129D, prN}, // Lo [15] MULTANI LETTER NYA..MULTANI LETTER BA + {0x1129F, 0x112A8, prN}, // Lo [10] MULTANI LETTER BHA..MULTANI LETTER RHA + {0x112A9, 0x112A9, prN}, // Po MULTANI SECTION MARK + {0x112B0, 0x112DE, prN}, // Lo [47] KHUDAWADI LETTER A..KHUDAWADI LETTER HA + {0x112DF, 0x112DF, prN}, // Mn KHUDAWADI SIGN ANUSVARA + {0x112E0, 0x112E2, prN}, // Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II + {0x112E3, 0x112EA, prN}, // Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA + {0x112F0, 0x112F9, prN}, // Nd [10] KHUDAWADI DIGIT ZERO..KHUDAWADI DIGIT NINE + {0x11300, 0x11301, prN}, // Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU + {0x11302, 0x11303, prN}, // Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA + {0x11305, 0x1130C, prN}, // Lo [8] GRANTHA LETTER A..GRANTHA LETTER VOCALIC L + {0x1130F, 0x11310, prN}, // Lo [2] GRANTHA LETTER EE..GRANTHA LETTER AI + {0x11313, 0x11328, prN}, // Lo [22] GRANTHA LETTER OO..GRANTHA LETTER NA + {0x1132A, 0x11330, prN}, // Lo [7] GRANTHA LETTER PA..GRANTHA LETTER RA + {0x11332, 0x11333, prN}, // Lo [2] GRANTHA LETTER LA..GRANTHA LETTER LLA + {0x11335, 0x11339, prN}, // Lo [5] GRANTHA LETTER VA..GRANTHA LETTER HA + {0x1133B, 0x1133C, prN}, // Mn [2] COMBINING BINDU BELOW..GRANTHA SIGN NUKTA + {0x1133D, 0x1133D, prN}, // Lo GRANTHA SIGN AVAGRAHA + {0x1133E, 0x1133F, prN}, // Mc [2] GRANTHA VOWEL SIGN AA..GRANTHA VOWEL SIGN I + {0x11340, 0x11340, prN}, // Mn GRANTHA VOWEL SIGN II + {0x11341, 0x11344, prN}, // Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR + {0x11347, 0x11348, prN}, // Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI + {0x1134B, 0x1134D, prN}, // Mc [3] GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA + {0x11350, 0x11350, prN}, // Lo GRANTHA OM + {0x11357, 0x11357, prN}, // Mc GRANTHA AU LENGTH MARK + {0x1135D, 0x11361, prN}, // Lo [5] GRANTHA SIGN PLUTA..GRANTHA LETTER VOCALIC LL + {0x11362, 0x11363, prN}, // Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL + {0x11366, 0x1136C, prN}, // Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX + {0x11370, 0x11374, prN}, // Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA + {0x11400, 0x11434, prN}, // Lo [53] NEWA LETTER A..NEWA LETTER HA + {0x11435, 0x11437, prN}, // Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II + {0x11438, 0x1143F, prN}, // Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI + {0x11440, 0x11441, prN}, // Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU + {0x11442, 0x11444, prN}, // Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA + {0x11445, 0x11445, prN}, // Mc NEWA SIGN VISARGA + {0x11446, 0x11446, prN}, // Mn NEWA SIGN NUKTA + {0x11447, 0x1144A, prN}, // Lo [4] NEWA SIGN AVAGRAHA..NEWA SIDDHI + {0x1144B, 0x1144F, prN}, // Po [5] NEWA DANDA..NEWA ABBREVIATION SIGN + {0x11450, 0x11459, prN}, // Nd [10] NEWA DIGIT ZERO..NEWA DIGIT NINE + {0x1145A, 0x1145B, prN}, // Po [2] NEWA DOUBLE COMMA..NEWA PLACEHOLDER MARK + {0x1145D, 0x1145D, prN}, // Po NEWA INSERTION SIGN + {0x1145E, 0x1145E, prN}, // Mn NEWA SANDHI MARK + {0x1145F, 0x11461, prN}, // Lo [3] NEWA LETTER VEDIC ANUSVARA..NEWA SIGN UPADHMANIYA + {0x11480, 0x114AF, prN}, // Lo [48] TIRHUTA ANJI..TIRHUTA LETTER HA + {0x114B0, 0x114B2, prN}, // Mc [3] TIRHUTA VOWEL SIGN AA..TIRHUTA VOWEL SIGN II + {0x114B3, 0x114B8, prN}, // Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL + {0x114B9, 0x114B9, prN}, // Mc TIRHUTA VOWEL SIGN E + {0x114BA, 0x114BA, prN}, // Mn TIRHUTA VOWEL SIGN SHORT E + {0x114BB, 0x114BE, prN}, // Mc [4] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN AU + {0x114BF, 0x114C0, prN}, // Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA + {0x114C1, 0x114C1, prN}, // Mc TIRHUTA SIGN VISARGA + {0x114C2, 0x114C3, prN}, // Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA + {0x114C4, 0x114C5, prN}, // Lo [2] TIRHUTA SIGN AVAGRAHA..TIRHUTA GVANG + {0x114C6, 0x114C6, prN}, // Po TIRHUTA ABBREVIATION SIGN + {0x114C7, 0x114C7, prN}, // Lo TIRHUTA OM + {0x114D0, 0x114D9, prN}, // Nd [10] TIRHUTA DIGIT ZERO..TIRHUTA DIGIT NINE + {0x11580, 0x115AE, prN}, // Lo [47] SIDDHAM LETTER A..SIDDHAM LETTER HA + {0x115AF, 0x115B1, prN}, // Mc [3] SIDDHAM VOWEL SIGN AA..SIDDHAM VOWEL SIGN II + {0x115B2, 0x115B5, prN}, // Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR + {0x115B8, 0x115BB, prN}, // Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU + {0x115BC, 0x115BD, prN}, // Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA + {0x115BE, 0x115BE, prN}, // Mc SIDDHAM SIGN VISARGA + {0x115BF, 0x115C0, prN}, // Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA + {0x115C1, 0x115D7, prN}, // Po [23] SIDDHAM SIGN SIDDHAM..SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES + {0x115D8, 0x115DB, prN}, // Lo [4] SIDDHAM LETTER THREE-CIRCLE ALTERNATE I..SIDDHAM LETTER ALTERNATE U + {0x115DC, 0x115DD, prN}, // Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU + {0x11600, 0x1162F, prN}, // Lo [48] MODI LETTER A..MODI LETTER LLA + {0x11630, 0x11632, prN}, // Mc [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II + {0x11633, 0x1163A, prN}, // Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI + {0x1163B, 0x1163C, prN}, // Mc [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU + {0x1163D, 0x1163D, prN}, // Mn MODI SIGN ANUSVARA + {0x1163E, 0x1163E, prN}, // Mc MODI SIGN VISARGA + {0x1163F, 0x11640, prN}, // Mn [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA + {0x11641, 0x11643, prN}, // Po [3] MODI DANDA..MODI ABBREVIATION SIGN + {0x11644, 0x11644, prN}, // Lo MODI SIGN HUVA + {0x11650, 0x11659, prN}, // Nd [10] MODI DIGIT ZERO..MODI DIGIT NINE + {0x11660, 0x1166C, prN}, // Po [13] MONGOLIAN BIRGA WITH ORNAMENT..MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT + {0x11680, 0x116AA, prN}, // Lo [43] TAKRI LETTER A..TAKRI LETTER RRA + {0x116AB, 0x116AB, prN}, // Mn TAKRI SIGN ANUSVARA + {0x116AC, 0x116AC, prN}, // Mc TAKRI SIGN VISARGA + {0x116AD, 0x116AD, prN}, // Mn TAKRI VOWEL SIGN AA + {0x116AE, 0x116AF, prN}, // Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II + {0x116B0, 0x116B5, prN}, // Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU + {0x116B6, 0x116B6, prN}, // Mc TAKRI SIGN VIRAMA + {0x116B7, 0x116B7, prN}, // Mn TAKRI SIGN NUKTA + {0x116B8, 0x116B8, prN}, // Lo TAKRI LETTER ARCHAIC KHA + {0x116B9, 0x116B9, prN}, // Po TAKRI ABBREVIATION SIGN + {0x116C0, 0x116C9, prN}, // Nd [10] TAKRI DIGIT ZERO..TAKRI DIGIT NINE + {0x11700, 0x1171A, prN}, // Lo [27] AHOM LETTER KA..AHOM LETTER ALTERNATE BA + {0x1171D, 0x1171F, prN}, // Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA + {0x11720, 0x11721, prN}, // Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA + {0x11722, 0x11725, prN}, // Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU + {0x11726, 0x11726, prN}, // Mc AHOM VOWEL SIGN E + {0x11727, 0x1172B, prN}, // Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER + {0x11730, 0x11739, prN}, // Nd [10] AHOM DIGIT ZERO..AHOM DIGIT NINE + {0x1173A, 0x1173B, prN}, // No [2] AHOM NUMBER TEN..AHOM NUMBER TWENTY + {0x1173C, 0x1173E, prN}, // Po [3] AHOM SIGN SMALL SECTION..AHOM SIGN RULAI + {0x1173F, 0x1173F, prN}, // So AHOM SYMBOL VI + {0x11740, 0x11746, prN}, // Lo [7] AHOM LETTER CA..AHOM LETTER LLA + {0x11800, 0x1182B, prN}, // Lo [44] DOGRA LETTER A..DOGRA LETTER RRA + {0x1182C, 0x1182E, prN}, // Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II + {0x1182F, 0x11837, prN}, // Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA + {0x11838, 0x11838, prN}, // Mc DOGRA SIGN VISARGA + {0x11839, 0x1183A, prN}, // Mn [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA + {0x1183B, 0x1183B, prN}, // Po DOGRA ABBREVIATION SIGN + {0x118A0, 0x118DF, prN}, // L& [64] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI SMALL LETTER VIYO + {0x118E0, 0x118E9, prN}, // Nd [10] WARANG CITI DIGIT ZERO..WARANG CITI DIGIT NINE + {0x118EA, 0x118F2, prN}, // No [9] WARANG CITI NUMBER TEN..WARANG CITI NUMBER NINETY + {0x118FF, 0x118FF, prN}, // Lo WARANG CITI OM + {0x11900, 0x11906, prN}, // Lo [7] DIVES AKURU LETTER A..DIVES AKURU LETTER E + {0x11909, 0x11909, prN}, // Lo DIVES AKURU LETTER O + {0x1190C, 0x11913, prN}, // Lo [8] DIVES AKURU LETTER KA..DIVES AKURU LETTER JA + {0x11915, 0x11916, prN}, // Lo [2] DIVES AKURU LETTER NYA..DIVES AKURU LETTER TTA + {0x11918, 0x1192F, prN}, // Lo [24] DIVES AKURU LETTER DDA..DIVES AKURU LETTER ZA + {0x11930, 0x11935, prN}, // Mc [6] DIVES AKURU VOWEL SIGN AA..DIVES AKURU VOWEL SIGN E + {0x11937, 0x11938, prN}, // Mc [2] DIVES AKURU VOWEL SIGN AI..DIVES AKURU VOWEL SIGN O + {0x1193B, 0x1193C, prN}, // Mn [2] DIVES AKURU SIGN ANUSVARA..DIVES AKURU SIGN CANDRABINDU + {0x1193D, 0x1193D, prN}, // Mc DIVES AKURU SIGN HALANTA + {0x1193E, 0x1193E, prN}, // Mn DIVES AKURU VIRAMA + {0x1193F, 0x1193F, prN}, // Lo DIVES AKURU PREFIXED NASAL SIGN + {0x11940, 0x11940, prN}, // Mc DIVES AKURU MEDIAL YA + {0x11941, 0x11941, prN}, // Lo DIVES AKURU INITIAL RA + {0x11942, 0x11942, prN}, // Mc DIVES AKURU MEDIAL RA + {0x11943, 0x11943, prN}, // Mn DIVES AKURU SIGN NUKTA + {0x11944, 0x11946, prN}, // Po [3] DIVES AKURU DOUBLE DANDA..DIVES AKURU END OF TEXT MARK + {0x11950, 0x11959, prN}, // Nd [10] DIVES AKURU DIGIT ZERO..DIVES AKURU DIGIT NINE + {0x119A0, 0x119A7, prN}, // Lo [8] NANDINAGARI LETTER A..NANDINAGARI LETTER VOCALIC RR + {0x119AA, 0x119D0, prN}, // Lo [39] NANDINAGARI LETTER E..NANDINAGARI LETTER RRA + {0x119D1, 0x119D3, prN}, // Mc [3] NANDINAGARI VOWEL SIGN AA..NANDINAGARI VOWEL SIGN II + {0x119D4, 0x119D7, prN}, // Mn [4] NANDINAGARI VOWEL SIGN U..NANDINAGARI VOWEL SIGN VOCALIC RR + {0x119DA, 0x119DB, prN}, // Mn [2] NANDINAGARI VOWEL SIGN E..NANDINAGARI VOWEL SIGN AI + {0x119DC, 0x119DF, prN}, // Mc [4] NANDINAGARI VOWEL SIGN O..NANDINAGARI SIGN VISARGA + {0x119E0, 0x119E0, prN}, // Mn NANDINAGARI SIGN VIRAMA + {0x119E1, 0x119E1, prN}, // Lo NANDINAGARI SIGN AVAGRAHA + {0x119E2, 0x119E2, prN}, // Po NANDINAGARI SIGN SIDDHAM + {0x119E3, 0x119E3, prN}, // Lo NANDINAGARI HEADSTROKE + {0x119E4, 0x119E4, prN}, // Mc NANDINAGARI VOWEL SIGN PRISHTHAMATRA E + {0x11A00, 0x11A00, prN}, // Lo ZANABAZAR SQUARE LETTER A + {0x11A01, 0x11A0A, prN}, // Mn [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK + {0x11A0B, 0x11A32, prN}, // Lo [40] ZANABAZAR SQUARE LETTER KA..ZANABAZAR SQUARE LETTER KSSA + {0x11A33, 0x11A38, prN}, // Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA + {0x11A39, 0x11A39, prN}, // Mc ZANABAZAR SQUARE SIGN VISARGA + {0x11A3A, 0x11A3A, prN}, // Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA + {0x11A3B, 0x11A3E, prN}, // Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA + {0x11A3F, 0x11A46, prN}, // Po [8] ZANABAZAR SQUARE INITIAL HEAD MARK..ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK + {0x11A47, 0x11A47, prN}, // Mn ZANABAZAR SQUARE SUBJOINER + {0x11A50, 0x11A50, prN}, // Lo SOYOMBO LETTER A + {0x11A51, 0x11A56, prN}, // Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE + {0x11A57, 0x11A58, prN}, // Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU + {0x11A59, 0x11A5B, prN}, // Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK + {0x11A5C, 0x11A89, prN}, // Lo [46] SOYOMBO LETTER KA..SOYOMBO CLUSTER-INITIAL LETTER SA + {0x11A8A, 0x11A96, prN}, // Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA + {0x11A97, 0x11A97, prN}, // Mc SOYOMBO SIGN VISARGA + {0x11A98, 0x11A99, prN}, // Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER + {0x11A9A, 0x11A9C, prN}, // Po [3] SOYOMBO MARK TSHEG..SOYOMBO MARK DOUBLE SHAD + {0x11A9D, 0x11A9D, prN}, // Lo SOYOMBO MARK PLUTA + {0x11A9E, 0x11AA2, prN}, // Po [5] SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO TERMINAL MARK-2 + {0x11AB0, 0x11ABF, prN}, // Lo [16] CANADIAN SYLLABICS NATTILIK HI..CANADIAN SYLLABICS SPA + {0x11AC0, 0x11AF8, prN}, // Lo [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL + {0x11C00, 0x11C08, prN}, // Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L + {0x11C0A, 0x11C2E, prN}, // Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA + {0x11C2F, 0x11C2F, prN}, // Mc BHAIKSUKI VOWEL SIGN AA + {0x11C30, 0x11C36, prN}, // Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L + {0x11C38, 0x11C3D, prN}, // Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA + {0x11C3E, 0x11C3E, prN}, // Mc BHAIKSUKI SIGN VISARGA + {0x11C3F, 0x11C3F, prN}, // Mn BHAIKSUKI SIGN VIRAMA + {0x11C40, 0x11C40, prN}, // Lo BHAIKSUKI SIGN AVAGRAHA + {0x11C41, 0x11C45, prN}, // Po [5] BHAIKSUKI DANDA..BHAIKSUKI GAP FILLER-2 + {0x11C50, 0x11C59, prN}, // Nd [10] BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE + {0x11C5A, 0x11C6C, prN}, // No [19] BHAIKSUKI NUMBER ONE..BHAIKSUKI HUNDREDS UNIT MARK + {0x11C70, 0x11C71, prN}, // Po [2] MARCHEN HEAD MARK..MARCHEN MARK SHAD + {0x11C72, 0x11C8F, prN}, // Lo [30] MARCHEN LETTER KA..MARCHEN LETTER A + {0x11C92, 0x11CA7, prN}, // Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA + {0x11CA9, 0x11CA9, prN}, // Mc MARCHEN SUBJOINED LETTER YA + {0x11CAA, 0x11CB0, prN}, // Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA + {0x11CB1, 0x11CB1, prN}, // Mc MARCHEN VOWEL SIGN I + {0x11CB2, 0x11CB3, prN}, // Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E + {0x11CB4, 0x11CB4, prN}, // Mc MARCHEN VOWEL SIGN O + {0x11CB5, 0x11CB6, prN}, // Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU + {0x11D00, 0x11D06, prN}, // Lo [7] MASARAM GONDI LETTER A..MASARAM GONDI LETTER E + {0x11D08, 0x11D09, prN}, // Lo [2] MASARAM GONDI LETTER AI..MASARAM GONDI LETTER O + {0x11D0B, 0x11D30, prN}, // Lo [38] MASARAM GONDI LETTER AU..MASARAM GONDI LETTER TRA + {0x11D31, 0x11D36, prN}, // Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R + {0x11D3A, 0x11D3A, prN}, // Mn MASARAM GONDI VOWEL SIGN E + {0x11D3C, 0x11D3D, prN}, // Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O + {0x11D3F, 0x11D45, prN}, // Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA + {0x11D46, 0x11D46, prN}, // Lo MASARAM GONDI REPHA + {0x11D47, 0x11D47, prN}, // Mn MASARAM GONDI RA-KARA + {0x11D50, 0x11D59, prN}, // Nd [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE + {0x11D60, 0x11D65, prN}, // Lo [6] GUNJALA GONDI LETTER A..GUNJALA GONDI LETTER UU + {0x11D67, 0x11D68, prN}, // Lo [2] GUNJALA GONDI LETTER EE..GUNJALA GONDI LETTER AI + {0x11D6A, 0x11D89, prN}, // Lo [32] GUNJALA GONDI LETTER OO..GUNJALA GONDI LETTER SA + {0x11D8A, 0x11D8E, prN}, // Mc [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU + {0x11D90, 0x11D91, prN}, // Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI + {0x11D93, 0x11D94, prN}, // Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU + {0x11D95, 0x11D95, prN}, // Mn GUNJALA GONDI SIGN ANUSVARA + {0x11D96, 0x11D96, prN}, // Mc GUNJALA GONDI SIGN VISARGA + {0x11D97, 0x11D97, prN}, // Mn GUNJALA GONDI VIRAMA + {0x11D98, 0x11D98, prN}, // Lo GUNJALA GONDI OM + {0x11DA0, 0x11DA9, prN}, // Nd [10] GUNJALA GONDI DIGIT ZERO..GUNJALA GONDI DIGIT NINE + {0x11EE0, 0x11EF2, prN}, // Lo [19] MAKASAR LETTER KA..MAKASAR ANGKA + {0x11EF3, 0x11EF4, prN}, // Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U + {0x11EF5, 0x11EF6, prN}, // Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O + {0x11EF7, 0x11EF8, prN}, // Po [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION + {0x11FB0, 0x11FB0, prN}, // Lo LISU LETTER YHA + {0x11FC0, 0x11FD4, prN}, // No [21] TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH..TAMIL FRACTION DOWNSCALING FACTOR KIIZH + {0x11FD5, 0x11FDC, prN}, // So [8] TAMIL SIGN NEL..TAMIL SIGN MUKKURUNI + {0x11FDD, 0x11FE0, prN}, // Sc [4] TAMIL SIGN KAACU..TAMIL SIGN VARAAKAN + {0x11FE1, 0x11FF1, prN}, // So [17] TAMIL SIGN PAARAM..TAMIL SIGN VAKAIYARAA + {0x11FFF, 0x11FFF, prN}, // Po TAMIL PUNCTUATION END OF TEXT + {0x12000, 0x12399, prN}, // Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U + {0x12400, 0x1246E, prN}, // Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM + {0x12470, 0x12474, prN}, // Po [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON + {0x12480, 0x12543, prN}, // Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU + {0x12F90, 0x12FF0, prN}, // Lo [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114 + {0x12FF1, 0x12FF2, prN}, // Po [2] CYPRO-MINOAN SIGN CM301..CYPRO-MINOAN SIGN CM302 + {0x13000, 0x1342E, prN}, // Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032 + {0x13430, 0x13438, prN}, // Cf [9] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END SEGMENT + {0x14400, 0x14646, prN}, // Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530 + {0x16800, 0x16A38, prN}, // Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ + {0x16A40, 0x16A5E, prN}, // Lo [31] MRO LETTER TA..MRO LETTER TEK + {0x16A60, 0x16A69, prN}, // Nd [10] MRO DIGIT ZERO..MRO DIGIT NINE + {0x16A6E, 0x16A6F, prN}, // Po [2] MRO DANDA..MRO DOUBLE DANDA + {0x16A70, 0x16ABE, prN}, // Lo [79] TANGSA LETTER OZ..TANGSA LETTER ZA + {0x16AC0, 0x16AC9, prN}, // Nd [10] TANGSA DIGIT ZERO..TANGSA DIGIT NINE + {0x16AD0, 0x16AED, prN}, // Lo [30] BASSA VAH LETTER ENNI..BASSA VAH LETTER I + {0x16AF0, 0x16AF4, prN}, // Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE + {0x16AF5, 0x16AF5, prN}, // Po BASSA VAH FULL STOP + {0x16B00, 0x16B2F, prN}, // Lo [48] PAHAWH HMONG VOWEL KEEB..PAHAWH HMONG CONSONANT CAU + {0x16B30, 0x16B36, prN}, // Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM + {0x16B37, 0x16B3B, prN}, // Po [5] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN VOS FEEM + {0x16B3C, 0x16B3F, prN}, // So [4] PAHAWH HMONG SIGN XYEEM NTXIV..PAHAWH HMONG SIGN XYEEM FAIB + {0x16B40, 0x16B43, prN}, // Lm [4] PAHAWH HMONG SIGN VOS SEEV..PAHAWH HMONG SIGN IB YAM + {0x16B44, 0x16B44, prN}, // Po PAHAWH HMONG SIGN XAUS + {0x16B45, 0x16B45, prN}, // So PAHAWH HMONG SIGN CIM TSOV ROG + {0x16B50, 0x16B59, prN}, // Nd [10] PAHAWH HMONG DIGIT ZERO..PAHAWH HMONG DIGIT NINE + {0x16B5B, 0x16B61, prN}, // No [7] PAHAWH HMONG NUMBER TENS..PAHAWH HMONG NUMBER TRILLIONS + {0x16B63, 0x16B77, prN}, // Lo [21] PAHAWH HMONG SIGN VOS LUB..PAHAWH HMONG SIGN CIM NRES TOS + {0x16B7D, 0x16B8F, prN}, // Lo [19] PAHAWH HMONG CLAN SIGN TSHEEJ..PAHAWH HMONG CLAN SIGN VWJ + {0x16E40, 0x16E7F, prN}, // L& [64] MEDEFAIDRIN CAPITAL LETTER M..MEDEFAIDRIN SMALL LETTER Y + {0x16E80, 0x16E96, prN}, // No [23] MEDEFAIDRIN DIGIT ZERO..MEDEFAIDRIN DIGIT THREE ALTERNATE FORM + {0x16E97, 0x16E9A, prN}, // Po [4] MEDEFAIDRIN COMMA..MEDEFAIDRIN EXCLAMATION OH + {0x16F00, 0x16F4A, prN}, // Lo [75] MIAO LETTER PA..MIAO LETTER RTE + {0x16F4F, 0x16F4F, prN}, // Mn MIAO SIGN CONSONANT MODIFIER BAR + {0x16F50, 0x16F50, prN}, // Lo MIAO LETTER NASALIZATION + {0x16F51, 0x16F87, prN}, // Mc [55] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN UI + {0x16F8F, 0x16F92, prN}, // Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW + {0x16F93, 0x16F9F, prN}, // Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 + {0x16FE0, 0x16FE1, prW}, // Lm [2] TANGUT ITERATION MARK..NUSHU ITERATION MARK + {0x16FE2, 0x16FE2, prW}, // Po OLD CHINESE HOOK MARK + {0x16FE3, 0x16FE3, prW}, // Lm OLD CHINESE ITERATION MARK + {0x16FE4, 0x16FE4, prW}, // Mn KHITAN SMALL SCRIPT FILLER + {0x16FF0, 0x16FF1, prW}, // Mc [2] VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY + {0x17000, 0x187F7, prW}, // Lo [6136] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187F7 + {0x18800, 0x18AFF, prW}, // Lo [768] TANGUT COMPONENT-001..TANGUT COMPONENT-768 + {0x18B00, 0x18CD5, prW}, // Lo [470] KHITAN SMALL SCRIPT CHARACTER-18B00..KHITAN SMALL SCRIPT CHARACTER-18CD5 + {0x18D00, 0x18D08, prW}, // Lo [9] TANGUT IDEOGRAPH-18D00..TANGUT IDEOGRAPH-18D08 + {0x1AFF0, 0x1AFF3, prW}, // Lm [4] KATAKANA LETTER MINNAN TONE-2..KATAKANA LETTER MINNAN TONE-5 + {0x1AFF5, 0x1AFFB, prW}, // Lm [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5 + {0x1AFFD, 0x1AFFE, prW}, // Lm [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8 + {0x1B000, 0x1B0FF, prW}, // Lo [256] KATAKANA LETTER ARCHAIC E..HENTAIGANA LETTER RE-2 + {0x1B100, 0x1B122, prW}, // Lo [35] HENTAIGANA LETTER RE-3..KATAKANA LETTER ARCHAIC WU + {0x1B150, 0x1B152, prW}, // Lo [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO + {0x1B164, 0x1B167, prW}, // Lo [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N + {0x1B170, 0x1B2FB, prW}, // Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB + {0x1BC00, 0x1BC6A, prN}, // Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M + {0x1BC70, 0x1BC7C, prN}, // Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK + {0x1BC80, 0x1BC88, prN}, // Lo [9] DUPLOYAN AFFIX HIGH ACUTE..DUPLOYAN AFFIX HIGH VERTICAL + {0x1BC90, 0x1BC99, prN}, // Lo [10] DUPLOYAN AFFIX LOW ACUTE..DUPLOYAN AFFIX LOW ARROW + {0x1BC9C, 0x1BC9C, prN}, // So DUPLOYAN SIGN O WITH CROSS + {0x1BC9D, 0x1BC9E, prN}, // Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK + {0x1BC9F, 0x1BC9F, prN}, // Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP + {0x1BCA0, 0x1BCA3, prN}, // Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP + {0x1CF00, 0x1CF2D, prN}, // Mn [46] ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON LEFT..ZNAMENNY COMBINING MARK KRYZH ON LEFT + {0x1CF30, 0x1CF46, prN}, // Mn [23] ZNAMENNY COMBINING TONAL RANGE MARK MRACHNO..ZNAMENNY PRIZNAK MODIFIER ROG + {0x1CF50, 0x1CFC3, prN}, // So [116] ZNAMENNY NEUME KRYUK..ZNAMENNY NEUME PAUK + {0x1D000, 0x1D0F5, prN}, // So [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO + {0x1D100, 0x1D126, prN}, // So [39] MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2 + {0x1D129, 0x1D164, prN}, // So [60] MUSICAL SYMBOL MULTIPLE MEASURE REST..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE + {0x1D165, 0x1D166, prN}, // Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM + {0x1D167, 0x1D169, prN}, // Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 + {0x1D16A, 0x1D16C, prN}, // So [3] MUSICAL SYMBOL FINGERED TREMOLO-1..MUSICAL SYMBOL FINGERED TREMOLO-3 + {0x1D16D, 0x1D172, prN}, // Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 + {0x1D173, 0x1D17A, prN}, // Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE + {0x1D17B, 0x1D182, prN}, // Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE + {0x1D183, 0x1D184, prN}, // So [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN + {0x1D185, 0x1D18B, prN}, // Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE + {0x1D18C, 0x1D1A9, prN}, // So [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH + {0x1D1AA, 0x1D1AD, prN}, // Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO + {0x1D1AE, 0x1D1EA, prN}, // So [61] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL KORON + {0x1D200, 0x1D241, prN}, // So [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54 + {0x1D242, 0x1D244, prN}, // Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME + {0x1D245, 0x1D245, prN}, // So GREEK MUSICAL LEIMMA + {0x1D2E0, 0x1D2F3, prN}, // No [20] MAYAN NUMERAL ZERO..MAYAN NUMERAL NINETEEN + {0x1D300, 0x1D356, prN}, // So [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING + {0x1D360, 0x1D378, prN}, // No [25] COUNTING ROD UNIT DIGIT ONE..TALLY MARK FIVE + {0x1D400, 0x1D454, prN}, // L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G + {0x1D456, 0x1D49C, prN}, // L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A + {0x1D49E, 0x1D49F, prN}, // Lu [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D + {0x1D4A2, 0x1D4A2, prN}, // Lu MATHEMATICAL SCRIPT CAPITAL G + {0x1D4A5, 0x1D4A6, prN}, // Lu [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K + {0x1D4A9, 0x1D4AC, prN}, // Lu [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q + {0x1D4AE, 0x1D4B9, prN}, // L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D + {0x1D4BB, 0x1D4BB, prN}, // Ll MATHEMATICAL SCRIPT SMALL F + {0x1D4BD, 0x1D4C3, prN}, // Ll [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N + {0x1D4C5, 0x1D505, prN}, // L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B + {0x1D507, 0x1D50A, prN}, // Lu [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G + {0x1D50D, 0x1D514, prN}, // Lu [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q + {0x1D516, 0x1D51C, prN}, // Lu [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y + {0x1D51E, 0x1D539, prN}, // L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B + {0x1D53B, 0x1D53E, prN}, // Lu [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G + {0x1D540, 0x1D544, prN}, // Lu [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M + {0x1D546, 0x1D546, prN}, // Lu MATHEMATICAL DOUBLE-STRUCK CAPITAL O + {0x1D54A, 0x1D550, prN}, // Lu [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y + {0x1D552, 0x1D6A5, prN}, // L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J + {0x1D6A8, 0x1D6C0, prN}, // Lu [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA + {0x1D6C1, 0x1D6C1, prN}, // Sm MATHEMATICAL BOLD NABLA + {0x1D6C2, 0x1D6DA, prN}, // Ll [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA + {0x1D6DB, 0x1D6DB, prN}, // Sm MATHEMATICAL BOLD PARTIAL DIFFERENTIAL + {0x1D6DC, 0x1D6FA, prN}, // L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA + {0x1D6FB, 0x1D6FB, prN}, // Sm MATHEMATICAL ITALIC NABLA + {0x1D6FC, 0x1D714, prN}, // Ll [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA + {0x1D715, 0x1D715, prN}, // Sm MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL + {0x1D716, 0x1D734, prN}, // L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA + {0x1D735, 0x1D735, prN}, // Sm MATHEMATICAL BOLD ITALIC NABLA + {0x1D736, 0x1D74E, prN}, // Ll [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA + {0x1D74F, 0x1D74F, prN}, // Sm MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL + {0x1D750, 0x1D76E, prN}, // L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA + {0x1D76F, 0x1D76F, prN}, // Sm MATHEMATICAL SANS-SERIF BOLD NABLA + {0x1D770, 0x1D788, prN}, // Ll [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA + {0x1D789, 0x1D789, prN}, // Sm MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL + {0x1D78A, 0x1D7A8, prN}, // L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA + {0x1D7A9, 0x1D7A9, prN}, // Sm MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA + {0x1D7AA, 0x1D7C2, prN}, // Ll [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA + {0x1D7C3, 0x1D7C3, prN}, // Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL + {0x1D7C4, 0x1D7CB, prN}, // L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA + {0x1D7CE, 0x1D7FF, prN}, // Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE + {0x1D800, 0x1D9FF, prN}, // So [512] SIGNWRITING HAND-FIST INDEX..SIGNWRITING HEAD + {0x1DA00, 0x1DA36, prN}, // Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN + {0x1DA37, 0x1DA3A, prN}, // So [4] SIGNWRITING AIR BLOW SMALL ROTATIONS..SIGNWRITING BREATH EXHALE + {0x1DA3B, 0x1DA6C, prN}, // Mn [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT + {0x1DA6D, 0x1DA74, prN}, // So [8] SIGNWRITING SHOULDER HIP SPINE..SIGNWRITING TORSO-FLOORPLANE TWISTING + {0x1DA75, 0x1DA75, prN}, // Mn SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS + {0x1DA76, 0x1DA83, prN}, // So [14] SIGNWRITING LIMB COMBINATION..SIGNWRITING LOCATION DEPTH + {0x1DA84, 0x1DA84, prN}, // Mn SIGNWRITING LOCATION HEAD NECK + {0x1DA85, 0x1DA86, prN}, // So [2] SIGNWRITING LOCATION TORSO..SIGNWRITING LOCATION LIMBS DIGITS + {0x1DA87, 0x1DA8B, prN}, // Po [5] SIGNWRITING COMMA..SIGNWRITING PARENTHESIS + {0x1DA9B, 0x1DA9F, prN}, // Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 + {0x1DAA1, 0x1DAAF, prN}, // Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 + {0x1DF00, 0x1DF09, prN}, // Ll [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK + {0x1DF0A, 0x1DF0A, prN}, // Lo LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK + {0x1DF0B, 0x1DF1E, prN}, // Ll [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL + {0x1E000, 0x1E006, prN}, // Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE + {0x1E008, 0x1E018, prN}, // Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU + {0x1E01B, 0x1E021, prN}, // Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI + {0x1E023, 0x1E024, prN}, // Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS + {0x1E026, 0x1E02A, prN}, // Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA + {0x1E100, 0x1E12C, prN}, // Lo [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W + {0x1E130, 0x1E136, prN}, // Mn [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D + {0x1E137, 0x1E13D, prN}, // Lm [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER + {0x1E140, 0x1E149, prN}, // Nd [10] NYIAKENG PUACHUE HMONG DIGIT ZERO..NYIAKENG PUACHUE HMONG DIGIT NINE + {0x1E14E, 0x1E14E, prN}, // Lo NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ + {0x1E14F, 0x1E14F, prN}, // So NYIAKENG PUACHUE HMONG CIRCLED CA + {0x1E290, 0x1E2AD, prN}, // Lo [30] TOTO LETTER PA..TOTO LETTER A + {0x1E2AE, 0x1E2AE, prN}, // Mn TOTO SIGN RISING TONE + {0x1E2C0, 0x1E2EB, prN}, // Lo [44] WANCHO LETTER AA..WANCHO LETTER YIH + {0x1E2EC, 0x1E2EF, prN}, // Mn [4] WANCHO TONE TUP..WANCHO TONE KOINI + {0x1E2F0, 0x1E2F9, prN}, // Nd [10] WANCHO DIGIT ZERO..WANCHO DIGIT NINE + {0x1E2FF, 0x1E2FF, prN}, // Sc WANCHO NGUN SIGN + {0x1E7E0, 0x1E7E6, prN}, // Lo [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO + {0x1E7E8, 0x1E7EB, prN}, // Lo [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE + {0x1E7ED, 0x1E7EE, prN}, // Lo [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE + {0x1E7F0, 0x1E7FE, prN}, // Lo [15] ETHIOPIC SYLLABLE GURAGE QWI..ETHIOPIC SYLLABLE GURAGE PWEE + {0x1E800, 0x1E8C4, prN}, // Lo [197] MENDE KIKAKUI SYLLABLE M001 KI..MENDE KIKAKUI SYLLABLE M060 NYON + {0x1E8C7, 0x1E8CF, prN}, // No [9] MENDE KIKAKUI DIGIT ONE..MENDE KIKAKUI DIGIT NINE + {0x1E8D0, 0x1E8D6, prN}, // Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS + {0x1E900, 0x1E943, prN}, // L& [68] ADLAM CAPITAL LETTER ALIF..ADLAM SMALL LETTER SHA + {0x1E944, 0x1E94A, prN}, // Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA + {0x1E94B, 0x1E94B, prN}, // Lm ADLAM NASALIZATION MARK + {0x1E950, 0x1E959, prN}, // Nd [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE + {0x1E95E, 0x1E95F, prN}, // Po [2] ADLAM INITIAL EXCLAMATION MARK..ADLAM INITIAL QUESTION MARK + {0x1EC71, 0x1ECAB, prN}, // No [59] INDIC SIYAQ NUMBER ONE..INDIC SIYAQ NUMBER PREFIXED NINE + {0x1ECAC, 0x1ECAC, prN}, // So INDIC SIYAQ PLACEHOLDER + {0x1ECAD, 0x1ECAF, prN}, // No [3] INDIC SIYAQ FRACTION ONE QUARTER..INDIC SIYAQ FRACTION THREE QUARTERS + {0x1ECB0, 0x1ECB0, prN}, // Sc INDIC SIYAQ RUPEE MARK + {0x1ECB1, 0x1ECB4, prN}, // No [4] INDIC SIYAQ NUMBER ALTERNATE ONE..INDIC SIYAQ ALTERNATE LAKH MARK + {0x1ED01, 0x1ED2D, prN}, // No [45] OTTOMAN SIYAQ NUMBER ONE..OTTOMAN SIYAQ NUMBER NINETY THOUSAND + {0x1ED2E, 0x1ED2E, prN}, // So OTTOMAN SIYAQ MARRATAN + {0x1ED2F, 0x1ED3D, prN}, // No [15] OTTOMAN SIYAQ ALTERNATE NUMBER TWO..OTTOMAN SIYAQ FRACTION ONE SIXTH + {0x1EE00, 0x1EE03, prN}, // Lo [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL + {0x1EE05, 0x1EE1F, prN}, // Lo [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF + {0x1EE21, 0x1EE22, prN}, // Lo [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM + {0x1EE24, 0x1EE24, prN}, // Lo ARABIC MATHEMATICAL INITIAL HEH + {0x1EE27, 0x1EE27, prN}, // Lo ARABIC MATHEMATICAL INITIAL HAH + {0x1EE29, 0x1EE32, prN}, // Lo [10] ARABIC MATHEMATICAL INITIAL YEH..ARABIC MATHEMATICAL INITIAL QAF + {0x1EE34, 0x1EE37, prN}, // Lo [4] ARABIC MATHEMATICAL INITIAL SHEEN..ARABIC MATHEMATICAL INITIAL KHAH + {0x1EE39, 0x1EE39, prN}, // Lo ARABIC MATHEMATICAL INITIAL DAD + {0x1EE3B, 0x1EE3B, prN}, // Lo ARABIC MATHEMATICAL INITIAL GHAIN + {0x1EE42, 0x1EE42, prN}, // Lo ARABIC MATHEMATICAL TAILED JEEM + {0x1EE47, 0x1EE47, prN}, // Lo ARABIC MATHEMATICAL TAILED HAH + {0x1EE49, 0x1EE49, prN}, // Lo ARABIC MATHEMATICAL TAILED YEH + {0x1EE4B, 0x1EE4B, prN}, // Lo ARABIC MATHEMATICAL TAILED LAM + {0x1EE4D, 0x1EE4F, prN}, // Lo [3] ARABIC MATHEMATICAL TAILED NOON..ARABIC MATHEMATICAL TAILED AIN + {0x1EE51, 0x1EE52, prN}, // Lo [2] ARABIC MATHEMATICAL TAILED SAD..ARABIC MATHEMATICAL TAILED QAF + {0x1EE54, 0x1EE54, prN}, // Lo ARABIC MATHEMATICAL TAILED SHEEN + {0x1EE57, 0x1EE57, prN}, // Lo ARABIC MATHEMATICAL TAILED KHAH + {0x1EE59, 0x1EE59, prN}, // Lo ARABIC MATHEMATICAL TAILED DAD + {0x1EE5B, 0x1EE5B, prN}, // Lo ARABIC MATHEMATICAL TAILED GHAIN + {0x1EE5D, 0x1EE5D, prN}, // Lo ARABIC MATHEMATICAL TAILED DOTLESS NOON + {0x1EE5F, 0x1EE5F, prN}, // Lo ARABIC MATHEMATICAL TAILED DOTLESS QAF + {0x1EE61, 0x1EE62, prN}, // Lo [2] ARABIC MATHEMATICAL STRETCHED BEH..ARABIC MATHEMATICAL STRETCHED JEEM + {0x1EE64, 0x1EE64, prN}, // Lo ARABIC MATHEMATICAL STRETCHED HEH + {0x1EE67, 0x1EE6A, prN}, // Lo [4] ARABIC MATHEMATICAL STRETCHED HAH..ARABIC MATHEMATICAL STRETCHED KAF + {0x1EE6C, 0x1EE72, prN}, // Lo [7] ARABIC MATHEMATICAL STRETCHED MEEM..ARABIC MATHEMATICAL STRETCHED QAF + {0x1EE74, 0x1EE77, prN}, // Lo [4] ARABIC MATHEMATICAL STRETCHED SHEEN..ARABIC MATHEMATICAL STRETCHED KHAH + {0x1EE79, 0x1EE7C, prN}, // Lo [4] ARABIC MATHEMATICAL STRETCHED DAD..ARABIC MATHEMATICAL STRETCHED DOTLESS BEH + {0x1EE7E, 0x1EE7E, prN}, // Lo ARABIC MATHEMATICAL STRETCHED DOTLESS FEH + {0x1EE80, 0x1EE89, prN}, // Lo [10] ARABIC MATHEMATICAL LOOPED ALEF..ARABIC MATHEMATICAL LOOPED YEH + {0x1EE8B, 0x1EE9B, prN}, // Lo [17] ARABIC MATHEMATICAL LOOPED LAM..ARABIC MATHEMATICAL LOOPED GHAIN + {0x1EEA1, 0x1EEA3, prN}, // Lo [3] ARABIC MATHEMATICAL DOUBLE-STRUCK BEH..ARABIC MATHEMATICAL DOUBLE-STRUCK DAL + {0x1EEA5, 0x1EEA9, prN}, // Lo [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH + {0x1EEAB, 0x1EEBB, prN}, // Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN + {0x1EEF0, 0x1EEF1, prN}, // Sm [2] ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL..ARABIC MATHEMATICAL OPERATOR HAH WITH DAL + {0x1F000, 0x1F003, prN}, // So [4] MAHJONG TILE EAST WIND..MAHJONG TILE NORTH WIND + {0x1F004, 0x1F004, prW}, // So MAHJONG TILE RED DRAGON + {0x1F005, 0x1F02B, prN}, // So [39] MAHJONG TILE GREEN DRAGON..MAHJONG TILE BACK + {0x1F030, 0x1F093, prN}, // So [100] DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06 + {0x1F0A0, 0x1F0AE, prN}, // So [15] PLAYING CARD BACK..PLAYING CARD KING OF SPADES + {0x1F0B1, 0x1F0BF, prN}, // So [15] PLAYING CARD ACE OF HEARTS..PLAYING CARD RED JOKER + {0x1F0C1, 0x1F0CE, prN}, // So [14] PLAYING CARD ACE OF DIAMONDS..PLAYING CARD KING OF DIAMONDS + {0x1F0CF, 0x1F0CF, prW}, // So PLAYING CARD BLACK JOKER + {0x1F0D1, 0x1F0F5, prN}, // So [37] PLAYING CARD ACE OF CLUBS..PLAYING CARD TRUMP-21 + {0x1F100, 0x1F10A, prA}, // No [11] DIGIT ZERO FULL STOP..DIGIT NINE COMMA + {0x1F10B, 0x1F10C, prN}, // No [2] DINGBAT CIRCLED SANS-SERIF DIGIT ZERO..DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO + {0x1F10D, 0x1F10F, prN}, // So [3] CIRCLED ZERO WITH SLASH..CIRCLED DOLLAR SIGN WITH OVERLAID BACKSLASH + {0x1F110, 0x1F12D, prA}, // So [30] PARENTHESIZED LATIN CAPITAL LETTER A..CIRCLED CD + {0x1F12E, 0x1F12F, prN}, // So [2] CIRCLED WZ..COPYLEFT SYMBOL + {0x1F130, 0x1F169, prA}, // So [58] SQUARED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z + {0x1F16A, 0x1F16F, prN}, // So [6] RAISED MC SIGN..CIRCLED HUMAN FIGURE + {0x1F170, 0x1F18D, prA}, // So [30] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED SA + {0x1F18E, 0x1F18E, prW}, // So NEGATIVE SQUARED AB + {0x1F18F, 0x1F190, prA}, // So [2] NEGATIVE SQUARED WC..SQUARE DJ + {0x1F191, 0x1F19A, prW}, // So [10] SQUARED CL..SQUARED VS + {0x1F19B, 0x1F1AC, prA}, // So [18] SQUARED THREE D..SQUARED VOD + {0x1F1AD, 0x1F1AD, prN}, // So MASK WORK SYMBOL + {0x1F1E6, 0x1F1FF, prN}, // So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z + {0x1F200, 0x1F202, prW}, // So [3] SQUARE HIRAGANA HOKA..SQUARED KATAKANA SA + {0x1F210, 0x1F23B, prW}, // So [44] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-914D + {0x1F240, 0x1F248, prW}, // So [9] TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C..TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 + {0x1F250, 0x1F251, prW}, // So [2] CIRCLED IDEOGRAPH ADVANTAGE..CIRCLED IDEOGRAPH ACCEPT + {0x1F260, 0x1F265, prW}, // So [6] ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI + {0x1F300, 0x1F320, prW}, // So [33] CYCLONE..SHOOTING STAR + {0x1F321, 0x1F32C, prN}, // So [12] THERMOMETER..WIND BLOWING FACE + {0x1F32D, 0x1F335, prW}, // So [9] HOT DOG..CACTUS + {0x1F336, 0x1F336, prN}, // So HOT PEPPER + {0x1F337, 0x1F37C, prW}, // So [70] TULIP..BABY BOTTLE + {0x1F37D, 0x1F37D, prN}, // So FORK AND KNIFE WITH PLATE + {0x1F37E, 0x1F393, prW}, // So [22] BOTTLE WITH POPPING CORK..GRADUATION CAP + {0x1F394, 0x1F39F, prN}, // So [12] HEART WITH TIP ON THE LEFT..ADMISSION TICKETS + {0x1F3A0, 0x1F3CA, prW}, // So [43] CAROUSEL HORSE..SWIMMER + {0x1F3CB, 0x1F3CE, prN}, // So [4] WEIGHT LIFTER..RACING CAR + {0x1F3CF, 0x1F3D3, prW}, // So [5] CRICKET BAT AND BALL..TABLE TENNIS PADDLE AND BALL + {0x1F3D4, 0x1F3DF, prN}, // So [12] SNOW CAPPED MOUNTAIN..STADIUM + {0x1F3E0, 0x1F3F0, prW}, // So [17] HOUSE BUILDING..EUROPEAN CASTLE + {0x1F3F1, 0x1F3F3, prN}, // So [3] WHITE PENNANT..WAVING WHITE FLAG + {0x1F3F4, 0x1F3F4, prW}, // So WAVING BLACK FLAG + {0x1F3F5, 0x1F3F7, prN}, // So [3] ROSETTE..LABEL + {0x1F3F8, 0x1F3FA, prW}, // So [3] BADMINTON RACQUET AND SHUTTLECOCK..AMPHORA + {0x1F3FB, 0x1F3FF, prW}, // Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 + {0x1F400, 0x1F43E, prW}, // So [63] RAT..PAW PRINTS + {0x1F43F, 0x1F43F, prN}, // So CHIPMUNK + {0x1F440, 0x1F440, prW}, // So EYES + {0x1F441, 0x1F441, prN}, // So EYE + {0x1F442, 0x1F4FC, prW}, // So [187] EAR..VIDEOCASSETTE + {0x1F4FD, 0x1F4FE, prN}, // So [2] FILM PROJECTOR..PORTABLE STEREO + {0x1F4FF, 0x1F53D, prW}, // So [63] PRAYER BEADS..DOWN-POINTING SMALL RED TRIANGLE + {0x1F53E, 0x1F54A, prN}, // So [13] LOWER RIGHT SHADOWED WHITE CIRCLE..DOVE OF PEACE + {0x1F54B, 0x1F54E, prW}, // So [4] KAABA..MENORAH WITH NINE BRANCHES + {0x1F54F, 0x1F54F, prN}, // So BOWL OF HYGIEIA + {0x1F550, 0x1F567, prW}, // So [24] CLOCK FACE ONE OCLOCK..CLOCK FACE TWELVE-THIRTY + {0x1F568, 0x1F579, prN}, // So [18] RIGHT SPEAKER..JOYSTICK + {0x1F57A, 0x1F57A, prW}, // So MAN DANCING + {0x1F57B, 0x1F594, prN}, // So [26] LEFT HAND TELEPHONE RECEIVER..REVERSED VICTORY HAND + {0x1F595, 0x1F596, prW}, // So [2] REVERSED HAND WITH MIDDLE FINGER EXTENDED..RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS + {0x1F597, 0x1F5A3, prN}, // So [13] WHITE DOWN POINTING LEFT HAND INDEX..BLACK DOWN POINTING BACKHAND INDEX + {0x1F5A4, 0x1F5A4, prW}, // So BLACK HEART + {0x1F5A5, 0x1F5FA, prN}, // So [86] DESKTOP COMPUTER..WORLD MAP + {0x1F5FB, 0x1F5FF, prW}, // So [5] MOUNT FUJI..MOYAI + {0x1F600, 0x1F64F, prW}, // So [80] GRINNING FACE..PERSON WITH FOLDED HANDS + {0x1F650, 0x1F67F, prN}, // So [48] NORTH WEST POINTING LEAF..REVERSE CHECKER BOARD + {0x1F680, 0x1F6C5, prW}, // So [70] ROCKET..LEFT LUGGAGE + {0x1F6C6, 0x1F6CB, prN}, // So [6] TRIANGLE WITH ROUNDED CORNERS..COUCH AND LAMP + {0x1F6CC, 0x1F6CC, prW}, // So SLEEPING ACCOMMODATION + {0x1F6CD, 0x1F6CF, prN}, // So [3] SHOPPING BAGS..BED + {0x1F6D0, 0x1F6D2, prW}, // So [3] PLACE OF WORSHIP..SHOPPING TROLLEY + {0x1F6D3, 0x1F6D4, prN}, // So [2] STUPA..PAGODA + {0x1F6D5, 0x1F6D7, prW}, // So [3] HINDU TEMPLE..ELEVATOR + {0x1F6DD, 0x1F6DF, prW}, // So [3] PLAYGROUND SLIDE..RING BUOY + {0x1F6E0, 0x1F6EA, prN}, // So [11] HAMMER AND WRENCH..NORTHEAST-POINTING AIRPLANE + {0x1F6EB, 0x1F6EC, prW}, // So [2] AIRPLANE DEPARTURE..AIRPLANE ARRIVING + {0x1F6F0, 0x1F6F3, prN}, // So [4] SATELLITE..PASSENGER SHIP + {0x1F6F4, 0x1F6FC, prW}, // So [9] SCOOTER..ROLLER SKATE + {0x1F700, 0x1F773, prN}, // So [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE + {0x1F780, 0x1F7D8, prN}, // So [89] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..NEGATIVE CIRCLED SQUARE + {0x1F7E0, 0x1F7EB, prW}, // So [12] LARGE ORANGE CIRCLE..LARGE BROWN SQUARE + {0x1F7F0, 0x1F7F0, prW}, // So HEAVY EQUALS SIGN + {0x1F800, 0x1F80B, prN}, // So [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD + {0x1F810, 0x1F847, prN}, // So [56] LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD..DOWNWARDS HEAVY ARROW + {0x1F850, 0x1F859, prN}, // So [10] LEFTWARDS SANS-SERIF ARROW..UP DOWN SANS-SERIF ARROW + {0x1F860, 0x1F887, prN}, // So [40] WIDE-HEADED LEFTWARDS LIGHT BARB ARROW..WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW + {0x1F890, 0x1F8AD, prN}, // So [30] LEFTWARDS TRIANGLE ARROWHEAD..WHITE ARROW SHAFT WIDTH TWO THIRDS + {0x1F8B0, 0x1F8B1, prN}, // So [2] ARROW POINTING UPWARDS THEN NORTH WEST..ARROW POINTING RIGHTWARDS THEN CURVING SOUTH WEST + {0x1F900, 0x1F90B, prN}, // So [12] CIRCLED CROSS FORMEE WITH FOUR DOTS..DOWNWARD FACING NOTCHED HOOK WITH DOT + {0x1F90C, 0x1F93A, prW}, // So [47] PINCHED FINGERS..FENCER + {0x1F93B, 0x1F93B, prN}, // So MODERN PENTATHLON + {0x1F93C, 0x1F945, prW}, // So [10] WRESTLERS..GOAL NET + {0x1F946, 0x1F946, prN}, // So RIFLE + {0x1F947, 0x1F9FF, prW}, // So [185] FIRST PLACE MEDAL..NAZAR AMULET + {0x1FA00, 0x1FA53, prN}, // So [84] NEUTRAL CHESS KING..BLACK CHESS KNIGHT-BISHOP + {0x1FA60, 0x1FA6D, prN}, // So [14] XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER + {0x1FA70, 0x1FA74, prW}, // So [5] BALLET SHOES..THONG SANDAL + {0x1FA78, 0x1FA7C, prW}, // So [5] DROP OF BLOOD..CRUTCH + {0x1FA80, 0x1FA86, prW}, // So [7] YO-YO..NESTING DOLLS + {0x1FA90, 0x1FAAC, prW}, // So [29] RINGED PLANET..HAMSA + {0x1FAB0, 0x1FABA, prW}, // So [11] FLY..NEST WITH EGGS + {0x1FAC0, 0x1FAC5, prW}, // So [6] ANATOMICAL HEART..PERSON WITH CROWN + {0x1FAD0, 0x1FAD9, prW}, // So [10] BLUEBERRIES..JAR + {0x1FAE0, 0x1FAE7, prW}, // So [8] MELTING FACE..BUBBLES + {0x1FAF0, 0x1FAF6, prW}, // So [7] HAND WITH INDEX FINGER AND THUMB CROSSED..HEART HANDS + {0x1FB00, 0x1FB92, prN}, // So [147] BLOCK SEXTANT-1..UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK + {0x1FB94, 0x1FBCA, prN}, // So [55] LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK..WHITE UP-POINTING CHEVRON + {0x1FBF0, 0x1FBF9, prN}, // Nd [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE + {0x20000, 0x2A6DF, prW}, // Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF + {0x2A6E0, 0x2A6FF, prW}, // Cn [32] .. + {0x2A700, 0x2B738, prW}, // Lo [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738 + {0x2B739, 0x2B73F, prW}, // Cn [7] .. + {0x2B740, 0x2B81D, prW}, // Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D + {0x2B81E, 0x2B81F, prW}, // Cn [2] .. + {0x2B820, 0x2CEA1, prW}, // Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 + {0x2CEA2, 0x2CEAF, prW}, // Cn [14] .. + {0x2CEB0, 0x2EBE0, prW}, // Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 + {0x2EBE1, 0x2F7FF, prW}, // Cn [3103] .. + {0x2F800, 0x2FA1D, prW}, // Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D + {0x2FA1E, 0x2FA1F, prW}, // Cn [2] .. + {0x2FA20, 0x2FFFD, prW}, // Cn [1502] .. + {0x30000, 0x3134A, prW}, // Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A + {0x3134B, 0x3FFFD, prW}, // Cn [60595] .. + {0xE0001, 0xE0001, prN}, // Cf LANGUAGE TAG + {0xE0020, 0xE007F, prN}, // Cf [96] TAG SPACE..CANCEL TAG + {0xE0100, 0xE01EF, prA}, // Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 + {0xF0000, 0xFFFFD, prA}, // Co [65534] .. + {0x100000, 0x10FFFD, prA}, // Co [65534] .. +} diff --git a/vendor/github.com/rivo/uniseg/gen_breaktest.go b/vendor/github.com/rivo/uniseg/gen_breaktest.go new file mode 100644 index 000000000..e613c4cd0 --- /dev/null +++ b/vendor/github.com/rivo/uniseg/gen_breaktest.go @@ -0,0 +1,213 @@ +//go:build generate + +// This program generates a Go containing a slice of test cases based on the +// Unicode Character Database auxiliary data files. The command line arguments +// are as follows: +// +// 1. The name of the Unicode data file (just the filename, without extension). +// 2. The name of the locally generated Go file. +// 3. The name of the slice containing the test cases. +// 4. The name of the generator, for logging purposes. +// +//go:generate go run gen_breaktest.go GraphemeBreakTest graphemebreak_test.go graphemeBreakTestCases graphemes +//go:generate go run gen_breaktest.go WordBreakTest wordbreak_test.go wordBreakTestCases words +//go:generate go run gen_breaktest.go SentenceBreakTest sentencebreak_test.go sentenceBreakTestCases sentences +//go:generate go run gen_breaktest.go LineBreakTest linebreak_test.go lineBreakTestCases lines + +package main + +import ( + "bufio" + "bytes" + "errors" + "fmt" + "go/format" + "io/ioutil" + "log" + "net/http" + "os" + "time" +) + +// We want to test against a specific version rather than the latest. When the +// package is upgraded to a new version, change these to generate new tests. +const ( + testCaseURL = `https://www.unicode.org/Public/14.0.0/ucd/auxiliary/%s.txt` +) + +func main() { + if len(os.Args) < 5 { + fmt.Println("Not enough arguments, see code for details") + os.Exit(1) + } + + log.SetPrefix("gen_breaktest (" + os.Args[4] + "): ") + log.SetFlags(0) + + // Read text of testcases and parse into Go source code. + src, err := parse(fmt.Sprintf(testCaseURL, os.Args[1])) + if err != nil { + log.Fatal(err) + } + + // Format the Go code. + formatted, err := format.Source(src) + if err != nil { + log.Fatalln("gofmt:", err) + } + + // Write it out. + log.Print("Writing to ", os.Args[2]) + if err := ioutil.WriteFile(os.Args[2], formatted, 0644); err != nil { + log.Fatal(err) + } +} + +// parse reads a break text file, either from a local file or from a URL. It +// parses the file data into Go source code representing the test cases. +func parse(url string) ([]byte, error) { + log.Printf("Parsing %s", url) + res, err := http.Get(url) + if err != nil { + return nil, err + } + body := res.Body + defer body.Close() + + buf := new(bytes.Buffer) + buf.Grow(120 << 10) + buf.WriteString(`package uniseg + +// Code generated via go generate from gen_breaktest.go. DO NOT EDIT. + +// ` + os.Args[3] + ` are Grapheme testcases taken from +// ` + url + ` +// on ` + time.Now().Format("January 2, 2006") + `. See +// https://www.unicode.org/license.html for the Unicode license agreement. +var ` + os.Args[3] + ` = []testCase { +`) + + sc := bufio.NewScanner(body) + num := 1 + var line []byte + original := make([]byte, 0, 64) + expected := make([]byte, 0, 64) + for sc.Scan() { + num++ + line = sc.Bytes() + if len(line) == 0 || line[0] == '#' { + continue + } + var comment []byte + if i := bytes.IndexByte(line, '#'); i >= 0 { + comment = bytes.TrimSpace(line[i+1:]) + line = bytes.TrimSpace(line[:i]) + } + original, expected, err := parseRuneSequence(line, original[:0], expected[:0]) + if err != nil { + return nil, fmt.Errorf(`line %d: %v: %q`, num, err, line) + } + fmt.Fprintf(buf, "\t{original: \"%s\", expected: %s}, // %s\n", original, expected, comment) + } + if err := sc.Err(); err != nil { + return nil, err + } + + // Check for final "# EOF", useful check if we're streaming via HTTP + if !bytes.Equal(line, []byte("# EOF")) { + return nil, fmt.Errorf(`line %d: exected "# EOF" as final line, got %q`, num, line) + } + buf.WriteString("}\n") + return buf.Bytes(), nil +} + +// Used by parseRuneSequence to match input via bytes.HasPrefix. +var ( + prefixBreak = []byte("Ă· ") + prefixDontBreak = []byte("Ă— ") + breakOk = []byte("Ă·") + breakNo = []byte("Ă—") +) + +// parseRuneSequence parses a rune + breaking opportunity sequence from b +// and appends the Go code for testcase.original to orig +// and appends the Go code for testcase.expected to exp. +// It retuns the new orig and exp slices. +// +// E.g. for the input b="Ă· 0020 Ă— 0308 Ă· 1F1E6 Ă·" +// it will append +// "\u0020\u0308\U0001F1E6" +// and "[][]rune{{0x0020,0x0308},{0x1F1E6},}" +// to orig and exp respectively. +// +// The formatting of exp is expected to be cleaned up by gofmt or format.Source. +// Note we explicitly require the sequence to start with Ă· and we implicitly +// require it to end with Ă·. +func parseRuneSequence(b, orig, exp []byte) ([]byte, []byte, error) { + // Check for and remove first Ă· or Ă—. + if !bytes.HasPrefix(b, prefixBreak) && !bytes.HasPrefix(b, prefixDontBreak) { + return nil, nil, errors.New("expected Ă· or Ă— as first character") + } + if bytes.HasPrefix(b, prefixBreak) { + b = b[len(prefixBreak):] + } else { + b = b[len(prefixDontBreak):] + } + + boundary := true + exp = append(exp, "[][]rune{"...) + for len(b) > 0 { + if boundary { + exp = append(exp, '{') + } + exp = append(exp, "0x"...) + // Find end of hex digits. + var i int + for i = 0; i < len(b) && b[i] != ' '; i++ { + if d := b[i]; ('0' <= d || d <= '9') || + ('A' <= d || d <= 'F') || + ('a' <= d || d <= 'f') { + continue + } + return nil, nil, errors.New("bad hex digit") + } + switch i { + case 4: + orig = append(orig, "\\u"...) + case 5: + orig = append(orig, "\\U000"...) + default: + return nil, nil, errors.New("unsupport code point hex length") + } + orig = append(orig, b[:i]...) + exp = append(exp, b[:i]...) + b = b[i:] + + // Check for space between hex and Ă· or Ă—. + if len(b) < 1 || b[0] != ' ' { + return nil, nil, errors.New("bad input") + } + b = b[1:] + + // Check for next boundary. + switch { + case bytes.HasPrefix(b, breakOk): + boundary = true + b = b[len(breakOk):] + case bytes.HasPrefix(b, breakNo): + boundary = false + b = b[len(breakNo):] + default: + return nil, nil, errors.New("missing Ă· or Ă—") + } + if boundary { + exp = append(exp, '}') + } + exp = append(exp, ',') + if len(b) > 0 && b[0] == ' ' { + b = b[1:] + } + } + exp = append(exp, '}') + return orig, exp, nil +} diff --git a/vendor/github.com/rivo/uniseg/gen_properties.go b/vendor/github.com/rivo/uniseg/gen_properties.go new file mode 100644 index 000000000..64512709e --- /dev/null +++ b/vendor/github.com/rivo/uniseg/gen_properties.go @@ -0,0 +1,240 @@ +//go:build generate + +// This program generates a property file in Go file from Unicode Character +// Database auxiliary data files. The command line arguments are as follows: +// +// 1. The name of the Unicode data file (just the filename, without extension). +// 2. The name of the locally generated Go file. +// 3. The name of the slice mapping code points to properties. +// 4. The name of the generator, for logging purposes. +// 5. (Optional) Flags, comma-separated. The following flags are available: +// - "emojis": include emoji properties (Extended Pictographic only). +// - "gencat": include general category properties. +// +//go:generate go run gen_properties.go auxiliary/GraphemeBreakProperty graphemeproperties.go graphemeCodePoints graphemes emojis +//go:generate go run gen_properties.go auxiliary/WordBreakProperty wordproperties.go workBreakCodePoints words emojis +//go:generate go run gen_properties.go auxiliary/SentenceBreakProperty sentenceproperties.go sentenceBreakCodePoints sentences +//go:generate go run gen_properties.go LineBreak lineproperties.go lineBreakCodePoints lines gencat +//go:generate go run gen_properties.go EastAsianWidth eastasianwidth.go eastAsianWidth eastasianwidth +package main + +import ( + "bufio" + "bytes" + "errors" + "fmt" + "go/format" + "io/ioutil" + "log" + "net/http" + "os" + "regexp" + "sort" + "strconv" + "strings" + "time" +) + +// We want to test against a specific version rather than the latest. When the +// package is upgraded to a new version, change these to generate new tests. +const ( + gbpURL = `https://www.unicode.org/Public/14.0.0/ucd/%s.txt` + emojiURL = `https://unicode.org/Public/14.0.0/ucd/emoji/emoji-data.txt` +) + +// The regular expression for a line containing a code point range property. +var propertyPattern = regexp.MustCompile(`^([0-9A-F]{4,6})(\.\.([0-9A-F]{4,6}))?\s*;\s*([A-Za-z0-9_]+)\s*#\s(.+)$`) + +func main() { + if len(os.Args) < 5 { + fmt.Println("Not enough arguments, see code for details") + os.Exit(1) + } + + log.SetPrefix("gen_properties (" + os.Args[4] + "): ") + log.SetFlags(0) + + // Parse flags. + flags := make(map[string]struct{}) + if len(os.Args) >= 6 { + for _, flag := range strings.Split(os.Args[5], ",") { + flags[flag] = struct{}{} + } + } + + // Parse the text file and generate Go source code from it. + var emojis string + if _, ok := flags["emojis"]; ok { + emojis = emojiURL + } + _, includeGeneralCategory := flags["gencat"] + src, err := parse(fmt.Sprintf(gbpURL, os.Args[1]), emojis, includeGeneralCategory) + if err != nil { + log.Fatal(err) + } + + // Format the Go code. + formatted, err := format.Source([]byte(src)) + if err != nil { + log.Fatal("gofmt:", err) + } + + // Save it to the (local) target file. + log.Print("Writing to ", os.Args[2]) + if err := ioutil.WriteFile(os.Args[2], formatted, 0644); err != nil { + log.Fatal(err) + } +} + +// parse parses the Unicode Properties text files located at the given URLs and +// returns their equivalent Go source code to be used in the uniseg package. If +// "emojiURL" is an empty string, no emoji code points will be included. If +// "includeGeneralCategory" is true, the Unicode General Category property will +// be extracted from the comments and included in the output. +func parse(gbpURL, emojiURL string, includeGeneralCategory bool) (string, error) { + // Temporary buffer to hold properties. + var properties [][4]string + + // Open the first URL. + log.Printf("Parsing %s", gbpURL) + res, err := http.Get(gbpURL) + if err != nil { + return "", err + } + in1 := res.Body + defer in1.Close() + + // Parse it. + scanner := bufio.NewScanner(in1) + num := 0 + for scanner.Scan() { + num++ + line := strings.TrimSpace(scanner.Text()) + + // Skip comments and empty lines. + if strings.HasPrefix(line, "#") || line == "" { + continue + } + + // Everything else must be a code point range, a property and a comment. + from, to, property, comment, err := parseProperty(line) + if err != nil { + return "", fmt.Errorf("%s line %d: %v", os.Args[4], num, err) + } + properties = append(properties, [4]string{from, to, property, comment}) + } + if err := scanner.Err(); err != nil { + return "", err + } + + // Open the second URL. + if emojiURL != "" { + log.Printf("Parsing %s", emojiURL) + res, err = http.Get(emojiURL) + if err != nil { + return "", err + } + in2 := res.Body + defer in2.Close() + + // Parse it. + scanner = bufio.NewScanner(in2) + num = 0 + for scanner.Scan() { + num++ + line := scanner.Text() + + // Skip comments, empty lines, and everything not containing + // "Extended_Pictographic". + if strings.HasPrefix(line, "#") || line == "" || !strings.Contains(line, "Extended_Pictographic") { + continue + } + + // Everything else must be a code point range, a property and a comment. + from, to, property, comment, err := parseProperty(line) + if err != nil { + return "", fmt.Errorf("emojis line %d: %v", num, err) + } + properties = append(properties, [4]string{from, to, property, comment}) + } + if err := scanner.Err(); err != nil { + return "", err + } + } + + // Sort properties. + sort.Slice(properties, func(i, j int) bool { + left, _ := strconv.ParseUint(properties[i][0], 16, 64) + right, _ := strconv.ParseUint(properties[j][0], 16, 64) + return left < right + }) + + // Header. + var ( + buf bytes.Buffer + emojiComment string + ) + columns := 3 + if includeGeneralCategory { + columns = 4 + } + if emojiURL != "" { + emojiComment = ` +// and +// ` + emojiURL + ` +// ("Extended_Pictographic" only)` + } + buf.WriteString(`package uniseg + +// Code generated via go generate from gen_properties.go. DO NOT EDIT. + +// ` + os.Args[3] + ` are taken from +// ` + gbpURL + emojiComment + ` +// on ` + time.Now().Format("January 2, 2006") + `. See https://www.unicode.org/license.html for the Unicode +// license agreement. +var ` + os.Args[3] + ` = [][` + strconv.Itoa(columns) + `]int{ + `) + + // Properties. + for _, prop := range properties { + if includeGeneralCategory { + generalCategory := "gc" + prop[3][:2] + if generalCategory == "gcL&" { + generalCategory = "gcLC" + } + prop[3] = prop[3][3:] + fmt.Fprintf(&buf, "{0x%s,0x%s,%s,%s}, // %s\n", prop[0], prop[1], translateProperty("pr", prop[2]), generalCategory, prop[3]) + } else { + fmt.Fprintf(&buf, "{0x%s,0x%s,%s}, // %s\n", prop[0], prop[1], translateProperty("pr", prop[2]), prop[3]) + } + } + + // Tail. + buf.WriteString("}") + + return buf.String(), nil +} + +// parseProperty parses a line of the Unicode properties text file containing a +// property for a code point range and returns it along with its comment. +func parseProperty(line string) (from, to, property, comment string, err error) { + fields := propertyPattern.FindStringSubmatch(line) + if fields == nil { + err = errors.New("no property found") + return + } + from = fields[1] + to = fields[3] + if to == "" { + to = from + } + property = fields[4] + comment = fields[5] + return +} + +// translateProperty translates a property name as used in the Unicode data file +// to a variable used in the Go code. +func translateProperty(prefix, property string) string { + return prefix + strings.ReplaceAll(property, "_", "") +} diff --git a/vendor/github.com/rivo/uniseg/go.mod b/vendor/github.com/rivo/uniseg/go.mod deleted file mode 100644 index a54280b2d..000000000 --- a/vendor/github.com/rivo/uniseg/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/rivo/uniseg - -go 1.12 diff --git a/vendor/github.com/rivo/uniseg/grapheme.go b/vendor/github.com/rivo/uniseg/grapheme.go index 207157f5e..9aec08685 100644 --- a/vendor/github.com/rivo/uniseg/grapheme.go +++ b/vendor/github.com/rivo/uniseg/grapheme.go @@ -2,267 +2,246 @@ package uniseg import "unicode/utf8" -// The states of the grapheme cluster parser. -const ( - grAny = iota - grCR - grControlLF - grL - grLVV - grLVTT - grPrepend - grExtendedPictographic - grExtendedPictographicZWJ - grRIOdd - grRIEven -) - -// The grapheme cluster parser's breaking instructions. -const ( - grNoBoundary = iota - grBoundary -) - -// The grapheme cluster parser's state transitions. Maps (state, property) to -// (new state, breaking instruction, rule number). The breaking instruction -// always refers to the boundary between the last and next code point. +// Graphemes implements an iterator over Unicode grapheme clusters, or +// user-perceived characters. While iterating, it also provides information +// about word boundaries, sentence boundaries, and line breaks. // -// This map is queried as follows: +// After constructing the class via [NewGraphemes] for a given string "str", +// [Next] is called for every grapheme cluster in a loop until it returns false. +// Inside the loop, information about the grapheme cluster as well as boundary +// information is available via the various methods (see examples below). // -// 1. Find specific state + specific property. Stop if found. -// 2. Find specific state + any property. -// 3. Find any state + specific property. -// 4. If only (2) or (3) (but not both) was found, stop. -// 5. If both (2) and (3) were found, use state and breaking instruction from -// the transition with the lower rule number, prefer (3) if rule numbers -// are equal. Stop. -// 6. Assume grAny and grBoundary. -var grTransitions = map[[2]int][3]int{ - // GB5 - {grAny, prCR}: {grCR, grBoundary, 50}, - {grAny, prLF}: {grControlLF, grBoundary, 50}, - {grAny, prControl}: {grControlLF, grBoundary, 50}, - - // GB4 - {grCR, prAny}: {grAny, grBoundary, 40}, - {grControlLF, prAny}: {grAny, grBoundary, 40}, - - // GB3. - {grCR, prLF}: {grAny, grNoBoundary, 30}, - - // GB6. - {grAny, prL}: {grL, grBoundary, 9990}, - {grL, prL}: {grL, grNoBoundary, 60}, - {grL, prV}: {grLVV, grNoBoundary, 60}, - {grL, prLV}: {grLVV, grNoBoundary, 60}, - {grL, prLVT}: {grLVTT, grNoBoundary, 60}, - - // GB7. - {grAny, prLV}: {grLVV, grBoundary, 9990}, - {grAny, prV}: {grLVV, grBoundary, 9990}, - {grLVV, prV}: {grLVV, grNoBoundary, 70}, - {grLVV, prT}: {grLVTT, grNoBoundary, 70}, - - // GB8. - {grAny, prLVT}: {grLVTT, grBoundary, 9990}, - {grAny, prT}: {grLVTT, grBoundary, 9990}, - {grLVTT, prT}: {grLVTT, grNoBoundary, 80}, - - // GB9. - {grAny, prExtend}: {grAny, grNoBoundary, 90}, - {grAny, prZWJ}: {grAny, grNoBoundary, 90}, - - // GB9a. - {grAny, prSpacingMark}: {grAny, grNoBoundary, 91}, - - // GB9b. - {grAny, prPreprend}: {grPrepend, grBoundary, 9990}, - {grPrepend, prAny}: {grAny, grNoBoundary, 92}, - - // GB11. - {grAny, prExtendedPictographic}: {grExtendedPictographic, grBoundary, 9990}, - {grExtendedPictographic, prExtend}: {grExtendedPictographic, grNoBoundary, 110}, - {grExtendedPictographic, prZWJ}: {grExtendedPictographicZWJ, grNoBoundary, 110}, - {grExtendedPictographicZWJ, prExtendedPictographic}: {grExtendedPictographic, grNoBoundary, 110}, - - // GB12 / GB13. - {grAny, prRegionalIndicator}: {grRIOdd, grBoundary, 9990}, - {grRIOdd, prRegionalIndicator}: {grRIEven, grNoBoundary, 120}, - {grRIEven, prRegionalIndicator}: {grRIOdd, grBoundary, 120}, -} - -// Graphemes implements an iterator over Unicode extended grapheme clusters, -// specified in the Unicode Standard Annex #29. Grapheme clusters correspond to -// "user-perceived characters". These characters often consist of multiple -// code points (e.g. the "woman kissing woman" emoji consists of 8 code points: -// woman + ZWJ + heavy black heart (2 code points) + ZWJ + kiss mark + ZWJ + -// woman) and the rules described in Annex #29 must be applied to group those -// code points into clusters perceived by the user as one character. +// Using this class to iterate over a string is convenient but it is much slower +// than using this package's [Step] or [StepString] functions or any of the +// other specialized functions starting with "First". type Graphemes struct { - // The code points over which this class iterates. - codePoints []rune + // The original string. + original string - // The (byte-based) indices of the code points into the original string plus - // len(original string). Thus, len(indices) = len(codePoints) + 1. - indices []int + // The remaining string to be parsed. + remaining string - // The current grapheme cluster to be returned. These are indices into - // codePoints/indices. If start == end, we either haven't started iterating - // yet (0) or the iteration has already completed (1). - start, end int + // The current grapheme cluster. + cluster string - // The index of the next code point to be parsed. - pos int + // The byte offset of the current grapheme cluster relative to the original + // string. + offset int - // The current state of the code point parser. + // The current boundary information of the Step() parser. + boundaries int + + // The current state of the Step() parser. state int } // NewGraphemes returns a new grapheme cluster iterator. func NewGraphemes(s string) *Graphemes { - l := utf8.RuneCountInString(s) - codePoints := make([]rune, l) - indices := make([]int, l+1) - i := 0 - for pos, r := range s { - codePoints[i] = r - indices[i] = pos - i++ + return &Graphemes{ + original: s, + remaining: s, + state: -1, } - indices[l] = len(s) - g := &Graphemes{ - codePoints: codePoints, - indices: indices, - } - g.Next() // Parse ahead. - return g } // Next advances the iterator by one grapheme cluster and returns false if no // clusters are left. This function must be called before the first cluster is // accessed. func (g *Graphemes) Next() bool { - g.start = g.end - - // The state transition gives us a boundary instruction BEFORE the next code - // point so we always need to stay ahead by one code point. - - // Parse the next code point. - for g.pos <= len(g.codePoints) { - // GB2. - if g.pos == len(g.codePoints) { - g.end = g.pos - g.pos++ - break - } - - // Determine the property of the next character. - nextProperty := property(g.codePoints[g.pos]) - g.pos++ - - // Find the applicable transition. - var boundary bool - transition, ok := grTransitions[[2]int{g.state, nextProperty}] - if ok { - // We have a specific transition. We'll use it. - g.state = transition[0] - boundary = transition[1] == grBoundary - } else { - // No specific transition found. Try the less specific ones. - transAnyProp, okAnyProp := grTransitions[[2]int{g.state, prAny}] - transAnyState, okAnyState := grTransitions[[2]int{grAny, nextProperty}] - if okAnyProp && okAnyState { - // Both apply. We'll use a mix (see comments for grTransitions). - g.state = transAnyState[0] - boundary = transAnyState[1] == grBoundary - if transAnyProp[2] < transAnyState[2] { - g.state = transAnyProp[0] - boundary = transAnyProp[1] == grBoundary - } - } else if okAnyProp { - // We only have a specific state. - g.state = transAnyProp[0] - boundary = transAnyProp[1] == grBoundary - // This branch will probably never be reached because okAnyState will - // always be true given the current transition map. But we keep it here - // for future modifications to the transition map where this may not be - // true anymore. - } else if okAnyState { - // We only have a specific property. - g.state = transAnyState[0] - boundary = transAnyState[1] == grBoundary - } else { - // No known transition. GB999: Any x Any. - g.state = grAny - boundary = true - } - } - - // If we found a cluster boundary, let's stop here. The current cluster will - // be the one that just ended. - if g.pos-1 == 0 /* GB1 */ || boundary { - g.end = g.pos - 1 - break - } + if len(g.remaining) == 0 { + // We're already past the end. + g.state = -2 + g.cluster = "" + return false } - - return g.start != g.end + g.offset += len(g.cluster) + g.cluster, g.remaining, g.boundaries, g.state = StepString(g.remaining, g.state) + return true } // Runes returns a slice of runes (code points) which corresponds to the current -// grapheme cluster. If the iterator is already past the end or Next() has not +// grapheme cluster. If the iterator is already past the end or [Next] has not // yet been called, nil is returned. func (g *Graphemes) Runes() []rune { - if g.start == g.end { + if g.state < 0 { return nil } - return g.codePoints[g.start:g.end] + return []rune(g.cluster) } // Str returns a substring of the original string which corresponds to the -// current grapheme cluster. If the iterator is already past the end or Next() +// current grapheme cluster. If the iterator is already past the end or [Next] // has not yet been called, an empty string is returned. func (g *Graphemes) Str() string { - if g.start == g.end { - return "" - } - return string(g.codePoints[g.start:g.end]) + return g.cluster } // Bytes returns a byte slice which corresponds to the current grapheme cluster. -// If the iterator is already past the end or Next() has not yet been called, +// If the iterator is already past the end or [Next] has not yet been called, // nil is returned. func (g *Graphemes) Bytes() []byte { - if g.start == g.end { + if g.state < 0 { return nil } - return []byte(string(g.codePoints[g.start:g.end])) + return []byte(g.cluster) } // Positions returns the interval of the current grapheme cluster as byte // positions into the original string. The first returned value "from" indexes // the first byte and the second returned value "to" indexes the first byte that // is not included anymore, i.e. str[from:to] is the current grapheme cluster of -// the original string "str". If Next() has not yet been called, both values are +// the original string "str". If [Next] has not yet been called, both values are // 0. If the iterator is already past the end, both values are 1. func (g *Graphemes) Positions() (int, int) { - return g.indices[g.start], g.indices[g.end] + if g.state == -1 { + return 0, 0 + } else if g.state == -2 { + return 1, 1 + } + return g.offset, g.offset + len(g.cluster) +} + +// IsWordBoundary returns true if a word ends after the current grapheme +// cluster. +func (g *Graphemes) IsWordBoundary() bool { + if g.state < 0 { + return true + } + return g.boundaries&MaskWord != 0 +} + +// IsSentenceBoundary returns true if a sentence ends after the current +// grapheme cluster. +func (g *Graphemes) IsSentenceBoundary() bool { + if g.state < 0 { + return true + } + return g.boundaries&MaskSentence != 0 +} + +// LineBreak returns whether the line can be broken after the current grapheme +// cluster. A value of [LineDontBreak] means the line may not be broken, a value +// of [LineMustBreak] means the line must be broken, and a value of +// [LineCanBreak] means the line may or may not be broken. +func (g *Graphemes) LineBreak() int { + if g.state == -1 { + return LineDontBreak + } + if g.state == -2 { + return LineMustBreak + } + return g.boundaries & MaskLine } // Reset puts the iterator into its initial state such that the next call to -// Next() sets it to the first grapheme cluster again. +// [Next] sets it to the first grapheme cluster again. func (g *Graphemes) Reset() { - g.start, g.end, g.pos, g.state = 0, 0, 0, grAny - g.Next() // Parse ahead again. + g.state = -1 + g.offset = 0 + g.cluster = "" + g.remaining = g.original } // GraphemeClusterCount returns the number of user-perceived characters -// (grapheme clusters) for the given string. To calculate this number, it -// iterates through the string using the Graphemes iterator. +// (grapheme clusters) for the given string. func GraphemeClusterCount(s string) (n int) { - g := NewGraphemes(s) - for g.Next() { + state := -1 + for len(s) > 0 { + _, s, _, state = FirstGraphemeClusterInString(s, state) n++ } return } + +// FirstGraphemeCluster returns the first grapheme cluster found in the given +// byte slice according to the rules of Unicode Standard Annex #29, Grapheme +// Cluster Boundaries. This function can be called continuously to extract all +// grapheme clusters from a byte slice, as illustrated in the example below. +// +// If you don't know the current state, for example when calling the function +// for the first time, you must pass -1. For consecutive calls, pass the state +// and rest slice returned by the previous call. +// +// The "rest" slice is the sub-slice of the original byte slice "b" starting +// after the last byte of the identified grapheme cluster. If the length of the +// "rest" slice is 0, the entire byte slice "b" has been processed. The +// "cluster" byte slice is the sub-slice of the input slice containing the +// identified grapheme cluster. +// +// Given an empty byte slice "b", the function returns nil values. +// +// While slightly less convenient than using the Graphemes class, this function +// has much better performance and makes no allocations. It lends itself well to +// large byte slices. +// +// The "reserved" return value is a placeholder for future functionality and may +// be ignored for the time being. +func FirstGraphemeCluster(b []byte, state int) (cluster, rest []byte, reserved, newState int) { + // An empty byte slice returns nothing. + if len(b) == 0 { + return + } + + // Extract the first rune. + r, length := utf8.DecodeRune(b) + if len(b) <= length { // If we're already past the end, there is nothing else to parse. + return b, nil, 0, grAny + } + + // If we don't know the state, determine it now. + if state < 0 { + state, _ = transitionGraphemeState(state, r) + } + + // Transition until we find a boundary. + var boundary bool + for { + r, l := utf8.DecodeRune(b[length:]) + state, boundary = transitionGraphemeState(state, r) + + if boundary { + return b[:length], b[length:], 0, state + } + + length += l + if len(b) <= length { + return b, nil, 0, grAny + } + } +} + +// FirstGraphemeClusterInString is like [FirstGraphemeCluster] but its input and +// outputs are strings. +func FirstGraphemeClusterInString(str string, state int) (cluster, rest string, reserved, newState int) { + // An empty string returns nothing. + if len(str) == 0 { + return + } + + // Extract the first rune. + r, length := utf8.DecodeRuneInString(str) + if len(str) <= length { // If we're already past the end, there is nothing else to parse. + return str, "", 0, grAny + } + + // If we don't know the state, determine it now. + if state < 0 { + state, _ = transitionGraphemeState(state, r) + } + + // Transition until we find a boundary. + var boundary bool + for { + r, l := utf8.DecodeRuneInString(str[length:]) + state, boundary = transitionGraphemeState(state, r) + + if boundary { + return str[:length], str[length:], 0, state + } + + length += l + if len(str) <= length { + return str, "", 0, grAny + } + } +} diff --git a/vendor/github.com/rivo/uniseg/graphemeproperties.go b/vendor/github.com/rivo/uniseg/graphemeproperties.go new file mode 100644 index 000000000..a0c001689 --- /dev/null +++ b/vendor/github.com/rivo/uniseg/graphemeproperties.go @@ -0,0 +1,1891 @@ +package uniseg + +// Code generated via go generate from gen_properties.go. DO NOT EDIT. + +// graphemeCodePoints are taken from +// https://www.unicode.org/Public/14.0.0/ucd/auxiliary/GraphemeBreakProperty.txt +// and +// https://unicode.org/Public/14.0.0/ucd/emoji/emoji-data.txt +// ("Extended_Pictographic" only) +// on July 25, 2022. See https://www.unicode.org/license.html for the Unicode +// license agreement. +var graphemeCodePoints = [][3]int{ + {0x0000, 0x0009, prControl}, // Cc [10] .. + {0x000A, 0x000A, prLF}, // Cc + {0x000B, 0x000C, prControl}, // Cc [2] .. + {0x000D, 0x000D, prCR}, // Cc + {0x000E, 0x001F, prControl}, // Cc [18] .. + {0x007F, 0x009F, prControl}, // Cc [33] .. + {0x00A9, 0x00A9, prExtendedPictographic}, // E0.6 [1] (©️) copyright + {0x00AD, 0x00AD, prControl}, // Cf SOFT HYPHEN + {0x00AE, 0x00AE, prExtendedPictographic}, // E0.6 [1] (®️) registered + {0x0300, 0x036F, prExtend}, // Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X + {0x0483, 0x0487, prExtend}, // Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE + {0x0488, 0x0489, prExtend}, // Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN + {0x0591, 0x05BD, prExtend}, // Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG + {0x05BF, 0x05BF, prExtend}, // Mn HEBREW POINT RAFE + {0x05C1, 0x05C2, prExtend}, // Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT + {0x05C4, 0x05C5, prExtend}, // Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT + {0x05C7, 0x05C7, prExtend}, // Mn HEBREW POINT QAMATS QATAN + {0x0600, 0x0605, prPrepend}, // Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE + {0x0610, 0x061A, prExtend}, // Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA + {0x061C, 0x061C, prControl}, // Cf ARABIC LETTER MARK + {0x064B, 0x065F, prExtend}, // Mn [21] ARABIC FATHATAN..ARABIC WAVY HAMZA BELOW + {0x0670, 0x0670, prExtend}, // Mn ARABIC LETTER SUPERSCRIPT ALEF + {0x06D6, 0x06DC, prExtend}, // Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN + {0x06DD, 0x06DD, prPrepend}, // Cf ARABIC END OF AYAH + {0x06DF, 0x06E4, prExtend}, // Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA + {0x06E7, 0x06E8, prExtend}, // Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON + {0x06EA, 0x06ED, prExtend}, // Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM + {0x070F, 0x070F, prPrepend}, // Cf SYRIAC ABBREVIATION MARK + {0x0711, 0x0711, prExtend}, // Mn SYRIAC LETTER SUPERSCRIPT ALAPH + {0x0730, 0x074A, prExtend}, // Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH + {0x07A6, 0x07B0, prExtend}, // Mn [11] THAANA ABAFILI..THAANA SUKUN + {0x07EB, 0x07F3, prExtend}, // Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE + {0x07FD, 0x07FD, prExtend}, // Mn NKO DANTAYALAN + {0x0816, 0x0819, prExtend}, // Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH + {0x081B, 0x0823, prExtend}, // Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A + {0x0825, 0x0827, prExtend}, // Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U + {0x0829, 0x082D, prExtend}, // Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA + {0x0859, 0x085B, prExtend}, // Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK + {0x0890, 0x0891, prPrepend}, // Cf [2] ARABIC POUND MARK ABOVE..ARABIC PIASTRE MARK ABOVE + {0x0898, 0x089F, prExtend}, // Mn [8] ARABIC SMALL HIGH WORD AL-JUZ..ARABIC HALF MADDA OVER MADDA + {0x08CA, 0x08E1, prExtend}, // Mn [24] ARABIC SMALL HIGH FARSI YEH..ARABIC SMALL HIGH SIGN SAFHA + {0x08E2, 0x08E2, prPrepend}, // Cf ARABIC DISPUTED END OF AYAH + {0x08E3, 0x0902, prExtend}, // Mn [32] ARABIC TURNED DAMMA BELOW..DEVANAGARI SIGN ANUSVARA + {0x0903, 0x0903, prSpacingMark}, // Mc DEVANAGARI SIGN VISARGA + {0x093A, 0x093A, prExtend}, // Mn DEVANAGARI VOWEL SIGN OE + {0x093B, 0x093B, prSpacingMark}, // Mc DEVANAGARI VOWEL SIGN OOE + {0x093C, 0x093C, prExtend}, // Mn DEVANAGARI SIGN NUKTA + {0x093E, 0x0940, prSpacingMark}, // Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II + {0x0941, 0x0948, prExtend}, // Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI + {0x0949, 0x094C, prSpacingMark}, // Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU + {0x094D, 0x094D, prExtend}, // Mn DEVANAGARI SIGN VIRAMA + {0x094E, 0x094F, prSpacingMark}, // Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW + {0x0951, 0x0957, prExtend}, // Mn [7] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN UUE + {0x0962, 0x0963, prExtend}, // Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL + {0x0981, 0x0981, prExtend}, // Mn BENGALI SIGN CANDRABINDU + {0x0982, 0x0983, prSpacingMark}, // Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA + {0x09BC, 0x09BC, prExtend}, // Mn BENGALI SIGN NUKTA + {0x09BE, 0x09BE, prExtend}, // Mc BENGALI VOWEL SIGN AA + {0x09BF, 0x09C0, prSpacingMark}, // Mc [2] BENGALI VOWEL SIGN I..BENGALI VOWEL SIGN II + {0x09C1, 0x09C4, prExtend}, // Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR + {0x09C7, 0x09C8, prSpacingMark}, // Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI + {0x09CB, 0x09CC, prSpacingMark}, // Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU + {0x09CD, 0x09CD, prExtend}, // Mn BENGALI SIGN VIRAMA + {0x09D7, 0x09D7, prExtend}, // Mc BENGALI AU LENGTH MARK + {0x09E2, 0x09E3, prExtend}, // Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL + {0x09FE, 0x09FE, prExtend}, // Mn BENGALI SANDHI MARK + {0x0A01, 0x0A02, prExtend}, // Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI + {0x0A03, 0x0A03, prSpacingMark}, // Mc GURMUKHI SIGN VISARGA + {0x0A3C, 0x0A3C, prExtend}, // Mn GURMUKHI SIGN NUKTA + {0x0A3E, 0x0A40, prSpacingMark}, // Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II + {0x0A41, 0x0A42, prExtend}, // Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU + {0x0A47, 0x0A48, prExtend}, // Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI + {0x0A4B, 0x0A4D, prExtend}, // Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA + {0x0A51, 0x0A51, prExtend}, // Mn GURMUKHI SIGN UDAAT + {0x0A70, 0x0A71, prExtend}, // Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK + {0x0A75, 0x0A75, prExtend}, // Mn GURMUKHI SIGN YAKASH + {0x0A81, 0x0A82, prExtend}, // Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA + {0x0A83, 0x0A83, prSpacingMark}, // Mc GUJARATI SIGN VISARGA + {0x0ABC, 0x0ABC, prExtend}, // Mn GUJARATI SIGN NUKTA + {0x0ABE, 0x0AC0, prSpacingMark}, // Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II + {0x0AC1, 0x0AC5, prExtend}, // Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E + {0x0AC7, 0x0AC8, prExtend}, // Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI + {0x0AC9, 0x0AC9, prSpacingMark}, // Mc GUJARATI VOWEL SIGN CANDRA O + {0x0ACB, 0x0ACC, prSpacingMark}, // Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU + {0x0ACD, 0x0ACD, prExtend}, // Mn GUJARATI SIGN VIRAMA + {0x0AE2, 0x0AE3, prExtend}, // Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL + {0x0AFA, 0x0AFF, prExtend}, // Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE + {0x0B01, 0x0B01, prExtend}, // Mn ORIYA SIGN CANDRABINDU + {0x0B02, 0x0B03, prSpacingMark}, // Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA + {0x0B3C, 0x0B3C, prExtend}, // Mn ORIYA SIGN NUKTA + {0x0B3E, 0x0B3E, prExtend}, // Mc ORIYA VOWEL SIGN AA + {0x0B3F, 0x0B3F, prExtend}, // Mn ORIYA VOWEL SIGN I + {0x0B40, 0x0B40, prSpacingMark}, // Mc ORIYA VOWEL SIGN II + {0x0B41, 0x0B44, prExtend}, // Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR + {0x0B47, 0x0B48, prSpacingMark}, // Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI + {0x0B4B, 0x0B4C, prSpacingMark}, // Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU + {0x0B4D, 0x0B4D, prExtend}, // Mn ORIYA SIGN VIRAMA + {0x0B55, 0x0B56, prExtend}, // Mn [2] ORIYA SIGN OVERLINE..ORIYA AI LENGTH MARK + {0x0B57, 0x0B57, prExtend}, // Mc ORIYA AU LENGTH MARK + {0x0B62, 0x0B63, prExtend}, // Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL + {0x0B82, 0x0B82, prExtend}, // Mn TAMIL SIGN ANUSVARA + {0x0BBE, 0x0BBE, prExtend}, // Mc TAMIL VOWEL SIGN AA + {0x0BBF, 0x0BBF, prSpacingMark}, // Mc TAMIL VOWEL SIGN I + {0x0BC0, 0x0BC0, prExtend}, // Mn TAMIL VOWEL SIGN II + {0x0BC1, 0x0BC2, prSpacingMark}, // Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU + {0x0BC6, 0x0BC8, prSpacingMark}, // Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI + {0x0BCA, 0x0BCC, prSpacingMark}, // Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU + {0x0BCD, 0x0BCD, prExtend}, // Mn TAMIL SIGN VIRAMA + {0x0BD7, 0x0BD7, prExtend}, // Mc TAMIL AU LENGTH MARK + {0x0C00, 0x0C00, prExtend}, // Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE + {0x0C01, 0x0C03, prSpacingMark}, // Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA + {0x0C04, 0x0C04, prExtend}, // Mn TELUGU SIGN COMBINING ANUSVARA ABOVE + {0x0C3C, 0x0C3C, prExtend}, // Mn TELUGU SIGN NUKTA + {0x0C3E, 0x0C40, prExtend}, // Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II + {0x0C41, 0x0C44, prSpacingMark}, // Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR + {0x0C46, 0x0C48, prExtend}, // Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI + {0x0C4A, 0x0C4D, prExtend}, // Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA + {0x0C55, 0x0C56, prExtend}, // Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK + {0x0C62, 0x0C63, prExtend}, // Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL + {0x0C81, 0x0C81, prExtend}, // Mn KANNADA SIGN CANDRABINDU + {0x0C82, 0x0C83, prSpacingMark}, // Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA + {0x0CBC, 0x0CBC, prExtend}, // Mn KANNADA SIGN NUKTA + {0x0CBE, 0x0CBE, prSpacingMark}, // Mc KANNADA VOWEL SIGN AA + {0x0CBF, 0x0CBF, prExtend}, // Mn KANNADA VOWEL SIGN I + {0x0CC0, 0x0CC1, prSpacingMark}, // Mc [2] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN U + {0x0CC2, 0x0CC2, prExtend}, // Mc KANNADA VOWEL SIGN UU + {0x0CC3, 0x0CC4, prSpacingMark}, // Mc [2] KANNADA VOWEL SIGN VOCALIC R..KANNADA VOWEL SIGN VOCALIC RR + {0x0CC6, 0x0CC6, prExtend}, // Mn KANNADA VOWEL SIGN E + {0x0CC7, 0x0CC8, prSpacingMark}, // Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI + {0x0CCA, 0x0CCB, prSpacingMark}, // Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO + {0x0CCC, 0x0CCD, prExtend}, // Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA + {0x0CD5, 0x0CD6, prExtend}, // Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK + {0x0CE2, 0x0CE3, prExtend}, // Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL + {0x0D00, 0x0D01, prExtend}, // Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU + {0x0D02, 0x0D03, prSpacingMark}, // Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA + {0x0D3B, 0x0D3C, prExtend}, // Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA + {0x0D3E, 0x0D3E, prExtend}, // Mc MALAYALAM VOWEL SIGN AA + {0x0D3F, 0x0D40, prSpacingMark}, // Mc [2] MALAYALAM VOWEL SIGN I..MALAYALAM VOWEL SIGN II + {0x0D41, 0x0D44, prExtend}, // Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR + {0x0D46, 0x0D48, prSpacingMark}, // Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI + {0x0D4A, 0x0D4C, prSpacingMark}, // Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU + {0x0D4D, 0x0D4D, prExtend}, // Mn MALAYALAM SIGN VIRAMA + {0x0D4E, 0x0D4E, prPrepend}, // Lo MALAYALAM LETTER DOT REPH + {0x0D57, 0x0D57, prExtend}, // Mc MALAYALAM AU LENGTH MARK + {0x0D62, 0x0D63, prExtend}, // Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL + {0x0D81, 0x0D81, prExtend}, // Mn SINHALA SIGN CANDRABINDU + {0x0D82, 0x0D83, prSpacingMark}, // Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA + {0x0DCA, 0x0DCA, prExtend}, // Mn SINHALA SIGN AL-LAKUNA + {0x0DCF, 0x0DCF, prExtend}, // Mc SINHALA VOWEL SIGN AELA-PILLA + {0x0DD0, 0x0DD1, prSpacingMark}, // Mc [2] SINHALA VOWEL SIGN KETTI AEDA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA + {0x0DD2, 0x0DD4, prExtend}, // Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA + {0x0DD6, 0x0DD6, prExtend}, // Mn SINHALA VOWEL SIGN DIGA PAA-PILLA + {0x0DD8, 0x0DDE, prSpacingMark}, // Mc [7] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA + {0x0DDF, 0x0DDF, prExtend}, // Mc SINHALA VOWEL SIGN GAYANUKITTA + {0x0DF2, 0x0DF3, prSpacingMark}, // Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA + {0x0E31, 0x0E31, prExtend}, // Mn THAI CHARACTER MAI HAN-AKAT + {0x0E33, 0x0E33, prSpacingMark}, // Lo THAI CHARACTER SARA AM + {0x0E34, 0x0E3A, prExtend}, // Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU + {0x0E47, 0x0E4E, prExtend}, // Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN + {0x0EB1, 0x0EB1, prExtend}, // Mn LAO VOWEL SIGN MAI KAN + {0x0EB3, 0x0EB3, prSpacingMark}, // Lo LAO VOWEL SIGN AM + {0x0EB4, 0x0EBC, prExtend}, // Mn [9] LAO VOWEL SIGN I..LAO SEMIVOWEL SIGN LO + {0x0EC8, 0x0ECD, prExtend}, // Mn [6] LAO TONE MAI EK..LAO NIGGAHITA + {0x0F18, 0x0F19, prExtend}, // Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS + {0x0F35, 0x0F35, prExtend}, // Mn TIBETAN MARK NGAS BZUNG NYI ZLA + {0x0F37, 0x0F37, prExtend}, // Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS + {0x0F39, 0x0F39, prExtend}, // Mn TIBETAN MARK TSA -PHRU + {0x0F3E, 0x0F3F, prSpacingMark}, // Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES + {0x0F71, 0x0F7E, prExtend}, // Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO + {0x0F7F, 0x0F7F, prSpacingMark}, // Mc TIBETAN SIGN RNAM BCAD + {0x0F80, 0x0F84, prExtend}, // Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA + {0x0F86, 0x0F87, prExtend}, // Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS + {0x0F8D, 0x0F97, prExtend}, // Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA + {0x0F99, 0x0FBC, prExtend}, // Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA + {0x0FC6, 0x0FC6, prExtend}, // Mn TIBETAN SYMBOL PADMA GDAN + {0x102D, 0x1030, prExtend}, // Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU + {0x1031, 0x1031, prSpacingMark}, // Mc MYANMAR VOWEL SIGN E + {0x1032, 0x1037, prExtend}, // Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW + {0x1039, 0x103A, prExtend}, // Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT + {0x103B, 0x103C, prSpacingMark}, // Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA + {0x103D, 0x103E, prExtend}, // Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA + {0x1056, 0x1057, prSpacingMark}, // Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR + {0x1058, 0x1059, prExtend}, // Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL + {0x105E, 0x1060, prExtend}, // Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA + {0x1071, 0x1074, prExtend}, // Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE + {0x1082, 0x1082, prExtend}, // Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA + {0x1084, 0x1084, prSpacingMark}, // Mc MYANMAR VOWEL SIGN SHAN E + {0x1085, 0x1086, prExtend}, // Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y + {0x108D, 0x108D, prExtend}, // Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE + {0x109D, 0x109D, prExtend}, // Mn MYANMAR VOWEL SIGN AITON AI + {0x1100, 0x115F, prL}, // Lo [96] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG FILLER + {0x1160, 0x11A7, prV}, // Lo [72] HANGUL JUNGSEONG FILLER..HANGUL JUNGSEONG O-YAE + {0x11A8, 0x11FF, prT}, // Lo [88] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG SSANGNIEUN + {0x135D, 0x135F, prExtend}, // Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK + {0x1712, 0x1714, prExtend}, // Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA + {0x1715, 0x1715, prSpacingMark}, // Mc TAGALOG SIGN PAMUDPOD + {0x1732, 0x1733, prExtend}, // Mn [2] HANUNOO VOWEL SIGN I..HANUNOO VOWEL SIGN U + {0x1734, 0x1734, prSpacingMark}, // Mc HANUNOO SIGN PAMUDPOD + {0x1752, 0x1753, prExtend}, // Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U + {0x1772, 0x1773, prExtend}, // Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U + {0x17B4, 0x17B5, prExtend}, // Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA + {0x17B6, 0x17B6, prSpacingMark}, // Mc KHMER VOWEL SIGN AA + {0x17B7, 0x17BD, prExtend}, // Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA + {0x17BE, 0x17C5, prSpacingMark}, // Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU + {0x17C6, 0x17C6, prExtend}, // Mn KHMER SIGN NIKAHIT + {0x17C7, 0x17C8, prSpacingMark}, // Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU + {0x17C9, 0x17D3, prExtend}, // Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT + {0x17DD, 0x17DD, prExtend}, // Mn KHMER SIGN ATTHACAN + {0x180B, 0x180D, prExtend}, // Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE + {0x180E, 0x180E, prControl}, // Cf MONGOLIAN VOWEL SEPARATOR + {0x180F, 0x180F, prExtend}, // Mn MONGOLIAN FREE VARIATION SELECTOR FOUR + {0x1885, 0x1886, prExtend}, // Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA + {0x18A9, 0x18A9, prExtend}, // Mn MONGOLIAN LETTER ALI GALI DAGALGA + {0x1920, 0x1922, prExtend}, // Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U + {0x1923, 0x1926, prSpacingMark}, // Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU + {0x1927, 0x1928, prExtend}, // Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O + {0x1929, 0x192B, prSpacingMark}, // Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA + {0x1930, 0x1931, prSpacingMark}, // Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA + {0x1932, 0x1932, prExtend}, // Mn LIMBU SMALL LETTER ANUSVARA + {0x1933, 0x1938, prSpacingMark}, // Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA + {0x1939, 0x193B, prExtend}, // Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I + {0x1A17, 0x1A18, prExtend}, // Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U + {0x1A19, 0x1A1A, prSpacingMark}, // Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O + {0x1A1B, 0x1A1B, prExtend}, // Mn BUGINESE VOWEL SIGN AE + {0x1A55, 0x1A55, prSpacingMark}, // Mc TAI THAM CONSONANT SIGN MEDIAL RA + {0x1A56, 0x1A56, prExtend}, // Mn TAI THAM CONSONANT SIGN MEDIAL LA + {0x1A57, 0x1A57, prSpacingMark}, // Mc TAI THAM CONSONANT SIGN LA TANG LAI + {0x1A58, 0x1A5E, prExtend}, // Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA + {0x1A60, 0x1A60, prExtend}, // Mn TAI THAM SIGN SAKOT + {0x1A62, 0x1A62, prExtend}, // Mn TAI THAM VOWEL SIGN MAI SAT + {0x1A65, 0x1A6C, prExtend}, // Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW + {0x1A6D, 0x1A72, prSpacingMark}, // Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI + {0x1A73, 0x1A7C, prExtend}, // Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN + {0x1A7F, 0x1A7F, prExtend}, // Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT + {0x1AB0, 0x1ABD, prExtend}, // Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW + {0x1ABE, 0x1ABE, prExtend}, // Me COMBINING PARENTHESES OVERLAY + {0x1ABF, 0x1ACE, prExtend}, // Mn [16] COMBINING LATIN SMALL LETTER W BELOW..COMBINING LATIN SMALL LETTER INSULAR T + {0x1B00, 0x1B03, prExtend}, // Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG + {0x1B04, 0x1B04, prSpacingMark}, // Mc BALINESE SIGN BISAH + {0x1B34, 0x1B34, prExtend}, // Mn BALINESE SIGN REREKAN + {0x1B35, 0x1B35, prExtend}, // Mc BALINESE VOWEL SIGN TEDUNG + {0x1B36, 0x1B3A, prExtend}, // Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA + {0x1B3B, 0x1B3B, prSpacingMark}, // Mc BALINESE VOWEL SIGN RA REPA TEDUNG + {0x1B3C, 0x1B3C, prExtend}, // Mn BALINESE VOWEL SIGN LA LENGA + {0x1B3D, 0x1B41, prSpacingMark}, // Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG + {0x1B42, 0x1B42, prExtend}, // Mn BALINESE VOWEL SIGN PEPET + {0x1B43, 0x1B44, prSpacingMark}, // Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG + {0x1B6B, 0x1B73, prExtend}, // Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG + {0x1B80, 0x1B81, prExtend}, // Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR + {0x1B82, 0x1B82, prSpacingMark}, // Mc SUNDANESE SIGN PANGWISAD + {0x1BA1, 0x1BA1, prSpacingMark}, // Mc SUNDANESE CONSONANT SIGN PAMINGKAL + {0x1BA2, 0x1BA5, prExtend}, // Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU + {0x1BA6, 0x1BA7, prSpacingMark}, // Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG + {0x1BA8, 0x1BA9, prExtend}, // Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG + {0x1BAA, 0x1BAA, prSpacingMark}, // Mc SUNDANESE SIGN PAMAAEH + {0x1BAB, 0x1BAD, prExtend}, // Mn [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA + {0x1BE6, 0x1BE6, prExtend}, // Mn BATAK SIGN TOMPI + {0x1BE7, 0x1BE7, prSpacingMark}, // Mc BATAK VOWEL SIGN E + {0x1BE8, 0x1BE9, prExtend}, // Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE + {0x1BEA, 0x1BEC, prSpacingMark}, // Mc [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O + {0x1BED, 0x1BED, prExtend}, // Mn BATAK VOWEL SIGN KARO O + {0x1BEE, 0x1BEE, prSpacingMark}, // Mc BATAK VOWEL SIGN U + {0x1BEF, 0x1BF1, prExtend}, // Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H + {0x1BF2, 0x1BF3, prSpacingMark}, // Mc [2] BATAK PANGOLAT..BATAK PANONGONAN + {0x1C24, 0x1C2B, prSpacingMark}, // Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU + {0x1C2C, 0x1C33, prExtend}, // Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T + {0x1C34, 0x1C35, prSpacingMark}, // Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG + {0x1C36, 0x1C37, prExtend}, // Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA + {0x1CD0, 0x1CD2, prExtend}, // Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA + {0x1CD4, 0x1CE0, prExtend}, // Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA + {0x1CE1, 0x1CE1, prSpacingMark}, // Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA + {0x1CE2, 0x1CE8, prExtend}, // Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL + {0x1CED, 0x1CED, prExtend}, // Mn VEDIC SIGN TIRYAK + {0x1CF4, 0x1CF4, prExtend}, // Mn VEDIC TONE CANDRA ABOVE + {0x1CF7, 0x1CF7, prSpacingMark}, // Mc VEDIC SIGN ATIKRAMA + {0x1CF8, 0x1CF9, prExtend}, // Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE + {0x1DC0, 0x1DFF, prExtend}, // Mn [64] COMBINING DOTTED GRAVE ACCENT..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW + {0x200B, 0x200B, prControl}, // Cf ZERO WIDTH SPACE + {0x200C, 0x200C, prExtend}, // Cf ZERO WIDTH NON-JOINER + {0x200D, 0x200D, prZWJ}, // Cf ZERO WIDTH JOINER + {0x200E, 0x200F, prControl}, // Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK + {0x2028, 0x2028, prControl}, // Zl LINE SEPARATOR + {0x2029, 0x2029, prControl}, // Zp PARAGRAPH SEPARATOR + {0x202A, 0x202E, prControl}, // Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE + {0x203C, 0x203C, prExtendedPictographic}, // E0.6 [1] (‼️) double exclamation mark + {0x2049, 0x2049, prExtendedPictographic}, // E0.6 [1] (â‰ď¸Ź) exclamation question mark + {0x2060, 0x2064, prControl}, // Cf [5] WORD JOINER..INVISIBLE PLUS + {0x2065, 0x2065, prControl}, // Cn + {0x2066, 0x206F, prControl}, // Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES + {0x20D0, 0x20DC, prExtend}, // Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE + {0x20DD, 0x20E0, prExtend}, // Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH + {0x20E1, 0x20E1, prExtend}, // Mn COMBINING LEFT RIGHT ARROW ABOVE + {0x20E2, 0x20E4, prExtend}, // Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE + {0x20E5, 0x20F0, prExtend}, // Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE + {0x2122, 0x2122, prExtendedPictographic}, // E0.6 [1] (™️) trade mark + {0x2139, 0x2139, prExtendedPictographic}, // E0.6 [1] (ℹ️) information + {0x2194, 0x2199, prExtendedPictographic}, // E0.6 [6] (↔️..↙️) left-right arrow..down-left arrow + {0x21A9, 0x21AA, prExtendedPictographic}, // E0.6 [2] (↩️..↪️) right arrow curving left..left arrow curving right + {0x231A, 0x231B, prExtendedPictographic}, // E0.6 [2] (⌚..⌛) watch..hourglass done + {0x2328, 0x2328, prExtendedPictographic}, // E1.0 [1] (⌨️) keyboard + {0x2388, 0x2388, prExtendedPictographic}, // E0.0 [1] (âŽ) HELM SYMBOL + {0x23CF, 0x23CF, prExtendedPictographic}, // E1.0 [1] (⏏️) eject button + {0x23E9, 0x23EC, prExtendedPictographic}, // E0.6 [4] (⏩..⏬) fast-forward button..fast down button + {0x23ED, 0x23EE, prExtendedPictographic}, // E0.7 [2] (⏭️..⏮️) next track button..last track button + {0x23EF, 0x23EF, prExtendedPictographic}, // E1.0 [1] (⏯️) play or pause button + {0x23F0, 0x23F0, prExtendedPictographic}, // E0.6 [1] (⏰) alarm clock + {0x23F1, 0x23F2, prExtendedPictographic}, // E1.0 [2] (⏱️..⏲️) stopwatch..timer clock + {0x23F3, 0x23F3, prExtendedPictographic}, // E0.6 [1] (⏳) hourglass not done + {0x23F8, 0x23FA, prExtendedPictographic}, // E0.7 [3] (⏸️..⏺️) pause button..record button + {0x24C2, 0x24C2, prExtendedPictographic}, // E0.6 [1] (Ⓜ️) circled M + {0x25AA, 0x25AB, prExtendedPictographic}, // E0.6 [2] (▪️..▫️) black small square..white small square + {0x25B6, 0x25B6, prExtendedPictographic}, // E0.6 [1] (▶️) play button + {0x25C0, 0x25C0, prExtendedPictographic}, // E0.6 [1] (◀️) reverse button + {0x25FB, 0x25FE, prExtendedPictographic}, // E0.6 [4] (◻️..â—ľ) white medium square..black medium-small square + {0x2600, 0x2601, prExtendedPictographic}, // E0.6 [2] (â€ď¸Ź..â️) sun..cloud + {0x2602, 0x2603, prExtendedPictographic}, // E0.7 [2] (â‚️..â️) umbrella..snowman + {0x2604, 0x2604, prExtendedPictographic}, // E1.0 [1] (â„️) comet + {0x2605, 0x2605, prExtendedPictographic}, // E0.0 [1] (â…) BLACK STAR + {0x2607, 0x260D, prExtendedPictographic}, // E0.0 [7] (â‡..âŤ) LIGHTNING..OPPOSITION + {0x260E, 0x260E, prExtendedPictographic}, // E0.6 [1] (âŽď¸Ź) telephone + {0x260F, 0x2610, prExtendedPictographic}, // E0.0 [2] (âŹ..â) WHITE TELEPHONE..BALLOT BOX + {0x2611, 0x2611, prExtendedPictographic}, // E0.6 [1] (â‘️) check box with check + {0x2612, 0x2612, prExtendedPictographic}, // E0.0 [1] (â’) BALLOT BOX WITH X + {0x2614, 0x2615, prExtendedPictographic}, // E0.6 [2] (â”..â•) umbrella with rain drops..hot beverage + {0x2616, 0x2617, prExtendedPictographic}, // E0.0 [2] (â–..â—) WHITE SHOGI PIECE..BLACK SHOGI PIECE + {0x2618, 0x2618, prExtendedPictographic}, // E1.0 [1] (â️) shamrock + {0x2619, 0x261C, prExtendedPictographic}, // E0.0 [4] (â™..âś) REVERSED ROTATED FLORAL HEART BULLET..WHITE LEFT POINTING INDEX + {0x261D, 0x261D, prExtendedPictographic}, // E0.6 [1] (âťď¸Ź) index pointing up + {0x261E, 0x261F, prExtendedPictographic}, // E0.0 [2] (âž..âź) WHITE RIGHT POINTING INDEX..WHITE DOWN POINTING INDEX + {0x2620, 0x2620, prExtendedPictographic}, // E1.0 [1] (â ď¸Ź) skull and crossbones + {0x2621, 0x2621, prExtendedPictographic}, // E0.0 [1] (âˇ) CAUTION SIGN + {0x2622, 0x2623, prExtendedPictographic}, // E1.0 [2] (â˘ď¸Ź..âŁď¸Ź) radioactive..biohazard + {0x2624, 0x2625, prExtendedPictographic}, // E0.0 [2] (â¤..âĄ) CADUCEUS..ANKH + {0x2626, 0x2626, prExtendedPictographic}, // E1.0 [1] (â¦ď¸Ź) orthodox cross + {0x2627, 0x2629, prExtendedPictographic}, // E0.0 [3] (â§..â©) CHI RHO..CROSS OF JERUSALEM + {0x262A, 0x262A, prExtendedPictographic}, // E0.7 [1] (âŞď¸Ź) star and crescent + {0x262B, 0x262D, prExtendedPictographic}, // E0.0 [3] (â«..â­) FARSI SYMBOL..HAMMER AND SICKLE + {0x262E, 0x262E, prExtendedPictographic}, // E1.0 [1] (â®ď¸Ź) peace symbol + {0x262F, 0x262F, prExtendedPictographic}, // E0.7 [1] (âŻď¸Ź) yin yang + {0x2630, 0x2637, prExtendedPictographic}, // E0.0 [8] (â°..â·) TRIGRAM FOR HEAVEN..TRIGRAM FOR EARTH + {0x2638, 0x2639, prExtendedPictographic}, // E0.7 [2] (â¸ď¸Ź..âąď¸Ź) wheel of dharma..frowning face + {0x263A, 0x263A, prExtendedPictographic}, // E0.6 [1] (âşď¸Ź) smiling face + {0x263B, 0x263F, prExtendedPictographic}, // E0.0 [5] (â»..âż) BLACK SMILING FACE..MERCURY + {0x2640, 0x2640, prExtendedPictographic}, // E4.0 [1] (♀️) female sign + {0x2641, 0x2641, prExtendedPictographic}, // E0.0 [1] (â™) EARTH + {0x2642, 0x2642, prExtendedPictographic}, // E4.0 [1] (♂️) male sign + {0x2643, 0x2647, prExtendedPictographic}, // E0.0 [5] (â™..♇) JUPITER..PLUTO + {0x2648, 0x2653, prExtendedPictographic}, // E0.6 [12] (â™..♓) Aries..Pisces + {0x2654, 0x265E, prExtendedPictographic}, // E0.0 [11] (â™”..♞) WHITE CHESS KING..BLACK CHESS KNIGHT + {0x265F, 0x265F, prExtendedPictographic}, // E11.0 [1] (♟️) chess pawn + {0x2660, 0x2660, prExtendedPictographic}, // E0.6 [1] (♠️) spade suit + {0x2661, 0x2662, prExtendedPictographic}, // E0.0 [2] (♡..♢) WHITE HEART SUIT..WHITE DIAMOND SUIT + {0x2663, 0x2663, prExtendedPictographic}, // E0.6 [1] (♣️) club suit + {0x2664, 0x2664, prExtendedPictographic}, // E0.0 [1] (♤) WHITE SPADE SUIT + {0x2665, 0x2666, prExtendedPictographic}, // E0.6 [2] (♥️..♦️) heart suit..diamond suit + {0x2667, 0x2667, prExtendedPictographic}, // E0.0 [1] (â™§) WHITE CLUB SUIT + {0x2668, 0x2668, prExtendedPictographic}, // E0.6 [1] (♨️) hot springs + {0x2669, 0x267A, prExtendedPictographic}, // E0.0 [18] (♩..♺) QUARTER NOTE..RECYCLING SYMBOL FOR GENERIC MATERIALS + {0x267B, 0x267B, prExtendedPictographic}, // E0.6 [1] (♻️) recycling symbol + {0x267C, 0x267D, prExtendedPictographic}, // E0.0 [2] (♼..â™˝) RECYCLED PAPER SYMBOL..PARTIALLY-RECYCLED PAPER SYMBOL + {0x267E, 0x267E, prExtendedPictographic}, // E11.0 [1] (♾️) infinity + {0x267F, 0x267F, prExtendedPictographic}, // E0.6 [1] (♿) wheelchair symbol + {0x2680, 0x2685, prExtendedPictographic}, // E0.0 [6] (⚀..âš…) DIE FACE-1..DIE FACE-6 + {0x2690, 0x2691, prExtendedPictographic}, // E0.0 [2] (âš..âš‘) WHITE FLAG..BLACK FLAG + {0x2692, 0x2692, prExtendedPictographic}, // E1.0 [1] (⚒️) hammer and pick + {0x2693, 0x2693, prExtendedPictographic}, // E0.6 [1] (âš“) anchor + {0x2694, 0x2694, prExtendedPictographic}, // E1.0 [1] (⚔️) crossed swords + {0x2695, 0x2695, prExtendedPictographic}, // E4.0 [1] (⚕️) medical symbol + {0x2696, 0x2697, prExtendedPictographic}, // E1.0 [2] (⚖️..⚗️) balance scale..alembic + {0x2698, 0x2698, prExtendedPictographic}, // E0.0 [1] (âš) FLOWER + {0x2699, 0x2699, prExtendedPictographic}, // E1.0 [1] (⚙️) gear + {0x269A, 0x269A, prExtendedPictographic}, // E0.0 [1] (âšš) STAFF OF HERMES + {0x269B, 0x269C, prExtendedPictographic}, // E1.0 [2] (⚛️..⚜️) atom symbol..fleur-de-lis + {0x269D, 0x269F, prExtendedPictographic}, // E0.0 [3] (âšť..âšź) OUTLINED WHITE STAR..THREE LINES CONVERGING LEFT + {0x26A0, 0x26A1, prExtendedPictographic}, // E0.6 [2] (⚠️..⚡) warning..high voltage + {0x26A2, 0x26A6, prExtendedPictographic}, // E0.0 [5] (⚢..⚦) DOUBLED FEMALE SIGN..MALE WITH STROKE SIGN + {0x26A7, 0x26A7, prExtendedPictographic}, // E13.0 [1] (⚧️) transgender symbol + {0x26A8, 0x26A9, prExtendedPictographic}, // E0.0 [2] (⚨..âš©) VERTICAL MALE WITH STROKE SIGN..HORIZONTAL MALE WITH STROKE SIGN + {0x26AA, 0x26AB, prExtendedPictographic}, // E0.6 [2] (⚪..âš«) white circle..black circle + {0x26AC, 0x26AF, prExtendedPictographic}, // E0.0 [4] (⚬..⚯) MEDIUM SMALL WHITE CIRCLE..UNMARRIED PARTNERSHIP SYMBOL + {0x26B0, 0x26B1, prExtendedPictographic}, // E1.0 [2] (⚰️..⚱️) coffin..funeral urn + {0x26B2, 0x26BC, prExtendedPictographic}, // E0.0 [11] (⚲..⚼) NEUTER..SESQUIQUADRATE + {0x26BD, 0x26BE, prExtendedPictographic}, // E0.6 [2] (âš˝..âšľ) soccer ball..baseball + {0x26BF, 0x26C3, prExtendedPictographic}, // E0.0 [5] (âšż..â›) SQUARED KEY..BLACK DRAUGHTS KING + {0x26C4, 0x26C5, prExtendedPictographic}, // E0.6 [2] (⛄..â›…) snowman without snow..sun behind cloud + {0x26C6, 0x26C7, prExtendedPictographic}, // E0.0 [2] (⛆..⛇) RAIN..BLACK SNOWMAN + {0x26C8, 0x26C8, prExtendedPictographic}, // E0.7 [1] (â›ď¸Ź) cloud with lightning and rain + {0x26C9, 0x26CD, prExtendedPictographic}, // E0.0 [5] (⛉..⛍) TURNED WHITE SHOGI PIECE..DISABLED CAR + {0x26CE, 0x26CE, prExtendedPictographic}, // E0.6 [1] (⛎) Ophiuchus + {0x26CF, 0x26CF, prExtendedPictographic}, // E0.7 [1] (⛏️) pick + {0x26D0, 0x26D0, prExtendedPictographic}, // E0.0 [1] (â›) CAR SLIDING + {0x26D1, 0x26D1, prExtendedPictographic}, // E0.7 [1] (⛑️) rescue worker’s helmet + {0x26D2, 0x26D2, prExtendedPictographic}, // E0.0 [1] (â›’) CIRCLED CROSSING LANES + {0x26D3, 0x26D3, prExtendedPictographic}, // E0.7 [1] (⛓️) chains + {0x26D4, 0x26D4, prExtendedPictographic}, // E0.6 [1] (â›”) no entry + {0x26D5, 0x26E8, prExtendedPictographic}, // E0.0 [20] (⛕..⛨) ALTERNATE ONE-WAY LEFT WAY TRAFFIC..BLACK CROSS ON SHIELD + {0x26E9, 0x26E9, prExtendedPictographic}, // E0.7 [1] (⛩️) shinto shrine + {0x26EA, 0x26EA, prExtendedPictographic}, // E0.6 [1] (⛪) church + {0x26EB, 0x26EF, prExtendedPictographic}, // E0.0 [5] (⛫..⛯) CASTLE..MAP SYMBOL FOR LIGHTHOUSE + {0x26F0, 0x26F1, prExtendedPictographic}, // E0.7 [2] (⛰️..⛱️) mountain..umbrella on ground + {0x26F2, 0x26F3, prExtendedPictographic}, // E0.6 [2] (⛲..⛳) fountain..flag in hole + {0x26F4, 0x26F4, prExtendedPictographic}, // E0.7 [1] (⛴️) ferry + {0x26F5, 0x26F5, prExtendedPictographic}, // E0.6 [1] (⛵) sailboat + {0x26F6, 0x26F6, prExtendedPictographic}, // E0.0 [1] (â›¶) SQUARE FOUR CORNERS + {0x26F7, 0x26F9, prExtendedPictographic}, // E0.7 [3] (⛷️..⛹️) skier..person bouncing ball + {0x26FA, 0x26FA, prExtendedPictographic}, // E0.6 [1] (⛺) tent + {0x26FB, 0x26FC, prExtendedPictographic}, // E0.0 [2] (â›»..⛼) JAPANESE BANK SYMBOL..HEADSTONE GRAVEYARD SYMBOL + {0x26FD, 0x26FD, prExtendedPictographic}, // E0.6 [1] (â›˝) fuel pump + {0x26FE, 0x2701, prExtendedPictographic}, // E0.0 [4] (⛾..âś) CUP ON BLACK SQUARE..UPPER BLADE SCISSORS + {0x2702, 0x2702, prExtendedPictographic}, // E0.6 [1] (✂️) scissors + {0x2703, 0x2704, prExtendedPictographic}, // E0.0 [2] (âś..âś„) LOWER BLADE SCISSORS..WHITE SCISSORS + {0x2705, 0x2705, prExtendedPictographic}, // E0.6 [1] (âś…) check mark button + {0x2708, 0x270C, prExtendedPictographic}, // E0.6 [5] (âśď¸Ź..✌️) airplane..victory hand + {0x270D, 0x270D, prExtendedPictographic}, // E0.7 [1] (✍️) writing hand + {0x270E, 0x270E, prExtendedPictographic}, // E0.0 [1] (✎) LOWER RIGHT PENCIL + {0x270F, 0x270F, prExtendedPictographic}, // E0.6 [1] (✏️) pencil + {0x2710, 0x2711, prExtendedPictographic}, // E0.0 [2] (âś..âś‘) UPPER RIGHT PENCIL..WHITE NIB + {0x2712, 0x2712, prExtendedPictographic}, // E0.6 [1] (✒️) black nib + {0x2714, 0x2714, prExtendedPictographic}, // E0.6 [1] (✔️) check mark + {0x2716, 0x2716, prExtendedPictographic}, // E0.6 [1] (✖️) multiply + {0x271D, 0x271D, prExtendedPictographic}, // E0.7 [1] (✝️) latin cross + {0x2721, 0x2721, prExtendedPictographic}, // E0.7 [1] (✡️) star of David + {0x2728, 0x2728, prExtendedPictographic}, // E0.6 [1] (✨) sparkles + {0x2733, 0x2734, prExtendedPictographic}, // E0.6 [2] (✳️..✴️) eight-spoked asterisk..eight-pointed star + {0x2744, 0x2744, prExtendedPictographic}, // E0.6 [1] (❄️) snowflake + {0x2747, 0x2747, prExtendedPictographic}, // E0.6 [1] (❇️) sparkle + {0x274C, 0x274C, prExtendedPictographic}, // E0.6 [1] (❌) cross mark + {0x274E, 0x274E, prExtendedPictographic}, // E0.6 [1] (❎) cross mark button + {0x2753, 0x2755, prExtendedPictographic}, // E0.6 [3] (âť“..âť•) red question mark..white exclamation mark + {0x2757, 0x2757, prExtendedPictographic}, // E0.6 [1] (âť—) red exclamation mark + {0x2763, 0x2763, prExtendedPictographic}, // E1.0 [1] (❣️) heart exclamation + {0x2764, 0x2764, prExtendedPictographic}, // E0.6 [1] (❤️) red heart + {0x2765, 0x2767, prExtendedPictographic}, // E0.0 [3] (❥..âť§) ROTATED HEAVY BLACK HEART BULLET..ROTATED FLORAL HEART BULLET + {0x2795, 0x2797, prExtendedPictographic}, // E0.6 [3] (âž•..âž—) plus..divide + {0x27A1, 0x27A1, prExtendedPictographic}, // E0.6 [1] (➡️) right arrow + {0x27B0, 0x27B0, prExtendedPictographic}, // E0.6 [1] (âž°) curly loop + {0x27BF, 0x27BF, prExtendedPictographic}, // E1.0 [1] (âžż) double curly loop + {0x2934, 0x2935, prExtendedPictographic}, // E0.6 [2] (⤴️..⤵️) right arrow curving up..right arrow curving down + {0x2B05, 0x2B07, prExtendedPictographic}, // E0.6 [3] (⬅️..⬇️) left arrow..down arrow + {0x2B1B, 0x2B1C, prExtendedPictographic}, // E0.6 [2] (⬛..⬜) black large square..white large square + {0x2B50, 0x2B50, prExtendedPictographic}, // E0.6 [1] (â­) star + {0x2B55, 0x2B55, prExtendedPictographic}, // E0.6 [1] (â­•) hollow red circle + {0x2CEF, 0x2CF1, prExtend}, // Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS + {0x2D7F, 0x2D7F, prExtend}, // Mn TIFINAGH CONSONANT JOINER + {0x2DE0, 0x2DFF, prExtend}, // Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS + {0x302A, 0x302D, prExtend}, // Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK + {0x302E, 0x302F, prExtend}, // Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK + {0x3030, 0x3030, prExtendedPictographic}, // E0.6 [1] (〰️) wavy dash + {0x303D, 0x303D, prExtendedPictographic}, // E0.6 [1] (〽️) part alternation mark + {0x3099, 0x309A, prExtend}, // Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + {0x3297, 0x3297, prExtendedPictographic}, // E0.6 [1] (㊗️) Japanese “congratulations” button + {0x3299, 0x3299, prExtendedPictographic}, // E0.6 [1] (㊙️) Japanese “secret” button + {0xA66F, 0xA66F, prExtend}, // Mn COMBINING CYRILLIC VZMET + {0xA670, 0xA672, prExtend}, // Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN + {0xA674, 0xA67D, prExtend}, // Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK + {0xA69E, 0xA69F, prExtend}, // Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E + {0xA6F0, 0xA6F1, prExtend}, // Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS + {0xA802, 0xA802, prExtend}, // Mn SYLOTI NAGRI SIGN DVISVARA + {0xA806, 0xA806, prExtend}, // Mn SYLOTI NAGRI SIGN HASANTA + {0xA80B, 0xA80B, prExtend}, // Mn SYLOTI NAGRI SIGN ANUSVARA + {0xA823, 0xA824, prSpacingMark}, // Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I + {0xA825, 0xA826, prExtend}, // Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E + {0xA827, 0xA827, prSpacingMark}, // Mc SYLOTI NAGRI VOWEL SIGN OO + {0xA82C, 0xA82C, prExtend}, // Mn SYLOTI NAGRI SIGN ALTERNATE HASANTA + {0xA880, 0xA881, prSpacingMark}, // Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA + {0xA8B4, 0xA8C3, prSpacingMark}, // Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU + {0xA8C4, 0xA8C5, prExtend}, // Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU + {0xA8E0, 0xA8F1, prExtend}, // Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA + {0xA8FF, 0xA8FF, prExtend}, // Mn DEVANAGARI VOWEL SIGN AY + {0xA926, 0xA92D, prExtend}, // Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU + {0xA947, 0xA951, prExtend}, // Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R + {0xA952, 0xA953, prSpacingMark}, // Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA + {0xA960, 0xA97C, prL}, // Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH + {0xA980, 0xA982, prExtend}, // Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR + {0xA983, 0xA983, prSpacingMark}, // Mc JAVANESE SIGN WIGNYAN + {0xA9B3, 0xA9B3, prExtend}, // Mn JAVANESE SIGN CECAK TELU + {0xA9B4, 0xA9B5, prSpacingMark}, // Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG + {0xA9B6, 0xA9B9, prExtend}, // Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT + {0xA9BA, 0xA9BB, prSpacingMark}, // Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE + {0xA9BC, 0xA9BD, prExtend}, // Mn [2] JAVANESE VOWEL SIGN PEPET..JAVANESE CONSONANT SIGN KERET + {0xA9BE, 0xA9C0, prSpacingMark}, // Mc [3] JAVANESE CONSONANT SIGN PENGKAL..JAVANESE PANGKON + {0xA9E5, 0xA9E5, prExtend}, // Mn MYANMAR SIGN SHAN SAW + {0xAA29, 0xAA2E, prExtend}, // Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE + {0xAA2F, 0xAA30, prSpacingMark}, // Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI + {0xAA31, 0xAA32, prExtend}, // Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE + {0xAA33, 0xAA34, prSpacingMark}, // Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA + {0xAA35, 0xAA36, prExtend}, // Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA + {0xAA43, 0xAA43, prExtend}, // Mn CHAM CONSONANT SIGN FINAL NG + {0xAA4C, 0xAA4C, prExtend}, // Mn CHAM CONSONANT SIGN FINAL M + {0xAA4D, 0xAA4D, prSpacingMark}, // Mc CHAM CONSONANT SIGN FINAL H + {0xAA7C, 0xAA7C, prExtend}, // Mn MYANMAR SIGN TAI LAING TONE-2 + {0xAAB0, 0xAAB0, prExtend}, // Mn TAI VIET MAI KANG + {0xAAB2, 0xAAB4, prExtend}, // Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U + {0xAAB7, 0xAAB8, prExtend}, // Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA + {0xAABE, 0xAABF, prExtend}, // Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK + {0xAAC1, 0xAAC1, prExtend}, // Mn TAI VIET TONE MAI THO + {0xAAEB, 0xAAEB, prSpacingMark}, // Mc MEETEI MAYEK VOWEL SIGN II + {0xAAEC, 0xAAED, prExtend}, // Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI + {0xAAEE, 0xAAEF, prSpacingMark}, // Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU + {0xAAF5, 0xAAF5, prSpacingMark}, // Mc MEETEI MAYEK VOWEL SIGN VISARGA + {0xAAF6, 0xAAF6, prExtend}, // Mn MEETEI MAYEK VIRAMA + {0xABE3, 0xABE4, prSpacingMark}, // Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP + {0xABE5, 0xABE5, prExtend}, // Mn MEETEI MAYEK VOWEL SIGN ANAP + {0xABE6, 0xABE7, prSpacingMark}, // Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP + {0xABE8, 0xABE8, prExtend}, // Mn MEETEI MAYEK VOWEL SIGN UNAP + {0xABE9, 0xABEA, prSpacingMark}, // Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG + {0xABEC, 0xABEC, prSpacingMark}, // Mc MEETEI MAYEK LUM IYEK + {0xABED, 0xABED, prExtend}, // Mn MEETEI MAYEK APUN IYEK + {0xAC00, 0xAC00, prLV}, // Lo HANGUL SYLLABLE GA + {0xAC01, 0xAC1B, prLVT}, // Lo [27] HANGUL SYLLABLE GAG..HANGUL SYLLABLE GAH + {0xAC1C, 0xAC1C, prLV}, // Lo HANGUL SYLLABLE GAE + {0xAC1D, 0xAC37, prLVT}, // Lo [27] HANGUL SYLLABLE GAEG..HANGUL SYLLABLE GAEH + {0xAC38, 0xAC38, prLV}, // Lo HANGUL SYLLABLE GYA + {0xAC39, 0xAC53, prLVT}, // Lo [27] HANGUL SYLLABLE GYAG..HANGUL SYLLABLE GYAH + {0xAC54, 0xAC54, prLV}, // Lo HANGUL SYLLABLE GYAE + {0xAC55, 0xAC6F, prLVT}, // Lo [27] HANGUL SYLLABLE GYAEG..HANGUL SYLLABLE GYAEH + {0xAC70, 0xAC70, prLV}, // Lo HANGUL SYLLABLE GEO + {0xAC71, 0xAC8B, prLVT}, // Lo [27] HANGUL SYLLABLE GEOG..HANGUL SYLLABLE GEOH + {0xAC8C, 0xAC8C, prLV}, // Lo HANGUL SYLLABLE GE + {0xAC8D, 0xACA7, prLVT}, // Lo [27] HANGUL SYLLABLE GEG..HANGUL SYLLABLE GEH + {0xACA8, 0xACA8, prLV}, // Lo HANGUL SYLLABLE GYEO + {0xACA9, 0xACC3, prLVT}, // Lo [27] HANGUL SYLLABLE GYEOG..HANGUL SYLLABLE GYEOH + {0xACC4, 0xACC4, prLV}, // Lo HANGUL SYLLABLE GYE + {0xACC5, 0xACDF, prLVT}, // Lo [27] HANGUL SYLLABLE GYEG..HANGUL SYLLABLE GYEH + {0xACE0, 0xACE0, prLV}, // Lo HANGUL SYLLABLE GO + {0xACE1, 0xACFB, prLVT}, // Lo [27] HANGUL SYLLABLE GOG..HANGUL SYLLABLE GOH + {0xACFC, 0xACFC, prLV}, // Lo HANGUL SYLLABLE GWA + {0xACFD, 0xAD17, prLVT}, // Lo [27] HANGUL SYLLABLE GWAG..HANGUL SYLLABLE GWAH + {0xAD18, 0xAD18, prLV}, // Lo HANGUL SYLLABLE GWAE + {0xAD19, 0xAD33, prLVT}, // Lo [27] HANGUL SYLLABLE GWAEG..HANGUL SYLLABLE GWAEH + {0xAD34, 0xAD34, prLV}, // Lo HANGUL SYLLABLE GOE + {0xAD35, 0xAD4F, prLVT}, // Lo [27] HANGUL SYLLABLE GOEG..HANGUL SYLLABLE GOEH + {0xAD50, 0xAD50, prLV}, // Lo HANGUL SYLLABLE GYO + {0xAD51, 0xAD6B, prLVT}, // Lo [27] HANGUL SYLLABLE GYOG..HANGUL SYLLABLE GYOH + {0xAD6C, 0xAD6C, prLV}, // Lo HANGUL SYLLABLE GU + {0xAD6D, 0xAD87, prLVT}, // Lo [27] HANGUL SYLLABLE GUG..HANGUL SYLLABLE GUH + {0xAD88, 0xAD88, prLV}, // Lo HANGUL SYLLABLE GWEO + {0xAD89, 0xADA3, prLVT}, // Lo [27] HANGUL SYLLABLE GWEOG..HANGUL SYLLABLE GWEOH + {0xADA4, 0xADA4, prLV}, // Lo HANGUL SYLLABLE GWE + {0xADA5, 0xADBF, prLVT}, // Lo [27] HANGUL SYLLABLE GWEG..HANGUL SYLLABLE GWEH + {0xADC0, 0xADC0, prLV}, // Lo HANGUL SYLLABLE GWI + {0xADC1, 0xADDB, prLVT}, // Lo [27] HANGUL SYLLABLE GWIG..HANGUL SYLLABLE GWIH + {0xADDC, 0xADDC, prLV}, // Lo HANGUL SYLLABLE GYU + {0xADDD, 0xADF7, prLVT}, // Lo [27] HANGUL SYLLABLE GYUG..HANGUL SYLLABLE GYUH + {0xADF8, 0xADF8, prLV}, // Lo HANGUL SYLLABLE GEU + {0xADF9, 0xAE13, prLVT}, // Lo [27] HANGUL SYLLABLE GEUG..HANGUL SYLLABLE GEUH + {0xAE14, 0xAE14, prLV}, // Lo HANGUL SYLLABLE GYI + {0xAE15, 0xAE2F, prLVT}, // Lo [27] HANGUL SYLLABLE GYIG..HANGUL SYLLABLE GYIH + {0xAE30, 0xAE30, prLV}, // Lo HANGUL SYLLABLE GI + {0xAE31, 0xAE4B, prLVT}, // Lo [27] HANGUL SYLLABLE GIG..HANGUL SYLLABLE GIH + {0xAE4C, 0xAE4C, prLV}, // Lo HANGUL SYLLABLE GGA + {0xAE4D, 0xAE67, prLVT}, // Lo [27] HANGUL SYLLABLE GGAG..HANGUL SYLLABLE GGAH + {0xAE68, 0xAE68, prLV}, // Lo HANGUL SYLLABLE GGAE + {0xAE69, 0xAE83, prLVT}, // Lo [27] HANGUL SYLLABLE GGAEG..HANGUL SYLLABLE GGAEH + {0xAE84, 0xAE84, prLV}, // Lo HANGUL SYLLABLE GGYA + {0xAE85, 0xAE9F, prLVT}, // Lo [27] HANGUL SYLLABLE GGYAG..HANGUL SYLLABLE GGYAH + {0xAEA0, 0xAEA0, prLV}, // Lo HANGUL SYLLABLE GGYAE + {0xAEA1, 0xAEBB, prLVT}, // Lo [27] HANGUL SYLLABLE GGYAEG..HANGUL SYLLABLE GGYAEH + {0xAEBC, 0xAEBC, prLV}, // Lo HANGUL SYLLABLE GGEO + {0xAEBD, 0xAED7, prLVT}, // Lo [27] HANGUL SYLLABLE GGEOG..HANGUL SYLLABLE GGEOH + {0xAED8, 0xAED8, prLV}, // Lo HANGUL SYLLABLE GGE + {0xAED9, 0xAEF3, prLVT}, // Lo [27] HANGUL SYLLABLE GGEG..HANGUL SYLLABLE GGEH + {0xAEF4, 0xAEF4, prLV}, // Lo HANGUL SYLLABLE GGYEO + {0xAEF5, 0xAF0F, prLVT}, // Lo [27] HANGUL SYLLABLE GGYEOG..HANGUL SYLLABLE GGYEOH + {0xAF10, 0xAF10, prLV}, // Lo HANGUL SYLLABLE GGYE + {0xAF11, 0xAF2B, prLVT}, // Lo [27] HANGUL SYLLABLE GGYEG..HANGUL SYLLABLE GGYEH + {0xAF2C, 0xAF2C, prLV}, // Lo HANGUL SYLLABLE GGO + {0xAF2D, 0xAF47, prLVT}, // Lo [27] HANGUL SYLLABLE GGOG..HANGUL SYLLABLE GGOH + {0xAF48, 0xAF48, prLV}, // Lo HANGUL SYLLABLE GGWA + {0xAF49, 0xAF63, prLVT}, // Lo [27] HANGUL SYLLABLE GGWAG..HANGUL SYLLABLE GGWAH + {0xAF64, 0xAF64, prLV}, // Lo HANGUL SYLLABLE GGWAE + {0xAF65, 0xAF7F, prLVT}, // Lo [27] HANGUL SYLLABLE GGWAEG..HANGUL SYLLABLE GGWAEH + {0xAF80, 0xAF80, prLV}, // Lo HANGUL SYLLABLE GGOE + {0xAF81, 0xAF9B, prLVT}, // Lo [27] HANGUL SYLLABLE GGOEG..HANGUL SYLLABLE GGOEH + {0xAF9C, 0xAF9C, prLV}, // Lo HANGUL SYLLABLE GGYO + {0xAF9D, 0xAFB7, prLVT}, // Lo [27] HANGUL SYLLABLE GGYOG..HANGUL SYLLABLE GGYOH + {0xAFB8, 0xAFB8, prLV}, // Lo HANGUL SYLLABLE GGU + {0xAFB9, 0xAFD3, prLVT}, // Lo [27] HANGUL SYLLABLE GGUG..HANGUL SYLLABLE GGUH + {0xAFD4, 0xAFD4, prLV}, // Lo HANGUL SYLLABLE GGWEO + {0xAFD5, 0xAFEF, prLVT}, // Lo [27] HANGUL SYLLABLE GGWEOG..HANGUL SYLLABLE GGWEOH + {0xAFF0, 0xAFF0, prLV}, // Lo HANGUL SYLLABLE GGWE + {0xAFF1, 0xB00B, prLVT}, // Lo [27] HANGUL SYLLABLE GGWEG..HANGUL SYLLABLE GGWEH + {0xB00C, 0xB00C, prLV}, // Lo HANGUL SYLLABLE GGWI + {0xB00D, 0xB027, prLVT}, // Lo [27] HANGUL SYLLABLE GGWIG..HANGUL SYLLABLE GGWIH + {0xB028, 0xB028, prLV}, // Lo HANGUL SYLLABLE GGYU + {0xB029, 0xB043, prLVT}, // Lo [27] HANGUL SYLLABLE GGYUG..HANGUL SYLLABLE GGYUH + {0xB044, 0xB044, prLV}, // Lo HANGUL SYLLABLE GGEU + {0xB045, 0xB05F, prLVT}, // Lo [27] HANGUL SYLLABLE GGEUG..HANGUL SYLLABLE GGEUH + {0xB060, 0xB060, prLV}, // Lo HANGUL SYLLABLE GGYI + {0xB061, 0xB07B, prLVT}, // Lo [27] HANGUL SYLLABLE GGYIG..HANGUL SYLLABLE GGYIH + {0xB07C, 0xB07C, prLV}, // Lo HANGUL SYLLABLE GGI + {0xB07D, 0xB097, prLVT}, // Lo [27] HANGUL SYLLABLE GGIG..HANGUL SYLLABLE GGIH + {0xB098, 0xB098, prLV}, // Lo HANGUL SYLLABLE NA + {0xB099, 0xB0B3, prLVT}, // Lo [27] HANGUL SYLLABLE NAG..HANGUL SYLLABLE NAH + {0xB0B4, 0xB0B4, prLV}, // Lo HANGUL SYLLABLE NAE + {0xB0B5, 0xB0CF, prLVT}, // Lo [27] HANGUL SYLLABLE NAEG..HANGUL SYLLABLE NAEH + {0xB0D0, 0xB0D0, prLV}, // Lo HANGUL SYLLABLE NYA + {0xB0D1, 0xB0EB, prLVT}, // Lo [27] HANGUL SYLLABLE NYAG..HANGUL SYLLABLE NYAH + {0xB0EC, 0xB0EC, prLV}, // Lo HANGUL SYLLABLE NYAE + {0xB0ED, 0xB107, prLVT}, // Lo [27] HANGUL SYLLABLE NYAEG..HANGUL SYLLABLE NYAEH + {0xB108, 0xB108, prLV}, // Lo HANGUL SYLLABLE NEO + {0xB109, 0xB123, prLVT}, // Lo [27] HANGUL SYLLABLE NEOG..HANGUL SYLLABLE NEOH + {0xB124, 0xB124, prLV}, // Lo HANGUL SYLLABLE NE + {0xB125, 0xB13F, prLVT}, // Lo [27] HANGUL SYLLABLE NEG..HANGUL SYLLABLE NEH + {0xB140, 0xB140, prLV}, // Lo HANGUL SYLLABLE NYEO + {0xB141, 0xB15B, prLVT}, // Lo [27] HANGUL SYLLABLE NYEOG..HANGUL SYLLABLE NYEOH + {0xB15C, 0xB15C, prLV}, // Lo HANGUL SYLLABLE NYE + {0xB15D, 0xB177, prLVT}, // Lo [27] HANGUL SYLLABLE NYEG..HANGUL SYLLABLE NYEH + {0xB178, 0xB178, prLV}, // Lo HANGUL SYLLABLE NO + {0xB179, 0xB193, prLVT}, // Lo [27] HANGUL SYLLABLE NOG..HANGUL SYLLABLE NOH + {0xB194, 0xB194, prLV}, // Lo HANGUL SYLLABLE NWA + {0xB195, 0xB1AF, prLVT}, // Lo [27] HANGUL SYLLABLE NWAG..HANGUL SYLLABLE NWAH + {0xB1B0, 0xB1B0, prLV}, // Lo HANGUL SYLLABLE NWAE + {0xB1B1, 0xB1CB, prLVT}, // Lo [27] HANGUL SYLLABLE NWAEG..HANGUL SYLLABLE NWAEH + {0xB1CC, 0xB1CC, prLV}, // Lo HANGUL SYLLABLE NOE + {0xB1CD, 0xB1E7, prLVT}, // Lo [27] HANGUL SYLLABLE NOEG..HANGUL SYLLABLE NOEH + {0xB1E8, 0xB1E8, prLV}, // Lo HANGUL SYLLABLE NYO + {0xB1E9, 0xB203, prLVT}, // Lo [27] HANGUL SYLLABLE NYOG..HANGUL SYLLABLE NYOH + {0xB204, 0xB204, prLV}, // Lo HANGUL SYLLABLE NU + {0xB205, 0xB21F, prLVT}, // Lo [27] HANGUL SYLLABLE NUG..HANGUL SYLLABLE NUH + {0xB220, 0xB220, prLV}, // Lo HANGUL SYLLABLE NWEO + {0xB221, 0xB23B, prLVT}, // Lo [27] HANGUL SYLLABLE NWEOG..HANGUL SYLLABLE NWEOH + {0xB23C, 0xB23C, prLV}, // Lo HANGUL SYLLABLE NWE + {0xB23D, 0xB257, prLVT}, // Lo [27] HANGUL SYLLABLE NWEG..HANGUL SYLLABLE NWEH + {0xB258, 0xB258, prLV}, // Lo HANGUL SYLLABLE NWI + {0xB259, 0xB273, prLVT}, // Lo [27] HANGUL SYLLABLE NWIG..HANGUL SYLLABLE NWIH + {0xB274, 0xB274, prLV}, // Lo HANGUL SYLLABLE NYU + {0xB275, 0xB28F, prLVT}, // Lo [27] HANGUL SYLLABLE NYUG..HANGUL SYLLABLE NYUH + {0xB290, 0xB290, prLV}, // Lo HANGUL SYLLABLE NEU + {0xB291, 0xB2AB, prLVT}, // Lo [27] HANGUL SYLLABLE NEUG..HANGUL SYLLABLE NEUH + {0xB2AC, 0xB2AC, prLV}, // Lo HANGUL SYLLABLE NYI + {0xB2AD, 0xB2C7, prLVT}, // Lo [27] HANGUL SYLLABLE NYIG..HANGUL SYLLABLE NYIH + {0xB2C8, 0xB2C8, prLV}, // Lo HANGUL SYLLABLE NI + {0xB2C9, 0xB2E3, prLVT}, // Lo [27] HANGUL SYLLABLE NIG..HANGUL SYLLABLE NIH + {0xB2E4, 0xB2E4, prLV}, // Lo HANGUL SYLLABLE DA + {0xB2E5, 0xB2FF, prLVT}, // Lo [27] HANGUL SYLLABLE DAG..HANGUL SYLLABLE DAH + {0xB300, 0xB300, prLV}, // Lo HANGUL SYLLABLE DAE + {0xB301, 0xB31B, prLVT}, // Lo [27] HANGUL SYLLABLE DAEG..HANGUL SYLLABLE DAEH + {0xB31C, 0xB31C, prLV}, // Lo HANGUL SYLLABLE DYA + {0xB31D, 0xB337, prLVT}, // Lo [27] HANGUL SYLLABLE DYAG..HANGUL SYLLABLE DYAH + {0xB338, 0xB338, prLV}, // Lo HANGUL SYLLABLE DYAE + {0xB339, 0xB353, prLVT}, // Lo [27] HANGUL SYLLABLE DYAEG..HANGUL SYLLABLE DYAEH + {0xB354, 0xB354, prLV}, // Lo HANGUL SYLLABLE DEO + {0xB355, 0xB36F, prLVT}, // Lo [27] HANGUL SYLLABLE DEOG..HANGUL SYLLABLE DEOH + {0xB370, 0xB370, prLV}, // Lo HANGUL SYLLABLE DE + {0xB371, 0xB38B, prLVT}, // Lo [27] HANGUL SYLLABLE DEG..HANGUL SYLLABLE DEH + {0xB38C, 0xB38C, prLV}, // Lo HANGUL SYLLABLE DYEO + {0xB38D, 0xB3A7, prLVT}, // Lo [27] HANGUL SYLLABLE DYEOG..HANGUL SYLLABLE DYEOH + {0xB3A8, 0xB3A8, prLV}, // Lo HANGUL SYLLABLE DYE + {0xB3A9, 0xB3C3, prLVT}, // Lo [27] HANGUL SYLLABLE DYEG..HANGUL SYLLABLE DYEH + {0xB3C4, 0xB3C4, prLV}, // Lo HANGUL SYLLABLE DO + {0xB3C5, 0xB3DF, prLVT}, // Lo [27] HANGUL SYLLABLE DOG..HANGUL SYLLABLE DOH + {0xB3E0, 0xB3E0, prLV}, // Lo HANGUL SYLLABLE DWA + {0xB3E1, 0xB3FB, prLVT}, // Lo [27] HANGUL SYLLABLE DWAG..HANGUL SYLLABLE DWAH + {0xB3FC, 0xB3FC, prLV}, // Lo HANGUL SYLLABLE DWAE + {0xB3FD, 0xB417, prLVT}, // Lo [27] HANGUL SYLLABLE DWAEG..HANGUL SYLLABLE DWAEH + {0xB418, 0xB418, prLV}, // Lo HANGUL SYLLABLE DOE + {0xB419, 0xB433, prLVT}, // Lo [27] HANGUL SYLLABLE DOEG..HANGUL SYLLABLE DOEH + {0xB434, 0xB434, prLV}, // Lo HANGUL SYLLABLE DYO + {0xB435, 0xB44F, prLVT}, // Lo [27] HANGUL SYLLABLE DYOG..HANGUL SYLLABLE DYOH + {0xB450, 0xB450, prLV}, // Lo HANGUL SYLLABLE DU + {0xB451, 0xB46B, prLVT}, // Lo [27] HANGUL SYLLABLE DUG..HANGUL SYLLABLE DUH + {0xB46C, 0xB46C, prLV}, // Lo HANGUL SYLLABLE DWEO + {0xB46D, 0xB487, prLVT}, // Lo [27] HANGUL SYLLABLE DWEOG..HANGUL SYLLABLE DWEOH + {0xB488, 0xB488, prLV}, // Lo HANGUL SYLLABLE DWE + {0xB489, 0xB4A3, prLVT}, // Lo [27] HANGUL SYLLABLE DWEG..HANGUL SYLLABLE DWEH + {0xB4A4, 0xB4A4, prLV}, // Lo HANGUL SYLLABLE DWI + {0xB4A5, 0xB4BF, prLVT}, // Lo [27] HANGUL SYLLABLE DWIG..HANGUL SYLLABLE DWIH + {0xB4C0, 0xB4C0, prLV}, // Lo HANGUL SYLLABLE DYU + {0xB4C1, 0xB4DB, prLVT}, // Lo [27] HANGUL SYLLABLE DYUG..HANGUL SYLLABLE DYUH + {0xB4DC, 0xB4DC, prLV}, // Lo HANGUL SYLLABLE DEU + {0xB4DD, 0xB4F7, prLVT}, // Lo [27] HANGUL SYLLABLE DEUG..HANGUL SYLLABLE DEUH + {0xB4F8, 0xB4F8, prLV}, // Lo HANGUL SYLLABLE DYI + {0xB4F9, 0xB513, prLVT}, // Lo [27] HANGUL SYLLABLE DYIG..HANGUL SYLLABLE DYIH + {0xB514, 0xB514, prLV}, // Lo HANGUL SYLLABLE DI + {0xB515, 0xB52F, prLVT}, // Lo [27] HANGUL SYLLABLE DIG..HANGUL SYLLABLE DIH + {0xB530, 0xB530, prLV}, // Lo HANGUL SYLLABLE DDA + {0xB531, 0xB54B, prLVT}, // Lo [27] HANGUL SYLLABLE DDAG..HANGUL SYLLABLE DDAH + {0xB54C, 0xB54C, prLV}, // Lo HANGUL SYLLABLE DDAE + {0xB54D, 0xB567, prLVT}, // Lo [27] HANGUL SYLLABLE DDAEG..HANGUL SYLLABLE DDAEH + {0xB568, 0xB568, prLV}, // Lo HANGUL SYLLABLE DDYA + {0xB569, 0xB583, prLVT}, // Lo [27] HANGUL SYLLABLE DDYAG..HANGUL SYLLABLE DDYAH + {0xB584, 0xB584, prLV}, // Lo HANGUL SYLLABLE DDYAE + {0xB585, 0xB59F, prLVT}, // Lo [27] HANGUL SYLLABLE DDYAEG..HANGUL SYLLABLE DDYAEH + {0xB5A0, 0xB5A0, prLV}, // Lo HANGUL SYLLABLE DDEO + {0xB5A1, 0xB5BB, prLVT}, // Lo [27] HANGUL SYLLABLE DDEOG..HANGUL SYLLABLE DDEOH + {0xB5BC, 0xB5BC, prLV}, // Lo HANGUL SYLLABLE DDE + {0xB5BD, 0xB5D7, prLVT}, // Lo [27] HANGUL SYLLABLE DDEG..HANGUL SYLLABLE DDEH + {0xB5D8, 0xB5D8, prLV}, // Lo HANGUL SYLLABLE DDYEO + {0xB5D9, 0xB5F3, prLVT}, // Lo [27] HANGUL SYLLABLE DDYEOG..HANGUL SYLLABLE DDYEOH + {0xB5F4, 0xB5F4, prLV}, // Lo HANGUL SYLLABLE DDYE + {0xB5F5, 0xB60F, prLVT}, // Lo [27] HANGUL SYLLABLE DDYEG..HANGUL SYLLABLE DDYEH + {0xB610, 0xB610, prLV}, // Lo HANGUL SYLLABLE DDO + {0xB611, 0xB62B, prLVT}, // Lo [27] HANGUL SYLLABLE DDOG..HANGUL SYLLABLE DDOH + {0xB62C, 0xB62C, prLV}, // Lo HANGUL SYLLABLE DDWA + {0xB62D, 0xB647, prLVT}, // Lo [27] HANGUL SYLLABLE DDWAG..HANGUL SYLLABLE DDWAH + {0xB648, 0xB648, prLV}, // Lo HANGUL SYLLABLE DDWAE + {0xB649, 0xB663, prLVT}, // Lo [27] HANGUL SYLLABLE DDWAEG..HANGUL SYLLABLE DDWAEH + {0xB664, 0xB664, prLV}, // Lo HANGUL SYLLABLE DDOE + {0xB665, 0xB67F, prLVT}, // Lo [27] HANGUL SYLLABLE DDOEG..HANGUL SYLLABLE DDOEH + {0xB680, 0xB680, prLV}, // Lo HANGUL SYLLABLE DDYO + {0xB681, 0xB69B, prLVT}, // Lo [27] HANGUL SYLLABLE DDYOG..HANGUL SYLLABLE DDYOH + {0xB69C, 0xB69C, prLV}, // Lo HANGUL SYLLABLE DDU + {0xB69D, 0xB6B7, prLVT}, // Lo [27] HANGUL SYLLABLE DDUG..HANGUL SYLLABLE DDUH + {0xB6B8, 0xB6B8, prLV}, // Lo HANGUL SYLLABLE DDWEO + {0xB6B9, 0xB6D3, prLVT}, // Lo [27] HANGUL SYLLABLE DDWEOG..HANGUL SYLLABLE DDWEOH + {0xB6D4, 0xB6D4, prLV}, // Lo HANGUL SYLLABLE DDWE + {0xB6D5, 0xB6EF, prLVT}, // Lo [27] HANGUL SYLLABLE DDWEG..HANGUL SYLLABLE DDWEH + {0xB6F0, 0xB6F0, prLV}, // Lo HANGUL SYLLABLE DDWI + {0xB6F1, 0xB70B, prLVT}, // Lo [27] HANGUL SYLLABLE DDWIG..HANGUL SYLLABLE DDWIH + {0xB70C, 0xB70C, prLV}, // Lo HANGUL SYLLABLE DDYU + {0xB70D, 0xB727, prLVT}, // Lo [27] HANGUL SYLLABLE DDYUG..HANGUL SYLLABLE DDYUH + {0xB728, 0xB728, prLV}, // Lo HANGUL SYLLABLE DDEU + {0xB729, 0xB743, prLVT}, // Lo [27] HANGUL SYLLABLE DDEUG..HANGUL SYLLABLE DDEUH + {0xB744, 0xB744, prLV}, // Lo HANGUL SYLLABLE DDYI + {0xB745, 0xB75F, prLVT}, // Lo [27] HANGUL SYLLABLE DDYIG..HANGUL SYLLABLE DDYIH + {0xB760, 0xB760, prLV}, // Lo HANGUL SYLLABLE DDI + {0xB761, 0xB77B, prLVT}, // Lo [27] HANGUL SYLLABLE DDIG..HANGUL SYLLABLE DDIH + {0xB77C, 0xB77C, prLV}, // Lo HANGUL SYLLABLE RA + {0xB77D, 0xB797, prLVT}, // Lo [27] HANGUL SYLLABLE RAG..HANGUL SYLLABLE RAH + {0xB798, 0xB798, prLV}, // Lo HANGUL SYLLABLE RAE + {0xB799, 0xB7B3, prLVT}, // Lo [27] HANGUL SYLLABLE RAEG..HANGUL SYLLABLE RAEH + {0xB7B4, 0xB7B4, prLV}, // Lo HANGUL SYLLABLE RYA + {0xB7B5, 0xB7CF, prLVT}, // Lo [27] HANGUL SYLLABLE RYAG..HANGUL SYLLABLE RYAH + {0xB7D0, 0xB7D0, prLV}, // Lo HANGUL SYLLABLE RYAE + {0xB7D1, 0xB7EB, prLVT}, // Lo [27] HANGUL SYLLABLE RYAEG..HANGUL SYLLABLE RYAEH + {0xB7EC, 0xB7EC, prLV}, // Lo HANGUL SYLLABLE REO + {0xB7ED, 0xB807, prLVT}, // Lo [27] HANGUL SYLLABLE REOG..HANGUL SYLLABLE REOH + {0xB808, 0xB808, prLV}, // Lo HANGUL SYLLABLE RE + {0xB809, 0xB823, prLVT}, // Lo [27] HANGUL SYLLABLE REG..HANGUL SYLLABLE REH + {0xB824, 0xB824, prLV}, // Lo HANGUL SYLLABLE RYEO + {0xB825, 0xB83F, prLVT}, // Lo [27] HANGUL SYLLABLE RYEOG..HANGUL SYLLABLE RYEOH + {0xB840, 0xB840, prLV}, // Lo HANGUL SYLLABLE RYE + {0xB841, 0xB85B, prLVT}, // Lo [27] HANGUL SYLLABLE RYEG..HANGUL SYLLABLE RYEH + {0xB85C, 0xB85C, prLV}, // Lo HANGUL SYLLABLE RO + {0xB85D, 0xB877, prLVT}, // Lo [27] HANGUL SYLLABLE ROG..HANGUL SYLLABLE ROH + {0xB878, 0xB878, prLV}, // Lo HANGUL SYLLABLE RWA + {0xB879, 0xB893, prLVT}, // Lo [27] HANGUL SYLLABLE RWAG..HANGUL SYLLABLE RWAH + {0xB894, 0xB894, prLV}, // Lo HANGUL SYLLABLE RWAE + {0xB895, 0xB8AF, prLVT}, // Lo [27] HANGUL SYLLABLE RWAEG..HANGUL SYLLABLE RWAEH + {0xB8B0, 0xB8B0, prLV}, // Lo HANGUL SYLLABLE ROE + {0xB8B1, 0xB8CB, prLVT}, // Lo [27] HANGUL SYLLABLE ROEG..HANGUL SYLLABLE ROEH + {0xB8CC, 0xB8CC, prLV}, // Lo HANGUL SYLLABLE RYO + {0xB8CD, 0xB8E7, prLVT}, // Lo [27] HANGUL SYLLABLE RYOG..HANGUL SYLLABLE RYOH + {0xB8E8, 0xB8E8, prLV}, // Lo HANGUL SYLLABLE RU + {0xB8E9, 0xB903, prLVT}, // Lo [27] HANGUL SYLLABLE RUG..HANGUL SYLLABLE RUH + {0xB904, 0xB904, prLV}, // Lo HANGUL SYLLABLE RWEO + {0xB905, 0xB91F, prLVT}, // Lo [27] HANGUL SYLLABLE RWEOG..HANGUL SYLLABLE RWEOH + {0xB920, 0xB920, prLV}, // Lo HANGUL SYLLABLE RWE + {0xB921, 0xB93B, prLVT}, // Lo [27] HANGUL SYLLABLE RWEG..HANGUL SYLLABLE RWEH + {0xB93C, 0xB93C, prLV}, // Lo HANGUL SYLLABLE RWI + {0xB93D, 0xB957, prLVT}, // Lo [27] HANGUL SYLLABLE RWIG..HANGUL SYLLABLE RWIH + {0xB958, 0xB958, prLV}, // Lo HANGUL SYLLABLE RYU + {0xB959, 0xB973, prLVT}, // Lo [27] HANGUL SYLLABLE RYUG..HANGUL SYLLABLE RYUH + {0xB974, 0xB974, prLV}, // Lo HANGUL SYLLABLE REU + {0xB975, 0xB98F, prLVT}, // Lo [27] HANGUL SYLLABLE REUG..HANGUL SYLLABLE REUH + {0xB990, 0xB990, prLV}, // Lo HANGUL SYLLABLE RYI + {0xB991, 0xB9AB, prLVT}, // Lo [27] HANGUL SYLLABLE RYIG..HANGUL SYLLABLE RYIH + {0xB9AC, 0xB9AC, prLV}, // Lo HANGUL SYLLABLE RI + {0xB9AD, 0xB9C7, prLVT}, // Lo [27] HANGUL SYLLABLE RIG..HANGUL SYLLABLE RIH + {0xB9C8, 0xB9C8, prLV}, // Lo HANGUL SYLLABLE MA + {0xB9C9, 0xB9E3, prLVT}, // Lo [27] HANGUL SYLLABLE MAG..HANGUL SYLLABLE MAH + {0xB9E4, 0xB9E4, prLV}, // Lo HANGUL SYLLABLE MAE + {0xB9E5, 0xB9FF, prLVT}, // Lo [27] HANGUL SYLLABLE MAEG..HANGUL SYLLABLE MAEH + {0xBA00, 0xBA00, prLV}, // Lo HANGUL SYLLABLE MYA + {0xBA01, 0xBA1B, prLVT}, // Lo [27] HANGUL SYLLABLE MYAG..HANGUL SYLLABLE MYAH + {0xBA1C, 0xBA1C, prLV}, // Lo HANGUL SYLLABLE MYAE + {0xBA1D, 0xBA37, prLVT}, // Lo [27] HANGUL SYLLABLE MYAEG..HANGUL SYLLABLE MYAEH + {0xBA38, 0xBA38, prLV}, // Lo HANGUL SYLLABLE MEO + {0xBA39, 0xBA53, prLVT}, // Lo [27] HANGUL SYLLABLE MEOG..HANGUL SYLLABLE MEOH + {0xBA54, 0xBA54, prLV}, // Lo HANGUL SYLLABLE ME + {0xBA55, 0xBA6F, prLVT}, // Lo [27] HANGUL SYLLABLE MEG..HANGUL SYLLABLE MEH + {0xBA70, 0xBA70, prLV}, // Lo HANGUL SYLLABLE MYEO + {0xBA71, 0xBA8B, prLVT}, // Lo [27] HANGUL SYLLABLE MYEOG..HANGUL SYLLABLE MYEOH + {0xBA8C, 0xBA8C, prLV}, // Lo HANGUL SYLLABLE MYE + {0xBA8D, 0xBAA7, prLVT}, // Lo [27] HANGUL SYLLABLE MYEG..HANGUL SYLLABLE MYEH + {0xBAA8, 0xBAA8, prLV}, // Lo HANGUL SYLLABLE MO + {0xBAA9, 0xBAC3, prLVT}, // Lo [27] HANGUL SYLLABLE MOG..HANGUL SYLLABLE MOH + {0xBAC4, 0xBAC4, prLV}, // Lo HANGUL SYLLABLE MWA + {0xBAC5, 0xBADF, prLVT}, // Lo [27] HANGUL SYLLABLE MWAG..HANGUL SYLLABLE MWAH + {0xBAE0, 0xBAE0, prLV}, // Lo HANGUL SYLLABLE MWAE + {0xBAE1, 0xBAFB, prLVT}, // Lo [27] HANGUL SYLLABLE MWAEG..HANGUL SYLLABLE MWAEH + {0xBAFC, 0xBAFC, prLV}, // Lo HANGUL SYLLABLE MOE + {0xBAFD, 0xBB17, prLVT}, // Lo [27] HANGUL SYLLABLE MOEG..HANGUL SYLLABLE MOEH + {0xBB18, 0xBB18, prLV}, // Lo HANGUL SYLLABLE MYO + {0xBB19, 0xBB33, prLVT}, // Lo [27] HANGUL SYLLABLE MYOG..HANGUL SYLLABLE MYOH + {0xBB34, 0xBB34, prLV}, // Lo HANGUL SYLLABLE MU + {0xBB35, 0xBB4F, prLVT}, // Lo [27] HANGUL SYLLABLE MUG..HANGUL SYLLABLE MUH + {0xBB50, 0xBB50, prLV}, // Lo HANGUL SYLLABLE MWEO + {0xBB51, 0xBB6B, prLVT}, // Lo [27] HANGUL SYLLABLE MWEOG..HANGUL SYLLABLE MWEOH + {0xBB6C, 0xBB6C, prLV}, // Lo HANGUL SYLLABLE MWE + {0xBB6D, 0xBB87, prLVT}, // Lo [27] HANGUL SYLLABLE MWEG..HANGUL SYLLABLE MWEH + {0xBB88, 0xBB88, prLV}, // Lo HANGUL SYLLABLE MWI + {0xBB89, 0xBBA3, prLVT}, // Lo [27] HANGUL SYLLABLE MWIG..HANGUL SYLLABLE MWIH + {0xBBA4, 0xBBA4, prLV}, // Lo HANGUL SYLLABLE MYU + {0xBBA5, 0xBBBF, prLVT}, // Lo [27] HANGUL SYLLABLE MYUG..HANGUL SYLLABLE MYUH + {0xBBC0, 0xBBC0, prLV}, // Lo HANGUL SYLLABLE MEU + {0xBBC1, 0xBBDB, prLVT}, // Lo [27] HANGUL SYLLABLE MEUG..HANGUL SYLLABLE MEUH + {0xBBDC, 0xBBDC, prLV}, // Lo HANGUL SYLLABLE MYI + {0xBBDD, 0xBBF7, prLVT}, // Lo [27] HANGUL SYLLABLE MYIG..HANGUL SYLLABLE MYIH + {0xBBF8, 0xBBF8, prLV}, // Lo HANGUL SYLLABLE MI + {0xBBF9, 0xBC13, prLVT}, // Lo [27] HANGUL SYLLABLE MIG..HANGUL SYLLABLE MIH + {0xBC14, 0xBC14, prLV}, // Lo HANGUL SYLLABLE BA + {0xBC15, 0xBC2F, prLVT}, // Lo [27] HANGUL SYLLABLE BAG..HANGUL SYLLABLE BAH + {0xBC30, 0xBC30, prLV}, // Lo HANGUL SYLLABLE BAE + {0xBC31, 0xBC4B, prLVT}, // Lo [27] HANGUL SYLLABLE BAEG..HANGUL SYLLABLE BAEH + {0xBC4C, 0xBC4C, prLV}, // Lo HANGUL SYLLABLE BYA + {0xBC4D, 0xBC67, prLVT}, // Lo [27] HANGUL SYLLABLE BYAG..HANGUL SYLLABLE BYAH + {0xBC68, 0xBC68, prLV}, // Lo HANGUL SYLLABLE BYAE + {0xBC69, 0xBC83, prLVT}, // Lo [27] HANGUL SYLLABLE BYAEG..HANGUL SYLLABLE BYAEH + {0xBC84, 0xBC84, prLV}, // Lo HANGUL SYLLABLE BEO + {0xBC85, 0xBC9F, prLVT}, // Lo [27] HANGUL SYLLABLE BEOG..HANGUL SYLLABLE BEOH + {0xBCA0, 0xBCA0, prLV}, // Lo HANGUL SYLLABLE BE + {0xBCA1, 0xBCBB, prLVT}, // Lo [27] HANGUL SYLLABLE BEG..HANGUL SYLLABLE BEH + {0xBCBC, 0xBCBC, prLV}, // Lo HANGUL SYLLABLE BYEO + {0xBCBD, 0xBCD7, prLVT}, // Lo [27] HANGUL SYLLABLE BYEOG..HANGUL SYLLABLE BYEOH + {0xBCD8, 0xBCD8, prLV}, // Lo HANGUL SYLLABLE BYE + {0xBCD9, 0xBCF3, prLVT}, // Lo [27] HANGUL SYLLABLE BYEG..HANGUL SYLLABLE BYEH + {0xBCF4, 0xBCF4, prLV}, // Lo HANGUL SYLLABLE BO + {0xBCF5, 0xBD0F, prLVT}, // Lo [27] HANGUL SYLLABLE BOG..HANGUL SYLLABLE BOH + {0xBD10, 0xBD10, prLV}, // Lo HANGUL SYLLABLE BWA + {0xBD11, 0xBD2B, prLVT}, // Lo [27] HANGUL SYLLABLE BWAG..HANGUL SYLLABLE BWAH + {0xBD2C, 0xBD2C, prLV}, // Lo HANGUL SYLLABLE BWAE + {0xBD2D, 0xBD47, prLVT}, // Lo [27] HANGUL SYLLABLE BWAEG..HANGUL SYLLABLE BWAEH + {0xBD48, 0xBD48, prLV}, // Lo HANGUL SYLLABLE BOE + {0xBD49, 0xBD63, prLVT}, // Lo [27] HANGUL SYLLABLE BOEG..HANGUL SYLLABLE BOEH + {0xBD64, 0xBD64, prLV}, // Lo HANGUL SYLLABLE BYO + {0xBD65, 0xBD7F, prLVT}, // Lo [27] HANGUL SYLLABLE BYOG..HANGUL SYLLABLE BYOH + {0xBD80, 0xBD80, prLV}, // Lo HANGUL SYLLABLE BU + {0xBD81, 0xBD9B, prLVT}, // Lo [27] HANGUL SYLLABLE BUG..HANGUL SYLLABLE BUH + {0xBD9C, 0xBD9C, prLV}, // Lo HANGUL SYLLABLE BWEO + {0xBD9D, 0xBDB7, prLVT}, // Lo [27] HANGUL SYLLABLE BWEOG..HANGUL SYLLABLE BWEOH + {0xBDB8, 0xBDB8, prLV}, // Lo HANGUL SYLLABLE BWE + {0xBDB9, 0xBDD3, prLVT}, // Lo [27] HANGUL SYLLABLE BWEG..HANGUL SYLLABLE BWEH + {0xBDD4, 0xBDD4, prLV}, // Lo HANGUL SYLLABLE BWI + {0xBDD5, 0xBDEF, prLVT}, // Lo [27] HANGUL SYLLABLE BWIG..HANGUL SYLLABLE BWIH + {0xBDF0, 0xBDF0, prLV}, // Lo HANGUL SYLLABLE BYU + {0xBDF1, 0xBE0B, prLVT}, // Lo [27] HANGUL SYLLABLE BYUG..HANGUL SYLLABLE BYUH + {0xBE0C, 0xBE0C, prLV}, // Lo HANGUL SYLLABLE BEU + {0xBE0D, 0xBE27, prLVT}, // Lo [27] HANGUL SYLLABLE BEUG..HANGUL SYLLABLE BEUH + {0xBE28, 0xBE28, prLV}, // Lo HANGUL SYLLABLE BYI + {0xBE29, 0xBE43, prLVT}, // Lo [27] HANGUL SYLLABLE BYIG..HANGUL SYLLABLE BYIH + {0xBE44, 0xBE44, prLV}, // Lo HANGUL SYLLABLE BI + {0xBE45, 0xBE5F, prLVT}, // Lo [27] HANGUL SYLLABLE BIG..HANGUL SYLLABLE BIH + {0xBE60, 0xBE60, prLV}, // Lo HANGUL SYLLABLE BBA + {0xBE61, 0xBE7B, prLVT}, // Lo [27] HANGUL SYLLABLE BBAG..HANGUL SYLLABLE BBAH + {0xBE7C, 0xBE7C, prLV}, // Lo HANGUL SYLLABLE BBAE + {0xBE7D, 0xBE97, prLVT}, // Lo [27] HANGUL SYLLABLE BBAEG..HANGUL SYLLABLE BBAEH + {0xBE98, 0xBE98, prLV}, // Lo HANGUL SYLLABLE BBYA + {0xBE99, 0xBEB3, prLVT}, // Lo [27] HANGUL SYLLABLE BBYAG..HANGUL SYLLABLE BBYAH + {0xBEB4, 0xBEB4, prLV}, // Lo HANGUL SYLLABLE BBYAE + {0xBEB5, 0xBECF, prLVT}, // Lo [27] HANGUL SYLLABLE BBYAEG..HANGUL SYLLABLE BBYAEH + {0xBED0, 0xBED0, prLV}, // Lo HANGUL SYLLABLE BBEO + {0xBED1, 0xBEEB, prLVT}, // Lo [27] HANGUL SYLLABLE BBEOG..HANGUL SYLLABLE BBEOH + {0xBEEC, 0xBEEC, prLV}, // Lo HANGUL SYLLABLE BBE + {0xBEED, 0xBF07, prLVT}, // Lo [27] HANGUL SYLLABLE BBEG..HANGUL SYLLABLE BBEH + {0xBF08, 0xBF08, prLV}, // Lo HANGUL SYLLABLE BBYEO + {0xBF09, 0xBF23, prLVT}, // Lo [27] HANGUL SYLLABLE BBYEOG..HANGUL SYLLABLE BBYEOH + {0xBF24, 0xBF24, prLV}, // Lo HANGUL SYLLABLE BBYE + {0xBF25, 0xBF3F, prLVT}, // Lo [27] HANGUL SYLLABLE BBYEG..HANGUL SYLLABLE BBYEH + {0xBF40, 0xBF40, prLV}, // Lo HANGUL SYLLABLE BBO + {0xBF41, 0xBF5B, prLVT}, // Lo [27] HANGUL SYLLABLE BBOG..HANGUL SYLLABLE BBOH + {0xBF5C, 0xBF5C, prLV}, // Lo HANGUL SYLLABLE BBWA + {0xBF5D, 0xBF77, prLVT}, // Lo [27] HANGUL SYLLABLE BBWAG..HANGUL SYLLABLE BBWAH + {0xBF78, 0xBF78, prLV}, // Lo HANGUL SYLLABLE BBWAE + {0xBF79, 0xBF93, prLVT}, // Lo [27] HANGUL SYLLABLE BBWAEG..HANGUL SYLLABLE BBWAEH + {0xBF94, 0xBF94, prLV}, // Lo HANGUL SYLLABLE BBOE + {0xBF95, 0xBFAF, prLVT}, // Lo [27] HANGUL SYLLABLE BBOEG..HANGUL SYLLABLE BBOEH + {0xBFB0, 0xBFB0, prLV}, // Lo HANGUL SYLLABLE BBYO + {0xBFB1, 0xBFCB, prLVT}, // Lo [27] HANGUL SYLLABLE BBYOG..HANGUL SYLLABLE BBYOH + {0xBFCC, 0xBFCC, prLV}, // Lo HANGUL SYLLABLE BBU + {0xBFCD, 0xBFE7, prLVT}, // Lo [27] HANGUL SYLLABLE BBUG..HANGUL SYLLABLE BBUH + {0xBFE8, 0xBFE8, prLV}, // Lo HANGUL SYLLABLE BBWEO + {0xBFE9, 0xC003, prLVT}, // Lo [27] HANGUL SYLLABLE BBWEOG..HANGUL SYLLABLE BBWEOH + {0xC004, 0xC004, prLV}, // Lo HANGUL SYLLABLE BBWE + {0xC005, 0xC01F, prLVT}, // Lo [27] HANGUL SYLLABLE BBWEG..HANGUL SYLLABLE BBWEH + {0xC020, 0xC020, prLV}, // Lo HANGUL SYLLABLE BBWI + {0xC021, 0xC03B, prLVT}, // Lo [27] HANGUL SYLLABLE BBWIG..HANGUL SYLLABLE BBWIH + {0xC03C, 0xC03C, prLV}, // Lo HANGUL SYLLABLE BBYU + {0xC03D, 0xC057, prLVT}, // Lo [27] HANGUL SYLLABLE BBYUG..HANGUL SYLLABLE BBYUH + {0xC058, 0xC058, prLV}, // Lo HANGUL SYLLABLE BBEU + {0xC059, 0xC073, prLVT}, // Lo [27] HANGUL SYLLABLE BBEUG..HANGUL SYLLABLE BBEUH + {0xC074, 0xC074, prLV}, // Lo HANGUL SYLLABLE BBYI + {0xC075, 0xC08F, prLVT}, // Lo [27] HANGUL SYLLABLE BBYIG..HANGUL SYLLABLE BBYIH + {0xC090, 0xC090, prLV}, // Lo HANGUL SYLLABLE BBI + {0xC091, 0xC0AB, prLVT}, // Lo [27] HANGUL SYLLABLE BBIG..HANGUL SYLLABLE BBIH + {0xC0AC, 0xC0AC, prLV}, // Lo HANGUL SYLLABLE SA + {0xC0AD, 0xC0C7, prLVT}, // Lo [27] HANGUL SYLLABLE SAG..HANGUL SYLLABLE SAH + {0xC0C8, 0xC0C8, prLV}, // Lo HANGUL SYLLABLE SAE + {0xC0C9, 0xC0E3, prLVT}, // Lo [27] HANGUL SYLLABLE SAEG..HANGUL SYLLABLE SAEH + {0xC0E4, 0xC0E4, prLV}, // Lo HANGUL SYLLABLE SYA + {0xC0E5, 0xC0FF, prLVT}, // Lo [27] HANGUL SYLLABLE SYAG..HANGUL SYLLABLE SYAH + {0xC100, 0xC100, prLV}, // Lo HANGUL SYLLABLE SYAE + {0xC101, 0xC11B, prLVT}, // Lo [27] HANGUL SYLLABLE SYAEG..HANGUL SYLLABLE SYAEH + {0xC11C, 0xC11C, prLV}, // Lo HANGUL SYLLABLE SEO + {0xC11D, 0xC137, prLVT}, // Lo [27] HANGUL SYLLABLE SEOG..HANGUL SYLLABLE SEOH + {0xC138, 0xC138, prLV}, // Lo HANGUL SYLLABLE SE + {0xC139, 0xC153, prLVT}, // Lo [27] HANGUL SYLLABLE SEG..HANGUL SYLLABLE SEH + {0xC154, 0xC154, prLV}, // Lo HANGUL SYLLABLE SYEO + {0xC155, 0xC16F, prLVT}, // Lo [27] HANGUL SYLLABLE SYEOG..HANGUL SYLLABLE SYEOH + {0xC170, 0xC170, prLV}, // Lo HANGUL SYLLABLE SYE + {0xC171, 0xC18B, prLVT}, // Lo [27] HANGUL SYLLABLE SYEG..HANGUL SYLLABLE SYEH + {0xC18C, 0xC18C, prLV}, // Lo HANGUL SYLLABLE SO + {0xC18D, 0xC1A7, prLVT}, // Lo [27] HANGUL SYLLABLE SOG..HANGUL SYLLABLE SOH + {0xC1A8, 0xC1A8, prLV}, // Lo HANGUL SYLLABLE SWA + {0xC1A9, 0xC1C3, prLVT}, // Lo [27] HANGUL SYLLABLE SWAG..HANGUL SYLLABLE SWAH + {0xC1C4, 0xC1C4, prLV}, // Lo HANGUL SYLLABLE SWAE + {0xC1C5, 0xC1DF, prLVT}, // Lo [27] HANGUL SYLLABLE SWAEG..HANGUL SYLLABLE SWAEH + {0xC1E0, 0xC1E0, prLV}, // Lo HANGUL SYLLABLE SOE + {0xC1E1, 0xC1FB, prLVT}, // Lo [27] HANGUL SYLLABLE SOEG..HANGUL SYLLABLE SOEH + {0xC1FC, 0xC1FC, prLV}, // Lo HANGUL SYLLABLE SYO + {0xC1FD, 0xC217, prLVT}, // Lo [27] HANGUL SYLLABLE SYOG..HANGUL SYLLABLE SYOH + {0xC218, 0xC218, prLV}, // Lo HANGUL SYLLABLE SU + {0xC219, 0xC233, prLVT}, // Lo [27] HANGUL SYLLABLE SUG..HANGUL SYLLABLE SUH + {0xC234, 0xC234, prLV}, // Lo HANGUL SYLLABLE SWEO + {0xC235, 0xC24F, prLVT}, // Lo [27] HANGUL SYLLABLE SWEOG..HANGUL SYLLABLE SWEOH + {0xC250, 0xC250, prLV}, // Lo HANGUL SYLLABLE SWE + {0xC251, 0xC26B, prLVT}, // Lo [27] HANGUL SYLLABLE SWEG..HANGUL SYLLABLE SWEH + {0xC26C, 0xC26C, prLV}, // Lo HANGUL SYLLABLE SWI + {0xC26D, 0xC287, prLVT}, // Lo [27] HANGUL SYLLABLE SWIG..HANGUL SYLLABLE SWIH + {0xC288, 0xC288, prLV}, // Lo HANGUL SYLLABLE SYU + {0xC289, 0xC2A3, prLVT}, // Lo [27] HANGUL SYLLABLE SYUG..HANGUL SYLLABLE SYUH + {0xC2A4, 0xC2A4, prLV}, // Lo HANGUL SYLLABLE SEU + {0xC2A5, 0xC2BF, prLVT}, // Lo [27] HANGUL SYLLABLE SEUG..HANGUL SYLLABLE SEUH + {0xC2C0, 0xC2C0, prLV}, // Lo HANGUL SYLLABLE SYI + {0xC2C1, 0xC2DB, prLVT}, // Lo [27] HANGUL SYLLABLE SYIG..HANGUL SYLLABLE SYIH + {0xC2DC, 0xC2DC, prLV}, // Lo HANGUL SYLLABLE SI + {0xC2DD, 0xC2F7, prLVT}, // Lo [27] HANGUL SYLLABLE SIG..HANGUL SYLLABLE SIH + {0xC2F8, 0xC2F8, prLV}, // Lo HANGUL SYLLABLE SSA + {0xC2F9, 0xC313, prLVT}, // Lo [27] HANGUL SYLLABLE SSAG..HANGUL SYLLABLE SSAH + {0xC314, 0xC314, prLV}, // Lo HANGUL SYLLABLE SSAE + {0xC315, 0xC32F, prLVT}, // Lo [27] HANGUL SYLLABLE SSAEG..HANGUL SYLLABLE SSAEH + {0xC330, 0xC330, prLV}, // Lo HANGUL SYLLABLE SSYA + {0xC331, 0xC34B, prLVT}, // Lo [27] HANGUL SYLLABLE SSYAG..HANGUL SYLLABLE SSYAH + {0xC34C, 0xC34C, prLV}, // Lo HANGUL SYLLABLE SSYAE + {0xC34D, 0xC367, prLVT}, // Lo [27] HANGUL SYLLABLE SSYAEG..HANGUL SYLLABLE SSYAEH + {0xC368, 0xC368, prLV}, // Lo HANGUL SYLLABLE SSEO + {0xC369, 0xC383, prLVT}, // Lo [27] HANGUL SYLLABLE SSEOG..HANGUL SYLLABLE SSEOH + {0xC384, 0xC384, prLV}, // Lo HANGUL SYLLABLE SSE + {0xC385, 0xC39F, prLVT}, // Lo [27] HANGUL SYLLABLE SSEG..HANGUL SYLLABLE SSEH + {0xC3A0, 0xC3A0, prLV}, // Lo HANGUL SYLLABLE SSYEO + {0xC3A1, 0xC3BB, prLVT}, // Lo [27] HANGUL SYLLABLE SSYEOG..HANGUL SYLLABLE SSYEOH + {0xC3BC, 0xC3BC, prLV}, // Lo HANGUL SYLLABLE SSYE + {0xC3BD, 0xC3D7, prLVT}, // Lo [27] HANGUL SYLLABLE SSYEG..HANGUL SYLLABLE SSYEH + {0xC3D8, 0xC3D8, prLV}, // Lo HANGUL SYLLABLE SSO + {0xC3D9, 0xC3F3, prLVT}, // Lo [27] HANGUL SYLLABLE SSOG..HANGUL SYLLABLE SSOH + {0xC3F4, 0xC3F4, prLV}, // Lo HANGUL SYLLABLE SSWA + {0xC3F5, 0xC40F, prLVT}, // Lo [27] HANGUL SYLLABLE SSWAG..HANGUL SYLLABLE SSWAH + {0xC410, 0xC410, prLV}, // Lo HANGUL SYLLABLE SSWAE + {0xC411, 0xC42B, prLVT}, // Lo [27] HANGUL SYLLABLE SSWAEG..HANGUL SYLLABLE SSWAEH + {0xC42C, 0xC42C, prLV}, // Lo HANGUL SYLLABLE SSOE + {0xC42D, 0xC447, prLVT}, // Lo [27] HANGUL SYLLABLE SSOEG..HANGUL SYLLABLE SSOEH + {0xC448, 0xC448, prLV}, // Lo HANGUL SYLLABLE SSYO + {0xC449, 0xC463, prLVT}, // Lo [27] HANGUL SYLLABLE SSYOG..HANGUL SYLLABLE SSYOH + {0xC464, 0xC464, prLV}, // Lo HANGUL SYLLABLE SSU + {0xC465, 0xC47F, prLVT}, // Lo [27] HANGUL SYLLABLE SSUG..HANGUL SYLLABLE SSUH + {0xC480, 0xC480, prLV}, // Lo HANGUL SYLLABLE SSWEO + {0xC481, 0xC49B, prLVT}, // Lo [27] HANGUL SYLLABLE SSWEOG..HANGUL SYLLABLE SSWEOH + {0xC49C, 0xC49C, prLV}, // Lo HANGUL SYLLABLE SSWE + {0xC49D, 0xC4B7, prLVT}, // Lo [27] HANGUL SYLLABLE SSWEG..HANGUL SYLLABLE SSWEH + {0xC4B8, 0xC4B8, prLV}, // Lo HANGUL SYLLABLE SSWI + {0xC4B9, 0xC4D3, prLVT}, // Lo [27] HANGUL SYLLABLE SSWIG..HANGUL SYLLABLE SSWIH + {0xC4D4, 0xC4D4, prLV}, // Lo HANGUL SYLLABLE SSYU + {0xC4D5, 0xC4EF, prLVT}, // Lo [27] HANGUL SYLLABLE SSYUG..HANGUL SYLLABLE SSYUH + {0xC4F0, 0xC4F0, prLV}, // Lo HANGUL SYLLABLE SSEU + {0xC4F1, 0xC50B, prLVT}, // Lo [27] HANGUL SYLLABLE SSEUG..HANGUL SYLLABLE SSEUH + {0xC50C, 0xC50C, prLV}, // Lo HANGUL SYLLABLE SSYI + {0xC50D, 0xC527, prLVT}, // Lo [27] HANGUL SYLLABLE SSYIG..HANGUL SYLLABLE SSYIH + {0xC528, 0xC528, prLV}, // Lo HANGUL SYLLABLE SSI + {0xC529, 0xC543, prLVT}, // Lo [27] HANGUL SYLLABLE SSIG..HANGUL SYLLABLE SSIH + {0xC544, 0xC544, prLV}, // Lo HANGUL SYLLABLE A + {0xC545, 0xC55F, prLVT}, // Lo [27] HANGUL SYLLABLE AG..HANGUL SYLLABLE AH + {0xC560, 0xC560, prLV}, // Lo HANGUL SYLLABLE AE + {0xC561, 0xC57B, prLVT}, // Lo [27] HANGUL SYLLABLE AEG..HANGUL SYLLABLE AEH + {0xC57C, 0xC57C, prLV}, // Lo HANGUL SYLLABLE YA + {0xC57D, 0xC597, prLVT}, // Lo [27] HANGUL SYLLABLE YAG..HANGUL SYLLABLE YAH + {0xC598, 0xC598, prLV}, // Lo HANGUL SYLLABLE YAE + {0xC599, 0xC5B3, prLVT}, // Lo [27] HANGUL SYLLABLE YAEG..HANGUL SYLLABLE YAEH + {0xC5B4, 0xC5B4, prLV}, // Lo HANGUL SYLLABLE EO + {0xC5B5, 0xC5CF, prLVT}, // Lo [27] HANGUL SYLLABLE EOG..HANGUL SYLLABLE EOH + {0xC5D0, 0xC5D0, prLV}, // Lo HANGUL SYLLABLE E + {0xC5D1, 0xC5EB, prLVT}, // Lo [27] HANGUL SYLLABLE EG..HANGUL SYLLABLE EH + {0xC5EC, 0xC5EC, prLV}, // Lo HANGUL SYLLABLE YEO + {0xC5ED, 0xC607, prLVT}, // Lo [27] HANGUL SYLLABLE YEOG..HANGUL SYLLABLE YEOH + {0xC608, 0xC608, prLV}, // Lo HANGUL SYLLABLE YE + {0xC609, 0xC623, prLVT}, // Lo [27] HANGUL SYLLABLE YEG..HANGUL SYLLABLE YEH + {0xC624, 0xC624, prLV}, // Lo HANGUL SYLLABLE O + {0xC625, 0xC63F, prLVT}, // Lo [27] HANGUL SYLLABLE OG..HANGUL SYLLABLE OH + {0xC640, 0xC640, prLV}, // Lo HANGUL SYLLABLE WA + {0xC641, 0xC65B, prLVT}, // Lo [27] HANGUL SYLLABLE WAG..HANGUL SYLLABLE WAH + {0xC65C, 0xC65C, prLV}, // Lo HANGUL SYLLABLE WAE + {0xC65D, 0xC677, prLVT}, // Lo [27] HANGUL SYLLABLE WAEG..HANGUL SYLLABLE WAEH + {0xC678, 0xC678, prLV}, // Lo HANGUL SYLLABLE OE + {0xC679, 0xC693, prLVT}, // Lo [27] HANGUL SYLLABLE OEG..HANGUL SYLLABLE OEH + {0xC694, 0xC694, prLV}, // Lo HANGUL SYLLABLE YO + {0xC695, 0xC6AF, prLVT}, // Lo [27] HANGUL SYLLABLE YOG..HANGUL SYLLABLE YOH + {0xC6B0, 0xC6B0, prLV}, // Lo HANGUL SYLLABLE U + {0xC6B1, 0xC6CB, prLVT}, // Lo [27] HANGUL SYLLABLE UG..HANGUL SYLLABLE UH + {0xC6CC, 0xC6CC, prLV}, // Lo HANGUL SYLLABLE WEO + {0xC6CD, 0xC6E7, prLVT}, // Lo [27] HANGUL SYLLABLE WEOG..HANGUL SYLLABLE WEOH + {0xC6E8, 0xC6E8, prLV}, // Lo HANGUL SYLLABLE WE + {0xC6E9, 0xC703, prLVT}, // Lo [27] HANGUL SYLLABLE WEG..HANGUL SYLLABLE WEH + {0xC704, 0xC704, prLV}, // Lo HANGUL SYLLABLE WI + {0xC705, 0xC71F, prLVT}, // Lo [27] HANGUL SYLLABLE WIG..HANGUL SYLLABLE WIH + {0xC720, 0xC720, prLV}, // Lo HANGUL SYLLABLE YU + {0xC721, 0xC73B, prLVT}, // Lo [27] HANGUL SYLLABLE YUG..HANGUL SYLLABLE YUH + {0xC73C, 0xC73C, prLV}, // Lo HANGUL SYLLABLE EU + {0xC73D, 0xC757, prLVT}, // Lo [27] HANGUL SYLLABLE EUG..HANGUL SYLLABLE EUH + {0xC758, 0xC758, prLV}, // Lo HANGUL SYLLABLE YI + {0xC759, 0xC773, prLVT}, // Lo [27] HANGUL SYLLABLE YIG..HANGUL SYLLABLE YIH + {0xC774, 0xC774, prLV}, // Lo HANGUL SYLLABLE I + {0xC775, 0xC78F, prLVT}, // Lo [27] HANGUL SYLLABLE IG..HANGUL SYLLABLE IH + {0xC790, 0xC790, prLV}, // Lo HANGUL SYLLABLE JA + {0xC791, 0xC7AB, prLVT}, // Lo [27] HANGUL SYLLABLE JAG..HANGUL SYLLABLE JAH + {0xC7AC, 0xC7AC, prLV}, // Lo HANGUL SYLLABLE JAE + {0xC7AD, 0xC7C7, prLVT}, // Lo [27] HANGUL SYLLABLE JAEG..HANGUL SYLLABLE JAEH + {0xC7C8, 0xC7C8, prLV}, // Lo HANGUL SYLLABLE JYA + {0xC7C9, 0xC7E3, prLVT}, // Lo [27] HANGUL SYLLABLE JYAG..HANGUL SYLLABLE JYAH + {0xC7E4, 0xC7E4, prLV}, // Lo HANGUL SYLLABLE JYAE + {0xC7E5, 0xC7FF, prLVT}, // Lo [27] HANGUL SYLLABLE JYAEG..HANGUL SYLLABLE JYAEH + {0xC800, 0xC800, prLV}, // Lo HANGUL SYLLABLE JEO + {0xC801, 0xC81B, prLVT}, // Lo [27] HANGUL SYLLABLE JEOG..HANGUL SYLLABLE JEOH + {0xC81C, 0xC81C, prLV}, // Lo HANGUL SYLLABLE JE + {0xC81D, 0xC837, prLVT}, // Lo [27] HANGUL SYLLABLE JEG..HANGUL SYLLABLE JEH + {0xC838, 0xC838, prLV}, // Lo HANGUL SYLLABLE JYEO + {0xC839, 0xC853, prLVT}, // Lo [27] HANGUL SYLLABLE JYEOG..HANGUL SYLLABLE JYEOH + {0xC854, 0xC854, prLV}, // Lo HANGUL SYLLABLE JYE + {0xC855, 0xC86F, prLVT}, // Lo [27] HANGUL SYLLABLE JYEG..HANGUL SYLLABLE JYEH + {0xC870, 0xC870, prLV}, // Lo HANGUL SYLLABLE JO + {0xC871, 0xC88B, prLVT}, // Lo [27] HANGUL SYLLABLE JOG..HANGUL SYLLABLE JOH + {0xC88C, 0xC88C, prLV}, // Lo HANGUL SYLLABLE JWA + {0xC88D, 0xC8A7, prLVT}, // Lo [27] HANGUL SYLLABLE JWAG..HANGUL SYLLABLE JWAH + {0xC8A8, 0xC8A8, prLV}, // Lo HANGUL SYLLABLE JWAE + {0xC8A9, 0xC8C3, prLVT}, // Lo [27] HANGUL SYLLABLE JWAEG..HANGUL SYLLABLE JWAEH + {0xC8C4, 0xC8C4, prLV}, // Lo HANGUL SYLLABLE JOE + {0xC8C5, 0xC8DF, prLVT}, // Lo [27] HANGUL SYLLABLE JOEG..HANGUL SYLLABLE JOEH + {0xC8E0, 0xC8E0, prLV}, // Lo HANGUL SYLLABLE JYO + {0xC8E1, 0xC8FB, prLVT}, // Lo [27] HANGUL SYLLABLE JYOG..HANGUL SYLLABLE JYOH + {0xC8FC, 0xC8FC, prLV}, // Lo HANGUL SYLLABLE JU + {0xC8FD, 0xC917, prLVT}, // Lo [27] HANGUL SYLLABLE JUG..HANGUL SYLLABLE JUH + {0xC918, 0xC918, prLV}, // Lo HANGUL SYLLABLE JWEO + {0xC919, 0xC933, prLVT}, // Lo [27] HANGUL SYLLABLE JWEOG..HANGUL SYLLABLE JWEOH + {0xC934, 0xC934, prLV}, // Lo HANGUL SYLLABLE JWE + {0xC935, 0xC94F, prLVT}, // Lo [27] HANGUL SYLLABLE JWEG..HANGUL SYLLABLE JWEH + {0xC950, 0xC950, prLV}, // Lo HANGUL SYLLABLE JWI + {0xC951, 0xC96B, prLVT}, // Lo [27] HANGUL SYLLABLE JWIG..HANGUL SYLLABLE JWIH + {0xC96C, 0xC96C, prLV}, // Lo HANGUL SYLLABLE JYU + {0xC96D, 0xC987, prLVT}, // Lo [27] HANGUL SYLLABLE JYUG..HANGUL SYLLABLE JYUH + {0xC988, 0xC988, prLV}, // Lo HANGUL SYLLABLE JEU + {0xC989, 0xC9A3, prLVT}, // Lo [27] HANGUL SYLLABLE JEUG..HANGUL SYLLABLE JEUH + {0xC9A4, 0xC9A4, prLV}, // Lo HANGUL SYLLABLE JYI + {0xC9A5, 0xC9BF, prLVT}, // Lo [27] HANGUL SYLLABLE JYIG..HANGUL SYLLABLE JYIH + {0xC9C0, 0xC9C0, prLV}, // Lo HANGUL SYLLABLE JI + {0xC9C1, 0xC9DB, prLVT}, // Lo [27] HANGUL SYLLABLE JIG..HANGUL SYLLABLE JIH + {0xC9DC, 0xC9DC, prLV}, // Lo HANGUL SYLLABLE JJA + {0xC9DD, 0xC9F7, prLVT}, // Lo [27] HANGUL SYLLABLE JJAG..HANGUL SYLLABLE JJAH + {0xC9F8, 0xC9F8, prLV}, // Lo HANGUL SYLLABLE JJAE + {0xC9F9, 0xCA13, prLVT}, // Lo [27] HANGUL SYLLABLE JJAEG..HANGUL SYLLABLE JJAEH + {0xCA14, 0xCA14, prLV}, // Lo HANGUL SYLLABLE JJYA + {0xCA15, 0xCA2F, prLVT}, // Lo [27] HANGUL SYLLABLE JJYAG..HANGUL SYLLABLE JJYAH + {0xCA30, 0xCA30, prLV}, // Lo HANGUL SYLLABLE JJYAE + {0xCA31, 0xCA4B, prLVT}, // Lo [27] HANGUL SYLLABLE JJYAEG..HANGUL SYLLABLE JJYAEH + {0xCA4C, 0xCA4C, prLV}, // Lo HANGUL SYLLABLE JJEO + {0xCA4D, 0xCA67, prLVT}, // Lo [27] HANGUL SYLLABLE JJEOG..HANGUL SYLLABLE JJEOH + {0xCA68, 0xCA68, prLV}, // Lo HANGUL SYLLABLE JJE + {0xCA69, 0xCA83, prLVT}, // Lo [27] HANGUL SYLLABLE JJEG..HANGUL SYLLABLE JJEH + {0xCA84, 0xCA84, prLV}, // Lo HANGUL SYLLABLE JJYEO + {0xCA85, 0xCA9F, prLVT}, // Lo [27] HANGUL SYLLABLE JJYEOG..HANGUL SYLLABLE JJYEOH + {0xCAA0, 0xCAA0, prLV}, // Lo HANGUL SYLLABLE JJYE + {0xCAA1, 0xCABB, prLVT}, // Lo [27] HANGUL SYLLABLE JJYEG..HANGUL SYLLABLE JJYEH + {0xCABC, 0xCABC, prLV}, // Lo HANGUL SYLLABLE JJO + {0xCABD, 0xCAD7, prLVT}, // Lo [27] HANGUL SYLLABLE JJOG..HANGUL SYLLABLE JJOH + {0xCAD8, 0xCAD8, prLV}, // Lo HANGUL SYLLABLE JJWA + {0xCAD9, 0xCAF3, prLVT}, // Lo [27] HANGUL SYLLABLE JJWAG..HANGUL SYLLABLE JJWAH + {0xCAF4, 0xCAF4, prLV}, // Lo HANGUL SYLLABLE JJWAE + {0xCAF5, 0xCB0F, prLVT}, // Lo [27] HANGUL SYLLABLE JJWAEG..HANGUL SYLLABLE JJWAEH + {0xCB10, 0xCB10, prLV}, // Lo HANGUL SYLLABLE JJOE + {0xCB11, 0xCB2B, prLVT}, // Lo [27] HANGUL SYLLABLE JJOEG..HANGUL SYLLABLE JJOEH + {0xCB2C, 0xCB2C, prLV}, // Lo HANGUL SYLLABLE JJYO + {0xCB2D, 0xCB47, prLVT}, // Lo [27] HANGUL SYLLABLE JJYOG..HANGUL SYLLABLE JJYOH + {0xCB48, 0xCB48, prLV}, // Lo HANGUL SYLLABLE JJU + {0xCB49, 0xCB63, prLVT}, // Lo [27] HANGUL SYLLABLE JJUG..HANGUL SYLLABLE JJUH + {0xCB64, 0xCB64, prLV}, // Lo HANGUL SYLLABLE JJWEO + {0xCB65, 0xCB7F, prLVT}, // Lo [27] HANGUL SYLLABLE JJWEOG..HANGUL SYLLABLE JJWEOH + {0xCB80, 0xCB80, prLV}, // Lo HANGUL SYLLABLE JJWE + {0xCB81, 0xCB9B, prLVT}, // Lo [27] HANGUL SYLLABLE JJWEG..HANGUL SYLLABLE JJWEH + {0xCB9C, 0xCB9C, prLV}, // Lo HANGUL SYLLABLE JJWI + {0xCB9D, 0xCBB7, prLVT}, // Lo [27] HANGUL SYLLABLE JJWIG..HANGUL SYLLABLE JJWIH + {0xCBB8, 0xCBB8, prLV}, // Lo HANGUL SYLLABLE JJYU + {0xCBB9, 0xCBD3, prLVT}, // Lo [27] HANGUL SYLLABLE JJYUG..HANGUL SYLLABLE JJYUH + {0xCBD4, 0xCBD4, prLV}, // Lo HANGUL SYLLABLE JJEU + {0xCBD5, 0xCBEF, prLVT}, // Lo [27] HANGUL SYLLABLE JJEUG..HANGUL SYLLABLE JJEUH + {0xCBF0, 0xCBF0, prLV}, // Lo HANGUL SYLLABLE JJYI + {0xCBF1, 0xCC0B, prLVT}, // Lo [27] HANGUL SYLLABLE JJYIG..HANGUL SYLLABLE JJYIH + {0xCC0C, 0xCC0C, prLV}, // Lo HANGUL SYLLABLE JJI + {0xCC0D, 0xCC27, prLVT}, // Lo [27] HANGUL SYLLABLE JJIG..HANGUL SYLLABLE JJIH + {0xCC28, 0xCC28, prLV}, // Lo HANGUL SYLLABLE CA + {0xCC29, 0xCC43, prLVT}, // Lo [27] HANGUL SYLLABLE CAG..HANGUL SYLLABLE CAH + {0xCC44, 0xCC44, prLV}, // Lo HANGUL SYLLABLE CAE + {0xCC45, 0xCC5F, prLVT}, // Lo [27] HANGUL SYLLABLE CAEG..HANGUL SYLLABLE CAEH + {0xCC60, 0xCC60, prLV}, // Lo HANGUL SYLLABLE CYA + {0xCC61, 0xCC7B, prLVT}, // Lo [27] HANGUL SYLLABLE CYAG..HANGUL SYLLABLE CYAH + {0xCC7C, 0xCC7C, prLV}, // Lo HANGUL SYLLABLE CYAE + {0xCC7D, 0xCC97, prLVT}, // Lo [27] HANGUL SYLLABLE CYAEG..HANGUL SYLLABLE CYAEH + {0xCC98, 0xCC98, prLV}, // Lo HANGUL SYLLABLE CEO + {0xCC99, 0xCCB3, prLVT}, // Lo [27] HANGUL SYLLABLE CEOG..HANGUL SYLLABLE CEOH + {0xCCB4, 0xCCB4, prLV}, // Lo HANGUL SYLLABLE CE + {0xCCB5, 0xCCCF, prLVT}, // Lo [27] HANGUL SYLLABLE CEG..HANGUL SYLLABLE CEH + {0xCCD0, 0xCCD0, prLV}, // Lo HANGUL SYLLABLE CYEO + {0xCCD1, 0xCCEB, prLVT}, // Lo [27] HANGUL SYLLABLE CYEOG..HANGUL SYLLABLE CYEOH + {0xCCEC, 0xCCEC, prLV}, // Lo HANGUL SYLLABLE CYE + {0xCCED, 0xCD07, prLVT}, // Lo [27] HANGUL SYLLABLE CYEG..HANGUL SYLLABLE CYEH + {0xCD08, 0xCD08, prLV}, // Lo HANGUL SYLLABLE CO + {0xCD09, 0xCD23, prLVT}, // Lo [27] HANGUL SYLLABLE COG..HANGUL SYLLABLE COH + {0xCD24, 0xCD24, prLV}, // Lo HANGUL SYLLABLE CWA + {0xCD25, 0xCD3F, prLVT}, // Lo [27] HANGUL SYLLABLE CWAG..HANGUL SYLLABLE CWAH + {0xCD40, 0xCD40, prLV}, // Lo HANGUL SYLLABLE CWAE + {0xCD41, 0xCD5B, prLVT}, // Lo [27] HANGUL SYLLABLE CWAEG..HANGUL SYLLABLE CWAEH + {0xCD5C, 0xCD5C, prLV}, // Lo HANGUL SYLLABLE COE + {0xCD5D, 0xCD77, prLVT}, // Lo [27] HANGUL SYLLABLE COEG..HANGUL SYLLABLE COEH + {0xCD78, 0xCD78, prLV}, // Lo HANGUL SYLLABLE CYO + {0xCD79, 0xCD93, prLVT}, // Lo [27] HANGUL SYLLABLE CYOG..HANGUL SYLLABLE CYOH + {0xCD94, 0xCD94, prLV}, // Lo HANGUL SYLLABLE CU + {0xCD95, 0xCDAF, prLVT}, // Lo [27] HANGUL SYLLABLE CUG..HANGUL SYLLABLE CUH + {0xCDB0, 0xCDB0, prLV}, // Lo HANGUL SYLLABLE CWEO + {0xCDB1, 0xCDCB, prLVT}, // Lo [27] HANGUL SYLLABLE CWEOG..HANGUL SYLLABLE CWEOH + {0xCDCC, 0xCDCC, prLV}, // Lo HANGUL SYLLABLE CWE + {0xCDCD, 0xCDE7, prLVT}, // Lo [27] HANGUL SYLLABLE CWEG..HANGUL SYLLABLE CWEH + {0xCDE8, 0xCDE8, prLV}, // Lo HANGUL SYLLABLE CWI + {0xCDE9, 0xCE03, prLVT}, // Lo [27] HANGUL SYLLABLE CWIG..HANGUL SYLLABLE CWIH + {0xCE04, 0xCE04, prLV}, // Lo HANGUL SYLLABLE CYU + {0xCE05, 0xCE1F, prLVT}, // Lo [27] HANGUL SYLLABLE CYUG..HANGUL SYLLABLE CYUH + {0xCE20, 0xCE20, prLV}, // Lo HANGUL SYLLABLE CEU + {0xCE21, 0xCE3B, prLVT}, // Lo [27] HANGUL SYLLABLE CEUG..HANGUL SYLLABLE CEUH + {0xCE3C, 0xCE3C, prLV}, // Lo HANGUL SYLLABLE CYI + {0xCE3D, 0xCE57, prLVT}, // Lo [27] HANGUL SYLLABLE CYIG..HANGUL SYLLABLE CYIH + {0xCE58, 0xCE58, prLV}, // Lo HANGUL SYLLABLE CI + {0xCE59, 0xCE73, prLVT}, // Lo [27] HANGUL SYLLABLE CIG..HANGUL SYLLABLE CIH + {0xCE74, 0xCE74, prLV}, // Lo HANGUL SYLLABLE KA + {0xCE75, 0xCE8F, prLVT}, // Lo [27] HANGUL SYLLABLE KAG..HANGUL SYLLABLE KAH + {0xCE90, 0xCE90, prLV}, // Lo HANGUL SYLLABLE KAE + {0xCE91, 0xCEAB, prLVT}, // Lo [27] HANGUL SYLLABLE KAEG..HANGUL SYLLABLE KAEH + {0xCEAC, 0xCEAC, prLV}, // Lo HANGUL SYLLABLE KYA + {0xCEAD, 0xCEC7, prLVT}, // Lo [27] HANGUL SYLLABLE KYAG..HANGUL SYLLABLE KYAH + {0xCEC8, 0xCEC8, prLV}, // Lo HANGUL SYLLABLE KYAE + {0xCEC9, 0xCEE3, prLVT}, // Lo [27] HANGUL SYLLABLE KYAEG..HANGUL SYLLABLE KYAEH + {0xCEE4, 0xCEE4, prLV}, // Lo HANGUL SYLLABLE KEO + {0xCEE5, 0xCEFF, prLVT}, // Lo [27] HANGUL SYLLABLE KEOG..HANGUL SYLLABLE KEOH + {0xCF00, 0xCF00, prLV}, // Lo HANGUL SYLLABLE KE + {0xCF01, 0xCF1B, prLVT}, // Lo [27] HANGUL SYLLABLE KEG..HANGUL SYLLABLE KEH + {0xCF1C, 0xCF1C, prLV}, // Lo HANGUL SYLLABLE KYEO + {0xCF1D, 0xCF37, prLVT}, // Lo [27] HANGUL SYLLABLE KYEOG..HANGUL SYLLABLE KYEOH + {0xCF38, 0xCF38, prLV}, // Lo HANGUL SYLLABLE KYE + {0xCF39, 0xCF53, prLVT}, // Lo [27] HANGUL SYLLABLE KYEG..HANGUL SYLLABLE KYEH + {0xCF54, 0xCF54, prLV}, // Lo HANGUL SYLLABLE KO + {0xCF55, 0xCF6F, prLVT}, // Lo [27] HANGUL SYLLABLE KOG..HANGUL SYLLABLE KOH + {0xCF70, 0xCF70, prLV}, // Lo HANGUL SYLLABLE KWA + {0xCF71, 0xCF8B, prLVT}, // Lo [27] HANGUL SYLLABLE KWAG..HANGUL SYLLABLE KWAH + {0xCF8C, 0xCF8C, prLV}, // Lo HANGUL SYLLABLE KWAE + {0xCF8D, 0xCFA7, prLVT}, // Lo [27] HANGUL SYLLABLE KWAEG..HANGUL SYLLABLE KWAEH + {0xCFA8, 0xCFA8, prLV}, // Lo HANGUL SYLLABLE KOE + {0xCFA9, 0xCFC3, prLVT}, // Lo [27] HANGUL SYLLABLE KOEG..HANGUL SYLLABLE KOEH + {0xCFC4, 0xCFC4, prLV}, // Lo HANGUL SYLLABLE KYO + {0xCFC5, 0xCFDF, prLVT}, // Lo [27] HANGUL SYLLABLE KYOG..HANGUL SYLLABLE KYOH + {0xCFE0, 0xCFE0, prLV}, // Lo HANGUL SYLLABLE KU + {0xCFE1, 0xCFFB, prLVT}, // Lo [27] HANGUL SYLLABLE KUG..HANGUL SYLLABLE KUH + {0xCFFC, 0xCFFC, prLV}, // Lo HANGUL SYLLABLE KWEO + {0xCFFD, 0xD017, prLVT}, // Lo [27] HANGUL SYLLABLE KWEOG..HANGUL SYLLABLE KWEOH + {0xD018, 0xD018, prLV}, // Lo HANGUL SYLLABLE KWE + {0xD019, 0xD033, prLVT}, // Lo [27] HANGUL SYLLABLE KWEG..HANGUL SYLLABLE KWEH + {0xD034, 0xD034, prLV}, // Lo HANGUL SYLLABLE KWI + {0xD035, 0xD04F, prLVT}, // Lo [27] HANGUL SYLLABLE KWIG..HANGUL SYLLABLE KWIH + {0xD050, 0xD050, prLV}, // Lo HANGUL SYLLABLE KYU + {0xD051, 0xD06B, prLVT}, // Lo [27] HANGUL SYLLABLE KYUG..HANGUL SYLLABLE KYUH + {0xD06C, 0xD06C, prLV}, // Lo HANGUL SYLLABLE KEU + {0xD06D, 0xD087, prLVT}, // Lo [27] HANGUL SYLLABLE KEUG..HANGUL SYLLABLE KEUH + {0xD088, 0xD088, prLV}, // Lo HANGUL SYLLABLE KYI + {0xD089, 0xD0A3, prLVT}, // Lo [27] HANGUL SYLLABLE KYIG..HANGUL SYLLABLE KYIH + {0xD0A4, 0xD0A4, prLV}, // Lo HANGUL SYLLABLE KI + {0xD0A5, 0xD0BF, prLVT}, // Lo [27] HANGUL SYLLABLE KIG..HANGUL SYLLABLE KIH + {0xD0C0, 0xD0C0, prLV}, // Lo HANGUL SYLLABLE TA + {0xD0C1, 0xD0DB, prLVT}, // Lo [27] HANGUL SYLLABLE TAG..HANGUL SYLLABLE TAH + {0xD0DC, 0xD0DC, prLV}, // Lo HANGUL SYLLABLE TAE + {0xD0DD, 0xD0F7, prLVT}, // Lo [27] HANGUL SYLLABLE TAEG..HANGUL SYLLABLE TAEH + {0xD0F8, 0xD0F8, prLV}, // Lo HANGUL SYLLABLE TYA + {0xD0F9, 0xD113, prLVT}, // Lo [27] HANGUL SYLLABLE TYAG..HANGUL SYLLABLE TYAH + {0xD114, 0xD114, prLV}, // Lo HANGUL SYLLABLE TYAE + {0xD115, 0xD12F, prLVT}, // Lo [27] HANGUL SYLLABLE TYAEG..HANGUL SYLLABLE TYAEH + {0xD130, 0xD130, prLV}, // Lo HANGUL SYLLABLE TEO + {0xD131, 0xD14B, prLVT}, // Lo [27] HANGUL SYLLABLE TEOG..HANGUL SYLLABLE TEOH + {0xD14C, 0xD14C, prLV}, // Lo HANGUL SYLLABLE TE + {0xD14D, 0xD167, prLVT}, // Lo [27] HANGUL SYLLABLE TEG..HANGUL SYLLABLE TEH + {0xD168, 0xD168, prLV}, // Lo HANGUL SYLLABLE TYEO + {0xD169, 0xD183, prLVT}, // Lo [27] HANGUL SYLLABLE TYEOG..HANGUL SYLLABLE TYEOH + {0xD184, 0xD184, prLV}, // Lo HANGUL SYLLABLE TYE + {0xD185, 0xD19F, prLVT}, // Lo [27] HANGUL SYLLABLE TYEG..HANGUL SYLLABLE TYEH + {0xD1A0, 0xD1A0, prLV}, // Lo HANGUL SYLLABLE TO + {0xD1A1, 0xD1BB, prLVT}, // Lo [27] HANGUL SYLLABLE TOG..HANGUL SYLLABLE TOH + {0xD1BC, 0xD1BC, prLV}, // Lo HANGUL SYLLABLE TWA + {0xD1BD, 0xD1D7, prLVT}, // Lo [27] HANGUL SYLLABLE TWAG..HANGUL SYLLABLE TWAH + {0xD1D8, 0xD1D8, prLV}, // Lo HANGUL SYLLABLE TWAE + {0xD1D9, 0xD1F3, prLVT}, // Lo [27] HANGUL SYLLABLE TWAEG..HANGUL SYLLABLE TWAEH + {0xD1F4, 0xD1F4, prLV}, // Lo HANGUL SYLLABLE TOE + {0xD1F5, 0xD20F, prLVT}, // Lo [27] HANGUL SYLLABLE TOEG..HANGUL SYLLABLE TOEH + {0xD210, 0xD210, prLV}, // Lo HANGUL SYLLABLE TYO + {0xD211, 0xD22B, prLVT}, // Lo [27] HANGUL SYLLABLE TYOG..HANGUL SYLLABLE TYOH + {0xD22C, 0xD22C, prLV}, // Lo HANGUL SYLLABLE TU + {0xD22D, 0xD247, prLVT}, // Lo [27] HANGUL SYLLABLE TUG..HANGUL SYLLABLE TUH + {0xD248, 0xD248, prLV}, // Lo HANGUL SYLLABLE TWEO + {0xD249, 0xD263, prLVT}, // Lo [27] HANGUL SYLLABLE TWEOG..HANGUL SYLLABLE TWEOH + {0xD264, 0xD264, prLV}, // Lo HANGUL SYLLABLE TWE + {0xD265, 0xD27F, prLVT}, // Lo [27] HANGUL SYLLABLE TWEG..HANGUL SYLLABLE TWEH + {0xD280, 0xD280, prLV}, // Lo HANGUL SYLLABLE TWI + {0xD281, 0xD29B, prLVT}, // Lo [27] HANGUL SYLLABLE TWIG..HANGUL SYLLABLE TWIH + {0xD29C, 0xD29C, prLV}, // Lo HANGUL SYLLABLE TYU + {0xD29D, 0xD2B7, prLVT}, // Lo [27] HANGUL SYLLABLE TYUG..HANGUL SYLLABLE TYUH + {0xD2B8, 0xD2B8, prLV}, // Lo HANGUL SYLLABLE TEU + {0xD2B9, 0xD2D3, prLVT}, // Lo [27] HANGUL SYLLABLE TEUG..HANGUL SYLLABLE TEUH + {0xD2D4, 0xD2D4, prLV}, // Lo HANGUL SYLLABLE TYI + {0xD2D5, 0xD2EF, prLVT}, // Lo [27] HANGUL SYLLABLE TYIG..HANGUL SYLLABLE TYIH + {0xD2F0, 0xD2F0, prLV}, // Lo HANGUL SYLLABLE TI + {0xD2F1, 0xD30B, prLVT}, // Lo [27] HANGUL SYLLABLE TIG..HANGUL SYLLABLE TIH + {0xD30C, 0xD30C, prLV}, // Lo HANGUL SYLLABLE PA + {0xD30D, 0xD327, prLVT}, // Lo [27] HANGUL SYLLABLE PAG..HANGUL SYLLABLE PAH + {0xD328, 0xD328, prLV}, // Lo HANGUL SYLLABLE PAE + {0xD329, 0xD343, prLVT}, // Lo [27] HANGUL SYLLABLE PAEG..HANGUL SYLLABLE PAEH + {0xD344, 0xD344, prLV}, // Lo HANGUL SYLLABLE PYA + {0xD345, 0xD35F, prLVT}, // Lo [27] HANGUL SYLLABLE PYAG..HANGUL SYLLABLE PYAH + {0xD360, 0xD360, prLV}, // Lo HANGUL SYLLABLE PYAE + {0xD361, 0xD37B, prLVT}, // Lo [27] HANGUL SYLLABLE PYAEG..HANGUL SYLLABLE PYAEH + {0xD37C, 0xD37C, prLV}, // Lo HANGUL SYLLABLE PEO + {0xD37D, 0xD397, prLVT}, // Lo [27] HANGUL SYLLABLE PEOG..HANGUL SYLLABLE PEOH + {0xD398, 0xD398, prLV}, // Lo HANGUL SYLLABLE PE + {0xD399, 0xD3B3, prLVT}, // Lo [27] HANGUL SYLLABLE PEG..HANGUL SYLLABLE PEH + {0xD3B4, 0xD3B4, prLV}, // Lo HANGUL SYLLABLE PYEO + {0xD3B5, 0xD3CF, prLVT}, // Lo [27] HANGUL SYLLABLE PYEOG..HANGUL SYLLABLE PYEOH + {0xD3D0, 0xD3D0, prLV}, // Lo HANGUL SYLLABLE PYE + {0xD3D1, 0xD3EB, prLVT}, // Lo [27] HANGUL SYLLABLE PYEG..HANGUL SYLLABLE PYEH + {0xD3EC, 0xD3EC, prLV}, // Lo HANGUL SYLLABLE PO + {0xD3ED, 0xD407, prLVT}, // Lo [27] HANGUL SYLLABLE POG..HANGUL SYLLABLE POH + {0xD408, 0xD408, prLV}, // Lo HANGUL SYLLABLE PWA + {0xD409, 0xD423, prLVT}, // Lo [27] HANGUL SYLLABLE PWAG..HANGUL SYLLABLE PWAH + {0xD424, 0xD424, prLV}, // Lo HANGUL SYLLABLE PWAE + {0xD425, 0xD43F, prLVT}, // Lo [27] HANGUL SYLLABLE PWAEG..HANGUL SYLLABLE PWAEH + {0xD440, 0xD440, prLV}, // Lo HANGUL SYLLABLE POE + {0xD441, 0xD45B, prLVT}, // Lo [27] HANGUL SYLLABLE POEG..HANGUL SYLLABLE POEH + {0xD45C, 0xD45C, prLV}, // Lo HANGUL SYLLABLE PYO + {0xD45D, 0xD477, prLVT}, // Lo [27] HANGUL SYLLABLE PYOG..HANGUL SYLLABLE PYOH + {0xD478, 0xD478, prLV}, // Lo HANGUL SYLLABLE PU + {0xD479, 0xD493, prLVT}, // Lo [27] HANGUL SYLLABLE PUG..HANGUL SYLLABLE PUH + {0xD494, 0xD494, prLV}, // Lo HANGUL SYLLABLE PWEO + {0xD495, 0xD4AF, prLVT}, // Lo [27] HANGUL SYLLABLE PWEOG..HANGUL SYLLABLE PWEOH + {0xD4B0, 0xD4B0, prLV}, // Lo HANGUL SYLLABLE PWE + {0xD4B1, 0xD4CB, prLVT}, // Lo [27] HANGUL SYLLABLE PWEG..HANGUL SYLLABLE PWEH + {0xD4CC, 0xD4CC, prLV}, // Lo HANGUL SYLLABLE PWI + {0xD4CD, 0xD4E7, prLVT}, // Lo [27] HANGUL SYLLABLE PWIG..HANGUL SYLLABLE PWIH + {0xD4E8, 0xD4E8, prLV}, // Lo HANGUL SYLLABLE PYU + {0xD4E9, 0xD503, prLVT}, // Lo [27] HANGUL SYLLABLE PYUG..HANGUL SYLLABLE PYUH + {0xD504, 0xD504, prLV}, // Lo HANGUL SYLLABLE PEU + {0xD505, 0xD51F, prLVT}, // Lo [27] HANGUL SYLLABLE PEUG..HANGUL SYLLABLE PEUH + {0xD520, 0xD520, prLV}, // Lo HANGUL SYLLABLE PYI + {0xD521, 0xD53B, prLVT}, // Lo [27] HANGUL SYLLABLE PYIG..HANGUL SYLLABLE PYIH + {0xD53C, 0xD53C, prLV}, // Lo HANGUL SYLLABLE PI + {0xD53D, 0xD557, prLVT}, // Lo [27] HANGUL SYLLABLE PIG..HANGUL SYLLABLE PIH + {0xD558, 0xD558, prLV}, // Lo HANGUL SYLLABLE HA + {0xD559, 0xD573, prLVT}, // Lo [27] HANGUL SYLLABLE HAG..HANGUL SYLLABLE HAH + {0xD574, 0xD574, prLV}, // Lo HANGUL SYLLABLE HAE + {0xD575, 0xD58F, prLVT}, // Lo [27] HANGUL SYLLABLE HAEG..HANGUL SYLLABLE HAEH + {0xD590, 0xD590, prLV}, // Lo HANGUL SYLLABLE HYA + {0xD591, 0xD5AB, prLVT}, // Lo [27] HANGUL SYLLABLE HYAG..HANGUL SYLLABLE HYAH + {0xD5AC, 0xD5AC, prLV}, // Lo HANGUL SYLLABLE HYAE + {0xD5AD, 0xD5C7, prLVT}, // Lo [27] HANGUL SYLLABLE HYAEG..HANGUL SYLLABLE HYAEH + {0xD5C8, 0xD5C8, prLV}, // Lo HANGUL SYLLABLE HEO + {0xD5C9, 0xD5E3, prLVT}, // Lo [27] HANGUL SYLLABLE HEOG..HANGUL SYLLABLE HEOH + {0xD5E4, 0xD5E4, prLV}, // Lo HANGUL SYLLABLE HE + {0xD5E5, 0xD5FF, prLVT}, // Lo [27] HANGUL SYLLABLE HEG..HANGUL SYLLABLE HEH + {0xD600, 0xD600, prLV}, // Lo HANGUL SYLLABLE HYEO + {0xD601, 0xD61B, prLVT}, // Lo [27] HANGUL SYLLABLE HYEOG..HANGUL SYLLABLE HYEOH + {0xD61C, 0xD61C, prLV}, // Lo HANGUL SYLLABLE HYE + {0xD61D, 0xD637, prLVT}, // Lo [27] HANGUL SYLLABLE HYEG..HANGUL SYLLABLE HYEH + {0xD638, 0xD638, prLV}, // Lo HANGUL SYLLABLE HO + {0xD639, 0xD653, prLVT}, // Lo [27] HANGUL SYLLABLE HOG..HANGUL SYLLABLE HOH + {0xD654, 0xD654, prLV}, // Lo HANGUL SYLLABLE HWA + {0xD655, 0xD66F, prLVT}, // Lo [27] HANGUL SYLLABLE HWAG..HANGUL SYLLABLE HWAH + {0xD670, 0xD670, prLV}, // Lo HANGUL SYLLABLE HWAE + {0xD671, 0xD68B, prLVT}, // Lo [27] HANGUL SYLLABLE HWAEG..HANGUL SYLLABLE HWAEH + {0xD68C, 0xD68C, prLV}, // Lo HANGUL SYLLABLE HOE + {0xD68D, 0xD6A7, prLVT}, // Lo [27] HANGUL SYLLABLE HOEG..HANGUL SYLLABLE HOEH + {0xD6A8, 0xD6A8, prLV}, // Lo HANGUL SYLLABLE HYO + {0xD6A9, 0xD6C3, prLVT}, // Lo [27] HANGUL SYLLABLE HYOG..HANGUL SYLLABLE HYOH + {0xD6C4, 0xD6C4, prLV}, // Lo HANGUL SYLLABLE HU + {0xD6C5, 0xD6DF, prLVT}, // Lo [27] HANGUL SYLLABLE HUG..HANGUL SYLLABLE HUH + {0xD6E0, 0xD6E0, prLV}, // Lo HANGUL SYLLABLE HWEO + {0xD6E1, 0xD6FB, prLVT}, // Lo [27] HANGUL SYLLABLE HWEOG..HANGUL SYLLABLE HWEOH + {0xD6FC, 0xD6FC, prLV}, // Lo HANGUL SYLLABLE HWE + {0xD6FD, 0xD717, prLVT}, // Lo [27] HANGUL SYLLABLE HWEG..HANGUL SYLLABLE HWEH + {0xD718, 0xD718, prLV}, // Lo HANGUL SYLLABLE HWI + {0xD719, 0xD733, prLVT}, // Lo [27] HANGUL SYLLABLE HWIG..HANGUL SYLLABLE HWIH + {0xD734, 0xD734, prLV}, // Lo HANGUL SYLLABLE HYU + {0xD735, 0xD74F, prLVT}, // Lo [27] HANGUL SYLLABLE HYUG..HANGUL SYLLABLE HYUH + {0xD750, 0xD750, prLV}, // Lo HANGUL SYLLABLE HEU + {0xD751, 0xD76B, prLVT}, // Lo [27] HANGUL SYLLABLE HEUG..HANGUL SYLLABLE HEUH + {0xD76C, 0xD76C, prLV}, // Lo HANGUL SYLLABLE HYI + {0xD76D, 0xD787, prLVT}, // Lo [27] HANGUL SYLLABLE HYIG..HANGUL SYLLABLE HYIH + {0xD788, 0xD788, prLV}, // Lo HANGUL SYLLABLE HI + {0xD789, 0xD7A3, prLVT}, // Lo [27] HANGUL SYLLABLE HIG..HANGUL SYLLABLE HIH + {0xD7B0, 0xD7C6, prV}, // Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E + {0xD7CB, 0xD7FB, prT}, // Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH + {0xFB1E, 0xFB1E, prExtend}, // Mn HEBREW POINT JUDEO-SPANISH VARIKA + {0xFE00, 0xFE0F, prExtend}, // Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 + {0xFE20, 0xFE2F, prExtend}, // Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF + {0xFEFF, 0xFEFF, prControl}, // Cf ZERO WIDTH NO-BREAK SPACE + {0xFF9E, 0xFF9F, prExtend}, // Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK + {0xFFF0, 0xFFF8, prControl}, // Cn [9] .. + {0xFFF9, 0xFFFB, prControl}, // Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR + {0x101FD, 0x101FD, prExtend}, // Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE + {0x102E0, 0x102E0, prExtend}, // Mn COPTIC EPACT THOUSANDS MARK + {0x10376, 0x1037A, prExtend}, // Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII + {0x10A01, 0x10A03, prExtend}, // Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R + {0x10A05, 0x10A06, prExtend}, // Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O + {0x10A0C, 0x10A0F, prExtend}, // Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA + {0x10A38, 0x10A3A, prExtend}, // Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW + {0x10A3F, 0x10A3F, prExtend}, // Mn KHAROSHTHI VIRAMA + {0x10AE5, 0x10AE6, prExtend}, // Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW + {0x10D24, 0x10D27, prExtend}, // Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI + {0x10EAB, 0x10EAC, prExtend}, // Mn [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK + {0x10F46, 0x10F50, prExtend}, // Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW + {0x10F82, 0x10F85, prExtend}, // Mn [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW + {0x11000, 0x11000, prSpacingMark}, // Mc BRAHMI SIGN CANDRABINDU + {0x11001, 0x11001, prExtend}, // Mn BRAHMI SIGN ANUSVARA + {0x11002, 0x11002, prSpacingMark}, // Mc BRAHMI SIGN VISARGA + {0x11038, 0x11046, prExtend}, // Mn [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA + {0x11070, 0x11070, prExtend}, // Mn BRAHMI SIGN OLD TAMIL VIRAMA + {0x11073, 0x11074, prExtend}, // Mn [2] BRAHMI VOWEL SIGN OLD TAMIL SHORT E..BRAHMI VOWEL SIGN OLD TAMIL SHORT O + {0x1107F, 0x11081, prExtend}, // Mn [3] BRAHMI NUMBER JOINER..KAITHI SIGN ANUSVARA + {0x11082, 0x11082, prSpacingMark}, // Mc KAITHI SIGN VISARGA + {0x110B0, 0x110B2, prSpacingMark}, // Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II + {0x110B3, 0x110B6, prExtend}, // Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI + {0x110B7, 0x110B8, prSpacingMark}, // Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU + {0x110B9, 0x110BA, prExtend}, // Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA + {0x110BD, 0x110BD, prPrepend}, // Cf KAITHI NUMBER SIGN + {0x110C2, 0x110C2, prExtend}, // Mn KAITHI VOWEL SIGN VOCALIC R + {0x110CD, 0x110CD, prPrepend}, // Cf KAITHI NUMBER SIGN ABOVE + {0x11100, 0x11102, prExtend}, // Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA + {0x11127, 0x1112B, prExtend}, // Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU + {0x1112C, 0x1112C, prSpacingMark}, // Mc CHAKMA VOWEL SIGN E + {0x1112D, 0x11134, prExtend}, // Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA + {0x11145, 0x11146, prSpacingMark}, // Mc [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI + {0x11173, 0x11173, prExtend}, // Mn MAHAJANI SIGN NUKTA + {0x11180, 0x11181, prExtend}, // Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA + {0x11182, 0x11182, prSpacingMark}, // Mc SHARADA SIGN VISARGA + {0x111B3, 0x111B5, prSpacingMark}, // Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II + {0x111B6, 0x111BE, prExtend}, // Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O + {0x111BF, 0x111C0, prSpacingMark}, // Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA + {0x111C2, 0x111C3, prPrepend}, // Lo [2] SHARADA SIGN JIHVAMULIYA..SHARADA SIGN UPADHMANIYA + {0x111C9, 0x111CC, prExtend}, // Mn [4] SHARADA SANDHI MARK..SHARADA EXTRA SHORT VOWEL MARK + {0x111CE, 0x111CE, prSpacingMark}, // Mc SHARADA VOWEL SIGN PRISHTHAMATRA E + {0x111CF, 0x111CF, prExtend}, // Mn SHARADA SIGN INVERTED CANDRABINDU + {0x1122C, 0x1122E, prSpacingMark}, // Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II + {0x1122F, 0x11231, prExtend}, // Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI + {0x11232, 0x11233, prSpacingMark}, // Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU + {0x11234, 0x11234, prExtend}, // Mn KHOJKI SIGN ANUSVARA + {0x11235, 0x11235, prSpacingMark}, // Mc KHOJKI SIGN VIRAMA + {0x11236, 0x11237, prExtend}, // Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA + {0x1123E, 0x1123E, prExtend}, // Mn KHOJKI SIGN SUKUN + {0x112DF, 0x112DF, prExtend}, // Mn KHUDAWADI SIGN ANUSVARA + {0x112E0, 0x112E2, prSpacingMark}, // Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II + {0x112E3, 0x112EA, prExtend}, // Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA + {0x11300, 0x11301, prExtend}, // Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU + {0x11302, 0x11303, prSpacingMark}, // Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA + {0x1133B, 0x1133C, prExtend}, // Mn [2] COMBINING BINDU BELOW..GRANTHA SIGN NUKTA + {0x1133E, 0x1133E, prExtend}, // Mc GRANTHA VOWEL SIGN AA + {0x1133F, 0x1133F, prSpacingMark}, // Mc GRANTHA VOWEL SIGN I + {0x11340, 0x11340, prExtend}, // Mn GRANTHA VOWEL SIGN II + {0x11341, 0x11344, prSpacingMark}, // Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR + {0x11347, 0x11348, prSpacingMark}, // Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI + {0x1134B, 0x1134D, prSpacingMark}, // Mc [3] GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA + {0x11357, 0x11357, prExtend}, // Mc GRANTHA AU LENGTH MARK + {0x11362, 0x11363, prSpacingMark}, // Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL + {0x11366, 0x1136C, prExtend}, // Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX + {0x11370, 0x11374, prExtend}, // Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA + {0x11435, 0x11437, prSpacingMark}, // Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II + {0x11438, 0x1143F, prExtend}, // Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI + {0x11440, 0x11441, prSpacingMark}, // Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU + {0x11442, 0x11444, prExtend}, // Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA + {0x11445, 0x11445, prSpacingMark}, // Mc NEWA SIGN VISARGA + {0x11446, 0x11446, prExtend}, // Mn NEWA SIGN NUKTA + {0x1145E, 0x1145E, prExtend}, // Mn NEWA SANDHI MARK + {0x114B0, 0x114B0, prExtend}, // Mc TIRHUTA VOWEL SIGN AA + {0x114B1, 0x114B2, prSpacingMark}, // Mc [2] TIRHUTA VOWEL SIGN I..TIRHUTA VOWEL SIGN II + {0x114B3, 0x114B8, prExtend}, // Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL + {0x114B9, 0x114B9, prSpacingMark}, // Mc TIRHUTA VOWEL SIGN E + {0x114BA, 0x114BA, prExtend}, // Mn TIRHUTA VOWEL SIGN SHORT E + {0x114BB, 0x114BC, prSpacingMark}, // Mc [2] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN O + {0x114BD, 0x114BD, prExtend}, // Mc TIRHUTA VOWEL SIGN SHORT O + {0x114BE, 0x114BE, prSpacingMark}, // Mc TIRHUTA VOWEL SIGN AU + {0x114BF, 0x114C0, prExtend}, // Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA + {0x114C1, 0x114C1, prSpacingMark}, // Mc TIRHUTA SIGN VISARGA + {0x114C2, 0x114C3, prExtend}, // Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA + {0x115AF, 0x115AF, prExtend}, // Mc SIDDHAM VOWEL SIGN AA + {0x115B0, 0x115B1, prSpacingMark}, // Mc [2] SIDDHAM VOWEL SIGN I..SIDDHAM VOWEL SIGN II + {0x115B2, 0x115B5, prExtend}, // Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR + {0x115B8, 0x115BB, prSpacingMark}, // Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU + {0x115BC, 0x115BD, prExtend}, // Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA + {0x115BE, 0x115BE, prSpacingMark}, // Mc SIDDHAM SIGN VISARGA + {0x115BF, 0x115C0, prExtend}, // Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA + {0x115DC, 0x115DD, prExtend}, // Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU + {0x11630, 0x11632, prSpacingMark}, // Mc [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II + {0x11633, 0x1163A, prExtend}, // Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI + {0x1163B, 0x1163C, prSpacingMark}, // Mc [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU + {0x1163D, 0x1163D, prExtend}, // Mn MODI SIGN ANUSVARA + {0x1163E, 0x1163E, prSpacingMark}, // Mc MODI SIGN VISARGA + {0x1163F, 0x11640, prExtend}, // Mn [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA + {0x116AB, 0x116AB, prExtend}, // Mn TAKRI SIGN ANUSVARA + {0x116AC, 0x116AC, prSpacingMark}, // Mc TAKRI SIGN VISARGA + {0x116AD, 0x116AD, prExtend}, // Mn TAKRI VOWEL SIGN AA + {0x116AE, 0x116AF, prSpacingMark}, // Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II + {0x116B0, 0x116B5, prExtend}, // Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU + {0x116B6, 0x116B6, prSpacingMark}, // Mc TAKRI SIGN VIRAMA + {0x116B7, 0x116B7, prExtend}, // Mn TAKRI SIGN NUKTA + {0x1171D, 0x1171F, prExtend}, // Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA + {0x11722, 0x11725, prExtend}, // Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU + {0x11726, 0x11726, prSpacingMark}, // Mc AHOM VOWEL SIGN E + {0x11727, 0x1172B, prExtend}, // Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER + {0x1182C, 0x1182E, prSpacingMark}, // Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II + {0x1182F, 0x11837, prExtend}, // Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA + {0x11838, 0x11838, prSpacingMark}, // Mc DOGRA SIGN VISARGA + {0x11839, 0x1183A, prExtend}, // Mn [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA + {0x11930, 0x11930, prExtend}, // Mc DIVES AKURU VOWEL SIGN AA + {0x11931, 0x11935, prSpacingMark}, // Mc [5] DIVES AKURU VOWEL SIGN I..DIVES AKURU VOWEL SIGN E + {0x11937, 0x11938, prSpacingMark}, // Mc [2] DIVES AKURU VOWEL SIGN AI..DIVES AKURU VOWEL SIGN O + {0x1193B, 0x1193C, prExtend}, // Mn [2] DIVES AKURU SIGN ANUSVARA..DIVES AKURU SIGN CANDRABINDU + {0x1193D, 0x1193D, prSpacingMark}, // Mc DIVES AKURU SIGN HALANTA + {0x1193E, 0x1193E, prExtend}, // Mn DIVES AKURU VIRAMA + {0x1193F, 0x1193F, prPrepend}, // Lo DIVES AKURU PREFIXED NASAL SIGN + {0x11940, 0x11940, prSpacingMark}, // Mc DIVES AKURU MEDIAL YA + {0x11941, 0x11941, prPrepend}, // Lo DIVES AKURU INITIAL RA + {0x11942, 0x11942, prSpacingMark}, // Mc DIVES AKURU MEDIAL RA + {0x11943, 0x11943, prExtend}, // Mn DIVES AKURU SIGN NUKTA + {0x119D1, 0x119D3, prSpacingMark}, // Mc [3] NANDINAGARI VOWEL SIGN AA..NANDINAGARI VOWEL SIGN II + {0x119D4, 0x119D7, prExtend}, // Mn [4] NANDINAGARI VOWEL SIGN U..NANDINAGARI VOWEL SIGN VOCALIC RR + {0x119DA, 0x119DB, prExtend}, // Mn [2] NANDINAGARI VOWEL SIGN E..NANDINAGARI VOWEL SIGN AI + {0x119DC, 0x119DF, prSpacingMark}, // Mc [4] NANDINAGARI VOWEL SIGN O..NANDINAGARI SIGN VISARGA + {0x119E0, 0x119E0, prExtend}, // Mn NANDINAGARI SIGN VIRAMA + {0x119E4, 0x119E4, prSpacingMark}, // Mc NANDINAGARI VOWEL SIGN PRISHTHAMATRA E + {0x11A01, 0x11A0A, prExtend}, // Mn [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK + {0x11A33, 0x11A38, prExtend}, // Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA + {0x11A39, 0x11A39, prSpacingMark}, // Mc ZANABAZAR SQUARE SIGN VISARGA + {0x11A3A, 0x11A3A, prPrepend}, // Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA + {0x11A3B, 0x11A3E, prExtend}, // Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA + {0x11A47, 0x11A47, prExtend}, // Mn ZANABAZAR SQUARE SUBJOINER + {0x11A51, 0x11A56, prExtend}, // Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE + {0x11A57, 0x11A58, prSpacingMark}, // Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU + {0x11A59, 0x11A5B, prExtend}, // Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK + {0x11A84, 0x11A89, prPrepend}, // Lo [6] SOYOMBO SIGN JIHVAMULIYA..SOYOMBO CLUSTER-INITIAL LETTER SA + {0x11A8A, 0x11A96, prExtend}, // Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA + {0x11A97, 0x11A97, prSpacingMark}, // Mc SOYOMBO SIGN VISARGA + {0x11A98, 0x11A99, prExtend}, // Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER + {0x11C2F, 0x11C2F, prSpacingMark}, // Mc BHAIKSUKI VOWEL SIGN AA + {0x11C30, 0x11C36, prExtend}, // Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L + {0x11C38, 0x11C3D, prExtend}, // Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA + {0x11C3E, 0x11C3E, prSpacingMark}, // Mc BHAIKSUKI SIGN VISARGA + {0x11C3F, 0x11C3F, prExtend}, // Mn BHAIKSUKI SIGN VIRAMA + {0x11C92, 0x11CA7, prExtend}, // Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA + {0x11CA9, 0x11CA9, prSpacingMark}, // Mc MARCHEN SUBJOINED LETTER YA + {0x11CAA, 0x11CB0, prExtend}, // Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA + {0x11CB1, 0x11CB1, prSpacingMark}, // Mc MARCHEN VOWEL SIGN I + {0x11CB2, 0x11CB3, prExtend}, // Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E + {0x11CB4, 0x11CB4, prSpacingMark}, // Mc MARCHEN VOWEL SIGN O + {0x11CB5, 0x11CB6, prExtend}, // Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU + {0x11D31, 0x11D36, prExtend}, // Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R + {0x11D3A, 0x11D3A, prExtend}, // Mn MASARAM GONDI VOWEL SIGN E + {0x11D3C, 0x11D3D, prExtend}, // Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O + {0x11D3F, 0x11D45, prExtend}, // Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA + {0x11D46, 0x11D46, prPrepend}, // Lo MASARAM GONDI REPHA + {0x11D47, 0x11D47, prExtend}, // Mn MASARAM GONDI RA-KARA + {0x11D8A, 0x11D8E, prSpacingMark}, // Mc [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU + {0x11D90, 0x11D91, prExtend}, // Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI + {0x11D93, 0x11D94, prSpacingMark}, // Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU + {0x11D95, 0x11D95, prExtend}, // Mn GUNJALA GONDI SIGN ANUSVARA + {0x11D96, 0x11D96, prSpacingMark}, // Mc GUNJALA GONDI SIGN VISARGA + {0x11D97, 0x11D97, prExtend}, // Mn GUNJALA GONDI VIRAMA + {0x11EF3, 0x11EF4, prExtend}, // Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U + {0x11EF5, 0x11EF6, prSpacingMark}, // Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O + {0x13430, 0x13438, prControl}, // Cf [9] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END SEGMENT + {0x16AF0, 0x16AF4, prExtend}, // Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE + {0x16B30, 0x16B36, prExtend}, // Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM + {0x16F4F, 0x16F4F, prExtend}, // Mn MIAO SIGN CONSONANT MODIFIER BAR + {0x16F51, 0x16F87, prSpacingMark}, // Mc [55] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN UI + {0x16F8F, 0x16F92, prExtend}, // Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW + {0x16FE4, 0x16FE4, prExtend}, // Mn KHITAN SMALL SCRIPT FILLER + {0x16FF0, 0x16FF1, prSpacingMark}, // Mc [2] VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY + {0x1BC9D, 0x1BC9E, prExtend}, // Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK + {0x1BCA0, 0x1BCA3, prControl}, // Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP + {0x1CF00, 0x1CF2D, prExtend}, // Mn [46] ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON LEFT..ZNAMENNY COMBINING MARK KRYZH ON LEFT + {0x1CF30, 0x1CF46, prExtend}, // Mn [23] ZNAMENNY COMBINING TONAL RANGE MARK MRACHNO..ZNAMENNY PRIZNAK MODIFIER ROG + {0x1D165, 0x1D165, prExtend}, // Mc MUSICAL SYMBOL COMBINING STEM + {0x1D166, 0x1D166, prSpacingMark}, // Mc MUSICAL SYMBOL COMBINING SPRECHGESANG STEM + {0x1D167, 0x1D169, prExtend}, // Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 + {0x1D16D, 0x1D16D, prSpacingMark}, // Mc MUSICAL SYMBOL COMBINING AUGMENTATION DOT + {0x1D16E, 0x1D172, prExtend}, // Mc [5] MUSICAL SYMBOL COMBINING FLAG-1..MUSICAL SYMBOL COMBINING FLAG-5 + {0x1D173, 0x1D17A, prControl}, // Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE + {0x1D17B, 0x1D182, prExtend}, // Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE + {0x1D185, 0x1D18B, prExtend}, // Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE + {0x1D1AA, 0x1D1AD, prExtend}, // Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO + {0x1D242, 0x1D244, prExtend}, // Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME + {0x1DA00, 0x1DA36, prExtend}, // Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN + {0x1DA3B, 0x1DA6C, prExtend}, // Mn [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT + {0x1DA75, 0x1DA75, prExtend}, // Mn SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS + {0x1DA84, 0x1DA84, prExtend}, // Mn SIGNWRITING LOCATION HEAD NECK + {0x1DA9B, 0x1DA9F, prExtend}, // Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 + {0x1DAA1, 0x1DAAF, prExtend}, // Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 + {0x1E000, 0x1E006, prExtend}, // Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE + {0x1E008, 0x1E018, prExtend}, // Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU + {0x1E01B, 0x1E021, prExtend}, // Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI + {0x1E023, 0x1E024, prExtend}, // Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS + {0x1E026, 0x1E02A, prExtend}, // Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA + {0x1E130, 0x1E136, prExtend}, // Mn [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D + {0x1E2AE, 0x1E2AE, prExtend}, // Mn TOTO SIGN RISING TONE + {0x1E2EC, 0x1E2EF, prExtend}, // Mn [4] WANCHO TONE TUP..WANCHO TONE KOINI + {0x1E8D0, 0x1E8D6, prExtend}, // Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS + {0x1E944, 0x1E94A, prExtend}, // Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA + {0x1F000, 0x1F003, prExtendedPictographic}, // E0.0 [4] (🀀..đź€) MAHJONG TILE EAST WIND..MAHJONG TILE NORTH WIND + {0x1F004, 0x1F004, prExtendedPictographic}, // E0.6 [1] (🀄) mahjong red dragon + {0x1F005, 0x1F0CE, prExtendedPictographic}, // E0.0 [202] (🀅..đźŽ) MAHJONG TILE GREEN DRAGON..PLAYING CARD KING OF DIAMONDS + {0x1F0CF, 0x1F0CF, prExtendedPictographic}, // E0.6 [1] (đźŹ) joker + {0x1F0D0, 0x1F0FF, prExtendedPictographic}, // E0.0 [48] (đź..đźż) .. + {0x1F10D, 0x1F10F, prExtendedPictographic}, // E0.0 [3] (🄍..🄏) CIRCLED ZERO WITH SLASH..CIRCLED DOLLAR SIGN WITH OVERLAID BACKSLASH + {0x1F12F, 0x1F12F, prExtendedPictographic}, // E0.0 [1] (🄯) COPYLEFT SYMBOL + {0x1F16C, 0x1F16F, prExtendedPictographic}, // E0.0 [4] (đź…¬..đź…Ż) RAISED MR SIGN..CIRCLED HUMAN FIGURE + {0x1F170, 0x1F171, prExtendedPictographic}, // E0.6 [2] (🅰️..🅱️) A button (blood type)..B button (blood type) + {0x1F17E, 0x1F17F, prExtendedPictographic}, // E0.6 [2] (🅾️..🅿️) O button (blood type)..P button + {0x1F18E, 0x1F18E, prExtendedPictographic}, // E0.6 [1] (🆎) AB button (blood type) + {0x1F191, 0x1F19A, prExtendedPictographic}, // E0.6 [10] (🆑..🆚) CL button..VS button + {0x1F1AD, 0x1F1E5, prExtendedPictographic}, // E0.0 [57] (🆭..🇥) MASK WORK SYMBOL.. + {0x1F1E6, 0x1F1FF, prRegionalIndicator}, // So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z + {0x1F201, 0x1F202, prExtendedPictographic}, // E0.6 [2] (đź..đź‚️) Japanese “here” button..Japanese “service charge” button + {0x1F203, 0x1F20F, prExtendedPictographic}, // E0.0 [13] (đź..đźŹ) .. + {0x1F21A, 0x1F21A, prExtendedPictographic}, // E0.6 [1] (đźš) Japanese “free of charge” button + {0x1F22F, 0x1F22F, prExtendedPictographic}, // E0.6 [1] (đźŻ) Japanese “reserved” button + {0x1F232, 0x1F23A, prExtendedPictographic}, // E0.6 [9] (đź˛..đźş) Japanese “prohibited” button..Japanese “open for business” button + {0x1F23C, 0x1F23F, prExtendedPictographic}, // E0.0 [4] (đźĽ..đźż) .. + {0x1F249, 0x1F24F, prExtendedPictographic}, // E0.0 [7] (🉉..🉏) .. + {0x1F250, 0x1F251, prExtendedPictographic}, // E0.6 [2] (đź‰..🉑) Japanese “bargain” button..Japanese “acceptable” button + {0x1F252, 0x1F2FF, prExtendedPictographic}, // E0.0 [174] (🉒..🋿) .. + {0x1F300, 0x1F30C, prExtendedPictographic}, // E0.6 [13] (🌀..🌌) cyclone..milky way + {0x1F30D, 0x1F30E, prExtendedPictographic}, // E0.7 [2] (🌍..🌎) globe showing Europe-Africa..globe showing Americas + {0x1F30F, 0x1F30F, prExtendedPictographic}, // E0.6 [1] (🌏) globe showing Asia-Australia + {0x1F310, 0x1F310, prExtendedPictographic}, // E1.0 [1] (đźŚ) globe with meridians + {0x1F311, 0x1F311, prExtendedPictographic}, // E0.6 [1] (🌑) new moon + {0x1F312, 0x1F312, prExtendedPictographic}, // E1.0 [1] (🌒) waxing crescent moon + {0x1F313, 0x1F315, prExtendedPictographic}, // E0.6 [3] (🌓..🌕) first quarter moon..full moon + {0x1F316, 0x1F318, prExtendedPictographic}, // E1.0 [3] (🌖..đźŚ) waning gibbous moon..waning crescent moon + {0x1F319, 0x1F319, prExtendedPictographic}, // E0.6 [1] (🌙) crescent moon + {0x1F31A, 0x1F31A, prExtendedPictographic}, // E1.0 [1] (🌚) new moon face + {0x1F31B, 0x1F31B, prExtendedPictographic}, // E0.6 [1] (🌛) first quarter moon face + {0x1F31C, 0x1F31C, prExtendedPictographic}, // E0.7 [1] (🌜) last quarter moon face + {0x1F31D, 0x1F31E, prExtendedPictographic}, // E1.0 [2] (🌝..🌞) full moon face..sun with face + {0x1F31F, 0x1F320, prExtendedPictographic}, // E0.6 [2] (🌟..🌠) glowing star..shooting star + {0x1F321, 0x1F321, prExtendedPictographic}, // E0.7 [1] (🌡️) thermometer + {0x1F322, 0x1F323, prExtendedPictographic}, // E0.0 [2] (🌢..🌣) BLACK DROPLET..WHITE SUN + {0x1F324, 0x1F32C, prExtendedPictographic}, // E0.7 [9] (🌤️..🌬️) sun behind small cloud..wind face + {0x1F32D, 0x1F32F, prExtendedPictographic}, // E1.0 [3] (🌭..🌯) hot dog..burrito + {0x1F330, 0x1F331, prExtendedPictographic}, // E0.6 [2] (🌰..🌱) chestnut..seedling + {0x1F332, 0x1F333, prExtendedPictographic}, // E1.0 [2] (🌲..🌳) evergreen tree..deciduous tree + {0x1F334, 0x1F335, prExtendedPictographic}, // E0.6 [2] (🌴..🌵) palm tree..cactus + {0x1F336, 0x1F336, prExtendedPictographic}, // E0.7 [1] (🌶️) hot pepper + {0x1F337, 0x1F34A, prExtendedPictographic}, // E0.6 [20] (🌷..🍊) tulip..tangerine + {0x1F34B, 0x1F34B, prExtendedPictographic}, // E1.0 [1] (🍋) lemon + {0x1F34C, 0x1F34F, prExtendedPictographic}, // E0.6 [4] (🍌..🍏) banana..green apple + {0x1F350, 0x1F350, prExtendedPictographic}, // E1.0 [1] (đźŤ) pear + {0x1F351, 0x1F37B, prExtendedPictographic}, // E0.6 [43] (🍑..🍻) peach..clinking beer mugs + {0x1F37C, 0x1F37C, prExtendedPictographic}, // E1.0 [1] (🍼) baby bottle + {0x1F37D, 0x1F37D, prExtendedPictographic}, // E0.7 [1] (🍽️) fork and knife with plate + {0x1F37E, 0x1F37F, prExtendedPictographic}, // E1.0 [2] (🍾..🍿) bottle with popping cork..popcorn + {0x1F380, 0x1F393, prExtendedPictographic}, // E0.6 [20] (🎀..🎓) ribbon..graduation cap + {0x1F394, 0x1F395, prExtendedPictographic}, // E0.0 [2] (🎔..🎕) HEART WITH TIP ON THE LEFT..BOUQUET OF FLOWERS + {0x1F396, 0x1F397, prExtendedPictographic}, // E0.7 [2] (🎖️..🎗️) military medal..reminder ribbon + {0x1F398, 0x1F398, prExtendedPictographic}, // E0.0 [1] (đźŽ) MUSICAL KEYBOARD WITH JACKS + {0x1F399, 0x1F39B, prExtendedPictographic}, // E0.7 [3] (🎙️..🎛️) studio microphone..control knobs + {0x1F39C, 0x1F39D, prExtendedPictographic}, // E0.0 [2] (🎜..🎝) BEAMED ASCENDING MUSICAL NOTES..BEAMED DESCENDING MUSICAL NOTES + {0x1F39E, 0x1F39F, prExtendedPictographic}, // E0.7 [2] (🎞️..🎟️) film frames..admission tickets + {0x1F3A0, 0x1F3C4, prExtendedPictographic}, // E0.6 [37] (🎠..🏄) carousel horse..person surfing + {0x1F3C5, 0x1F3C5, prExtendedPictographic}, // E1.0 [1] (🏅) sports medal + {0x1F3C6, 0x1F3C6, prExtendedPictographic}, // E0.6 [1] (🏆) trophy + {0x1F3C7, 0x1F3C7, prExtendedPictographic}, // E1.0 [1] (🏇) horse racing + {0x1F3C8, 0x1F3C8, prExtendedPictographic}, // E0.6 [1] (đźŹ) american football + {0x1F3C9, 0x1F3C9, prExtendedPictographic}, // E1.0 [1] (🏉) rugby football + {0x1F3CA, 0x1F3CA, prExtendedPictographic}, // E0.6 [1] (🏊) person swimming + {0x1F3CB, 0x1F3CE, prExtendedPictographic}, // E0.7 [4] (🏋️..🏎️) person lifting weights..racing car + {0x1F3CF, 0x1F3D3, prExtendedPictographic}, // E1.0 [5] (🏏..🏓) cricket game..ping pong + {0x1F3D4, 0x1F3DF, prExtendedPictographic}, // E0.7 [12] (🏔️..🏟️) snow-capped mountain..stadium + {0x1F3E0, 0x1F3E3, prExtendedPictographic}, // E0.6 [4] (🏠..🏣) house..Japanese post office + {0x1F3E4, 0x1F3E4, prExtendedPictographic}, // E1.0 [1] (🏤) post office + {0x1F3E5, 0x1F3F0, prExtendedPictographic}, // E0.6 [12] (🏥..🏰) hospital..castle + {0x1F3F1, 0x1F3F2, prExtendedPictographic}, // E0.0 [2] (🏱..🏲) WHITE PENNANT..BLACK PENNANT + {0x1F3F3, 0x1F3F3, prExtendedPictographic}, // E0.7 [1] (🏳️) white flag + {0x1F3F4, 0x1F3F4, prExtendedPictographic}, // E1.0 [1] (🏴) black flag + {0x1F3F5, 0x1F3F5, prExtendedPictographic}, // E0.7 [1] (🏵️) rosette + {0x1F3F6, 0x1F3F6, prExtendedPictographic}, // E0.0 [1] (🏶) BLACK ROSETTE + {0x1F3F7, 0x1F3F7, prExtendedPictographic}, // E0.7 [1] (🏷️) label + {0x1F3F8, 0x1F3FA, prExtendedPictographic}, // E1.0 [3] (🏸..🏺) badminton..amphora + {0x1F3FB, 0x1F3FF, prExtend}, // Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 + {0x1F400, 0x1F407, prExtendedPictographic}, // E1.0 [8] (đź€..đź‡) rat..rabbit + {0x1F408, 0x1F408, prExtendedPictographic}, // E0.7 [1] (đź) cat + {0x1F409, 0x1F40B, prExtendedPictographic}, // E1.0 [3] (đź‰..đź‹) dragon..whale + {0x1F40C, 0x1F40E, prExtendedPictographic}, // E0.6 [3] (đźŚ..đźŽ) snail..horse + {0x1F40F, 0x1F410, prExtendedPictographic}, // E1.0 [2] (đźŹ..đź) ram..goat + {0x1F411, 0x1F412, prExtendedPictographic}, // E0.6 [2] (đź‘..đź’) ewe..monkey + {0x1F413, 0x1F413, prExtendedPictographic}, // E1.0 [1] (đź“) rooster + {0x1F414, 0x1F414, prExtendedPictographic}, // E0.6 [1] (đź”) chicken + {0x1F415, 0x1F415, prExtendedPictographic}, // E0.7 [1] (đź•) dog + {0x1F416, 0x1F416, prExtendedPictographic}, // E1.0 [1] (đź–) pig + {0x1F417, 0x1F429, prExtendedPictographic}, // E0.6 [19] (đź—..đź©) boar..poodle + {0x1F42A, 0x1F42A, prExtendedPictographic}, // E1.0 [1] (đźŞ) camel + {0x1F42B, 0x1F43E, prExtendedPictographic}, // E0.6 [20] (đź«..đźľ) two-hump camel..paw prints + {0x1F43F, 0x1F43F, prExtendedPictographic}, // E0.7 [1] (đźżď¸Ź) chipmunk + {0x1F440, 0x1F440, prExtendedPictographic}, // E0.6 [1] (đź‘€) eyes + {0x1F441, 0x1F441, prExtendedPictographic}, // E0.7 [1] (đź‘️) eye + {0x1F442, 0x1F464, prExtendedPictographic}, // E0.6 [35] (đź‘‚..👤) ear..bust in silhouette + {0x1F465, 0x1F465, prExtendedPictographic}, // E1.0 [1] (👥) busts in silhouette + {0x1F466, 0x1F46B, prExtendedPictographic}, // E0.6 [6] (👦..đź‘«) boy..woman and man holding hands + {0x1F46C, 0x1F46D, prExtendedPictographic}, // E1.0 [2] (👬..đź‘­) men holding hands..women holding hands + {0x1F46E, 0x1F4AC, prExtendedPictographic}, // E0.6 [63] (đź‘®..đź’¬) police officer..speech balloon + {0x1F4AD, 0x1F4AD, prExtendedPictographic}, // E1.0 [1] (đź’­) thought balloon + {0x1F4AE, 0x1F4B5, prExtendedPictographic}, // E0.6 [8] (đź’®..đź’µ) white flower..dollar banknote + {0x1F4B6, 0x1F4B7, prExtendedPictographic}, // E1.0 [2] (đź’¶..đź’·) euro banknote..pound banknote + {0x1F4B8, 0x1F4EB, prExtendedPictographic}, // E0.6 [52] (đź’¸..đź“«) money with wings..closed mailbox with raised flag + {0x1F4EC, 0x1F4ED, prExtendedPictographic}, // E0.7 [2] (📬..đź“­) open mailbox with raised flag..open mailbox with lowered flag + {0x1F4EE, 0x1F4EE, prExtendedPictographic}, // E0.6 [1] (đź“®) postbox + {0x1F4EF, 0x1F4EF, prExtendedPictographic}, // E1.0 [1] (📯) postal horn + {0x1F4F0, 0x1F4F4, prExtendedPictographic}, // E0.6 [5] (đź“°..đź“´) newspaper..mobile phone off + {0x1F4F5, 0x1F4F5, prExtendedPictographic}, // E1.0 [1] (📵) no mobile phones + {0x1F4F6, 0x1F4F7, prExtendedPictographic}, // E0.6 [2] (đź“¶..đź“·) antenna bars..camera + {0x1F4F8, 0x1F4F8, prExtendedPictographic}, // E1.0 [1] (📸) camera with flash + {0x1F4F9, 0x1F4FC, prExtendedPictographic}, // E0.6 [4] (📹..📼) video camera..videocassette + {0x1F4FD, 0x1F4FD, prExtendedPictographic}, // E0.7 [1] (📽️) film projector + {0x1F4FE, 0x1F4FE, prExtendedPictographic}, // E0.0 [1] (📾) PORTABLE STEREO + {0x1F4FF, 0x1F502, prExtendedPictographic}, // E1.0 [4] (📿..🔂) prayer beads..repeat single button + {0x1F503, 0x1F503, prExtendedPictographic}, // E0.6 [1] (đź”) clockwise vertical arrows + {0x1F504, 0x1F507, prExtendedPictographic}, // E1.0 [4] (🔄..🔇) counterclockwise arrows button..muted speaker + {0x1F508, 0x1F508, prExtendedPictographic}, // E0.7 [1] (đź”) speaker low volume + {0x1F509, 0x1F509, prExtendedPictographic}, // E1.0 [1] (🔉) speaker medium volume + {0x1F50A, 0x1F514, prExtendedPictographic}, // E0.6 [11] (🔊..đź””) speaker high volume..bell + {0x1F515, 0x1F515, prExtendedPictographic}, // E1.0 [1] (🔕) bell with slash + {0x1F516, 0x1F52B, prExtendedPictographic}, // E0.6 [22] (đź”–..🔫) bookmark..water pistol + {0x1F52C, 0x1F52D, prExtendedPictographic}, // E1.0 [2] (🔬..đź”­) microscope..telescope + {0x1F52E, 0x1F53D, prExtendedPictographic}, // E0.6 [16] (đź”®..đź”˝) crystal ball..downwards button + {0x1F546, 0x1F548, prExtendedPictographic}, // E0.0 [3] (🕆..đź•) WHITE LATIN CROSS..CELTIC CROSS + {0x1F549, 0x1F54A, prExtendedPictographic}, // E0.7 [2] (🕉️..🕊️) om..dove + {0x1F54B, 0x1F54E, prExtendedPictographic}, // E1.0 [4] (đź•‹..🕎) kaaba..menorah + {0x1F54F, 0x1F54F, prExtendedPictographic}, // E0.0 [1] (🕏) BOWL OF HYGIEIA + {0x1F550, 0x1F55B, prExtendedPictographic}, // E0.6 [12] (đź•..đź•›) one o’clock..twelve o’clock + {0x1F55C, 0x1F567, prExtendedPictographic}, // E0.7 [12] (🕜..đź•§) one-thirty..twelve-thirty + {0x1F568, 0x1F56E, prExtendedPictographic}, // E0.0 [7] (🕨..đź•®) RIGHT SPEAKER..BOOK + {0x1F56F, 0x1F570, prExtendedPictographic}, // E0.7 [2] (🕯️..🕰️) candle..mantelpiece clock + {0x1F571, 0x1F572, prExtendedPictographic}, // E0.0 [2] (🕱..🕲) BLACK SKULL AND CROSSBONES..NO PIRACY + {0x1F573, 0x1F579, prExtendedPictographic}, // E0.7 [7] (🕳️..🕹️) hole..joystick + {0x1F57A, 0x1F57A, prExtendedPictographic}, // E3.0 [1] (🕺) man dancing + {0x1F57B, 0x1F586, prExtendedPictographic}, // E0.0 [12] (đź•»..đź–†) LEFT HAND TELEPHONE RECEIVER..PEN OVER STAMPED ENVELOPE + {0x1F587, 0x1F587, prExtendedPictographic}, // E0.7 [1] (🖇️) linked paperclips + {0x1F588, 0x1F589, prExtendedPictographic}, // E0.0 [2] (đź–..đź–‰) BLACK PUSHPIN..LOWER LEFT PENCIL + {0x1F58A, 0x1F58D, prExtendedPictographic}, // E0.7 [4] (🖊️..🖍️) pen..crayon + {0x1F58E, 0x1F58F, prExtendedPictographic}, // E0.0 [2] (đź–Ž..đź–Ź) LEFT WRITING HAND..TURNED OK HAND SIGN + {0x1F590, 0x1F590, prExtendedPictographic}, // E0.7 [1] (đź–️) hand with fingers splayed + {0x1F591, 0x1F594, prExtendedPictographic}, // E0.0 [4] (đź–‘..đź–”) REVERSED RAISED HAND WITH FINGERS SPLAYED..REVERSED VICTORY HAND + {0x1F595, 0x1F596, prExtendedPictographic}, // E1.0 [2] (đź–•..đź––) middle finger..vulcan salute + {0x1F597, 0x1F5A3, prExtendedPictographic}, // E0.0 [13] (đź–—..đź–Ł) WHITE DOWN POINTING LEFT HAND INDEX..BLACK DOWN POINTING BACKHAND INDEX + {0x1F5A4, 0x1F5A4, prExtendedPictographic}, // E3.0 [1] (đź–¤) black heart + {0x1F5A5, 0x1F5A5, prExtendedPictographic}, // E0.7 [1] (🖥️) desktop computer + {0x1F5A6, 0x1F5A7, prExtendedPictographic}, // E0.0 [2] (đź–¦..đź–§) KEYBOARD AND MOUSE..THREE NETWORKED COMPUTERS + {0x1F5A8, 0x1F5A8, prExtendedPictographic}, // E0.7 [1] (🖨️) printer + {0x1F5A9, 0x1F5B0, prExtendedPictographic}, // E0.0 [8] (đź–©..đź–°) POCKET CALCULATOR..TWO BUTTON MOUSE + {0x1F5B1, 0x1F5B2, prExtendedPictographic}, // E0.7 [2] (🖱️..🖲️) computer mouse..trackball + {0x1F5B3, 0x1F5BB, prExtendedPictographic}, // E0.0 [9] (đź–ł..đź–») OLD PERSONAL COMPUTER..DOCUMENT WITH PICTURE + {0x1F5BC, 0x1F5BC, prExtendedPictographic}, // E0.7 [1] (🖼️) framed picture + {0x1F5BD, 0x1F5C1, prExtendedPictographic}, // E0.0 [5] (đź–˝..đź—) FRAME WITH TILES..OPEN FOLDER + {0x1F5C2, 0x1F5C4, prExtendedPictographic}, // E0.7 [3] (🗂️..🗄️) card index dividers..file cabinet + {0x1F5C5, 0x1F5D0, prExtendedPictographic}, // E0.0 [12] (đź—…..đź—) EMPTY NOTE..PAGES + {0x1F5D1, 0x1F5D3, prExtendedPictographic}, // E0.7 [3] (🗑️..🗓️) wastebasket..spiral calendar + {0x1F5D4, 0x1F5DB, prExtendedPictographic}, // E0.0 [8] (đź—”..đź—›) DESKTOP WINDOW..DECREASE FONT SIZE SYMBOL + {0x1F5DC, 0x1F5DE, prExtendedPictographic}, // E0.7 [3] (🗜️..🗞️) clamp..rolled-up newspaper + {0x1F5DF, 0x1F5E0, prExtendedPictographic}, // E0.0 [2] (đź—ź..đź— ) PAGE WITH CIRCLED TEXT..STOCK CHART + {0x1F5E1, 0x1F5E1, prExtendedPictographic}, // E0.7 [1] (🗡️) dagger + {0x1F5E2, 0x1F5E2, prExtendedPictographic}, // E0.0 [1] (đź—˘) LIPS + {0x1F5E3, 0x1F5E3, prExtendedPictographic}, // E0.7 [1] (🗣️) speaking head + {0x1F5E4, 0x1F5E7, prExtendedPictographic}, // E0.0 [4] (đź—¤..đź—§) THREE RAYS ABOVE..THREE RAYS RIGHT + {0x1F5E8, 0x1F5E8, prExtendedPictographic}, // E2.0 [1] (🗨️) left speech bubble + {0x1F5E9, 0x1F5EE, prExtendedPictographic}, // E0.0 [6] (đź—©..đź—®) RIGHT SPEECH BUBBLE..LEFT ANGER BUBBLE + {0x1F5EF, 0x1F5EF, prExtendedPictographic}, // E0.7 [1] (🗯️) right anger bubble + {0x1F5F0, 0x1F5F2, prExtendedPictographic}, // E0.0 [3] (đź—°..đź—˛) MOOD BUBBLE..LIGHTNING MOOD + {0x1F5F3, 0x1F5F3, prExtendedPictographic}, // E0.7 [1] (🗳️) ballot box with ballot + {0x1F5F4, 0x1F5F9, prExtendedPictographic}, // E0.0 [6] (đź—´..đź—ą) BALLOT SCRIPT X..BALLOT BOX WITH BOLD CHECK + {0x1F5FA, 0x1F5FA, prExtendedPictographic}, // E0.7 [1] (🗺️) world map + {0x1F5FB, 0x1F5FF, prExtendedPictographic}, // E0.6 [5] (đź—»..đź—ż) mount fuji..moai + {0x1F600, 0x1F600, prExtendedPictographic}, // E1.0 [1] (đź€) grinning face + {0x1F601, 0x1F606, prExtendedPictographic}, // E0.6 [6] (đź..đź†) beaming face with smiling eyes..grinning squinting face + {0x1F607, 0x1F608, prExtendedPictographic}, // E1.0 [2] (đź‡..đź) smiling face with halo..smiling face with horns + {0x1F609, 0x1F60D, prExtendedPictographic}, // E0.6 [5] (đź‰..đźŤ) winking face..smiling face with heart-eyes + {0x1F60E, 0x1F60E, prExtendedPictographic}, // E1.0 [1] (đźŽ) smiling face with sunglasses + {0x1F60F, 0x1F60F, prExtendedPictographic}, // E0.6 [1] (đźŹ) smirking face + {0x1F610, 0x1F610, prExtendedPictographic}, // E0.7 [1] (đź) neutral face + {0x1F611, 0x1F611, prExtendedPictographic}, // E1.0 [1] (đź‘) expressionless face + {0x1F612, 0x1F614, prExtendedPictographic}, // E0.6 [3] (đź’..đź”) unamused face..pensive face + {0x1F615, 0x1F615, prExtendedPictographic}, // E1.0 [1] (đź•) confused face + {0x1F616, 0x1F616, prExtendedPictographic}, // E0.6 [1] (đź–) confounded face + {0x1F617, 0x1F617, prExtendedPictographic}, // E1.0 [1] (đź—) kissing face + {0x1F618, 0x1F618, prExtendedPictographic}, // E0.6 [1] (đź) face blowing a kiss + {0x1F619, 0x1F619, prExtendedPictographic}, // E1.0 [1] (đź™) kissing face with smiling eyes + {0x1F61A, 0x1F61A, prExtendedPictographic}, // E0.6 [1] (đźš) kissing face with closed eyes + {0x1F61B, 0x1F61B, prExtendedPictographic}, // E1.0 [1] (đź›) face with tongue + {0x1F61C, 0x1F61E, prExtendedPictographic}, // E0.6 [3] (đźś..đźž) winking face with tongue..disappointed face + {0x1F61F, 0x1F61F, prExtendedPictographic}, // E1.0 [1] (đźź) worried face + {0x1F620, 0x1F625, prExtendedPictographic}, // E0.6 [6] (đź ..đźĄ) angry face..sad but relieved face + {0x1F626, 0x1F627, prExtendedPictographic}, // E1.0 [2] (đź¦..đź§) frowning face with open mouth..anguished face + {0x1F628, 0x1F62B, prExtendedPictographic}, // E0.6 [4] (đź¨..đź«) fearful face..tired face + {0x1F62C, 0x1F62C, prExtendedPictographic}, // E1.0 [1] (đź¬) grimacing face + {0x1F62D, 0x1F62D, prExtendedPictographic}, // E0.6 [1] (đź­) loudly crying face + {0x1F62E, 0x1F62F, prExtendedPictographic}, // E1.0 [2] (đź®..đźŻ) face with open mouth..hushed face + {0x1F630, 0x1F633, prExtendedPictographic}, // E0.6 [4] (đź°..đźł) anxious face with sweat..flushed face + {0x1F634, 0x1F634, prExtendedPictographic}, // E1.0 [1] (đź´) sleeping face + {0x1F635, 0x1F635, prExtendedPictographic}, // E0.6 [1] (đźµ) face with crossed-out eyes + {0x1F636, 0x1F636, prExtendedPictographic}, // E1.0 [1] (đź¶) face without mouth + {0x1F637, 0x1F640, prExtendedPictographic}, // E0.6 [10] (đź·..🙀) face with medical mask..weary cat + {0x1F641, 0x1F644, prExtendedPictographic}, // E1.0 [4] (đź™..🙄) slightly frowning face..face with rolling eyes + {0x1F645, 0x1F64F, prExtendedPictographic}, // E0.6 [11] (đź™…..🙏) person gesturing NO..folded hands + {0x1F680, 0x1F680, prExtendedPictographic}, // E0.6 [1] (🚀) rocket + {0x1F681, 0x1F682, prExtendedPictographic}, // E1.0 [2] (đźš..đźš‚) helicopter..locomotive + {0x1F683, 0x1F685, prExtendedPictographic}, // E0.6 [3] (đźš..đźš…) railway car..bullet train + {0x1F686, 0x1F686, prExtendedPictographic}, // E1.0 [1] (🚆) train + {0x1F687, 0x1F687, prExtendedPictographic}, // E0.6 [1] (🚇) metro + {0x1F688, 0x1F688, prExtendedPictographic}, // E1.0 [1] (đźš) light rail + {0x1F689, 0x1F689, prExtendedPictographic}, // E0.6 [1] (🚉) station + {0x1F68A, 0x1F68B, prExtendedPictographic}, // E1.0 [2] (🚊..đźš‹) tram..tram car + {0x1F68C, 0x1F68C, prExtendedPictographic}, // E0.6 [1] (🚌) bus + {0x1F68D, 0x1F68D, prExtendedPictographic}, // E0.7 [1] (🚍) oncoming bus + {0x1F68E, 0x1F68E, prExtendedPictographic}, // E1.0 [1] (🚎) trolleybus + {0x1F68F, 0x1F68F, prExtendedPictographic}, // E0.6 [1] (🚏) bus stop + {0x1F690, 0x1F690, prExtendedPictographic}, // E1.0 [1] (đźš) minibus + {0x1F691, 0x1F693, prExtendedPictographic}, // E0.6 [3] (đźš‘..đźš“) ambulance..police car + {0x1F694, 0x1F694, prExtendedPictographic}, // E0.7 [1] (đźš”) oncoming police car + {0x1F695, 0x1F695, prExtendedPictographic}, // E0.6 [1] (đźš•) taxi + {0x1F696, 0x1F696, prExtendedPictographic}, // E1.0 [1] (đźš–) oncoming taxi + {0x1F697, 0x1F697, prExtendedPictographic}, // E0.6 [1] (đźš—) automobile + {0x1F698, 0x1F698, prExtendedPictographic}, // E0.7 [1] (đźš) oncoming automobile + {0x1F699, 0x1F69A, prExtendedPictographic}, // E0.6 [2] (đźš™..đźšš) sport utility vehicle..delivery truck + {0x1F69B, 0x1F6A1, prExtendedPictographic}, // E1.0 [7] (đźš›..🚡) articulated lorry..aerial tramway + {0x1F6A2, 0x1F6A2, prExtendedPictographic}, // E0.6 [1] (🚢) ship + {0x1F6A3, 0x1F6A3, prExtendedPictographic}, // E1.0 [1] (🚣) person rowing boat + {0x1F6A4, 0x1F6A5, prExtendedPictographic}, // E0.6 [2] (🚤..🚥) speedboat..horizontal traffic light + {0x1F6A6, 0x1F6A6, prExtendedPictographic}, // E1.0 [1] (🚦) vertical traffic light + {0x1F6A7, 0x1F6AD, prExtendedPictographic}, // E0.6 [7] (đźš§..đźš­) construction..no smoking + {0x1F6AE, 0x1F6B1, prExtendedPictographic}, // E1.0 [4] (đźš®..đźš±) litter in bin sign..non-potable water + {0x1F6B2, 0x1F6B2, prExtendedPictographic}, // E0.6 [1] (🚲) bicycle + {0x1F6B3, 0x1F6B5, prExtendedPictographic}, // E1.0 [3] (đźšł..đźšµ) no bicycles..person mountain biking + {0x1F6B6, 0x1F6B6, prExtendedPictographic}, // E0.6 [1] (đźš¶) person walking + {0x1F6B7, 0x1F6B8, prExtendedPictographic}, // E1.0 [2] (đźš·..🚸) no pedestrians..children crossing + {0x1F6B9, 0x1F6BE, prExtendedPictographic}, // E0.6 [6] (đźšą..đźšľ) men’s room..water closet + {0x1F6BF, 0x1F6BF, prExtendedPictographic}, // E1.0 [1] (đźšż) shower + {0x1F6C0, 0x1F6C0, prExtendedPictographic}, // E0.6 [1] (🛀) person taking bath + {0x1F6C1, 0x1F6C5, prExtendedPictographic}, // E1.0 [5] (đź›..đź›…) bathtub..left luggage + {0x1F6C6, 0x1F6CA, prExtendedPictographic}, // E0.0 [5] (🛆..🛊) TRIANGLE WITH ROUNDED CORNERS..GIRLS SYMBOL + {0x1F6CB, 0x1F6CB, prExtendedPictographic}, // E0.7 [1] (🛋️) couch and lamp + {0x1F6CC, 0x1F6CC, prExtendedPictographic}, // E1.0 [1] (🛌) person in bed + {0x1F6CD, 0x1F6CF, prExtendedPictographic}, // E0.7 [3] (🛍️..🛏️) shopping bags..bed + {0x1F6D0, 0x1F6D0, prExtendedPictographic}, // E1.0 [1] (đź›) place of worship + {0x1F6D1, 0x1F6D2, prExtendedPictographic}, // E3.0 [2] (🛑..đź›’) stop sign..shopping cart + {0x1F6D3, 0x1F6D4, prExtendedPictographic}, // E0.0 [2] (🛓..đź›”) STUPA..PAGODA + {0x1F6D5, 0x1F6D5, prExtendedPictographic}, // E12.0 [1] (🛕) hindu temple + {0x1F6D6, 0x1F6D7, prExtendedPictographic}, // E13.0 [2] (đź›–..đź›—) hut..elevator + {0x1F6D8, 0x1F6DC, prExtendedPictographic}, // E0.0 [5] (đź›..🛜) .. + {0x1F6DD, 0x1F6DF, prExtendedPictographic}, // E14.0 [3] (🛝..🛟) playground slide..ring buoy + {0x1F6E0, 0x1F6E5, prExtendedPictographic}, // E0.7 [6] (🛠️..🛥️) hammer and wrench..motor boat + {0x1F6E6, 0x1F6E8, prExtendedPictographic}, // E0.0 [3] (🛦..🛨) UP-POINTING MILITARY AIRPLANE..UP-POINTING SMALL AIRPLANE + {0x1F6E9, 0x1F6E9, prExtendedPictographic}, // E0.7 [1] (🛩️) small airplane + {0x1F6EA, 0x1F6EA, prExtendedPictographic}, // E0.0 [1] (🛪) NORTHEAST-POINTING AIRPLANE + {0x1F6EB, 0x1F6EC, prExtendedPictographic}, // E1.0 [2] (🛫..🛬) airplane departure..airplane arrival + {0x1F6ED, 0x1F6EF, prExtendedPictographic}, // E0.0 [3] (đź›­..🛯) .. + {0x1F6F0, 0x1F6F0, prExtendedPictographic}, // E0.7 [1] (🛰️) satellite + {0x1F6F1, 0x1F6F2, prExtendedPictographic}, // E0.0 [2] (đź›±..🛲) ONCOMING FIRE ENGINE..DIESEL LOCOMOTIVE + {0x1F6F3, 0x1F6F3, prExtendedPictographic}, // E0.7 [1] (🛳️) passenger ship + {0x1F6F4, 0x1F6F6, prExtendedPictographic}, // E3.0 [3] (đź›´..đź›¶) kick scooter..canoe + {0x1F6F7, 0x1F6F8, prExtendedPictographic}, // E5.0 [2] (đź›·..🛸) sled..flying saucer + {0x1F6F9, 0x1F6F9, prExtendedPictographic}, // E11.0 [1] (🛹) skateboard + {0x1F6FA, 0x1F6FA, prExtendedPictographic}, // E12.0 [1] (🛺) auto rickshaw + {0x1F6FB, 0x1F6FC, prExtendedPictographic}, // E13.0 [2] (đź›»..🛼) pickup truck..roller skate + {0x1F6FD, 0x1F6FF, prExtendedPictographic}, // E0.0 [3] (đź›˝..🛿) .. + {0x1F774, 0x1F77F, prExtendedPictographic}, // E0.0 [12] (đźť´..đźťż) .. + {0x1F7D5, 0x1F7DF, prExtendedPictographic}, // E0.0 [11] (đźź•..đźźź) CIRCLED TRIANGLE.. + {0x1F7E0, 0x1F7EB, prExtendedPictographic}, // E12.0 [12] (đźź ..đźź«) orange circle..brown square + {0x1F7EC, 0x1F7EF, prExtendedPictographic}, // E0.0 [4] (🟬..🟯) .. + {0x1F7F0, 0x1F7F0, prExtendedPictographic}, // E14.0 [1] (đźź°) heavy equals sign + {0x1F7F1, 0x1F7FF, prExtendedPictographic}, // E0.0 [15] (đźź±..đźźż) .. + {0x1F80C, 0x1F80F, prExtendedPictographic}, // E0.0 [4] (đź Ś..đź Ź) .. + {0x1F848, 0x1F84F, prExtendedPictographic}, // E0.0 [8] (đźˇ..🡏) .. + {0x1F85A, 0x1F85F, prExtendedPictographic}, // E0.0 [6] (🡚..🡟) .. + {0x1F888, 0x1F88F, prExtendedPictographic}, // E0.0 [8] (đź˘..🢏) .. + {0x1F8AE, 0x1F8FF, prExtendedPictographic}, // E0.0 [82] (🢮..🣿) .. + {0x1F90C, 0x1F90C, prExtendedPictographic}, // E13.0 [1] (🤌) pinched fingers + {0x1F90D, 0x1F90F, prExtendedPictographic}, // E12.0 [3] (🤍..🤏) white heart..pinching hand + {0x1F910, 0x1F918, prExtendedPictographic}, // E1.0 [9] (đź¤..đź¤) zipper-mouth face..sign of the horns + {0x1F919, 0x1F91E, prExtendedPictographic}, // E3.0 [6] (🤙..🤞) call me hand..crossed fingers + {0x1F91F, 0x1F91F, prExtendedPictographic}, // E5.0 [1] (🤟) love-you gesture + {0x1F920, 0x1F927, prExtendedPictographic}, // E3.0 [8] (🤠..🤧) cowboy hat face..sneezing face + {0x1F928, 0x1F92F, prExtendedPictographic}, // E5.0 [8] (🤨..🤯) face with raised eyebrow..exploding head + {0x1F930, 0x1F930, prExtendedPictographic}, // E3.0 [1] (🤰) pregnant woman + {0x1F931, 0x1F932, prExtendedPictographic}, // E5.0 [2] (🤱..🤲) breast-feeding..palms up together + {0x1F933, 0x1F93A, prExtendedPictographic}, // E3.0 [8] (🤳..🤺) selfie..person fencing + {0x1F93C, 0x1F93E, prExtendedPictographic}, // E3.0 [3] (🤼..🤾) people wrestling..person playing handball + {0x1F93F, 0x1F93F, prExtendedPictographic}, // E12.0 [1] (🤿) diving mask + {0x1F940, 0x1F945, prExtendedPictographic}, // E3.0 [6] (🥀..🥅) wilted flower..goal net + {0x1F947, 0x1F94B, prExtendedPictographic}, // E3.0 [5] (🥇..🥋) 1st place medal..martial arts uniform + {0x1F94C, 0x1F94C, prExtendedPictographic}, // E5.0 [1] (🥌) curling stone + {0x1F94D, 0x1F94F, prExtendedPictographic}, // E11.0 [3] (🥍..🥏) lacrosse..flying disc + {0x1F950, 0x1F95E, prExtendedPictographic}, // E3.0 [15] (đźĄ..🥞) croissant..pancakes + {0x1F95F, 0x1F96B, prExtendedPictographic}, // E5.0 [13] (🥟..🥫) dumpling..canned food + {0x1F96C, 0x1F970, prExtendedPictographic}, // E11.0 [5] (🥬..🥰) leafy green..smiling face with hearts + {0x1F971, 0x1F971, prExtendedPictographic}, // E12.0 [1] (🥱) yawning face + {0x1F972, 0x1F972, prExtendedPictographic}, // E13.0 [1] (🥲) smiling face with tear + {0x1F973, 0x1F976, prExtendedPictographic}, // E11.0 [4] (🥳..🥶) partying face..cold face + {0x1F977, 0x1F978, prExtendedPictographic}, // E13.0 [2] (🥷..🥸) ninja..disguised face + {0x1F979, 0x1F979, prExtendedPictographic}, // E14.0 [1] (🥹) face holding back tears + {0x1F97A, 0x1F97A, prExtendedPictographic}, // E11.0 [1] (🥺) pleading face + {0x1F97B, 0x1F97B, prExtendedPictographic}, // E12.0 [1] (🥻) sari + {0x1F97C, 0x1F97F, prExtendedPictographic}, // E11.0 [4] (🥼..🥿) lab coat..flat shoe + {0x1F980, 0x1F984, prExtendedPictographic}, // E1.0 [5] (🦀..🦄) crab..unicorn + {0x1F985, 0x1F991, prExtendedPictographic}, // E3.0 [13] (🦅..🦑) eagle..squid + {0x1F992, 0x1F997, prExtendedPictographic}, // E5.0 [6] (🦒..🦗) giraffe..cricket + {0x1F998, 0x1F9A2, prExtendedPictographic}, // E11.0 [11] (đź¦..🦢) kangaroo..swan + {0x1F9A3, 0x1F9A4, prExtendedPictographic}, // E13.0 [2] (🦣..🦤) mammoth..dodo + {0x1F9A5, 0x1F9AA, prExtendedPictographic}, // E12.0 [6] (🦥..🦪) sloth..oyster + {0x1F9AB, 0x1F9AD, prExtendedPictographic}, // E13.0 [3] (🦫..🦭) beaver..seal + {0x1F9AE, 0x1F9AF, prExtendedPictographic}, // E12.0 [2] (🦮..🦯) guide dog..white cane + {0x1F9B0, 0x1F9B9, prExtendedPictographic}, // E11.0 [10] (🦰..🦹) red hair..supervillain + {0x1F9BA, 0x1F9BF, prExtendedPictographic}, // E12.0 [6] (🦺..🦿) safety vest..mechanical leg + {0x1F9C0, 0x1F9C0, prExtendedPictographic}, // E1.0 [1] (đź§€) cheese wedge + {0x1F9C1, 0x1F9C2, prExtendedPictographic}, // E11.0 [2] (đź§..đź§‚) cupcake..salt + {0x1F9C3, 0x1F9CA, prExtendedPictographic}, // E12.0 [8] (đź§..đź§Š) beverage box..ice + {0x1F9CB, 0x1F9CB, prExtendedPictographic}, // E13.0 [1] (đź§‹) bubble tea + {0x1F9CC, 0x1F9CC, prExtendedPictographic}, // E14.0 [1] (đź§Ś) troll + {0x1F9CD, 0x1F9CF, prExtendedPictographic}, // E12.0 [3] (đź§Ť..đź§Ź) person standing..deaf person + {0x1F9D0, 0x1F9E6, prExtendedPictographic}, // E5.0 [23] (đź§..🧦) face with monocle..socks + {0x1F9E7, 0x1F9FF, prExtendedPictographic}, // E11.0 [25] (đź§§..đź§ż) red envelope..nazar amulet + {0x1FA00, 0x1FA6F, prExtendedPictographic}, // E0.0 [112] (🨀..🩯) NEUTRAL CHESS KING.. + {0x1FA70, 0x1FA73, prExtendedPictographic}, // E12.0 [4] (đź©°..🩳) ballet shoes..shorts + {0x1FA74, 0x1FA74, prExtendedPictographic}, // E13.0 [1] (đź©´) thong sandal + {0x1FA75, 0x1FA77, prExtendedPictographic}, // E0.0 [3] (🩵..đź©·) .. + {0x1FA78, 0x1FA7A, prExtendedPictographic}, // E12.0 [3] (🩸..🩺) drop of blood..stethoscope + {0x1FA7B, 0x1FA7C, prExtendedPictographic}, // E14.0 [2] (đź©»..🩼) x-ray..crutch + {0x1FA7D, 0x1FA7F, prExtendedPictographic}, // E0.0 [3] (đź©˝..🩿) .. + {0x1FA80, 0x1FA82, prExtendedPictographic}, // E12.0 [3] (🪀..🪂) yo-yo..parachute + {0x1FA83, 0x1FA86, prExtendedPictographic}, // E13.0 [4] (đźŞ..🪆) boomerang..nesting dolls + {0x1FA87, 0x1FA8F, prExtendedPictographic}, // E0.0 [9] (🪇..🪏) .. + {0x1FA90, 0x1FA95, prExtendedPictographic}, // E12.0 [6] (đźŞ..🪕) ringed planet..banjo + {0x1FA96, 0x1FAA8, prExtendedPictographic}, // E13.0 [19] (🪖..🪨) military helmet..rock + {0x1FAA9, 0x1FAAC, prExtendedPictographic}, // E14.0 [4] (🪩..🪬) mirror ball..hamsa + {0x1FAAD, 0x1FAAF, prExtendedPictographic}, // E0.0 [3] (🪭..🪯) .. + {0x1FAB0, 0x1FAB6, prExtendedPictographic}, // E13.0 [7] (🪰..🪶) fly..feather + {0x1FAB7, 0x1FABA, prExtendedPictographic}, // E14.0 [4] (🪷..🪺) lotus..nest with eggs + {0x1FABB, 0x1FABF, prExtendedPictographic}, // E0.0 [5] (🪻..🪿) .. + {0x1FAC0, 0x1FAC2, prExtendedPictographic}, // E13.0 [3] (đź«€..đź«‚) anatomical heart..people hugging + {0x1FAC3, 0x1FAC5, prExtendedPictographic}, // E14.0 [3] (đź«..đź«…) pregnant man..person with crown + {0x1FAC6, 0x1FACF, prExtendedPictographic}, // E0.0 [10] (🫆..🫏) .. + {0x1FAD0, 0x1FAD6, prExtendedPictographic}, // E13.0 [7] (đź«..đź«–) blueberries..teapot + {0x1FAD7, 0x1FAD9, prExtendedPictographic}, // E14.0 [3] (đź«—..đź«™) pouring liquid..jar + {0x1FADA, 0x1FADF, prExtendedPictographic}, // E0.0 [6] (🫚..🫟) .. + {0x1FAE0, 0x1FAE7, prExtendedPictographic}, // E14.0 [8] (đź« ..đź«§) melting face..bubbles + {0x1FAE8, 0x1FAEF, prExtendedPictographic}, // E0.0 [8] (🫨..🫯) .. + {0x1FAF0, 0x1FAF6, prExtendedPictographic}, // E14.0 [7] (đź«°..đź«¶) hand with index finger and thumb crossed..heart hands + {0x1FAF7, 0x1FAFF, prExtendedPictographic}, // E0.0 [9] (đź«·..🫿) .. + {0x1FC00, 0x1FFFD, prExtendedPictographic}, // E0.0[1022] (đź°€..đźż˝) .. + {0xE0000, 0xE0000, prControl}, // Cn + {0xE0001, 0xE0001, prControl}, // Cf LANGUAGE TAG + {0xE0002, 0xE001F, prControl}, // Cn [30] .. + {0xE0020, 0xE007F, prExtend}, // Cf [96] TAG SPACE..CANCEL TAG + {0xE0080, 0xE00FF, prControl}, // Cn [128] .. + {0xE0100, 0xE01EF, prExtend}, // Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 + {0xE01F0, 0xE0FFF, prControl}, // Cn [3600] .. +} diff --git a/vendor/github.com/rivo/uniseg/graphemerules.go b/vendor/github.com/rivo/uniseg/graphemerules.go new file mode 100644 index 000000000..c8e07111c --- /dev/null +++ b/vendor/github.com/rivo/uniseg/graphemerules.go @@ -0,0 +1,137 @@ +package uniseg + +// The states of the grapheme cluster parser. +const ( + grAny = iota + grCR + grControlLF + grL + grLVV + grLVTT + grPrepend + grExtendedPictographic + grExtendedPictographicZWJ + grRIOdd + grRIEven +) + +// The grapheme cluster parser's breaking instructions. +const ( + grNoBoundary = iota + grBoundary +) + +// The grapheme cluster parser's state transitions. Maps (state, property) to +// (new state, breaking instruction, rule number). The breaking instruction +// always refers to the boundary between the last and next code point. +// +// This map is queried as follows: +// +// 1. Find specific state + specific property. Stop if found. +// 2. Find specific state + any property. +// 3. Find any state + specific property. +// 4. If only (2) or (3) (but not both) was found, stop. +// 5. If both (2) and (3) were found, use state from (3) and breaking instruction +// from the transition with the lower rule number, prefer (3) if rule numbers +// are equal. Stop. +// 6. Assume grAny and grBoundary. +// +// Unicode version 14.0.0. +var grTransitions = map[[2]int][3]int{ + // GB5 + {grAny, prCR}: {grCR, grBoundary, 50}, + {grAny, prLF}: {grControlLF, grBoundary, 50}, + {grAny, prControl}: {grControlLF, grBoundary, 50}, + + // GB4 + {grCR, prAny}: {grAny, grBoundary, 40}, + {grControlLF, prAny}: {grAny, grBoundary, 40}, + + // GB3. + {grCR, prLF}: {grAny, grNoBoundary, 30}, + + // GB6. + {grAny, prL}: {grL, grBoundary, 9990}, + {grL, prL}: {grL, grNoBoundary, 60}, + {grL, prV}: {grLVV, grNoBoundary, 60}, + {grL, prLV}: {grLVV, grNoBoundary, 60}, + {grL, prLVT}: {grLVTT, grNoBoundary, 60}, + + // GB7. + {grAny, prLV}: {grLVV, grBoundary, 9990}, + {grAny, prV}: {grLVV, grBoundary, 9990}, + {grLVV, prV}: {grLVV, grNoBoundary, 70}, + {grLVV, prT}: {grLVTT, grNoBoundary, 70}, + + // GB8. + {grAny, prLVT}: {grLVTT, grBoundary, 9990}, + {grAny, prT}: {grLVTT, grBoundary, 9990}, + {grLVTT, prT}: {grLVTT, grNoBoundary, 80}, + + // GB9. + {grAny, prExtend}: {grAny, grNoBoundary, 90}, + {grAny, prZWJ}: {grAny, grNoBoundary, 90}, + + // GB9a. + {grAny, prSpacingMark}: {grAny, grNoBoundary, 91}, + + // GB9b. + {grAny, prPrepend}: {grPrepend, grBoundary, 9990}, + {grPrepend, prAny}: {grAny, grNoBoundary, 92}, + + // GB11. + {grAny, prExtendedPictographic}: {grExtendedPictographic, grBoundary, 9990}, + {grExtendedPictographic, prExtend}: {grExtendedPictographic, grNoBoundary, 110}, + {grExtendedPictographic, prZWJ}: {grExtendedPictographicZWJ, grNoBoundary, 110}, + {grExtendedPictographicZWJ, prExtendedPictographic}: {grExtendedPictographic, grNoBoundary, 110}, + + // GB12 / GB13. + {grAny, prRegionalIndicator}: {grRIOdd, grBoundary, 9990}, + {grRIOdd, prRegionalIndicator}: {grRIEven, grNoBoundary, 120}, + {grRIEven, prRegionalIndicator}: {grRIOdd, grBoundary, 120}, +} + +// transitionGraphemeState determines the new state of the grapheme cluster +// parser given the current state and the next code point. It also returns +// whether a cluster boundary was detected. +func transitionGraphemeState(state int, r rune) (newState int, boundary bool) { + // Determine the property of the next character. + nextProperty := property(graphemeCodePoints, r) + + // Find the applicable transition. + transition, ok := grTransitions[[2]int{state, nextProperty}] + if ok { + // We have a specific transition. We'll use it. + return transition[0], transition[1] == grBoundary + } + + // No specific transition found. Try the less specific ones. + transAnyProp, okAnyProp := grTransitions[[2]int{state, prAny}] + transAnyState, okAnyState := grTransitions[[2]int{grAny, nextProperty}] + if okAnyProp && okAnyState { + // Both apply. We'll use a mix (see comments for grTransitions). + newState = transAnyState[0] + boundary = transAnyState[1] == grBoundary + if transAnyProp[2] < transAnyState[2] { + boundary = transAnyProp[1] == grBoundary + } + return + } + + if okAnyProp { + // We only have a specific state. + return transAnyProp[0], transAnyProp[1] == grBoundary + // This branch will probably never be reached because okAnyState will + // always be true given the current transition map. But we keep it here + // for future modifications to the transition map where this may not be + // true anymore. + } + + if okAnyState { + // We only have a specific property. + return transAnyState[0], transAnyState[1] == grBoundary + } + + // No known transition. GB999: Any Ă· Any. + return grAny, true +} diff --git a/vendor/github.com/rivo/uniseg/line.go b/vendor/github.com/rivo/uniseg/line.go new file mode 100644 index 000000000..03d1928c0 --- /dev/null +++ b/vendor/github.com/rivo/uniseg/line.go @@ -0,0 +1,129 @@ +package uniseg + +import "unicode/utf8" + +// FirstLineSegment returns the prefix of the given byte slice after which a +// decision to break the string over to the next line can or must be made, +// according to the rules of Unicode Standard Annex #14. This is used to +// implement line breaking. +// +// Line breaking, also known as word wrapping, is the process of breaking a +// section of text into lines such that it will fit in the available width of a +// page, window or other display area. +// +// The returned "segment" may not be broken into smaller parts, unless no other +// breaking opportunities present themselves, in which case you may break by +// grapheme clusters (using the FirstGraphemeCluster() function to determine the +// grapheme clusters). +// +// The "mustBreak" flag indicates whether you MUST break the line after the +// given segment (true), for example after newline characters, or you MAY break +// the line after the given segment (false). +// +// This function can be called continuously to extract all non-breaking sub-sets +// from a byte slice, as illustrated in the example below. +// +// If you don't know the current state, for example when calling the function +// for the first time, you must pass -1. For consecutive calls, pass the state +// and rest slice returned by the previous call. +// +// The "rest" slice is the sub-slice of the original byte slice "b" starting +// after the last byte of the identified line segment. If the length of the +// "rest" slice is 0, the entire byte slice "b" has been processed. The +// "segment" byte slice is the sub-slice of the input slice containing the +// identified line segment. +// +// Given an empty byte slice "b", the function returns nil values. +// +// Note that in accordance with UAX #14 LB3, the final segment will end with +// "mustBreak" set to true. You can choose to ignore this by checking if the +// length of the "rest" slice is 0 and calling [HasTrailingLineBreak] or +// [HasTrailingLineBreakInString] on the last rune. +// +// Note also that this algorithm may break within grapheme clusters. This is +// addressed in Section 8.2 Example 6 of UAX #14. To avoid this, you can use +// the Step() function instead. +func FirstLineSegment(b []byte, state int) (segment, rest []byte, mustBreak bool, newState int) { + // An empty byte slice returns nothing. + if len(b) == 0 { + return + } + + // Extract the first rune. + r, length := utf8.DecodeRune(b) + if len(b) <= length { // If we're already past the end, there is nothing else to parse. + return b, nil, true, lbAny // LB3. + } + + // If we don't know the state, determine it now. + if state < 0 { + state, _ = transitionLineBreakState(state, r, b[length:], "") + } + + // Transition until we find a boundary. + var boundary int + for { + r, l := utf8.DecodeRune(b[length:]) + state, boundary = transitionLineBreakState(state, r, b[length+l:], "") + + if boundary != LineDontBreak { + return b[:length], b[length:], boundary == LineMustBreak, state + } + + length += l + if len(b) <= length { + return b, nil, true, lbAny // LB3 + } + } +} + +// FirstLineSegmentInString is like FirstLineSegment() but its input and outputs +// are strings. +func FirstLineSegmentInString(str string, state int) (segment, rest string, mustBreak bool, newState int) { + // An empty byte slice returns nothing. + if len(str) == 0 { + return + } + + // Extract the first rune. + r, length := utf8.DecodeRuneInString(str) + if len(str) <= length { // If we're already past the end, there is nothing else to parse. + return str, "", true, lbAny // LB3. + } + + // If we don't know the state, determine it now. + if state < 0 { + state, _ = transitionLineBreakState(state, r, nil, str[length:]) + } + + // Transition until we find a boundary. + var boundary int + for { + r, l := utf8.DecodeRuneInString(str[length:]) + state, boundary = transitionLineBreakState(state, r, nil, str[length+l:]) + + if boundary != LineDontBreak { + return str[:length], str[length:], boundary == LineMustBreak, state + } + + length += l + if len(str) <= length { + return str, "", true, lbAny // LB3. + } + } +} + +// HasTrailingLineBreak returns true if the last rune in the given byte slice is +// one of the hard line break code points as defined in LB4 and LB5 of UAX #14. +func HasTrailingLineBreak(b []byte) bool { + r, _ := utf8.DecodeLastRune(b) + property, _ := propertyWithGenCat(lineBreakCodePoints, r) + return property == lbBK || property == lbCR || property == lbLF || property == lbNL +} + +// HasTrailingLineBreakInString is like [HasTrailingLineBreak] but for a string. +func HasTrailingLineBreakInString(str string) bool { + r, _ := utf8.DecodeLastRuneInString(str) + property, _ := propertyWithGenCat(lineBreakCodePoints, r) + return property == lbBK || property == lbCR || property == lbLF || property == lbNL +} diff --git a/vendor/github.com/rivo/uniseg/lineproperties.go b/vendor/github.com/rivo/uniseg/lineproperties.go new file mode 100644 index 000000000..98948adf8 --- /dev/null +++ b/vendor/github.com/rivo/uniseg/lineproperties.go @@ -0,0 +1,3510 @@ +package uniseg + +// Code generated via go generate from gen_properties.go. DO NOT EDIT. + +// lineBreakCodePoints are taken from +// https://www.unicode.org/Public/14.0.0/ucd/LineBreak.txt +// on July 25, 2022. See https://www.unicode.org/license.html for the Unicode +// license agreement. +var lineBreakCodePoints = [][4]int{ + {0x0000, 0x0008, prCM, gcCc}, // [9] .. + {0x0009, 0x0009, prBA, gcCc}, // + {0x000A, 0x000A, prLF, gcCc}, // + {0x000B, 0x000C, prBK, gcCc}, // [2] .. + {0x000D, 0x000D, prCR, gcCc}, // + {0x000E, 0x001F, prCM, gcCc}, // [18] .. + {0x0020, 0x0020, prSP, gcZs}, // SPACE + {0x0021, 0x0021, prEX, gcPo}, // EXCLAMATION MARK + {0x0022, 0x0022, prQU, gcPo}, // QUOTATION MARK + {0x0023, 0x0023, prAL, gcPo}, // NUMBER SIGN + {0x0024, 0x0024, prPR, gcSc}, // DOLLAR SIGN + {0x0025, 0x0025, prPO, gcPo}, // PERCENT SIGN + {0x0026, 0x0026, prAL, gcPo}, // AMPERSAND + {0x0027, 0x0027, prQU, gcPo}, // APOSTROPHE + {0x0028, 0x0028, prOP, gcPs}, // LEFT PARENTHESIS + {0x0029, 0x0029, prCP, gcPe}, // RIGHT PARENTHESIS + {0x002A, 0x002A, prAL, gcPo}, // ASTERISK + {0x002B, 0x002B, prPR, gcSm}, // PLUS SIGN + {0x002C, 0x002C, prIS, gcPo}, // COMMA + {0x002D, 0x002D, prHY, gcPd}, // HYPHEN-MINUS + {0x002E, 0x002E, prIS, gcPo}, // FULL STOP + {0x002F, 0x002F, prSY, gcPo}, // SOLIDUS + {0x0030, 0x0039, prNU, gcNd}, // [10] DIGIT ZERO..DIGIT NINE + {0x003A, 0x003B, prIS, gcPo}, // [2] COLON..SEMICOLON + {0x003C, 0x003E, prAL, gcSm}, // [3] LESS-THAN SIGN..GREATER-THAN SIGN + {0x003F, 0x003F, prEX, gcPo}, // QUESTION MARK + {0x0040, 0x0040, prAL, gcPo}, // COMMERCIAL AT + {0x0041, 0x005A, prAL, gcLu}, // [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z + {0x005B, 0x005B, prOP, gcPs}, // LEFT SQUARE BRACKET + {0x005C, 0x005C, prPR, gcPo}, // REVERSE SOLIDUS + {0x005D, 0x005D, prCP, gcPe}, // RIGHT SQUARE BRACKET + {0x005E, 0x005E, prAL, gcSk}, // CIRCUMFLEX ACCENT + {0x005F, 0x005F, prAL, gcPc}, // LOW LINE + {0x0060, 0x0060, prAL, gcSk}, // GRAVE ACCENT + {0x0061, 0x007A, prAL, gcLl}, // [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z + {0x007B, 0x007B, prOP, gcPs}, // LEFT CURLY BRACKET + {0x007C, 0x007C, prBA, gcSm}, // VERTICAL LINE + {0x007D, 0x007D, prCL, gcPe}, // RIGHT CURLY BRACKET + {0x007E, 0x007E, prAL, gcSm}, // TILDE + {0x007F, 0x007F, prCM, gcCc}, // + {0x0080, 0x0084, prCM, gcCc}, // [5] .. + {0x0085, 0x0085, prNL, gcCc}, // + {0x0086, 0x009F, prCM, gcCc}, // [26] .. + {0x00A0, 0x00A0, prGL, gcZs}, // NO-BREAK SPACE + {0x00A1, 0x00A1, prOP, gcPo}, // INVERTED EXCLAMATION MARK + {0x00A2, 0x00A2, prPO, gcSc}, // CENT SIGN + {0x00A3, 0x00A5, prPR, gcSc}, // [3] POUND SIGN..YEN SIGN + {0x00A6, 0x00A6, prAL, gcSo}, // BROKEN BAR + {0x00A7, 0x00A7, prAI, gcPo}, // SECTION SIGN + {0x00A8, 0x00A8, prAI, gcSk}, // DIAERESIS + {0x00A9, 0x00A9, prAL, gcSo}, // COPYRIGHT SIGN + {0x00AA, 0x00AA, prAI, gcLo}, // FEMININE ORDINAL INDICATOR + {0x00AB, 0x00AB, prQU, gcPi}, // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + {0x00AC, 0x00AC, prAL, gcSm}, // NOT SIGN + {0x00AD, 0x00AD, prBA, gcCf}, // SOFT HYPHEN + {0x00AE, 0x00AE, prAL, gcSo}, // REGISTERED SIGN + {0x00AF, 0x00AF, prAL, gcSk}, // MACRON + {0x00B0, 0x00B0, prPO, gcSo}, // DEGREE SIGN + {0x00B1, 0x00B1, prPR, gcSm}, // PLUS-MINUS SIGN + {0x00B2, 0x00B3, prAI, gcNo}, // [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE + {0x00B4, 0x00B4, prBB, gcSk}, // ACUTE ACCENT + {0x00B5, 0x00B5, prAL, gcLl}, // MICRO SIGN + {0x00B6, 0x00B7, prAI, gcPo}, // [2] PILCROW SIGN..MIDDLE DOT + {0x00B8, 0x00B8, prAI, gcSk}, // CEDILLA + {0x00B9, 0x00B9, prAI, gcNo}, // SUPERSCRIPT ONE + {0x00BA, 0x00BA, prAI, gcLo}, // MASCULINE ORDINAL INDICATOR + {0x00BB, 0x00BB, prQU, gcPf}, // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + {0x00BC, 0x00BE, prAI, gcNo}, // [3] VULGAR FRACTION ONE QUARTER..VULGAR FRACTION THREE QUARTERS + {0x00BF, 0x00BF, prOP, gcPo}, // INVERTED QUESTION MARK + {0x00C0, 0x00D6, prAL, gcLu}, // [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS + {0x00D7, 0x00D7, prAI, gcSm}, // MULTIPLICATION SIGN + {0x00D8, 0x00F6, prAL, gcLC}, // [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS + {0x00F7, 0x00F7, prAI, gcSm}, // DIVISION SIGN + {0x00F8, 0x00FF, prAL, gcLl}, // [8] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER Y WITH DIAERESIS + {0x0100, 0x017F, prAL, gcLC}, // [128] LATIN CAPITAL LETTER A WITH MACRON..LATIN SMALL LETTER LONG S + {0x0180, 0x01BA, prAL, gcLC}, // [59] LATIN SMALL LETTER B WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL + {0x01BB, 0x01BB, prAL, gcLo}, // LATIN LETTER TWO WITH STROKE + {0x01BC, 0x01BF, prAL, gcLC}, // [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN + {0x01C0, 0x01C3, prAL, gcLo}, // [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK + {0x01C4, 0x024F, prAL, gcLC}, // [140] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER Y WITH STROKE + {0x0250, 0x0293, prAL, gcLl}, // [68] LATIN SMALL LETTER TURNED A..LATIN SMALL LETTER EZH WITH CURL + {0x0294, 0x0294, prAL, gcLo}, // LATIN LETTER GLOTTAL STOP + {0x0295, 0x02AF, prAL, gcLl}, // [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL + {0x02B0, 0x02C1, prAL, gcLm}, // [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP + {0x02C2, 0x02C5, prAL, gcSk}, // [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD + {0x02C6, 0x02C6, prAL, gcLm}, // MODIFIER LETTER CIRCUMFLEX ACCENT + {0x02C7, 0x02C7, prAI, gcLm}, // CARON + {0x02C8, 0x02C8, prBB, gcLm}, // MODIFIER LETTER VERTICAL LINE + {0x02C9, 0x02CB, prAI, gcLm}, // [3] MODIFIER LETTER MACRON..MODIFIER LETTER GRAVE ACCENT + {0x02CC, 0x02CC, prBB, gcLm}, // MODIFIER LETTER LOW VERTICAL LINE + {0x02CD, 0x02CD, prAI, gcLm}, // MODIFIER LETTER LOW MACRON + {0x02CE, 0x02CF, prAL, gcLm}, // [2] MODIFIER LETTER LOW GRAVE ACCENT..MODIFIER LETTER LOW ACUTE ACCENT + {0x02D0, 0x02D0, prAI, gcLm}, // MODIFIER LETTER TRIANGULAR COLON + {0x02D1, 0x02D1, prAL, gcLm}, // MODIFIER LETTER HALF TRIANGULAR COLON + {0x02D2, 0x02D7, prAL, gcSk}, // [6] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER MINUS SIGN + {0x02D8, 0x02DB, prAI, gcSk}, // [4] BREVE..OGONEK + {0x02DC, 0x02DC, prAL, gcSk}, // SMALL TILDE + {0x02DD, 0x02DD, prAI, gcSk}, // DOUBLE ACUTE ACCENT + {0x02DE, 0x02DE, prAL, gcSk}, // MODIFIER LETTER RHOTIC HOOK + {0x02DF, 0x02DF, prBB, gcSk}, // MODIFIER LETTER CROSS ACCENT + {0x02E0, 0x02E4, prAL, gcLm}, // [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP + {0x02E5, 0x02EB, prAL, gcSk}, // [7] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER YANG DEPARTING TONE MARK + {0x02EC, 0x02EC, prAL, gcLm}, // MODIFIER LETTER VOICING + {0x02ED, 0x02ED, prAL, gcSk}, // MODIFIER LETTER UNASPIRATED + {0x02EE, 0x02EE, prAL, gcLm}, // MODIFIER LETTER DOUBLE APOSTROPHE + {0x02EF, 0x02FF, prAL, gcSk}, // [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW + {0x0300, 0x034E, prCM, gcMn}, // [79] COMBINING GRAVE ACCENT..COMBINING UPWARDS ARROW BELOW + {0x034F, 0x034F, prGL, gcMn}, // COMBINING GRAPHEME JOINER + {0x0350, 0x035B, prCM, gcMn}, // [12] COMBINING RIGHT ARROWHEAD ABOVE..COMBINING ZIGZAG ABOVE + {0x035C, 0x0362, prGL, gcMn}, // [7] COMBINING DOUBLE BREVE BELOW..COMBINING DOUBLE RIGHTWARDS ARROW BELOW + {0x0363, 0x036F, prCM, gcMn}, // [13] COMBINING LATIN SMALL LETTER A..COMBINING LATIN SMALL LETTER X + {0x0370, 0x0373, prAL, gcLC}, // [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI + {0x0374, 0x0374, prAL, gcLm}, // GREEK NUMERAL SIGN + {0x0375, 0x0375, prAL, gcSk}, // GREEK LOWER NUMERAL SIGN + {0x0376, 0x0377, prAL, gcLC}, // [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA + {0x037A, 0x037A, prAL, gcLm}, // GREEK YPOGEGRAMMENI + {0x037B, 0x037D, prAL, gcLl}, // [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL + {0x037E, 0x037E, prIS, gcPo}, // GREEK QUESTION MARK + {0x037F, 0x037F, prAL, gcLu}, // GREEK CAPITAL LETTER YOT + {0x0384, 0x0385, prAL, gcSk}, // [2] GREEK TONOS..GREEK DIALYTIKA TONOS + {0x0386, 0x0386, prAL, gcLu}, // GREEK CAPITAL LETTER ALPHA WITH TONOS + {0x0387, 0x0387, prAL, gcPo}, // GREEK ANO TELEIA + {0x0388, 0x038A, prAL, gcLu}, // [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS + {0x038C, 0x038C, prAL, gcLu}, // GREEK CAPITAL LETTER OMICRON WITH TONOS + {0x038E, 0x03A1, prAL, gcLC}, // [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO + {0x03A3, 0x03F5, prAL, gcLC}, // [83] GREEK CAPITAL LETTER SIGMA..GREEK LUNATE EPSILON SYMBOL + {0x03F6, 0x03F6, prAL, gcSm}, // GREEK REVERSED LUNATE EPSILON SYMBOL + {0x03F7, 0x03FF, prAL, gcLC}, // [9] GREEK CAPITAL LETTER SHO..GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL + {0x0400, 0x0481, prAL, gcLC}, // [130] CYRILLIC CAPITAL LETTER IE WITH GRAVE..CYRILLIC SMALL LETTER KOPPA + {0x0482, 0x0482, prAL, gcSo}, // CYRILLIC THOUSANDS SIGN + {0x0483, 0x0487, prCM, gcMn}, // [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE + {0x0488, 0x0489, prCM, gcMe}, // [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN + {0x048A, 0x04FF, prAL, gcLC}, // [118] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER HA WITH STROKE + {0x0500, 0x052F, prAL, gcLC}, // [48] CYRILLIC CAPITAL LETTER KOMI DE..CYRILLIC SMALL LETTER EL WITH DESCENDER + {0x0531, 0x0556, prAL, gcLu}, // [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH + {0x0559, 0x0559, prAL, gcLm}, // ARMENIAN MODIFIER LETTER LEFT HALF RING + {0x055A, 0x055F, prAL, gcPo}, // [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK + {0x0560, 0x0588, prAL, gcLl}, // [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE + {0x0589, 0x0589, prIS, gcPo}, // ARMENIAN FULL STOP + {0x058A, 0x058A, prBA, gcPd}, // ARMENIAN HYPHEN + {0x058D, 0x058E, prAL, gcSo}, // [2] RIGHT-FACING ARMENIAN ETERNITY SIGN..LEFT-FACING ARMENIAN ETERNITY SIGN + {0x058F, 0x058F, prPR, gcSc}, // ARMENIAN DRAM SIGN + {0x0591, 0x05BD, prCM, gcMn}, // [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG + {0x05BE, 0x05BE, prBA, gcPd}, // HEBREW PUNCTUATION MAQAF + {0x05BF, 0x05BF, prCM, gcMn}, // HEBREW POINT RAFE + {0x05C0, 0x05C0, prAL, gcPo}, // HEBREW PUNCTUATION PASEQ + {0x05C1, 0x05C2, prCM, gcMn}, // [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT + {0x05C3, 0x05C3, prAL, gcPo}, // HEBREW PUNCTUATION SOF PASUQ + {0x05C4, 0x05C5, prCM, gcMn}, // [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT + {0x05C6, 0x05C6, prEX, gcPo}, // HEBREW PUNCTUATION NUN HAFUKHA + {0x05C7, 0x05C7, prCM, gcMn}, // HEBREW POINT QAMATS QATAN + {0x05D0, 0x05EA, prHL, gcLo}, // [27] HEBREW LETTER ALEF..HEBREW LETTER TAV + {0x05EF, 0x05F2, prHL, gcLo}, // [4] HEBREW YOD TRIANGLE..HEBREW LIGATURE YIDDISH DOUBLE YOD + {0x05F3, 0x05F4, prAL, gcPo}, // [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM + {0x0600, 0x0605, prAL, gcCf}, // [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE + {0x0606, 0x0608, prAL, gcSm}, // [3] ARABIC-INDIC CUBE ROOT..ARABIC RAY + {0x0609, 0x060A, prPO, gcPo}, // [2] ARABIC-INDIC PER MILLE SIGN..ARABIC-INDIC PER TEN THOUSAND SIGN + {0x060B, 0x060B, prPO, gcSc}, // AFGHANI SIGN + {0x060C, 0x060D, prIS, gcPo}, // [2] ARABIC COMMA..ARABIC DATE SEPARATOR + {0x060E, 0x060F, prAL, gcSo}, // [2] ARABIC POETIC VERSE SIGN..ARABIC SIGN MISRA + {0x0610, 0x061A, prCM, gcMn}, // [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA + {0x061B, 0x061B, prEX, gcPo}, // ARABIC SEMICOLON + {0x061C, 0x061C, prCM, gcCf}, // ARABIC LETTER MARK + {0x061D, 0x061F, prEX, gcPo}, // [3] ARABIC END OF TEXT MARK..ARABIC QUESTION MARK + {0x0620, 0x063F, prAL, gcLo}, // [32] ARABIC LETTER KASHMIRI YEH..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE + {0x0640, 0x0640, prAL, gcLm}, // ARABIC TATWEEL + {0x0641, 0x064A, prAL, gcLo}, // [10] ARABIC LETTER FEH..ARABIC LETTER YEH + {0x064B, 0x065F, prCM, gcMn}, // [21] ARABIC FATHATAN..ARABIC WAVY HAMZA BELOW + {0x0660, 0x0669, prNU, gcNd}, // [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE + {0x066A, 0x066A, prPO, gcPo}, // ARABIC PERCENT SIGN + {0x066B, 0x066C, prNU, gcPo}, // [2] ARABIC DECIMAL SEPARATOR..ARABIC THOUSANDS SEPARATOR + {0x066D, 0x066D, prAL, gcPo}, // ARABIC FIVE POINTED STAR + {0x066E, 0x066F, prAL, gcLo}, // [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF + {0x0670, 0x0670, prCM, gcMn}, // ARABIC LETTER SUPERSCRIPT ALEF + {0x0671, 0x06D3, prAL, gcLo}, // [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE + {0x06D4, 0x06D4, prEX, gcPo}, // ARABIC FULL STOP + {0x06D5, 0x06D5, prAL, gcLo}, // ARABIC LETTER AE + {0x06D6, 0x06DC, prCM, gcMn}, // [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN + {0x06DD, 0x06DD, prAL, gcCf}, // ARABIC END OF AYAH + {0x06DE, 0x06DE, prAL, gcSo}, // ARABIC START OF RUB EL HIZB + {0x06DF, 0x06E4, prCM, gcMn}, // [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA + {0x06E5, 0x06E6, prAL, gcLm}, // [2] ARABIC SMALL WAW..ARABIC SMALL YEH + {0x06E7, 0x06E8, prCM, gcMn}, // [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON + {0x06E9, 0x06E9, prAL, gcSo}, // ARABIC PLACE OF SAJDAH + {0x06EA, 0x06ED, prCM, gcMn}, // [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM + {0x06EE, 0x06EF, prAL, gcLo}, // [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V + {0x06F0, 0x06F9, prNU, gcNd}, // [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE + {0x06FA, 0x06FC, prAL, gcLo}, // [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW + {0x06FD, 0x06FE, prAL, gcSo}, // [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN + {0x06FF, 0x06FF, prAL, gcLo}, // ARABIC LETTER HEH WITH INVERTED V + {0x0700, 0x070D, prAL, gcPo}, // [14] SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS + {0x070F, 0x070F, prAL, gcCf}, // SYRIAC ABBREVIATION MARK + {0x0710, 0x0710, prAL, gcLo}, // SYRIAC LETTER ALAPH + {0x0711, 0x0711, prCM, gcMn}, // SYRIAC LETTER SUPERSCRIPT ALAPH + {0x0712, 0x072F, prAL, gcLo}, // [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH + {0x0730, 0x074A, prCM, gcMn}, // [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH + {0x074D, 0x074F, prAL, gcLo}, // [3] SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE + {0x0750, 0x077F, prAL, gcLo}, // [48] ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW..ARABIC LETTER KAF WITH TWO DOTS ABOVE + {0x0780, 0x07A5, prAL, gcLo}, // [38] THAANA LETTER HAA..THAANA LETTER WAAVU + {0x07A6, 0x07B0, prCM, gcMn}, // [11] THAANA ABAFILI..THAANA SUKUN + {0x07B1, 0x07B1, prAL, gcLo}, // THAANA LETTER NAA + {0x07C0, 0x07C9, prNU, gcNd}, // [10] NKO DIGIT ZERO..NKO DIGIT NINE + {0x07CA, 0x07EA, prAL, gcLo}, // [33] NKO LETTER A..NKO LETTER JONA RA + {0x07EB, 0x07F3, prCM, gcMn}, // [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE + {0x07F4, 0x07F5, prAL, gcLm}, // [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE + {0x07F6, 0x07F6, prAL, gcSo}, // NKO SYMBOL OO DENNEN + {0x07F7, 0x07F7, prAL, gcPo}, // NKO SYMBOL GBAKURUNEN + {0x07F8, 0x07F8, prIS, gcPo}, // NKO COMMA + {0x07F9, 0x07F9, prEX, gcPo}, // NKO EXCLAMATION MARK + {0x07FA, 0x07FA, prAL, gcLm}, // NKO LAJANYALAN + {0x07FD, 0x07FD, prCM, gcMn}, // NKO DANTAYALAN + {0x07FE, 0x07FF, prPR, gcSc}, // [2] NKO DOROME SIGN..NKO TAMAN SIGN + {0x0800, 0x0815, prAL, gcLo}, // [22] SAMARITAN LETTER ALAF..SAMARITAN LETTER TAAF + {0x0816, 0x0819, prCM, gcMn}, // [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH + {0x081A, 0x081A, prAL, gcLm}, // SAMARITAN MODIFIER LETTER EPENTHETIC YUT + {0x081B, 0x0823, prCM, gcMn}, // [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A + {0x0824, 0x0824, prAL, gcLm}, // SAMARITAN MODIFIER LETTER SHORT A + {0x0825, 0x0827, prCM, gcMn}, // [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U + {0x0828, 0x0828, prAL, gcLm}, // SAMARITAN MODIFIER LETTER I + {0x0829, 0x082D, prCM, gcMn}, // [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA + {0x0830, 0x083E, prAL, gcPo}, // [15] SAMARITAN PUNCTUATION NEQUDAA..SAMARITAN PUNCTUATION ANNAAU + {0x0840, 0x0858, prAL, gcLo}, // [25] MANDAIC LETTER HALQA..MANDAIC LETTER AIN + {0x0859, 0x085B, prCM, gcMn}, // [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK + {0x085E, 0x085E, prAL, gcPo}, // MANDAIC PUNCTUATION + {0x0860, 0x086A, prAL, gcLo}, // [11] SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA + {0x0870, 0x0887, prAL, gcLo}, // [24] ARABIC LETTER ALEF WITH ATTACHED FATHA..ARABIC BASELINE ROUND DOT + {0x0888, 0x0888, prAL, gcSk}, // ARABIC RAISED ROUND DOT + {0x0889, 0x088E, prAL, gcLo}, // [6] ARABIC LETTER NOON WITH INVERTED SMALL V..ARABIC VERTICAL TAIL + {0x0890, 0x0891, prAL, gcCf}, // [2] ARABIC POUND MARK ABOVE..ARABIC PIASTRE MARK ABOVE + {0x0898, 0x089F, prCM, gcMn}, // [8] ARABIC SMALL HIGH WORD AL-JUZ..ARABIC HALF MADDA OVER MADDA + {0x08A0, 0x08C8, prAL, gcLo}, // [41] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER GRAF + {0x08C9, 0x08C9, prAL, gcLm}, // ARABIC SMALL FARSI YEH + {0x08CA, 0x08E1, prCM, gcMn}, // [24] ARABIC SMALL HIGH FARSI YEH..ARABIC SMALL HIGH SIGN SAFHA + {0x08E2, 0x08E2, prAL, gcCf}, // ARABIC DISPUTED END OF AYAH + {0x08E3, 0x08FF, prCM, gcMn}, // [29] ARABIC TURNED DAMMA BELOW..ARABIC MARK SIDEWAYS NOON GHUNNA + {0x0900, 0x0902, prCM, gcMn}, // [3] DEVANAGARI SIGN INVERTED CANDRABINDU..DEVANAGARI SIGN ANUSVARA + {0x0903, 0x0903, prCM, gcMc}, // DEVANAGARI SIGN VISARGA + {0x0904, 0x0939, prAL, gcLo}, // [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA + {0x093A, 0x093A, prCM, gcMn}, // DEVANAGARI VOWEL SIGN OE + {0x093B, 0x093B, prCM, gcMc}, // DEVANAGARI VOWEL SIGN OOE + {0x093C, 0x093C, prCM, gcMn}, // DEVANAGARI SIGN NUKTA + {0x093D, 0x093D, prAL, gcLo}, // DEVANAGARI SIGN AVAGRAHA + {0x093E, 0x0940, prCM, gcMc}, // [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II + {0x0941, 0x0948, prCM, gcMn}, // [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI + {0x0949, 0x094C, prCM, gcMc}, // [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU + {0x094D, 0x094D, prCM, gcMn}, // DEVANAGARI SIGN VIRAMA + {0x094E, 0x094F, prCM, gcMc}, // [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW + {0x0950, 0x0950, prAL, gcLo}, // DEVANAGARI OM + {0x0951, 0x0957, prCM, gcMn}, // [7] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN UUE + {0x0958, 0x0961, prAL, gcLo}, // [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL + {0x0962, 0x0963, prCM, gcMn}, // [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL + {0x0964, 0x0965, prBA, gcPo}, // [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA + {0x0966, 0x096F, prNU, gcNd}, // [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE + {0x0970, 0x0970, prAL, gcPo}, // DEVANAGARI ABBREVIATION SIGN + {0x0971, 0x0971, prAL, gcLm}, // DEVANAGARI SIGN HIGH SPACING DOT + {0x0972, 0x097F, prAL, gcLo}, // [14] DEVANAGARI LETTER CANDRA A..DEVANAGARI LETTER BBA + {0x0980, 0x0980, prAL, gcLo}, // BENGALI ANJI + {0x0981, 0x0981, prCM, gcMn}, // BENGALI SIGN CANDRABINDU + {0x0982, 0x0983, prCM, gcMc}, // [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA + {0x0985, 0x098C, prAL, gcLo}, // [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L + {0x098F, 0x0990, prAL, gcLo}, // [2] BENGALI LETTER E..BENGALI LETTER AI + {0x0993, 0x09A8, prAL, gcLo}, // [22] BENGALI LETTER O..BENGALI LETTER NA + {0x09AA, 0x09B0, prAL, gcLo}, // [7] BENGALI LETTER PA..BENGALI LETTER RA + {0x09B2, 0x09B2, prAL, gcLo}, // BENGALI LETTER LA + {0x09B6, 0x09B9, prAL, gcLo}, // [4] BENGALI LETTER SHA..BENGALI LETTER HA + {0x09BC, 0x09BC, prCM, gcMn}, // BENGALI SIGN NUKTA + {0x09BD, 0x09BD, prAL, gcLo}, // BENGALI SIGN AVAGRAHA + {0x09BE, 0x09C0, prCM, gcMc}, // [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II + {0x09C1, 0x09C4, prCM, gcMn}, // [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR + {0x09C7, 0x09C8, prCM, gcMc}, // [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI + {0x09CB, 0x09CC, prCM, gcMc}, // [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU + {0x09CD, 0x09CD, prCM, gcMn}, // BENGALI SIGN VIRAMA + {0x09CE, 0x09CE, prAL, gcLo}, // BENGALI LETTER KHANDA TA + {0x09D7, 0x09D7, prCM, gcMc}, // BENGALI AU LENGTH MARK + {0x09DC, 0x09DD, prAL, gcLo}, // [2] BENGALI LETTER RRA..BENGALI LETTER RHA + {0x09DF, 0x09E1, prAL, gcLo}, // [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL + {0x09E2, 0x09E3, prCM, gcMn}, // [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL + {0x09E6, 0x09EF, prNU, gcNd}, // [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE + {0x09F0, 0x09F1, prAL, gcLo}, // [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL + {0x09F2, 0x09F3, prPO, gcSc}, // [2] BENGALI RUPEE MARK..BENGALI RUPEE SIGN + {0x09F4, 0x09F8, prAL, gcNo}, // [5] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR + {0x09F9, 0x09F9, prPO, gcNo}, // BENGALI CURRENCY DENOMINATOR SIXTEEN + {0x09FA, 0x09FA, prAL, gcSo}, // BENGALI ISSHAR + {0x09FB, 0x09FB, prPR, gcSc}, // BENGALI GANDA MARK + {0x09FC, 0x09FC, prAL, gcLo}, // BENGALI LETTER VEDIC ANUSVARA + {0x09FD, 0x09FD, prAL, gcPo}, // BENGALI ABBREVIATION SIGN + {0x09FE, 0x09FE, prCM, gcMn}, // BENGALI SANDHI MARK + {0x0A01, 0x0A02, prCM, gcMn}, // [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI + {0x0A03, 0x0A03, prCM, gcMc}, // GURMUKHI SIGN VISARGA + {0x0A05, 0x0A0A, prAL, gcLo}, // [6] GURMUKHI LETTER A..GURMUKHI LETTER UU + {0x0A0F, 0x0A10, prAL, gcLo}, // [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI + {0x0A13, 0x0A28, prAL, gcLo}, // [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA + {0x0A2A, 0x0A30, prAL, gcLo}, // [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA + {0x0A32, 0x0A33, prAL, gcLo}, // [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA + {0x0A35, 0x0A36, prAL, gcLo}, // [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA + {0x0A38, 0x0A39, prAL, gcLo}, // [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA + {0x0A3C, 0x0A3C, prCM, gcMn}, // GURMUKHI SIGN NUKTA + {0x0A3E, 0x0A40, prCM, gcMc}, // [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II + {0x0A41, 0x0A42, prCM, gcMn}, // [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU + {0x0A47, 0x0A48, prCM, gcMn}, // [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI + {0x0A4B, 0x0A4D, prCM, gcMn}, // [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA + {0x0A51, 0x0A51, prCM, gcMn}, // GURMUKHI SIGN UDAAT + {0x0A59, 0x0A5C, prAL, gcLo}, // [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA + {0x0A5E, 0x0A5E, prAL, gcLo}, // GURMUKHI LETTER FA + {0x0A66, 0x0A6F, prNU, gcNd}, // [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE + {0x0A70, 0x0A71, prCM, gcMn}, // [2] GURMUKHI TIPPI..GURMUKHI ADDAK + {0x0A72, 0x0A74, prAL, gcLo}, // [3] GURMUKHI IRI..GURMUKHI EK ONKAR + {0x0A75, 0x0A75, prCM, gcMn}, // GURMUKHI SIGN YAKASH + {0x0A76, 0x0A76, prAL, gcPo}, // GURMUKHI ABBREVIATION SIGN + {0x0A81, 0x0A82, prCM, gcMn}, // [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA + {0x0A83, 0x0A83, prCM, gcMc}, // GUJARATI SIGN VISARGA + {0x0A85, 0x0A8D, prAL, gcLo}, // [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E + {0x0A8F, 0x0A91, prAL, gcLo}, // [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O + {0x0A93, 0x0AA8, prAL, gcLo}, // [22] GUJARATI LETTER O..GUJARATI LETTER NA + {0x0AAA, 0x0AB0, prAL, gcLo}, // [7] GUJARATI LETTER PA..GUJARATI LETTER RA + {0x0AB2, 0x0AB3, prAL, gcLo}, // [2] GUJARATI LETTER LA..GUJARATI LETTER LLA + {0x0AB5, 0x0AB9, prAL, gcLo}, // [5] GUJARATI LETTER VA..GUJARATI LETTER HA + {0x0ABC, 0x0ABC, prCM, gcMn}, // GUJARATI SIGN NUKTA + {0x0ABD, 0x0ABD, prAL, gcLo}, // GUJARATI SIGN AVAGRAHA + {0x0ABE, 0x0AC0, prCM, gcMc}, // [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II + {0x0AC1, 0x0AC5, prCM, gcMn}, // [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E + {0x0AC7, 0x0AC8, prCM, gcMn}, // [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI + {0x0AC9, 0x0AC9, prCM, gcMc}, // GUJARATI VOWEL SIGN CANDRA O + {0x0ACB, 0x0ACC, prCM, gcMc}, // [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU + {0x0ACD, 0x0ACD, prCM, gcMn}, // GUJARATI SIGN VIRAMA + {0x0AD0, 0x0AD0, prAL, gcLo}, // GUJARATI OM + {0x0AE0, 0x0AE1, prAL, gcLo}, // [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL + {0x0AE2, 0x0AE3, prCM, gcMn}, // [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL + {0x0AE6, 0x0AEF, prNU, gcNd}, // [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE + {0x0AF0, 0x0AF0, prAL, gcPo}, // GUJARATI ABBREVIATION SIGN + {0x0AF1, 0x0AF1, prPR, gcSc}, // GUJARATI RUPEE SIGN + {0x0AF9, 0x0AF9, prAL, gcLo}, // GUJARATI LETTER ZHA + {0x0AFA, 0x0AFF, prCM, gcMn}, // [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE + {0x0B01, 0x0B01, prCM, gcMn}, // ORIYA SIGN CANDRABINDU + {0x0B02, 0x0B03, prCM, gcMc}, // [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA + {0x0B05, 0x0B0C, prAL, gcLo}, // [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L + {0x0B0F, 0x0B10, prAL, gcLo}, // [2] ORIYA LETTER E..ORIYA LETTER AI + {0x0B13, 0x0B28, prAL, gcLo}, // [22] ORIYA LETTER O..ORIYA LETTER NA + {0x0B2A, 0x0B30, prAL, gcLo}, // [7] ORIYA LETTER PA..ORIYA LETTER RA + {0x0B32, 0x0B33, prAL, gcLo}, // [2] ORIYA LETTER LA..ORIYA LETTER LLA + {0x0B35, 0x0B39, prAL, gcLo}, // [5] ORIYA LETTER VA..ORIYA LETTER HA + {0x0B3C, 0x0B3C, prCM, gcMn}, // ORIYA SIGN NUKTA + {0x0B3D, 0x0B3D, prAL, gcLo}, // ORIYA SIGN AVAGRAHA + {0x0B3E, 0x0B3E, prCM, gcMc}, // ORIYA VOWEL SIGN AA + {0x0B3F, 0x0B3F, prCM, gcMn}, // ORIYA VOWEL SIGN I + {0x0B40, 0x0B40, prCM, gcMc}, // ORIYA VOWEL SIGN II + {0x0B41, 0x0B44, prCM, gcMn}, // [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR + {0x0B47, 0x0B48, prCM, gcMc}, // [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI + {0x0B4B, 0x0B4C, prCM, gcMc}, // [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU + {0x0B4D, 0x0B4D, prCM, gcMn}, // ORIYA SIGN VIRAMA + {0x0B55, 0x0B56, prCM, gcMn}, // [2] ORIYA SIGN OVERLINE..ORIYA AI LENGTH MARK + {0x0B57, 0x0B57, prCM, gcMc}, // ORIYA AU LENGTH MARK + {0x0B5C, 0x0B5D, prAL, gcLo}, // [2] ORIYA LETTER RRA..ORIYA LETTER RHA + {0x0B5F, 0x0B61, prAL, gcLo}, // [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL + {0x0B62, 0x0B63, prCM, gcMn}, // [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL + {0x0B66, 0x0B6F, prNU, gcNd}, // [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE + {0x0B70, 0x0B70, prAL, gcSo}, // ORIYA ISSHAR + {0x0B71, 0x0B71, prAL, gcLo}, // ORIYA LETTER WA + {0x0B72, 0x0B77, prAL, gcNo}, // [6] ORIYA FRACTION ONE QUARTER..ORIYA FRACTION THREE SIXTEENTHS + {0x0B82, 0x0B82, prCM, gcMn}, // TAMIL SIGN ANUSVARA + {0x0B83, 0x0B83, prAL, gcLo}, // TAMIL SIGN VISARGA + {0x0B85, 0x0B8A, prAL, gcLo}, // [6] TAMIL LETTER A..TAMIL LETTER UU + {0x0B8E, 0x0B90, prAL, gcLo}, // [3] TAMIL LETTER E..TAMIL LETTER AI + {0x0B92, 0x0B95, prAL, gcLo}, // [4] TAMIL LETTER O..TAMIL LETTER KA + {0x0B99, 0x0B9A, prAL, gcLo}, // [2] TAMIL LETTER NGA..TAMIL LETTER CA + {0x0B9C, 0x0B9C, prAL, gcLo}, // TAMIL LETTER JA + {0x0B9E, 0x0B9F, prAL, gcLo}, // [2] TAMIL LETTER NYA..TAMIL LETTER TTA + {0x0BA3, 0x0BA4, prAL, gcLo}, // [2] TAMIL LETTER NNA..TAMIL LETTER TA + {0x0BA8, 0x0BAA, prAL, gcLo}, // [3] TAMIL LETTER NA..TAMIL LETTER PA + {0x0BAE, 0x0BB9, prAL, gcLo}, // [12] TAMIL LETTER MA..TAMIL LETTER HA + {0x0BBE, 0x0BBF, prCM, gcMc}, // [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I + {0x0BC0, 0x0BC0, prCM, gcMn}, // TAMIL VOWEL SIGN II + {0x0BC1, 0x0BC2, prCM, gcMc}, // [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU + {0x0BC6, 0x0BC8, prCM, gcMc}, // [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI + {0x0BCA, 0x0BCC, prCM, gcMc}, // [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU + {0x0BCD, 0x0BCD, prCM, gcMn}, // TAMIL SIGN VIRAMA + {0x0BD0, 0x0BD0, prAL, gcLo}, // TAMIL OM + {0x0BD7, 0x0BD7, prCM, gcMc}, // TAMIL AU LENGTH MARK + {0x0BE6, 0x0BEF, prNU, gcNd}, // [10] TAMIL DIGIT ZERO..TAMIL DIGIT NINE + {0x0BF0, 0x0BF2, prAL, gcNo}, // [3] TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND + {0x0BF3, 0x0BF8, prAL, gcSo}, // [6] TAMIL DAY SIGN..TAMIL AS ABOVE SIGN + {0x0BF9, 0x0BF9, prPR, gcSc}, // TAMIL RUPEE SIGN + {0x0BFA, 0x0BFA, prAL, gcSo}, // TAMIL NUMBER SIGN + {0x0C00, 0x0C00, prCM, gcMn}, // TELUGU SIGN COMBINING CANDRABINDU ABOVE + {0x0C01, 0x0C03, prCM, gcMc}, // [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA + {0x0C04, 0x0C04, prCM, gcMn}, // TELUGU SIGN COMBINING ANUSVARA ABOVE + {0x0C05, 0x0C0C, prAL, gcLo}, // [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L + {0x0C0E, 0x0C10, prAL, gcLo}, // [3] TELUGU LETTER E..TELUGU LETTER AI + {0x0C12, 0x0C28, prAL, gcLo}, // [23] TELUGU LETTER O..TELUGU LETTER NA + {0x0C2A, 0x0C39, prAL, gcLo}, // [16] TELUGU LETTER PA..TELUGU LETTER HA + {0x0C3C, 0x0C3C, prCM, gcMn}, // TELUGU SIGN NUKTA + {0x0C3D, 0x0C3D, prAL, gcLo}, // TELUGU SIGN AVAGRAHA + {0x0C3E, 0x0C40, prCM, gcMn}, // [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II + {0x0C41, 0x0C44, prCM, gcMc}, // [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR + {0x0C46, 0x0C48, prCM, gcMn}, // [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI + {0x0C4A, 0x0C4D, prCM, gcMn}, // [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA + {0x0C55, 0x0C56, prCM, gcMn}, // [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK + {0x0C58, 0x0C5A, prAL, gcLo}, // [3] TELUGU LETTER TSA..TELUGU LETTER RRRA + {0x0C5D, 0x0C5D, prAL, gcLo}, // TELUGU LETTER NAKAARA POLLU + {0x0C60, 0x0C61, prAL, gcLo}, // [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL + {0x0C62, 0x0C63, prCM, gcMn}, // [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL + {0x0C66, 0x0C6F, prNU, gcNd}, // [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE + {0x0C77, 0x0C77, prBB, gcPo}, // TELUGU SIGN SIDDHAM + {0x0C78, 0x0C7E, prAL, gcNo}, // [7] TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR..TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR + {0x0C7F, 0x0C7F, prAL, gcSo}, // TELUGU SIGN TUUMU + {0x0C80, 0x0C80, prAL, gcLo}, // KANNADA SIGN SPACING CANDRABINDU + {0x0C81, 0x0C81, prCM, gcMn}, // KANNADA SIGN CANDRABINDU + {0x0C82, 0x0C83, prCM, gcMc}, // [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA + {0x0C84, 0x0C84, prBB, gcPo}, // KANNADA SIGN SIDDHAM + {0x0C85, 0x0C8C, prAL, gcLo}, // [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L + {0x0C8E, 0x0C90, prAL, gcLo}, // [3] KANNADA LETTER E..KANNADA LETTER AI + {0x0C92, 0x0CA8, prAL, gcLo}, // [23] KANNADA LETTER O..KANNADA LETTER NA + {0x0CAA, 0x0CB3, prAL, gcLo}, // [10] KANNADA LETTER PA..KANNADA LETTER LLA + {0x0CB5, 0x0CB9, prAL, gcLo}, // [5] KANNADA LETTER VA..KANNADA LETTER HA + {0x0CBC, 0x0CBC, prCM, gcMn}, // KANNADA SIGN NUKTA + {0x0CBD, 0x0CBD, prAL, gcLo}, // KANNADA SIGN AVAGRAHA + {0x0CBE, 0x0CBE, prCM, gcMc}, // KANNADA VOWEL SIGN AA + {0x0CBF, 0x0CBF, prCM, gcMn}, // KANNADA VOWEL SIGN I + {0x0CC0, 0x0CC4, prCM, gcMc}, // [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR + {0x0CC6, 0x0CC6, prCM, gcMn}, // KANNADA VOWEL SIGN E + {0x0CC7, 0x0CC8, prCM, gcMc}, // [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI + {0x0CCA, 0x0CCB, prCM, gcMc}, // [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO + {0x0CCC, 0x0CCD, prCM, gcMn}, // [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA + {0x0CD5, 0x0CD6, prCM, gcMc}, // [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK + {0x0CDD, 0x0CDE, prAL, gcLo}, // [2] KANNADA LETTER NAKAARA POLLU..KANNADA LETTER FA + {0x0CE0, 0x0CE1, prAL, gcLo}, // [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL + {0x0CE2, 0x0CE3, prCM, gcMn}, // [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL + {0x0CE6, 0x0CEF, prNU, gcNd}, // [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE + {0x0CF1, 0x0CF2, prAL, gcLo}, // [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA + {0x0D00, 0x0D01, prCM, gcMn}, // [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU + {0x0D02, 0x0D03, prCM, gcMc}, // [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA + {0x0D04, 0x0D0C, prAL, gcLo}, // [9] MALAYALAM LETTER VEDIC ANUSVARA..MALAYALAM LETTER VOCALIC L + {0x0D0E, 0x0D10, prAL, gcLo}, // [3] MALAYALAM LETTER E..MALAYALAM LETTER AI + {0x0D12, 0x0D3A, prAL, gcLo}, // [41] MALAYALAM LETTER O..MALAYALAM LETTER TTTA + {0x0D3B, 0x0D3C, prCM, gcMn}, // [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA + {0x0D3D, 0x0D3D, prAL, gcLo}, // MALAYALAM SIGN AVAGRAHA + {0x0D3E, 0x0D40, prCM, gcMc}, // [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II + {0x0D41, 0x0D44, prCM, gcMn}, // [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR + {0x0D46, 0x0D48, prCM, gcMc}, // [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI + {0x0D4A, 0x0D4C, prCM, gcMc}, // [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU + {0x0D4D, 0x0D4D, prCM, gcMn}, // MALAYALAM SIGN VIRAMA + {0x0D4E, 0x0D4E, prAL, gcLo}, // MALAYALAM LETTER DOT REPH + {0x0D4F, 0x0D4F, prAL, gcSo}, // MALAYALAM SIGN PARA + {0x0D54, 0x0D56, prAL, gcLo}, // [3] MALAYALAM LETTER CHILLU M..MALAYALAM LETTER CHILLU LLL + {0x0D57, 0x0D57, prCM, gcMc}, // MALAYALAM AU LENGTH MARK + {0x0D58, 0x0D5E, prAL, gcNo}, // [7] MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH..MALAYALAM FRACTION ONE FIFTH + {0x0D5F, 0x0D61, prAL, gcLo}, // [3] MALAYALAM LETTER ARCHAIC II..MALAYALAM LETTER VOCALIC LL + {0x0D62, 0x0D63, prCM, gcMn}, // [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL + {0x0D66, 0x0D6F, prNU, gcNd}, // [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE + {0x0D70, 0x0D78, prAL, gcNo}, // [9] MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE SIXTEENTHS + {0x0D79, 0x0D79, prPO, gcSo}, // MALAYALAM DATE MARK + {0x0D7A, 0x0D7F, prAL, gcLo}, // [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K + {0x0D81, 0x0D81, prCM, gcMn}, // SINHALA SIGN CANDRABINDU + {0x0D82, 0x0D83, prCM, gcMc}, // [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA + {0x0D85, 0x0D96, prAL, gcLo}, // [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA + {0x0D9A, 0x0DB1, prAL, gcLo}, // [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA + {0x0DB3, 0x0DBB, prAL, gcLo}, // [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA + {0x0DBD, 0x0DBD, prAL, gcLo}, // SINHALA LETTER DANTAJA LAYANNA + {0x0DC0, 0x0DC6, prAL, gcLo}, // [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA + {0x0DCA, 0x0DCA, prCM, gcMn}, // SINHALA SIGN AL-LAKUNA + {0x0DCF, 0x0DD1, prCM, gcMc}, // [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA + {0x0DD2, 0x0DD4, prCM, gcMn}, // [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA + {0x0DD6, 0x0DD6, prCM, gcMn}, // SINHALA VOWEL SIGN DIGA PAA-PILLA + {0x0DD8, 0x0DDF, prCM, gcMc}, // [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA + {0x0DE6, 0x0DEF, prNU, gcNd}, // [10] SINHALA LITH DIGIT ZERO..SINHALA LITH DIGIT NINE + {0x0DF2, 0x0DF3, prCM, gcMc}, // [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA + {0x0DF4, 0x0DF4, prAL, gcPo}, // SINHALA PUNCTUATION KUNDDALIYA + {0x0E01, 0x0E30, prSA, gcLo}, // [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A + {0x0E31, 0x0E31, prSA, gcMn}, // THAI CHARACTER MAI HAN-AKAT + {0x0E32, 0x0E33, prSA, gcLo}, // [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM + {0x0E34, 0x0E3A, prSA, gcMn}, // [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU + {0x0E3F, 0x0E3F, prPR, gcSc}, // THAI CURRENCY SYMBOL BAHT + {0x0E40, 0x0E45, prSA, gcLo}, // [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO + {0x0E46, 0x0E46, prSA, gcLm}, // THAI CHARACTER MAIYAMOK + {0x0E47, 0x0E4E, prSA, gcMn}, // [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN + {0x0E4F, 0x0E4F, prAL, gcPo}, // THAI CHARACTER FONGMAN + {0x0E50, 0x0E59, prNU, gcNd}, // [10] THAI DIGIT ZERO..THAI DIGIT NINE + {0x0E5A, 0x0E5B, prBA, gcPo}, // [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT + {0x0E81, 0x0E82, prSA, gcLo}, // [2] LAO LETTER KO..LAO LETTER KHO SUNG + {0x0E84, 0x0E84, prSA, gcLo}, // LAO LETTER KHO TAM + {0x0E86, 0x0E8A, prSA, gcLo}, // [5] LAO LETTER PALI GHA..LAO LETTER SO TAM + {0x0E8C, 0x0EA3, prSA, gcLo}, // [24] LAO LETTER PALI JHA..LAO LETTER LO LING + {0x0EA5, 0x0EA5, prSA, gcLo}, // LAO LETTER LO LOOT + {0x0EA7, 0x0EB0, prSA, gcLo}, // [10] LAO LETTER WO..LAO VOWEL SIGN A + {0x0EB1, 0x0EB1, prSA, gcMn}, // LAO VOWEL SIGN MAI KAN + {0x0EB2, 0x0EB3, prSA, gcLo}, // [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM + {0x0EB4, 0x0EBC, prSA, gcMn}, // [9] LAO VOWEL SIGN I..LAO SEMIVOWEL SIGN LO + {0x0EBD, 0x0EBD, prSA, gcLo}, // LAO SEMIVOWEL SIGN NYO + {0x0EC0, 0x0EC4, prSA, gcLo}, // [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI + {0x0EC6, 0x0EC6, prSA, gcLm}, // LAO KO LA + {0x0EC8, 0x0ECD, prSA, gcMn}, // [6] LAO TONE MAI EK..LAO NIGGAHITA + {0x0ED0, 0x0ED9, prNU, gcNd}, // [10] LAO DIGIT ZERO..LAO DIGIT NINE + {0x0EDC, 0x0EDF, prSA, gcLo}, // [4] LAO HO NO..LAO LETTER KHMU NYO + {0x0F00, 0x0F00, prAL, gcLo}, // TIBETAN SYLLABLE OM + {0x0F01, 0x0F03, prBB, gcSo}, // [3] TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA + {0x0F04, 0x0F04, prBB, gcPo}, // TIBETAN MARK INITIAL YIG MGO MDUN MA + {0x0F05, 0x0F05, prAL, gcPo}, // TIBETAN MARK CLOSING YIG MGO SGAB MA + {0x0F06, 0x0F07, prBB, gcPo}, // [2] TIBETAN MARK CARET YIG MGO PHUR SHAD MA..TIBETAN MARK YIG MGO TSHEG SHAD MA + {0x0F08, 0x0F08, prGL, gcPo}, // TIBETAN MARK SBRUL SHAD + {0x0F09, 0x0F0A, prBB, gcPo}, // [2] TIBETAN MARK BSKUR YIG MGO..TIBETAN MARK BKA- SHOG YIG MGO + {0x0F0B, 0x0F0B, prBA, gcPo}, // TIBETAN MARK INTERSYLLABIC TSHEG + {0x0F0C, 0x0F0C, prGL, gcPo}, // TIBETAN MARK DELIMITER TSHEG BSTAR + {0x0F0D, 0x0F11, prEX, gcPo}, // [5] TIBETAN MARK SHAD..TIBETAN MARK RIN CHEN SPUNGS SHAD + {0x0F12, 0x0F12, prGL, gcPo}, // TIBETAN MARK RGYA GRAM SHAD + {0x0F13, 0x0F13, prAL, gcSo}, // TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN + {0x0F14, 0x0F14, prEX, gcPo}, // TIBETAN MARK GTER TSHEG + {0x0F15, 0x0F17, prAL, gcSo}, // [3] TIBETAN LOGOTYPE SIGN CHAD RTAGS..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS + {0x0F18, 0x0F19, prCM, gcMn}, // [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS + {0x0F1A, 0x0F1F, prAL, gcSo}, // [6] TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG + {0x0F20, 0x0F29, prNU, gcNd}, // [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE + {0x0F2A, 0x0F33, prAL, gcNo}, // [10] TIBETAN DIGIT HALF ONE..TIBETAN DIGIT HALF ZERO + {0x0F34, 0x0F34, prBA, gcSo}, // TIBETAN MARK BSDUS RTAGS + {0x0F35, 0x0F35, prCM, gcMn}, // TIBETAN MARK NGAS BZUNG NYI ZLA + {0x0F36, 0x0F36, prAL, gcSo}, // TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN + {0x0F37, 0x0F37, prCM, gcMn}, // TIBETAN MARK NGAS BZUNG SGOR RTAGS + {0x0F38, 0x0F38, prAL, gcSo}, // TIBETAN MARK CHE MGO + {0x0F39, 0x0F39, prCM, gcMn}, // TIBETAN MARK TSA -PHRU + {0x0F3A, 0x0F3A, prOP, gcPs}, // TIBETAN MARK GUG RTAGS GYON + {0x0F3B, 0x0F3B, prCL, gcPe}, // TIBETAN MARK GUG RTAGS GYAS + {0x0F3C, 0x0F3C, prOP, gcPs}, // TIBETAN MARK ANG KHANG GYON + {0x0F3D, 0x0F3D, prCL, gcPe}, // TIBETAN MARK ANG KHANG GYAS + {0x0F3E, 0x0F3F, prCM, gcMc}, // [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES + {0x0F40, 0x0F47, prAL, gcLo}, // [8] TIBETAN LETTER KA..TIBETAN LETTER JA + {0x0F49, 0x0F6C, prAL, gcLo}, // [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA + {0x0F71, 0x0F7E, prCM, gcMn}, // [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO + {0x0F7F, 0x0F7F, prBA, gcMc}, // TIBETAN SIGN RNAM BCAD + {0x0F80, 0x0F84, prCM, gcMn}, // [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA + {0x0F85, 0x0F85, prBA, gcPo}, // TIBETAN MARK PALUTA + {0x0F86, 0x0F87, prCM, gcMn}, // [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS + {0x0F88, 0x0F8C, prAL, gcLo}, // [5] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN INVERTED MCHU CAN + {0x0F8D, 0x0F97, prCM, gcMn}, // [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA + {0x0F99, 0x0FBC, prCM, gcMn}, // [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA + {0x0FBE, 0x0FBF, prBA, gcSo}, // [2] TIBETAN KU RU KHA..TIBETAN KU RU KHA BZHI MIG CAN + {0x0FC0, 0x0FC5, prAL, gcSo}, // [6] TIBETAN CANTILLATION SIGN HEAVY BEAT..TIBETAN SYMBOL RDO RJE + {0x0FC6, 0x0FC6, prCM, gcMn}, // TIBETAN SYMBOL PADMA GDAN + {0x0FC7, 0x0FCC, prAL, gcSo}, // [6] TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL + {0x0FCE, 0x0FCF, prAL, gcSo}, // [2] TIBETAN SIGN RDEL NAG RDEL DKAR..TIBETAN SIGN RDEL NAG GSUM + {0x0FD0, 0x0FD1, prBB, gcPo}, // [2] TIBETAN MARK BSKA- SHOG GI MGO RGYAN..TIBETAN MARK MNYAM YIG GI MGO RGYAN + {0x0FD2, 0x0FD2, prBA, gcPo}, // TIBETAN MARK NYIS TSHEG + {0x0FD3, 0x0FD3, prBB, gcPo}, // TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA + {0x0FD4, 0x0FD4, prAL, gcPo}, // TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA + {0x0FD5, 0x0FD8, prAL, gcSo}, // [4] RIGHT-FACING SVASTI SIGN..LEFT-FACING SVASTI SIGN WITH DOTS + {0x0FD9, 0x0FDA, prGL, gcPo}, // [2] TIBETAN MARK LEADING MCHAN RTAGS..TIBETAN MARK TRAILING MCHAN RTAGS + {0x1000, 0x102A, prSA, gcLo}, // [43] MYANMAR LETTER KA..MYANMAR LETTER AU + {0x102B, 0x102C, prSA, gcMc}, // [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA + {0x102D, 0x1030, prSA, gcMn}, // [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU + {0x1031, 0x1031, prSA, gcMc}, // MYANMAR VOWEL SIGN E + {0x1032, 0x1037, prSA, gcMn}, // [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW + {0x1038, 0x1038, prSA, gcMc}, // MYANMAR SIGN VISARGA + {0x1039, 0x103A, prSA, gcMn}, // [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT + {0x103B, 0x103C, prSA, gcMc}, // [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA + {0x103D, 0x103E, prSA, gcMn}, // [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA + {0x103F, 0x103F, prSA, gcLo}, // MYANMAR LETTER GREAT SA + {0x1040, 0x1049, prNU, gcNd}, // [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE + {0x104A, 0x104B, prBA, gcPo}, // [2] MYANMAR SIGN LITTLE SECTION..MYANMAR SIGN SECTION + {0x104C, 0x104F, prAL, gcPo}, // [4] MYANMAR SYMBOL LOCATIVE..MYANMAR SYMBOL GENITIVE + {0x1050, 0x1055, prSA, gcLo}, // [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL + {0x1056, 0x1057, prSA, gcMc}, // [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR + {0x1058, 0x1059, prSA, gcMn}, // [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL + {0x105A, 0x105D, prSA, gcLo}, // [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE + {0x105E, 0x1060, prSA, gcMn}, // [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA + {0x1061, 0x1061, prSA, gcLo}, // MYANMAR LETTER SGAW KAREN SHA + {0x1062, 0x1064, prSA, gcMc}, // [3] MYANMAR VOWEL SIGN SGAW KAREN EU..MYANMAR TONE MARK SGAW KAREN KE PHO + {0x1065, 0x1066, prSA, gcLo}, // [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA + {0x1067, 0x106D, prSA, gcMc}, // [7] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR SIGN WESTERN PWO KAREN TONE-5 + {0x106E, 0x1070, prSA, gcLo}, // [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA + {0x1071, 0x1074, prSA, gcMn}, // [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE + {0x1075, 0x1081, prSA, gcLo}, // [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA + {0x1082, 0x1082, prSA, gcMn}, // MYANMAR CONSONANT SIGN SHAN MEDIAL WA + {0x1083, 0x1084, prSA, gcMc}, // [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E + {0x1085, 0x1086, prSA, gcMn}, // [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y + {0x1087, 0x108C, prSA, gcMc}, // [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3 + {0x108D, 0x108D, prSA, gcMn}, // MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE + {0x108E, 0x108E, prSA, gcLo}, // MYANMAR LETTER RUMAI PALAUNG FA + {0x108F, 0x108F, prSA, gcMc}, // MYANMAR SIGN RUMAI PALAUNG TONE-5 + {0x1090, 0x1099, prNU, gcNd}, // [10] MYANMAR SHAN DIGIT ZERO..MYANMAR SHAN DIGIT NINE + {0x109A, 0x109C, prSA, gcMc}, // [3] MYANMAR SIGN KHAMTI TONE-1..MYANMAR VOWEL SIGN AITON A + {0x109D, 0x109D, prSA, gcMn}, // MYANMAR VOWEL SIGN AITON AI + {0x109E, 0x109F, prSA, gcSo}, // [2] MYANMAR SYMBOL SHAN ONE..MYANMAR SYMBOL SHAN EXCLAMATION + {0x10A0, 0x10C5, prAL, gcLu}, // [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE + {0x10C7, 0x10C7, prAL, gcLu}, // GEORGIAN CAPITAL LETTER YN + {0x10CD, 0x10CD, prAL, gcLu}, // GEORGIAN CAPITAL LETTER AEN + {0x10D0, 0x10FA, prAL, gcLl}, // [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN + {0x10FB, 0x10FB, prAL, gcPo}, // GEORGIAN PARAGRAPH SEPARATOR + {0x10FC, 0x10FC, prAL, gcLm}, // MODIFIER LETTER GEORGIAN NAR + {0x10FD, 0x10FF, prAL, gcLl}, // [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN + {0x1100, 0x115F, prJL, gcLo}, // [96] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG FILLER + {0x1160, 0x11A7, prJV, gcLo}, // [72] HANGUL JUNGSEONG FILLER..HANGUL JUNGSEONG O-YAE + {0x11A8, 0x11FF, prJT, gcLo}, // [88] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG SSANGNIEUN + {0x1200, 0x1248, prAL, gcLo}, // [73] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE QWA + {0x124A, 0x124D, prAL, gcLo}, // [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE + {0x1250, 0x1256, prAL, gcLo}, // [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO + {0x1258, 0x1258, prAL, gcLo}, // ETHIOPIC SYLLABLE QHWA + {0x125A, 0x125D, prAL, gcLo}, // [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE + {0x1260, 0x1288, prAL, gcLo}, // [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA + {0x128A, 0x128D, prAL, gcLo}, // [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE + {0x1290, 0x12B0, prAL, gcLo}, // [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA + {0x12B2, 0x12B5, prAL, gcLo}, // [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE + {0x12B8, 0x12BE, prAL, gcLo}, // [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO + {0x12C0, 0x12C0, prAL, gcLo}, // ETHIOPIC SYLLABLE KXWA + {0x12C2, 0x12C5, prAL, gcLo}, // [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE + {0x12C8, 0x12D6, prAL, gcLo}, // [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O + {0x12D8, 0x1310, prAL, gcLo}, // [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA + {0x1312, 0x1315, prAL, gcLo}, // [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE + {0x1318, 0x135A, prAL, gcLo}, // [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA + {0x135D, 0x135F, prCM, gcMn}, // [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK + {0x1360, 0x1360, prAL, gcPo}, // ETHIOPIC SECTION MARK + {0x1361, 0x1361, prBA, gcPo}, // ETHIOPIC WORDSPACE + {0x1362, 0x1368, prAL, gcPo}, // [7] ETHIOPIC FULL STOP..ETHIOPIC PARAGRAPH SEPARATOR + {0x1369, 0x137C, prAL, gcNo}, // [20] ETHIOPIC DIGIT ONE..ETHIOPIC NUMBER TEN THOUSAND + {0x1380, 0x138F, prAL, gcLo}, // [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE + {0x1390, 0x1399, prAL, gcSo}, // [10] ETHIOPIC TONAL MARK YIZET..ETHIOPIC TONAL MARK KURT + {0x13A0, 0x13F5, prAL, gcLu}, // [86] CHEROKEE LETTER A..CHEROKEE LETTER MV + {0x13F8, 0x13FD, prAL, gcLl}, // [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV + {0x1400, 0x1400, prBA, gcPd}, // CANADIAN SYLLABICS HYPHEN + {0x1401, 0x166C, prAL, gcLo}, // [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA + {0x166D, 0x166D, prAL, gcSo}, // CANADIAN SYLLABICS CHI SIGN + {0x166E, 0x166E, prAL, gcPo}, // CANADIAN SYLLABICS FULL STOP + {0x166F, 0x167F, prAL, gcLo}, // [17] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS BLACKFOOT W + {0x1680, 0x1680, prBA, gcZs}, // OGHAM SPACE MARK + {0x1681, 0x169A, prAL, gcLo}, // [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH + {0x169B, 0x169B, prOP, gcPs}, // OGHAM FEATHER MARK + {0x169C, 0x169C, prCL, gcPe}, // OGHAM REVERSED FEATHER MARK + {0x16A0, 0x16EA, prAL, gcLo}, // [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X + {0x16EB, 0x16ED, prBA, gcPo}, // [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION + {0x16EE, 0x16F0, prAL, gcNl}, // [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL + {0x16F1, 0x16F8, prAL, gcLo}, // [8] RUNIC LETTER K..RUNIC LETTER FRANKS CASKET AESC + {0x1700, 0x1711, prAL, gcLo}, // [18] TAGALOG LETTER A..TAGALOG LETTER HA + {0x1712, 0x1714, prCM, gcMn}, // [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA + {0x1715, 0x1715, prCM, gcMc}, // TAGALOG SIGN PAMUDPOD + {0x171F, 0x171F, prAL, gcLo}, // TAGALOG LETTER ARCHAIC RA + {0x1720, 0x1731, prAL, gcLo}, // [18] HANUNOO LETTER A..HANUNOO LETTER HA + {0x1732, 0x1733, prCM, gcMn}, // [2] HANUNOO VOWEL SIGN I..HANUNOO VOWEL SIGN U + {0x1734, 0x1734, prCM, gcMc}, // HANUNOO SIGN PAMUDPOD + {0x1735, 0x1736, prBA, gcPo}, // [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION + {0x1740, 0x1751, prAL, gcLo}, // [18] BUHID LETTER A..BUHID LETTER HA + {0x1752, 0x1753, prCM, gcMn}, // [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U + {0x1760, 0x176C, prAL, gcLo}, // [13] TAGBANWA LETTER A..TAGBANWA LETTER YA + {0x176E, 0x1770, prAL, gcLo}, // [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA + {0x1772, 0x1773, prCM, gcMn}, // [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U + {0x1780, 0x17B3, prSA, gcLo}, // [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU + {0x17B4, 0x17B5, prSA, gcMn}, // [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA + {0x17B6, 0x17B6, prSA, gcMc}, // KHMER VOWEL SIGN AA + {0x17B7, 0x17BD, prSA, gcMn}, // [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA + {0x17BE, 0x17C5, prSA, gcMc}, // [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU + {0x17C6, 0x17C6, prSA, gcMn}, // KHMER SIGN NIKAHIT + {0x17C7, 0x17C8, prSA, gcMc}, // [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU + {0x17C9, 0x17D3, prSA, gcMn}, // [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT + {0x17D4, 0x17D5, prBA, gcPo}, // [2] KHMER SIGN KHAN..KHMER SIGN BARIYOOSAN + {0x17D6, 0x17D6, prNS, gcPo}, // KHMER SIGN CAMNUC PII KUUH + {0x17D7, 0x17D7, prSA, gcLm}, // KHMER SIGN LEK TOO + {0x17D8, 0x17D8, prBA, gcPo}, // KHMER SIGN BEYYAL + {0x17D9, 0x17D9, prAL, gcPo}, // KHMER SIGN PHNAEK MUAN + {0x17DA, 0x17DA, prBA, gcPo}, // KHMER SIGN KOOMUUT + {0x17DB, 0x17DB, prPR, gcSc}, // KHMER CURRENCY SYMBOL RIEL + {0x17DC, 0x17DC, prSA, gcLo}, // KHMER SIGN AVAKRAHASANYA + {0x17DD, 0x17DD, prSA, gcMn}, // KHMER SIGN ATTHACAN + {0x17E0, 0x17E9, prNU, gcNd}, // [10] KHMER DIGIT ZERO..KHMER DIGIT NINE + {0x17F0, 0x17F9, prAL, gcNo}, // [10] KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON + {0x1800, 0x1801, prAL, gcPo}, // [2] MONGOLIAN BIRGA..MONGOLIAN ELLIPSIS + {0x1802, 0x1803, prEX, gcPo}, // [2] MONGOLIAN COMMA..MONGOLIAN FULL STOP + {0x1804, 0x1805, prBA, gcPo}, // [2] MONGOLIAN COLON..MONGOLIAN FOUR DOTS + {0x1806, 0x1806, prBB, gcPd}, // MONGOLIAN TODO SOFT HYPHEN + {0x1807, 0x1807, prAL, gcPo}, // MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER + {0x1808, 0x1809, prEX, gcPo}, // [2] MONGOLIAN MANCHU COMMA..MONGOLIAN MANCHU FULL STOP + {0x180A, 0x180A, prAL, gcPo}, // MONGOLIAN NIRUGU + {0x180B, 0x180D, prCM, gcMn}, // [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE + {0x180E, 0x180E, prGL, gcCf}, // MONGOLIAN VOWEL SEPARATOR + {0x180F, 0x180F, prCM, gcMn}, // MONGOLIAN FREE VARIATION SELECTOR FOUR + {0x1810, 0x1819, prNU, gcNd}, // [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE + {0x1820, 0x1842, prAL, gcLo}, // [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI + {0x1843, 0x1843, prAL, gcLm}, // MONGOLIAN LETTER TODO LONG VOWEL SIGN + {0x1844, 0x1878, prAL, gcLo}, // [53] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER CHA WITH TWO DOTS + {0x1880, 0x1884, prAL, gcLo}, // [5] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI INVERTED UBADAMA + {0x1885, 0x1886, prCM, gcMn}, // [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA + {0x1887, 0x18A8, prAL, gcLo}, // [34] MONGOLIAN LETTER ALI GALI A..MONGOLIAN LETTER MANCHU ALI GALI BHA + {0x18A9, 0x18A9, prCM, gcMn}, // MONGOLIAN LETTER ALI GALI DAGALGA + {0x18AA, 0x18AA, prAL, gcLo}, // MONGOLIAN LETTER MANCHU ALI GALI LHA + {0x18B0, 0x18F5, prAL, gcLo}, // [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S + {0x1900, 0x191E, prAL, gcLo}, // [31] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER TRA + {0x1920, 0x1922, prCM, gcMn}, // [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U + {0x1923, 0x1926, prCM, gcMc}, // [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU + {0x1927, 0x1928, prCM, gcMn}, // [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O + {0x1929, 0x192B, prCM, gcMc}, // [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA + {0x1930, 0x1931, prCM, gcMc}, // [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA + {0x1932, 0x1932, prCM, gcMn}, // LIMBU SMALL LETTER ANUSVARA + {0x1933, 0x1938, prCM, gcMc}, // [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA + {0x1939, 0x193B, prCM, gcMn}, // [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I + {0x1940, 0x1940, prAL, gcSo}, // LIMBU SIGN LOO + {0x1944, 0x1945, prEX, gcPo}, // [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK + {0x1946, 0x194F, prNU, gcNd}, // [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE + {0x1950, 0x196D, prSA, gcLo}, // [30] TAI LE LETTER KA..TAI LE LETTER AI + {0x1970, 0x1974, prSA, gcLo}, // [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 + {0x1980, 0x19AB, prSA, gcLo}, // [44] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW SUA + {0x19B0, 0x19C9, prSA, gcLo}, // [26] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE TONE MARK-2 + {0x19D0, 0x19D9, prNU, gcNd}, // [10] NEW TAI LUE DIGIT ZERO..NEW TAI LUE DIGIT NINE + {0x19DA, 0x19DA, prSA, gcNo}, // NEW TAI LUE THAM DIGIT ONE + {0x19DE, 0x19DF, prSA, gcSo}, // [2] NEW TAI LUE SIGN LAE..NEW TAI LUE SIGN LAEV + {0x19E0, 0x19FF, prAL, gcSo}, // [32] KHMER SYMBOL PATHAMASAT..KHMER SYMBOL DAP-PRAM ROC + {0x1A00, 0x1A16, prAL, gcLo}, // [23] BUGINESE LETTER KA..BUGINESE LETTER HA + {0x1A17, 0x1A18, prCM, gcMn}, // [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U + {0x1A19, 0x1A1A, prCM, gcMc}, // [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O + {0x1A1B, 0x1A1B, prCM, gcMn}, // BUGINESE VOWEL SIGN AE + {0x1A1E, 0x1A1F, prAL, gcPo}, // [2] BUGINESE PALLAWA..BUGINESE END OF SECTION + {0x1A20, 0x1A54, prSA, gcLo}, // [53] TAI THAM LETTER HIGH KA..TAI THAM LETTER GREAT SA + {0x1A55, 0x1A55, prSA, gcMc}, // TAI THAM CONSONANT SIGN MEDIAL RA + {0x1A56, 0x1A56, prSA, gcMn}, // TAI THAM CONSONANT SIGN MEDIAL LA + {0x1A57, 0x1A57, prSA, gcMc}, // TAI THAM CONSONANT SIGN LA TANG LAI + {0x1A58, 0x1A5E, prSA, gcMn}, // [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA + {0x1A60, 0x1A60, prSA, gcMn}, // TAI THAM SIGN SAKOT + {0x1A61, 0x1A61, prSA, gcMc}, // TAI THAM VOWEL SIGN A + {0x1A62, 0x1A62, prSA, gcMn}, // TAI THAM VOWEL SIGN MAI SAT + {0x1A63, 0x1A64, prSA, gcMc}, // [2] TAI THAM VOWEL SIGN AA..TAI THAM VOWEL SIGN TALL AA + {0x1A65, 0x1A6C, prSA, gcMn}, // [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW + {0x1A6D, 0x1A72, prSA, gcMc}, // [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI + {0x1A73, 0x1A7C, prSA, gcMn}, // [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN + {0x1A7F, 0x1A7F, prCM, gcMn}, // TAI THAM COMBINING CRYPTOGRAMMIC DOT + {0x1A80, 0x1A89, prNU, gcNd}, // [10] TAI THAM HORA DIGIT ZERO..TAI THAM HORA DIGIT NINE + {0x1A90, 0x1A99, prNU, gcNd}, // [10] TAI THAM THAM DIGIT ZERO..TAI THAM THAM DIGIT NINE + {0x1AA0, 0x1AA6, prSA, gcPo}, // [7] TAI THAM SIGN WIANG..TAI THAM SIGN REVERSED ROTATED RANA + {0x1AA7, 0x1AA7, prSA, gcLm}, // TAI THAM SIGN MAI YAMOK + {0x1AA8, 0x1AAD, prSA, gcPo}, // [6] TAI THAM SIGN KAAN..TAI THAM SIGN CAANG + {0x1AB0, 0x1ABD, prCM, gcMn}, // [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW + {0x1ABE, 0x1ABE, prCM, gcMe}, // COMBINING PARENTHESES OVERLAY + {0x1ABF, 0x1ACE, prCM, gcMn}, // [16] COMBINING LATIN SMALL LETTER W BELOW..COMBINING LATIN SMALL LETTER INSULAR T + {0x1B00, 0x1B03, prCM, gcMn}, // [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG + {0x1B04, 0x1B04, prCM, gcMc}, // BALINESE SIGN BISAH + {0x1B05, 0x1B33, prAL, gcLo}, // [47] BALINESE LETTER AKARA..BALINESE LETTER HA + {0x1B34, 0x1B34, prCM, gcMn}, // BALINESE SIGN REREKAN + {0x1B35, 0x1B35, prCM, gcMc}, // BALINESE VOWEL SIGN TEDUNG + {0x1B36, 0x1B3A, prCM, gcMn}, // [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA + {0x1B3B, 0x1B3B, prCM, gcMc}, // BALINESE VOWEL SIGN RA REPA TEDUNG + {0x1B3C, 0x1B3C, prCM, gcMn}, // BALINESE VOWEL SIGN LA LENGA + {0x1B3D, 0x1B41, prCM, gcMc}, // [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG + {0x1B42, 0x1B42, prCM, gcMn}, // BALINESE VOWEL SIGN PEPET + {0x1B43, 0x1B44, prCM, gcMc}, // [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG + {0x1B45, 0x1B4C, prAL, gcLo}, // [8] BALINESE LETTER KAF SASAK..BALINESE LETTER ARCHAIC JNYA + {0x1B50, 0x1B59, prNU, gcNd}, // [10] BALINESE DIGIT ZERO..BALINESE DIGIT NINE + {0x1B5A, 0x1B5B, prBA, gcPo}, // [2] BALINESE PANTI..BALINESE PAMADA + {0x1B5C, 0x1B5C, prAL, gcPo}, // BALINESE WINDU + {0x1B5D, 0x1B60, prBA, gcPo}, // [4] BALINESE CARIK PAMUNGKAH..BALINESE PAMENENG + {0x1B61, 0x1B6A, prAL, gcSo}, // [10] BALINESE MUSICAL SYMBOL DONG..BALINESE MUSICAL SYMBOL DANG GEDE + {0x1B6B, 0x1B73, prCM, gcMn}, // [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG + {0x1B74, 0x1B7C, prAL, gcSo}, // [9] BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG..BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING + {0x1B7D, 0x1B7E, prBA, gcPo}, // [2] BALINESE PANTI LANTANG..BALINESE PAMADA LANTANG + {0x1B80, 0x1B81, prCM, gcMn}, // [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR + {0x1B82, 0x1B82, prCM, gcMc}, // SUNDANESE SIGN PANGWISAD + {0x1B83, 0x1BA0, prAL, gcLo}, // [30] SUNDANESE LETTER A..SUNDANESE LETTER HA + {0x1BA1, 0x1BA1, prCM, gcMc}, // SUNDANESE CONSONANT SIGN PAMINGKAL + {0x1BA2, 0x1BA5, prCM, gcMn}, // [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU + {0x1BA6, 0x1BA7, prCM, gcMc}, // [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG + {0x1BA8, 0x1BA9, prCM, gcMn}, // [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG + {0x1BAA, 0x1BAA, prCM, gcMc}, // SUNDANESE SIGN PAMAAEH + {0x1BAB, 0x1BAD, prCM, gcMn}, // [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA + {0x1BAE, 0x1BAF, prAL, gcLo}, // [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA + {0x1BB0, 0x1BB9, prNU, gcNd}, // [10] SUNDANESE DIGIT ZERO..SUNDANESE DIGIT NINE + {0x1BBA, 0x1BBF, prAL, gcLo}, // [6] SUNDANESE AVAGRAHA..SUNDANESE LETTER FINAL M + {0x1BC0, 0x1BE5, prAL, gcLo}, // [38] BATAK LETTER A..BATAK LETTER U + {0x1BE6, 0x1BE6, prCM, gcMn}, // BATAK SIGN TOMPI + {0x1BE7, 0x1BE7, prCM, gcMc}, // BATAK VOWEL SIGN E + {0x1BE8, 0x1BE9, prCM, gcMn}, // [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE + {0x1BEA, 0x1BEC, prCM, gcMc}, // [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O + {0x1BED, 0x1BED, prCM, gcMn}, // BATAK VOWEL SIGN KARO O + {0x1BEE, 0x1BEE, prCM, gcMc}, // BATAK VOWEL SIGN U + {0x1BEF, 0x1BF1, prCM, gcMn}, // [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H + {0x1BF2, 0x1BF3, prCM, gcMc}, // [2] BATAK PANGOLAT..BATAK PANONGONAN + {0x1BFC, 0x1BFF, prAL, gcPo}, // [4] BATAK SYMBOL BINDU NA METEK..BATAK SYMBOL BINDU PANGOLAT + {0x1C00, 0x1C23, prAL, gcLo}, // [36] LEPCHA LETTER KA..LEPCHA LETTER A + {0x1C24, 0x1C2B, prCM, gcMc}, // [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU + {0x1C2C, 0x1C33, prCM, gcMn}, // [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T + {0x1C34, 0x1C35, prCM, gcMc}, // [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG + {0x1C36, 0x1C37, prCM, gcMn}, // [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA + {0x1C3B, 0x1C3F, prBA, gcPo}, // [5] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION TSHOOK + {0x1C40, 0x1C49, prNU, gcNd}, // [10] LEPCHA DIGIT ZERO..LEPCHA DIGIT NINE + {0x1C4D, 0x1C4F, prAL, gcLo}, // [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA + {0x1C50, 0x1C59, prNU, gcNd}, // [10] OL CHIKI DIGIT ZERO..OL CHIKI DIGIT NINE + {0x1C5A, 0x1C77, prAL, gcLo}, // [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH + {0x1C78, 0x1C7D, prAL, gcLm}, // [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD + {0x1C7E, 0x1C7F, prBA, gcPo}, // [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD + {0x1C80, 0x1C88, prAL, gcLl}, // [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK + {0x1C90, 0x1CBA, prAL, gcLu}, // [43] GEORGIAN MTAVRULI CAPITAL LETTER AN..GEORGIAN MTAVRULI CAPITAL LETTER AIN + {0x1CBD, 0x1CBF, prAL, gcLu}, // [3] GEORGIAN MTAVRULI CAPITAL LETTER AEN..GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN + {0x1CC0, 0x1CC7, prAL, gcPo}, // [8] SUNDANESE PUNCTUATION BINDU SURYA..SUNDANESE PUNCTUATION BINDU BA SATANGA + {0x1CD0, 0x1CD2, prCM, gcMn}, // [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA + {0x1CD3, 0x1CD3, prAL, gcPo}, // VEDIC SIGN NIHSHVASA + {0x1CD4, 0x1CE0, prCM, gcMn}, // [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA + {0x1CE1, 0x1CE1, prCM, gcMc}, // VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA + {0x1CE2, 0x1CE8, prCM, gcMn}, // [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL + {0x1CE9, 0x1CEC, prAL, gcLo}, // [4] VEDIC SIGN ANUSVARA ANTARGOMUKHA..VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL + {0x1CED, 0x1CED, prCM, gcMn}, // VEDIC SIGN TIRYAK + {0x1CEE, 0x1CF3, prAL, gcLo}, // [6] VEDIC SIGN HEXIFORM LONG ANUSVARA..VEDIC SIGN ROTATED ARDHAVISARGA + {0x1CF4, 0x1CF4, prCM, gcMn}, // VEDIC TONE CANDRA ABOVE + {0x1CF5, 0x1CF6, prAL, gcLo}, // [2] VEDIC SIGN JIHVAMULIYA..VEDIC SIGN UPADHMANIYA + {0x1CF7, 0x1CF7, prCM, gcMc}, // VEDIC SIGN ATIKRAMA + {0x1CF8, 0x1CF9, prCM, gcMn}, // [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE + {0x1CFA, 0x1CFA, prAL, gcLo}, // VEDIC SIGN DOUBLE ANUSVARA ANTARGOMUKHA + {0x1D00, 0x1D2B, prAL, gcLl}, // [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL + {0x1D2C, 0x1D6A, prAL, gcLm}, // [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI + {0x1D6B, 0x1D77, prAL, gcLl}, // [13] LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G + {0x1D78, 0x1D78, prAL, gcLm}, // MODIFIER LETTER CYRILLIC EN + {0x1D79, 0x1D7F, prAL, gcLl}, // [7] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER UPSILON WITH STROKE + {0x1D80, 0x1D9A, prAL, gcLl}, // [27] LATIN SMALL LETTER B WITH PALATAL HOOK..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK + {0x1D9B, 0x1DBF, prAL, gcLm}, // [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA + {0x1DC0, 0x1DFF, prCM, gcMn}, // [64] COMBINING DOTTED GRAVE ACCENT..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW + {0x1E00, 0x1EFF, prAL, gcLC}, // [256] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER Y WITH LOOP + {0x1F00, 0x1F15, prAL, gcLC}, // [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA + {0x1F18, 0x1F1D, prAL, gcLu}, // [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA + {0x1F20, 0x1F45, prAL, gcLC}, // [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA + {0x1F48, 0x1F4D, prAL, gcLu}, // [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA + {0x1F50, 0x1F57, prAL, gcLl}, // [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI + {0x1F59, 0x1F59, prAL, gcLu}, // GREEK CAPITAL LETTER UPSILON WITH DASIA + {0x1F5B, 0x1F5B, prAL, gcLu}, // GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA + {0x1F5D, 0x1F5D, prAL, gcLu}, // GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA + {0x1F5F, 0x1F7D, prAL, gcLC}, // [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA + {0x1F80, 0x1FB4, prAL, gcLC}, // [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI + {0x1FB6, 0x1FBC, prAL, gcLC}, // [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI + {0x1FBD, 0x1FBD, prAL, gcSk}, // GREEK KORONIS + {0x1FBE, 0x1FBE, prAL, gcLl}, // GREEK PROSGEGRAMMENI + {0x1FBF, 0x1FC1, prAL, gcSk}, // [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI + {0x1FC2, 0x1FC4, prAL, gcLl}, // [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI + {0x1FC6, 0x1FCC, prAL, gcLC}, // [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI + {0x1FCD, 0x1FCF, prAL, gcSk}, // [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI + {0x1FD0, 0x1FD3, prAL, gcLl}, // [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA + {0x1FD6, 0x1FDB, prAL, gcLC}, // [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA + {0x1FDD, 0x1FDF, prAL, gcSk}, // [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI + {0x1FE0, 0x1FEC, prAL, gcLC}, // [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA + {0x1FED, 0x1FEF, prAL, gcSk}, // [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA + {0x1FF2, 0x1FF4, prAL, gcLl}, // [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI + {0x1FF6, 0x1FFC, prAL, gcLC}, // [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI + {0x1FFD, 0x1FFD, prBB, gcSk}, // GREEK OXIA + {0x1FFE, 0x1FFE, prAL, gcSk}, // GREEK DASIA + {0x2000, 0x2006, prBA, gcZs}, // [7] EN QUAD..SIX-PER-EM SPACE + {0x2007, 0x2007, prGL, gcZs}, // FIGURE SPACE + {0x2008, 0x200A, prBA, gcZs}, // [3] PUNCTUATION SPACE..HAIR SPACE + {0x200B, 0x200B, prZW, gcCf}, // ZERO WIDTH SPACE + {0x200C, 0x200C, prCM, gcCf}, // ZERO WIDTH NON-JOINER + {0x200D, 0x200D, prZWJ, gcCf}, // ZERO WIDTH JOINER + {0x200E, 0x200F, prCM, gcCf}, // [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK + {0x2010, 0x2010, prBA, gcPd}, // HYPHEN + {0x2011, 0x2011, prGL, gcPd}, // NON-BREAKING HYPHEN + {0x2012, 0x2013, prBA, gcPd}, // [2] FIGURE DASH..EN DASH + {0x2014, 0x2014, prB2, gcPd}, // EM DASH + {0x2015, 0x2015, prAI, gcPd}, // HORIZONTAL BAR + {0x2016, 0x2016, prAI, gcPo}, // DOUBLE VERTICAL LINE + {0x2017, 0x2017, prAL, gcPo}, // DOUBLE LOW LINE + {0x2018, 0x2018, prQU, gcPi}, // LEFT SINGLE QUOTATION MARK + {0x2019, 0x2019, prQU, gcPf}, // RIGHT SINGLE QUOTATION MARK + {0x201A, 0x201A, prOP, gcPs}, // SINGLE LOW-9 QUOTATION MARK + {0x201B, 0x201C, prQU, gcPi}, // [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK + {0x201D, 0x201D, prQU, gcPf}, // RIGHT DOUBLE QUOTATION MARK + {0x201E, 0x201E, prOP, gcPs}, // DOUBLE LOW-9 QUOTATION MARK + {0x201F, 0x201F, prQU, gcPi}, // DOUBLE HIGH-REVERSED-9 QUOTATION MARK + {0x2020, 0x2021, prAI, gcPo}, // [2] DAGGER..DOUBLE DAGGER + {0x2022, 0x2023, prAL, gcPo}, // [2] BULLET..TRIANGULAR BULLET + {0x2024, 0x2026, prIN, gcPo}, // [3] ONE DOT LEADER..HORIZONTAL ELLIPSIS + {0x2027, 0x2027, prBA, gcPo}, // HYPHENATION POINT + {0x2028, 0x2028, prBK, gcZl}, // LINE SEPARATOR + {0x2029, 0x2029, prBK, gcZp}, // PARAGRAPH SEPARATOR + {0x202A, 0x202E, prCM, gcCf}, // [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE + {0x202F, 0x202F, prGL, gcZs}, // NARROW NO-BREAK SPACE + {0x2030, 0x2037, prPO, gcPo}, // [8] PER MILLE SIGN..REVERSED TRIPLE PRIME + {0x2038, 0x2038, prAL, gcPo}, // CARET + {0x2039, 0x2039, prQU, gcPi}, // SINGLE LEFT-POINTING ANGLE QUOTATION MARK + {0x203A, 0x203A, prQU, gcPf}, // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + {0x203B, 0x203B, prAI, gcPo}, // REFERENCE MARK + {0x203C, 0x203D, prNS, gcPo}, // [2] DOUBLE EXCLAMATION MARK..INTERROBANG + {0x203E, 0x203E, prAL, gcPo}, // OVERLINE + {0x203F, 0x2040, prAL, gcPc}, // [2] UNDERTIE..CHARACTER TIE + {0x2041, 0x2043, prAL, gcPo}, // [3] CARET INSERTION POINT..HYPHEN BULLET + {0x2044, 0x2044, prIS, gcSm}, // FRACTION SLASH + {0x2045, 0x2045, prOP, gcPs}, // LEFT SQUARE BRACKET WITH QUILL + {0x2046, 0x2046, prCL, gcPe}, // RIGHT SQUARE BRACKET WITH QUILL + {0x2047, 0x2049, prNS, gcPo}, // [3] DOUBLE QUESTION MARK..EXCLAMATION QUESTION MARK + {0x204A, 0x2051, prAL, gcPo}, // [8] TIRONIAN SIGN ET..TWO ASTERISKS ALIGNED VERTICALLY + {0x2052, 0x2052, prAL, gcSm}, // COMMERCIAL MINUS SIGN + {0x2053, 0x2053, prAL, gcPo}, // SWUNG DASH + {0x2054, 0x2054, prAL, gcPc}, // INVERTED UNDERTIE + {0x2055, 0x2055, prAL, gcPo}, // FLOWER PUNCTUATION MARK + {0x2056, 0x2056, prBA, gcPo}, // THREE DOT PUNCTUATION + {0x2057, 0x2057, prAL, gcPo}, // QUADRUPLE PRIME + {0x2058, 0x205B, prBA, gcPo}, // [4] FOUR DOT PUNCTUATION..FOUR DOT MARK + {0x205C, 0x205C, prAL, gcPo}, // DOTTED CROSS + {0x205D, 0x205E, prBA, gcPo}, // [2] TRICOLON..VERTICAL FOUR DOTS + {0x205F, 0x205F, prBA, gcZs}, // MEDIUM MATHEMATICAL SPACE + {0x2060, 0x2060, prWJ, gcCf}, // WORD JOINER + {0x2061, 0x2064, prAL, gcCf}, // [4] FUNCTION APPLICATION..INVISIBLE PLUS + {0x2066, 0x206F, prCM, gcCf}, // [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES + {0x2070, 0x2070, prAL, gcNo}, // SUPERSCRIPT ZERO + {0x2071, 0x2071, prAL, gcLm}, // SUPERSCRIPT LATIN SMALL LETTER I + {0x2074, 0x2074, prAI, gcNo}, // SUPERSCRIPT FOUR + {0x2075, 0x2079, prAL, gcNo}, // [5] SUPERSCRIPT FIVE..SUPERSCRIPT NINE + {0x207A, 0x207C, prAL, gcSm}, // [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN + {0x207D, 0x207D, prOP, gcPs}, // SUPERSCRIPT LEFT PARENTHESIS + {0x207E, 0x207E, prCL, gcPe}, // SUPERSCRIPT RIGHT PARENTHESIS + {0x207F, 0x207F, prAI, gcLm}, // SUPERSCRIPT LATIN SMALL LETTER N + {0x2080, 0x2080, prAL, gcNo}, // SUBSCRIPT ZERO + {0x2081, 0x2084, prAI, gcNo}, // [4] SUBSCRIPT ONE..SUBSCRIPT FOUR + {0x2085, 0x2089, prAL, gcNo}, // [5] SUBSCRIPT FIVE..SUBSCRIPT NINE + {0x208A, 0x208C, prAL, gcSm}, // [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN + {0x208D, 0x208D, prOP, gcPs}, // SUBSCRIPT LEFT PARENTHESIS + {0x208E, 0x208E, prCL, gcPe}, // SUBSCRIPT RIGHT PARENTHESIS + {0x2090, 0x209C, prAL, gcLm}, // [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T + {0x20A0, 0x20A6, prPR, gcSc}, // [7] EURO-CURRENCY SIGN..NAIRA SIGN + {0x20A7, 0x20A7, prPO, gcSc}, // PESETA SIGN + {0x20A8, 0x20B5, prPR, gcSc}, // [14] RUPEE SIGN..CEDI SIGN + {0x20B6, 0x20B6, prPO, gcSc}, // LIVRE TOURNOIS SIGN + {0x20B7, 0x20BA, prPR, gcSc}, // [4] SPESMILO SIGN..TURKISH LIRA SIGN + {0x20BB, 0x20BB, prPO, gcSc}, // NORDIC MARK SIGN + {0x20BC, 0x20BD, prPR, gcSc}, // [2] MANAT SIGN..RUBLE SIGN + {0x20BE, 0x20BE, prPO, gcSc}, // LARI SIGN + {0x20BF, 0x20BF, prPR, gcSc}, // BITCOIN SIGN + {0x20C0, 0x20C0, prPO, gcSc}, // SOM SIGN + {0x20C1, 0x20CF, prPR, gcCn}, // [15] .. + {0x20D0, 0x20DC, prCM, gcMn}, // [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE + {0x20DD, 0x20E0, prCM, gcMe}, // [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH + {0x20E1, 0x20E1, prCM, gcMn}, // COMBINING LEFT RIGHT ARROW ABOVE + {0x20E2, 0x20E4, prCM, gcMe}, // [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE + {0x20E5, 0x20F0, prCM, gcMn}, // [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE + {0x2100, 0x2101, prAL, gcSo}, // [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT + {0x2102, 0x2102, prAL, gcLu}, // DOUBLE-STRUCK CAPITAL C + {0x2103, 0x2103, prPO, gcSo}, // DEGREE CELSIUS + {0x2104, 0x2104, prAL, gcSo}, // CENTRE LINE SYMBOL + {0x2105, 0x2105, prAI, gcSo}, // CARE OF + {0x2106, 0x2106, prAL, gcSo}, // CADA UNA + {0x2107, 0x2107, prAL, gcLu}, // EULER CONSTANT + {0x2108, 0x2108, prAL, gcSo}, // SCRUPLE + {0x2109, 0x2109, prPO, gcSo}, // DEGREE FAHRENHEIT + {0x210A, 0x2112, prAL, gcLC}, // [9] SCRIPT SMALL G..SCRIPT CAPITAL L + {0x2113, 0x2113, prAI, gcLl}, // SCRIPT SMALL L + {0x2114, 0x2114, prAL, gcSo}, // L B BAR SYMBOL + {0x2115, 0x2115, prAL, gcLu}, // DOUBLE-STRUCK CAPITAL N + {0x2116, 0x2116, prPR, gcSo}, // NUMERO SIGN + {0x2117, 0x2117, prAL, gcSo}, // SOUND RECORDING COPYRIGHT + {0x2118, 0x2118, prAL, gcSm}, // SCRIPT CAPITAL P + {0x2119, 0x211D, prAL, gcLu}, // [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R + {0x211E, 0x2120, prAL, gcSo}, // [3] PRESCRIPTION TAKE..SERVICE MARK + {0x2121, 0x2122, prAI, gcSo}, // [2] TELEPHONE SIGN..TRADE MARK SIGN + {0x2123, 0x2123, prAL, gcSo}, // VERSICLE + {0x2124, 0x2124, prAL, gcLu}, // DOUBLE-STRUCK CAPITAL Z + {0x2125, 0x2125, prAL, gcSo}, // OUNCE SIGN + {0x2126, 0x2126, prAL, gcLu}, // OHM SIGN + {0x2127, 0x2127, prAL, gcSo}, // INVERTED OHM SIGN + {0x2128, 0x2128, prAL, gcLu}, // BLACK-LETTER CAPITAL Z + {0x2129, 0x2129, prAL, gcSo}, // TURNED GREEK SMALL LETTER IOTA + {0x212A, 0x212A, prAL, gcLu}, // KELVIN SIGN + {0x212B, 0x212B, prAI, gcLu}, // ANGSTROM SIGN + {0x212C, 0x212D, prAL, gcLu}, // [2] SCRIPT CAPITAL B..BLACK-LETTER CAPITAL C + {0x212E, 0x212E, prAL, gcSo}, // ESTIMATED SYMBOL + {0x212F, 0x2134, prAL, gcLC}, // [6] SCRIPT SMALL E..SCRIPT SMALL O + {0x2135, 0x2138, prAL, gcLo}, // [4] ALEF SYMBOL..DALET SYMBOL + {0x2139, 0x2139, prAL, gcLl}, // INFORMATION SOURCE + {0x213A, 0x213B, prAL, gcSo}, // [2] ROTATED CAPITAL Q..FACSIMILE SIGN + {0x213C, 0x213F, prAL, gcLC}, // [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI + {0x2140, 0x2144, prAL, gcSm}, // [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y + {0x2145, 0x2149, prAL, gcLC}, // [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J + {0x214A, 0x214A, prAL, gcSo}, // PROPERTY LINE + {0x214B, 0x214B, prAL, gcSm}, // TURNED AMPERSAND + {0x214C, 0x214D, prAL, gcSo}, // [2] PER SIGN..AKTIESELSKAB + {0x214E, 0x214E, prAL, gcLl}, // TURNED SMALL F + {0x214F, 0x214F, prAL, gcSo}, // SYMBOL FOR SAMARITAN SOURCE + {0x2150, 0x2153, prAL, gcNo}, // [4] VULGAR FRACTION ONE SEVENTH..VULGAR FRACTION ONE THIRD + {0x2154, 0x2155, prAI, gcNo}, // [2] VULGAR FRACTION TWO THIRDS..VULGAR FRACTION ONE FIFTH + {0x2156, 0x215A, prAL, gcNo}, // [5] VULGAR FRACTION TWO FIFTHS..VULGAR FRACTION FIVE SIXTHS + {0x215B, 0x215B, prAI, gcNo}, // VULGAR FRACTION ONE EIGHTH + {0x215C, 0x215D, prAL, gcNo}, // [2] VULGAR FRACTION THREE EIGHTHS..VULGAR FRACTION FIVE EIGHTHS + {0x215E, 0x215E, prAI, gcNo}, // VULGAR FRACTION SEVEN EIGHTHS + {0x215F, 0x215F, prAL, gcNo}, // FRACTION NUMERATOR ONE + {0x2160, 0x216B, prAI, gcNl}, // [12] ROMAN NUMERAL ONE..ROMAN NUMERAL TWELVE + {0x216C, 0x216F, prAL, gcNl}, // [4] ROMAN NUMERAL FIFTY..ROMAN NUMERAL ONE THOUSAND + {0x2170, 0x2179, prAI, gcNl}, // [10] SMALL ROMAN NUMERAL ONE..SMALL ROMAN NUMERAL TEN + {0x217A, 0x2182, prAL, gcNl}, // [9] SMALL ROMAN NUMERAL ELEVEN..ROMAN NUMERAL TEN THOUSAND + {0x2183, 0x2184, prAL, gcLC}, // [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C + {0x2185, 0x2188, prAL, gcNl}, // [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND + {0x2189, 0x2189, prAI, gcNo}, // VULGAR FRACTION ZERO THIRDS + {0x218A, 0x218B, prAL, gcSo}, // [2] TURNED DIGIT TWO..TURNED DIGIT THREE + {0x2190, 0x2194, prAI, gcSm}, // [5] LEFTWARDS ARROW..LEFT RIGHT ARROW + {0x2195, 0x2199, prAI, gcSo}, // [5] UP DOWN ARROW..SOUTH WEST ARROW + {0x219A, 0x219B, prAL, gcSm}, // [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE + {0x219C, 0x219F, prAL, gcSo}, // [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW + {0x21A0, 0x21A0, prAL, gcSm}, // RIGHTWARDS TWO HEADED ARROW + {0x21A1, 0x21A2, prAL, gcSo}, // [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL + {0x21A3, 0x21A3, prAL, gcSm}, // RIGHTWARDS ARROW WITH TAIL + {0x21A4, 0x21A5, prAL, gcSo}, // [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR + {0x21A6, 0x21A6, prAL, gcSm}, // RIGHTWARDS ARROW FROM BAR + {0x21A7, 0x21AD, prAL, gcSo}, // [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW + {0x21AE, 0x21AE, prAL, gcSm}, // LEFT RIGHT ARROW WITH STROKE + {0x21AF, 0x21CD, prAL, gcSo}, // [31] DOWNWARDS ZIGZAG ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE + {0x21CE, 0x21CF, prAL, gcSm}, // [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE + {0x21D0, 0x21D1, prAL, gcSo}, // [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW + {0x21D2, 0x21D2, prAI, gcSm}, // RIGHTWARDS DOUBLE ARROW + {0x21D3, 0x21D3, prAL, gcSo}, // DOWNWARDS DOUBLE ARROW + {0x21D4, 0x21D4, prAI, gcSm}, // LEFT RIGHT DOUBLE ARROW + {0x21D5, 0x21F3, prAL, gcSo}, // [31] UP DOWN DOUBLE ARROW..UP DOWN WHITE ARROW + {0x21F4, 0x21FF, prAL, gcSm}, // [12] RIGHT ARROW WITH SMALL CIRCLE..LEFT RIGHT OPEN-HEADED ARROW + {0x2200, 0x2200, prAI, gcSm}, // FOR ALL + {0x2201, 0x2201, prAL, gcSm}, // COMPLEMENT + {0x2202, 0x2203, prAI, gcSm}, // [2] PARTIAL DIFFERENTIAL..THERE EXISTS + {0x2204, 0x2206, prAL, gcSm}, // [3] THERE DOES NOT EXIST..INCREMENT + {0x2207, 0x2208, prAI, gcSm}, // [2] NABLA..ELEMENT OF + {0x2209, 0x220A, prAL, gcSm}, // [2] NOT AN ELEMENT OF..SMALL ELEMENT OF + {0x220B, 0x220B, prAI, gcSm}, // CONTAINS AS MEMBER + {0x220C, 0x220E, prAL, gcSm}, // [3] DOES NOT CONTAIN AS MEMBER..END OF PROOF + {0x220F, 0x220F, prAI, gcSm}, // N-ARY PRODUCT + {0x2210, 0x2210, prAL, gcSm}, // N-ARY COPRODUCT + {0x2211, 0x2211, prAI, gcSm}, // N-ARY SUMMATION + {0x2212, 0x2213, prPR, gcSm}, // [2] MINUS SIGN..MINUS-OR-PLUS SIGN + {0x2214, 0x2214, prAL, gcSm}, // DOT PLUS + {0x2215, 0x2215, prAI, gcSm}, // DIVISION SLASH + {0x2216, 0x2219, prAL, gcSm}, // [4] SET MINUS..BULLET OPERATOR + {0x221A, 0x221A, prAI, gcSm}, // SQUARE ROOT + {0x221B, 0x221C, prAL, gcSm}, // [2] CUBE ROOT..FOURTH ROOT + {0x221D, 0x2220, prAI, gcSm}, // [4] PROPORTIONAL TO..ANGLE + {0x2221, 0x2222, prAL, gcSm}, // [2] MEASURED ANGLE..SPHERICAL ANGLE + {0x2223, 0x2223, prAI, gcSm}, // DIVIDES + {0x2224, 0x2224, prAL, gcSm}, // DOES NOT DIVIDE + {0x2225, 0x2225, prAI, gcSm}, // PARALLEL TO + {0x2226, 0x2226, prAL, gcSm}, // NOT PARALLEL TO + {0x2227, 0x222C, prAI, gcSm}, // [6] LOGICAL AND..DOUBLE INTEGRAL + {0x222D, 0x222D, prAL, gcSm}, // TRIPLE INTEGRAL + {0x222E, 0x222E, prAI, gcSm}, // CONTOUR INTEGRAL + {0x222F, 0x2233, prAL, gcSm}, // [5] SURFACE INTEGRAL..ANTICLOCKWISE CONTOUR INTEGRAL + {0x2234, 0x2237, prAI, gcSm}, // [4] THEREFORE..PROPORTION + {0x2238, 0x223B, prAL, gcSm}, // [4] DOT MINUS..HOMOTHETIC + {0x223C, 0x223D, prAI, gcSm}, // [2] TILDE OPERATOR..REVERSED TILDE + {0x223E, 0x2247, prAL, gcSm}, // [10] INVERTED LAZY S..NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO + {0x2248, 0x2248, prAI, gcSm}, // ALMOST EQUAL TO + {0x2249, 0x224B, prAL, gcSm}, // [3] NOT ALMOST EQUAL TO..TRIPLE TILDE + {0x224C, 0x224C, prAI, gcSm}, // ALL EQUAL TO + {0x224D, 0x2251, prAL, gcSm}, // [5] EQUIVALENT TO..GEOMETRICALLY EQUAL TO + {0x2252, 0x2252, prAI, gcSm}, // APPROXIMATELY EQUAL TO OR THE IMAGE OF + {0x2253, 0x225F, prAL, gcSm}, // [13] IMAGE OF OR APPROXIMATELY EQUAL TO..QUESTIONED EQUAL TO + {0x2260, 0x2261, prAI, gcSm}, // [2] NOT EQUAL TO..IDENTICAL TO + {0x2262, 0x2263, prAL, gcSm}, // [2] NOT IDENTICAL TO..STRICTLY EQUIVALENT TO + {0x2264, 0x2267, prAI, gcSm}, // [4] LESS-THAN OR EQUAL TO..GREATER-THAN OVER EQUAL TO + {0x2268, 0x2269, prAL, gcSm}, // [2] LESS-THAN BUT NOT EQUAL TO..GREATER-THAN BUT NOT EQUAL TO + {0x226A, 0x226B, prAI, gcSm}, // [2] MUCH LESS-THAN..MUCH GREATER-THAN + {0x226C, 0x226D, prAL, gcSm}, // [2] BETWEEN..NOT EQUIVALENT TO + {0x226E, 0x226F, prAI, gcSm}, // [2] NOT LESS-THAN..NOT GREATER-THAN + {0x2270, 0x2281, prAL, gcSm}, // [18] NEITHER LESS-THAN NOR EQUAL TO..DOES NOT SUCCEED + {0x2282, 0x2283, prAI, gcSm}, // [2] SUBSET OF..SUPERSET OF + {0x2284, 0x2285, prAL, gcSm}, // [2] NOT A SUBSET OF..NOT A SUPERSET OF + {0x2286, 0x2287, prAI, gcSm}, // [2] SUBSET OF OR EQUAL TO..SUPERSET OF OR EQUAL TO + {0x2288, 0x2294, prAL, gcSm}, // [13] NEITHER A SUBSET OF NOR EQUAL TO..SQUARE CUP + {0x2295, 0x2295, prAI, gcSm}, // CIRCLED PLUS + {0x2296, 0x2298, prAL, gcSm}, // [3] CIRCLED MINUS..CIRCLED DIVISION SLASH + {0x2299, 0x2299, prAI, gcSm}, // CIRCLED DOT OPERATOR + {0x229A, 0x22A4, prAL, gcSm}, // [11] CIRCLED RING OPERATOR..DOWN TACK + {0x22A5, 0x22A5, prAI, gcSm}, // UP TACK + {0x22A6, 0x22BE, prAL, gcSm}, // [25] ASSERTION..RIGHT ANGLE WITH ARC + {0x22BF, 0x22BF, prAI, gcSm}, // RIGHT TRIANGLE + {0x22C0, 0x22EE, prAL, gcSm}, // [47] N-ARY LOGICAL AND..VERTICAL ELLIPSIS + {0x22EF, 0x22EF, prIN, gcSm}, // MIDLINE HORIZONTAL ELLIPSIS + {0x22F0, 0x22FF, prAL, gcSm}, // [16] UP RIGHT DIAGONAL ELLIPSIS..Z NOTATION BAG MEMBERSHIP + {0x2300, 0x2307, prAL, gcSo}, // [8] DIAMETER SIGN..WAVY LINE + {0x2308, 0x2308, prOP, gcPs}, // LEFT CEILING + {0x2309, 0x2309, prCL, gcPe}, // RIGHT CEILING + {0x230A, 0x230A, prOP, gcPs}, // LEFT FLOOR + {0x230B, 0x230B, prCL, gcPe}, // RIGHT FLOOR + {0x230C, 0x2311, prAL, gcSo}, // [6] BOTTOM RIGHT CROP..SQUARE LOZENGE + {0x2312, 0x2312, prAI, gcSo}, // ARC + {0x2313, 0x2319, prAL, gcSo}, // [7] SEGMENT..TURNED NOT SIGN + {0x231A, 0x231B, prID, gcSo}, // [2] WATCH..HOURGLASS + {0x231C, 0x231F, prAL, gcSo}, // [4] TOP LEFT CORNER..BOTTOM RIGHT CORNER + {0x2320, 0x2321, prAL, gcSm}, // [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL + {0x2322, 0x2328, prAL, gcSo}, // [7] FROWN..KEYBOARD + {0x2329, 0x2329, prOP, gcPs}, // LEFT-POINTING ANGLE BRACKET + {0x232A, 0x232A, prCL, gcPe}, // RIGHT-POINTING ANGLE BRACKET + {0x232B, 0x237B, prAL, gcSo}, // [81] ERASE TO THE LEFT..NOT CHECK MARK + {0x237C, 0x237C, prAL, gcSm}, // RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW + {0x237D, 0x239A, prAL, gcSo}, // [30] SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL + {0x239B, 0x23B3, prAL, gcSm}, // [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM + {0x23B4, 0x23DB, prAL, gcSo}, // [40] TOP SQUARE BRACKET..FUSE + {0x23DC, 0x23E1, prAL, gcSm}, // [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET + {0x23E2, 0x23EF, prAL, gcSo}, // [14] WHITE TRAPEZIUM..BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR + {0x23F0, 0x23F3, prID, gcSo}, // [4] ALARM CLOCK..HOURGLASS WITH FLOWING SAND + {0x23F4, 0x23FF, prAL, gcSo}, // [12] BLACK MEDIUM LEFT-POINTING TRIANGLE..OBSERVER EYE SYMBOL + {0x2400, 0x2426, prAL, gcSo}, // [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO + {0x2440, 0x244A, prAL, gcSo}, // [11] OCR HOOK..OCR DOUBLE BACKSLASH + {0x2460, 0x249B, prAI, gcNo}, // [60] CIRCLED DIGIT ONE..NUMBER TWENTY FULL STOP + {0x249C, 0x24E9, prAI, gcSo}, // [78] PARENTHESIZED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z + {0x24EA, 0x24FE, prAI, gcNo}, // [21] CIRCLED DIGIT ZERO..DOUBLE CIRCLED NUMBER TEN + {0x24FF, 0x24FF, prAL, gcNo}, // NEGATIVE CIRCLED DIGIT ZERO + {0x2500, 0x254B, prAI, gcSo}, // [76] BOX DRAWINGS LIGHT HORIZONTAL..BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL + {0x254C, 0x254F, prAL, gcSo}, // [4] BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL..BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL + {0x2550, 0x2574, prAI, gcSo}, // [37] BOX DRAWINGS DOUBLE HORIZONTAL..BOX DRAWINGS LIGHT LEFT + {0x2575, 0x257F, prAL, gcSo}, // [11] BOX DRAWINGS LIGHT UP..BOX DRAWINGS HEAVY UP AND LIGHT DOWN + {0x2580, 0x258F, prAI, gcSo}, // [16] UPPER HALF BLOCK..LEFT ONE EIGHTH BLOCK + {0x2590, 0x2591, prAL, gcSo}, // [2] RIGHT HALF BLOCK..LIGHT SHADE + {0x2592, 0x2595, prAI, gcSo}, // [4] MEDIUM SHADE..RIGHT ONE EIGHTH BLOCK + {0x2596, 0x259F, prAL, gcSo}, // [10] QUADRANT LOWER LEFT..QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT + {0x25A0, 0x25A1, prAI, gcSo}, // [2] BLACK SQUARE..WHITE SQUARE + {0x25A2, 0x25A2, prAL, gcSo}, // WHITE SQUARE WITH ROUNDED CORNERS + {0x25A3, 0x25A9, prAI, gcSo}, // [7] WHITE SQUARE CONTAINING BLACK SMALL SQUARE..SQUARE WITH DIAGONAL CROSSHATCH FILL + {0x25AA, 0x25B1, prAL, gcSo}, // [8] BLACK SMALL SQUARE..WHITE PARALLELOGRAM + {0x25B2, 0x25B3, prAI, gcSo}, // [2] BLACK UP-POINTING TRIANGLE..WHITE UP-POINTING TRIANGLE + {0x25B4, 0x25B5, prAL, gcSo}, // [2] BLACK UP-POINTING SMALL TRIANGLE..WHITE UP-POINTING SMALL TRIANGLE + {0x25B6, 0x25B6, prAI, gcSo}, // BLACK RIGHT-POINTING TRIANGLE + {0x25B7, 0x25B7, prAI, gcSm}, // WHITE RIGHT-POINTING TRIANGLE + {0x25B8, 0x25BB, prAL, gcSo}, // [4] BLACK RIGHT-POINTING SMALL TRIANGLE..WHITE RIGHT-POINTING POINTER + {0x25BC, 0x25BD, prAI, gcSo}, // [2] BLACK DOWN-POINTING TRIANGLE..WHITE DOWN-POINTING TRIANGLE + {0x25BE, 0x25BF, prAL, gcSo}, // [2] BLACK DOWN-POINTING SMALL TRIANGLE..WHITE DOWN-POINTING SMALL TRIANGLE + {0x25C0, 0x25C0, prAI, gcSo}, // BLACK LEFT-POINTING TRIANGLE + {0x25C1, 0x25C1, prAI, gcSm}, // WHITE LEFT-POINTING TRIANGLE + {0x25C2, 0x25C5, prAL, gcSo}, // [4] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE LEFT-POINTING POINTER + {0x25C6, 0x25C8, prAI, gcSo}, // [3] BLACK DIAMOND..WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND + {0x25C9, 0x25CA, prAL, gcSo}, // [2] FISHEYE..LOZENGE + {0x25CB, 0x25CB, prAI, gcSo}, // WHITE CIRCLE + {0x25CC, 0x25CD, prAL, gcSo}, // [2] DOTTED CIRCLE..CIRCLE WITH VERTICAL FILL + {0x25CE, 0x25D1, prAI, gcSo}, // [4] BULLSEYE..CIRCLE WITH RIGHT HALF BLACK + {0x25D2, 0x25E1, prAL, gcSo}, // [16] CIRCLE WITH LOWER HALF BLACK..LOWER HALF CIRCLE + {0x25E2, 0x25E5, prAI, gcSo}, // [4] BLACK LOWER RIGHT TRIANGLE..BLACK UPPER RIGHT TRIANGLE + {0x25E6, 0x25EE, prAL, gcSo}, // [9] WHITE BULLET..UP-POINTING TRIANGLE WITH RIGHT HALF BLACK + {0x25EF, 0x25EF, prAI, gcSo}, // LARGE CIRCLE + {0x25F0, 0x25F7, prAL, gcSo}, // [8] WHITE SQUARE WITH UPPER LEFT QUADRANT..WHITE CIRCLE WITH UPPER RIGHT QUADRANT + {0x25F8, 0x25FF, prAL, gcSm}, // [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE + {0x2600, 0x2603, prID, gcSo}, // [4] BLACK SUN WITH RAYS..SNOWMAN + {0x2604, 0x2604, prAL, gcSo}, // COMET + {0x2605, 0x2606, prAI, gcSo}, // [2] BLACK STAR..WHITE STAR + {0x2607, 0x2608, prAL, gcSo}, // [2] LIGHTNING..THUNDERSTORM + {0x2609, 0x2609, prAI, gcSo}, // SUN + {0x260A, 0x260D, prAL, gcSo}, // [4] ASCENDING NODE..OPPOSITION + {0x260E, 0x260F, prAI, gcSo}, // [2] BLACK TELEPHONE..WHITE TELEPHONE + {0x2610, 0x2613, prAL, gcSo}, // [4] BALLOT BOX..SALTIRE + {0x2614, 0x2615, prID, gcSo}, // [2] UMBRELLA WITH RAIN DROPS..HOT BEVERAGE + {0x2616, 0x2617, prAI, gcSo}, // [2] WHITE SHOGI PIECE..BLACK SHOGI PIECE + {0x2618, 0x2618, prID, gcSo}, // SHAMROCK + {0x2619, 0x2619, prAL, gcSo}, // REVERSED ROTATED FLORAL HEART BULLET + {0x261A, 0x261C, prID, gcSo}, // [3] BLACK LEFT POINTING INDEX..WHITE LEFT POINTING INDEX + {0x261D, 0x261D, prEB, gcSo}, // WHITE UP POINTING INDEX + {0x261E, 0x261F, prID, gcSo}, // [2] WHITE RIGHT POINTING INDEX..WHITE DOWN POINTING INDEX + {0x2620, 0x2638, prAL, gcSo}, // [25] SKULL AND CROSSBONES..WHEEL OF DHARMA + {0x2639, 0x263B, prID, gcSo}, // [3] WHITE FROWNING FACE..BLACK SMILING FACE + {0x263C, 0x263F, prAL, gcSo}, // [4] WHITE SUN WITH RAYS..MERCURY + {0x2640, 0x2640, prAI, gcSo}, // FEMALE SIGN + {0x2641, 0x2641, prAL, gcSo}, // EARTH + {0x2642, 0x2642, prAI, gcSo}, // MALE SIGN + {0x2643, 0x265F, prAL, gcSo}, // [29] JUPITER..BLACK CHESS PAWN + {0x2660, 0x2661, prAI, gcSo}, // [2] BLACK SPADE SUIT..WHITE HEART SUIT + {0x2662, 0x2662, prAL, gcSo}, // WHITE DIAMOND SUIT + {0x2663, 0x2665, prAI, gcSo}, // [3] BLACK CLUB SUIT..BLACK HEART SUIT + {0x2666, 0x2666, prAL, gcSo}, // BLACK DIAMOND SUIT + {0x2667, 0x2667, prAI, gcSo}, // WHITE CLUB SUIT + {0x2668, 0x2668, prID, gcSo}, // HOT SPRINGS + {0x2669, 0x266A, prAI, gcSo}, // [2] QUARTER NOTE..EIGHTH NOTE + {0x266B, 0x266B, prAL, gcSo}, // BEAMED EIGHTH NOTES + {0x266C, 0x266D, prAI, gcSo}, // [2] BEAMED SIXTEENTH NOTES..MUSIC FLAT SIGN + {0x266E, 0x266E, prAL, gcSo}, // MUSIC NATURAL SIGN + {0x266F, 0x266F, prAI, gcSm}, // MUSIC SHARP SIGN + {0x2670, 0x267E, prAL, gcSo}, // [15] WEST SYRIAC CROSS..PERMANENT PAPER SIGN + {0x267F, 0x267F, prID, gcSo}, // WHEELCHAIR SYMBOL + {0x2680, 0x269D, prAL, gcSo}, // [30] DIE FACE-1..OUTLINED WHITE STAR + {0x269E, 0x269F, prAI, gcSo}, // [2] THREE LINES CONVERGING RIGHT..THREE LINES CONVERGING LEFT + {0x26A0, 0x26BC, prAL, gcSo}, // [29] WARNING SIGN..SESQUIQUADRATE + {0x26BD, 0x26C8, prID, gcSo}, // [12] SOCCER BALL..THUNDER CLOUD AND RAIN + {0x26C9, 0x26CC, prAI, gcSo}, // [4] TURNED WHITE SHOGI PIECE..CROSSING LANES + {0x26CD, 0x26CD, prID, gcSo}, // DISABLED CAR + {0x26CE, 0x26CE, prAL, gcSo}, // OPHIUCHUS + {0x26CF, 0x26D1, prID, gcSo}, // [3] PICK..HELMET WITH WHITE CROSS + {0x26D2, 0x26D2, prAI, gcSo}, // CIRCLED CROSSING LANES + {0x26D3, 0x26D4, prID, gcSo}, // [2] CHAINS..NO ENTRY + {0x26D5, 0x26D7, prAI, gcSo}, // [3] ALTERNATE ONE-WAY LEFT WAY TRAFFIC..WHITE TWO-WAY LEFT WAY TRAFFIC + {0x26D8, 0x26D9, prID, gcSo}, // [2] BLACK LEFT LANE MERGE..WHITE LEFT LANE MERGE + {0x26DA, 0x26DB, prAI, gcSo}, // [2] DRIVE SLOW SIGN..HEAVY WHITE DOWN-POINTING TRIANGLE + {0x26DC, 0x26DC, prID, gcSo}, // LEFT CLOSED ENTRY + {0x26DD, 0x26DE, prAI, gcSo}, // [2] SQUARED SALTIRE..FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE + {0x26DF, 0x26E1, prID, gcSo}, // [3] BLACK TRUCK..RESTRICTED LEFT ENTRY-2 + {0x26E2, 0x26E2, prAL, gcSo}, // ASTRONOMICAL SYMBOL FOR URANUS + {0x26E3, 0x26E3, prAI, gcSo}, // HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE + {0x26E4, 0x26E7, prAL, gcSo}, // [4] PENTAGRAM..INVERTED PENTAGRAM + {0x26E8, 0x26E9, prAI, gcSo}, // [2] BLACK CROSS ON SHIELD..SHINTO SHRINE + {0x26EA, 0x26EA, prID, gcSo}, // CHURCH + {0x26EB, 0x26F0, prAI, gcSo}, // [6] CASTLE..MOUNTAIN + {0x26F1, 0x26F5, prID, gcSo}, // [5] UMBRELLA ON GROUND..SAILBOAT + {0x26F6, 0x26F6, prAI, gcSo}, // SQUARE FOUR CORNERS + {0x26F7, 0x26F8, prID, gcSo}, // [2] SKIER..ICE SKATE + {0x26F9, 0x26F9, prEB, gcSo}, // PERSON WITH BALL + {0x26FA, 0x26FA, prID, gcSo}, // TENT + {0x26FB, 0x26FC, prAI, gcSo}, // [2] JAPANESE BANK SYMBOL..HEADSTONE GRAVEYARD SYMBOL + {0x26FD, 0x26FF, prID, gcSo}, // [3] FUEL PUMP..WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE + {0x2700, 0x2704, prID, gcSo}, // [5] BLACK SAFETY SCISSORS..WHITE SCISSORS + {0x2705, 0x2707, prAL, gcSo}, // [3] WHITE HEAVY CHECK MARK..TAPE DRIVE + {0x2708, 0x2709, prID, gcSo}, // [2] AIRPLANE..ENVELOPE + {0x270A, 0x270D, prEB, gcSo}, // [4] RAISED FIST..WRITING HAND + {0x270E, 0x2756, prAL, gcSo}, // [73] LOWER RIGHT PENCIL..BLACK DIAMOND MINUS WHITE X + {0x2757, 0x2757, prAI, gcSo}, // HEAVY EXCLAMATION MARK SYMBOL + {0x2758, 0x275A, prAL, gcSo}, // [3] LIGHT VERTICAL BAR..HEAVY VERTICAL BAR + {0x275B, 0x2760, prQU, gcSo}, // [6] HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT..HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT + {0x2761, 0x2761, prAL, gcSo}, // CURVED STEM PARAGRAPH SIGN ORNAMENT + {0x2762, 0x2763, prEX, gcSo}, // [2] HEAVY EXCLAMATION MARK ORNAMENT..HEAVY HEART EXCLAMATION MARK ORNAMENT + {0x2764, 0x2764, prID, gcSo}, // HEAVY BLACK HEART + {0x2765, 0x2767, prAL, gcSo}, // [3] ROTATED HEAVY BLACK HEART BULLET..ROTATED FLORAL HEART BULLET + {0x2768, 0x2768, prOP, gcPs}, // MEDIUM LEFT PARENTHESIS ORNAMENT + {0x2769, 0x2769, prCL, gcPe}, // MEDIUM RIGHT PARENTHESIS ORNAMENT + {0x276A, 0x276A, prOP, gcPs}, // MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT + {0x276B, 0x276B, prCL, gcPe}, // MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT + {0x276C, 0x276C, prOP, gcPs}, // MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT + {0x276D, 0x276D, prCL, gcPe}, // MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT + {0x276E, 0x276E, prOP, gcPs}, // HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT + {0x276F, 0x276F, prCL, gcPe}, // HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT + {0x2770, 0x2770, prOP, gcPs}, // HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT + {0x2771, 0x2771, prCL, gcPe}, // HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT + {0x2772, 0x2772, prOP, gcPs}, // LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT + {0x2773, 0x2773, prCL, gcPe}, // LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT + {0x2774, 0x2774, prOP, gcPs}, // MEDIUM LEFT CURLY BRACKET ORNAMENT + {0x2775, 0x2775, prCL, gcPe}, // MEDIUM RIGHT CURLY BRACKET ORNAMENT + {0x2776, 0x2793, prAI, gcNo}, // [30] DINGBAT NEGATIVE CIRCLED DIGIT ONE..DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN + {0x2794, 0x27BF, prAL, gcSo}, // [44] HEAVY WIDE-HEADED RIGHTWARDS ARROW..DOUBLE CURLY LOOP + {0x27C0, 0x27C4, prAL, gcSm}, // [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET + {0x27C5, 0x27C5, prOP, gcPs}, // LEFT S-SHAPED BAG DELIMITER + {0x27C6, 0x27C6, prCL, gcPe}, // RIGHT S-SHAPED BAG DELIMITER + {0x27C7, 0x27E5, prAL, gcSm}, // [31] OR WITH DOT INSIDE..WHITE SQUARE WITH RIGHTWARDS TICK + {0x27E6, 0x27E6, prOP, gcPs}, // MATHEMATICAL LEFT WHITE SQUARE BRACKET + {0x27E7, 0x27E7, prCL, gcPe}, // MATHEMATICAL RIGHT WHITE SQUARE BRACKET + {0x27E8, 0x27E8, prOP, gcPs}, // MATHEMATICAL LEFT ANGLE BRACKET + {0x27E9, 0x27E9, prCL, gcPe}, // MATHEMATICAL RIGHT ANGLE BRACKET + {0x27EA, 0x27EA, prOP, gcPs}, // MATHEMATICAL LEFT DOUBLE ANGLE BRACKET + {0x27EB, 0x27EB, prCL, gcPe}, // MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET + {0x27EC, 0x27EC, prOP, gcPs}, // MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET + {0x27ED, 0x27ED, prCL, gcPe}, // MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET + {0x27EE, 0x27EE, prOP, gcPs}, // MATHEMATICAL LEFT FLATTENED PARENTHESIS + {0x27EF, 0x27EF, prCL, gcPe}, // MATHEMATICAL RIGHT FLATTENED PARENTHESIS + {0x27F0, 0x27FF, prAL, gcSm}, // [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW + {0x2800, 0x28FF, prAL, gcSo}, // [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678 + {0x2900, 0x297F, prAL, gcSm}, // [128] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..DOWN FISH TAIL + {0x2980, 0x2982, prAL, gcSm}, // [3] TRIPLE VERTICAL BAR DELIMITER..Z NOTATION TYPE COLON + {0x2983, 0x2983, prOP, gcPs}, // LEFT WHITE CURLY BRACKET + {0x2984, 0x2984, prCL, gcPe}, // RIGHT WHITE CURLY BRACKET + {0x2985, 0x2985, prOP, gcPs}, // LEFT WHITE PARENTHESIS + {0x2986, 0x2986, prCL, gcPe}, // RIGHT WHITE PARENTHESIS + {0x2987, 0x2987, prOP, gcPs}, // Z NOTATION LEFT IMAGE BRACKET + {0x2988, 0x2988, prCL, gcPe}, // Z NOTATION RIGHT IMAGE BRACKET + {0x2989, 0x2989, prOP, gcPs}, // Z NOTATION LEFT BINDING BRACKET + {0x298A, 0x298A, prCL, gcPe}, // Z NOTATION RIGHT BINDING BRACKET + {0x298B, 0x298B, prOP, gcPs}, // LEFT SQUARE BRACKET WITH UNDERBAR + {0x298C, 0x298C, prCL, gcPe}, // RIGHT SQUARE BRACKET WITH UNDERBAR + {0x298D, 0x298D, prOP, gcPs}, // LEFT SQUARE BRACKET WITH TICK IN TOP CORNER + {0x298E, 0x298E, prCL, gcPe}, // RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER + {0x298F, 0x298F, prOP, gcPs}, // LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER + {0x2990, 0x2990, prCL, gcPe}, // RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER + {0x2991, 0x2991, prOP, gcPs}, // LEFT ANGLE BRACKET WITH DOT + {0x2992, 0x2992, prCL, gcPe}, // RIGHT ANGLE BRACKET WITH DOT + {0x2993, 0x2993, prOP, gcPs}, // LEFT ARC LESS-THAN BRACKET + {0x2994, 0x2994, prCL, gcPe}, // RIGHT ARC GREATER-THAN BRACKET + {0x2995, 0x2995, prOP, gcPs}, // DOUBLE LEFT ARC GREATER-THAN BRACKET + {0x2996, 0x2996, prCL, gcPe}, // DOUBLE RIGHT ARC LESS-THAN BRACKET + {0x2997, 0x2997, prOP, gcPs}, // LEFT BLACK TORTOISE SHELL BRACKET + {0x2998, 0x2998, prCL, gcPe}, // RIGHT BLACK TORTOISE SHELL BRACKET + {0x2999, 0x29D7, prAL, gcSm}, // [63] DOTTED FENCE..BLACK HOURGLASS + {0x29D8, 0x29D8, prOP, gcPs}, // LEFT WIGGLY FENCE + {0x29D9, 0x29D9, prCL, gcPe}, // RIGHT WIGGLY FENCE + {0x29DA, 0x29DA, prOP, gcPs}, // LEFT DOUBLE WIGGLY FENCE + {0x29DB, 0x29DB, prCL, gcPe}, // RIGHT DOUBLE WIGGLY FENCE + {0x29DC, 0x29FB, prAL, gcSm}, // [32] INCOMPLETE INFINITY..TRIPLE PLUS + {0x29FC, 0x29FC, prOP, gcPs}, // LEFT-POINTING CURVED ANGLE BRACKET + {0x29FD, 0x29FD, prCL, gcPe}, // RIGHT-POINTING CURVED ANGLE BRACKET + {0x29FE, 0x29FF, prAL, gcSm}, // [2] TINY..MINY + {0x2A00, 0x2AFF, prAL, gcSm}, // [256] N-ARY CIRCLED DOT OPERATOR..N-ARY WHITE VERTICAL BAR + {0x2B00, 0x2B2F, prAL, gcSo}, // [48] NORTH EAST WHITE ARROW..WHITE VERTICAL ELLIPSE + {0x2B30, 0x2B44, prAL, gcSm}, // [21] LEFT ARROW WITH SMALL CIRCLE..RIGHTWARDS ARROW THROUGH SUPERSET + {0x2B45, 0x2B46, prAL, gcSo}, // [2] LEFTWARDS QUADRUPLE ARROW..RIGHTWARDS QUADRUPLE ARROW + {0x2B47, 0x2B4C, prAL, gcSm}, // [6] REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR + {0x2B4D, 0x2B54, prAL, gcSo}, // [8] DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW..WHITE RIGHT-POINTING PENTAGON + {0x2B55, 0x2B59, prAI, gcSo}, // [5] HEAVY LARGE CIRCLE..HEAVY CIRCLED SALTIRE + {0x2B5A, 0x2B73, prAL, gcSo}, // [26] SLANTED NORTH ARROW WITH HOOKED HEAD..DOWNWARDS TRIANGLE-HEADED ARROW TO BAR + {0x2B76, 0x2B95, prAL, gcSo}, // [32] NORTH WEST TRIANGLE-HEADED ARROW TO BAR..RIGHTWARDS BLACK ARROW + {0x2B97, 0x2BFF, prAL, gcSo}, // [105] SYMBOL FOR TYPE A ELECTRONICS..HELLSCHREIBER PAUSE SYMBOL + {0x2C00, 0x2C5F, prAL, gcLC}, // [96] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC SMALL LETTER CAUDATE CHRIVI + {0x2C60, 0x2C7B, prAL, gcLC}, // [28] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN LETTER SMALL CAPITAL TURNED E + {0x2C7C, 0x2C7D, prAL, gcLm}, // [2] LATIN SUBSCRIPT SMALL LETTER J..MODIFIER LETTER CAPITAL V + {0x2C7E, 0x2C7F, prAL, gcLu}, // [2] LATIN CAPITAL LETTER S WITH SWASH TAIL..LATIN CAPITAL LETTER Z WITH SWASH TAIL + {0x2C80, 0x2CE4, prAL, gcLC}, // [101] COPTIC CAPITAL LETTER ALFA..COPTIC SYMBOL KAI + {0x2CE5, 0x2CEA, prAL, gcSo}, // [6] COPTIC SYMBOL MI RO..COPTIC SYMBOL SHIMA SIMA + {0x2CEB, 0x2CEE, prAL, gcLC}, // [4] COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI..COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA + {0x2CEF, 0x2CF1, prCM, gcMn}, // [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS + {0x2CF2, 0x2CF3, prAL, gcLC}, // [2] COPTIC CAPITAL LETTER BOHAIRIC KHEI..COPTIC SMALL LETTER BOHAIRIC KHEI + {0x2CF9, 0x2CF9, prEX, gcPo}, // COPTIC OLD NUBIAN FULL STOP + {0x2CFA, 0x2CFC, prBA, gcPo}, // [3] COPTIC OLD NUBIAN DIRECT QUESTION MARK..COPTIC OLD NUBIAN VERSE DIVIDER + {0x2CFD, 0x2CFD, prAL, gcNo}, // COPTIC FRACTION ONE HALF + {0x2CFE, 0x2CFE, prEX, gcPo}, // COPTIC FULL STOP + {0x2CFF, 0x2CFF, prBA, gcPo}, // COPTIC MORPHOLOGICAL DIVIDER + {0x2D00, 0x2D25, prAL, gcLl}, // [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE + {0x2D27, 0x2D27, prAL, gcLl}, // GEORGIAN SMALL LETTER YN + {0x2D2D, 0x2D2D, prAL, gcLl}, // GEORGIAN SMALL LETTER AEN + {0x2D30, 0x2D67, prAL, gcLo}, // [56] TIFINAGH LETTER YA..TIFINAGH LETTER YO + {0x2D6F, 0x2D6F, prAL, gcLm}, // TIFINAGH MODIFIER LETTER LABIALIZATION MARK + {0x2D70, 0x2D70, prBA, gcPo}, // TIFINAGH SEPARATOR MARK + {0x2D7F, 0x2D7F, prCM, gcMn}, // TIFINAGH CONSONANT JOINER + {0x2D80, 0x2D96, prAL, gcLo}, // [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE + {0x2DA0, 0x2DA6, prAL, gcLo}, // [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO + {0x2DA8, 0x2DAE, prAL, gcLo}, // [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO + {0x2DB0, 0x2DB6, prAL, gcLo}, // [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO + {0x2DB8, 0x2DBE, prAL, gcLo}, // [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO + {0x2DC0, 0x2DC6, prAL, gcLo}, // [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO + {0x2DC8, 0x2DCE, prAL, gcLo}, // [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO + {0x2DD0, 0x2DD6, prAL, gcLo}, // [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO + {0x2DD8, 0x2DDE, prAL, gcLo}, // [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO + {0x2DE0, 0x2DFF, prCM, gcMn}, // [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS + {0x2E00, 0x2E01, prQU, gcPo}, // [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER + {0x2E02, 0x2E02, prQU, gcPi}, // LEFT SUBSTITUTION BRACKET + {0x2E03, 0x2E03, prQU, gcPf}, // RIGHT SUBSTITUTION BRACKET + {0x2E04, 0x2E04, prQU, gcPi}, // LEFT DOTTED SUBSTITUTION BRACKET + {0x2E05, 0x2E05, prQU, gcPf}, // RIGHT DOTTED SUBSTITUTION BRACKET + {0x2E06, 0x2E08, prQU, gcPo}, // [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER + {0x2E09, 0x2E09, prQU, gcPi}, // LEFT TRANSPOSITION BRACKET + {0x2E0A, 0x2E0A, prQU, gcPf}, // RIGHT TRANSPOSITION BRACKET + {0x2E0B, 0x2E0B, prQU, gcPo}, // RAISED SQUARE + {0x2E0C, 0x2E0C, prQU, gcPi}, // LEFT RAISED OMISSION BRACKET + {0x2E0D, 0x2E0D, prQU, gcPf}, // RIGHT RAISED OMISSION BRACKET + {0x2E0E, 0x2E15, prBA, gcPo}, // [8] EDITORIAL CORONIS..UPWARDS ANCORA + {0x2E16, 0x2E16, prAL, gcPo}, // DOTTED RIGHT-POINTING ANGLE + {0x2E17, 0x2E17, prBA, gcPd}, // DOUBLE OBLIQUE HYPHEN + {0x2E18, 0x2E18, prOP, gcPo}, // INVERTED INTERROBANG + {0x2E19, 0x2E19, prBA, gcPo}, // PALM BRANCH + {0x2E1A, 0x2E1A, prAL, gcPd}, // HYPHEN WITH DIAERESIS + {0x2E1B, 0x2E1B, prAL, gcPo}, // TILDE WITH RING ABOVE + {0x2E1C, 0x2E1C, prQU, gcPi}, // LEFT LOW PARAPHRASE BRACKET + {0x2E1D, 0x2E1D, prQU, gcPf}, // RIGHT LOW PARAPHRASE BRACKET + {0x2E1E, 0x2E1F, prAL, gcPo}, // [2] TILDE WITH DOT ABOVE..TILDE WITH DOT BELOW + {0x2E20, 0x2E20, prQU, gcPi}, // LEFT VERTICAL BAR WITH QUILL + {0x2E21, 0x2E21, prQU, gcPf}, // RIGHT VERTICAL BAR WITH QUILL + {0x2E22, 0x2E22, prOP, gcPs}, // TOP LEFT HALF BRACKET + {0x2E23, 0x2E23, prCL, gcPe}, // TOP RIGHT HALF BRACKET + {0x2E24, 0x2E24, prOP, gcPs}, // BOTTOM LEFT HALF BRACKET + {0x2E25, 0x2E25, prCL, gcPe}, // BOTTOM RIGHT HALF BRACKET + {0x2E26, 0x2E26, prOP, gcPs}, // LEFT SIDEWAYS U BRACKET + {0x2E27, 0x2E27, prCL, gcPe}, // RIGHT SIDEWAYS U BRACKET + {0x2E28, 0x2E28, prOP, gcPs}, // LEFT DOUBLE PARENTHESIS + {0x2E29, 0x2E29, prCL, gcPe}, // RIGHT DOUBLE PARENTHESIS + {0x2E2A, 0x2E2D, prBA, gcPo}, // [4] TWO DOTS OVER ONE DOT PUNCTUATION..FIVE DOT MARK + {0x2E2E, 0x2E2E, prEX, gcPo}, // REVERSED QUESTION MARK + {0x2E2F, 0x2E2F, prAL, gcLm}, // VERTICAL TILDE + {0x2E30, 0x2E31, prBA, gcPo}, // [2] RING POINT..WORD SEPARATOR MIDDLE DOT + {0x2E32, 0x2E32, prAL, gcPo}, // TURNED COMMA + {0x2E33, 0x2E34, prBA, gcPo}, // [2] RAISED DOT..RAISED COMMA + {0x2E35, 0x2E39, prAL, gcPo}, // [5] TURNED SEMICOLON..TOP HALF SECTION SIGN + {0x2E3A, 0x2E3B, prB2, gcPd}, // [2] TWO-EM DASH..THREE-EM DASH + {0x2E3C, 0x2E3E, prBA, gcPo}, // [3] STENOGRAPHIC FULL STOP..WIGGLY VERTICAL LINE + {0x2E3F, 0x2E3F, prAL, gcPo}, // CAPITULUM + {0x2E40, 0x2E40, prBA, gcPd}, // DOUBLE HYPHEN + {0x2E41, 0x2E41, prBA, gcPo}, // REVERSED COMMA + {0x2E42, 0x2E42, prOP, gcPs}, // DOUBLE LOW-REVERSED-9 QUOTATION MARK + {0x2E43, 0x2E4A, prBA, gcPo}, // [8] DASH WITH LEFT UPTURN..DOTTED SOLIDUS + {0x2E4B, 0x2E4B, prAL, gcPo}, // TRIPLE DAGGER + {0x2E4C, 0x2E4C, prBA, gcPo}, // MEDIEVAL COMMA + {0x2E4D, 0x2E4D, prAL, gcPo}, // PARAGRAPHUS MARK + {0x2E4E, 0x2E4F, prBA, gcPo}, // [2] PUNCTUS ELEVATUS MARK..CORNISH VERSE DIVIDER + {0x2E50, 0x2E51, prAL, gcSo}, // [2] CROSS PATTY WITH RIGHT CROSSBAR..CROSS PATTY WITH LEFT CROSSBAR + {0x2E52, 0x2E52, prAL, gcPo}, // TIRONIAN SIGN CAPITAL ET + {0x2E53, 0x2E54, prEX, gcPo}, // [2] MEDIEVAL EXCLAMATION MARK..MEDIEVAL QUESTION MARK + {0x2E55, 0x2E55, prOP, gcPs}, // LEFT SQUARE BRACKET WITH STROKE + {0x2E56, 0x2E56, prCL, gcPe}, // RIGHT SQUARE BRACKET WITH STROKE + {0x2E57, 0x2E57, prOP, gcPs}, // LEFT SQUARE BRACKET WITH DOUBLE STROKE + {0x2E58, 0x2E58, prCL, gcPe}, // RIGHT SQUARE BRACKET WITH DOUBLE STROKE + {0x2E59, 0x2E59, prOP, gcPs}, // TOP HALF LEFT PARENTHESIS + {0x2E5A, 0x2E5A, prCL, gcPe}, // TOP HALF RIGHT PARENTHESIS + {0x2E5B, 0x2E5B, prOP, gcPs}, // BOTTOM HALF LEFT PARENTHESIS + {0x2E5C, 0x2E5C, prCL, gcPe}, // BOTTOM HALF RIGHT PARENTHESIS + {0x2E5D, 0x2E5D, prBA, gcPd}, // OBLIQUE HYPHEN + {0x2E80, 0x2E99, prID, gcSo}, // [26] CJK RADICAL REPEAT..CJK RADICAL RAP + {0x2E9B, 0x2EF3, prID, gcSo}, // [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE + {0x2F00, 0x2FD5, prID, gcSo}, // [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE + {0x2FF0, 0x2FFB, prID, gcSo}, // [12] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID + {0x3000, 0x3000, prBA, gcZs}, // IDEOGRAPHIC SPACE + {0x3001, 0x3002, prCL, gcPo}, // [2] IDEOGRAPHIC COMMA..IDEOGRAPHIC FULL STOP + {0x3003, 0x3003, prID, gcPo}, // DITTO MARK + {0x3004, 0x3004, prID, gcSo}, // JAPANESE INDUSTRIAL STANDARD SYMBOL + {0x3005, 0x3005, prNS, gcLm}, // IDEOGRAPHIC ITERATION MARK + {0x3006, 0x3006, prID, gcLo}, // IDEOGRAPHIC CLOSING MARK + {0x3007, 0x3007, prID, gcNl}, // IDEOGRAPHIC NUMBER ZERO + {0x3008, 0x3008, prOP, gcPs}, // LEFT ANGLE BRACKET + {0x3009, 0x3009, prCL, gcPe}, // RIGHT ANGLE BRACKET + {0x300A, 0x300A, prOP, gcPs}, // LEFT DOUBLE ANGLE BRACKET + {0x300B, 0x300B, prCL, gcPe}, // RIGHT DOUBLE ANGLE BRACKET + {0x300C, 0x300C, prOP, gcPs}, // LEFT CORNER BRACKET + {0x300D, 0x300D, prCL, gcPe}, // RIGHT CORNER BRACKET + {0x300E, 0x300E, prOP, gcPs}, // LEFT WHITE CORNER BRACKET + {0x300F, 0x300F, prCL, gcPe}, // RIGHT WHITE CORNER BRACKET + {0x3010, 0x3010, prOP, gcPs}, // LEFT BLACK LENTICULAR BRACKET + {0x3011, 0x3011, prCL, gcPe}, // RIGHT BLACK LENTICULAR BRACKET + {0x3012, 0x3013, prID, gcSo}, // [2] POSTAL MARK..GETA MARK + {0x3014, 0x3014, prOP, gcPs}, // LEFT TORTOISE SHELL BRACKET + {0x3015, 0x3015, prCL, gcPe}, // RIGHT TORTOISE SHELL BRACKET + {0x3016, 0x3016, prOP, gcPs}, // LEFT WHITE LENTICULAR BRACKET + {0x3017, 0x3017, prCL, gcPe}, // RIGHT WHITE LENTICULAR BRACKET + {0x3018, 0x3018, prOP, gcPs}, // LEFT WHITE TORTOISE SHELL BRACKET + {0x3019, 0x3019, prCL, gcPe}, // RIGHT WHITE TORTOISE SHELL BRACKET + {0x301A, 0x301A, prOP, gcPs}, // LEFT WHITE SQUARE BRACKET + {0x301B, 0x301B, prCL, gcPe}, // RIGHT WHITE SQUARE BRACKET + {0x301C, 0x301C, prNS, gcPd}, // WAVE DASH + {0x301D, 0x301D, prOP, gcPs}, // REVERSED DOUBLE PRIME QUOTATION MARK + {0x301E, 0x301F, prCL, gcPe}, // [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK + {0x3020, 0x3020, prID, gcSo}, // POSTAL MARK FACE + {0x3021, 0x3029, prID, gcNl}, // [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE + {0x302A, 0x302D, prCM, gcMn}, // [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK + {0x302E, 0x302F, prCM, gcMc}, // [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK + {0x3030, 0x3030, prID, gcPd}, // WAVY DASH + {0x3031, 0x3034, prID, gcLm}, // [4] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF + {0x3035, 0x3035, prCM, gcLm}, // VERTICAL KANA REPEAT MARK LOWER HALF + {0x3036, 0x3037, prID, gcSo}, // [2] CIRCLED POSTAL MARK..IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL + {0x3038, 0x303A, prID, gcNl}, // [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY + {0x303B, 0x303B, prNS, gcLm}, // VERTICAL IDEOGRAPHIC ITERATION MARK + {0x303C, 0x303C, prNS, gcLo}, // MASU MARK + {0x303D, 0x303D, prID, gcPo}, // PART ALTERNATION MARK + {0x303E, 0x303F, prID, gcSo}, // [2] IDEOGRAPHIC VARIATION INDICATOR..IDEOGRAPHIC HALF FILL SPACE + {0x3041, 0x3041, prCJ, gcLo}, // HIRAGANA LETTER SMALL A + {0x3042, 0x3042, prID, gcLo}, // HIRAGANA LETTER A + {0x3043, 0x3043, prCJ, gcLo}, // HIRAGANA LETTER SMALL I + {0x3044, 0x3044, prID, gcLo}, // HIRAGANA LETTER I + {0x3045, 0x3045, prCJ, gcLo}, // HIRAGANA LETTER SMALL U + {0x3046, 0x3046, prID, gcLo}, // HIRAGANA LETTER U + {0x3047, 0x3047, prCJ, gcLo}, // HIRAGANA LETTER SMALL E + {0x3048, 0x3048, prID, gcLo}, // HIRAGANA LETTER E + {0x3049, 0x3049, prCJ, gcLo}, // HIRAGANA LETTER SMALL O + {0x304A, 0x3062, prID, gcLo}, // [25] HIRAGANA LETTER O..HIRAGANA LETTER DI + {0x3063, 0x3063, prCJ, gcLo}, // HIRAGANA LETTER SMALL TU + {0x3064, 0x3082, prID, gcLo}, // [31] HIRAGANA LETTER TU..HIRAGANA LETTER MO + {0x3083, 0x3083, prCJ, gcLo}, // HIRAGANA LETTER SMALL YA + {0x3084, 0x3084, prID, gcLo}, // HIRAGANA LETTER YA + {0x3085, 0x3085, prCJ, gcLo}, // HIRAGANA LETTER SMALL YU + {0x3086, 0x3086, prID, gcLo}, // HIRAGANA LETTER YU + {0x3087, 0x3087, prCJ, gcLo}, // HIRAGANA LETTER SMALL YO + {0x3088, 0x308D, prID, gcLo}, // [6] HIRAGANA LETTER YO..HIRAGANA LETTER RO + {0x308E, 0x308E, prCJ, gcLo}, // HIRAGANA LETTER SMALL WA + {0x308F, 0x3094, prID, gcLo}, // [6] HIRAGANA LETTER WA..HIRAGANA LETTER VU + {0x3095, 0x3096, prCJ, gcLo}, // [2] HIRAGANA LETTER SMALL KA..HIRAGANA LETTER SMALL KE + {0x3099, 0x309A, prCM, gcMn}, // [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + {0x309B, 0x309C, prNS, gcSk}, // [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + {0x309D, 0x309E, prNS, gcLm}, // [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK + {0x309F, 0x309F, prID, gcLo}, // HIRAGANA DIGRAPH YORI + {0x30A0, 0x30A0, prNS, gcPd}, // KATAKANA-HIRAGANA DOUBLE HYPHEN + {0x30A1, 0x30A1, prCJ, gcLo}, // KATAKANA LETTER SMALL A + {0x30A2, 0x30A2, prID, gcLo}, // KATAKANA LETTER A + {0x30A3, 0x30A3, prCJ, gcLo}, // KATAKANA LETTER SMALL I + {0x30A4, 0x30A4, prID, gcLo}, // KATAKANA LETTER I + {0x30A5, 0x30A5, prCJ, gcLo}, // KATAKANA LETTER SMALL U + {0x30A6, 0x30A6, prID, gcLo}, // KATAKANA LETTER U + {0x30A7, 0x30A7, prCJ, gcLo}, // KATAKANA LETTER SMALL E + {0x30A8, 0x30A8, prID, gcLo}, // KATAKANA LETTER E + {0x30A9, 0x30A9, prCJ, gcLo}, // KATAKANA LETTER SMALL O + {0x30AA, 0x30C2, prID, gcLo}, // [25] KATAKANA LETTER O..KATAKANA LETTER DI + {0x30C3, 0x30C3, prCJ, gcLo}, // KATAKANA LETTER SMALL TU + {0x30C4, 0x30E2, prID, gcLo}, // [31] KATAKANA LETTER TU..KATAKANA LETTER MO + {0x30E3, 0x30E3, prCJ, gcLo}, // KATAKANA LETTER SMALL YA + {0x30E4, 0x30E4, prID, gcLo}, // KATAKANA LETTER YA + {0x30E5, 0x30E5, prCJ, gcLo}, // KATAKANA LETTER SMALL YU + {0x30E6, 0x30E6, prID, gcLo}, // KATAKANA LETTER YU + {0x30E7, 0x30E7, prCJ, gcLo}, // KATAKANA LETTER SMALL YO + {0x30E8, 0x30ED, prID, gcLo}, // [6] KATAKANA LETTER YO..KATAKANA LETTER RO + {0x30EE, 0x30EE, prCJ, gcLo}, // KATAKANA LETTER SMALL WA + {0x30EF, 0x30F4, prID, gcLo}, // [6] KATAKANA LETTER WA..KATAKANA LETTER VU + {0x30F5, 0x30F6, prCJ, gcLo}, // [2] KATAKANA LETTER SMALL KA..KATAKANA LETTER SMALL KE + {0x30F7, 0x30FA, prID, gcLo}, // [4] KATAKANA LETTER VA..KATAKANA LETTER VO + {0x30FB, 0x30FB, prNS, gcPo}, // KATAKANA MIDDLE DOT + {0x30FC, 0x30FC, prCJ, gcLm}, // KATAKANA-HIRAGANA PROLONGED SOUND MARK + {0x30FD, 0x30FE, prNS, gcLm}, // [2] KATAKANA ITERATION MARK..KATAKANA VOICED ITERATION MARK + {0x30FF, 0x30FF, prID, gcLo}, // KATAKANA DIGRAPH KOTO + {0x3105, 0x312F, prID, gcLo}, // [43] BOPOMOFO LETTER B..BOPOMOFO LETTER NN + {0x3131, 0x318E, prID, gcLo}, // [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE + {0x3190, 0x3191, prID, gcSo}, // [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK + {0x3192, 0x3195, prID, gcNo}, // [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK + {0x3196, 0x319F, prID, gcSo}, // [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK + {0x31A0, 0x31BF, prID, gcLo}, // [32] BOPOMOFO LETTER BU..BOPOMOFO LETTER AH + {0x31C0, 0x31E3, prID, gcSo}, // [36] CJK STROKE T..CJK STROKE Q + {0x31F0, 0x31FF, prCJ, gcLo}, // [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO + {0x3200, 0x321E, prID, gcSo}, // [31] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED KOREAN CHARACTER O HU + {0x3220, 0x3229, prID, gcNo}, // [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN + {0x322A, 0x3247, prID, gcSo}, // [30] PARENTHESIZED IDEOGRAPH MOON..CIRCLED IDEOGRAPH KOTO + {0x3248, 0x324F, prAI, gcNo}, // [8] CIRCLED NUMBER TEN ON BLACK SQUARE..CIRCLED NUMBER EIGHTY ON BLACK SQUARE + {0x3250, 0x3250, prID, gcSo}, // PARTNERSHIP SIGN + {0x3251, 0x325F, prID, gcNo}, // [15] CIRCLED NUMBER TWENTY ONE..CIRCLED NUMBER THIRTY FIVE + {0x3260, 0x327F, prID, gcSo}, // [32] CIRCLED HANGUL KIYEOK..KOREAN STANDARD SYMBOL + {0x3280, 0x3289, prID, gcNo}, // [10] CIRCLED IDEOGRAPH ONE..CIRCLED IDEOGRAPH TEN + {0x328A, 0x32B0, prID, gcSo}, // [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT + {0x32B1, 0x32BF, prID, gcNo}, // [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY + {0x32C0, 0x32FF, prID, gcSo}, // [64] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..SQUARE ERA NAME REIWA + {0x3300, 0x33FF, prID, gcSo}, // [256] SQUARE APAATO..SQUARE GAL + {0x3400, 0x4DBF, prID, gcLo}, // [6592] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DBF + {0x4DC0, 0x4DFF, prAL, gcSo}, // [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION + {0x4E00, 0x9FFF, prID, gcLo}, // [20992] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FFF + {0xA000, 0xA014, prID, gcLo}, // [21] YI SYLLABLE IT..YI SYLLABLE E + {0xA015, 0xA015, prNS, gcLm}, // YI SYLLABLE WU + {0xA016, 0xA48C, prID, gcLo}, // [1143] YI SYLLABLE BIT..YI SYLLABLE YYR + {0xA490, 0xA4C6, prID, gcSo}, // [55] YI RADICAL QOT..YI RADICAL KE + {0xA4D0, 0xA4F7, prAL, gcLo}, // [40] LISU LETTER BA..LISU LETTER OE + {0xA4F8, 0xA4FD, prAL, gcLm}, // [6] LISU LETTER TONE MYA TI..LISU LETTER TONE MYA JEU + {0xA4FE, 0xA4FF, prBA, gcPo}, // [2] LISU PUNCTUATION COMMA..LISU PUNCTUATION FULL STOP + {0xA500, 0xA60B, prAL, gcLo}, // [268] VAI SYLLABLE EE..VAI SYLLABLE NG + {0xA60C, 0xA60C, prAL, gcLm}, // VAI SYLLABLE LENGTHENER + {0xA60D, 0xA60D, prBA, gcPo}, // VAI COMMA + {0xA60E, 0xA60E, prEX, gcPo}, // VAI FULL STOP + {0xA60F, 0xA60F, prBA, gcPo}, // VAI QUESTION MARK + {0xA610, 0xA61F, prAL, gcLo}, // [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG + {0xA620, 0xA629, prNU, gcNd}, // [10] VAI DIGIT ZERO..VAI DIGIT NINE + {0xA62A, 0xA62B, prAL, gcLo}, // [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO + {0xA640, 0xA66D, prAL, gcLC}, // [46] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O + {0xA66E, 0xA66E, prAL, gcLo}, // CYRILLIC LETTER MULTIOCULAR O + {0xA66F, 0xA66F, prCM, gcMn}, // COMBINING CYRILLIC VZMET + {0xA670, 0xA672, prCM, gcMe}, // [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN + {0xA673, 0xA673, prAL, gcPo}, // SLAVONIC ASTERISK + {0xA674, 0xA67D, prCM, gcMn}, // [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK + {0xA67E, 0xA67E, prAL, gcPo}, // CYRILLIC KAVYKA + {0xA67F, 0xA67F, prAL, gcLm}, // CYRILLIC PAYEROK + {0xA680, 0xA69B, prAL, gcLC}, // [28] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER CROSSED O + {0xA69C, 0xA69D, prAL, gcLm}, // [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER LETTER CYRILLIC SOFT SIGN + {0xA69E, 0xA69F, prCM, gcMn}, // [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E + {0xA6A0, 0xA6E5, prAL, gcLo}, // [70] BAMUM LETTER A..BAMUM LETTER KI + {0xA6E6, 0xA6EF, prAL, gcNl}, // [10] BAMUM LETTER MO..BAMUM LETTER KOGHOM + {0xA6F0, 0xA6F1, prCM, gcMn}, // [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS + {0xA6F2, 0xA6F2, prAL, gcPo}, // BAMUM NJAEMLI + {0xA6F3, 0xA6F7, prBA, gcPo}, // [5] BAMUM FULL STOP..BAMUM QUESTION MARK + {0xA700, 0xA716, prAL, gcSk}, // [23] MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR + {0xA717, 0xA71F, prAL, gcLm}, // [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK + {0xA720, 0xA721, prAL, gcSk}, // [2] MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE + {0xA722, 0xA76F, prAL, gcLC}, // [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON + {0xA770, 0xA770, prAL, gcLm}, // MODIFIER LETTER US + {0xA771, 0xA787, prAL, gcLC}, // [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T + {0xA788, 0xA788, prAL, gcLm}, // MODIFIER LETTER LOW CIRCUMFLEX ACCENT + {0xA789, 0xA78A, prAL, gcSk}, // [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN + {0xA78B, 0xA78E, prAL, gcLC}, // [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT + {0xA78F, 0xA78F, prAL, gcLo}, // LATIN LETTER SINOLOGICAL DOT + {0xA790, 0xA7CA, prAL, gcLC}, // [59] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY + {0xA7D0, 0xA7D1, prAL, gcLC}, // [2] LATIN CAPITAL LETTER CLOSED INSULAR G..LATIN SMALL LETTER CLOSED INSULAR G + {0xA7D3, 0xA7D3, prAL, gcLl}, // LATIN SMALL LETTER DOUBLE THORN + {0xA7D5, 0xA7D9, prAL, gcLC}, // [5] LATIN SMALL LETTER DOUBLE WYNN..LATIN SMALL LETTER SIGMOID S + {0xA7F2, 0xA7F4, prAL, gcLm}, // [3] MODIFIER LETTER CAPITAL C..MODIFIER LETTER CAPITAL Q + {0xA7F5, 0xA7F6, prAL, gcLC}, // [2] LATIN CAPITAL LETTER REVERSED HALF H..LATIN SMALL LETTER REVERSED HALF H + {0xA7F7, 0xA7F7, prAL, gcLo}, // LATIN EPIGRAPHIC LETTER SIDEWAYS I + {0xA7F8, 0xA7F9, prAL, gcLm}, // [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE + {0xA7FA, 0xA7FA, prAL, gcLl}, // LATIN LETTER SMALL CAPITAL TURNED M + {0xA7FB, 0xA7FF, prAL, gcLo}, // [5] LATIN EPIGRAPHIC LETTER REVERSED F..LATIN EPIGRAPHIC LETTER ARCHAIC M + {0xA800, 0xA801, prAL, gcLo}, // [2] SYLOTI NAGRI LETTER A..SYLOTI NAGRI LETTER I + {0xA802, 0xA802, prCM, gcMn}, // SYLOTI NAGRI SIGN DVISVARA + {0xA803, 0xA805, prAL, gcLo}, // [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O + {0xA806, 0xA806, prCM, gcMn}, // SYLOTI NAGRI SIGN HASANTA + {0xA807, 0xA80A, prAL, gcLo}, // [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO + {0xA80B, 0xA80B, prCM, gcMn}, // SYLOTI NAGRI SIGN ANUSVARA + {0xA80C, 0xA822, prAL, gcLo}, // [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO + {0xA823, 0xA824, prCM, gcMc}, // [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I + {0xA825, 0xA826, prCM, gcMn}, // [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E + {0xA827, 0xA827, prCM, gcMc}, // SYLOTI NAGRI VOWEL SIGN OO + {0xA828, 0xA82B, prAL, gcSo}, // [4] SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI POETRY MARK-4 + {0xA82C, 0xA82C, prCM, gcMn}, // SYLOTI NAGRI SIGN ALTERNATE HASANTA + {0xA830, 0xA835, prAL, gcNo}, // [6] NORTH INDIC FRACTION ONE QUARTER..NORTH INDIC FRACTION THREE SIXTEENTHS + {0xA836, 0xA837, prAL, gcSo}, // [2] NORTH INDIC QUARTER MARK..NORTH INDIC PLACEHOLDER MARK + {0xA838, 0xA838, prPO, gcSc}, // NORTH INDIC RUPEE MARK + {0xA839, 0xA839, prAL, gcSo}, // NORTH INDIC QUANTITY MARK + {0xA840, 0xA873, prAL, gcLo}, // [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU + {0xA874, 0xA875, prBB, gcPo}, // [2] PHAGS-PA SINGLE HEAD MARK..PHAGS-PA DOUBLE HEAD MARK + {0xA876, 0xA877, prEX, gcPo}, // [2] PHAGS-PA MARK SHAD..PHAGS-PA MARK DOUBLE SHAD + {0xA880, 0xA881, prCM, gcMc}, // [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA + {0xA882, 0xA8B3, prAL, gcLo}, // [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA + {0xA8B4, 0xA8C3, prCM, gcMc}, // [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU + {0xA8C4, 0xA8C5, prCM, gcMn}, // [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU + {0xA8CE, 0xA8CF, prBA, gcPo}, // [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA + {0xA8D0, 0xA8D9, prNU, gcNd}, // [10] SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE + {0xA8E0, 0xA8F1, prCM, gcMn}, // [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA + {0xA8F2, 0xA8F7, prAL, gcLo}, // [6] DEVANAGARI SIGN SPACING CANDRABINDU..DEVANAGARI SIGN CANDRABINDU AVAGRAHA + {0xA8F8, 0xA8FA, prAL, gcPo}, // [3] DEVANAGARI SIGN PUSHPIKA..DEVANAGARI CARET + {0xA8FB, 0xA8FB, prAL, gcLo}, // DEVANAGARI HEADSTROKE + {0xA8FC, 0xA8FC, prBB, gcPo}, // DEVANAGARI SIGN SIDDHAM + {0xA8FD, 0xA8FE, prAL, gcLo}, // [2] DEVANAGARI JAIN OM..DEVANAGARI LETTER AY + {0xA8FF, 0xA8FF, prCM, gcMn}, // DEVANAGARI VOWEL SIGN AY + {0xA900, 0xA909, prNU, gcNd}, // [10] KAYAH LI DIGIT ZERO..KAYAH LI DIGIT NINE + {0xA90A, 0xA925, prAL, gcLo}, // [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO + {0xA926, 0xA92D, prCM, gcMn}, // [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU + {0xA92E, 0xA92F, prBA, gcPo}, // [2] KAYAH LI SIGN CWI..KAYAH LI SIGN SHYA + {0xA930, 0xA946, prAL, gcLo}, // [23] REJANG LETTER KA..REJANG LETTER A + {0xA947, 0xA951, prCM, gcMn}, // [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R + {0xA952, 0xA953, prCM, gcMc}, // [2] REJANG CONSONANT SIGN H..REJANG VIRAMA + {0xA95F, 0xA95F, prAL, gcPo}, // REJANG SECTION MARK + {0xA960, 0xA97C, prJL, gcLo}, // [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH + {0xA980, 0xA982, prCM, gcMn}, // [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR + {0xA983, 0xA983, prCM, gcMc}, // JAVANESE SIGN WIGNYAN + {0xA984, 0xA9B2, prAL, gcLo}, // [47] JAVANESE LETTER A..JAVANESE LETTER HA + {0xA9B3, 0xA9B3, prCM, gcMn}, // JAVANESE SIGN CECAK TELU + {0xA9B4, 0xA9B5, prCM, gcMc}, // [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG + {0xA9B6, 0xA9B9, prCM, gcMn}, // [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT + {0xA9BA, 0xA9BB, prCM, gcMc}, // [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE + {0xA9BC, 0xA9BD, prCM, gcMn}, // [2] JAVANESE VOWEL SIGN PEPET..JAVANESE CONSONANT SIGN KERET + {0xA9BE, 0xA9C0, prCM, gcMc}, // [3] JAVANESE CONSONANT SIGN PENGKAL..JAVANESE PANGKON + {0xA9C1, 0xA9C6, prAL, gcPo}, // [6] JAVANESE LEFT RERENGGAN..JAVANESE PADA WINDU + {0xA9C7, 0xA9C9, prBA, gcPo}, // [3] JAVANESE PADA PANGKAT..JAVANESE PADA LUNGSI + {0xA9CA, 0xA9CD, prAL, gcPo}, // [4] JAVANESE PADA ADEG..JAVANESE TURNED PADA PISELEH + {0xA9CF, 0xA9CF, prAL, gcLm}, // JAVANESE PANGRANGKEP + {0xA9D0, 0xA9D9, prNU, gcNd}, // [10] JAVANESE DIGIT ZERO..JAVANESE DIGIT NINE + {0xA9DE, 0xA9DF, prAL, gcPo}, // [2] JAVANESE PADA TIRTA TUMETES..JAVANESE PADA ISEN-ISEN + {0xA9E0, 0xA9E4, prSA, gcLo}, // [5] MYANMAR LETTER SHAN GHA..MYANMAR LETTER SHAN BHA + {0xA9E5, 0xA9E5, prSA, gcMn}, // MYANMAR SIGN SHAN SAW + {0xA9E6, 0xA9E6, prSA, gcLm}, // MYANMAR MODIFIER LETTER SHAN REDUPLICATION + {0xA9E7, 0xA9EF, prSA, gcLo}, // [9] MYANMAR LETTER TAI LAING NYA..MYANMAR LETTER TAI LAING NNA + {0xA9F0, 0xA9F9, prNU, gcNd}, // [10] MYANMAR TAI LAING DIGIT ZERO..MYANMAR TAI LAING DIGIT NINE + {0xA9FA, 0xA9FE, prSA, gcLo}, // [5] MYANMAR LETTER TAI LAING LLA..MYANMAR LETTER TAI LAING BHA + {0xAA00, 0xAA28, prAL, gcLo}, // [41] CHAM LETTER A..CHAM LETTER HA + {0xAA29, 0xAA2E, prCM, gcMn}, // [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE + {0xAA2F, 0xAA30, prCM, gcMc}, // [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI + {0xAA31, 0xAA32, prCM, gcMn}, // [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE + {0xAA33, 0xAA34, prCM, gcMc}, // [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA + {0xAA35, 0xAA36, prCM, gcMn}, // [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA + {0xAA40, 0xAA42, prAL, gcLo}, // [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG + {0xAA43, 0xAA43, prCM, gcMn}, // CHAM CONSONANT SIGN FINAL NG + {0xAA44, 0xAA4B, prAL, gcLo}, // [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS + {0xAA4C, 0xAA4C, prCM, gcMn}, // CHAM CONSONANT SIGN FINAL M + {0xAA4D, 0xAA4D, prCM, gcMc}, // CHAM CONSONANT SIGN FINAL H + {0xAA50, 0xAA59, prNU, gcNd}, // [10] CHAM DIGIT ZERO..CHAM DIGIT NINE + {0xAA5C, 0xAA5C, prAL, gcPo}, // CHAM PUNCTUATION SPIRAL + {0xAA5D, 0xAA5F, prBA, gcPo}, // [3] CHAM PUNCTUATION DANDA..CHAM PUNCTUATION TRIPLE DANDA + {0xAA60, 0xAA6F, prSA, gcLo}, // [16] MYANMAR LETTER KHAMTI GA..MYANMAR LETTER KHAMTI FA + {0xAA70, 0xAA70, prSA, gcLm}, // MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION + {0xAA71, 0xAA76, prSA, gcLo}, // [6] MYANMAR LETTER KHAMTI XA..MYANMAR LOGOGRAM KHAMTI HM + {0xAA77, 0xAA79, prSA, gcSo}, // [3] MYANMAR SYMBOL AITON EXCLAMATION..MYANMAR SYMBOL AITON TWO + {0xAA7A, 0xAA7A, prSA, gcLo}, // MYANMAR LETTER AITON RA + {0xAA7B, 0xAA7B, prSA, gcMc}, // MYANMAR SIGN PAO KAREN TONE + {0xAA7C, 0xAA7C, prSA, gcMn}, // MYANMAR SIGN TAI LAING TONE-2 + {0xAA7D, 0xAA7D, prSA, gcMc}, // MYANMAR SIGN TAI LAING TONE-5 + {0xAA7E, 0xAA7F, prSA, gcLo}, // [2] MYANMAR LETTER SHWE PALAUNG CHA..MYANMAR LETTER SHWE PALAUNG SHA + {0xAA80, 0xAAAF, prSA, gcLo}, // [48] TAI VIET LETTER LOW KO..TAI VIET LETTER HIGH O + {0xAAB0, 0xAAB0, prSA, gcMn}, // TAI VIET MAI KANG + {0xAAB1, 0xAAB1, prSA, gcLo}, // TAI VIET VOWEL AA + {0xAAB2, 0xAAB4, prSA, gcMn}, // [3] TAI VIET VOWEL I..TAI VIET VOWEL U + {0xAAB5, 0xAAB6, prSA, gcLo}, // [2] TAI VIET VOWEL E..TAI VIET VOWEL O + {0xAAB7, 0xAAB8, prSA, gcMn}, // [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA + {0xAAB9, 0xAABD, prSA, gcLo}, // [5] TAI VIET VOWEL UEA..TAI VIET VOWEL AN + {0xAABE, 0xAABF, prSA, gcMn}, // [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK + {0xAAC0, 0xAAC0, prSA, gcLo}, // TAI VIET TONE MAI NUENG + {0xAAC1, 0xAAC1, prSA, gcMn}, // TAI VIET TONE MAI THO + {0xAAC2, 0xAAC2, prSA, gcLo}, // TAI VIET TONE MAI SONG + {0xAADB, 0xAADC, prSA, gcLo}, // [2] TAI VIET SYMBOL KON..TAI VIET SYMBOL NUENG + {0xAADD, 0xAADD, prSA, gcLm}, // TAI VIET SYMBOL SAM + {0xAADE, 0xAADF, prSA, gcPo}, // [2] TAI VIET SYMBOL HO HOI..TAI VIET SYMBOL KOI KOI + {0xAAE0, 0xAAEA, prAL, gcLo}, // [11] MEETEI MAYEK LETTER E..MEETEI MAYEK LETTER SSA + {0xAAEB, 0xAAEB, prCM, gcMc}, // MEETEI MAYEK VOWEL SIGN II + {0xAAEC, 0xAAED, prCM, gcMn}, // [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI + {0xAAEE, 0xAAEF, prCM, gcMc}, // [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU + {0xAAF0, 0xAAF1, prBA, gcPo}, // [2] MEETEI MAYEK CHEIKHAN..MEETEI MAYEK AHANG KHUDAM + {0xAAF2, 0xAAF2, prAL, gcLo}, // MEETEI MAYEK ANJI + {0xAAF3, 0xAAF4, prAL, gcLm}, // [2] MEETEI MAYEK SYLLABLE REPETITION MARK..MEETEI MAYEK WORD REPETITION MARK + {0xAAF5, 0xAAF5, prCM, gcMc}, // MEETEI MAYEK VOWEL SIGN VISARGA + {0xAAF6, 0xAAF6, prCM, gcMn}, // MEETEI MAYEK VIRAMA + {0xAB01, 0xAB06, prAL, gcLo}, // [6] ETHIOPIC SYLLABLE TTHU..ETHIOPIC SYLLABLE TTHO + {0xAB09, 0xAB0E, prAL, gcLo}, // [6] ETHIOPIC SYLLABLE DDHU..ETHIOPIC SYLLABLE DDHO + {0xAB11, 0xAB16, prAL, gcLo}, // [6] ETHIOPIC SYLLABLE DZU..ETHIOPIC SYLLABLE DZO + {0xAB20, 0xAB26, prAL, gcLo}, // [7] ETHIOPIC SYLLABLE CCHHA..ETHIOPIC SYLLABLE CCHHO + {0xAB28, 0xAB2E, prAL, gcLo}, // [7] ETHIOPIC SYLLABLE BBA..ETHIOPIC SYLLABLE BBO + {0xAB30, 0xAB5A, prAL, gcLl}, // [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG + {0xAB5B, 0xAB5B, prAL, gcSk}, // MODIFIER BREVE WITH INVERTED BREVE + {0xAB5C, 0xAB5F, prAL, gcLm}, // [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK + {0xAB60, 0xAB68, prAL, gcLl}, // [9] LATIN SMALL LETTER SAKHA YAT..LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE + {0xAB69, 0xAB69, prAL, gcLm}, // MODIFIER LETTER SMALL TURNED W + {0xAB6A, 0xAB6B, prAL, gcSk}, // [2] MODIFIER LETTER LEFT TACK..MODIFIER LETTER RIGHT TACK + {0xAB70, 0xABBF, prAL, gcLl}, // [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA + {0xABC0, 0xABE2, prAL, gcLo}, // [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM + {0xABE3, 0xABE4, prCM, gcMc}, // [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP + {0xABE5, 0xABE5, prCM, gcMn}, // MEETEI MAYEK VOWEL SIGN ANAP + {0xABE6, 0xABE7, prCM, gcMc}, // [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP + {0xABE8, 0xABE8, prCM, gcMn}, // MEETEI MAYEK VOWEL SIGN UNAP + {0xABE9, 0xABEA, prCM, gcMc}, // [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG + {0xABEB, 0xABEB, prBA, gcPo}, // MEETEI MAYEK CHEIKHEI + {0xABEC, 0xABEC, prCM, gcMc}, // MEETEI MAYEK LUM IYEK + {0xABED, 0xABED, prCM, gcMn}, // MEETEI MAYEK APUN IYEK + {0xABF0, 0xABF9, prNU, gcNd}, // [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT NINE + {0xAC00, 0xAC00, prH2, gcLo}, // HANGUL SYLLABLE GA + {0xAC01, 0xAC1B, prH3, gcLo}, // [27] HANGUL SYLLABLE GAG..HANGUL SYLLABLE GAH + {0xAC1C, 0xAC1C, prH2, gcLo}, // HANGUL SYLLABLE GAE + {0xAC1D, 0xAC37, prH3, gcLo}, // [27] HANGUL SYLLABLE GAEG..HANGUL SYLLABLE GAEH + {0xAC38, 0xAC38, prH2, gcLo}, // HANGUL SYLLABLE GYA + {0xAC39, 0xAC53, prH3, gcLo}, // [27] HANGUL SYLLABLE GYAG..HANGUL SYLLABLE GYAH + {0xAC54, 0xAC54, prH2, gcLo}, // HANGUL SYLLABLE GYAE + {0xAC55, 0xAC6F, prH3, gcLo}, // [27] HANGUL SYLLABLE GYAEG..HANGUL SYLLABLE GYAEH + {0xAC70, 0xAC70, prH2, gcLo}, // HANGUL SYLLABLE GEO + {0xAC71, 0xAC8B, prH3, gcLo}, // [27] HANGUL SYLLABLE GEOG..HANGUL SYLLABLE GEOH + {0xAC8C, 0xAC8C, prH2, gcLo}, // HANGUL SYLLABLE GE + {0xAC8D, 0xACA7, prH3, gcLo}, // [27] HANGUL SYLLABLE GEG..HANGUL SYLLABLE GEH + {0xACA8, 0xACA8, prH2, gcLo}, // HANGUL SYLLABLE GYEO + {0xACA9, 0xACC3, prH3, gcLo}, // [27] HANGUL SYLLABLE GYEOG..HANGUL SYLLABLE GYEOH + {0xACC4, 0xACC4, prH2, gcLo}, // HANGUL SYLLABLE GYE + {0xACC5, 0xACDF, prH3, gcLo}, // [27] HANGUL SYLLABLE GYEG..HANGUL SYLLABLE GYEH + {0xACE0, 0xACE0, prH2, gcLo}, // HANGUL SYLLABLE GO + {0xACE1, 0xACFB, prH3, gcLo}, // [27] HANGUL SYLLABLE GOG..HANGUL SYLLABLE GOH + {0xACFC, 0xACFC, prH2, gcLo}, // HANGUL SYLLABLE GWA + {0xACFD, 0xAD17, prH3, gcLo}, // [27] HANGUL SYLLABLE GWAG..HANGUL SYLLABLE GWAH + {0xAD18, 0xAD18, prH2, gcLo}, // HANGUL SYLLABLE GWAE + {0xAD19, 0xAD33, prH3, gcLo}, // [27] HANGUL SYLLABLE GWAEG..HANGUL SYLLABLE GWAEH + {0xAD34, 0xAD34, prH2, gcLo}, // HANGUL SYLLABLE GOE + {0xAD35, 0xAD4F, prH3, gcLo}, // [27] HANGUL SYLLABLE GOEG..HANGUL SYLLABLE GOEH + {0xAD50, 0xAD50, prH2, gcLo}, // HANGUL SYLLABLE GYO + {0xAD51, 0xAD6B, prH3, gcLo}, // [27] HANGUL SYLLABLE GYOG..HANGUL SYLLABLE GYOH + {0xAD6C, 0xAD6C, prH2, gcLo}, // HANGUL SYLLABLE GU + {0xAD6D, 0xAD87, prH3, gcLo}, // [27] HANGUL SYLLABLE GUG..HANGUL SYLLABLE GUH + {0xAD88, 0xAD88, prH2, gcLo}, // HANGUL SYLLABLE GWEO + {0xAD89, 0xADA3, prH3, gcLo}, // [27] HANGUL SYLLABLE GWEOG..HANGUL SYLLABLE GWEOH + {0xADA4, 0xADA4, prH2, gcLo}, // HANGUL SYLLABLE GWE + {0xADA5, 0xADBF, prH3, gcLo}, // [27] HANGUL SYLLABLE GWEG..HANGUL SYLLABLE GWEH + {0xADC0, 0xADC0, prH2, gcLo}, // HANGUL SYLLABLE GWI + {0xADC1, 0xADDB, prH3, gcLo}, // [27] HANGUL SYLLABLE GWIG..HANGUL SYLLABLE GWIH + {0xADDC, 0xADDC, prH2, gcLo}, // HANGUL SYLLABLE GYU + {0xADDD, 0xADF7, prH3, gcLo}, // [27] HANGUL SYLLABLE GYUG..HANGUL SYLLABLE GYUH + {0xADF8, 0xADF8, prH2, gcLo}, // HANGUL SYLLABLE GEU + {0xADF9, 0xAE13, prH3, gcLo}, // [27] HANGUL SYLLABLE GEUG..HANGUL SYLLABLE GEUH + {0xAE14, 0xAE14, prH2, gcLo}, // HANGUL SYLLABLE GYI + {0xAE15, 0xAE2F, prH3, gcLo}, // [27] HANGUL SYLLABLE GYIG..HANGUL SYLLABLE GYIH + {0xAE30, 0xAE30, prH2, gcLo}, // HANGUL SYLLABLE GI + {0xAE31, 0xAE4B, prH3, gcLo}, // [27] HANGUL SYLLABLE GIG..HANGUL SYLLABLE GIH + {0xAE4C, 0xAE4C, prH2, gcLo}, // HANGUL SYLLABLE GGA + {0xAE4D, 0xAE67, prH3, gcLo}, // [27] HANGUL SYLLABLE GGAG..HANGUL SYLLABLE GGAH + {0xAE68, 0xAE68, prH2, gcLo}, // HANGUL SYLLABLE GGAE + {0xAE69, 0xAE83, prH3, gcLo}, // [27] HANGUL SYLLABLE GGAEG..HANGUL SYLLABLE GGAEH + {0xAE84, 0xAE84, prH2, gcLo}, // HANGUL SYLLABLE GGYA + {0xAE85, 0xAE9F, prH3, gcLo}, // [27] HANGUL SYLLABLE GGYAG..HANGUL SYLLABLE GGYAH + {0xAEA0, 0xAEA0, prH2, gcLo}, // HANGUL SYLLABLE GGYAE + {0xAEA1, 0xAEBB, prH3, gcLo}, // [27] HANGUL SYLLABLE GGYAEG..HANGUL SYLLABLE GGYAEH + {0xAEBC, 0xAEBC, prH2, gcLo}, // HANGUL SYLLABLE GGEO + {0xAEBD, 0xAED7, prH3, gcLo}, // [27] HANGUL SYLLABLE GGEOG..HANGUL SYLLABLE GGEOH + {0xAED8, 0xAED8, prH2, gcLo}, // HANGUL SYLLABLE GGE + {0xAED9, 0xAEF3, prH3, gcLo}, // [27] HANGUL SYLLABLE GGEG..HANGUL SYLLABLE GGEH + {0xAEF4, 0xAEF4, prH2, gcLo}, // HANGUL SYLLABLE GGYEO + {0xAEF5, 0xAF0F, prH3, gcLo}, // [27] HANGUL SYLLABLE GGYEOG..HANGUL SYLLABLE GGYEOH + {0xAF10, 0xAF10, prH2, gcLo}, // HANGUL SYLLABLE GGYE + {0xAF11, 0xAF2B, prH3, gcLo}, // [27] HANGUL SYLLABLE GGYEG..HANGUL SYLLABLE GGYEH + {0xAF2C, 0xAF2C, prH2, gcLo}, // HANGUL SYLLABLE GGO + {0xAF2D, 0xAF47, prH3, gcLo}, // [27] HANGUL SYLLABLE GGOG..HANGUL SYLLABLE GGOH + {0xAF48, 0xAF48, prH2, gcLo}, // HANGUL SYLLABLE GGWA + {0xAF49, 0xAF63, prH3, gcLo}, // [27] HANGUL SYLLABLE GGWAG..HANGUL SYLLABLE GGWAH + {0xAF64, 0xAF64, prH2, gcLo}, // HANGUL SYLLABLE GGWAE + {0xAF65, 0xAF7F, prH3, gcLo}, // [27] HANGUL SYLLABLE GGWAEG..HANGUL SYLLABLE GGWAEH + {0xAF80, 0xAF80, prH2, gcLo}, // HANGUL SYLLABLE GGOE + {0xAF81, 0xAF9B, prH3, gcLo}, // [27] HANGUL SYLLABLE GGOEG..HANGUL SYLLABLE GGOEH + {0xAF9C, 0xAF9C, prH2, gcLo}, // HANGUL SYLLABLE GGYO + {0xAF9D, 0xAFB7, prH3, gcLo}, // [27] HANGUL SYLLABLE GGYOG..HANGUL SYLLABLE GGYOH + {0xAFB8, 0xAFB8, prH2, gcLo}, // HANGUL SYLLABLE GGU + {0xAFB9, 0xAFD3, prH3, gcLo}, // [27] HANGUL SYLLABLE GGUG..HANGUL SYLLABLE GGUH + {0xAFD4, 0xAFD4, prH2, gcLo}, // HANGUL SYLLABLE GGWEO + {0xAFD5, 0xAFEF, prH3, gcLo}, // [27] HANGUL SYLLABLE GGWEOG..HANGUL SYLLABLE GGWEOH + {0xAFF0, 0xAFF0, prH2, gcLo}, // HANGUL SYLLABLE GGWE + {0xAFF1, 0xB00B, prH3, gcLo}, // [27] HANGUL SYLLABLE GGWEG..HANGUL SYLLABLE GGWEH + {0xB00C, 0xB00C, prH2, gcLo}, // HANGUL SYLLABLE GGWI + {0xB00D, 0xB027, prH3, gcLo}, // [27] HANGUL SYLLABLE GGWIG..HANGUL SYLLABLE GGWIH + {0xB028, 0xB028, prH2, gcLo}, // HANGUL SYLLABLE GGYU + {0xB029, 0xB043, prH3, gcLo}, // [27] HANGUL SYLLABLE GGYUG..HANGUL SYLLABLE GGYUH + {0xB044, 0xB044, prH2, gcLo}, // HANGUL SYLLABLE GGEU + {0xB045, 0xB05F, prH3, gcLo}, // [27] HANGUL SYLLABLE GGEUG..HANGUL SYLLABLE GGEUH + {0xB060, 0xB060, prH2, gcLo}, // HANGUL SYLLABLE GGYI + {0xB061, 0xB07B, prH3, gcLo}, // [27] HANGUL SYLLABLE GGYIG..HANGUL SYLLABLE GGYIH + {0xB07C, 0xB07C, prH2, gcLo}, // HANGUL SYLLABLE GGI + {0xB07D, 0xB097, prH3, gcLo}, // [27] HANGUL SYLLABLE GGIG..HANGUL SYLLABLE GGIH + {0xB098, 0xB098, prH2, gcLo}, // HANGUL SYLLABLE NA + {0xB099, 0xB0B3, prH3, gcLo}, // [27] HANGUL SYLLABLE NAG..HANGUL SYLLABLE NAH + {0xB0B4, 0xB0B4, prH2, gcLo}, // HANGUL SYLLABLE NAE + {0xB0B5, 0xB0CF, prH3, gcLo}, // [27] HANGUL SYLLABLE NAEG..HANGUL SYLLABLE NAEH + {0xB0D0, 0xB0D0, prH2, gcLo}, // HANGUL SYLLABLE NYA + {0xB0D1, 0xB0EB, prH3, gcLo}, // [27] HANGUL SYLLABLE NYAG..HANGUL SYLLABLE NYAH + {0xB0EC, 0xB0EC, prH2, gcLo}, // HANGUL SYLLABLE NYAE + {0xB0ED, 0xB107, prH3, gcLo}, // [27] HANGUL SYLLABLE NYAEG..HANGUL SYLLABLE NYAEH + {0xB108, 0xB108, prH2, gcLo}, // HANGUL SYLLABLE NEO + {0xB109, 0xB123, prH3, gcLo}, // [27] HANGUL SYLLABLE NEOG..HANGUL SYLLABLE NEOH + {0xB124, 0xB124, prH2, gcLo}, // HANGUL SYLLABLE NE + {0xB125, 0xB13F, prH3, gcLo}, // [27] HANGUL SYLLABLE NEG..HANGUL SYLLABLE NEH + {0xB140, 0xB140, prH2, gcLo}, // HANGUL SYLLABLE NYEO + {0xB141, 0xB15B, prH3, gcLo}, // [27] HANGUL SYLLABLE NYEOG..HANGUL SYLLABLE NYEOH + {0xB15C, 0xB15C, prH2, gcLo}, // HANGUL SYLLABLE NYE + {0xB15D, 0xB177, prH3, gcLo}, // [27] HANGUL SYLLABLE NYEG..HANGUL SYLLABLE NYEH + {0xB178, 0xB178, prH2, gcLo}, // HANGUL SYLLABLE NO + {0xB179, 0xB193, prH3, gcLo}, // [27] HANGUL SYLLABLE NOG..HANGUL SYLLABLE NOH + {0xB194, 0xB194, prH2, gcLo}, // HANGUL SYLLABLE NWA + {0xB195, 0xB1AF, prH3, gcLo}, // [27] HANGUL SYLLABLE NWAG..HANGUL SYLLABLE NWAH + {0xB1B0, 0xB1B0, prH2, gcLo}, // HANGUL SYLLABLE NWAE + {0xB1B1, 0xB1CB, prH3, gcLo}, // [27] HANGUL SYLLABLE NWAEG..HANGUL SYLLABLE NWAEH + {0xB1CC, 0xB1CC, prH2, gcLo}, // HANGUL SYLLABLE NOE + {0xB1CD, 0xB1E7, prH3, gcLo}, // [27] HANGUL SYLLABLE NOEG..HANGUL SYLLABLE NOEH + {0xB1E8, 0xB1E8, prH2, gcLo}, // HANGUL SYLLABLE NYO + {0xB1E9, 0xB203, prH3, gcLo}, // [27] HANGUL SYLLABLE NYOG..HANGUL SYLLABLE NYOH + {0xB204, 0xB204, prH2, gcLo}, // HANGUL SYLLABLE NU + {0xB205, 0xB21F, prH3, gcLo}, // [27] HANGUL SYLLABLE NUG..HANGUL SYLLABLE NUH + {0xB220, 0xB220, prH2, gcLo}, // HANGUL SYLLABLE NWEO + {0xB221, 0xB23B, prH3, gcLo}, // [27] HANGUL SYLLABLE NWEOG..HANGUL SYLLABLE NWEOH + {0xB23C, 0xB23C, prH2, gcLo}, // HANGUL SYLLABLE NWE + {0xB23D, 0xB257, prH3, gcLo}, // [27] HANGUL SYLLABLE NWEG..HANGUL SYLLABLE NWEH + {0xB258, 0xB258, prH2, gcLo}, // HANGUL SYLLABLE NWI + {0xB259, 0xB273, prH3, gcLo}, // [27] HANGUL SYLLABLE NWIG..HANGUL SYLLABLE NWIH + {0xB274, 0xB274, prH2, gcLo}, // HANGUL SYLLABLE NYU + {0xB275, 0xB28F, prH3, gcLo}, // [27] HANGUL SYLLABLE NYUG..HANGUL SYLLABLE NYUH + {0xB290, 0xB290, prH2, gcLo}, // HANGUL SYLLABLE NEU + {0xB291, 0xB2AB, prH3, gcLo}, // [27] HANGUL SYLLABLE NEUG..HANGUL SYLLABLE NEUH + {0xB2AC, 0xB2AC, prH2, gcLo}, // HANGUL SYLLABLE NYI + {0xB2AD, 0xB2C7, prH3, gcLo}, // [27] HANGUL SYLLABLE NYIG..HANGUL SYLLABLE NYIH + {0xB2C8, 0xB2C8, prH2, gcLo}, // HANGUL SYLLABLE NI + {0xB2C9, 0xB2E3, prH3, gcLo}, // [27] HANGUL SYLLABLE NIG..HANGUL SYLLABLE NIH + {0xB2E4, 0xB2E4, prH2, gcLo}, // HANGUL SYLLABLE DA + {0xB2E5, 0xB2FF, prH3, gcLo}, // [27] HANGUL SYLLABLE DAG..HANGUL SYLLABLE DAH + {0xB300, 0xB300, prH2, gcLo}, // HANGUL SYLLABLE DAE + {0xB301, 0xB31B, prH3, gcLo}, // [27] HANGUL SYLLABLE DAEG..HANGUL SYLLABLE DAEH + {0xB31C, 0xB31C, prH2, gcLo}, // HANGUL SYLLABLE DYA + {0xB31D, 0xB337, prH3, gcLo}, // [27] HANGUL SYLLABLE DYAG..HANGUL SYLLABLE DYAH + {0xB338, 0xB338, prH2, gcLo}, // HANGUL SYLLABLE DYAE + {0xB339, 0xB353, prH3, gcLo}, // [27] HANGUL SYLLABLE DYAEG..HANGUL SYLLABLE DYAEH + {0xB354, 0xB354, prH2, gcLo}, // HANGUL SYLLABLE DEO + {0xB355, 0xB36F, prH3, gcLo}, // [27] HANGUL SYLLABLE DEOG..HANGUL SYLLABLE DEOH + {0xB370, 0xB370, prH2, gcLo}, // HANGUL SYLLABLE DE + {0xB371, 0xB38B, prH3, gcLo}, // [27] HANGUL SYLLABLE DEG..HANGUL SYLLABLE DEH + {0xB38C, 0xB38C, prH2, gcLo}, // HANGUL SYLLABLE DYEO + {0xB38D, 0xB3A7, prH3, gcLo}, // [27] HANGUL SYLLABLE DYEOG..HANGUL SYLLABLE DYEOH + {0xB3A8, 0xB3A8, prH2, gcLo}, // HANGUL SYLLABLE DYE + {0xB3A9, 0xB3C3, prH3, gcLo}, // [27] HANGUL SYLLABLE DYEG..HANGUL SYLLABLE DYEH + {0xB3C4, 0xB3C4, prH2, gcLo}, // HANGUL SYLLABLE DO + {0xB3C5, 0xB3DF, prH3, gcLo}, // [27] HANGUL SYLLABLE DOG..HANGUL SYLLABLE DOH + {0xB3E0, 0xB3E0, prH2, gcLo}, // HANGUL SYLLABLE DWA + {0xB3E1, 0xB3FB, prH3, gcLo}, // [27] HANGUL SYLLABLE DWAG..HANGUL SYLLABLE DWAH + {0xB3FC, 0xB3FC, prH2, gcLo}, // HANGUL SYLLABLE DWAE + {0xB3FD, 0xB417, prH3, gcLo}, // [27] HANGUL SYLLABLE DWAEG..HANGUL SYLLABLE DWAEH + {0xB418, 0xB418, prH2, gcLo}, // HANGUL SYLLABLE DOE + {0xB419, 0xB433, prH3, gcLo}, // [27] HANGUL SYLLABLE DOEG..HANGUL SYLLABLE DOEH + {0xB434, 0xB434, prH2, gcLo}, // HANGUL SYLLABLE DYO + {0xB435, 0xB44F, prH3, gcLo}, // [27] HANGUL SYLLABLE DYOG..HANGUL SYLLABLE DYOH + {0xB450, 0xB450, prH2, gcLo}, // HANGUL SYLLABLE DU + {0xB451, 0xB46B, prH3, gcLo}, // [27] HANGUL SYLLABLE DUG..HANGUL SYLLABLE DUH + {0xB46C, 0xB46C, prH2, gcLo}, // HANGUL SYLLABLE DWEO + {0xB46D, 0xB487, prH3, gcLo}, // [27] HANGUL SYLLABLE DWEOG..HANGUL SYLLABLE DWEOH + {0xB488, 0xB488, prH2, gcLo}, // HANGUL SYLLABLE DWE + {0xB489, 0xB4A3, prH3, gcLo}, // [27] HANGUL SYLLABLE DWEG..HANGUL SYLLABLE DWEH + {0xB4A4, 0xB4A4, prH2, gcLo}, // HANGUL SYLLABLE DWI + {0xB4A5, 0xB4BF, prH3, gcLo}, // [27] HANGUL SYLLABLE DWIG..HANGUL SYLLABLE DWIH + {0xB4C0, 0xB4C0, prH2, gcLo}, // HANGUL SYLLABLE DYU + {0xB4C1, 0xB4DB, prH3, gcLo}, // [27] HANGUL SYLLABLE DYUG..HANGUL SYLLABLE DYUH + {0xB4DC, 0xB4DC, prH2, gcLo}, // HANGUL SYLLABLE DEU + {0xB4DD, 0xB4F7, prH3, gcLo}, // [27] HANGUL SYLLABLE DEUG..HANGUL SYLLABLE DEUH + {0xB4F8, 0xB4F8, prH2, gcLo}, // HANGUL SYLLABLE DYI + {0xB4F9, 0xB513, prH3, gcLo}, // [27] HANGUL SYLLABLE DYIG..HANGUL SYLLABLE DYIH + {0xB514, 0xB514, prH2, gcLo}, // HANGUL SYLLABLE DI + {0xB515, 0xB52F, prH3, gcLo}, // [27] HANGUL SYLLABLE DIG..HANGUL SYLLABLE DIH + {0xB530, 0xB530, prH2, gcLo}, // HANGUL SYLLABLE DDA + {0xB531, 0xB54B, prH3, gcLo}, // [27] HANGUL SYLLABLE DDAG..HANGUL SYLLABLE DDAH + {0xB54C, 0xB54C, prH2, gcLo}, // HANGUL SYLLABLE DDAE + {0xB54D, 0xB567, prH3, gcLo}, // [27] HANGUL SYLLABLE DDAEG..HANGUL SYLLABLE DDAEH + {0xB568, 0xB568, prH2, gcLo}, // HANGUL SYLLABLE DDYA + {0xB569, 0xB583, prH3, gcLo}, // [27] HANGUL SYLLABLE DDYAG..HANGUL SYLLABLE DDYAH + {0xB584, 0xB584, prH2, gcLo}, // HANGUL SYLLABLE DDYAE + {0xB585, 0xB59F, prH3, gcLo}, // [27] HANGUL SYLLABLE DDYAEG..HANGUL SYLLABLE DDYAEH + {0xB5A0, 0xB5A0, prH2, gcLo}, // HANGUL SYLLABLE DDEO + {0xB5A1, 0xB5BB, prH3, gcLo}, // [27] HANGUL SYLLABLE DDEOG..HANGUL SYLLABLE DDEOH + {0xB5BC, 0xB5BC, prH2, gcLo}, // HANGUL SYLLABLE DDE + {0xB5BD, 0xB5D7, prH3, gcLo}, // [27] HANGUL SYLLABLE DDEG..HANGUL SYLLABLE DDEH + {0xB5D8, 0xB5D8, prH2, gcLo}, // HANGUL SYLLABLE DDYEO + {0xB5D9, 0xB5F3, prH3, gcLo}, // [27] HANGUL SYLLABLE DDYEOG..HANGUL SYLLABLE DDYEOH + {0xB5F4, 0xB5F4, prH2, gcLo}, // HANGUL SYLLABLE DDYE + {0xB5F5, 0xB60F, prH3, gcLo}, // [27] HANGUL SYLLABLE DDYEG..HANGUL SYLLABLE DDYEH + {0xB610, 0xB610, prH2, gcLo}, // HANGUL SYLLABLE DDO + {0xB611, 0xB62B, prH3, gcLo}, // [27] HANGUL SYLLABLE DDOG..HANGUL SYLLABLE DDOH + {0xB62C, 0xB62C, prH2, gcLo}, // HANGUL SYLLABLE DDWA + {0xB62D, 0xB647, prH3, gcLo}, // [27] HANGUL SYLLABLE DDWAG..HANGUL SYLLABLE DDWAH + {0xB648, 0xB648, prH2, gcLo}, // HANGUL SYLLABLE DDWAE + {0xB649, 0xB663, prH3, gcLo}, // [27] HANGUL SYLLABLE DDWAEG..HANGUL SYLLABLE DDWAEH + {0xB664, 0xB664, prH2, gcLo}, // HANGUL SYLLABLE DDOE + {0xB665, 0xB67F, prH3, gcLo}, // [27] HANGUL SYLLABLE DDOEG..HANGUL SYLLABLE DDOEH + {0xB680, 0xB680, prH2, gcLo}, // HANGUL SYLLABLE DDYO + {0xB681, 0xB69B, prH3, gcLo}, // [27] HANGUL SYLLABLE DDYOG..HANGUL SYLLABLE DDYOH + {0xB69C, 0xB69C, prH2, gcLo}, // HANGUL SYLLABLE DDU + {0xB69D, 0xB6B7, prH3, gcLo}, // [27] HANGUL SYLLABLE DDUG..HANGUL SYLLABLE DDUH + {0xB6B8, 0xB6B8, prH2, gcLo}, // HANGUL SYLLABLE DDWEO + {0xB6B9, 0xB6D3, prH3, gcLo}, // [27] HANGUL SYLLABLE DDWEOG..HANGUL SYLLABLE DDWEOH + {0xB6D4, 0xB6D4, prH2, gcLo}, // HANGUL SYLLABLE DDWE + {0xB6D5, 0xB6EF, prH3, gcLo}, // [27] HANGUL SYLLABLE DDWEG..HANGUL SYLLABLE DDWEH + {0xB6F0, 0xB6F0, prH2, gcLo}, // HANGUL SYLLABLE DDWI + {0xB6F1, 0xB70B, prH3, gcLo}, // [27] HANGUL SYLLABLE DDWIG..HANGUL SYLLABLE DDWIH + {0xB70C, 0xB70C, prH2, gcLo}, // HANGUL SYLLABLE DDYU + {0xB70D, 0xB727, prH3, gcLo}, // [27] HANGUL SYLLABLE DDYUG..HANGUL SYLLABLE DDYUH + {0xB728, 0xB728, prH2, gcLo}, // HANGUL SYLLABLE DDEU + {0xB729, 0xB743, prH3, gcLo}, // [27] HANGUL SYLLABLE DDEUG..HANGUL SYLLABLE DDEUH + {0xB744, 0xB744, prH2, gcLo}, // HANGUL SYLLABLE DDYI + {0xB745, 0xB75F, prH3, gcLo}, // [27] HANGUL SYLLABLE DDYIG..HANGUL SYLLABLE DDYIH + {0xB760, 0xB760, prH2, gcLo}, // HANGUL SYLLABLE DDI + {0xB761, 0xB77B, prH3, gcLo}, // [27] HANGUL SYLLABLE DDIG..HANGUL SYLLABLE DDIH + {0xB77C, 0xB77C, prH2, gcLo}, // HANGUL SYLLABLE RA + {0xB77D, 0xB797, prH3, gcLo}, // [27] HANGUL SYLLABLE RAG..HANGUL SYLLABLE RAH + {0xB798, 0xB798, prH2, gcLo}, // HANGUL SYLLABLE RAE + {0xB799, 0xB7B3, prH3, gcLo}, // [27] HANGUL SYLLABLE RAEG..HANGUL SYLLABLE RAEH + {0xB7B4, 0xB7B4, prH2, gcLo}, // HANGUL SYLLABLE RYA + {0xB7B5, 0xB7CF, prH3, gcLo}, // [27] HANGUL SYLLABLE RYAG..HANGUL SYLLABLE RYAH + {0xB7D0, 0xB7D0, prH2, gcLo}, // HANGUL SYLLABLE RYAE + {0xB7D1, 0xB7EB, prH3, gcLo}, // [27] HANGUL SYLLABLE RYAEG..HANGUL SYLLABLE RYAEH + {0xB7EC, 0xB7EC, prH2, gcLo}, // HANGUL SYLLABLE REO + {0xB7ED, 0xB807, prH3, gcLo}, // [27] HANGUL SYLLABLE REOG..HANGUL SYLLABLE REOH + {0xB808, 0xB808, prH2, gcLo}, // HANGUL SYLLABLE RE + {0xB809, 0xB823, prH3, gcLo}, // [27] HANGUL SYLLABLE REG..HANGUL SYLLABLE REH + {0xB824, 0xB824, prH2, gcLo}, // HANGUL SYLLABLE RYEO + {0xB825, 0xB83F, prH3, gcLo}, // [27] HANGUL SYLLABLE RYEOG..HANGUL SYLLABLE RYEOH + {0xB840, 0xB840, prH2, gcLo}, // HANGUL SYLLABLE RYE + {0xB841, 0xB85B, prH3, gcLo}, // [27] HANGUL SYLLABLE RYEG..HANGUL SYLLABLE RYEH + {0xB85C, 0xB85C, prH2, gcLo}, // HANGUL SYLLABLE RO + {0xB85D, 0xB877, prH3, gcLo}, // [27] HANGUL SYLLABLE ROG..HANGUL SYLLABLE ROH + {0xB878, 0xB878, prH2, gcLo}, // HANGUL SYLLABLE RWA + {0xB879, 0xB893, prH3, gcLo}, // [27] HANGUL SYLLABLE RWAG..HANGUL SYLLABLE RWAH + {0xB894, 0xB894, prH2, gcLo}, // HANGUL SYLLABLE RWAE + {0xB895, 0xB8AF, prH3, gcLo}, // [27] HANGUL SYLLABLE RWAEG..HANGUL SYLLABLE RWAEH + {0xB8B0, 0xB8B0, prH2, gcLo}, // HANGUL SYLLABLE ROE + {0xB8B1, 0xB8CB, prH3, gcLo}, // [27] HANGUL SYLLABLE ROEG..HANGUL SYLLABLE ROEH + {0xB8CC, 0xB8CC, prH2, gcLo}, // HANGUL SYLLABLE RYO + {0xB8CD, 0xB8E7, prH3, gcLo}, // [27] HANGUL SYLLABLE RYOG..HANGUL SYLLABLE RYOH + {0xB8E8, 0xB8E8, prH2, gcLo}, // HANGUL SYLLABLE RU + {0xB8E9, 0xB903, prH3, gcLo}, // [27] HANGUL SYLLABLE RUG..HANGUL SYLLABLE RUH + {0xB904, 0xB904, prH2, gcLo}, // HANGUL SYLLABLE RWEO + {0xB905, 0xB91F, prH3, gcLo}, // [27] HANGUL SYLLABLE RWEOG..HANGUL SYLLABLE RWEOH + {0xB920, 0xB920, prH2, gcLo}, // HANGUL SYLLABLE RWE + {0xB921, 0xB93B, prH3, gcLo}, // [27] HANGUL SYLLABLE RWEG..HANGUL SYLLABLE RWEH + {0xB93C, 0xB93C, prH2, gcLo}, // HANGUL SYLLABLE RWI + {0xB93D, 0xB957, prH3, gcLo}, // [27] HANGUL SYLLABLE RWIG..HANGUL SYLLABLE RWIH + {0xB958, 0xB958, prH2, gcLo}, // HANGUL SYLLABLE RYU + {0xB959, 0xB973, prH3, gcLo}, // [27] HANGUL SYLLABLE RYUG..HANGUL SYLLABLE RYUH + {0xB974, 0xB974, prH2, gcLo}, // HANGUL SYLLABLE REU + {0xB975, 0xB98F, prH3, gcLo}, // [27] HANGUL SYLLABLE REUG..HANGUL SYLLABLE REUH + {0xB990, 0xB990, prH2, gcLo}, // HANGUL SYLLABLE RYI + {0xB991, 0xB9AB, prH3, gcLo}, // [27] HANGUL SYLLABLE RYIG..HANGUL SYLLABLE RYIH + {0xB9AC, 0xB9AC, prH2, gcLo}, // HANGUL SYLLABLE RI + {0xB9AD, 0xB9C7, prH3, gcLo}, // [27] HANGUL SYLLABLE RIG..HANGUL SYLLABLE RIH + {0xB9C8, 0xB9C8, prH2, gcLo}, // HANGUL SYLLABLE MA + {0xB9C9, 0xB9E3, prH3, gcLo}, // [27] HANGUL SYLLABLE MAG..HANGUL SYLLABLE MAH + {0xB9E4, 0xB9E4, prH2, gcLo}, // HANGUL SYLLABLE MAE + {0xB9E5, 0xB9FF, prH3, gcLo}, // [27] HANGUL SYLLABLE MAEG..HANGUL SYLLABLE MAEH + {0xBA00, 0xBA00, prH2, gcLo}, // HANGUL SYLLABLE MYA + {0xBA01, 0xBA1B, prH3, gcLo}, // [27] HANGUL SYLLABLE MYAG..HANGUL SYLLABLE MYAH + {0xBA1C, 0xBA1C, prH2, gcLo}, // HANGUL SYLLABLE MYAE + {0xBA1D, 0xBA37, prH3, gcLo}, // [27] HANGUL SYLLABLE MYAEG..HANGUL SYLLABLE MYAEH + {0xBA38, 0xBA38, prH2, gcLo}, // HANGUL SYLLABLE MEO + {0xBA39, 0xBA53, prH3, gcLo}, // [27] HANGUL SYLLABLE MEOG..HANGUL SYLLABLE MEOH + {0xBA54, 0xBA54, prH2, gcLo}, // HANGUL SYLLABLE ME + {0xBA55, 0xBA6F, prH3, gcLo}, // [27] HANGUL SYLLABLE MEG..HANGUL SYLLABLE MEH + {0xBA70, 0xBA70, prH2, gcLo}, // HANGUL SYLLABLE MYEO + {0xBA71, 0xBA8B, prH3, gcLo}, // [27] HANGUL SYLLABLE MYEOG..HANGUL SYLLABLE MYEOH + {0xBA8C, 0xBA8C, prH2, gcLo}, // HANGUL SYLLABLE MYE + {0xBA8D, 0xBAA7, prH3, gcLo}, // [27] HANGUL SYLLABLE MYEG..HANGUL SYLLABLE MYEH + {0xBAA8, 0xBAA8, prH2, gcLo}, // HANGUL SYLLABLE MO + {0xBAA9, 0xBAC3, prH3, gcLo}, // [27] HANGUL SYLLABLE MOG..HANGUL SYLLABLE MOH + {0xBAC4, 0xBAC4, prH2, gcLo}, // HANGUL SYLLABLE MWA + {0xBAC5, 0xBADF, prH3, gcLo}, // [27] HANGUL SYLLABLE MWAG..HANGUL SYLLABLE MWAH + {0xBAE0, 0xBAE0, prH2, gcLo}, // HANGUL SYLLABLE MWAE + {0xBAE1, 0xBAFB, prH3, gcLo}, // [27] HANGUL SYLLABLE MWAEG..HANGUL SYLLABLE MWAEH + {0xBAFC, 0xBAFC, prH2, gcLo}, // HANGUL SYLLABLE MOE + {0xBAFD, 0xBB17, prH3, gcLo}, // [27] HANGUL SYLLABLE MOEG..HANGUL SYLLABLE MOEH + {0xBB18, 0xBB18, prH2, gcLo}, // HANGUL SYLLABLE MYO + {0xBB19, 0xBB33, prH3, gcLo}, // [27] HANGUL SYLLABLE MYOG..HANGUL SYLLABLE MYOH + {0xBB34, 0xBB34, prH2, gcLo}, // HANGUL SYLLABLE MU + {0xBB35, 0xBB4F, prH3, gcLo}, // [27] HANGUL SYLLABLE MUG..HANGUL SYLLABLE MUH + {0xBB50, 0xBB50, prH2, gcLo}, // HANGUL SYLLABLE MWEO + {0xBB51, 0xBB6B, prH3, gcLo}, // [27] HANGUL SYLLABLE MWEOG..HANGUL SYLLABLE MWEOH + {0xBB6C, 0xBB6C, prH2, gcLo}, // HANGUL SYLLABLE MWE + {0xBB6D, 0xBB87, prH3, gcLo}, // [27] HANGUL SYLLABLE MWEG..HANGUL SYLLABLE MWEH + {0xBB88, 0xBB88, prH2, gcLo}, // HANGUL SYLLABLE MWI + {0xBB89, 0xBBA3, prH3, gcLo}, // [27] HANGUL SYLLABLE MWIG..HANGUL SYLLABLE MWIH + {0xBBA4, 0xBBA4, prH2, gcLo}, // HANGUL SYLLABLE MYU + {0xBBA5, 0xBBBF, prH3, gcLo}, // [27] HANGUL SYLLABLE MYUG..HANGUL SYLLABLE MYUH + {0xBBC0, 0xBBC0, prH2, gcLo}, // HANGUL SYLLABLE MEU + {0xBBC1, 0xBBDB, prH3, gcLo}, // [27] HANGUL SYLLABLE MEUG..HANGUL SYLLABLE MEUH + {0xBBDC, 0xBBDC, prH2, gcLo}, // HANGUL SYLLABLE MYI + {0xBBDD, 0xBBF7, prH3, gcLo}, // [27] HANGUL SYLLABLE MYIG..HANGUL SYLLABLE MYIH + {0xBBF8, 0xBBF8, prH2, gcLo}, // HANGUL SYLLABLE MI + {0xBBF9, 0xBC13, prH3, gcLo}, // [27] HANGUL SYLLABLE MIG..HANGUL SYLLABLE MIH + {0xBC14, 0xBC14, prH2, gcLo}, // HANGUL SYLLABLE BA + {0xBC15, 0xBC2F, prH3, gcLo}, // [27] HANGUL SYLLABLE BAG..HANGUL SYLLABLE BAH + {0xBC30, 0xBC30, prH2, gcLo}, // HANGUL SYLLABLE BAE + {0xBC31, 0xBC4B, prH3, gcLo}, // [27] HANGUL SYLLABLE BAEG..HANGUL SYLLABLE BAEH + {0xBC4C, 0xBC4C, prH2, gcLo}, // HANGUL SYLLABLE BYA + {0xBC4D, 0xBC67, prH3, gcLo}, // [27] HANGUL SYLLABLE BYAG..HANGUL SYLLABLE BYAH + {0xBC68, 0xBC68, prH2, gcLo}, // HANGUL SYLLABLE BYAE + {0xBC69, 0xBC83, prH3, gcLo}, // [27] HANGUL SYLLABLE BYAEG..HANGUL SYLLABLE BYAEH + {0xBC84, 0xBC84, prH2, gcLo}, // HANGUL SYLLABLE BEO + {0xBC85, 0xBC9F, prH3, gcLo}, // [27] HANGUL SYLLABLE BEOG..HANGUL SYLLABLE BEOH + {0xBCA0, 0xBCA0, prH2, gcLo}, // HANGUL SYLLABLE BE + {0xBCA1, 0xBCBB, prH3, gcLo}, // [27] HANGUL SYLLABLE BEG..HANGUL SYLLABLE BEH + {0xBCBC, 0xBCBC, prH2, gcLo}, // HANGUL SYLLABLE BYEO + {0xBCBD, 0xBCD7, prH3, gcLo}, // [27] HANGUL SYLLABLE BYEOG..HANGUL SYLLABLE BYEOH + {0xBCD8, 0xBCD8, prH2, gcLo}, // HANGUL SYLLABLE BYE + {0xBCD9, 0xBCF3, prH3, gcLo}, // [27] HANGUL SYLLABLE BYEG..HANGUL SYLLABLE BYEH + {0xBCF4, 0xBCF4, prH2, gcLo}, // HANGUL SYLLABLE BO + {0xBCF5, 0xBD0F, prH3, gcLo}, // [27] HANGUL SYLLABLE BOG..HANGUL SYLLABLE BOH + {0xBD10, 0xBD10, prH2, gcLo}, // HANGUL SYLLABLE BWA + {0xBD11, 0xBD2B, prH3, gcLo}, // [27] HANGUL SYLLABLE BWAG..HANGUL SYLLABLE BWAH + {0xBD2C, 0xBD2C, prH2, gcLo}, // HANGUL SYLLABLE BWAE + {0xBD2D, 0xBD47, prH3, gcLo}, // [27] HANGUL SYLLABLE BWAEG..HANGUL SYLLABLE BWAEH + {0xBD48, 0xBD48, prH2, gcLo}, // HANGUL SYLLABLE BOE + {0xBD49, 0xBD63, prH3, gcLo}, // [27] HANGUL SYLLABLE BOEG..HANGUL SYLLABLE BOEH + {0xBD64, 0xBD64, prH2, gcLo}, // HANGUL SYLLABLE BYO + {0xBD65, 0xBD7F, prH3, gcLo}, // [27] HANGUL SYLLABLE BYOG..HANGUL SYLLABLE BYOH + {0xBD80, 0xBD80, prH2, gcLo}, // HANGUL SYLLABLE BU + {0xBD81, 0xBD9B, prH3, gcLo}, // [27] HANGUL SYLLABLE BUG..HANGUL SYLLABLE BUH + {0xBD9C, 0xBD9C, prH2, gcLo}, // HANGUL SYLLABLE BWEO + {0xBD9D, 0xBDB7, prH3, gcLo}, // [27] HANGUL SYLLABLE BWEOG..HANGUL SYLLABLE BWEOH + {0xBDB8, 0xBDB8, prH2, gcLo}, // HANGUL SYLLABLE BWE + {0xBDB9, 0xBDD3, prH3, gcLo}, // [27] HANGUL SYLLABLE BWEG..HANGUL SYLLABLE BWEH + {0xBDD4, 0xBDD4, prH2, gcLo}, // HANGUL SYLLABLE BWI + {0xBDD5, 0xBDEF, prH3, gcLo}, // [27] HANGUL SYLLABLE BWIG..HANGUL SYLLABLE BWIH + {0xBDF0, 0xBDF0, prH2, gcLo}, // HANGUL SYLLABLE BYU + {0xBDF1, 0xBE0B, prH3, gcLo}, // [27] HANGUL SYLLABLE BYUG..HANGUL SYLLABLE BYUH + {0xBE0C, 0xBE0C, prH2, gcLo}, // HANGUL SYLLABLE BEU + {0xBE0D, 0xBE27, prH3, gcLo}, // [27] HANGUL SYLLABLE BEUG..HANGUL SYLLABLE BEUH + {0xBE28, 0xBE28, prH2, gcLo}, // HANGUL SYLLABLE BYI + {0xBE29, 0xBE43, prH3, gcLo}, // [27] HANGUL SYLLABLE BYIG..HANGUL SYLLABLE BYIH + {0xBE44, 0xBE44, prH2, gcLo}, // HANGUL SYLLABLE BI + {0xBE45, 0xBE5F, prH3, gcLo}, // [27] HANGUL SYLLABLE BIG..HANGUL SYLLABLE BIH + {0xBE60, 0xBE60, prH2, gcLo}, // HANGUL SYLLABLE BBA + {0xBE61, 0xBE7B, prH3, gcLo}, // [27] HANGUL SYLLABLE BBAG..HANGUL SYLLABLE BBAH + {0xBE7C, 0xBE7C, prH2, gcLo}, // HANGUL SYLLABLE BBAE + {0xBE7D, 0xBE97, prH3, gcLo}, // [27] HANGUL SYLLABLE BBAEG..HANGUL SYLLABLE BBAEH + {0xBE98, 0xBE98, prH2, gcLo}, // HANGUL SYLLABLE BBYA + {0xBE99, 0xBEB3, prH3, gcLo}, // [27] HANGUL SYLLABLE BBYAG..HANGUL SYLLABLE BBYAH + {0xBEB4, 0xBEB4, prH2, gcLo}, // HANGUL SYLLABLE BBYAE + {0xBEB5, 0xBECF, prH3, gcLo}, // [27] HANGUL SYLLABLE BBYAEG..HANGUL SYLLABLE BBYAEH + {0xBED0, 0xBED0, prH2, gcLo}, // HANGUL SYLLABLE BBEO + {0xBED1, 0xBEEB, prH3, gcLo}, // [27] HANGUL SYLLABLE BBEOG..HANGUL SYLLABLE BBEOH + {0xBEEC, 0xBEEC, prH2, gcLo}, // HANGUL SYLLABLE BBE + {0xBEED, 0xBF07, prH3, gcLo}, // [27] HANGUL SYLLABLE BBEG..HANGUL SYLLABLE BBEH + {0xBF08, 0xBF08, prH2, gcLo}, // HANGUL SYLLABLE BBYEO + {0xBF09, 0xBF23, prH3, gcLo}, // [27] HANGUL SYLLABLE BBYEOG..HANGUL SYLLABLE BBYEOH + {0xBF24, 0xBF24, prH2, gcLo}, // HANGUL SYLLABLE BBYE + {0xBF25, 0xBF3F, prH3, gcLo}, // [27] HANGUL SYLLABLE BBYEG..HANGUL SYLLABLE BBYEH + {0xBF40, 0xBF40, prH2, gcLo}, // HANGUL SYLLABLE BBO + {0xBF41, 0xBF5B, prH3, gcLo}, // [27] HANGUL SYLLABLE BBOG..HANGUL SYLLABLE BBOH + {0xBF5C, 0xBF5C, prH2, gcLo}, // HANGUL SYLLABLE BBWA + {0xBF5D, 0xBF77, prH3, gcLo}, // [27] HANGUL SYLLABLE BBWAG..HANGUL SYLLABLE BBWAH + {0xBF78, 0xBF78, prH2, gcLo}, // HANGUL SYLLABLE BBWAE + {0xBF79, 0xBF93, prH3, gcLo}, // [27] HANGUL SYLLABLE BBWAEG..HANGUL SYLLABLE BBWAEH + {0xBF94, 0xBF94, prH2, gcLo}, // HANGUL SYLLABLE BBOE + {0xBF95, 0xBFAF, prH3, gcLo}, // [27] HANGUL SYLLABLE BBOEG..HANGUL SYLLABLE BBOEH + {0xBFB0, 0xBFB0, prH2, gcLo}, // HANGUL SYLLABLE BBYO + {0xBFB1, 0xBFCB, prH3, gcLo}, // [27] HANGUL SYLLABLE BBYOG..HANGUL SYLLABLE BBYOH + {0xBFCC, 0xBFCC, prH2, gcLo}, // HANGUL SYLLABLE BBU + {0xBFCD, 0xBFE7, prH3, gcLo}, // [27] HANGUL SYLLABLE BBUG..HANGUL SYLLABLE BBUH + {0xBFE8, 0xBFE8, prH2, gcLo}, // HANGUL SYLLABLE BBWEO + {0xBFE9, 0xC003, prH3, gcLo}, // [27] HANGUL SYLLABLE BBWEOG..HANGUL SYLLABLE BBWEOH + {0xC004, 0xC004, prH2, gcLo}, // HANGUL SYLLABLE BBWE + {0xC005, 0xC01F, prH3, gcLo}, // [27] HANGUL SYLLABLE BBWEG..HANGUL SYLLABLE BBWEH + {0xC020, 0xC020, prH2, gcLo}, // HANGUL SYLLABLE BBWI + {0xC021, 0xC03B, prH3, gcLo}, // [27] HANGUL SYLLABLE BBWIG..HANGUL SYLLABLE BBWIH + {0xC03C, 0xC03C, prH2, gcLo}, // HANGUL SYLLABLE BBYU + {0xC03D, 0xC057, prH3, gcLo}, // [27] HANGUL SYLLABLE BBYUG..HANGUL SYLLABLE BBYUH + {0xC058, 0xC058, prH2, gcLo}, // HANGUL SYLLABLE BBEU + {0xC059, 0xC073, prH3, gcLo}, // [27] HANGUL SYLLABLE BBEUG..HANGUL SYLLABLE BBEUH + {0xC074, 0xC074, prH2, gcLo}, // HANGUL SYLLABLE BBYI + {0xC075, 0xC08F, prH3, gcLo}, // [27] HANGUL SYLLABLE BBYIG..HANGUL SYLLABLE BBYIH + {0xC090, 0xC090, prH2, gcLo}, // HANGUL SYLLABLE BBI + {0xC091, 0xC0AB, prH3, gcLo}, // [27] HANGUL SYLLABLE BBIG..HANGUL SYLLABLE BBIH + {0xC0AC, 0xC0AC, prH2, gcLo}, // HANGUL SYLLABLE SA + {0xC0AD, 0xC0C7, prH3, gcLo}, // [27] HANGUL SYLLABLE SAG..HANGUL SYLLABLE SAH + {0xC0C8, 0xC0C8, prH2, gcLo}, // HANGUL SYLLABLE SAE + {0xC0C9, 0xC0E3, prH3, gcLo}, // [27] HANGUL SYLLABLE SAEG..HANGUL SYLLABLE SAEH + {0xC0E4, 0xC0E4, prH2, gcLo}, // HANGUL SYLLABLE SYA + {0xC0E5, 0xC0FF, prH3, gcLo}, // [27] HANGUL SYLLABLE SYAG..HANGUL SYLLABLE SYAH + {0xC100, 0xC100, prH2, gcLo}, // HANGUL SYLLABLE SYAE + {0xC101, 0xC11B, prH3, gcLo}, // [27] HANGUL SYLLABLE SYAEG..HANGUL SYLLABLE SYAEH + {0xC11C, 0xC11C, prH2, gcLo}, // HANGUL SYLLABLE SEO + {0xC11D, 0xC137, prH3, gcLo}, // [27] HANGUL SYLLABLE SEOG..HANGUL SYLLABLE SEOH + {0xC138, 0xC138, prH2, gcLo}, // HANGUL SYLLABLE SE + {0xC139, 0xC153, prH3, gcLo}, // [27] HANGUL SYLLABLE SEG..HANGUL SYLLABLE SEH + {0xC154, 0xC154, prH2, gcLo}, // HANGUL SYLLABLE SYEO + {0xC155, 0xC16F, prH3, gcLo}, // [27] HANGUL SYLLABLE SYEOG..HANGUL SYLLABLE SYEOH + {0xC170, 0xC170, prH2, gcLo}, // HANGUL SYLLABLE SYE + {0xC171, 0xC18B, prH3, gcLo}, // [27] HANGUL SYLLABLE SYEG..HANGUL SYLLABLE SYEH + {0xC18C, 0xC18C, prH2, gcLo}, // HANGUL SYLLABLE SO + {0xC18D, 0xC1A7, prH3, gcLo}, // [27] HANGUL SYLLABLE SOG..HANGUL SYLLABLE SOH + {0xC1A8, 0xC1A8, prH2, gcLo}, // HANGUL SYLLABLE SWA + {0xC1A9, 0xC1C3, prH3, gcLo}, // [27] HANGUL SYLLABLE SWAG..HANGUL SYLLABLE SWAH + {0xC1C4, 0xC1C4, prH2, gcLo}, // HANGUL SYLLABLE SWAE + {0xC1C5, 0xC1DF, prH3, gcLo}, // [27] HANGUL SYLLABLE SWAEG..HANGUL SYLLABLE SWAEH + {0xC1E0, 0xC1E0, prH2, gcLo}, // HANGUL SYLLABLE SOE + {0xC1E1, 0xC1FB, prH3, gcLo}, // [27] HANGUL SYLLABLE SOEG..HANGUL SYLLABLE SOEH + {0xC1FC, 0xC1FC, prH2, gcLo}, // HANGUL SYLLABLE SYO + {0xC1FD, 0xC217, prH3, gcLo}, // [27] HANGUL SYLLABLE SYOG..HANGUL SYLLABLE SYOH + {0xC218, 0xC218, prH2, gcLo}, // HANGUL SYLLABLE SU + {0xC219, 0xC233, prH3, gcLo}, // [27] HANGUL SYLLABLE SUG..HANGUL SYLLABLE SUH + {0xC234, 0xC234, prH2, gcLo}, // HANGUL SYLLABLE SWEO + {0xC235, 0xC24F, prH3, gcLo}, // [27] HANGUL SYLLABLE SWEOG..HANGUL SYLLABLE SWEOH + {0xC250, 0xC250, prH2, gcLo}, // HANGUL SYLLABLE SWE + {0xC251, 0xC26B, prH3, gcLo}, // [27] HANGUL SYLLABLE SWEG..HANGUL SYLLABLE SWEH + {0xC26C, 0xC26C, prH2, gcLo}, // HANGUL SYLLABLE SWI + {0xC26D, 0xC287, prH3, gcLo}, // [27] HANGUL SYLLABLE SWIG..HANGUL SYLLABLE SWIH + {0xC288, 0xC288, prH2, gcLo}, // HANGUL SYLLABLE SYU + {0xC289, 0xC2A3, prH3, gcLo}, // [27] HANGUL SYLLABLE SYUG..HANGUL SYLLABLE SYUH + {0xC2A4, 0xC2A4, prH2, gcLo}, // HANGUL SYLLABLE SEU + {0xC2A5, 0xC2BF, prH3, gcLo}, // [27] HANGUL SYLLABLE SEUG..HANGUL SYLLABLE SEUH + {0xC2C0, 0xC2C0, prH2, gcLo}, // HANGUL SYLLABLE SYI + {0xC2C1, 0xC2DB, prH3, gcLo}, // [27] HANGUL SYLLABLE SYIG..HANGUL SYLLABLE SYIH + {0xC2DC, 0xC2DC, prH2, gcLo}, // HANGUL SYLLABLE SI + {0xC2DD, 0xC2F7, prH3, gcLo}, // [27] HANGUL SYLLABLE SIG..HANGUL SYLLABLE SIH + {0xC2F8, 0xC2F8, prH2, gcLo}, // HANGUL SYLLABLE SSA + {0xC2F9, 0xC313, prH3, gcLo}, // [27] HANGUL SYLLABLE SSAG..HANGUL SYLLABLE SSAH + {0xC314, 0xC314, prH2, gcLo}, // HANGUL SYLLABLE SSAE + {0xC315, 0xC32F, prH3, gcLo}, // [27] HANGUL SYLLABLE SSAEG..HANGUL SYLLABLE SSAEH + {0xC330, 0xC330, prH2, gcLo}, // HANGUL SYLLABLE SSYA + {0xC331, 0xC34B, prH3, gcLo}, // [27] HANGUL SYLLABLE SSYAG..HANGUL SYLLABLE SSYAH + {0xC34C, 0xC34C, prH2, gcLo}, // HANGUL SYLLABLE SSYAE + {0xC34D, 0xC367, prH3, gcLo}, // [27] HANGUL SYLLABLE SSYAEG..HANGUL SYLLABLE SSYAEH + {0xC368, 0xC368, prH2, gcLo}, // HANGUL SYLLABLE SSEO + {0xC369, 0xC383, prH3, gcLo}, // [27] HANGUL SYLLABLE SSEOG..HANGUL SYLLABLE SSEOH + {0xC384, 0xC384, prH2, gcLo}, // HANGUL SYLLABLE SSE + {0xC385, 0xC39F, prH3, gcLo}, // [27] HANGUL SYLLABLE SSEG..HANGUL SYLLABLE SSEH + {0xC3A0, 0xC3A0, prH2, gcLo}, // HANGUL SYLLABLE SSYEO + {0xC3A1, 0xC3BB, prH3, gcLo}, // [27] HANGUL SYLLABLE SSYEOG..HANGUL SYLLABLE SSYEOH + {0xC3BC, 0xC3BC, prH2, gcLo}, // HANGUL SYLLABLE SSYE + {0xC3BD, 0xC3D7, prH3, gcLo}, // [27] HANGUL SYLLABLE SSYEG..HANGUL SYLLABLE SSYEH + {0xC3D8, 0xC3D8, prH2, gcLo}, // HANGUL SYLLABLE SSO + {0xC3D9, 0xC3F3, prH3, gcLo}, // [27] HANGUL SYLLABLE SSOG..HANGUL SYLLABLE SSOH + {0xC3F4, 0xC3F4, prH2, gcLo}, // HANGUL SYLLABLE SSWA + {0xC3F5, 0xC40F, prH3, gcLo}, // [27] HANGUL SYLLABLE SSWAG..HANGUL SYLLABLE SSWAH + {0xC410, 0xC410, prH2, gcLo}, // HANGUL SYLLABLE SSWAE + {0xC411, 0xC42B, prH3, gcLo}, // [27] HANGUL SYLLABLE SSWAEG..HANGUL SYLLABLE SSWAEH + {0xC42C, 0xC42C, prH2, gcLo}, // HANGUL SYLLABLE SSOE + {0xC42D, 0xC447, prH3, gcLo}, // [27] HANGUL SYLLABLE SSOEG..HANGUL SYLLABLE SSOEH + {0xC448, 0xC448, prH2, gcLo}, // HANGUL SYLLABLE SSYO + {0xC449, 0xC463, prH3, gcLo}, // [27] HANGUL SYLLABLE SSYOG..HANGUL SYLLABLE SSYOH + {0xC464, 0xC464, prH2, gcLo}, // HANGUL SYLLABLE SSU + {0xC465, 0xC47F, prH3, gcLo}, // [27] HANGUL SYLLABLE SSUG..HANGUL SYLLABLE SSUH + {0xC480, 0xC480, prH2, gcLo}, // HANGUL SYLLABLE SSWEO + {0xC481, 0xC49B, prH3, gcLo}, // [27] HANGUL SYLLABLE SSWEOG..HANGUL SYLLABLE SSWEOH + {0xC49C, 0xC49C, prH2, gcLo}, // HANGUL SYLLABLE SSWE + {0xC49D, 0xC4B7, prH3, gcLo}, // [27] HANGUL SYLLABLE SSWEG..HANGUL SYLLABLE SSWEH + {0xC4B8, 0xC4B8, prH2, gcLo}, // HANGUL SYLLABLE SSWI + {0xC4B9, 0xC4D3, prH3, gcLo}, // [27] HANGUL SYLLABLE SSWIG..HANGUL SYLLABLE SSWIH + {0xC4D4, 0xC4D4, prH2, gcLo}, // HANGUL SYLLABLE SSYU + {0xC4D5, 0xC4EF, prH3, gcLo}, // [27] HANGUL SYLLABLE SSYUG..HANGUL SYLLABLE SSYUH + {0xC4F0, 0xC4F0, prH2, gcLo}, // HANGUL SYLLABLE SSEU + {0xC4F1, 0xC50B, prH3, gcLo}, // [27] HANGUL SYLLABLE SSEUG..HANGUL SYLLABLE SSEUH + {0xC50C, 0xC50C, prH2, gcLo}, // HANGUL SYLLABLE SSYI + {0xC50D, 0xC527, prH3, gcLo}, // [27] HANGUL SYLLABLE SSYIG..HANGUL SYLLABLE SSYIH + {0xC528, 0xC528, prH2, gcLo}, // HANGUL SYLLABLE SSI + {0xC529, 0xC543, prH3, gcLo}, // [27] HANGUL SYLLABLE SSIG..HANGUL SYLLABLE SSIH + {0xC544, 0xC544, prH2, gcLo}, // HANGUL SYLLABLE A + {0xC545, 0xC55F, prH3, gcLo}, // [27] HANGUL SYLLABLE AG..HANGUL SYLLABLE AH + {0xC560, 0xC560, prH2, gcLo}, // HANGUL SYLLABLE AE + {0xC561, 0xC57B, prH3, gcLo}, // [27] HANGUL SYLLABLE AEG..HANGUL SYLLABLE AEH + {0xC57C, 0xC57C, prH2, gcLo}, // HANGUL SYLLABLE YA + {0xC57D, 0xC597, prH3, gcLo}, // [27] HANGUL SYLLABLE YAG..HANGUL SYLLABLE YAH + {0xC598, 0xC598, prH2, gcLo}, // HANGUL SYLLABLE YAE + {0xC599, 0xC5B3, prH3, gcLo}, // [27] HANGUL SYLLABLE YAEG..HANGUL SYLLABLE YAEH + {0xC5B4, 0xC5B4, prH2, gcLo}, // HANGUL SYLLABLE EO + {0xC5B5, 0xC5CF, prH3, gcLo}, // [27] HANGUL SYLLABLE EOG..HANGUL SYLLABLE EOH + {0xC5D0, 0xC5D0, prH2, gcLo}, // HANGUL SYLLABLE E + {0xC5D1, 0xC5EB, prH3, gcLo}, // [27] HANGUL SYLLABLE EG..HANGUL SYLLABLE EH + {0xC5EC, 0xC5EC, prH2, gcLo}, // HANGUL SYLLABLE YEO + {0xC5ED, 0xC607, prH3, gcLo}, // [27] HANGUL SYLLABLE YEOG..HANGUL SYLLABLE YEOH + {0xC608, 0xC608, prH2, gcLo}, // HANGUL SYLLABLE YE + {0xC609, 0xC623, prH3, gcLo}, // [27] HANGUL SYLLABLE YEG..HANGUL SYLLABLE YEH + {0xC624, 0xC624, prH2, gcLo}, // HANGUL SYLLABLE O + {0xC625, 0xC63F, prH3, gcLo}, // [27] HANGUL SYLLABLE OG..HANGUL SYLLABLE OH + {0xC640, 0xC640, prH2, gcLo}, // HANGUL SYLLABLE WA + {0xC641, 0xC65B, prH3, gcLo}, // [27] HANGUL SYLLABLE WAG..HANGUL SYLLABLE WAH + {0xC65C, 0xC65C, prH2, gcLo}, // HANGUL SYLLABLE WAE + {0xC65D, 0xC677, prH3, gcLo}, // [27] HANGUL SYLLABLE WAEG..HANGUL SYLLABLE WAEH + {0xC678, 0xC678, prH2, gcLo}, // HANGUL SYLLABLE OE + {0xC679, 0xC693, prH3, gcLo}, // [27] HANGUL SYLLABLE OEG..HANGUL SYLLABLE OEH + {0xC694, 0xC694, prH2, gcLo}, // HANGUL SYLLABLE YO + {0xC695, 0xC6AF, prH3, gcLo}, // [27] HANGUL SYLLABLE YOG..HANGUL SYLLABLE YOH + {0xC6B0, 0xC6B0, prH2, gcLo}, // HANGUL SYLLABLE U + {0xC6B1, 0xC6CB, prH3, gcLo}, // [27] HANGUL SYLLABLE UG..HANGUL SYLLABLE UH + {0xC6CC, 0xC6CC, prH2, gcLo}, // HANGUL SYLLABLE WEO + {0xC6CD, 0xC6E7, prH3, gcLo}, // [27] HANGUL SYLLABLE WEOG..HANGUL SYLLABLE WEOH + {0xC6E8, 0xC6E8, prH2, gcLo}, // HANGUL SYLLABLE WE + {0xC6E9, 0xC703, prH3, gcLo}, // [27] HANGUL SYLLABLE WEG..HANGUL SYLLABLE WEH + {0xC704, 0xC704, prH2, gcLo}, // HANGUL SYLLABLE WI + {0xC705, 0xC71F, prH3, gcLo}, // [27] HANGUL SYLLABLE WIG..HANGUL SYLLABLE WIH + {0xC720, 0xC720, prH2, gcLo}, // HANGUL SYLLABLE YU + {0xC721, 0xC73B, prH3, gcLo}, // [27] HANGUL SYLLABLE YUG..HANGUL SYLLABLE YUH + {0xC73C, 0xC73C, prH2, gcLo}, // HANGUL SYLLABLE EU + {0xC73D, 0xC757, prH3, gcLo}, // [27] HANGUL SYLLABLE EUG..HANGUL SYLLABLE EUH + {0xC758, 0xC758, prH2, gcLo}, // HANGUL SYLLABLE YI + {0xC759, 0xC773, prH3, gcLo}, // [27] HANGUL SYLLABLE YIG..HANGUL SYLLABLE YIH + {0xC774, 0xC774, prH2, gcLo}, // HANGUL SYLLABLE I + {0xC775, 0xC78F, prH3, gcLo}, // [27] HANGUL SYLLABLE IG..HANGUL SYLLABLE IH + {0xC790, 0xC790, prH2, gcLo}, // HANGUL SYLLABLE JA + {0xC791, 0xC7AB, prH3, gcLo}, // [27] HANGUL SYLLABLE JAG..HANGUL SYLLABLE JAH + {0xC7AC, 0xC7AC, prH2, gcLo}, // HANGUL SYLLABLE JAE + {0xC7AD, 0xC7C7, prH3, gcLo}, // [27] HANGUL SYLLABLE JAEG..HANGUL SYLLABLE JAEH + {0xC7C8, 0xC7C8, prH2, gcLo}, // HANGUL SYLLABLE JYA + {0xC7C9, 0xC7E3, prH3, gcLo}, // [27] HANGUL SYLLABLE JYAG..HANGUL SYLLABLE JYAH + {0xC7E4, 0xC7E4, prH2, gcLo}, // HANGUL SYLLABLE JYAE + {0xC7E5, 0xC7FF, prH3, gcLo}, // [27] HANGUL SYLLABLE JYAEG..HANGUL SYLLABLE JYAEH + {0xC800, 0xC800, prH2, gcLo}, // HANGUL SYLLABLE JEO + {0xC801, 0xC81B, prH3, gcLo}, // [27] HANGUL SYLLABLE JEOG..HANGUL SYLLABLE JEOH + {0xC81C, 0xC81C, prH2, gcLo}, // HANGUL SYLLABLE JE + {0xC81D, 0xC837, prH3, gcLo}, // [27] HANGUL SYLLABLE JEG..HANGUL SYLLABLE JEH + {0xC838, 0xC838, prH2, gcLo}, // HANGUL SYLLABLE JYEO + {0xC839, 0xC853, prH3, gcLo}, // [27] HANGUL SYLLABLE JYEOG..HANGUL SYLLABLE JYEOH + {0xC854, 0xC854, prH2, gcLo}, // HANGUL SYLLABLE JYE + {0xC855, 0xC86F, prH3, gcLo}, // [27] HANGUL SYLLABLE JYEG..HANGUL SYLLABLE JYEH + {0xC870, 0xC870, prH2, gcLo}, // HANGUL SYLLABLE JO + {0xC871, 0xC88B, prH3, gcLo}, // [27] HANGUL SYLLABLE JOG..HANGUL SYLLABLE JOH + {0xC88C, 0xC88C, prH2, gcLo}, // HANGUL SYLLABLE JWA + {0xC88D, 0xC8A7, prH3, gcLo}, // [27] HANGUL SYLLABLE JWAG..HANGUL SYLLABLE JWAH + {0xC8A8, 0xC8A8, prH2, gcLo}, // HANGUL SYLLABLE JWAE + {0xC8A9, 0xC8C3, prH3, gcLo}, // [27] HANGUL SYLLABLE JWAEG..HANGUL SYLLABLE JWAEH + {0xC8C4, 0xC8C4, prH2, gcLo}, // HANGUL SYLLABLE JOE + {0xC8C5, 0xC8DF, prH3, gcLo}, // [27] HANGUL SYLLABLE JOEG..HANGUL SYLLABLE JOEH + {0xC8E0, 0xC8E0, prH2, gcLo}, // HANGUL SYLLABLE JYO + {0xC8E1, 0xC8FB, prH3, gcLo}, // [27] HANGUL SYLLABLE JYOG..HANGUL SYLLABLE JYOH + {0xC8FC, 0xC8FC, prH2, gcLo}, // HANGUL SYLLABLE JU + {0xC8FD, 0xC917, prH3, gcLo}, // [27] HANGUL SYLLABLE JUG..HANGUL SYLLABLE JUH + {0xC918, 0xC918, prH2, gcLo}, // HANGUL SYLLABLE JWEO + {0xC919, 0xC933, prH3, gcLo}, // [27] HANGUL SYLLABLE JWEOG..HANGUL SYLLABLE JWEOH + {0xC934, 0xC934, prH2, gcLo}, // HANGUL SYLLABLE JWE + {0xC935, 0xC94F, prH3, gcLo}, // [27] HANGUL SYLLABLE JWEG..HANGUL SYLLABLE JWEH + {0xC950, 0xC950, prH2, gcLo}, // HANGUL SYLLABLE JWI + {0xC951, 0xC96B, prH3, gcLo}, // [27] HANGUL SYLLABLE JWIG..HANGUL SYLLABLE JWIH + {0xC96C, 0xC96C, prH2, gcLo}, // HANGUL SYLLABLE JYU + {0xC96D, 0xC987, prH3, gcLo}, // [27] HANGUL SYLLABLE JYUG..HANGUL SYLLABLE JYUH + {0xC988, 0xC988, prH2, gcLo}, // HANGUL SYLLABLE JEU + {0xC989, 0xC9A3, prH3, gcLo}, // [27] HANGUL SYLLABLE JEUG..HANGUL SYLLABLE JEUH + {0xC9A4, 0xC9A4, prH2, gcLo}, // HANGUL SYLLABLE JYI + {0xC9A5, 0xC9BF, prH3, gcLo}, // [27] HANGUL SYLLABLE JYIG..HANGUL SYLLABLE JYIH + {0xC9C0, 0xC9C0, prH2, gcLo}, // HANGUL SYLLABLE JI + {0xC9C1, 0xC9DB, prH3, gcLo}, // [27] HANGUL SYLLABLE JIG..HANGUL SYLLABLE JIH + {0xC9DC, 0xC9DC, prH2, gcLo}, // HANGUL SYLLABLE JJA + {0xC9DD, 0xC9F7, prH3, gcLo}, // [27] HANGUL SYLLABLE JJAG..HANGUL SYLLABLE JJAH + {0xC9F8, 0xC9F8, prH2, gcLo}, // HANGUL SYLLABLE JJAE + {0xC9F9, 0xCA13, prH3, gcLo}, // [27] HANGUL SYLLABLE JJAEG..HANGUL SYLLABLE JJAEH + {0xCA14, 0xCA14, prH2, gcLo}, // HANGUL SYLLABLE JJYA + {0xCA15, 0xCA2F, prH3, gcLo}, // [27] HANGUL SYLLABLE JJYAG..HANGUL SYLLABLE JJYAH + {0xCA30, 0xCA30, prH2, gcLo}, // HANGUL SYLLABLE JJYAE + {0xCA31, 0xCA4B, prH3, gcLo}, // [27] HANGUL SYLLABLE JJYAEG..HANGUL SYLLABLE JJYAEH + {0xCA4C, 0xCA4C, prH2, gcLo}, // HANGUL SYLLABLE JJEO + {0xCA4D, 0xCA67, prH3, gcLo}, // [27] HANGUL SYLLABLE JJEOG..HANGUL SYLLABLE JJEOH + {0xCA68, 0xCA68, prH2, gcLo}, // HANGUL SYLLABLE JJE + {0xCA69, 0xCA83, prH3, gcLo}, // [27] HANGUL SYLLABLE JJEG..HANGUL SYLLABLE JJEH + {0xCA84, 0xCA84, prH2, gcLo}, // HANGUL SYLLABLE JJYEO + {0xCA85, 0xCA9F, prH3, gcLo}, // [27] HANGUL SYLLABLE JJYEOG..HANGUL SYLLABLE JJYEOH + {0xCAA0, 0xCAA0, prH2, gcLo}, // HANGUL SYLLABLE JJYE + {0xCAA1, 0xCABB, prH3, gcLo}, // [27] HANGUL SYLLABLE JJYEG..HANGUL SYLLABLE JJYEH + {0xCABC, 0xCABC, prH2, gcLo}, // HANGUL SYLLABLE JJO + {0xCABD, 0xCAD7, prH3, gcLo}, // [27] HANGUL SYLLABLE JJOG..HANGUL SYLLABLE JJOH + {0xCAD8, 0xCAD8, prH2, gcLo}, // HANGUL SYLLABLE JJWA + {0xCAD9, 0xCAF3, prH3, gcLo}, // [27] HANGUL SYLLABLE JJWAG..HANGUL SYLLABLE JJWAH + {0xCAF4, 0xCAF4, prH2, gcLo}, // HANGUL SYLLABLE JJWAE + {0xCAF5, 0xCB0F, prH3, gcLo}, // [27] HANGUL SYLLABLE JJWAEG..HANGUL SYLLABLE JJWAEH + {0xCB10, 0xCB10, prH2, gcLo}, // HANGUL SYLLABLE JJOE + {0xCB11, 0xCB2B, prH3, gcLo}, // [27] HANGUL SYLLABLE JJOEG..HANGUL SYLLABLE JJOEH + {0xCB2C, 0xCB2C, prH2, gcLo}, // HANGUL SYLLABLE JJYO + {0xCB2D, 0xCB47, prH3, gcLo}, // [27] HANGUL SYLLABLE JJYOG..HANGUL SYLLABLE JJYOH + {0xCB48, 0xCB48, prH2, gcLo}, // HANGUL SYLLABLE JJU + {0xCB49, 0xCB63, prH3, gcLo}, // [27] HANGUL SYLLABLE JJUG..HANGUL SYLLABLE JJUH + {0xCB64, 0xCB64, prH2, gcLo}, // HANGUL SYLLABLE JJWEO + {0xCB65, 0xCB7F, prH3, gcLo}, // [27] HANGUL SYLLABLE JJWEOG..HANGUL SYLLABLE JJWEOH + {0xCB80, 0xCB80, prH2, gcLo}, // HANGUL SYLLABLE JJWE + {0xCB81, 0xCB9B, prH3, gcLo}, // [27] HANGUL SYLLABLE JJWEG..HANGUL SYLLABLE JJWEH + {0xCB9C, 0xCB9C, prH2, gcLo}, // HANGUL SYLLABLE JJWI + {0xCB9D, 0xCBB7, prH3, gcLo}, // [27] HANGUL SYLLABLE JJWIG..HANGUL SYLLABLE JJWIH + {0xCBB8, 0xCBB8, prH2, gcLo}, // HANGUL SYLLABLE JJYU + {0xCBB9, 0xCBD3, prH3, gcLo}, // [27] HANGUL SYLLABLE JJYUG..HANGUL SYLLABLE JJYUH + {0xCBD4, 0xCBD4, prH2, gcLo}, // HANGUL SYLLABLE JJEU + {0xCBD5, 0xCBEF, prH3, gcLo}, // [27] HANGUL SYLLABLE JJEUG..HANGUL SYLLABLE JJEUH + {0xCBF0, 0xCBF0, prH2, gcLo}, // HANGUL SYLLABLE JJYI + {0xCBF1, 0xCC0B, prH3, gcLo}, // [27] HANGUL SYLLABLE JJYIG..HANGUL SYLLABLE JJYIH + {0xCC0C, 0xCC0C, prH2, gcLo}, // HANGUL SYLLABLE JJI + {0xCC0D, 0xCC27, prH3, gcLo}, // [27] HANGUL SYLLABLE JJIG..HANGUL SYLLABLE JJIH + {0xCC28, 0xCC28, prH2, gcLo}, // HANGUL SYLLABLE CA + {0xCC29, 0xCC43, prH3, gcLo}, // [27] HANGUL SYLLABLE CAG..HANGUL SYLLABLE CAH + {0xCC44, 0xCC44, prH2, gcLo}, // HANGUL SYLLABLE CAE + {0xCC45, 0xCC5F, prH3, gcLo}, // [27] HANGUL SYLLABLE CAEG..HANGUL SYLLABLE CAEH + {0xCC60, 0xCC60, prH2, gcLo}, // HANGUL SYLLABLE CYA + {0xCC61, 0xCC7B, prH3, gcLo}, // [27] HANGUL SYLLABLE CYAG..HANGUL SYLLABLE CYAH + {0xCC7C, 0xCC7C, prH2, gcLo}, // HANGUL SYLLABLE CYAE + {0xCC7D, 0xCC97, prH3, gcLo}, // [27] HANGUL SYLLABLE CYAEG..HANGUL SYLLABLE CYAEH + {0xCC98, 0xCC98, prH2, gcLo}, // HANGUL SYLLABLE CEO + {0xCC99, 0xCCB3, prH3, gcLo}, // [27] HANGUL SYLLABLE CEOG..HANGUL SYLLABLE CEOH + {0xCCB4, 0xCCB4, prH2, gcLo}, // HANGUL SYLLABLE CE + {0xCCB5, 0xCCCF, prH3, gcLo}, // [27] HANGUL SYLLABLE CEG..HANGUL SYLLABLE CEH + {0xCCD0, 0xCCD0, prH2, gcLo}, // HANGUL SYLLABLE CYEO + {0xCCD1, 0xCCEB, prH3, gcLo}, // [27] HANGUL SYLLABLE CYEOG..HANGUL SYLLABLE CYEOH + {0xCCEC, 0xCCEC, prH2, gcLo}, // HANGUL SYLLABLE CYE + {0xCCED, 0xCD07, prH3, gcLo}, // [27] HANGUL SYLLABLE CYEG..HANGUL SYLLABLE CYEH + {0xCD08, 0xCD08, prH2, gcLo}, // HANGUL SYLLABLE CO + {0xCD09, 0xCD23, prH3, gcLo}, // [27] HANGUL SYLLABLE COG..HANGUL SYLLABLE COH + {0xCD24, 0xCD24, prH2, gcLo}, // HANGUL SYLLABLE CWA + {0xCD25, 0xCD3F, prH3, gcLo}, // [27] HANGUL SYLLABLE CWAG..HANGUL SYLLABLE CWAH + {0xCD40, 0xCD40, prH2, gcLo}, // HANGUL SYLLABLE CWAE + {0xCD41, 0xCD5B, prH3, gcLo}, // [27] HANGUL SYLLABLE CWAEG..HANGUL SYLLABLE CWAEH + {0xCD5C, 0xCD5C, prH2, gcLo}, // HANGUL SYLLABLE COE + {0xCD5D, 0xCD77, prH3, gcLo}, // [27] HANGUL SYLLABLE COEG..HANGUL SYLLABLE COEH + {0xCD78, 0xCD78, prH2, gcLo}, // HANGUL SYLLABLE CYO + {0xCD79, 0xCD93, prH3, gcLo}, // [27] HANGUL SYLLABLE CYOG..HANGUL SYLLABLE CYOH + {0xCD94, 0xCD94, prH2, gcLo}, // HANGUL SYLLABLE CU + {0xCD95, 0xCDAF, prH3, gcLo}, // [27] HANGUL SYLLABLE CUG..HANGUL SYLLABLE CUH + {0xCDB0, 0xCDB0, prH2, gcLo}, // HANGUL SYLLABLE CWEO + {0xCDB1, 0xCDCB, prH3, gcLo}, // [27] HANGUL SYLLABLE CWEOG..HANGUL SYLLABLE CWEOH + {0xCDCC, 0xCDCC, prH2, gcLo}, // HANGUL SYLLABLE CWE + {0xCDCD, 0xCDE7, prH3, gcLo}, // [27] HANGUL SYLLABLE CWEG..HANGUL SYLLABLE CWEH + {0xCDE8, 0xCDE8, prH2, gcLo}, // HANGUL SYLLABLE CWI + {0xCDE9, 0xCE03, prH3, gcLo}, // [27] HANGUL SYLLABLE CWIG..HANGUL SYLLABLE CWIH + {0xCE04, 0xCE04, prH2, gcLo}, // HANGUL SYLLABLE CYU + {0xCE05, 0xCE1F, prH3, gcLo}, // [27] HANGUL SYLLABLE CYUG..HANGUL SYLLABLE CYUH + {0xCE20, 0xCE20, prH2, gcLo}, // HANGUL SYLLABLE CEU + {0xCE21, 0xCE3B, prH3, gcLo}, // [27] HANGUL SYLLABLE CEUG..HANGUL SYLLABLE CEUH + {0xCE3C, 0xCE3C, prH2, gcLo}, // HANGUL SYLLABLE CYI + {0xCE3D, 0xCE57, prH3, gcLo}, // [27] HANGUL SYLLABLE CYIG..HANGUL SYLLABLE CYIH + {0xCE58, 0xCE58, prH2, gcLo}, // HANGUL SYLLABLE CI + {0xCE59, 0xCE73, prH3, gcLo}, // [27] HANGUL SYLLABLE CIG..HANGUL SYLLABLE CIH + {0xCE74, 0xCE74, prH2, gcLo}, // HANGUL SYLLABLE KA + {0xCE75, 0xCE8F, prH3, gcLo}, // [27] HANGUL SYLLABLE KAG..HANGUL SYLLABLE KAH + {0xCE90, 0xCE90, prH2, gcLo}, // HANGUL SYLLABLE KAE + {0xCE91, 0xCEAB, prH3, gcLo}, // [27] HANGUL SYLLABLE KAEG..HANGUL SYLLABLE KAEH + {0xCEAC, 0xCEAC, prH2, gcLo}, // HANGUL SYLLABLE KYA + {0xCEAD, 0xCEC7, prH3, gcLo}, // [27] HANGUL SYLLABLE KYAG..HANGUL SYLLABLE KYAH + {0xCEC8, 0xCEC8, prH2, gcLo}, // HANGUL SYLLABLE KYAE + {0xCEC9, 0xCEE3, prH3, gcLo}, // [27] HANGUL SYLLABLE KYAEG..HANGUL SYLLABLE KYAEH + {0xCEE4, 0xCEE4, prH2, gcLo}, // HANGUL SYLLABLE KEO + {0xCEE5, 0xCEFF, prH3, gcLo}, // [27] HANGUL SYLLABLE KEOG..HANGUL SYLLABLE KEOH + {0xCF00, 0xCF00, prH2, gcLo}, // HANGUL SYLLABLE KE + {0xCF01, 0xCF1B, prH3, gcLo}, // [27] HANGUL SYLLABLE KEG..HANGUL SYLLABLE KEH + {0xCF1C, 0xCF1C, prH2, gcLo}, // HANGUL SYLLABLE KYEO + {0xCF1D, 0xCF37, prH3, gcLo}, // [27] HANGUL SYLLABLE KYEOG..HANGUL SYLLABLE KYEOH + {0xCF38, 0xCF38, prH2, gcLo}, // HANGUL SYLLABLE KYE + {0xCF39, 0xCF53, prH3, gcLo}, // [27] HANGUL SYLLABLE KYEG..HANGUL SYLLABLE KYEH + {0xCF54, 0xCF54, prH2, gcLo}, // HANGUL SYLLABLE KO + {0xCF55, 0xCF6F, prH3, gcLo}, // [27] HANGUL SYLLABLE KOG..HANGUL SYLLABLE KOH + {0xCF70, 0xCF70, prH2, gcLo}, // HANGUL SYLLABLE KWA + {0xCF71, 0xCF8B, prH3, gcLo}, // [27] HANGUL SYLLABLE KWAG..HANGUL SYLLABLE KWAH + {0xCF8C, 0xCF8C, prH2, gcLo}, // HANGUL SYLLABLE KWAE + {0xCF8D, 0xCFA7, prH3, gcLo}, // [27] HANGUL SYLLABLE KWAEG..HANGUL SYLLABLE KWAEH + {0xCFA8, 0xCFA8, prH2, gcLo}, // HANGUL SYLLABLE KOE + {0xCFA9, 0xCFC3, prH3, gcLo}, // [27] HANGUL SYLLABLE KOEG..HANGUL SYLLABLE KOEH + {0xCFC4, 0xCFC4, prH2, gcLo}, // HANGUL SYLLABLE KYO + {0xCFC5, 0xCFDF, prH3, gcLo}, // [27] HANGUL SYLLABLE KYOG..HANGUL SYLLABLE KYOH + {0xCFE0, 0xCFE0, prH2, gcLo}, // HANGUL SYLLABLE KU + {0xCFE1, 0xCFFB, prH3, gcLo}, // [27] HANGUL SYLLABLE KUG..HANGUL SYLLABLE KUH + {0xCFFC, 0xCFFC, prH2, gcLo}, // HANGUL SYLLABLE KWEO + {0xCFFD, 0xD017, prH3, gcLo}, // [27] HANGUL SYLLABLE KWEOG..HANGUL SYLLABLE KWEOH + {0xD018, 0xD018, prH2, gcLo}, // HANGUL SYLLABLE KWE + {0xD019, 0xD033, prH3, gcLo}, // [27] HANGUL SYLLABLE KWEG..HANGUL SYLLABLE KWEH + {0xD034, 0xD034, prH2, gcLo}, // HANGUL SYLLABLE KWI + {0xD035, 0xD04F, prH3, gcLo}, // [27] HANGUL SYLLABLE KWIG..HANGUL SYLLABLE KWIH + {0xD050, 0xD050, prH2, gcLo}, // HANGUL SYLLABLE KYU + {0xD051, 0xD06B, prH3, gcLo}, // [27] HANGUL SYLLABLE KYUG..HANGUL SYLLABLE KYUH + {0xD06C, 0xD06C, prH2, gcLo}, // HANGUL SYLLABLE KEU + {0xD06D, 0xD087, prH3, gcLo}, // [27] HANGUL SYLLABLE KEUG..HANGUL SYLLABLE KEUH + {0xD088, 0xD088, prH2, gcLo}, // HANGUL SYLLABLE KYI + {0xD089, 0xD0A3, prH3, gcLo}, // [27] HANGUL SYLLABLE KYIG..HANGUL SYLLABLE KYIH + {0xD0A4, 0xD0A4, prH2, gcLo}, // HANGUL SYLLABLE KI + {0xD0A5, 0xD0BF, prH3, gcLo}, // [27] HANGUL SYLLABLE KIG..HANGUL SYLLABLE KIH + {0xD0C0, 0xD0C0, prH2, gcLo}, // HANGUL SYLLABLE TA + {0xD0C1, 0xD0DB, prH3, gcLo}, // [27] HANGUL SYLLABLE TAG..HANGUL SYLLABLE TAH + {0xD0DC, 0xD0DC, prH2, gcLo}, // HANGUL SYLLABLE TAE + {0xD0DD, 0xD0F7, prH3, gcLo}, // [27] HANGUL SYLLABLE TAEG..HANGUL SYLLABLE TAEH + {0xD0F8, 0xD0F8, prH2, gcLo}, // HANGUL SYLLABLE TYA + {0xD0F9, 0xD113, prH3, gcLo}, // [27] HANGUL SYLLABLE TYAG..HANGUL SYLLABLE TYAH + {0xD114, 0xD114, prH2, gcLo}, // HANGUL SYLLABLE TYAE + {0xD115, 0xD12F, prH3, gcLo}, // [27] HANGUL SYLLABLE TYAEG..HANGUL SYLLABLE TYAEH + {0xD130, 0xD130, prH2, gcLo}, // HANGUL SYLLABLE TEO + {0xD131, 0xD14B, prH3, gcLo}, // [27] HANGUL SYLLABLE TEOG..HANGUL SYLLABLE TEOH + {0xD14C, 0xD14C, prH2, gcLo}, // HANGUL SYLLABLE TE + {0xD14D, 0xD167, prH3, gcLo}, // [27] HANGUL SYLLABLE TEG..HANGUL SYLLABLE TEH + {0xD168, 0xD168, prH2, gcLo}, // HANGUL SYLLABLE TYEO + {0xD169, 0xD183, prH3, gcLo}, // [27] HANGUL SYLLABLE TYEOG..HANGUL SYLLABLE TYEOH + {0xD184, 0xD184, prH2, gcLo}, // HANGUL SYLLABLE TYE + {0xD185, 0xD19F, prH3, gcLo}, // [27] HANGUL SYLLABLE TYEG..HANGUL SYLLABLE TYEH + {0xD1A0, 0xD1A0, prH2, gcLo}, // HANGUL SYLLABLE TO + {0xD1A1, 0xD1BB, prH3, gcLo}, // [27] HANGUL SYLLABLE TOG..HANGUL SYLLABLE TOH + {0xD1BC, 0xD1BC, prH2, gcLo}, // HANGUL SYLLABLE TWA + {0xD1BD, 0xD1D7, prH3, gcLo}, // [27] HANGUL SYLLABLE TWAG..HANGUL SYLLABLE TWAH + {0xD1D8, 0xD1D8, prH2, gcLo}, // HANGUL SYLLABLE TWAE + {0xD1D9, 0xD1F3, prH3, gcLo}, // [27] HANGUL SYLLABLE TWAEG..HANGUL SYLLABLE TWAEH + {0xD1F4, 0xD1F4, prH2, gcLo}, // HANGUL SYLLABLE TOE + {0xD1F5, 0xD20F, prH3, gcLo}, // [27] HANGUL SYLLABLE TOEG..HANGUL SYLLABLE TOEH + {0xD210, 0xD210, prH2, gcLo}, // HANGUL SYLLABLE TYO + {0xD211, 0xD22B, prH3, gcLo}, // [27] HANGUL SYLLABLE TYOG..HANGUL SYLLABLE TYOH + {0xD22C, 0xD22C, prH2, gcLo}, // HANGUL SYLLABLE TU + {0xD22D, 0xD247, prH3, gcLo}, // [27] HANGUL SYLLABLE TUG..HANGUL SYLLABLE TUH + {0xD248, 0xD248, prH2, gcLo}, // HANGUL SYLLABLE TWEO + {0xD249, 0xD263, prH3, gcLo}, // [27] HANGUL SYLLABLE TWEOG..HANGUL SYLLABLE TWEOH + {0xD264, 0xD264, prH2, gcLo}, // HANGUL SYLLABLE TWE + {0xD265, 0xD27F, prH3, gcLo}, // [27] HANGUL SYLLABLE TWEG..HANGUL SYLLABLE TWEH + {0xD280, 0xD280, prH2, gcLo}, // HANGUL SYLLABLE TWI + {0xD281, 0xD29B, prH3, gcLo}, // [27] HANGUL SYLLABLE TWIG..HANGUL SYLLABLE TWIH + {0xD29C, 0xD29C, prH2, gcLo}, // HANGUL SYLLABLE TYU + {0xD29D, 0xD2B7, prH3, gcLo}, // [27] HANGUL SYLLABLE TYUG..HANGUL SYLLABLE TYUH + {0xD2B8, 0xD2B8, prH2, gcLo}, // HANGUL SYLLABLE TEU + {0xD2B9, 0xD2D3, prH3, gcLo}, // [27] HANGUL SYLLABLE TEUG..HANGUL SYLLABLE TEUH + {0xD2D4, 0xD2D4, prH2, gcLo}, // HANGUL SYLLABLE TYI + {0xD2D5, 0xD2EF, prH3, gcLo}, // [27] HANGUL SYLLABLE TYIG..HANGUL SYLLABLE TYIH + {0xD2F0, 0xD2F0, prH2, gcLo}, // HANGUL SYLLABLE TI + {0xD2F1, 0xD30B, prH3, gcLo}, // [27] HANGUL SYLLABLE TIG..HANGUL SYLLABLE TIH + {0xD30C, 0xD30C, prH2, gcLo}, // HANGUL SYLLABLE PA + {0xD30D, 0xD327, prH3, gcLo}, // [27] HANGUL SYLLABLE PAG..HANGUL SYLLABLE PAH + {0xD328, 0xD328, prH2, gcLo}, // HANGUL SYLLABLE PAE + {0xD329, 0xD343, prH3, gcLo}, // [27] HANGUL SYLLABLE PAEG..HANGUL SYLLABLE PAEH + {0xD344, 0xD344, prH2, gcLo}, // HANGUL SYLLABLE PYA + {0xD345, 0xD35F, prH3, gcLo}, // [27] HANGUL SYLLABLE PYAG..HANGUL SYLLABLE PYAH + {0xD360, 0xD360, prH2, gcLo}, // HANGUL SYLLABLE PYAE + {0xD361, 0xD37B, prH3, gcLo}, // [27] HANGUL SYLLABLE PYAEG..HANGUL SYLLABLE PYAEH + {0xD37C, 0xD37C, prH2, gcLo}, // HANGUL SYLLABLE PEO + {0xD37D, 0xD397, prH3, gcLo}, // [27] HANGUL SYLLABLE PEOG..HANGUL SYLLABLE PEOH + {0xD398, 0xD398, prH2, gcLo}, // HANGUL SYLLABLE PE + {0xD399, 0xD3B3, prH3, gcLo}, // [27] HANGUL SYLLABLE PEG..HANGUL SYLLABLE PEH + {0xD3B4, 0xD3B4, prH2, gcLo}, // HANGUL SYLLABLE PYEO + {0xD3B5, 0xD3CF, prH3, gcLo}, // [27] HANGUL SYLLABLE PYEOG..HANGUL SYLLABLE PYEOH + {0xD3D0, 0xD3D0, prH2, gcLo}, // HANGUL SYLLABLE PYE + {0xD3D1, 0xD3EB, prH3, gcLo}, // [27] HANGUL SYLLABLE PYEG..HANGUL SYLLABLE PYEH + {0xD3EC, 0xD3EC, prH2, gcLo}, // HANGUL SYLLABLE PO + {0xD3ED, 0xD407, prH3, gcLo}, // [27] HANGUL SYLLABLE POG..HANGUL SYLLABLE POH + {0xD408, 0xD408, prH2, gcLo}, // HANGUL SYLLABLE PWA + {0xD409, 0xD423, prH3, gcLo}, // [27] HANGUL SYLLABLE PWAG..HANGUL SYLLABLE PWAH + {0xD424, 0xD424, prH2, gcLo}, // HANGUL SYLLABLE PWAE + {0xD425, 0xD43F, prH3, gcLo}, // [27] HANGUL SYLLABLE PWAEG..HANGUL SYLLABLE PWAEH + {0xD440, 0xD440, prH2, gcLo}, // HANGUL SYLLABLE POE + {0xD441, 0xD45B, prH3, gcLo}, // [27] HANGUL SYLLABLE POEG..HANGUL SYLLABLE POEH + {0xD45C, 0xD45C, prH2, gcLo}, // HANGUL SYLLABLE PYO + {0xD45D, 0xD477, prH3, gcLo}, // [27] HANGUL SYLLABLE PYOG..HANGUL SYLLABLE PYOH + {0xD478, 0xD478, prH2, gcLo}, // HANGUL SYLLABLE PU + {0xD479, 0xD493, prH3, gcLo}, // [27] HANGUL SYLLABLE PUG..HANGUL SYLLABLE PUH + {0xD494, 0xD494, prH2, gcLo}, // HANGUL SYLLABLE PWEO + {0xD495, 0xD4AF, prH3, gcLo}, // [27] HANGUL SYLLABLE PWEOG..HANGUL SYLLABLE PWEOH + {0xD4B0, 0xD4B0, prH2, gcLo}, // HANGUL SYLLABLE PWE + {0xD4B1, 0xD4CB, prH3, gcLo}, // [27] HANGUL SYLLABLE PWEG..HANGUL SYLLABLE PWEH + {0xD4CC, 0xD4CC, prH2, gcLo}, // HANGUL SYLLABLE PWI + {0xD4CD, 0xD4E7, prH3, gcLo}, // [27] HANGUL SYLLABLE PWIG..HANGUL SYLLABLE PWIH + {0xD4E8, 0xD4E8, prH2, gcLo}, // HANGUL SYLLABLE PYU + {0xD4E9, 0xD503, prH3, gcLo}, // [27] HANGUL SYLLABLE PYUG..HANGUL SYLLABLE PYUH + {0xD504, 0xD504, prH2, gcLo}, // HANGUL SYLLABLE PEU + {0xD505, 0xD51F, prH3, gcLo}, // [27] HANGUL SYLLABLE PEUG..HANGUL SYLLABLE PEUH + {0xD520, 0xD520, prH2, gcLo}, // HANGUL SYLLABLE PYI + {0xD521, 0xD53B, prH3, gcLo}, // [27] HANGUL SYLLABLE PYIG..HANGUL SYLLABLE PYIH + {0xD53C, 0xD53C, prH2, gcLo}, // HANGUL SYLLABLE PI + {0xD53D, 0xD557, prH3, gcLo}, // [27] HANGUL SYLLABLE PIG..HANGUL SYLLABLE PIH + {0xD558, 0xD558, prH2, gcLo}, // HANGUL SYLLABLE HA + {0xD559, 0xD573, prH3, gcLo}, // [27] HANGUL SYLLABLE HAG..HANGUL SYLLABLE HAH + {0xD574, 0xD574, prH2, gcLo}, // HANGUL SYLLABLE HAE + {0xD575, 0xD58F, prH3, gcLo}, // [27] HANGUL SYLLABLE HAEG..HANGUL SYLLABLE HAEH + {0xD590, 0xD590, prH2, gcLo}, // HANGUL SYLLABLE HYA + {0xD591, 0xD5AB, prH3, gcLo}, // [27] HANGUL SYLLABLE HYAG..HANGUL SYLLABLE HYAH + {0xD5AC, 0xD5AC, prH2, gcLo}, // HANGUL SYLLABLE HYAE + {0xD5AD, 0xD5C7, prH3, gcLo}, // [27] HANGUL SYLLABLE HYAEG..HANGUL SYLLABLE HYAEH + {0xD5C8, 0xD5C8, prH2, gcLo}, // HANGUL SYLLABLE HEO + {0xD5C9, 0xD5E3, prH3, gcLo}, // [27] HANGUL SYLLABLE HEOG..HANGUL SYLLABLE HEOH + {0xD5E4, 0xD5E4, prH2, gcLo}, // HANGUL SYLLABLE HE + {0xD5E5, 0xD5FF, prH3, gcLo}, // [27] HANGUL SYLLABLE HEG..HANGUL SYLLABLE HEH + {0xD600, 0xD600, prH2, gcLo}, // HANGUL SYLLABLE HYEO + {0xD601, 0xD61B, prH3, gcLo}, // [27] HANGUL SYLLABLE HYEOG..HANGUL SYLLABLE HYEOH + {0xD61C, 0xD61C, prH2, gcLo}, // HANGUL SYLLABLE HYE + {0xD61D, 0xD637, prH3, gcLo}, // [27] HANGUL SYLLABLE HYEG..HANGUL SYLLABLE HYEH + {0xD638, 0xD638, prH2, gcLo}, // HANGUL SYLLABLE HO + {0xD639, 0xD653, prH3, gcLo}, // [27] HANGUL SYLLABLE HOG..HANGUL SYLLABLE HOH + {0xD654, 0xD654, prH2, gcLo}, // HANGUL SYLLABLE HWA + {0xD655, 0xD66F, prH3, gcLo}, // [27] HANGUL SYLLABLE HWAG..HANGUL SYLLABLE HWAH + {0xD670, 0xD670, prH2, gcLo}, // HANGUL SYLLABLE HWAE + {0xD671, 0xD68B, prH3, gcLo}, // [27] HANGUL SYLLABLE HWAEG..HANGUL SYLLABLE HWAEH + {0xD68C, 0xD68C, prH2, gcLo}, // HANGUL SYLLABLE HOE + {0xD68D, 0xD6A7, prH3, gcLo}, // [27] HANGUL SYLLABLE HOEG..HANGUL SYLLABLE HOEH + {0xD6A8, 0xD6A8, prH2, gcLo}, // HANGUL SYLLABLE HYO + {0xD6A9, 0xD6C3, prH3, gcLo}, // [27] HANGUL SYLLABLE HYOG..HANGUL SYLLABLE HYOH + {0xD6C4, 0xD6C4, prH2, gcLo}, // HANGUL SYLLABLE HU + {0xD6C5, 0xD6DF, prH3, gcLo}, // [27] HANGUL SYLLABLE HUG..HANGUL SYLLABLE HUH + {0xD6E0, 0xD6E0, prH2, gcLo}, // HANGUL SYLLABLE HWEO + {0xD6E1, 0xD6FB, prH3, gcLo}, // [27] HANGUL SYLLABLE HWEOG..HANGUL SYLLABLE HWEOH + {0xD6FC, 0xD6FC, prH2, gcLo}, // HANGUL SYLLABLE HWE + {0xD6FD, 0xD717, prH3, gcLo}, // [27] HANGUL SYLLABLE HWEG..HANGUL SYLLABLE HWEH + {0xD718, 0xD718, prH2, gcLo}, // HANGUL SYLLABLE HWI + {0xD719, 0xD733, prH3, gcLo}, // [27] HANGUL SYLLABLE HWIG..HANGUL SYLLABLE HWIH + {0xD734, 0xD734, prH2, gcLo}, // HANGUL SYLLABLE HYU + {0xD735, 0xD74F, prH3, gcLo}, // [27] HANGUL SYLLABLE HYUG..HANGUL SYLLABLE HYUH + {0xD750, 0xD750, prH2, gcLo}, // HANGUL SYLLABLE HEU + {0xD751, 0xD76B, prH3, gcLo}, // [27] HANGUL SYLLABLE HEUG..HANGUL SYLLABLE HEUH + {0xD76C, 0xD76C, prH2, gcLo}, // HANGUL SYLLABLE HYI + {0xD76D, 0xD787, prH3, gcLo}, // [27] HANGUL SYLLABLE HYIG..HANGUL SYLLABLE HYIH + {0xD788, 0xD788, prH2, gcLo}, // HANGUL SYLLABLE HI + {0xD789, 0xD7A3, prH3, gcLo}, // [27] HANGUL SYLLABLE HIG..HANGUL SYLLABLE HIH + {0xD7B0, 0xD7C6, prJV, gcLo}, // [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E + {0xD7CB, 0xD7FB, prJT, gcLo}, // [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH + {0xD800, 0xDB7F, prSG, gcCs}, // [896] .. + {0xDB80, 0xDBFF, prSG, gcCs}, // [128] .. + {0xDC00, 0xDFFF, prSG, gcCs}, // [1024] .. + {0xE000, 0xF8FF, prXX, gcCo}, // [6400] .. + {0xF900, 0xFA6D, prID, gcLo}, // [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D + {0xFA6E, 0xFA6F, prID, gcCn}, // [2] .. + {0xFA70, 0xFAD9, prID, gcLo}, // [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 + {0xFADA, 0xFAFF, prID, gcCn}, // [38] .. + {0xFB00, 0xFB06, prAL, gcLl}, // [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST + {0xFB13, 0xFB17, prAL, gcLl}, // [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH + {0xFB1D, 0xFB1D, prHL, gcLo}, // HEBREW LETTER YOD WITH HIRIQ + {0xFB1E, 0xFB1E, prCM, gcMn}, // HEBREW POINT JUDEO-SPANISH VARIKA + {0xFB1F, 0xFB28, prHL, gcLo}, // [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV + {0xFB29, 0xFB29, prAL, gcSm}, // HEBREW LETTER ALTERNATIVE PLUS SIGN + {0xFB2A, 0xFB36, prHL, gcLo}, // [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH + {0xFB38, 0xFB3C, prHL, gcLo}, // [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH + {0xFB3E, 0xFB3E, prHL, gcLo}, // HEBREW LETTER MEM WITH DAGESH + {0xFB40, 0xFB41, prHL, gcLo}, // [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH + {0xFB43, 0xFB44, prHL, gcLo}, // [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH + {0xFB46, 0xFB4F, prHL, gcLo}, // [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE ALEF LAMED + {0xFB50, 0xFBB1, prAL, gcLo}, // [98] ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM + {0xFBB2, 0xFBC2, prAL, gcSk}, // [17] ARABIC SYMBOL DOT ABOVE..ARABIC SYMBOL WASLA ABOVE + {0xFBD3, 0xFD3D, prAL, gcLo}, // [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM + {0xFD3E, 0xFD3E, prCL, gcPe}, // ORNATE LEFT PARENTHESIS + {0xFD3F, 0xFD3F, prOP, gcPs}, // ORNATE RIGHT PARENTHESIS + {0xFD40, 0xFD4F, prAL, gcSo}, // [16] ARABIC LIGATURE RAHIMAHU ALLAAH..ARABIC LIGATURE RAHIMAHUM ALLAAH + {0xFD50, 0xFD8F, prAL, gcLo}, // [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM + {0xFD92, 0xFDC7, prAL, gcLo}, // [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM + {0xFDCF, 0xFDCF, prAL, gcSo}, // ARABIC LIGATURE SALAAMUHU ALAYNAA + {0xFDF0, 0xFDFB, prAL, gcLo}, // [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU + {0xFDFC, 0xFDFC, prPO, gcSc}, // RIAL SIGN + {0xFDFD, 0xFDFF, prAL, gcSo}, // [3] ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM..ARABIC LIGATURE AZZA WA JALL + {0xFE00, 0xFE0F, prCM, gcMn}, // [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 + {0xFE10, 0xFE10, prIS, gcPo}, // PRESENTATION FORM FOR VERTICAL COMMA + {0xFE11, 0xFE12, prCL, gcPo}, // [2] PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA..PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP + {0xFE13, 0xFE14, prIS, gcPo}, // [2] PRESENTATION FORM FOR VERTICAL COLON..PRESENTATION FORM FOR VERTICAL SEMICOLON + {0xFE15, 0xFE16, prEX, gcPo}, // [2] PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK..PRESENTATION FORM FOR VERTICAL QUESTION MARK + {0xFE17, 0xFE17, prOP, gcPs}, // PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET + {0xFE18, 0xFE18, prCL, gcPe}, // PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET + {0xFE19, 0xFE19, prIN, gcPo}, // PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS + {0xFE20, 0xFE2F, prCM, gcMn}, // [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF + {0xFE30, 0xFE30, prID, gcPo}, // PRESENTATION FORM FOR VERTICAL TWO DOT LEADER + {0xFE31, 0xFE32, prID, gcPd}, // [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH + {0xFE33, 0xFE34, prID, gcPc}, // [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE + {0xFE35, 0xFE35, prOP, gcPs}, // PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS + {0xFE36, 0xFE36, prCL, gcPe}, // PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS + {0xFE37, 0xFE37, prOP, gcPs}, // PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET + {0xFE38, 0xFE38, prCL, gcPe}, // PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET + {0xFE39, 0xFE39, prOP, gcPs}, // PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET + {0xFE3A, 0xFE3A, prCL, gcPe}, // PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET + {0xFE3B, 0xFE3B, prOP, gcPs}, // PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET + {0xFE3C, 0xFE3C, prCL, gcPe}, // PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET + {0xFE3D, 0xFE3D, prOP, gcPs}, // PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET + {0xFE3E, 0xFE3E, prCL, gcPe}, // PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET + {0xFE3F, 0xFE3F, prOP, gcPs}, // PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET + {0xFE40, 0xFE40, prCL, gcPe}, // PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET + {0xFE41, 0xFE41, prOP, gcPs}, // PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET + {0xFE42, 0xFE42, prCL, gcPe}, // PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET + {0xFE43, 0xFE43, prOP, gcPs}, // PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET + {0xFE44, 0xFE44, prCL, gcPe}, // PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET + {0xFE45, 0xFE46, prID, gcPo}, // [2] SESAME DOT..WHITE SESAME DOT + {0xFE47, 0xFE47, prOP, gcPs}, // PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET + {0xFE48, 0xFE48, prCL, gcPe}, // PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET + {0xFE49, 0xFE4C, prID, gcPo}, // [4] DASHED OVERLINE..DOUBLE WAVY OVERLINE + {0xFE4D, 0xFE4F, prID, gcPc}, // [3] DASHED LOW LINE..WAVY LOW LINE + {0xFE50, 0xFE50, prCL, gcPo}, // SMALL COMMA + {0xFE51, 0xFE51, prID, gcPo}, // SMALL IDEOGRAPHIC COMMA + {0xFE52, 0xFE52, prCL, gcPo}, // SMALL FULL STOP + {0xFE54, 0xFE55, prNS, gcPo}, // [2] SMALL SEMICOLON..SMALL COLON + {0xFE56, 0xFE57, prEX, gcPo}, // [2] SMALL QUESTION MARK..SMALL EXCLAMATION MARK + {0xFE58, 0xFE58, prID, gcPd}, // SMALL EM DASH + {0xFE59, 0xFE59, prOP, gcPs}, // SMALL LEFT PARENTHESIS + {0xFE5A, 0xFE5A, prCL, gcPe}, // SMALL RIGHT PARENTHESIS + {0xFE5B, 0xFE5B, prOP, gcPs}, // SMALL LEFT CURLY BRACKET + {0xFE5C, 0xFE5C, prCL, gcPe}, // SMALL RIGHT CURLY BRACKET + {0xFE5D, 0xFE5D, prOP, gcPs}, // SMALL LEFT TORTOISE SHELL BRACKET + {0xFE5E, 0xFE5E, prCL, gcPe}, // SMALL RIGHT TORTOISE SHELL BRACKET + {0xFE5F, 0xFE61, prID, gcPo}, // [3] SMALL NUMBER SIGN..SMALL ASTERISK + {0xFE62, 0xFE62, prID, gcSm}, // SMALL PLUS SIGN + {0xFE63, 0xFE63, prID, gcPd}, // SMALL HYPHEN-MINUS + {0xFE64, 0xFE66, prID, gcSm}, // [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN + {0xFE68, 0xFE68, prID, gcPo}, // SMALL REVERSE SOLIDUS + {0xFE69, 0xFE69, prPR, gcSc}, // SMALL DOLLAR SIGN + {0xFE6A, 0xFE6A, prPO, gcPo}, // SMALL PERCENT SIGN + {0xFE6B, 0xFE6B, prID, gcPo}, // SMALL COMMERCIAL AT + {0xFE70, 0xFE74, prAL, gcLo}, // [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM + {0xFE76, 0xFEFC, prAL, gcLo}, // [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM + {0xFEFF, 0xFEFF, prWJ, gcCf}, // ZERO WIDTH NO-BREAK SPACE + {0xFF01, 0xFF01, prEX, gcPo}, // FULLWIDTH EXCLAMATION MARK + {0xFF02, 0xFF03, prID, gcPo}, // [2] FULLWIDTH QUOTATION MARK..FULLWIDTH NUMBER SIGN + {0xFF04, 0xFF04, prPR, gcSc}, // FULLWIDTH DOLLAR SIGN + {0xFF05, 0xFF05, prPO, gcPo}, // FULLWIDTH PERCENT SIGN + {0xFF06, 0xFF07, prID, gcPo}, // [2] FULLWIDTH AMPERSAND..FULLWIDTH APOSTROPHE + {0xFF08, 0xFF08, prOP, gcPs}, // FULLWIDTH LEFT PARENTHESIS + {0xFF09, 0xFF09, prCL, gcPe}, // FULLWIDTH RIGHT PARENTHESIS + {0xFF0A, 0xFF0A, prID, gcPo}, // FULLWIDTH ASTERISK + {0xFF0B, 0xFF0B, prID, gcSm}, // FULLWIDTH PLUS SIGN + {0xFF0C, 0xFF0C, prCL, gcPo}, // FULLWIDTH COMMA + {0xFF0D, 0xFF0D, prID, gcPd}, // FULLWIDTH HYPHEN-MINUS + {0xFF0E, 0xFF0E, prCL, gcPo}, // FULLWIDTH FULL STOP + {0xFF0F, 0xFF0F, prID, gcPo}, // FULLWIDTH SOLIDUS + {0xFF10, 0xFF19, prID, gcNd}, // [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE + {0xFF1A, 0xFF1B, prNS, gcPo}, // [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON + {0xFF1C, 0xFF1E, prID, gcSm}, // [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN + {0xFF1F, 0xFF1F, prEX, gcPo}, // FULLWIDTH QUESTION MARK + {0xFF20, 0xFF20, prID, gcPo}, // FULLWIDTH COMMERCIAL AT + {0xFF21, 0xFF3A, prID, gcLu}, // [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z + {0xFF3B, 0xFF3B, prOP, gcPs}, // FULLWIDTH LEFT SQUARE BRACKET + {0xFF3C, 0xFF3C, prID, gcPo}, // FULLWIDTH REVERSE SOLIDUS + {0xFF3D, 0xFF3D, prCL, gcPe}, // FULLWIDTH RIGHT SQUARE BRACKET + {0xFF3E, 0xFF3E, prID, gcSk}, // FULLWIDTH CIRCUMFLEX ACCENT + {0xFF3F, 0xFF3F, prID, gcPc}, // FULLWIDTH LOW LINE + {0xFF40, 0xFF40, prID, gcSk}, // FULLWIDTH GRAVE ACCENT + {0xFF41, 0xFF5A, prID, gcLl}, // [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z + {0xFF5B, 0xFF5B, prOP, gcPs}, // FULLWIDTH LEFT CURLY BRACKET + {0xFF5C, 0xFF5C, prID, gcSm}, // FULLWIDTH VERTICAL LINE + {0xFF5D, 0xFF5D, prCL, gcPe}, // FULLWIDTH RIGHT CURLY BRACKET + {0xFF5E, 0xFF5E, prID, gcSm}, // FULLWIDTH TILDE + {0xFF5F, 0xFF5F, prOP, gcPs}, // FULLWIDTH LEFT WHITE PARENTHESIS + {0xFF60, 0xFF60, prCL, gcPe}, // FULLWIDTH RIGHT WHITE PARENTHESIS + {0xFF61, 0xFF61, prCL, gcPo}, // HALFWIDTH IDEOGRAPHIC FULL STOP + {0xFF62, 0xFF62, prOP, gcPs}, // HALFWIDTH LEFT CORNER BRACKET + {0xFF63, 0xFF63, prCL, gcPe}, // HALFWIDTH RIGHT CORNER BRACKET + {0xFF64, 0xFF64, prCL, gcPo}, // HALFWIDTH IDEOGRAPHIC COMMA + {0xFF65, 0xFF65, prNS, gcPo}, // HALFWIDTH KATAKANA MIDDLE DOT + {0xFF66, 0xFF66, prID, gcLo}, // HALFWIDTH KATAKANA LETTER WO + {0xFF67, 0xFF6F, prCJ, gcLo}, // [9] HALFWIDTH KATAKANA LETTER SMALL A..HALFWIDTH KATAKANA LETTER SMALL TU + {0xFF70, 0xFF70, prCJ, gcLm}, // HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK + {0xFF71, 0xFF9D, prID, gcLo}, // [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N + {0xFF9E, 0xFF9F, prNS, gcLm}, // [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK + {0xFFA0, 0xFFBE, prID, gcLo}, // [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH + {0xFFC2, 0xFFC7, prID, gcLo}, // [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E + {0xFFCA, 0xFFCF, prID, gcLo}, // [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE + {0xFFD2, 0xFFD7, prID, gcLo}, // [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU + {0xFFDA, 0xFFDC, prID, gcLo}, // [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I + {0xFFE0, 0xFFE0, prPO, gcSc}, // FULLWIDTH CENT SIGN + {0xFFE1, 0xFFE1, prPR, gcSc}, // FULLWIDTH POUND SIGN + {0xFFE2, 0xFFE2, prID, gcSm}, // FULLWIDTH NOT SIGN + {0xFFE3, 0xFFE3, prID, gcSk}, // FULLWIDTH MACRON + {0xFFE4, 0xFFE4, prID, gcSo}, // FULLWIDTH BROKEN BAR + {0xFFE5, 0xFFE6, prPR, gcSc}, // [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN + {0xFFE8, 0xFFE8, prAL, gcSo}, // HALFWIDTH FORMS LIGHT VERTICAL + {0xFFE9, 0xFFEC, prAL, gcSm}, // [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW + {0xFFED, 0xFFEE, prAL, gcSo}, // [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE + {0xFFF9, 0xFFFB, prCM, gcCf}, // [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR + {0xFFFC, 0xFFFC, prCB, gcSo}, // OBJECT REPLACEMENT CHARACTER + {0xFFFD, 0xFFFD, prAI, gcSo}, // REPLACEMENT CHARACTER + {0x10000, 0x1000B, prAL, gcLo}, // [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE + {0x1000D, 0x10026, prAL, gcLo}, // [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO + {0x10028, 0x1003A, prAL, gcLo}, // [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO + {0x1003C, 0x1003D, prAL, gcLo}, // [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE + {0x1003F, 0x1004D, prAL, gcLo}, // [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO + {0x10050, 0x1005D, prAL, gcLo}, // [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 + {0x10080, 0x100FA, prAL, gcLo}, // [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 + {0x10100, 0x10102, prBA, gcPo}, // [3] AEGEAN WORD SEPARATOR LINE..AEGEAN CHECK MARK + {0x10107, 0x10133, prAL, gcNo}, // [45] AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND + {0x10137, 0x1013F, prAL, gcSo}, // [9] AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT + {0x10140, 0x10174, prAL, gcNl}, // [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS + {0x10175, 0x10178, prAL, gcNo}, // [4] GREEK ONE HALF SIGN..GREEK THREE QUARTERS SIGN + {0x10179, 0x10189, prAL, gcSo}, // [17] GREEK YEAR SIGN..GREEK TRYBLION BASE SIGN + {0x1018A, 0x1018B, prAL, gcNo}, // [2] GREEK ZERO SIGN..GREEK ONE QUARTER SIGN + {0x1018C, 0x1018E, prAL, gcSo}, // [3] GREEK SINUSOID SIGN..NOMISMA SIGN + {0x10190, 0x1019C, prAL, gcSo}, // [13] ROMAN SEXTANS SIGN..ASCIA SYMBOL + {0x101A0, 0x101A0, prAL, gcSo}, // GREEK SYMBOL TAU RHO + {0x101D0, 0x101FC, prAL, gcSo}, // [45] PHAISTOS DISC SIGN PEDESTRIAN..PHAISTOS DISC SIGN WAVY BAND + {0x101FD, 0x101FD, prCM, gcMn}, // PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE + {0x10280, 0x1029C, prAL, gcLo}, // [29] LYCIAN LETTER A..LYCIAN LETTER X + {0x102A0, 0x102D0, prAL, gcLo}, // [49] CARIAN LETTER A..CARIAN LETTER UUU3 + {0x102E0, 0x102E0, prCM, gcMn}, // COPTIC EPACT THOUSANDS MARK + {0x102E1, 0x102FB, prAL, gcNo}, // [27] COPTIC EPACT DIGIT ONE..COPTIC EPACT NUMBER NINE HUNDRED + {0x10300, 0x1031F, prAL, gcLo}, // [32] OLD ITALIC LETTER A..OLD ITALIC LETTER ESS + {0x10320, 0x10323, prAL, gcNo}, // [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY + {0x1032D, 0x1032F, prAL, gcLo}, // [3] OLD ITALIC LETTER YE..OLD ITALIC LETTER SOUTHERN TSE + {0x10330, 0x10340, prAL, gcLo}, // [17] GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA + {0x10341, 0x10341, prAL, gcNl}, // GOTHIC LETTER NINETY + {0x10342, 0x10349, prAL, gcLo}, // [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL + {0x1034A, 0x1034A, prAL, gcNl}, // GOTHIC LETTER NINE HUNDRED + {0x10350, 0x10375, prAL, gcLo}, // [38] OLD PERMIC LETTER AN..OLD PERMIC LETTER IA + {0x10376, 0x1037A, prCM, gcMn}, // [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII + {0x10380, 0x1039D, prAL, gcLo}, // [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU + {0x1039F, 0x1039F, prBA, gcPo}, // UGARITIC WORD DIVIDER + {0x103A0, 0x103C3, prAL, gcLo}, // [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA + {0x103C8, 0x103CF, prAL, gcLo}, // [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH + {0x103D0, 0x103D0, prBA, gcPo}, // OLD PERSIAN WORD DIVIDER + {0x103D1, 0x103D5, prAL, gcNl}, // [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED + {0x10400, 0x1044F, prAL, gcLC}, // [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW + {0x10450, 0x1047F, prAL, gcLo}, // [48] SHAVIAN LETTER PEEP..SHAVIAN LETTER YEW + {0x10480, 0x1049D, prAL, gcLo}, // [30] OSMANYA LETTER ALEF..OSMANYA LETTER OO + {0x104A0, 0x104A9, prNU, gcNd}, // [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE + {0x104B0, 0x104D3, prAL, gcLu}, // [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA + {0x104D8, 0x104FB, prAL, gcLl}, // [36] OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA + {0x10500, 0x10527, prAL, gcLo}, // [40] ELBASAN LETTER A..ELBASAN LETTER KHE + {0x10530, 0x10563, prAL, gcLo}, // [52] CAUCASIAN ALBANIAN LETTER ALT..CAUCASIAN ALBANIAN LETTER KIW + {0x1056F, 0x1056F, prAL, gcPo}, // CAUCASIAN ALBANIAN CITATION MARK + {0x10570, 0x1057A, prAL, gcLu}, // [11] VITHKUQI CAPITAL LETTER A..VITHKUQI CAPITAL LETTER GA + {0x1057C, 0x1058A, prAL, gcLu}, // [15] VITHKUQI CAPITAL LETTER HA..VITHKUQI CAPITAL LETTER RE + {0x1058C, 0x10592, prAL, gcLu}, // [7] VITHKUQI CAPITAL LETTER SE..VITHKUQI CAPITAL LETTER XE + {0x10594, 0x10595, prAL, gcLu}, // [2] VITHKUQI CAPITAL LETTER Y..VITHKUQI CAPITAL LETTER ZE + {0x10597, 0x105A1, prAL, gcLl}, // [11] VITHKUQI SMALL LETTER A..VITHKUQI SMALL LETTER GA + {0x105A3, 0x105B1, prAL, gcLl}, // [15] VITHKUQI SMALL LETTER HA..VITHKUQI SMALL LETTER RE + {0x105B3, 0x105B9, prAL, gcLl}, // [7] VITHKUQI SMALL LETTER SE..VITHKUQI SMALL LETTER XE + {0x105BB, 0x105BC, prAL, gcLl}, // [2] VITHKUQI SMALL LETTER Y..VITHKUQI SMALL LETTER ZE + {0x10600, 0x10736, prAL, gcLo}, // [311] LINEAR A SIGN AB001..LINEAR A SIGN A664 + {0x10740, 0x10755, prAL, gcLo}, // [22] LINEAR A SIGN A701 A..LINEAR A SIGN A732 JE + {0x10760, 0x10767, prAL, gcLo}, // [8] LINEAR A SIGN A800..LINEAR A SIGN A807 + {0x10780, 0x10785, prAL, gcLm}, // [6] MODIFIER LETTER SMALL CAPITAL AA..MODIFIER LETTER SMALL B WITH HOOK + {0x10787, 0x107B0, prAL, gcLm}, // [42] MODIFIER LETTER SMALL DZ DIGRAPH..MODIFIER LETTER SMALL V WITH RIGHT HOOK + {0x107B2, 0x107BA, prAL, gcLm}, // [9] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL S WITH CURL + {0x10800, 0x10805, prAL, gcLo}, // [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA + {0x10808, 0x10808, prAL, gcLo}, // CYPRIOT SYLLABLE JO + {0x1080A, 0x10835, prAL, gcLo}, // [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO + {0x10837, 0x10838, prAL, gcLo}, // [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE + {0x1083C, 0x1083C, prAL, gcLo}, // CYPRIOT SYLLABLE ZA + {0x1083F, 0x1083F, prAL, gcLo}, // CYPRIOT SYLLABLE ZO + {0x10840, 0x10855, prAL, gcLo}, // [22] IMPERIAL ARAMAIC LETTER ALEPH..IMPERIAL ARAMAIC LETTER TAW + {0x10857, 0x10857, prBA, gcPo}, // IMPERIAL ARAMAIC SECTION SIGN + {0x10858, 0x1085F, prAL, gcNo}, // [8] IMPERIAL ARAMAIC NUMBER ONE..IMPERIAL ARAMAIC NUMBER TEN THOUSAND + {0x10860, 0x10876, prAL, gcLo}, // [23] PALMYRENE LETTER ALEPH..PALMYRENE LETTER TAW + {0x10877, 0x10878, prAL, gcSo}, // [2] PALMYRENE LEFT-POINTING FLEURON..PALMYRENE RIGHT-POINTING FLEURON + {0x10879, 0x1087F, prAL, gcNo}, // [7] PALMYRENE NUMBER ONE..PALMYRENE NUMBER TWENTY + {0x10880, 0x1089E, prAL, gcLo}, // [31] NABATAEAN LETTER FINAL ALEPH..NABATAEAN LETTER TAW + {0x108A7, 0x108AF, prAL, gcNo}, // [9] NABATAEAN NUMBER ONE..NABATAEAN NUMBER ONE HUNDRED + {0x108E0, 0x108F2, prAL, gcLo}, // [19] HATRAN LETTER ALEPH..HATRAN LETTER QOPH + {0x108F4, 0x108F5, prAL, gcLo}, // [2] HATRAN LETTER SHIN..HATRAN LETTER TAW + {0x108FB, 0x108FF, prAL, gcNo}, // [5] HATRAN NUMBER ONE..HATRAN NUMBER ONE HUNDRED + {0x10900, 0x10915, prAL, gcLo}, // [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU + {0x10916, 0x1091B, prAL, gcNo}, // [6] PHOENICIAN NUMBER ONE..PHOENICIAN NUMBER THREE + {0x1091F, 0x1091F, prBA, gcPo}, // PHOENICIAN WORD SEPARATOR + {0x10920, 0x10939, prAL, gcLo}, // [26] LYDIAN LETTER A..LYDIAN LETTER C + {0x1093F, 0x1093F, prAL, gcPo}, // LYDIAN TRIANGULAR MARK + {0x10980, 0x1099F, prAL, gcLo}, // [32] MEROITIC HIEROGLYPHIC LETTER A..MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2 + {0x109A0, 0x109B7, prAL, gcLo}, // [24] MEROITIC CURSIVE LETTER A..MEROITIC CURSIVE LETTER DA + {0x109BC, 0x109BD, prAL, gcNo}, // [2] MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS..MEROITIC CURSIVE FRACTION ONE HALF + {0x109BE, 0x109BF, prAL, gcLo}, // [2] MEROITIC CURSIVE LOGOGRAM RMT..MEROITIC CURSIVE LOGOGRAM IMN + {0x109C0, 0x109CF, prAL, gcNo}, // [16] MEROITIC CURSIVE NUMBER ONE..MEROITIC CURSIVE NUMBER SEVENTY + {0x109D2, 0x109FF, prAL, gcNo}, // [46] MEROITIC CURSIVE NUMBER ONE HUNDRED..MEROITIC CURSIVE FRACTION TEN TWELFTHS + {0x10A00, 0x10A00, prAL, gcLo}, // KHAROSHTHI LETTER A + {0x10A01, 0x10A03, prCM, gcMn}, // [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R + {0x10A05, 0x10A06, prCM, gcMn}, // [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O + {0x10A0C, 0x10A0F, prCM, gcMn}, // [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA + {0x10A10, 0x10A13, prAL, gcLo}, // [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA + {0x10A15, 0x10A17, prAL, gcLo}, // [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA + {0x10A19, 0x10A35, prAL, gcLo}, // [29] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER VHA + {0x10A38, 0x10A3A, prCM, gcMn}, // [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW + {0x10A3F, 0x10A3F, prCM, gcMn}, // KHAROSHTHI VIRAMA + {0x10A40, 0x10A48, prAL, gcNo}, // [9] KHAROSHTHI DIGIT ONE..KHAROSHTHI FRACTION ONE HALF + {0x10A50, 0x10A57, prBA, gcPo}, // [8] KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION DOUBLE DANDA + {0x10A58, 0x10A58, prAL, gcPo}, // KHAROSHTHI PUNCTUATION LINES + {0x10A60, 0x10A7C, prAL, gcLo}, // [29] OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH + {0x10A7D, 0x10A7E, prAL, gcNo}, // [2] OLD SOUTH ARABIAN NUMBER ONE..OLD SOUTH ARABIAN NUMBER FIFTY + {0x10A7F, 0x10A7F, prAL, gcPo}, // OLD SOUTH ARABIAN NUMERIC INDICATOR + {0x10A80, 0x10A9C, prAL, gcLo}, // [29] OLD NORTH ARABIAN LETTER HEH..OLD NORTH ARABIAN LETTER ZAH + {0x10A9D, 0x10A9F, prAL, gcNo}, // [3] OLD NORTH ARABIAN NUMBER ONE..OLD NORTH ARABIAN NUMBER TWENTY + {0x10AC0, 0x10AC7, prAL, gcLo}, // [8] MANICHAEAN LETTER ALEPH..MANICHAEAN LETTER WAW + {0x10AC8, 0x10AC8, prAL, gcSo}, // MANICHAEAN SIGN UD + {0x10AC9, 0x10AE4, prAL, gcLo}, // [28] MANICHAEAN LETTER ZAYIN..MANICHAEAN LETTER TAW + {0x10AE5, 0x10AE6, prCM, gcMn}, // [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW + {0x10AEB, 0x10AEF, prAL, gcNo}, // [5] MANICHAEAN NUMBER ONE..MANICHAEAN NUMBER ONE HUNDRED + {0x10AF0, 0x10AF5, prBA, gcPo}, // [6] MANICHAEAN PUNCTUATION STAR..MANICHAEAN PUNCTUATION TWO DOTS + {0x10AF6, 0x10AF6, prIN, gcPo}, // MANICHAEAN PUNCTUATION LINE FILLER + {0x10B00, 0x10B35, prAL, gcLo}, // [54] AVESTAN LETTER A..AVESTAN LETTER HE + {0x10B39, 0x10B3F, prBA, gcPo}, // [7] AVESTAN ABBREVIATION MARK..LARGE ONE RING OVER TWO RINGS PUNCTUATION + {0x10B40, 0x10B55, prAL, gcLo}, // [22] INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW + {0x10B58, 0x10B5F, prAL, gcNo}, // [8] INSCRIPTIONAL PARTHIAN NUMBER ONE..INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND + {0x10B60, 0x10B72, prAL, gcLo}, // [19] INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW + {0x10B78, 0x10B7F, prAL, gcNo}, // [8] INSCRIPTIONAL PAHLAVI NUMBER ONE..INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND + {0x10B80, 0x10B91, prAL, gcLo}, // [18] PSALTER PAHLAVI LETTER ALEPH..PSALTER PAHLAVI LETTER TAW + {0x10B99, 0x10B9C, prAL, gcPo}, // [4] PSALTER PAHLAVI SECTION MARK..PSALTER PAHLAVI FOUR DOTS WITH DOT + {0x10BA9, 0x10BAF, prAL, gcNo}, // [7] PSALTER PAHLAVI NUMBER ONE..PSALTER PAHLAVI NUMBER ONE HUNDRED + {0x10C00, 0x10C48, prAL, gcLo}, // [73] OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH + {0x10C80, 0x10CB2, prAL, gcLu}, // [51] OLD HUNGARIAN CAPITAL LETTER A..OLD HUNGARIAN CAPITAL LETTER US + {0x10CC0, 0x10CF2, prAL, gcLl}, // [51] OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US + {0x10CFA, 0x10CFF, prAL, gcNo}, // [6] OLD HUNGARIAN NUMBER ONE..OLD HUNGARIAN NUMBER ONE THOUSAND + {0x10D00, 0x10D23, prAL, gcLo}, // [36] HANIFI ROHINGYA LETTER A..HANIFI ROHINGYA MARK NA KHONNA + {0x10D24, 0x10D27, prCM, gcMn}, // [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI + {0x10D30, 0x10D39, prNU, gcNd}, // [10] HANIFI ROHINGYA DIGIT ZERO..HANIFI ROHINGYA DIGIT NINE + {0x10E60, 0x10E7E, prAL, gcNo}, // [31] RUMI DIGIT ONE..RUMI FRACTION TWO THIRDS + {0x10E80, 0x10EA9, prAL, gcLo}, // [42] YEZIDI LETTER ELIF..YEZIDI LETTER ET + {0x10EAB, 0x10EAC, prCM, gcMn}, // [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK + {0x10EAD, 0x10EAD, prBA, gcPd}, // YEZIDI HYPHENATION MARK + {0x10EB0, 0x10EB1, prAL, gcLo}, // [2] YEZIDI LETTER LAM WITH DOT ABOVE..YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE + {0x10F00, 0x10F1C, prAL, gcLo}, // [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL + {0x10F1D, 0x10F26, prAL, gcNo}, // [10] OLD SOGDIAN NUMBER ONE..OLD SOGDIAN FRACTION ONE HALF + {0x10F27, 0x10F27, prAL, gcLo}, // OLD SOGDIAN LIGATURE AYIN-DALETH + {0x10F30, 0x10F45, prAL, gcLo}, // [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN + {0x10F46, 0x10F50, prCM, gcMn}, // [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW + {0x10F51, 0x10F54, prAL, gcNo}, // [4] SOGDIAN NUMBER ONE..SOGDIAN NUMBER ONE HUNDRED + {0x10F55, 0x10F59, prAL, gcPo}, // [5] SOGDIAN PUNCTUATION TWO VERTICAL BARS..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT + {0x10F70, 0x10F81, prAL, gcLo}, // [18] OLD UYGHUR LETTER ALEPH..OLD UYGHUR LETTER LESH + {0x10F82, 0x10F85, prCM, gcMn}, // [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW + {0x10F86, 0x10F89, prAL, gcPo}, // [4] OLD UYGHUR PUNCTUATION BAR..OLD UYGHUR PUNCTUATION FOUR DOTS + {0x10FB0, 0x10FC4, prAL, gcLo}, // [21] CHORASMIAN LETTER ALEPH..CHORASMIAN LETTER TAW + {0x10FC5, 0x10FCB, prAL, gcNo}, // [7] CHORASMIAN NUMBER ONE..CHORASMIAN NUMBER ONE HUNDRED + {0x10FE0, 0x10FF6, prAL, gcLo}, // [23] ELYMAIC LETTER ALEPH..ELYMAIC LIGATURE ZAYIN-YODH + {0x11000, 0x11000, prCM, gcMc}, // BRAHMI SIGN CANDRABINDU + {0x11001, 0x11001, prCM, gcMn}, // BRAHMI SIGN ANUSVARA + {0x11002, 0x11002, prCM, gcMc}, // BRAHMI SIGN VISARGA + {0x11003, 0x11037, prAL, gcLo}, // [53] BRAHMI SIGN JIHVAMULIYA..BRAHMI LETTER OLD TAMIL NNNA + {0x11038, 0x11046, prCM, gcMn}, // [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA + {0x11047, 0x11048, prBA, gcPo}, // [2] BRAHMI DANDA..BRAHMI DOUBLE DANDA + {0x11049, 0x1104D, prAL, gcPo}, // [5] BRAHMI PUNCTUATION DOT..BRAHMI PUNCTUATION LOTUS + {0x11052, 0x11065, prAL, gcNo}, // [20] BRAHMI NUMBER ONE..BRAHMI NUMBER ONE THOUSAND + {0x11066, 0x1106F, prNU, gcNd}, // [10] BRAHMI DIGIT ZERO..BRAHMI DIGIT NINE + {0x11070, 0x11070, prCM, gcMn}, // BRAHMI SIGN OLD TAMIL VIRAMA + {0x11071, 0x11072, prAL, gcLo}, // [2] BRAHMI LETTER OLD TAMIL SHORT E..BRAHMI LETTER OLD TAMIL SHORT O + {0x11073, 0x11074, prCM, gcMn}, // [2] BRAHMI VOWEL SIGN OLD TAMIL SHORT E..BRAHMI VOWEL SIGN OLD TAMIL SHORT O + {0x11075, 0x11075, prAL, gcLo}, // BRAHMI LETTER OLD TAMIL LLA + {0x1107F, 0x1107F, prCM, gcMn}, // BRAHMI NUMBER JOINER + {0x11080, 0x11081, prCM, gcMn}, // [2] KAITHI SIGN CANDRABINDU..KAITHI SIGN ANUSVARA + {0x11082, 0x11082, prCM, gcMc}, // KAITHI SIGN VISARGA + {0x11083, 0x110AF, prAL, gcLo}, // [45] KAITHI LETTER A..KAITHI LETTER HA + {0x110B0, 0x110B2, prCM, gcMc}, // [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II + {0x110B3, 0x110B6, prCM, gcMn}, // [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI + {0x110B7, 0x110B8, prCM, gcMc}, // [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU + {0x110B9, 0x110BA, prCM, gcMn}, // [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA + {0x110BB, 0x110BC, prAL, gcPo}, // [2] KAITHI ABBREVIATION SIGN..KAITHI ENUMERATION SIGN + {0x110BD, 0x110BD, prAL, gcCf}, // KAITHI NUMBER SIGN + {0x110BE, 0x110C1, prBA, gcPo}, // [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA + {0x110C2, 0x110C2, prCM, gcMn}, // KAITHI VOWEL SIGN VOCALIC R + {0x110CD, 0x110CD, prAL, gcCf}, // KAITHI NUMBER SIGN ABOVE + {0x110D0, 0x110E8, prAL, gcLo}, // [25] SORA SOMPENG LETTER SAH..SORA SOMPENG LETTER MAE + {0x110F0, 0x110F9, prNU, gcNd}, // [10] SORA SOMPENG DIGIT ZERO..SORA SOMPENG DIGIT NINE + {0x11100, 0x11102, prCM, gcMn}, // [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA + {0x11103, 0x11126, prAL, gcLo}, // [36] CHAKMA LETTER AA..CHAKMA LETTER HAA + {0x11127, 0x1112B, prCM, gcMn}, // [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU + {0x1112C, 0x1112C, prCM, gcMc}, // CHAKMA VOWEL SIGN E + {0x1112D, 0x11134, prCM, gcMn}, // [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA + {0x11136, 0x1113F, prNU, gcNd}, // [10] CHAKMA DIGIT ZERO..CHAKMA DIGIT NINE + {0x11140, 0x11143, prBA, gcPo}, // [4] CHAKMA SECTION MARK..CHAKMA QUESTION MARK + {0x11144, 0x11144, prAL, gcLo}, // CHAKMA LETTER LHAA + {0x11145, 0x11146, prCM, gcMc}, // [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI + {0x11147, 0x11147, prAL, gcLo}, // CHAKMA LETTER VAA + {0x11150, 0x11172, prAL, gcLo}, // [35] MAHAJANI LETTER A..MAHAJANI LETTER RRA + {0x11173, 0x11173, prCM, gcMn}, // MAHAJANI SIGN NUKTA + {0x11174, 0x11174, prAL, gcPo}, // MAHAJANI ABBREVIATION SIGN + {0x11175, 0x11175, prBB, gcPo}, // MAHAJANI SECTION MARK + {0x11176, 0x11176, prAL, gcLo}, // MAHAJANI LIGATURE SHRI + {0x11180, 0x11181, prCM, gcMn}, // [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA + {0x11182, 0x11182, prCM, gcMc}, // SHARADA SIGN VISARGA + {0x11183, 0x111B2, prAL, gcLo}, // [48] SHARADA LETTER A..SHARADA LETTER HA + {0x111B3, 0x111B5, prCM, gcMc}, // [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II + {0x111B6, 0x111BE, prCM, gcMn}, // [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O + {0x111BF, 0x111C0, prCM, gcMc}, // [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA + {0x111C1, 0x111C4, prAL, gcLo}, // [4] SHARADA SIGN AVAGRAHA..SHARADA OM + {0x111C5, 0x111C6, prBA, gcPo}, // [2] SHARADA DANDA..SHARADA DOUBLE DANDA + {0x111C7, 0x111C7, prAL, gcPo}, // SHARADA ABBREVIATION SIGN + {0x111C8, 0x111C8, prBA, gcPo}, // SHARADA SEPARATOR + {0x111C9, 0x111CC, prCM, gcMn}, // [4] SHARADA SANDHI MARK..SHARADA EXTRA SHORT VOWEL MARK + {0x111CD, 0x111CD, prAL, gcPo}, // SHARADA SUTRA MARK + {0x111CE, 0x111CE, prCM, gcMc}, // SHARADA VOWEL SIGN PRISHTHAMATRA E + {0x111CF, 0x111CF, prCM, gcMn}, // SHARADA SIGN INVERTED CANDRABINDU + {0x111D0, 0x111D9, prNU, gcNd}, // [10] SHARADA DIGIT ZERO..SHARADA DIGIT NINE + {0x111DA, 0x111DA, prAL, gcLo}, // SHARADA EKAM + {0x111DB, 0x111DB, prBB, gcPo}, // SHARADA SIGN SIDDHAM + {0x111DC, 0x111DC, prAL, gcLo}, // SHARADA HEADSTROKE + {0x111DD, 0x111DF, prBA, gcPo}, // [3] SHARADA CONTINUATION SIGN..SHARADA SECTION MARK-2 + {0x111E1, 0x111F4, prAL, gcNo}, // [20] SINHALA ARCHAIC DIGIT ONE..SINHALA ARCHAIC NUMBER ONE THOUSAND + {0x11200, 0x11211, prAL, gcLo}, // [18] KHOJKI LETTER A..KHOJKI LETTER JJA + {0x11213, 0x1122B, prAL, gcLo}, // [25] KHOJKI LETTER NYA..KHOJKI LETTER LLA + {0x1122C, 0x1122E, prCM, gcMc}, // [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II + {0x1122F, 0x11231, prCM, gcMn}, // [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI + {0x11232, 0x11233, prCM, gcMc}, // [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU + {0x11234, 0x11234, prCM, gcMn}, // KHOJKI SIGN ANUSVARA + {0x11235, 0x11235, prCM, gcMc}, // KHOJKI SIGN VIRAMA + {0x11236, 0x11237, prCM, gcMn}, // [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA + {0x11238, 0x11239, prBA, gcPo}, // [2] KHOJKI DANDA..KHOJKI DOUBLE DANDA + {0x1123A, 0x1123A, prAL, gcPo}, // KHOJKI WORD SEPARATOR + {0x1123B, 0x1123C, prBA, gcPo}, // [2] KHOJKI SECTION MARK..KHOJKI DOUBLE SECTION MARK + {0x1123D, 0x1123D, prAL, gcPo}, // KHOJKI ABBREVIATION SIGN + {0x1123E, 0x1123E, prCM, gcMn}, // KHOJKI SIGN SUKUN + {0x11280, 0x11286, prAL, gcLo}, // [7] MULTANI LETTER A..MULTANI LETTER GA + {0x11288, 0x11288, prAL, gcLo}, // MULTANI LETTER GHA + {0x1128A, 0x1128D, prAL, gcLo}, // [4] MULTANI LETTER CA..MULTANI LETTER JJA + {0x1128F, 0x1129D, prAL, gcLo}, // [15] MULTANI LETTER NYA..MULTANI LETTER BA + {0x1129F, 0x112A8, prAL, gcLo}, // [10] MULTANI LETTER BHA..MULTANI LETTER RHA + {0x112A9, 0x112A9, prBA, gcPo}, // MULTANI SECTION MARK + {0x112B0, 0x112DE, prAL, gcLo}, // [47] KHUDAWADI LETTER A..KHUDAWADI LETTER HA + {0x112DF, 0x112DF, prCM, gcMn}, // KHUDAWADI SIGN ANUSVARA + {0x112E0, 0x112E2, prCM, gcMc}, // [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II + {0x112E3, 0x112EA, prCM, gcMn}, // [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA + {0x112F0, 0x112F9, prNU, gcNd}, // [10] KHUDAWADI DIGIT ZERO..KHUDAWADI DIGIT NINE + {0x11300, 0x11301, prCM, gcMn}, // [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU + {0x11302, 0x11303, prCM, gcMc}, // [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA + {0x11305, 0x1130C, prAL, gcLo}, // [8] GRANTHA LETTER A..GRANTHA LETTER VOCALIC L + {0x1130F, 0x11310, prAL, gcLo}, // [2] GRANTHA LETTER EE..GRANTHA LETTER AI + {0x11313, 0x11328, prAL, gcLo}, // [22] GRANTHA LETTER OO..GRANTHA LETTER NA + {0x1132A, 0x11330, prAL, gcLo}, // [7] GRANTHA LETTER PA..GRANTHA LETTER RA + {0x11332, 0x11333, prAL, gcLo}, // [2] GRANTHA LETTER LA..GRANTHA LETTER LLA + {0x11335, 0x11339, prAL, gcLo}, // [5] GRANTHA LETTER VA..GRANTHA LETTER HA + {0x1133B, 0x1133C, prCM, gcMn}, // [2] COMBINING BINDU BELOW..GRANTHA SIGN NUKTA + {0x1133D, 0x1133D, prAL, gcLo}, // GRANTHA SIGN AVAGRAHA + {0x1133E, 0x1133F, prCM, gcMc}, // [2] GRANTHA VOWEL SIGN AA..GRANTHA VOWEL SIGN I + {0x11340, 0x11340, prCM, gcMn}, // GRANTHA VOWEL SIGN II + {0x11341, 0x11344, prCM, gcMc}, // [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR + {0x11347, 0x11348, prCM, gcMc}, // [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI + {0x1134B, 0x1134D, prCM, gcMc}, // [3] GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA + {0x11350, 0x11350, prAL, gcLo}, // GRANTHA OM + {0x11357, 0x11357, prCM, gcMc}, // GRANTHA AU LENGTH MARK + {0x1135D, 0x11361, prAL, gcLo}, // [5] GRANTHA SIGN PLUTA..GRANTHA LETTER VOCALIC LL + {0x11362, 0x11363, prCM, gcMc}, // [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL + {0x11366, 0x1136C, prCM, gcMn}, // [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX + {0x11370, 0x11374, prCM, gcMn}, // [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA + {0x11400, 0x11434, prAL, gcLo}, // [53] NEWA LETTER A..NEWA LETTER HA + {0x11435, 0x11437, prCM, gcMc}, // [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II + {0x11438, 0x1143F, prCM, gcMn}, // [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI + {0x11440, 0x11441, prCM, gcMc}, // [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU + {0x11442, 0x11444, prCM, gcMn}, // [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA + {0x11445, 0x11445, prCM, gcMc}, // NEWA SIGN VISARGA + {0x11446, 0x11446, prCM, gcMn}, // NEWA SIGN NUKTA + {0x11447, 0x1144A, prAL, gcLo}, // [4] NEWA SIGN AVAGRAHA..NEWA SIDDHI + {0x1144B, 0x1144E, prBA, gcPo}, // [4] NEWA DANDA..NEWA GAP FILLER + {0x1144F, 0x1144F, prAL, gcPo}, // NEWA ABBREVIATION SIGN + {0x11450, 0x11459, prNU, gcNd}, // [10] NEWA DIGIT ZERO..NEWA DIGIT NINE + {0x1145A, 0x1145B, prBA, gcPo}, // [2] NEWA DOUBLE COMMA..NEWA PLACEHOLDER MARK + {0x1145D, 0x1145D, prAL, gcPo}, // NEWA INSERTION SIGN + {0x1145E, 0x1145E, prCM, gcMn}, // NEWA SANDHI MARK + {0x1145F, 0x11461, prAL, gcLo}, // [3] NEWA LETTER VEDIC ANUSVARA..NEWA SIGN UPADHMANIYA + {0x11480, 0x114AF, prAL, gcLo}, // [48] TIRHUTA ANJI..TIRHUTA LETTER HA + {0x114B0, 0x114B2, prCM, gcMc}, // [3] TIRHUTA VOWEL SIGN AA..TIRHUTA VOWEL SIGN II + {0x114B3, 0x114B8, prCM, gcMn}, // [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL + {0x114B9, 0x114B9, prCM, gcMc}, // TIRHUTA VOWEL SIGN E + {0x114BA, 0x114BA, prCM, gcMn}, // TIRHUTA VOWEL SIGN SHORT E + {0x114BB, 0x114BE, prCM, gcMc}, // [4] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN AU + {0x114BF, 0x114C0, prCM, gcMn}, // [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA + {0x114C1, 0x114C1, prCM, gcMc}, // TIRHUTA SIGN VISARGA + {0x114C2, 0x114C3, prCM, gcMn}, // [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA + {0x114C4, 0x114C5, prAL, gcLo}, // [2] TIRHUTA SIGN AVAGRAHA..TIRHUTA GVANG + {0x114C6, 0x114C6, prAL, gcPo}, // TIRHUTA ABBREVIATION SIGN + {0x114C7, 0x114C7, prAL, gcLo}, // TIRHUTA OM + {0x114D0, 0x114D9, prNU, gcNd}, // [10] TIRHUTA DIGIT ZERO..TIRHUTA DIGIT NINE + {0x11580, 0x115AE, prAL, gcLo}, // [47] SIDDHAM LETTER A..SIDDHAM LETTER HA + {0x115AF, 0x115B1, prCM, gcMc}, // [3] SIDDHAM VOWEL SIGN AA..SIDDHAM VOWEL SIGN II + {0x115B2, 0x115B5, prCM, gcMn}, // [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR + {0x115B8, 0x115BB, prCM, gcMc}, // [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU + {0x115BC, 0x115BD, prCM, gcMn}, // [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA + {0x115BE, 0x115BE, prCM, gcMc}, // SIDDHAM SIGN VISARGA + {0x115BF, 0x115C0, prCM, gcMn}, // [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA + {0x115C1, 0x115C1, prBB, gcPo}, // SIDDHAM SIGN SIDDHAM + {0x115C2, 0x115C3, prBA, gcPo}, // [2] SIDDHAM DANDA..SIDDHAM DOUBLE DANDA + {0x115C4, 0x115C5, prEX, gcPo}, // [2] SIDDHAM SEPARATOR DOT..SIDDHAM SEPARATOR BAR + {0x115C6, 0x115C8, prAL, gcPo}, // [3] SIDDHAM REPETITION MARK-1..SIDDHAM REPETITION MARK-3 + {0x115C9, 0x115D7, prBA, gcPo}, // [15] SIDDHAM END OF TEXT MARK..SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES + {0x115D8, 0x115DB, prAL, gcLo}, // [4] SIDDHAM LETTER THREE-CIRCLE ALTERNATE I..SIDDHAM LETTER ALTERNATE U + {0x115DC, 0x115DD, prCM, gcMn}, // [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU + {0x11600, 0x1162F, prAL, gcLo}, // [48] MODI LETTER A..MODI LETTER LLA + {0x11630, 0x11632, prCM, gcMc}, // [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II + {0x11633, 0x1163A, prCM, gcMn}, // [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI + {0x1163B, 0x1163C, prCM, gcMc}, // [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU + {0x1163D, 0x1163D, prCM, gcMn}, // MODI SIGN ANUSVARA + {0x1163E, 0x1163E, prCM, gcMc}, // MODI SIGN VISARGA + {0x1163F, 0x11640, prCM, gcMn}, // [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA + {0x11641, 0x11642, prBA, gcPo}, // [2] MODI DANDA..MODI DOUBLE DANDA + {0x11643, 0x11643, prAL, gcPo}, // MODI ABBREVIATION SIGN + {0x11644, 0x11644, prAL, gcLo}, // MODI SIGN HUVA + {0x11650, 0x11659, prNU, gcNd}, // [10] MODI DIGIT ZERO..MODI DIGIT NINE + {0x11660, 0x1166C, prBB, gcPo}, // [13] MONGOLIAN BIRGA WITH ORNAMENT..MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT + {0x11680, 0x116AA, prAL, gcLo}, // [43] TAKRI LETTER A..TAKRI LETTER RRA + {0x116AB, 0x116AB, prCM, gcMn}, // TAKRI SIGN ANUSVARA + {0x116AC, 0x116AC, prCM, gcMc}, // TAKRI SIGN VISARGA + {0x116AD, 0x116AD, prCM, gcMn}, // TAKRI VOWEL SIGN AA + {0x116AE, 0x116AF, prCM, gcMc}, // [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II + {0x116B0, 0x116B5, prCM, gcMn}, // [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU + {0x116B6, 0x116B6, prCM, gcMc}, // TAKRI SIGN VIRAMA + {0x116B7, 0x116B7, prCM, gcMn}, // TAKRI SIGN NUKTA + {0x116B8, 0x116B8, prAL, gcLo}, // TAKRI LETTER ARCHAIC KHA + {0x116B9, 0x116B9, prAL, gcPo}, // TAKRI ABBREVIATION SIGN + {0x116C0, 0x116C9, prNU, gcNd}, // [10] TAKRI DIGIT ZERO..TAKRI DIGIT NINE + {0x11700, 0x1171A, prSA, gcLo}, // [27] AHOM LETTER KA..AHOM LETTER ALTERNATE BA + {0x1171D, 0x1171F, prSA, gcMn}, // [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA + {0x11720, 0x11721, prSA, gcMc}, // [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA + {0x11722, 0x11725, prSA, gcMn}, // [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU + {0x11726, 0x11726, prSA, gcMc}, // AHOM VOWEL SIGN E + {0x11727, 0x1172B, prSA, gcMn}, // [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER + {0x11730, 0x11739, prNU, gcNd}, // [10] AHOM DIGIT ZERO..AHOM DIGIT NINE + {0x1173A, 0x1173B, prSA, gcNo}, // [2] AHOM NUMBER TEN..AHOM NUMBER TWENTY + {0x1173C, 0x1173E, prBA, gcPo}, // [3] AHOM SIGN SMALL SECTION..AHOM SIGN RULAI + {0x1173F, 0x1173F, prSA, gcSo}, // AHOM SYMBOL VI + {0x11740, 0x11746, prSA, gcLo}, // [7] AHOM LETTER CA..AHOM LETTER LLA + {0x11800, 0x1182B, prAL, gcLo}, // [44] DOGRA LETTER A..DOGRA LETTER RRA + {0x1182C, 0x1182E, prCM, gcMc}, // [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II + {0x1182F, 0x11837, prCM, gcMn}, // [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA + {0x11838, 0x11838, prCM, gcMc}, // DOGRA SIGN VISARGA + {0x11839, 0x1183A, prCM, gcMn}, // [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA + {0x1183B, 0x1183B, prAL, gcPo}, // DOGRA ABBREVIATION SIGN + {0x118A0, 0x118DF, prAL, gcLC}, // [64] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI SMALL LETTER VIYO + {0x118E0, 0x118E9, prNU, gcNd}, // [10] WARANG CITI DIGIT ZERO..WARANG CITI DIGIT NINE + {0x118EA, 0x118F2, prAL, gcNo}, // [9] WARANG CITI NUMBER TEN..WARANG CITI NUMBER NINETY + {0x118FF, 0x118FF, prAL, gcLo}, // WARANG CITI OM + {0x11900, 0x11906, prAL, gcLo}, // [7] DIVES AKURU LETTER A..DIVES AKURU LETTER E + {0x11909, 0x11909, prAL, gcLo}, // DIVES AKURU LETTER O + {0x1190C, 0x11913, prAL, gcLo}, // [8] DIVES AKURU LETTER KA..DIVES AKURU LETTER JA + {0x11915, 0x11916, prAL, gcLo}, // [2] DIVES AKURU LETTER NYA..DIVES AKURU LETTER TTA + {0x11918, 0x1192F, prAL, gcLo}, // [24] DIVES AKURU LETTER DDA..DIVES AKURU LETTER ZA + {0x11930, 0x11935, prCM, gcMc}, // [6] DIVES AKURU VOWEL SIGN AA..DIVES AKURU VOWEL SIGN E + {0x11937, 0x11938, prCM, gcMc}, // [2] DIVES AKURU VOWEL SIGN AI..DIVES AKURU VOWEL SIGN O + {0x1193B, 0x1193C, prCM, gcMn}, // [2] DIVES AKURU SIGN ANUSVARA..DIVES AKURU SIGN CANDRABINDU + {0x1193D, 0x1193D, prCM, gcMc}, // DIVES AKURU SIGN HALANTA + {0x1193E, 0x1193E, prCM, gcMn}, // DIVES AKURU VIRAMA + {0x1193F, 0x1193F, prAL, gcLo}, // DIVES AKURU PREFIXED NASAL SIGN + {0x11940, 0x11940, prCM, gcMc}, // DIVES AKURU MEDIAL YA + {0x11941, 0x11941, prAL, gcLo}, // DIVES AKURU INITIAL RA + {0x11942, 0x11942, prCM, gcMc}, // DIVES AKURU MEDIAL RA + {0x11943, 0x11943, prCM, gcMn}, // DIVES AKURU SIGN NUKTA + {0x11944, 0x11946, prBA, gcPo}, // [3] DIVES AKURU DOUBLE DANDA..DIVES AKURU END OF TEXT MARK + {0x11950, 0x11959, prNU, gcNd}, // [10] DIVES AKURU DIGIT ZERO..DIVES AKURU DIGIT NINE + {0x119A0, 0x119A7, prAL, gcLo}, // [8] NANDINAGARI LETTER A..NANDINAGARI LETTER VOCALIC RR + {0x119AA, 0x119D0, prAL, gcLo}, // [39] NANDINAGARI LETTER E..NANDINAGARI LETTER RRA + {0x119D1, 0x119D3, prCM, gcMc}, // [3] NANDINAGARI VOWEL SIGN AA..NANDINAGARI VOWEL SIGN II + {0x119D4, 0x119D7, prCM, gcMn}, // [4] NANDINAGARI VOWEL SIGN U..NANDINAGARI VOWEL SIGN VOCALIC RR + {0x119DA, 0x119DB, prCM, gcMn}, // [2] NANDINAGARI VOWEL SIGN E..NANDINAGARI VOWEL SIGN AI + {0x119DC, 0x119DF, prCM, gcMc}, // [4] NANDINAGARI VOWEL SIGN O..NANDINAGARI SIGN VISARGA + {0x119E0, 0x119E0, prCM, gcMn}, // NANDINAGARI SIGN VIRAMA + {0x119E1, 0x119E1, prAL, gcLo}, // NANDINAGARI SIGN AVAGRAHA + {0x119E2, 0x119E2, prBB, gcPo}, // NANDINAGARI SIGN SIDDHAM + {0x119E3, 0x119E3, prAL, gcLo}, // NANDINAGARI HEADSTROKE + {0x119E4, 0x119E4, prCM, gcMc}, // NANDINAGARI VOWEL SIGN PRISHTHAMATRA E + {0x11A00, 0x11A00, prAL, gcLo}, // ZANABAZAR SQUARE LETTER A + {0x11A01, 0x11A0A, prCM, gcMn}, // [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK + {0x11A0B, 0x11A32, prAL, gcLo}, // [40] ZANABAZAR SQUARE LETTER KA..ZANABAZAR SQUARE LETTER KSSA + {0x11A33, 0x11A38, prCM, gcMn}, // [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA + {0x11A39, 0x11A39, prCM, gcMc}, // ZANABAZAR SQUARE SIGN VISARGA + {0x11A3A, 0x11A3A, prAL, gcLo}, // ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA + {0x11A3B, 0x11A3E, prCM, gcMn}, // [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA + {0x11A3F, 0x11A3F, prBB, gcPo}, // ZANABAZAR SQUARE INITIAL HEAD MARK + {0x11A40, 0x11A40, prAL, gcPo}, // ZANABAZAR SQUARE CLOSING HEAD MARK + {0x11A41, 0x11A44, prBA, gcPo}, // [4] ZANABAZAR SQUARE MARK TSHEG..ZANABAZAR SQUARE MARK LONG TSHEG + {0x11A45, 0x11A45, prBB, gcPo}, // ZANABAZAR SQUARE INITIAL DOUBLE-LINED HEAD MARK + {0x11A46, 0x11A46, prAL, gcPo}, // ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK + {0x11A47, 0x11A47, prCM, gcMn}, // ZANABAZAR SQUARE SUBJOINER + {0x11A50, 0x11A50, prAL, gcLo}, // SOYOMBO LETTER A + {0x11A51, 0x11A56, prCM, gcMn}, // [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE + {0x11A57, 0x11A58, prCM, gcMc}, // [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU + {0x11A59, 0x11A5B, prCM, gcMn}, // [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK + {0x11A5C, 0x11A89, prAL, gcLo}, // [46] SOYOMBO LETTER KA..SOYOMBO CLUSTER-INITIAL LETTER SA + {0x11A8A, 0x11A96, prCM, gcMn}, // [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA + {0x11A97, 0x11A97, prCM, gcMc}, // SOYOMBO SIGN VISARGA + {0x11A98, 0x11A99, prCM, gcMn}, // [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER + {0x11A9A, 0x11A9C, prBA, gcPo}, // [3] SOYOMBO MARK TSHEG..SOYOMBO MARK DOUBLE SHAD + {0x11A9D, 0x11A9D, prAL, gcLo}, // SOYOMBO MARK PLUTA + {0x11A9E, 0x11AA0, prBB, gcPo}, // [3] SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO HEAD MARK WITH MOON AND SUN + {0x11AA1, 0x11AA2, prBA, gcPo}, // [2] SOYOMBO TERMINAL MARK-1..SOYOMBO TERMINAL MARK-2 + {0x11AB0, 0x11ABF, prAL, gcLo}, // [16] CANADIAN SYLLABICS NATTILIK HI..CANADIAN SYLLABICS SPA + {0x11AC0, 0x11AF8, prAL, gcLo}, // [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL + {0x11C00, 0x11C08, prAL, gcLo}, // [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L + {0x11C0A, 0x11C2E, prAL, gcLo}, // [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA + {0x11C2F, 0x11C2F, prCM, gcMc}, // BHAIKSUKI VOWEL SIGN AA + {0x11C30, 0x11C36, prCM, gcMn}, // [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L + {0x11C38, 0x11C3D, prCM, gcMn}, // [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA + {0x11C3E, 0x11C3E, prCM, gcMc}, // BHAIKSUKI SIGN VISARGA + {0x11C3F, 0x11C3F, prCM, gcMn}, // BHAIKSUKI SIGN VIRAMA + {0x11C40, 0x11C40, prAL, gcLo}, // BHAIKSUKI SIGN AVAGRAHA + {0x11C41, 0x11C45, prBA, gcPo}, // [5] BHAIKSUKI DANDA..BHAIKSUKI GAP FILLER-2 + {0x11C50, 0x11C59, prNU, gcNd}, // [10] BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE + {0x11C5A, 0x11C6C, prAL, gcNo}, // [19] BHAIKSUKI NUMBER ONE..BHAIKSUKI HUNDREDS UNIT MARK + {0x11C70, 0x11C70, prBB, gcPo}, // MARCHEN HEAD MARK + {0x11C71, 0x11C71, prEX, gcPo}, // MARCHEN MARK SHAD + {0x11C72, 0x11C8F, prAL, gcLo}, // [30] MARCHEN LETTER KA..MARCHEN LETTER A + {0x11C92, 0x11CA7, prCM, gcMn}, // [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA + {0x11CA9, 0x11CA9, prCM, gcMc}, // MARCHEN SUBJOINED LETTER YA + {0x11CAA, 0x11CB0, prCM, gcMn}, // [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA + {0x11CB1, 0x11CB1, prCM, gcMc}, // MARCHEN VOWEL SIGN I + {0x11CB2, 0x11CB3, prCM, gcMn}, // [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E + {0x11CB4, 0x11CB4, prCM, gcMc}, // MARCHEN VOWEL SIGN O + {0x11CB5, 0x11CB6, prCM, gcMn}, // [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU + {0x11D00, 0x11D06, prAL, gcLo}, // [7] MASARAM GONDI LETTER A..MASARAM GONDI LETTER E + {0x11D08, 0x11D09, prAL, gcLo}, // [2] MASARAM GONDI LETTER AI..MASARAM GONDI LETTER O + {0x11D0B, 0x11D30, prAL, gcLo}, // [38] MASARAM GONDI LETTER AU..MASARAM GONDI LETTER TRA + {0x11D31, 0x11D36, prCM, gcMn}, // [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R + {0x11D3A, 0x11D3A, prCM, gcMn}, // MASARAM GONDI VOWEL SIGN E + {0x11D3C, 0x11D3D, prCM, gcMn}, // [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O + {0x11D3F, 0x11D45, prCM, gcMn}, // [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA + {0x11D46, 0x11D46, prAL, gcLo}, // MASARAM GONDI REPHA + {0x11D47, 0x11D47, prCM, gcMn}, // MASARAM GONDI RA-KARA + {0x11D50, 0x11D59, prNU, gcNd}, // [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE + {0x11D60, 0x11D65, prAL, gcLo}, // [6] GUNJALA GONDI LETTER A..GUNJALA GONDI LETTER UU + {0x11D67, 0x11D68, prAL, gcLo}, // [2] GUNJALA GONDI LETTER EE..GUNJALA GONDI LETTER AI + {0x11D6A, 0x11D89, prAL, gcLo}, // [32] GUNJALA GONDI LETTER OO..GUNJALA GONDI LETTER SA + {0x11D8A, 0x11D8E, prCM, gcMc}, // [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU + {0x11D90, 0x11D91, prCM, gcMn}, // [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI + {0x11D93, 0x11D94, prCM, gcMc}, // [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU + {0x11D95, 0x11D95, prCM, gcMn}, // GUNJALA GONDI SIGN ANUSVARA + {0x11D96, 0x11D96, prCM, gcMc}, // GUNJALA GONDI SIGN VISARGA + {0x11D97, 0x11D97, prCM, gcMn}, // GUNJALA GONDI VIRAMA + {0x11D98, 0x11D98, prAL, gcLo}, // GUNJALA GONDI OM + {0x11DA0, 0x11DA9, prNU, gcNd}, // [10] GUNJALA GONDI DIGIT ZERO..GUNJALA GONDI DIGIT NINE + {0x11EE0, 0x11EF2, prAL, gcLo}, // [19] MAKASAR LETTER KA..MAKASAR ANGKA + {0x11EF3, 0x11EF4, prCM, gcMn}, // [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U + {0x11EF5, 0x11EF6, prCM, gcMc}, // [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O + {0x11EF7, 0x11EF8, prAL, gcPo}, // [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION + {0x11FB0, 0x11FB0, prAL, gcLo}, // LISU LETTER YHA + {0x11FC0, 0x11FD4, prAL, gcNo}, // [21] TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH..TAMIL FRACTION DOWNSCALING FACTOR KIIZH + {0x11FD5, 0x11FDC, prAL, gcSo}, // [8] TAMIL SIGN NEL..TAMIL SIGN MUKKURUNI + {0x11FDD, 0x11FE0, prPO, gcSc}, // [4] TAMIL SIGN KAACU..TAMIL SIGN VARAAKAN + {0x11FE1, 0x11FF1, prAL, gcSo}, // [17] TAMIL SIGN PAARAM..TAMIL SIGN VAKAIYARAA + {0x11FFF, 0x11FFF, prBA, gcPo}, // TAMIL PUNCTUATION END OF TEXT + {0x12000, 0x12399, prAL, gcLo}, // [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U + {0x12400, 0x1246E, prAL, gcNl}, // [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM + {0x12470, 0x12474, prBA, gcPo}, // [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON + {0x12480, 0x12543, prAL, gcLo}, // [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU + {0x12F90, 0x12FF0, prAL, gcLo}, // [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114 + {0x12FF1, 0x12FF2, prAL, gcPo}, // [2] CYPRO-MINOAN SIGN CM301..CYPRO-MINOAN SIGN CM302 + {0x13000, 0x13257, prAL, gcLo}, // [600] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH O006 + {0x13258, 0x1325A, prOP, gcLo}, // [3] EGYPTIAN HIEROGLYPH O006A..EGYPTIAN HIEROGLYPH O006C + {0x1325B, 0x1325D, prCL, gcLo}, // [3] EGYPTIAN HIEROGLYPH O006D..EGYPTIAN HIEROGLYPH O006F + {0x1325E, 0x13281, prAL, gcLo}, // [36] EGYPTIAN HIEROGLYPH O007..EGYPTIAN HIEROGLYPH O033 + {0x13282, 0x13282, prCL, gcLo}, // EGYPTIAN HIEROGLYPH O033A + {0x13283, 0x13285, prAL, gcLo}, // [3] EGYPTIAN HIEROGLYPH O034..EGYPTIAN HIEROGLYPH O036 + {0x13286, 0x13286, prOP, gcLo}, // EGYPTIAN HIEROGLYPH O036A + {0x13287, 0x13287, prCL, gcLo}, // EGYPTIAN HIEROGLYPH O036B + {0x13288, 0x13288, prOP, gcLo}, // EGYPTIAN HIEROGLYPH O036C + {0x13289, 0x13289, prCL, gcLo}, // EGYPTIAN HIEROGLYPH O036D + {0x1328A, 0x13378, prAL, gcLo}, // [239] EGYPTIAN HIEROGLYPH O037..EGYPTIAN HIEROGLYPH V011 + {0x13379, 0x13379, prOP, gcLo}, // EGYPTIAN HIEROGLYPH V011A + {0x1337A, 0x1337B, prCL, gcLo}, // [2] EGYPTIAN HIEROGLYPH V011B..EGYPTIAN HIEROGLYPH V011C + {0x1337C, 0x1342E, prAL, gcLo}, // [179] EGYPTIAN HIEROGLYPH V012..EGYPTIAN HIEROGLYPH AA032 + {0x13430, 0x13436, prGL, gcCf}, // [7] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH OVERLAY MIDDLE + {0x13437, 0x13437, prOP, gcCf}, // EGYPTIAN HIEROGLYPH BEGIN SEGMENT + {0x13438, 0x13438, prCL, gcCf}, // EGYPTIAN HIEROGLYPH END SEGMENT + {0x14400, 0x145CD, prAL, gcLo}, // [462] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A409 + {0x145CE, 0x145CE, prOP, gcLo}, // ANATOLIAN HIEROGLYPH A410 BEGIN LOGOGRAM MARK + {0x145CF, 0x145CF, prCL, gcLo}, // ANATOLIAN HIEROGLYPH A410A END LOGOGRAM MARK + {0x145D0, 0x14646, prAL, gcLo}, // [119] ANATOLIAN HIEROGLYPH A411..ANATOLIAN HIEROGLYPH A530 + {0x16800, 0x16A38, prAL, gcLo}, // [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ + {0x16A40, 0x16A5E, prAL, gcLo}, // [31] MRO LETTER TA..MRO LETTER TEK + {0x16A60, 0x16A69, prNU, gcNd}, // [10] MRO DIGIT ZERO..MRO DIGIT NINE + {0x16A6E, 0x16A6F, prBA, gcPo}, // [2] MRO DANDA..MRO DOUBLE DANDA + {0x16A70, 0x16ABE, prAL, gcLo}, // [79] TANGSA LETTER OZ..TANGSA LETTER ZA + {0x16AC0, 0x16AC9, prNU, gcNd}, // [10] TANGSA DIGIT ZERO..TANGSA DIGIT NINE + {0x16AD0, 0x16AED, prAL, gcLo}, // [30] BASSA VAH LETTER ENNI..BASSA VAH LETTER I + {0x16AF0, 0x16AF4, prCM, gcMn}, // [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE + {0x16AF5, 0x16AF5, prBA, gcPo}, // BASSA VAH FULL STOP + {0x16B00, 0x16B2F, prAL, gcLo}, // [48] PAHAWH HMONG VOWEL KEEB..PAHAWH HMONG CONSONANT CAU + {0x16B30, 0x16B36, prCM, gcMn}, // [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM + {0x16B37, 0x16B39, prBA, gcPo}, // [3] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN CIM CHEEM + {0x16B3A, 0x16B3B, prAL, gcPo}, // [2] PAHAWH HMONG SIGN VOS THIAB..PAHAWH HMONG SIGN VOS FEEM + {0x16B3C, 0x16B3F, prAL, gcSo}, // [4] PAHAWH HMONG SIGN XYEEM NTXIV..PAHAWH HMONG SIGN XYEEM FAIB + {0x16B40, 0x16B43, prAL, gcLm}, // [4] PAHAWH HMONG SIGN VOS SEEV..PAHAWH HMONG SIGN IB YAM + {0x16B44, 0x16B44, prBA, gcPo}, // PAHAWH HMONG SIGN XAUS + {0x16B45, 0x16B45, prAL, gcSo}, // PAHAWH HMONG SIGN CIM TSOV ROG + {0x16B50, 0x16B59, prNU, gcNd}, // [10] PAHAWH HMONG DIGIT ZERO..PAHAWH HMONG DIGIT NINE + {0x16B5B, 0x16B61, prAL, gcNo}, // [7] PAHAWH HMONG NUMBER TENS..PAHAWH HMONG NUMBER TRILLIONS + {0x16B63, 0x16B77, prAL, gcLo}, // [21] PAHAWH HMONG SIGN VOS LUB..PAHAWH HMONG SIGN CIM NRES TOS + {0x16B7D, 0x16B8F, prAL, gcLo}, // [19] PAHAWH HMONG CLAN SIGN TSHEEJ..PAHAWH HMONG CLAN SIGN VWJ + {0x16E40, 0x16E7F, prAL, gcLC}, // [64] MEDEFAIDRIN CAPITAL LETTER M..MEDEFAIDRIN SMALL LETTER Y + {0x16E80, 0x16E96, prAL, gcNo}, // [23] MEDEFAIDRIN DIGIT ZERO..MEDEFAIDRIN DIGIT THREE ALTERNATE FORM + {0x16E97, 0x16E98, prBA, gcPo}, // [2] MEDEFAIDRIN COMMA..MEDEFAIDRIN FULL STOP + {0x16E99, 0x16E9A, prAL, gcPo}, // [2] MEDEFAIDRIN SYMBOL AIVA..MEDEFAIDRIN EXCLAMATION OH + {0x16F00, 0x16F4A, prAL, gcLo}, // [75] MIAO LETTER PA..MIAO LETTER RTE + {0x16F4F, 0x16F4F, prCM, gcMn}, // MIAO SIGN CONSONANT MODIFIER BAR + {0x16F50, 0x16F50, prAL, gcLo}, // MIAO LETTER NASALIZATION + {0x16F51, 0x16F87, prCM, gcMc}, // [55] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN UI + {0x16F8F, 0x16F92, prCM, gcMn}, // [4] MIAO TONE RIGHT..MIAO TONE BELOW + {0x16F93, 0x16F9F, prAL, gcLm}, // [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 + {0x16FE0, 0x16FE1, prNS, gcLm}, // [2] TANGUT ITERATION MARK..NUSHU ITERATION MARK + {0x16FE2, 0x16FE2, prNS, gcPo}, // OLD CHINESE HOOK MARK + {0x16FE3, 0x16FE3, prNS, gcLm}, // OLD CHINESE ITERATION MARK + {0x16FE4, 0x16FE4, prGL, gcMn}, // KHITAN SMALL SCRIPT FILLER + {0x16FF0, 0x16FF1, prCM, gcMc}, // [2] VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY + {0x17000, 0x187F7, prID, gcLo}, // [6136] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187F7 + {0x18800, 0x18AFF, prID, gcLo}, // [768] TANGUT COMPONENT-001..TANGUT COMPONENT-768 + {0x18B00, 0x18CD5, prAL, gcLo}, // [470] KHITAN SMALL SCRIPT CHARACTER-18B00..KHITAN SMALL SCRIPT CHARACTER-18CD5 + {0x18D00, 0x18D08, prID, gcLo}, // [9] TANGUT IDEOGRAPH-18D00..TANGUT IDEOGRAPH-18D08 + {0x1AFF0, 0x1AFF3, prAL, gcLm}, // [4] KATAKANA LETTER MINNAN TONE-2..KATAKANA LETTER MINNAN TONE-5 + {0x1AFF5, 0x1AFFB, prAL, gcLm}, // [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5 + {0x1AFFD, 0x1AFFE, prAL, gcLm}, // [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8 + {0x1B000, 0x1B0FF, prID, gcLo}, // [256] KATAKANA LETTER ARCHAIC E..HENTAIGANA LETTER RE-2 + {0x1B100, 0x1B122, prID, gcLo}, // [35] HENTAIGANA LETTER RE-3..KATAKANA LETTER ARCHAIC WU + {0x1B150, 0x1B152, prCJ, gcLo}, // [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO + {0x1B164, 0x1B167, prCJ, gcLo}, // [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N + {0x1B170, 0x1B2FB, prID, gcLo}, // [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB + {0x1BC00, 0x1BC6A, prAL, gcLo}, // [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M + {0x1BC70, 0x1BC7C, prAL, gcLo}, // [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK + {0x1BC80, 0x1BC88, prAL, gcLo}, // [9] DUPLOYAN AFFIX HIGH ACUTE..DUPLOYAN AFFIX HIGH VERTICAL + {0x1BC90, 0x1BC99, prAL, gcLo}, // [10] DUPLOYAN AFFIX LOW ACUTE..DUPLOYAN AFFIX LOW ARROW + {0x1BC9C, 0x1BC9C, prAL, gcSo}, // DUPLOYAN SIGN O WITH CROSS + {0x1BC9D, 0x1BC9E, prCM, gcMn}, // [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK + {0x1BC9F, 0x1BC9F, prBA, gcPo}, // DUPLOYAN PUNCTUATION CHINOOK FULL STOP + {0x1BCA0, 0x1BCA3, prCM, gcCf}, // [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP + {0x1CF00, 0x1CF2D, prCM, gcMn}, // [46] ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON LEFT..ZNAMENNY COMBINING MARK KRYZH ON LEFT + {0x1CF30, 0x1CF46, prCM, gcMn}, // [23] ZNAMENNY COMBINING TONAL RANGE MARK MRACHNO..ZNAMENNY PRIZNAK MODIFIER ROG + {0x1CF50, 0x1CFC3, prAL, gcSo}, // [116] ZNAMENNY NEUME KRYUK..ZNAMENNY NEUME PAUK + {0x1D000, 0x1D0F5, prAL, gcSo}, // [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO + {0x1D100, 0x1D126, prAL, gcSo}, // [39] MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2 + {0x1D129, 0x1D164, prAL, gcSo}, // [60] MUSICAL SYMBOL MULTIPLE MEASURE REST..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE + {0x1D165, 0x1D166, prCM, gcMc}, // [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM + {0x1D167, 0x1D169, prCM, gcMn}, // [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 + {0x1D16A, 0x1D16C, prAL, gcSo}, // [3] MUSICAL SYMBOL FINGERED TREMOLO-1..MUSICAL SYMBOL FINGERED TREMOLO-3 + {0x1D16D, 0x1D172, prCM, gcMc}, // [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 + {0x1D173, 0x1D17A, prCM, gcCf}, // [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE + {0x1D17B, 0x1D182, prCM, gcMn}, // [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE + {0x1D183, 0x1D184, prAL, gcSo}, // [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN + {0x1D185, 0x1D18B, prCM, gcMn}, // [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE + {0x1D18C, 0x1D1A9, prAL, gcSo}, // [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH + {0x1D1AA, 0x1D1AD, prCM, gcMn}, // [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO + {0x1D1AE, 0x1D1EA, prAL, gcSo}, // [61] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL KORON + {0x1D200, 0x1D241, prAL, gcSo}, // [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54 + {0x1D242, 0x1D244, prCM, gcMn}, // [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME + {0x1D245, 0x1D245, prAL, gcSo}, // GREEK MUSICAL LEIMMA + {0x1D2E0, 0x1D2F3, prAL, gcNo}, // [20] MAYAN NUMERAL ZERO..MAYAN NUMERAL NINETEEN + {0x1D300, 0x1D356, prAL, gcSo}, // [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING + {0x1D360, 0x1D378, prAL, gcNo}, // [25] COUNTING ROD UNIT DIGIT ONE..TALLY MARK FIVE + {0x1D400, 0x1D454, prAL, gcLC}, // [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G + {0x1D456, 0x1D49C, prAL, gcLC}, // [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A + {0x1D49E, 0x1D49F, prAL, gcLu}, // [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D + {0x1D4A2, 0x1D4A2, prAL, gcLu}, // MATHEMATICAL SCRIPT CAPITAL G + {0x1D4A5, 0x1D4A6, prAL, gcLu}, // [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K + {0x1D4A9, 0x1D4AC, prAL, gcLu}, // [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q + {0x1D4AE, 0x1D4B9, prAL, gcLC}, // [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D + {0x1D4BB, 0x1D4BB, prAL, gcLl}, // MATHEMATICAL SCRIPT SMALL F + {0x1D4BD, 0x1D4C3, prAL, gcLl}, // [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N + {0x1D4C5, 0x1D505, prAL, gcLC}, // [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B + {0x1D507, 0x1D50A, prAL, gcLu}, // [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G + {0x1D50D, 0x1D514, prAL, gcLu}, // [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q + {0x1D516, 0x1D51C, prAL, gcLu}, // [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y + {0x1D51E, 0x1D539, prAL, gcLC}, // [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B + {0x1D53B, 0x1D53E, prAL, gcLu}, // [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G + {0x1D540, 0x1D544, prAL, gcLu}, // [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M + {0x1D546, 0x1D546, prAL, gcLu}, // MATHEMATICAL DOUBLE-STRUCK CAPITAL O + {0x1D54A, 0x1D550, prAL, gcLu}, // [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y + {0x1D552, 0x1D6A5, prAL, gcLC}, // [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J + {0x1D6A8, 0x1D6C0, prAL, gcLu}, // [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA + {0x1D6C1, 0x1D6C1, prAL, gcSm}, // MATHEMATICAL BOLD NABLA + {0x1D6C2, 0x1D6DA, prAL, gcLl}, // [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA + {0x1D6DB, 0x1D6DB, prAL, gcSm}, // MATHEMATICAL BOLD PARTIAL DIFFERENTIAL + {0x1D6DC, 0x1D6FA, prAL, gcLC}, // [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA + {0x1D6FB, 0x1D6FB, prAL, gcSm}, // MATHEMATICAL ITALIC NABLA + {0x1D6FC, 0x1D714, prAL, gcLl}, // [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA + {0x1D715, 0x1D715, prAL, gcSm}, // MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL + {0x1D716, 0x1D734, prAL, gcLC}, // [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA + {0x1D735, 0x1D735, prAL, gcSm}, // MATHEMATICAL BOLD ITALIC NABLA + {0x1D736, 0x1D74E, prAL, gcLl}, // [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA + {0x1D74F, 0x1D74F, prAL, gcSm}, // MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL + {0x1D750, 0x1D76E, prAL, gcLC}, // [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA + {0x1D76F, 0x1D76F, prAL, gcSm}, // MATHEMATICAL SANS-SERIF BOLD NABLA + {0x1D770, 0x1D788, prAL, gcLl}, // [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA + {0x1D789, 0x1D789, prAL, gcSm}, // MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL + {0x1D78A, 0x1D7A8, prAL, gcLC}, // [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA + {0x1D7A9, 0x1D7A9, prAL, gcSm}, // MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA + {0x1D7AA, 0x1D7C2, prAL, gcLl}, // [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA + {0x1D7C3, 0x1D7C3, prAL, gcSm}, // MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL + {0x1D7C4, 0x1D7CB, prAL, gcLC}, // [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA + {0x1D7CE, 0x1D7FF, prNU, gcNd}, // [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE + {0x1D800, 0x1D9FF, prAL, gcSo}, // [512] SIGNWRITING HAND-FIST INDEX..SIGNWRITING HEAD + {0x1DA00, 0x1DA36, prCM, gcMn}, // [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN + {0x1DA37, 0x1DA3A, prAL, gcSo}, // [4] SIGNWRITING AIR BLOW SMALL ROTATIONS..SIGNWRITING BREATH EXHALE + {0x1DA3B, 0x1DA6C, prCM, gcMn}, // [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT + {0x1DA6D, 0x1DA74, prAL, gcSo}, // [8] SIGNWRITING SHOULDER HIP SPINE..SIGNWRITING TORSO-FLOORPLANE TWISTING + {0x1DA75, 0x1DA75, prCM, gcMn}, // SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS + {0x1DA76, 0x1DA83, prAL, gcSo}, // [14] SIGNWRITING LIMB COMBINATION..SIGNWRITING LOCATION DEPTH + {0x1DA84, 0x1DA84, prCM, gcMn}, // SIGNWRITING LOCATION HEAD NECK + {0x1DA85, 0x1DA86, prAL, gcSo}, // [2] SIGNWRITING LOCATION TORSO..SIGNWRITING LOCATION LIMBS DIGITS + {0x1DA87, 0x1DA8A, prBA, gcPo}, // [4] SIGNWRITING COMMA..SIGNWRITING COLON + {0x1DA8B, 0x1DA8B, prAL, gcPo}, // SIGNWRITING PARENTHESIS + {0x1DA9B, 0x1DA9F, prCM, gcMn}, // [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 + {0x1DAA1, 0x1DAAF, prCM, gcMn}, // [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 + {0x1DF00, 0x1DF09, prAL, gcLl}, // [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK + {0x1DF0A, 0x1DF0A, prAL, gcLo}, // LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK + {0x1DF0B, 0x1DF1E, prAL, gcLl}, // [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL + {0x1E000, 0x1E006, prCM, gcMn}, // [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE + {0x1E008, 0x1E018, prCM, gcMn}, // [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU + {0x1E01B, 0x1E021, prCM, gcMn}, // [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI + {0x1E023, 0x1E024, prCM, gcMn}, // [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS + {0x1E026, 0x1E02A, prCM, gcMn}, // [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA + {0x1E100, 0x1E12C, prAL, gcLo}, // [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W + {0x1E130, 0x1E136, prCM, gcMn}, // [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D + {0x1E137, 0x1E13D, prAL, gcLm}, // [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER + {0x1E140, 0x1E149, prNU, gcNd}, // [10] NYIAKENG PUACHUE HMONG DIGIT ZERO..NYIAKENG PUACHUE HMONG DIGIT NINE + {0x1E14E, 0x1E14E, prAL, gcLo}, // NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ + {0x1E14F, 0x1E14F, prAL, gcSo}, // NYIAKENG PUACHUE HMONG CIRCLED CA + {0x1E290, 0x1E2AD, prAL, gcLo}, // [30] TOTO LETTER PA..TOTO LETTER A + {0x1E2AE, 0x1E2AE, prCM, gcMn}, // TOTO SIGN RISING TONE + {0x1E2C0, 0x1E2EB, prAL, gcLo}, // [44] WANCHO LETTER AA..WANCHO LETTER YIH + {0x1E2EC, 0x1E2EF, prCM, gcMn}, // [4] WANCHO TONE TUP..WANCHO TONE KOINI + {0x1E2F0, 0x1E2F9, prNU, gcNd}, // [10] WANCHO DIGIT ZERO..WANCHO DIGIT NINE + {0x1E2FF, 0x1E2FF, prPR, gcSc}, // WANCHO NGUN SIGN + {0x1E7E0, 0x1E7E6, prAL, gcLo}, // [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO + {0x1E7E8, 0x1E7EB, prAL, gcLo}, // [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE + {0x1E7ED, 0x1E7EE, prAL, gcLo}, // [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE + {0x1E7F0, 0x1E7FE, prAL, gcLo}, // [15] ETHIOPIC SYLLABLE GURAGE QWI..ETHIOPIC SYLLABLE GURAGE PWEE + {0x1E800, 0x1E8C4, prAL, gcLo}, // [197] MENDE KIKAKUI SYLLABLE M001 KI..MENDE KIKAKUI SYLLABLE M060 NYON + {0x1E8C7, 0x1E8CF, prAL, gcNo}, // [9] MENDE KIKAKUI DIGIT ONE..MENDE KIKAKUI DIGIT NINE + {0x1E8D0, 0x1E8D6, prCM, gcMn}, // [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS + {0x1E900, 0x1E943, prAL, gcLC}, // [68] ADLAM CAPITAL LETTER ALIF..ADLAM SMALL LETTER SHA + {0x1E944, 0x1E94A, prCM, gcMn}, // [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA + {0x1E94B, 0x1E94B, prAL, gcLm}, // ADLAM NASALIZATION MARK + {0x1E950, 0x1E959, prNU, gcNd}, // [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE + {0x1E95E, 0x1E95F, prOP, gcPo}, // [2] ADLAM INITIAL EXCLAMATION MARK..ADLAM INITIAL QUESTION MARK + {0x1EC71, 0x1ECAB, prAL, gcNo}, // [59] INDIC SIYAQ NUMBER ONE..INDIC SIYAQ NUMBER PREFIXED NINE + {0x1ECAC, 0x1ECAC, prPO, gcSo}, // INDIC SIYAQ PLACEHOLDER + {0x1ECAD, 0x1ECAF, prAL, gcNo}, // [3] INDIC SIYAQ FRACTION ONE QUARTER..INDIC SIYAQ FRACTION THREE QUARTERS + {0x1ECB0, 0x1ECB0, prPO, gcSc}, // INDIC SIYAQ RUPEE MARK + {0x1ECB1, 0x1ECB4, prAL, gcNo}, // [4] INDIC SIYAQ NUMBER ALTERNATE ONE..INDIC SIYAQ ALTERNATE LAKH MARK + {0x1ED01, 0x1ED2D, prAL, gcNo}, // [45] OTTOMAN SIYAQ NUMBER ONE..OTTOMAN SIYAQ NUMBER NINETY THOUSAND + {0x1ED2E, 0x1ED2E, prAL, gcSo}, // OTTOMAN SIYAQ MARRATAN + {0x1ED2F, 0x1ED3D, prAL, gcNo}, // [15] OTTOMAN SIYAQ ALTERNATE NUMBER TWO..OTTOMAN SIYAQ FRACTION ONE SIXTH + {0x1EE00, 0x1EE03, prAL, gcLo}, // [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL + {0x1EE05, 0x1EE1F, prAL, gcLo}, // [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF + {0x1EE21, 0x1EE22, prAL, gcLo}, // [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM + {0x1EE24, 0x1EE24, prAL, gcLo}, // ARABIC MATHEMATICAL INITIAL HEH + {0x1EE27, 0x1EE27, prAL, gcLo}, // ARABIC MATHEMATICAL INITIAL HAH + {0x1EE29, 0x1EE32, prAL, gcLo}, // [10] ARABIC MATHEMATICAL INITIAL YEH..ARABIC MATHEMATICAL INITIAL QAF + {0x1EE34, 0x1EE37, prAL, gcLo}, // [4] ARABIC MATHEMATICAL INITIAL SHEEN..ARABIC MATHEMATICAL INITIAL KHAH + {0x1EE39, 0x1EE39, prAL, gcLo}, // ARABIC MATHEMATICAL INITIAL DAD + {0x1EE3B, 0x1EE3B, prAL, gcLo}, // ARABIC MATHEMATICAL INITIAL GHAIN + {0x1EE42, 0x1EE42, prAL, gcLo}, // ARABIC MATHEMATICAL TAILED JEEM + {0x1EE47, 0x1EE47, prAL, gcLo}, // ARABIC MATHEMATICAL TAILED HAH + {0x1EE49, 0x1EE49, prAL, gcLo}, // ARABIC MATHEMATICAL TAILED YEH + {0x1EE4B, 0x1EE4B, prAL, gcLo}, // ARABIC MATHEMATICAL TAILED LAM + {0x1EE4D, 0x1EE4F, prAL, gcLo}, // [3] ARABIC MATHEMATICAL TAILED NOON..ARABIC MATHEMATICAL TAILED AIN + {0x1EE51, 0x1EE52, prAL, gcLo}, // [2] ARABIC MATHEMATICAL TAILED SAD..ARABIC MATHEMATICAL TAILED QAF + {0x1EE54, 0x1EE54, prAL, gcLo}, // ARABIC MATHEMATICAL TAILED SHEEN + {0x1EE57, 0x1EE57, prAL, gcLo}, // ARABIC MATHEMATICAL TAILED KHAH + {0x1EE59, 0x1EE59, prAL, gcLo}, // ARABIC MATHEMATICAL TAILED DAD + {0x1EE5B, 0x1EE5B, prAL, gcLo}, // ARABIC MATHEMATICAL TAILED GHAIN + {0x1EE5D, 0x1EE5D, prAL, gcLo}, // ARABIC MATHEMATICAL TAILED DOTLESS NOON + {0x1EE5F, 0x1EE5F, prAL, gcLo}, // ARABIC MATHEMATICAL TAILED DOTLESS QAF + {0x1EE61, 0x1EE62, prAL, gcLo}, // [2] ARABIC MATHEMATICAL STRETCHED BEH..ARABIC MATHEMATICAL STRETCHED JEEM + {0x1EE64, 0x1EE64, prAL, gcLo}, // ARABIC MATHEMATICAL STRETCHED HEH + {0x1EE67, 0x1EE6A, prAL, gcLo}, // [4] ARABIC MATHEMATICAL STRETCHED HAH..ARABIC MATHEMATICAL STRETCHED KAF + {0x1EE6C, 0x1EE72, prAL, gcLo}, // [7] ARABIC MATHEMATICAL STRETCHED MEEM..ARABIC MATHEMATICAL STRETCHED QAF + {0x1EE74, 0x1EE77, prAL, gcLo}, // [4] ARABIC MATHEMATICAL STRETCHED SHEEN..ARABIC MATHEMATICAL STRETCHED KHAH + {0x1EE79, 0x1EE7C, prAL, gcLo}, // [4] ARABIC MATHEMATICAL STRETCHED DAD..ARABIC MATHEMATICAL STRETCHED DOTLESS BEH + {0x1EE7E, 0x1EE7E, prAL, gcLo}, // ARABIC MATHEMATICAL STRETCHED DOTLESS FEH + {0x1EE80, 0x1EE89, prAL, gcLo}, // [10] ARABIC MATHEMATICAL LOOPED ALEF..ARABIC MATHEMATICAL LOOPED YEH + {0x1EE8B, 0x1EE9B, prAL, gcLo}, // [17] ARABIC MATHEMATICAL LOOPED LAM..ARABIC MATHEMATICAL LOOPED GHAIN + {0x1EEA1, 0x1EEA3, prAL, gcLo}, // [3] ARABIC MATHEMATICAL DOUBLE-STRUCK BEH..ARABIC MATHEMATICAL DOUBLE-STRUCK DAL + {0x1EEA5, 0x1EEA9, prAL, gcLo}, // [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH + {0x1EEAB, 0x1EEBB, prAL, gcLo}, // [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN + {0x1EEF0, 0x1EEF1, prAL, gcSm}, // [2] ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL..ARABIC MATHEMATICAL OPERATOR HAH WITH DAL + {0x1F000, 0x1F02B, prID, gcSo}, // [44] MAHJONG TILE EAST WIND..MAHJONG TILE BACK + {0x1F02C, 0x1F02F, prID, gcCn}, // [4] .. + {0x1F030, 0x1F093, prID, gcSo}, // [100] DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06 + {0x1F094, 0x1F09F, prID, gcCn}, // [12] .. + {0x1F0A0, 0x1F0AE, prID, gcSo}, // [15] PLAYING CARD BACK..PLAYING CARD KING OF SPADES + {0x1F0AF, 0x1F0B0, prID, gcCn}, // [2] .. + {0x1F0B1, 0x1F0BF, prID, gcSo}, // [15] PLAYING CARD ACE OF HEARTS..PLAYING CARD RED JOKER + {0x1F0C0, 0x1F0C0, prID, gcCn}, // + {0x1F0C1, 0x1F0CF, prID, gcSo}, // [15] PLAYING CARD ACE OF DIAMONDS..PLAYING CARD BLACK JOKER + {0x1F0D0, 0x1F0D0, prID, gcCn}, // + {0x1F0D1, 0x1F0F5, prID, gcSo}, // [37] PLAYING CARD ACE OF CLUBS..PLAYING CARD TRUMP-21 + {0x1F0F6, 0x1F0FF, prID, gcCn}, // [10] .. + {0x1F100, 0x1F10C, prAI, gcNo}, // [13] DIGIT ZERO FULL STOP..DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO + {0x1F10D, 0x1F10F, prID, gcSo}, // [3] CIRCLED ZERO WITH SLASH..CIRCLED DOLLAR SIGN WITH OVERLAID BACKSLASH + {0x1F110, 0x1F12D, prAI, gcSo}, // [30] PARENTHESIZED LATIN CAPITAL LETTER A..CIRCLED CD + {0x1F12E, 0x1F12F, prAL, gcSo}, // [2] CIRCLED WZ..COPYLEFT SYMBOL + {0x1F130, 0x1F169, prAI, gcSo}, // [58] SQUARED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z + {0x1F16A, 0x1F16C, prAL, gcSo}, // [3] RAISED MC SIGN..RAISED MR SIGN + {0x1F16D, 0x1F16F, prID, gcSo}, // [3] CIRCLED CC..CIRCLED HUMAN FIGURE + {0x1F170, 0x1F1AC, prAI, gcSo}, // [61] NEGATIVE SQUARED LATIN CAPITAL LETTER A..SQUARED VOD + {0x1F1AD, 0x1F1AD, prID, gcSo}, // MASK WORK SYMBOL + {0x1F1AE, 0x1F1E5, prID, gcCn}, // [56] .. + {0x1F1E6, 0x1F1FF, prRI, gcSo}, // [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z + {0x1F200, 0x1F202, prID, gcSo}, // [3] SQUARE HIRAGANA HOKA..SQUARED KATAKANA SA + {0x1F203, 0x1F20F, prID, gcCn}, // [13] .. + {0x1F210, 0x1F23B, prID, gcSo}, // [44] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-914D + {0x1F23C, 0x1F23F, prID, gcCn}, // [4] .. + {0x1F240, 0x1F248, prID, gcSo}, // [9] TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C..TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 + {0x1F249, 0x1F24F, prID, gcCn}, // [7] .. + {0x1F250, 0x1F251, prID, gcSo}, // [2] CIRCLED IDEOGRAPH ADVANTAGE..CIRCLED IDEOGRAPH ACCEPT + {0x1F252, 0x1F25F, prID, gcCn}, // [14] .. + {0x1F260, 0x1F265, prID, gcSo}, // [6] ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI + {0x1F266, 0x1F2FF, prID, gcCn}, // [154] .. + {0x1F300, 0x1F384, prID, gcSo}, // [133] CYCLONE..CHRISTMAS TREE + {0x1F385, 0x1F385, prEB, gcSo}, // FATHER CHRISTMAS + {0x1F386, 0x1F39B, prID, gcSo}, // [22] FIREWORKS..CONTROL KNOBS + {0x1F39C, 0x1F39D, prAL, gcSo}, // [2] BEAMED ASCENDING MUSICAL NOTES..BEAMED DESCENDING MUSICAL NOTES + {0x1F39E, 0x1F3B4, prID, gcSo}, // [23] FILM FRAMES..FLOWER PLAYING CARDS + {0x1F3B5, 0x1F3B6, prAL, gcSo}, // [2] MUSICAL NOTE..MULTIPLE MUSICAL NOTES + {0x1F3B7, 0x1F3BB, prID, gcSo}, // [5] SAXOPHONE..VIOLIN + {0x1F3BC, 0x1F3BC, prAL, gcSo}, // MUSICAL SCORE + {0x1F3BD, 0x1F3C1, prID, gcSo}, // [5] RUNNING SHIRT WITH SASH..CHEQUERED FLAG + {0x1F3C2, 0x1F3C4, prEB, gcSo}, // [3] SNOWBOARDER..SURFER + {0x1F3C5, 0x1F3C6, prID, gcSo}, // [2] SPORTS MEDAL..TROPHY + {0x1F3C7, 0x1F3C7, prEB, gcSo}, // HORSE RACING + {0x1F3C8, 0x1F3C9, prID, gcSo}, // [2] AMERICAN FOOTBALL..RUGBY FOOTBALL + {0x1F3CA, 0x1F3CC, prEB, gcSo}, // [3] SWIMMER..GOLFER + {0x1F3CD, 0x1F3FA, prID, gcSo}, // [46] RACING MOTORCYCLE..AMPHORA + {0x1F3FB, 0x1F3FF, prEM, gcSk}, // [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 + {0x1F400, 0x1F441, prID, gcSo}, // [66] RAT..EYE + {0x1F442, 0x1F443, prEB, gcSo}, // [2] EAR..NOSE + {0x1F444, 0x1F445, prID, gcSo}, // [2] MOUTH..TONGUE + {0x1F446, 0x1F450, prEB, gcSo}, // [11] WHITE UP POINTING BACKHAND INDEX..OPEN HANDS SIGN + {0x1F451, 0x1F465, prID, gcSo}, // [21] CROWN..BUSTS IN SILHOUETTE + {0x1F466, 0x1F478, prEB, gcSo}, // [19] BOY..PRINCESS + {0x1F479, 0x1F47B, prID, gcSo}, // [3] JAPANESE OGRE..GHOST + {0x1F47C, 0x1F47C, prEB, gcSo}, // BABY ANGEL + {0x1F47D, 0x1F480, prID, gcSo}, // [4] EXTRATERRESTRIAL ALIEN..SKULL + {0x1F481, 0x1F483, prEB, gcSo}, // [3] INFORMATION DESK PERSON..DANCER + {0x1F484, 0x1F484, prID, gcSo}, // LIPSTICK + {0x1F485, 0x1F487, prEB, gcSo}, // [3] NAIL POLISH..HAIRCUT + {0x1F488, 0x1F48E, prID, gcSo}, // [7] BARBER POLE..GEM STONE + {0x1F48F, 0x1F48F, prEB, gcSo}, // KISS + {0x1F490, 0x1F490, prID, gcSo}, // BOUQUET + {0x1F491, 0x1F491, prEB, gcSo}, // COUPLE WITH HEART + {0x1F492, 0x1F49F, prID, gcSo}, // [14] WEDDING..HEART DECORATION + {0x1F4A0, 0x1F4A0, prAL, gcSo}, // DIAMOND SHAPE WITH A DOT INSIDE + {0x1F4A1, 0x1F4A1, prID, gcSo}, // ELECTRIC LIGHT BULB + {0x1F4A2, 0x1F4A2, prAL, gcSo}, // ANGER SYMBOL + {0x1F4A3, 0x1F4A3, prID, gcSo}, // BOMB + {0x1F4A4, 0x1F4A4, prAL, gcSo}, // SLEEPING SYMBOL + {0x1F4A5, 0x1F4A9, prID, gcSo}, // [5] COLLISION SYMBOL..PILE OF POO + {0x1F4AA, 0x1F4AA, prEB, gcSo}, // FLEXED BICEPS + {0x1F4AB, 0x1F4AE, prID, gcSo}, // [4] DIZZY SYMBOL..WHITE FLOWER + {0x1F4AF, 0x1F4AF, prAL, gcSo}, // HUNDRED POINTS SYMBOL + {0x1F4B0, 0x1F4B0, prID, gcSo}, // MONEY BAG + {0x1F4B1, 0x1F4B2, prAL, gcSo}, // [2] CURRENCY EXCHANGE..HEAVY DOLLAR SIGN + {0x1F4B3, 0x1F4FF, prID, gcSo}, // [77] CREDIT CARD..PRAYER BEADS + {0x1F500, 0x1F506, prAL, gcSo}, // [7] TWISTED RIGHTWARDS ARROWS..HIGH BRIGHTNESS SYMBOL + {0x1F507, 0x1F516, prID, gcSo}, // [16] SPEAKER WITH CANCELLATION STROKE..BOOKMARK + {0x1F517, 0x1F524, prAL, gcSo}, // [14] LINK SYMBOL..INPUT SYMBOL FOR LATIN LETTERS + {0x1F525, 0x1F531, prID, gcSo}, // [13] FIRE..TRIDENT EMBLEM + {0x1F532, 0x1F549, prAL, gcSo}, // [24] BLACK SQUARE BUTTON..OM SYMBOL + {0x1F54A, 0x1F573, prID, gcSo}, // [42] DOVE OF PEACE..HOLE + {0x1F574, 0x1F575, prEB, gcSo}, // [2] MAN IN BUSINESS SUIT LEVITATING..SLEUTH OR SPY + {0x1F576, 0x1F579, prID, gcSo}, // [4] DARK SUNGLASSES..JOYSTICK + {0x1F57A, 0x1F57A, prEB, gcSo}, // MAN DANCING + {0x1F57B, 0x1F58F, prID, gcSo}, // [21] LEFT HAND TELEPHONE RECEIVER..TURNED OK HAND SIGN + {0x1F590, 0x1F590, prEB, gcSo}, // RAISED HAND WITH FINGERS SPLAYED + {0x1F591, 0x1F594, prID, gcSo}, // [4] REVERSED RAISED HAND WITH FINGERS SPLAYED..REVERSED VICTORY HAND + {0x1F595, 0x1F596, prEB, gcSo}, // [2] REVERSED HAND WITH MIDDLE FINGER EXTENDED..RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS + {0x1F597, 0x1F5D3, prID, gcSo}, // [61] WHITE DOWN POINTING LEFT HAND INDEX..SPIRAL CALENDAR PAD + {0x1F5D4, 0x1F5DB, prAL, gcSo}, // [8] DESKTOP WINDOW..DECREASE FONT SIZE SYMBOL + {0x1F5DC, 0x1F5F3, prID, gcSo}, // [24] COMPRESSION..BALLOT BOX WITH BALLOT + {0x1F5F4, 0x1F5F9, prAL, gcSo}, // [6] BALLOT SCRIPT X..BALLOT BOX WITH BOLD CHECK + {0x1F5FA, 0x1F5FF, prID, gcSo}, // [6] WORLD MAP..MOYAI + {0x1F600, 0x1F644, prID, gcSo}, // [69] GRINNING FACE..FACE WITH ROLLING EYES + {0x1F645, 0x1F647, prEB, gcSo}, // [3] FACE WITH NO GOOD GESTURE..PERSON BOWING DEEPLY + {0x1F648, 0x1F64A, prID, gcSo}, // [3] SEE-NO-EVIL MONKEY..SPEAK-NO-EVIL MONKEY + {0x1F64B, 0x1F64F, prEB, gcSo}, // [5] HAPPY PERSON RAISING ONE HAND..PERSON WITH FOLDED HANDS + {0x1F650, 0x1F675, prAL, gcSo}, // [38] NORTH WEST POINTING LEAF..SWASH AMPERSAND ORNAMENT + {0x1F676, 0x1F678, prQU, gcSo}, // [3] SANS-SERIF HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT..SANS-SERIF HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT + {0x1F679, 0x1F67B, prNS, gcSo}, // [3] HEAVY INTERROBANG ORNAMENT..HEAVY SANS-SERIF INTERROBANG ORNAMENT + {0x1F67C, 0x1F67F, prAL, gcSo}, // [4] VERY HEAVY SOLIDUS..REVERSE CHECKER BOARD + {0x1F680, 0x1F6A2, prID, gcSo}, // [35] ROCKET..SHIP + {0x1F6A3, 0x1F6A3, prEB, gcSo}, // ROWBOAT + {0x1F6A4, 0x1F6B3, prID, gcSo}, // [16] SPEEDBOAT..NO BICYCLES + {0x1F6B4, 0x1F6B6, prEB, gcSo}, // [3] BICYCLIST..PEDESTRIAN + {0x1F6B7, 0x1F6BF, prID, gcSo}, // [9] NO PEDESTRIANS..SHOWER + {0x1F6C0, 0x1F6C0, prEB, gcSo}, // BATH + {0x1F6C1, 0x1F6CB, prID, gcSo}, // [11] BATHTUB..COUCH AND LAMP + {0x1F6CC, 0x1F6CC, prEB, gcSo}, // SLEEPING ACCOMMODATION + {0x1F6CD, 0x1F6D7, prID, gcSo}, // [11] SHOPPING BAGS..ELEVATOR + {0x1F6D8, 0x1F6DC, prID, gcCn}, // [5] .. + {0x1F6DD, 0x1F6EC, prID, gcSo}, // [16] PLAYGROUND SLIDE..AIRPLANE ARRIVING + {0x1F6ED, 0x1F6EF, prID, gcCn}, // [3] .. + {0x1F6F0, 0x1F6FC, prID, gcSo}, // [13] SATELLITE..ROLLER SKATE + {0x1F6FD, 0x1F6FF, prID, gcCn}, // [3] .. + {0x1F700, 0x1F773, prAL, gcSo}, // [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE + {0x1F774, 0x1F77F, prID, gcCn}, // [12] .. + {0x1F780, 0x1F7D4, prAL, gcSo}, // [85] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..HEAVY TWELVE POINTED PINWHEEL STAR + {0x1F7D5, 0x1F7D8, prID, gcSo}, // [4] CIRCLED TRIANGLE..NEGATIVE CIRCLED SQUARE + {0x1F7D9, 0x1F7DF, prID, gcCn}, // [7] .. + {0x1F7E0, 0x1F7EB, prID, gcSo}, // [12] LARGE ORANGE CIRCLE..LARGE BROWN SQUARE + {0x1F7EC, 0x1F7EF, prID, gcCn}, // [4] .. + {0x1F7F0, 0x1F7F0, prID, gcSo}, // HEAVY EQUALS SIGN + {0x1F7F1, 0x1F7FF, prID, gcCn}, // [15] .. + {0x1F800, 0x1F80B, prAL, gcSo}, // [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD + {0x1F80C, 0x1F80F, prID, gcCn}, // [4] .. + {0x1F810, 0x1F847, prAL, gcSo}, // [56] LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD..DOWNWARDS HEAVY ARROW + {0x1F848, 0x1F84F, prID, gcCn}, // [8] .. + {0x1F850, 0x1F859, prAL, gcSo}, // [10] LEFTWARDS SANS-SERIF ARROW..UP DOWN SANS-SERIF ARROW + {0x1F85A, 0x1F85F, prID, gcCn}, // [6] .. + {0x1F860, 0x1F887, prAL, gcSo}, // [40] WIDE-HEADED LEFTWARDS LIGHT BARB ARROW..WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW + {0x1F888, 0x1F88F, prID, gcCn}, // [8] .. + {0x1F890, 0x1F8AD, prAL, gcSo}, // [30] LEFTWARDS TRIANGLE ARROWHEAD..WHITE ARROW SHAFT WIDTH TWO THIRDS + {0x1F8AE, 0x1F8AF, prID, gcCn}, // [2] .. + {0x1F8B0, 0x1F8B1, prID, gcSo}, // [2] ARROW POINTING UPWARDS THEN NORTH WEST..ARROW POINTING RIGHTWARDS THEN CURVING SOUTH WEST + {0x1F8B2, 0x1F8FF, prID, gcCn}, // [78] .. + {0x1F900, 0x1F90B, prAL, gcSo}, // [12] CIRCLED CROSS FORMEE WITH FOUR DOTS..DOWNWARD FACING NOTCHED HOOK WITH DOT + {0x1F90C, 0x1F90C, prEB, gcSo}, // PINCHED FINGERS + {0x1F90D, 0x1F90E, prID, gcSo}, // [2] WHITE HEART..BROWN HEART + {0x1F90F, 0x1F90F, prEB, gcSo}, // PINCHING HAND + {0x1F910, 0x1F917, prID, gcSo}, // [8] ZIPPER-MOUTH FACE..HUGGING FACE + {0x1F918, 0x1F91F, prEB, gcSo}, // [8] SIGN OF THE HORNS..I LOVE YOU HAND SIGN + {0x1F920, 0x1F925, prID, gcSo}, // [6] FACE WITH COWBOY HAT..LYING FACE + {0x1F926, 0x1F926, prEB, gcSo}, // FACE PALM + {0x1F927, 0x1F92F, prID, gcSo}, // [9] SNEEZING FACE..SHOCKED FACE WITH EXPLODING HEAD + {0x1F930, 0x1F939, prEB, gcSo}, // [10] PREGNANT WOMAN..JUGGLING + {0x1F93A, 0x1F93B, prID, gcSo}, // [2] FENCER..MODERN PENTATHLON + {0x1F93C, 0x1F93E, prEB, gcSo}, // [3] WRESTLERS..HANDBALL + {0x1F93F, 0x1F976, prID, gcSo}, // [56] DIVING MASK..FREEZING FACE + {0x1F977, 0x1F977, prEB, gcSo}, // NINJA + {0x1F978, 0x1F9B4, prID, gcSo}, // [61] DISGUISED FACE..BONE + {0x1F9B5, 0x1F9B6, prEB, gcSo}, // [2] LEG..FOOT + {0x1F9B7, 0x1F9B7, prID, gcSo}, // TOOTH + {0x1F9B8, 0x1F9B9, prEB, gcSo}, // [2] SUPERHERO..SUPERVILLAIN + {0x1F9BA, 0x1F9BA, prID, gcSo}, // SAFETY VEST + {0x1F9BB, 0x1F9BB, prEB, gcSo}, // EAR WITH HEARING AID + {0x1F9BC, 0x1F9CC, prID, gcSo}, // [17] MOTORIZED WHEELCHAIR..TROLL + {0x1F9CD, 0x1F9CF, prEB, gcSo}, // [3] STANDING PERSON..DEAF PERSON + {0x1F9D0, 0x1F9D0, prID, gcSo}, // FACE WITH MONOCLE + {0x1F9D1, 0x1F9DD, prEB, gcSo}, // [13] ADULT..ELF + {0x1F9DE, 0x1F9FF, prID, gcSo}, // [34] GENIE..NAZAR AMULET + {0x1FA00, 0x1FA53, prAL, gcSo}, // [84] NEUTRAL CHESS KING..BLACK CHESS KNIGHT-BISHOP + {0x1FA54, 0x1FA5F, prID, gcCn}, // [12] .. + {0x1FA60, 0x1FA6D, prID, gcSo}, // [14] XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER + {0x1FA6E, 0x1FA6F, prID, gcCn}, // [2] .. + {0x1FA70, 0x1FA74, prID, gcSo}, // [5] BALLET SHOES..THONG SANDAL + {0x1FA75, 0x1FA77, prID, gcCn}, // [3] .. + {0x1FA78, 0x1FA7C, prID, gcSo}, // [5] DROP OF BLOOD..CRUTCH + {0x1FA7D, 0x1FA7F, prID, gcCn}, // [3] .. + {0x1FA80, 0x1FA86, prID, gcSo}, // [7] YO-YO..NESTING DOLLS + {0x1FA87, 0x1FA8F, prID, gcCn}, // [9] .. + {0x1FA90, 0x1FAAC, prID, gcSo}, // [29] RINGED PLANET..HAMSA + {0x1FAAD, 0x1FAAF, prID, gcCn}, // [3] .. + {0x1FAB0, 0x1FABA, prID, gcSo}, // [11] FLY..NEST WITH EGGS + {0x1FABB, 0x1FABF, prID, gcCn}, // [5] .. + {0x1FAC0, 0x1FAC2, prID, gcSo}, // [3] ANATOMICAL HEART..PEOPLE HUGGING + {0x1FAC3, 0x1FAC5, prEB, gcSo}, // [3] PREGNANT MAN..PERSON WITH CROWN + {0x1FAC6, 0x1FACF, prID, gcCn}, // [10] .. + {0x1FAD0, 0x1FAD9, prID, gcSo}, // [10] BLUEBERRIES..JAR + {0x1FADA, 0x1FADF, prID, gcCn}, // [6] .. + {0x1FAE0, 0x1FAE7, prID, gcSo}, // [8] MELTING FACE..BUBBLES + {0x1FAE8, 0x1FAEF, prID, gcCn}, // [8] .. + {0x1FAF0, 0x1FAF6, prEB, gcSo}, // [7] HAND WITH INDEX FINGER AND THUMB CROSSED..HEART HANDS + {0x1FAF7, 0x1FAFF, prID, gcCn}, // [9] .. + {0x1FB00, 0x1FB92, prAL, gcSo}, // [147] BLOCK SEXTANT-1..UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK + {0x1FB94, 0x1FBCA, prAL, gcSo}, // [55] LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK..WHITE UP-POINTING CHEVRON + {0x1FBF0, 0x1FBF9, prNU, gcNd}, // [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE + {0x1FC00, 0x1FFFD, prID, gcCn}, // [1022] .. + {0x20000, 0x2A6DF, prID, gcLo}, // [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF + {0x2A6E0, 0x2A6FF, prID, gcCn}, // [32] .. + {0x2A700, 0x2B738, prID, gcLo}, // [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738 + {0x2B739, 0x2B73F, prID, gcCn}, // [7] .. + {0x2B740, 0x2B81D, prID, gcLo}, // [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D + {0x2B81E, 0x2B81F, prID, gcCn}, // [2] .. + {0x2B820, 0x2CEA1, prID, gcLo}, // [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 + {0x2CEA2, 0x2CEAF, prID, gcCn}, // [14] .. + {0x2CEB0, 0x2EBE0, prID, gcLo}, // [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 + {0x2EBE1, 0x2F7FF, prID, gcCn}, // [3103] .. + {0x2F800, 0x2FA1D, prID, gcLo}, // [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D + {0x2FA1E, 0x2FA1F, prID, gcCn}, // [2] .. + {0x2FA20, 0x2FFFD, prID, gcCn}, // [1502] .. + {0x30000, 0x3134A, prID, gcLo}, // [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A + {0x3134B, 0x3FFFD, prID, gcCn}, // [60595] .. + {0xE0001, 0xE0001, prCM, gcCf}, // LANGUAGE TAG + {0xE0020, 0xE007F, prCM, gcCf}, // [96] TAG SPACE..CANCEL TAG + {0xE0100, 0xE01EF, prCM, gcMn}, // [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 + {0xF0000, 0xFFFFD, prXX, gcCo}, // [65534] .. + {0x100000, 0x10FFFD, prXX, gcCo}, // [65534] .. +} diff --git a/vendor/github.com/rivo/uniseg/linerules.go b/vendor/github.com/rivo/uniseg/linerules.go new file mode 100644 index 000000000..d2ad51680 --- /dev/null +++ b/vendor/github.com/rivo/uniseg/linerules.go @@ -0,0 +1,470 @@ +package uniseg + +import "unicode/utf8" + +// The states of the line break parser. +const ( + lbAny = iota + lbBK + lbCR + lbLF + lbNL + lbSP + lbZW + lbWJ + lbGL + lbBA + lbHY + lbCL + lbCP + lbEX + lbIS + lbSY + lbOP + lbQU + lbQUSP + lbNS + lbCLCPSP + lbB2 + lbB2SP + lbCB + lbBB + lbLB21a + lbHL + lbAL + lbNU + lbPR + lbEB + lbIDEM + lbNUNU + lbNUSY + lbNUIS + lbNUCL + lbNUCP + lbPO + lbJL + lbJV + lbJT + lbH2 + lbH3 + lbOddRI + lbEvenRI + lbExtPicCn + lbZWJBit = 64 + lbCPeaFWHBit = 128 +) + +// These constants define whether a given text may be broken into the next line. +// If the break is optional (LineCanBreak), you may choose to break or not based +// on your own criteria, for example, if the text has reached the available +// width. +const ( + LineDontBreak = iota // You may not break the line here. + LineCanBreak // You may or may not break the line here. + LineMustBreak // You must break the line here. +) + +// The line break parser's state transitions. It's anologous to grTransitions, +// see comments there for details. Unicode version 14.0.0. +var lbTransitions = map[[2]int][3]int{ + // LB4. + {lbAny, prBK}: {lbBK, LineCanBreak, 310}, + {lbBK, prAny}: {lbAny, LineMustBreak, 40}, + + // LB5. + {lbAny, prCR}: {lbCR, LineCanBreak, 310}, + {lbAny, prLF}: {lbLF, LineCanBreak, 310}, + {lbAny, prNL}: {lbNL, LineCanBreak, 310}, + {lbCR, prLF}: {lbLF, LineDontBreak, 50}, + {lbCR, prAny}: {lbAny, LineMustBreak, 50}, + {lbLF, prAny}: {lbAny, LineMustBreak, 50}, + {lbNL, prAny}: {lbAny, LineMustBreak, 50}, + + // LB6. + {lbAny, prBK}: {lbBK, LineDontBreak, 60}, + {lbAny, prCR}: {lbCR, LineDontBreak, 60}, + {lbAny, prLF}: {lbLF, LineDontBreak, 60}, + {lbAny, prNL}: {lbNL, LineDontBreak, 60}, + + // LB7. + {lbAny, prSP}: {lbSP, LineDontBreak, 70}, + {lbAny, prZW}: {lbZW, LineDontBreak, 70}, + + // LB8. + {lbZW, prSP}: {lbZW, LineDontBreak, 70}, + {lbZW, prAny}: {lbAny, LineCanBreak, 80}, + + // LB11. + {lbAny, prWJ}: {lbWJ, LineDontBreak, 110}, + {lbWJ, prAny}: {lbAny, LineDontBreak, 110}, + + // LB12. + {lbAny, prGL}: {lbGL, LineCanBreak, 310}, + {lbGL, prAny}: {lbAny, LineDontBreak, 120}, + + // LB13 (simple transitions). + {lbAny, prCL}: {lbCL, LineCanBreak, 310}, + {lbAny, prCP}: {lbCP, LineCanBreak, 310}, + {lbAny, prEX}: {lbEX, LineDontBreak, 130}, + {lbAny, prIS}: {lbIS, LineCanBreak, 310}, + {lbAny, prSY}: {lbSY, LineCanBreak, 310}, + + // LB14. + {lbAny, prOP}: {lbOP, LineCanBreak, 310}, + {lbOP, prSP}: {lbOP, LineDontBreak, 70}, + {lbOP, prAny}: {lbAny, LineDontBreak, 140}, + + // LB15. + {lbQU, prSP}: {lbQUSP, LineDontBreak, 70}, + {lbQU, prOP}: {lbOP, LineDontBreak, 150}, + {lbQUSP, prOP}: {lbOP, LineDontBreak, 150}, + + // LB16. + {lbCL, prSP}: {lbCLCPSP, LineDontBreak, 70}, + {lbNUCL, prSP}: {lbCLCPSP, LineDontBreak, 70}, + {lbCP, prSP}: {lbCLCPSP, LineDontBreak, 70}, + {lbNUCP, prSP}: {lbCLCPSP, LineDontBreak, 70}, + {lbCL, prNS}: {lbNS, LineDontBreak, 160}, + {lbNUCL, prNS}: {lbNS, LineDontBreak, 160}, + {lbCP, prNS}: {lbNS, LineDontBreak, 160}, + {lbNUCP, prNS}: {lbNS, LineDontBreak, 160}, + {lbCLCPSP, prNS}: {lbNS, LineDontBreak, 160}, + + // LB17. + {lbAny, prB2}: {lbB2, LineCanBreak, 310}, + {lbB2, prSP}: {lbB2SP, LineDontBreak, 70}, + {lbB2, prB2}: {lbB2, LineDontBreak, 170}, + {lbB2SP, prB2}: {lbB2, LineDontBreak, 170}, + + // LB18. + {lbSP, prAny}: {lbAny, LineCanBreak, 180}, + {lbQUSP, prAny}: {lbAny, LineCanBreak, 180}, + {lbCLCPSP, prAny}: {lbAny, LineCanBreak, 180}, + {lbB2SP, prAny}: {lbAny, LineCanBreak, 180}, + + // LB19. + {lbAny, prQU}: {lbQU, LineDontBreak, 190}, + {lbQU, prAny}: {lbAny, LineDontBreak, 190}, + + // LB20. + {lbAny, prCB}: {lbCB, LineCanBreak, 200}, + {lbCB, prAny}: {lbAny, LineCanBreak, 200}, + + // LB21. + {lbAny, prBA}: {lbBA, LineDontBreak, 210}, + {lbAny, prHY}: {lbHY, LineDontBreak, 210}, + {lbAny, prNS}: {lbNS, LineDontBreak, 210}, + {lbAny, prBB}: {lbBB, LineCanBreak, 310}, + {lbBB, prAny}: {lbAny, LineDontBreak, 210}, + + // LB21a. + {lbAny, prHL}: {lbHL, LineCanBreak, 310}, + {lbHL, prHY}: {lbLB21a, LineDontBreak, 210}, + {lbHL, prBA}: {lbLB21a, LineDontBreak, 210}, + {lbLB21a, prAny}: {lbAny, LineDontBreak, 211}, + + // LB21b. + {lbSY, prHL}: {lbHL, LineDontBreak, 212}, + {lbNUSY, prHL}: {lbHL, LineDontBreak, 212}, + + // LB22. + {lbAny, prIN}: {lbAny, LineDontBreak, 220}, + + // LB23. + {lbAny, prAL}: {lbAL, LineCanBreak, 310}, + {lbAny, prNU}: {lbNU, LineCanBreak, 310}, + {lbAL, prNU}: {lbNU, LineDontBreak, 230}, + {lbHL, prNU}: {lbNU, LineDontBreak, 230}, + {lbNU, prAL}: {lbAL, LineDontBreak, 230}, + {lbNU, prHL}: {lbHL, LineDontBreak, 230}, + {lbNUNU, prAL}: {lbAL, LineDontBreak, 230}, + {lbNUNU, prHL}: {lbHL, LineDontBreak, 230}, + + // LB23a. + {lbAny, prPR}: {lbPR, LineCanBreak, 310}, + {lbAny, prID}: {lbIDEM, LineCanBreak, 310}, + {lbAny, prEB}: {lbEB, LineCanBreak, 310}, + {lbAny, prEM}: {lbIDEM, LineCanBreak, 310}, + {lbPR, prID}: {lbIDEM, LineDontBreak, 231}, + {lbPR, prEB}: {lbEB, LineDontBreak, 231}, + {lbPR, prEM}: {lbIDEM, LineDontBreak, 231}, + {lbIDEM, prPO}: {lbPO, LineDontBreak, 231}, + {lbEB, prPO}: {lbPO, LineDontBreak, 231}, + + // LB24. + {lbAny, prPO}: {lbPO, LineCanBreak, 310}, + {lbPR, prAL}: {lbAL, LineDontBreak, 240}, + {lbPR, prHL}: {lbHL, LineDontBreak, 240}, + {lbPO, prAL}: {lbAL, LineDontBreak, 240}, + {lbPO, prHL}: {lbHL, LineDontBreak, 240}, + {lbAL, prPR}: {lbPR, LineDontBreak, 240}, + {lbAL, prPO}: {lbPO, LineDontBreak, 240}, + {lbHL, prPR}: {lbPR, LineDontBreak, 240}, + {lbHL, prPO}: {lbPO, LineDontBreak, 240}, + + // LB25 (simple transitions). + {lbPR, prNU}: {lbNU, LineDontBreak, 250}, + {lbPO, prNU}: {lbNU, LineDontBreak, 250}, + {lbOP, prNU}: {lbNU, LineDontBreak, 250}, + {lbHY, prNU}: {lbNU, LineDontBreak, 250}, + {lbNU, prNU}: {lbNUNU, LineDontBreak, 250}, + {lbNU, prSY}: {lbNUSY, LineDontBreak, 250}, + {lbNU, prIS}: {lbNUIS, LineDontBreak, 250}, + {lbNUNU, prNU}: {lbNUNU, LineDontBreak, 250}, + {lbNUNU, prSY}: {lbNUSY, LineDontBreak, 250}, + {lbNUNU, prIS}: {lbNUIS, LineDontBreak, 250}, + {lbNUSY, prNU}: {lbNUNU, LineDontBreak, 250}, + {lbNUSY, prSY}: {lbNUSY, LineDontBreak, 250}, + {lbNUSY, prIS}: {lbNUIS, LineDontBreak, 250}, + {lbNUIS, prNU}: {lbNUNU, LineDontBreak, 250}, + {lbNUIS, prSY}: {lbNUSY, LineDontBreak, 250}, + {lbNUIS, prIS}: {lbNUIS, LineDontBreak, 250}, + {lbNU, prCL}: {lbNUCL, LineDontBreak, 250}, + {lbNU, prCP}: {lbNUCP, LineDontBreak, 250}, + {lbNUNU, prCL}: {lbNUCL, LineDontBreak, 250}, + {lbNUNU, prCP}: {lbNUCP, LineDontBreak, 250}, + {lbNUSY, prCL}: {lbNUCL, LineDontBreak, 250}, + {lbNUSY, prCP}: {lbNUCP, LineDontBreak, 250}, + {lbNUIS, prCL}: {lbNUCL, LineDontBreak, 250}, + {lbNUIS, prCP}: {lbNUCP, LineDontBreak, 250}, + {lbNU, prPO}: {lbPO, LineDontBreak, 250}, + {lbNUNU, prPO}: {lbPO, LineDontBreak, 250}, + {lbNUSY, prPO}: {lbPO, LineDontBreak, 250}, + {lbNUIS, prPO}: {lbPO, LineDontBreak, 250}, + {lbNUCL, prPO}: {lbPO, LineDontBreak, 250}, + {lbNUCP, prPO}: {lbPO, LineDontBreak, 250}, + {lbNU, prPR}: {lbPR, LineDontBreak, 250}, + {lbNUNU, prPR}: {lbPR, LineDontBreak, 250}, + {lbNUSY, prPR}: {lbPR, LineDontBreak, 250}, + {lbNUIS, prPR}: {lbPR, LineDontBreak, 250}, + {lbNUCL, prPR}: {lbPR, LineDontBreak, 250}, + {lbNUCP, prPR}: {lbPR, LineDontBreak, 250}, + + // LB26. + {lbAny, prJL}: {lbJL, LineCanBreak, 310}, + {lbAny, prJV}: {lbJV, LineCanBreak, 310}, + {lbAny, prJT}: {lbJT, LineCanBreak, 310}, + {lbAny, prH2}: {lbH2, LineCanBreak, 310}, + {lbAny, prH3}: {lbH3, LineCanBreak, 310}, + {lbJL, prJL}: {lbJL, LineDontBreak, 260}, + {lbJL, prJV}: {lbJV, LineDontBreak, 260}, + {lbJL, prH2}: {lbH2, LineDontBreak, 260}, + {lbJL, prH3}: {lbH3, LineDontBreak, 260}, + {lbJV, prJV}: {lbJV, LineDontBreak, 260}, + {lbJV, prJT}: {lbJT, LineDontBreak, 260}, + {lbH2, prJV}: {lbJV, LineDontBreak, 260}, + {lbH2, prJT}: {lbJT, LineDontBreak, 260}, + {lbJT, prJT}: {lbJT, LineDontBreak, 260}, + {lbH3, prJT}: {lbJT, LineDontBreak, 260}, + + // LB27. + {lbJL, prPO}: {lbPO, LineDontBreak, 270}, + {lbJV, prPO}: {lbPO, LineDontBreak, 270}, + {lbJT, prPO}: {lbPO, LineDontBreak, 270}, + {lbH2, prPO}: {lbPO, LineDontBreak, 270}, + {lbH3, prPO}: {lbPO, LineDontBreak, 270}, + {lbPR, prJL}: {lbJL, LineDontBreak, 270}, + {lbPR, prJV}: {lbJV, LineDontBreak, 270}, + {lbPR, prJT}: {lbJT, LineDontBreak, 270}, + {lbPR, prH2}: {lbH2, LineDontBreak, 270}, + {lbPR, prH3}: {lbH3, LineDontBreak, 270}, + + // LB28. + {lbAL, prAL}: {lbAL, LineDontBreak, 280}, + {lbAL, prHL}: {lbHL, LineDontBreak, 280}, + {lbHL, prAL}: {lbAL, LineDontBreak, 280}, + {lbHL, prHL}: {lbHL, LineDontBreak, 280}, + + // LB29. + {lbIS, prAL}: {lbAL, LineDontBreak, 290}, + {lbIS, prHL}: {lbHL, LineDontBreak, 290}, + {lbNUIS, prAL}: {lbAL, LineDontBreak, 290}, + {lbNUIS, prHL}: {lbHL, LineDontBreak, 290}, +} + +// transitionLineBreakState determines the new state of the line break parser +// given the current state and the next code point. It also returns the type of +// line break: LineDontBreak, LineCanBreak, or LineMustBreak. If more than one +// code point is needed to determine the new state, the byte slice or the string +// starting after rune "r" can be used (whichever is not nil or empty) for +// further lookups. +func transitionLineBreakState(state int, r rune, b []byte, str string) (newState int, lineBreak int) { + // Determine the property of the next character. + nextProperty, generalCategory := propertyWithGenCat(lineBreakCodePoints, r) + + // Prepare. + var forceNoBreak, isCPeaFWH bool + if state >= 0 && state&lbCPeaFWHBit != 0 { + isCPeaFWH = true // LB30: CP but ea is not F, W, or H. + state = state &^ lbCPeaFWHBit + } + if state >= 0 && state&lbZWJBit != 0 { + state = state &^ lbZWJBit // Extract zero-width joiner bit. + forceNoBreak = true // LB8a. + } + + defer func() { + // Transition into LB30. + if newState == lbCP || newState == lbNUCP { + ea := property(eastAsianWidth, r) + if ea != prF && ea != prW && ea != prH { + newState |= lbCPeaFWHBit + } + } + + // Override break. + if forceNoBreak { + lineBreak = LineDontBreak + } + }() + + // LB1. + if nextProperty == prAI || nextProperty == prSG || nextProperty == prXX { + nextProperty = prAL + } else if nextProperty == prSA { + if generalCategory == gcMn || generalCategory == gcMc { + nextProperty = prCM + } else { + nextProperty = prAL + } + } else if nextProperty == prCJ { + nextProperty = prNS + } + + // Combining marks. + if nextProperty == prZWJ || nextProperty == prCM { + var bit int + if nextProperty == prZWJ { + bit = lbZWJBit + } + mustBreakState := state < 0 || state == lbBK || state == lbCR || state == lbLF || state == lbNL + if !mustBreakState && state != lbSP && state != lbZW && state != lbQUSP && state != lbCLCPSP && state != lbB2SP { + // LB9. + return state | bit, LineDontBreak + } else { + // LB10. + if mustBreakState { + return lbAL | bit, LineMustBreak + } + return lbAL | bit, LineCanBreak + } + } + + // Find the applicable transition in the table. + var rule int + transition, ok := lbTransitions[[2]int{state, nextProperty}] + if ok { + // We have a specific transition. We'll use it. + newState, lineBreak, rule = transition[0], transition[1], transition[2] + } else { + // No specific transition found. Try the less specific ones. + transAnyProp, okAnyProp := lbTransitions[[2]int{state, prAny}] + transAnyState, okAnyState := lbTransitions[[2]int{lbAny, nextProperty}] + if okAnyProp && okAnyState { + // Both apply. We'll use a mix (see comments for grTransitions). + newState, lineBreak, rule = transAnyState[0], transAnyState[1], transAnyState[2] + if transAnyProp[2] < transAnyState[2] { + lineBreak, rule = transAnyProp[1], transAnyProp[2] + } + } else if okAnyProp { + // We only have a specific state. + newState, lineBreak, rule = transAnyProp[0], transAnyProp[1], transAnyProp[2] + // This branch will probably never be reached because okAnyState will + // always be true given the current transition map. But we keep it here + // for future modifications to the transition map where this may not be + // true anymore. + } else if okAnyState { + // We only have a specific property. + newState, lineBreak, rule = transAnyState[0], transAnyState[1], transAnyState[2] + } else { + // No known transition. LB31: ALL Ă· ALL. + newState, lineBreak, rule = lbAny, LineCanBreak, 310 + } + } + + // LB12a. + if rule > 121 && + nextProperty == prGL && + (state != lbSP && state != lbBA && state != lbHY && state != lbLB21a && state != lbQUSP && state != lbCLCPSP && state != lbB2SP) { + return lbGL, LineDontBreak + } + + // LB13. + if rule > 130 && state != lbNU && state != lbNUNU { + switch nextProperty { + case prCL: + return lbCL, LineDontBreak + case prCP: + return lbCP, LineDontBreak + case prIS: + return lbIS, LineDontBreak + case prSY: + return lbSY, LineDontBreak + } + } + + // LB25 (look ahead). + if rule > 250 && + (state == lbPR || state == lbPO) && + nextProperty == prOP || nextProperty == prHY { + var r rune + if b != nil { // Byte slice version. + r, _ = utf8.DecodeRune(b) + } else { // String version. + r, _ = utf8.DecodeRuneInString(str) + } + if r != utf8.RuneError { + pr, _ := propertyWithGenCat(lineBreakCodePoints, r) + if pr == prNU { + return lbNU, LineDontBreak + } + } + } + + // LB30 (part one). + if rule > 300 { + if (state == lbAL || state == lbHL || state == lbNU || state == lbNUNU) && nextProperty == prOP { + ea := property(eastAsianWidth, r) + if ea != prF && ea != prW && ea != prH { + return lbOP, LineDontBreak + } + } else if isCPeaFWH { + switch nextProperty { + case prAL: + return lbAL, LineDontBreak + case prHL: + return lbHL, LineDontBreak + case prNU: + return lbNU, LineDontBreak + } + } + } + + // LB30a. + if newState == lbAny && nextProperty == prRI { + if state != lbOddRI && state != lbEvenRI { // Includes state == -1. + // Transition into the first RI. + return lbOddRI, lineBreak + } + if state == lbOddRI { + // Don't break pairs of Regional Indicators. + return lbEvenRI, LineDontBreak + } + return lbOddRI, lineBreak + } + + // LB30b. + if rule > 302 { + if nextProperty == prEM { + if state == lbEB || state == lbExtPicCn { + return prAny, LineDontBreak + } + } + graphemeProperty := property(graphemeCodePoints, r) + if graphemeProperty == prExtendedPictographic && generalCategory == gcCn { + return lbExtPicCn, LineCanBreak + } + } + + return +} diff --git a/vendor/github.com/rivo/uniseg/properties.go b/vendor/github.com/rivo/uniseg/properties.go index a75ab5883..0bb3db62e 100644 --- a/vendor/github.com/rivo/uniseg/properties.go +++ b/vendor/github.com/rivo/uniseg/properties.go @@ -1,10 +1,11 @@ package uniseg -// The unicode properties. Only the ones needed in the context of this package -// are included. +// The Unicode properties as used in the various parsers. Only the ones needed +// in the context of this package are included. const ( - prAny = iota - prPreprend + prXX = 0 // Same as prAny. + prAny = iota // prAny must be 0. + prPrepend prCR prLF prControl @@ -18,1632 +19,121 @@ const ( prLVT prZWJ prExtendedPictographic + prNewline + prWSegSpace + prDoubleQuote + prSingleQuote + prMidNumLet + prNumeric + prMidLetter + prMidNum + prExtendNumLet + prALetter + prFormat + prHebrewLetter + prKatakana + prSp + prSTerm + prClose + prSContinue + prATerm + prUpper + prLower + prSep + prOLetter + prCM + prBA + prBK + prSP + prEX + prQU + prAL + prPR + prPO + prOP + prCP + prIS + prHY + prSY + prNU + prCL + prNL + prGL + prAI + prBB + prHL + prSA + prJL + prJV + prJT + prNS + prZW + prB2 + prIN + prWJ + prID + prEB + prCJ + prH2 + prH3 + prSG + prCB + prRI + prEM + prN + prNa + prA + prW + prH + prF ) -// Maps code point ranges to their properties. In the context of this package, -// any code point that is not contained may map to "prAny". The code point -// ranges in this slice are numerically sorted. -// -// These ranges were taken from -// http://www.unicode.org/Public/UCD/latest/ucd/auxiliary/GraphemeBreakProperty.txt -// as well as -// https://unicode.org/Public/emoji/latest/emoji-data.txt -// ("Extended_Pictographic" only) on March 11, 2019. See -// https://www.unicode.org/license.html for the Unicode license agreement. -var codePoints = [][3]int{ - {0x0000, 0x0009, prControl}, // Cc [10] .. - {0x000A, 0x000A, prLF}, // Cc - {0x000B, 0x000C, prControl}, // Cc [2] .. - {0x000D, 0x000D, prCR}, // Cc - {0x000E, 0x001F, prControl}, // Cc [18] .. - {0x007F, 0x009F, prControl}, // Cc [33] .. - {0x00A9, 0x00A9, prExtendedPictographic}, // 1.1 [1] (©️) copyright - {0x00AD, 0x00AD, prControl}, // Cf SOFT HYPHEN - {0x00AE, 0x00AE, prExtendedPictographic}, // 1.1 [1] (®️) registered - {0x0300, 0x036F, prExtend}, // Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X - {0x0483, 0x0487, prExtend}, // Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE - {0x0488, 0x0489, prExtend}, // Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN - {0x0591, 0x05BD, prExtend}, // Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG - {0x05BF, 0x05BF, prExtend}, // Mn HEBREW POINT RAFE - {0x05C1, 0x05C2, prExtend}, // Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT - {0x05C4, 0x05C5, prExtend}, // Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT - {0x05C7, 0x05C7, prExtend}, // Mn HEBREW POINT QAMATS QATAN - {0x0600, 0x0605, prPreprend}, // Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE - {0x0610, 0x061A, prExtend}, // Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA - {0x061C, 0x061C, prControl}, // Cf ARABIC LETTER MARK - {0x064B, 0x065F, prExtend}, // Mn [21] ARABIC FATHATAN..ARABIC WAVY HAMZA BELOW - {0x0670, 0x0670, prExtend}, // Mn ARABIC LETTER SUPERSCRIPT ALEF - {0x06D6, 0x06DC, prExtend}, // Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN - {0x06DD, 0x06DD, prPreprend}, // Cf ARABIC END OF AYAH - {0x06DF, 0x06E4, prExtend}, // Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA - {0x06E7, 0x06E8, prExtend}, // Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON - {0x06EA, 0x06ED, prExtend}, // Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM - {0x070F, 0x070F, prPreprend}, // Cf SYRIAC ABBREVIATION MARK - {0x0711, 0x0711, prExtend}, // Mn SYRIAC LETTER SUPERSCRIPT ALAPH - {0x0730, 0x074A, prExtend}, // Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH - {0x07A6, 0x07B0, prExtend}, // Mn [11] THAANA ABAFILI..THAANA SUKUN - {0x07EB, 0x07F3, prExtend}, // Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE - {0x07FD, 0x07FD, prExtend}, // Mn NKO DANTAYALAN - {0x0816, 0x0819, prExtend}, // Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH - {0x081B, 0x0823, prExtend}, // Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A - {0x0825, 0x0827, prExtend}, // Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U - {0x0829, 0x082D, prExtend}, // Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA - {0x0859, 0x085B, prExtend}, // Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK - {0x08D3, 0x08E1, prExtend}, // Mn [15] ARABIC SMALL LOW WAW..ARABIC SMALL HIGH SIGN SAFHA - {0x08E2, 0x08E2, prPreprend}, // Cf ARABIC DISPUTED END OF AYAH - {0x08E3, 0x0902, prExtend}, // Mn [32] ARABIC TURNED DAMMA BELOW..DEVANAGARI SIGN ANUSVARA - {0x0903, 0x0903, prSpacingMark}, // Mc DEVANAGARI SIGN VISARGA - {0x093A, 0x093A, prExtend}, // Mn DEVANAGARI VOWEL SIGN OE - {0x093B, 0x093B, prSpacingMark}, // Mc DEVANAGARI VOWEL SIGN OOE - {0x093C, 0x093C, prExtend}, // Mn DEVANAGARI SIGN NUKTA - {0x093E, 0x0940, prSpacingMark}, // Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II - {0x0941, 0x0948, prExtend}, // Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI - {0x0949, 0x094C, prSpacingMark}, // Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU - {0x094D, 0x094D, prExtend}, // Mn DEVANAGARI SIGN VIRAMA - {0x094E, 0x094F, prSpacingMark}, // Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW - {0x0951, 0x0957, prExtend}, // Mn [7] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN UUE - {0x0962, 0x0963, prExtend}, // Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL - {0x0981, 0x0981, prExtend}, // Mn BENGALI SIGN CANDRABINDU - {0x0982, 0x0983, prSpacingMark}, // Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA - {0x09BC, 0x09BC, prExtend}, // Mn BENGALI SIGN NUKTA - {0x09BE, 0x09BE, prExtend}, // Mc BENGALI VOWEL SIGN AA - {0x09BF, 0x09C0, prSpacingMark}, // Mc [2] BENGALI VOWEL SIGN I..BENGALI VOWEL SIGN II - {0x09C1, 0x09C4, prExtend}, // Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR - {0x09C7, 0x09C8, prSpacingMark}, // Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI - {0x09CB, 0x09CC, prSpacingMark}, // Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU - {0x09CD, 0x09CD, prExtend}, // Mn BENGALI SIGN VIRAMA - {0x09D7, 0x09D7, prExtend}, // Mc BENGALI AU LENGTH MARK - {0x09E2, 0x09E3, prExtend}, // Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL - {0x09FE, 0x09FE, prExtend}, // Mn BENGALI SANDHI MARK - {0x0A01, 0x0A02, prExtend}, // Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI - {0x0A03, 0x0A03, prSpacingMark}, // Mc GURMUKHI SIGN VISARGA - {0x0A3C, 0x0A3C, prExtend}, // Mn GURMUKHI SIGN NUKTA - {0x0A3E, 0x0A40, prSpacingMark}, // Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II - {0x0A41, 0x0A42, prExtend}, // Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU - {0x0A47, 0x0A48, prExtend}, // Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI - {0x0A4B, 0x0A4D, prExtend}, // Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA - {0x0A51, 0x0A51, prExtend}, // Mn GURMUKHI SIGN UDAAT - {0x0A70, 0x0A71, prExtend}, // Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK - {0x0A75, 0x0A75, prExtend}, // Mn GURMUKHI SIGN YAKASH - {0x0A81, 0x0A82, prExtend}, // Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA - {0x0A83, 0x0A83, prSpacingMark}, // Mc GUJARATI SIGN VISARGA - {0x0ABC, 0x0ABC, prExtend}, // Mn GUJARATI SIGN NUKTA - {0x0ABE, 0x0AC0, prSpacingMark}, // Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II - {0x0AC1, 0x0AC5, prExtend}, // Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E - {0x0AC7, 0x0AC8, prExtend}, // Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI - {0x0AC9, 0x0AC9, prSpacingMark}, // Mc GUJARATI VOWEL SIGN CANDRA O - {0x0ACB, 0x0ACC, prSpacingMark}, // Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU - {0x0ACD, 0x0ACD, prExtend}, // Mn GUJARATI SIGN VIRAMA - {0x0AE2, 0x0AE3, prExtend}, // Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL - {0x0AFA, 0x0AFF, prExtend}, // Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE - {0x0B01, 0x0B01, prExtend}, // Mn ORIYA SIGN CANDRABINDU - {0x0B02, 0x0B03, prSpacingMark}, // Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA - {0x0B3C, 0x0B3C, prExtend}, // Mn ORIYA SIGN NUKTA - {0x0B3E, 0x0B3E, prExtend}, // Mc ORIYA VOWEL SIGN AA - {0x0B3F, 0x0B3F, prExtend}, // Mn ORIYA VOWEL SIGN I - {0x0B40, 0x0B40, prSpacingMark}, // Mc ORIYA VOWEL SIGN II - {0x0B41, 0x0B44, prExtend}, // Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR - {0x0B47, 0x0B48, prSpacingMark}, // Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI - {0x0B4B, 0x0B4C, prSpacingMark}, // Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU - {0x0B4D, 0x0B4D, prExtend}, // Mn ORIYA SIGN VIRAMA - {0x0B56, 0x0B56, prExtend}, // Mn ORIYA AI LENGTH MARK - {0x0B57, 0x0B57, prExtend}, // Mc ORIYA AU LENGTH MARK - {0x0B62, 0x0B63, prExtend}, // Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL - {0x0B82, 0x0B82, prExtend}, // Mn TAMIL SIGN ANUSVARA - {0x0BBE, 0x0BBE, prExtend}, // Mc TAMIL VOWEL SIGN AA - {0x0BBF, 0x0BBF, prSpacingMark}, // Mc TAMIL VOWEL SIGN I - {0x0BC0, 0x0BC0, prExtend}, // Mn TAMIL VOWEL SIGN II - {0x0BC1, 0x0BC2, prSpacingMark}, // Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU - {0x0BC6, 0x0BC8, prSpacingMark}, // Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI - {0x0BCA, 0x0BCC, prSpacingMark}, // Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU - {0x0BCD, 0x0BCD, prExtend}, // Mn TAMIL SIGN VIRAMA - {0x0BD7, 0x0BD7, prExtend}, // Mc TAMIL AU LENGTH MARK - {0x0C00, 0x0C00, prExtend}, // Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE - {0x0C01, 0x0C03, prSpacingMark}, // Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA - {0x0C04, 0x0C04, prExtend}, // Mn TELUGU SIGN COMBINING ANUSVARA ABOVE - {0x0C3E, 0x0C40, prExtend}, // Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II - {0x0C41, 0x0C44, prSpacingMark}, // Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR - {0x0C46, 0x0C48, prExtend}, // Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI - {0x0C4A, 0x0C4D, prExtend}, // Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA - {0x0C55, 0x0C56, prExtend}, // Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK - {0x0C62, 0x0C63, prExtend}, // Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL - {0x0C81, 0x0C81, prExtend}, // Mn KANNADA SIGN CANDRABINDU - {0x0C82, 0x0C83, prSpacingMark}, // Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA - {0x0CBC, 0x0CBC, prExtend}, // Mn KANNADA SIGN NUKTA - {0x0CBE, 0x0CBE, prSpacingMark}, // Mc KANNADA VOWEL SIGN AA - {0x0CBF, 0x0CBF, prExtend}, // Mn KANNADA VOWEL SIGN I - {0x0CC0, 0x0CC1, prSpacingMark}, // Mc [2] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN U - {0x0CC2, 0x0CC2, prExtend}, // Mc KANNADA VOWEL SIGN UU - {0x0CC3, 0x0CC4, prSpacingMark}, // Mc [2] KANNADA VOWEL SIGN VOCALIC R..KANNADA VOWEL SIGN VOCALIC RR - {0x0CC6, 0x0CC6, prExtend}, // Mn KANNADA VOWEL SIGN E - {0x0CC7, 0x0CC8, prSpacingMark}, // Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI - {0x0CCA, 0x0CCB, prSpacingMark}, // Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO - {0x0CCC, 0x0CCD, prExtend}, // Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA - {0x0CD5, 0x0CD6, prExtend}, // Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK - {0x0CE2, 0x0CE3, prExtend}, // Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL - {0x0D00, 0x0D01, prExtend}, // Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU - {0x0D02, 0x0D03, prSpacingMark}, // Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA - {0x0D3B, 0x0D3C, prExtend}, // Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA - {0x0D3E, 0x0D3E, prExtend}, // Mc MALAYALAM VOWEL SIGN AA - {0x0D3F, 0x0D40, prSpacingMark}, // Mc [2] MALAYALAM VOWEL SIGN I..MALAYALAM VOWEL SIGN II - {0x0D41, 0x0D44, prExtend}, // Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR - {0x0D46, 0x0D48, prSpacingMark}, // Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI - {0x0D4A, 0x0D4C, prSpacingMark}, // Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU - {0x0D4D, 0x0D4D, prExtend}, // Mn MALAYALAM SIGN VIRAMA - {0x0D4E, 0x0D4E, prPreprend}, // Lo MALAYALAM LETTER DOT REPH - {0x0D57, 0x0D57, prExtend}, // Mc MALAYALAM AU LENGTH MARK - {0x0D62, 0x0D63, prExtend}, // Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL - {0x0D82, 0x0D83, prSpacingMark}, // Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA - {0x0DCA, 0x0DCA, prExtend}, // Mn SINHALA SIGN AL-LAKUNA - {0x0DCF, 0x0DCF, prExtend}, // Mc SINHALA VOWEL SIGN AELA-PILLA - {0x0DD0, 0x0DD1, prSpacingMark}, // Mc [2] SINHALA VOWEL SIGN KETTI AEDA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA - {0x0DD2, 0x0DD4, prExtend}, // Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA - {0x0DD6, 0x0DD6, prExtend}, // Mn SINHALA VOWEL SIGN DIGA PAA-PILLA - {0x0DD8, 0x0DDE, prSpacingMark}, // Mc [7] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA - {0x0DDF, 0x0DDF, prExtend}, // Mc SINHALA VOWEL SIGN GAYANUKITTA - {0x0DF2, 0x0DF3, prSpacingMark}, // Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA - {0x0E31, 0x0E31, prExtend}, // Mn THAI CHARACTER MAI HAN-AKAT - {0x0E33, 0x0E33, prSpacingMark}, // Lo THAI CHARACTER SARA AM - {0x0E34, 0x0E3A, prExtend}, // Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU - {0x0E47, 0x0E4E, prExtend}, // Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN - {0x0EB1, 0x0EB1, prExtend}, // Mn LAO VOWEL SIGN MAI KAN - {0x0EB3, 0x0EB3, prSpacingMark}, // Lo LAO VOWEL SIGN AM - {0x0EB4, 0x0EBC, prExtend}, // Mn [9] LAO VOWEL SIGN I..LAO SEMIVOWEL SIGN LO - {0x0EC8, 0x0ECD, prExtend}, // Mn [6] LAO TONE MAI EK..LAO NIGGAHITA - {0x0F18, 0x0F19, prExtend}, // Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS - {0x0F35, 0x0F35, prExtend}, // Mn TIBETAN MARK NGAS BZUNG NYI ZLA - {0x0F37, 0x0F37, prExtend}, // Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS - {0x0F39, 0x0F39, prExtend}, // Mn TIBETAN MARK TSA -PHRU - {0x0F3E, 0x0F3F, prSpacingMark}, // Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES - {0x0F71, 0x0F7E, prExtend}, // Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO - {0x0F7F, 0x0F7F, prSpacingMark}, // Mc TIBETAN SIGN RNAM BCAD - {0x0F80, 0x0F84, prExtend}, // Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA - {0x0F86, 0x0F87, prExtend}, // Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS - {0x0F8D, 0x0F97, prExtend}, // Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA - {0x0F99, 0x0FBC, prExtend}, // Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA - {0x0FC6, 0x0FC6, prExtend}, // Mn TIBETAN SYMBOL PADMA GDAN - {0x102D, 0x1030, prExtend}, // Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU - {0x1031, 0x1031, prSpacingMark}, // Mc MYANMAR VOWEL SIGN E - {0x1032, 0x1037, prExtend}, // Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW - {0x1039, 0x103A, prExtend}, // Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT - {0x103B, 0x103C, prSpacingMark}, // Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA - {0x103D, 0x103E, prExtend}, // Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA - {0x1056, 0x1057, prSpacingMark}, // Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR - {0x1058, 0x1059, prExtend}, // Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL - {0x105E, 0x1060, prExtend}, // Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA - {0x1071, 0x1074, prExtend}, // Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE - {0x1082, 0x1082, prExtend}, // Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA - {0x1084, 0x1084, prSpacingMark}, // Mc MYANMAR VOWEL SIGN SHAN E - {0x1085, 0x1086, prExtend}, // Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y - {0x108D, 0x108D, prExtend}, // Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE - {0x109D, 0x109D, prExtend}, // Mn MYANMAR VOWEL SIGN AITON AI - {0x1100, 0x115F, prL}, // Lo [96] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG FILLER - {0x1160, 0x11A7, prV}, // Lo [72] HANGUL JUNGSEONG FILLER..HANGUL JUNGSEONG O-YAE - {0x11A8, 0x11FF, prT}, // Lo [88] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG SSANGNIEUN - {0x135D, 0x135F, prExtend}, // Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK - {0x1712, 0x1714, prExtend}, // Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA - {0x1732, 0x1734, prExtend}, // Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD - {0x1752, 0x1753, prExtend}, // Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U - {0x1772, 0x1773, prExtend}, // Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U - {0x17B4, 0x17B5, prExtend}, // Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA - {0x17B6, 0x17B6, prSpacingMark}, // Mc KHMER VOWEL SIGN AA - {0x17B7, 0x17BD, prExtend}, // Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA - {0x17BE, 0x17C5, prSpacingMark}, // Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU - {0x17C6, 0x17C6, prExtend}, // Mn KHMER SIGN NIKAHIT - {0x17C7, 0x17C8, prSpacingMark}, // Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU - {0x17C9, 0x17D3, prExtend}, // Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT - {0x17DD, 0x17DD, prExtend}, // Mn KHMER SIGN ATTHACAN - {0x180B, 0x180D, prExtend}, // Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE - {0x180E, 0x180E, prControl}, // Cf MONGOLIAN VOWEL SEPARATOR - {0x1885, 0x1886, prExtend}, // Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA - {0x18A9, 0x18A9, prExtend}, // Mn MONGOLIAN LETTER ALI GALI DAGALGA - {0x1920, 0x1922, prExtend}, // Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U - {0x1923, 0x1926, prSpacingMark}, // Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU - {0x1927, 0x1928, prExtend}, // Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O - {0x1929, 0x192B, prSpacingMark}, // Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA - {0x1930, 0x1931, prSpacingMark}, // Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA - {0x1932, 0x1932, prExtend}, // Mn LIMBU SMALL LETTER ANUSVARA - {0x1933, 0x1938, prSpacingMark}, // Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA - {0x1939, 0x193B, prExtend}, // Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I - {0x1A17, 0x1A18, prExtend}, // Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U - {0x1A19, 0x1A1A, prSpacingMark}, // Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O - {0x1A1B, 0x1A1B, prExtend}, // Mn BUGINESE VOWEL SIGN AE - {0x1A55, 0x1A55, prSpacingMark}, // Mc TAI THAM CONSONANT SIGN MEDIAL RA - {0x1A56, 0x1A56, prExtend}, // Mn TAI THAM CONSONANT SIGN MEDIAL LA - {0x1A57, 0x1A57, prSpacingMark}, // Mc TAI THAM CONSONANT SIGN LA TANG LAI - {0x1A58, 0x1A5E, prExtend}, // Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA - {0x1A60, 0x1A60, prExtend}, // Mn TAI THAM SIGN SAKOT - {0x1A62, 0x1A62, prExtend}, // Mn TAI THAM VOWEL SIGN MAI SAT - {0x1A65, 0x1A6C, prExtend}, // Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW - {0x1A6D, 0x1A72, prSpacingMark}, // Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI - {0x1A73, 0x1A7C, prExtend}, // Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN - {0x1A7F, 0x1A7F, prExtend}, // Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT - {0x1AB0, 0x1ABD, prExtend}, // Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW - {0x1ABE, 0x1ABE, prExtend}, // Me COMBINING PARENTHESES OVERLAY - {0x1B00, 0x1B03, prExtend}, // Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG - {0x1B04, 0x1B04, prSpacingMark}, // Mc BALINESE SIGN BISAH - {0x1B34, 0x1B34, prExtend}, // Mn BALINESE SIGN REREKAN - {0x1B35, 0x1B35, prExtend}, // Mc BALINESE VOWEL SIGN TEDUNG - {0x1B36, 0x1B3A, prExtend}, // Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA - {0x1B3B, 0x1B3B, prSpacingMark}, // Mc BALINESE VOWEL SIGN RA REPA TEDUNG - {0x1B3C, 0x1B3C, prExtend}, // Mn BALINESE VOWEL SIGN LA LENGA - {0x1B3D, 0x1B41, prSpacingMark}, // Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG - {0x1B42, 0x1B42, prExtend}, // Mn BALINESE VOWEL SIGN PEPET - {0x1B43, 0x1B44, prSpacingMark}, // Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG - {0x1B6B, 0x1B73, prExtend}, // Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG - {0x1B80, 0x1B81, prExtend}, // Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR - {0x1B82, 0x1B82, prSpacingMark}, // Mc SUNDANESE SIGN PANGWISAD - {0x1BA1, 0x1BA1, prSpacingMark}, // Mc SUNDANESE CONSONANT SIGN PAMINGKAL - {0x1BA2, 0x1BA5, prExtend}, // Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU - {0x1BA6, 0x1BA7, prSpacingMark}, // Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG - {0x1BA8, 0x1BA9, prExtend}, // Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG - {0x1BAA, 0x1BAA, prSpacingMark}, // Mc SUNDANESE SIGN PAMAAEH - {0x1BAB, 0x1BAD, prExtend}, // Mn [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA - {0x1BE6, 0x1BE6, prExtend}, // Mn BATAK SIGN TOMPI - {0x1BE7, 0x1BE7, prSpacingMark}, // Mc BATAK VOWEL SIGN E - {0x1BE8, 0x1BE9, prExtend}, // Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE - {0x1BEA, 0x1BEC, prSpacingMark}, // Mc [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O - {0x1BED, 0x1BED, prExtend}, // Mn BATAK VOWEL SIGN KARO O - {0x1BEE, 0x1BEE, prSpacingMark}, // Mc BATAK VOWEL SIGN U - {0x1BEF, 0x1BF1, prExtend}, // Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H - {0x1BF2, 0x1BF3, prSpacingMark}, // Mc [2] BATAK PANGOLAT..BATAK PANONGONAN - {0x1C24, 0x1C2B, prSpacingMark}, // Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU - {0x1C2C, 0x1C33, prExtend}, // Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T - {0x1C34, 0x1C35, prSpacingMark}, // Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG - {0x1C36, 0x1C37, prExtend}, // Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA - {0x1CD0, 0x1CD2, prExtend}, // Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA - {0x1CD4, 0x1CE0, prExtend}, // Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA - {0x1CE1, 0x1CE1, prSpacingMark}, // Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA - {0x1CE2, 0x1CE8, prExtend}, // Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL - {0x1CED, 0x1CED, prExtend}, // Mn VEDIC SIGN TIRYAK - {0x1CF4, 0x1CF4, prExtend}, // Mn VEDIC TONE CANDRA ABOVE - {0x1CF7, 0x1CF7, prSpacingMark}, // Mc VEDIC SIGN ATIKRAMA - {0x1CF8, 0x1CF9, prExtend}, // Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE - {0x1DC0, 0x1DF9, prExtend}, // Mn [58] COMBINING DOTTED GRAVE ACCENT..COMBINING WIDE INVERTED BRIDGE BELOW - {0x1DFB, 0x1DFF, prExtend}, // Mn [5] COMBINING DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW - {0x200B, 0x200B, prControl}, // Cf ZERO WIDTH SPACE - {0x200C, 0x200C, prExtend}, // Cf ZERO WIDTH NON-JOINER - {0x200D, 0x200D, prZWJ}, // Cf ZERO WIDTH JOINER - {0x200E, 0x200F, prControl}, // Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK - {0x2028, 0x2028, prControl}, // Zl LINE SEPARATOR - {0x2029, 0x2029, prControl}, // Zp PARAGRAPH SEPARATOR - {0x202A, 0x202E, prControl}, // Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE - {0x203C, 0x203C, prExtendedPictographic}, // 1.1 [1] (‼️) double exclamation mark - {0x2049, 0x2049, prExtendedPictographic}, // 3.0 [1] (â‰ď¸Ź) exclamation question mark - {0x2060, 0x2064, prControl}, // Cf [5] WORD JOINER..INVISIBLE PLUS - {0x2065, 0x2065, prControl}, // Cn - {0x2066, 0x206F, prControl}, // Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES - {0x20D0, 0x20DC, prExtend}, // Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE - {0x20DD, 0x20E0, prExtend}, // Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH - {0x20E1, 0x20E1, prExtend}, // Mn COMBINING LEFT RIGHT ARROW ABOVE - {0x20E2, 0x20E4, prExtend}, // Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE - {0x20E5, 0x20F0, prExtend}, // Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE - {0x2122, 0x2122, prExtendedPictographic}, // 1.1 [1] (™️) trade mark - {0x2139, 0x2139, prExtendedPictographic}, // 3.0 [1] (ℹ️) information - {0x2194, 0x2199, prExtendedPictographic}, // 1.1 [6] (↔️..↙️) left-right arrow..down-left arrow - {0x21A9, 0x21AA, prExtendedPictographic}, // 1.1 [2] (↩️..↪️) right arrow curving left..left arrow curving right - {0x231A, 0x231B, prExtendedPictographic}, // 1.1 [2] (⌚..⌛) watch..hourglass done - {0x2328, 0x2328, prExtendedPictographic}, // 1.1 [1] (⌨️) keyboard - {0x2388, 0x2388, prExtendedPictographic}, // 3.0 [1] (âŽ) HELM SYMBOL - {0x23CF, 0x23CF, prExtendedPictographic}, // 4.0 [1] (⏏️) eject button - {0x23E9, 0x23F3, prExtendedPictographic}, // 6.0 [11] (⏩..⏳) fast-forward button..hourglass not done - {0x23F8, 0x23FA, prExtendedPictographic}, // 7.0 [3] (⏸️..⏺️) pause button..record button - {0x24C2, 0x24C2, prExtendedPictographic}, // 1.1 [1] (Ⓜ️) circled M - {0x25AA, 0x25AB, prExtendedPictographic}, // 1.1 [2] (▪️..▫️) black small square..white small square - {0x25B6, 0x25B6, prExtendedPictographic}, // 1.1 [1] (▶️) play button - {0x25C0, 0x25C0, prExtendedPictographic}, // 1.1 [1] (◀️) reverse button - {0x25FB, 0x25FE, prExtendedPictographic}, // 3.2 [4] (◻️..â—ľ) white medium square..black medium-small square - {0x2600, 0x2605, prExtendedPictographic}, // 1.1 [6] (â€ď¸Ź..â…) sun..BLACK STAR - {0x2607, 0x2612, prExtendedPictographic}, // 1.1 [12] (â‡..â’) LIGHTNING..BALLOT BOX WITH X - {0x2614, 0x2615, prExtendedPictographic}, // 4.0 [2] (â”..â•) umbrella with rain drops..hot beverage - {0x2616, 0x2617, prExtendedPictographic}, // 3.2 [2] (â–..â—) WHITE SHOGI PIECE..BLACK SHOGI PIECE - {0x2618, 0x2618, prExtendedPictographic}, // 4.1 [1] (â️) shamrock - {0x2619, 0x2619, prExtendedPictographic}, // 3.0 [1] (â™) REVERSED ROTATED FLORAL HEART BULLET - {0x261A, 0x266F, prExtendedPictographic}, // 1.1 [86] (âš..♯) BLACK LEFT POINTING INDEX..MUSIC SHARP SIGN - {0x2670, 0x2671, prExtendedPictographic}, // 3.0 [2] (â™°..â™±) WEST SYRIAC CROSS..EAST SYRIAC CROSS - {0x2672, 0x267D, prExtendedPictographic}, // 3.2 [12] (♲..â™˝) UNIVERSAL RECYCLING SYMBOL..PARTIALLY-RECYCLED PAPER SYMBOL - {0x267E, 0x267F, prExtendedPictographic}, // 4.1 [2] (♾️..♿) infinity..wheelchair symbol - {0x2680, 0x2685, prExtendedPictographic}, // 3.2 [6] (⚀..âš…) DIE FACE-1..DIE FACE-6 - {0x2690, 0x2691, prExtendedPictographic}, // 4.0 [2] (âš..âš‘) WHITE FLAG..BLACK FLAG - {0x2692, 0x269C, prExtendedPictographic}, // 4.1 [11] (⚒️..⚜️) hammer and pick..fleur-de-lis - {0x269D, 0x269D, prExtendedPictographic}, // 5.1 [1] (âšť) OUTLINED WHITE STAR - {0x269E, 0x269F, prExtendedPictographic}, // 5.2 [2] (âšž..âšź) THREE LINES CONVERGING RIGHT..THREE LINES CONVERGING LEFT - {0x26A0, 0x26A1, prExtendedPictographic}, // 4.0 [2] (⚠️..⚡) warning..high voltage - {0x26A2, 0x26B1, prExtendedPictographic}, // 4.1 [16] (⚢..⚱️) DOUBLED FEMALE SIGN..funeral urn - {0x26B2, 0x26B2, prExtendedPictographic}, // 5.0 [1] (⚲) NEUTER - {0x26B3, 0x26BC, prExtendedPictographic}, // 5.1 [10] (âšł..⚼) CERES..SESQUIQUADRATE - {0x26BD, 0x26BF, prExtendedPictographic}, // 5.2 [3] (âš˝..âšż) soccer ball..SQUARED KEY - {0x26C0, 0x26C3, prExtendedPictographic}, // 5.1 [4] (⛀..â›) WHITE DRAUGHTS MAN..BLACK DRAUGHTS KING - {0x26C4, 0x26CD, prExtendedPictographic}, // 5.2 [10] (⛄..⛍) snowman without snow..DISABLED CAR - {0x26CE, 0x26CE, prExtendedPictographic}, // 6.0 [1] (⛎) Ophiuchus - {0x26CF, 0x26E1, prExtendedPictographic}, // 5.2 [19] (⛏️..⛡) pick..RESTRICTED LEFT ENTRY-2 - {0x26E2, 0x26E2, prExtendedPictographic}, // 6.0 [1] (⛢) ASTRONOMICAL SYMBOL FOR URANUS - {0x26E3, 0x26E3, prExtendedPictographic}, // 5.2 [1] (⛣) HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE - {0x26E4, 0x26E7, prExtendedPictographic}, // 6.0 [4] (⛤..â›§) PENTAGRAM..INVERTED PENTAGRAM - {0x26E8, 0x26FF, prExtendedPictographic}, // 5.2 [24] (⛨..⛿) BLACK CROSS ON SHIELD..WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE - {0x2700, 0x2700, prExtendedPictographic}, // 7.0 [1] (✀) BLACK SAFETY SCISSORS - {0x2701, 0x2704, prExtendedPictographic}, // 1.1 [4] (âś..âś„) UPPER BLADE SCISSORS..WHITE SCISSORS - {0x2705, 0x2705, prExtendedPictographic}, // 6.0 [1] (âś…) check mark button - {0x2708, 0x2709, prExtendedPictographic}, // 1.1 [2] (âśď¸Ź..✉️) airplane..envelope - {0x270A, 0x270B, prExtendedPictographic}, // 6.0 [2] (✊..âś‹) raised fist..raised hand - {0x270C, 0x2712, prExtendedPictographic}, // 1.1 [7] (✌️..✒️) victory hand..black nib - {0x2714, 0x2714, prExtendedPictographic}, // 1.1 [1] (✔️) check mark - {0x2716, 0x2716, prExtendedPictographic}, // 1.1 [1] (✖️) multiplication sign - {0x271D, 0x271D, prExtendedPictographic}, // 1.1 [1] (✝️) latin cross - {0x2721, 0x2721, prExtendedPictographic}, // 1.1 [1] (✡️) star of David - {0x2728, 0x2728, prExtendedPictographic}, // 6.0 [1] (✨) sparkles - {0x2733, 0x2734, prExtendedPictographic}, // 1.1 [2] (✳️..✴️) eight-spoked asterisk..eight-pointed star - {0x2744, 0x2744, prExtendedPictographic}, // 1.1 [1] (❄️) snowflake - {0x2747, 0x2747, prExtendedPictographic}, // 1.1 [1] (❇️) sparkle - {0x274C, 0x274C, prExtendedPictographic}, // 6.0 [1] (❌) cross mark - {0x274E, 0x274E, prExtendedPictographic}, // 6.0 [1] (❎) cross mark button - {0x2753, 0x2755, prExtendedPictographic}, // 6.0 [3] (âť“..âť•) question mark..white exclamation mark - {0x2757, 0x2757, prExtendedPictographic}, // 5.2 [1] (âť—) exclamation mark - {0x2763, 0x2767, prExtendedPictographic}, // 1.1 [5] (❣️..âť§) heart exclamation..ROTATED FLORAL HEART BULLET - {0x2795, 0x2797, prExtendedPictographic}, // 6.0 [3] (âž•..âž—) plus sign..division sign - {0x27A1, 0x27A1, prExtendedPictographic}, // 1.1 [1] (➡️) right arrow - {0x27B0, 0x27B0, prExtendedPictographic}, // 6.0 [1] (âž°) curly loop - {0x27BF, 0x27BF, prExtendedPictographic}, // 6.0 [1] (âžż) double curly loop - {0x2934, 0x2935, prExtendedPictographic}, // 3.2 [2] (⤴️..⤵️) right arrow curving up..right arrow curving down - {0x2B05, 0x2B07, prExtendedPictographic}, // 4.0 [3] (⬅️..⬇️) left arrow..down arrow - {0x2B1B, 0x2B1C, prExtendedPictographic}, // 5.1 [2] (⬛..⬜) black large square..white large square - {0x2B50, 0x2B50, prExtendedPictographic}, // 5.1 [1] (â­) star - {0x2B55, 0x2B55, prExtendedPictographic}, // 5.2 [1] (â­•) hollow red circle - {0x2CEF, 0x2CF1, prExtend}, // Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS - {0x2D7F, 0x2D7F, prExtend}, // Mn TIFINAGH CONSONANT JOINER - {0x2DE0, 0x2DFF, prExtend}, // Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS - {0x302A, 0x302D, prExtend}, // Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK - {0x302E, 0x302F, prExtend}, // Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK - {0x3030, 0x3030, prExtendedPictographic}, // 1.1 [1] (〰️) wavy dash - {0x303D, 0x303D, prExtendedPictographic}, // 3.2 [1] (〽️) part alternation mark - {0x3099, 0x309A, prExtend}, // Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK - {0x3297, 0x3297, prExtendedPictographic}, // 1.1 [1] (㊗️) Japanese “congratulations” button - {0x3299, 0x3299, prExtendedPictographic}, // 1.1 [1] (㊙️) Japanese “secret” button - {0xA66F, 0xA66F, prExtend}, // Mn COMBINING CYRILLIC VZMET - {0xA670, 0xA672, prExtend}, // Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN - {0xA674, 0xA67D, prExtend}, // Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK - {0xA69E, 0xA69F, prExtend}, // Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E - {0xA6F0, 0xA6F1, prExtend}, // Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS - {0xA802, 0xA802, prExtend}, // Mn SYLOTI NAGRI SIGN DVISVARA - {0xA806, 0xA806, prExtend}, // Mn SYLOTI NAGRI SIGN HASANTA - {0xA80B, 0xA80B, prExtend}, // Mn SYLOTI NAGRI SIGN ANUSVARA - {0xA823, 0xA824, prSpacingMark}, // Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I - {0xA825, 0xA826, prExtend}, // Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E - {0xA827, 0xA827, prSpacingMark}, // Mc SYLOTI NAGRI VOWEL SIGN OO - {0xA880, 0xA881, prSpacingMark}, // Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA - {0xA8B4, 0xA8C3, prSpacingMark}, // Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU - {0xA8C4, 0xA8C5, prExtend}, // Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU - {0xA8E0, 0xA8F1, prExtend}, // Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA - {0xA8FF, 0xA8FF, prExtend}, // Mn DEVANAGARI VOWEL SIGN AY - {0xA926, 0xA92D, prExtend}, // Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU - {0xA947, 0xA951, prExtend}, // Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R - {0xA952, 0xA953, prSpacingMark}, // Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA - {0xA960, 0xA97C, prL}, // Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH - {0xA980, 0xA982, prExtend}, // Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR - {0xA983, 0xA983, prSpacingMark}, // Mc JAVANESE SIGN WIGNYAN - {0xA9B3, 0xA9B3, prExtend}, // Mn JAVANESE SIGN CECAK TELU - {0xA9B4, 0xA9B5, prSpacingMark}, // Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG - {0xA9B6, 0xA9B9, prExtend}, // Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT - {0xA9BA, 0xA9BB, prSpacingMark}, // Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE - {0xA9BC, 0xA9BD, prExtend}, // Mn [2] JAVANESE VOWEL SIGN PEPET..JAVANESE CONSONANT SIGN KERET - {0xA9BE, 0xA9C0, prSpacingMark}, // Mc [3] JAVANESE CONSONANT SIGN PENGKAL..JAVANESE PANGKON - {0xA9E5, 0xA9E5, prExtend}, // Mn MYANMAR SIGN SHAN SAW - {0xAA29, 0xAA2E, prExtend}, // Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE - {0xAA2F, 0xAA30, prSpacingMark}, // Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI - {0xAA31, 0xAA32, prExtend}, // Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE - {0xAA33, 0xAA34, prSpacingMark}, // Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA - {0xAA35, 0xAA36, prExtend}, // Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA - {0xAA43, 0xAA43, prExtend}, // Mn CHAM CONSONANT SIGN FINAL NG - {0xAA4C, 0xAA4C, prExtend}, // Mn CHAM CONSONANT SIGN FINAL M - {0xAA4D, 0xAA4D, prSpacingMark}, // Mc CHAM CONSONANT SIGN FINAL H - {0xAA7C, 0xAA7C, prExtend}, // Mn MYANMAR SIGN TAI LAING TONE-2 - {0xAAB0, 0xAAB0, prExtend}, // Mn TAI VIET MAI KANG - {0xAAB2, 0xAAB4, prExtend}, // Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U - {0xAAB7, 0xAAB8, prExtend}, // Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA - {0xAABE, 0xAABF, prExtend}, // Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK - {0xAAC1, 0xAAC1, prExtend}, // Mn TAI VIET TONE MAI THO - {0xAAEB, 0xAAEB, prSpacingMark}, // Mc MEETEI MAYEK VOWEL SIGN II - {0xAAEC, 0xAAED, prExtend}, // Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI - {0xAAEE, 0xAAEF, prSpacingMark}, // Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU - {0xAAF5, 0xAAF5, prSpacingMark}, // Mc MEETEI MAYEK VOWEL SIGN VISARGA - {0xAAF6, 0xAAF6, prExtend}, // Mn MEETEI MAYEK VIRAMA - {0xABE3, 0xABE4, prSpacingMark}, // Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP - {0xABE5, 0xABE5, prExtend}, // Mn MEETEI MAYEK VOWEL SIGN ANAP - {0xABE6, 0xABE7, prSpacingMark}, // Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP - {0xABE8, 0xABE8, prExtend}, // Mn MEETEI MAYEK VOWEL SIGN UNAP - {0xABE9, 0xABEA, prSpacingMark}, // Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG - {0xABEC, 0xABEC, prSpacingMark}, // Mc MEETEI MAYEK LUM IYEK - {0xABED, 0xABED, prExtend}, // Mn MEETEI MAYEK APUN IYEK - {0xAC00, 0xAC00, prLV}, // Lo HANGUL SYLLABLE GA - {0xAC01, 0xAC1B, prLVT}, // Lo [27] HANGUL SYLLABLE GAG..HANGUL SYLLABLE GAH - {0xAC1C, 0xAC1C, prLV}, // Lo HANGUL SYLLABLE GAE - {0xAC1D, 0xAC37, prLVT}, // Lo [27] HANGUL SYLLABLE GAEG..HANGUL SYLLABLE GAEH - {0xAC38, 0xAC38, prLV}, // Lo HANGUL SYLLABLE GYA - {0xAC39, 0xAC53, prLVT}, // Lo [27] HANGUL SYLLABLE GYAG..HANGUL SYLLABLE GYAH - {0xAC54, 0xAC54, prLV}, // Lo HANGUL SYLLABLE GYAE - {0xAC55, 0xAC6F, prLVT}, // Lo [27] HANGUL SYLLABLE GYAEG..HANGUL SYLLABLE GYAEH - {0xAC70, 0xAC70, prLV}, // Lo HANGUL SYLLABLE GEO - {0xAC71, 0xAC8B, prLVT}, // Lo [27] HANGUL SYLLABLE GEOG..HANGUL SYLLABLE GEOH - {0xAC8C, 0xAC8C, prLV}, // Lo HANGUL SYLLABLE GE - {0xAC8D, 0xACA7, prLVT}, // Lo [27] HANGUL SYLLABLE GEG..HANGUL SYLLABLE GEH - {0xACA8, 0xACA8, prLV}, // Lo HANGUL SYLLABLE GYEO - {0xACA9, 0xACC3, prLVT}, // Lo [27] HANGUL SYLLABLE GYEOG..HANGUL SYLLABLE GYEOH - {0xACC4, 0xACC4, prLV}, // Lo HANGUL SYLLABLE GYE - {0xACC5, 0xACDF, prLVT}, // Lo [27] HANGUL SYLLABLE GYEG..HANGUL SYLLABLE GYEH - {0xACE0, 0xACE0, prLV}, // Lo HANGUL SYLLABLE GO - {0xACE1, 0xACFB, prLVT}, // Lo [27] HANGUL SYLLABLE GOG..HANGUL SYLLABLE GOH - {0xACFC, 0xACFC, prLV}, // Lo HANGUL SYLLABLE GWA - {0xACFD, 0xAD17, prLVT}, // Lo [27] HANGUL SYLLABLE GWAG..HANGUL SYLLABLE GWAH - {0xAD18, 0xAD18, prLV}, // Lo HANGUL SYLLABLE GWAE - {0xAD19, 0xAD33, prLVT}, // Lo [27] HANGUL SYLLABLE GWAEG..HANGUL SYLLABLE GWAEH - {0xAD34, 0xAD34, prLV}, // Lo HANGUL SYLLABLE GOE - {0xAD35, 0xAD4F, prLVT}, // Lo [27] HANGUL SYLLABLE GOEG..HANGUL SYLLABLE GOEH - {0xAD50, 0xAD50, prLV}, // Lo HANGUL SYLLABLE GYO - {0xAD51, 0xAD6B, prLVT}, // Lo [27] HANGUL SYLLABLE GYOG..HANGUL SYLLABLE GYOH - {0xAD6C, 0xAD6C, prLV}, // Lo HANGUL SYLLABLE GU - {0xAD6D, 0xAD87, prLVT}, // Lo [27] HANGUL SYLLABLE GUG..HANGUL SYLLABLE GUH - {0xAD88, 0xAD88, prLV}, // Lo HANGUL SYLLABLE GWEO - {0xAD89, 0xADA3, prLVT}, // Lo [27] HANGUL SYLLABLE GWEOG..HANGUL SYLLABLE GWEOH - {0xADA4, 0xADA4, prLV}, // Lo HANGUL SYLLABLE GWE - {0xADA5, 0xADBF, prLVT}, // Lo [27] HANGUL SYLLABLE GWEG..HANGUL SYLLABLE GWEH - {0xADC0, 0xADC0, prLV}, // Lo HANGUL SYLLABLE GWI - {0xADC1, 0xADDB, prLVT}, // Lo [27] HANGUL SYLLABLE GWIG..HANGUL SYLLABLE GWIH - {0xADDC, 0xADDC, prLV}, // Lo HANGUL SYLLABLE GYU - {0xADDD, 0xADF7, prLVT}, // Lo [27] HANGUL SYLLABLE GYUG..HANGUL SYLLABLE GYUH - {0xADF8, 0xADF8, prLV}, // Lo HANGUL SYLLABLE GEU - {0xADF9, 0xAE13, prLVT}, // Lo [27] HANGUL SYLLABLE GEUG..HANGUL SYLLABLE GEUH - {0xAE14, 0xAE14, prLV}, // Lo HANGUL SYLLABLE GYI - {0xAE15, 0xAE2F, prLVT}, // Lo [27] HANGUL SYLLABLE GYIG..HANGUL SYLLABLE GYIH - {0xAE30, 0xAE30, prLV}, // Lo HANGUL SYLLABLE GI - {0xAE31, 0xAE4B, prLVT}, // Lo [27] HANGUL SYLLABLE GIG..HANGUL SYLLABLE GIH - {0xAE4C, 0xAE4C, prLV}, // Lo HANGUL SYLLABLE GGA - {0xAE4D, 0xAE67, prLVT}, // Lo [27] HANGUL SYLLABLE GGAG..HANGUL SYLLABLE GGAH - {0xAE68, 0xAE68, prLV}, // Lo HANGUL SYLLABLE GGAE - {0xAE69, 0xAE83, prLVT}, // Lo [27] HANGUL SYLLABLE GGAEG..HANGUL SYLLABLE GGAEH - {0xAE84, 0xAE84, prLV}, // Lo HANGUL SYLLABLE GGYA - {0xAE85, 0xAE9F, prLVT}, // Lo [27] HANGUL SYLLABLE GGYAG..HANGUL SYLLABLE GGYAH - {0xAEA0, 0xAEA0, prLV}, // Lo HANGUL SYLLABLE GGYAE - {0xAEA1, 0xAEBB, prLVT}, // Lo [27] HANGUL SYLLABLE GGYAEG..HANGUL SYLLABLE GGYAEH - {0xAEBC, 0xAEBC, prLV}, // Lo HANGUL SYLLABLE GGEO - {0xAEBD, 0xAED7, prLVT}, // Lo [27] HANGUL SYLLABLE GGEOG..HANGUL SYLLABLE GGEOH - {0xAED8, 0xAED8, prLV}, // Lo HANGUL SYLLABLE GGE - {0xAED9, 0xAEF3, prLVT}, // Lo [27] HANGUL SYLLABLE GGEG..HANGUL SYLLABLE GGEH - {0xAEF4, 0xAEF4, prLV}, // Lo HANGUL SYLLABLE GGYEO - {0xAEF5, 0xAF0F, prLVT}, // Lo [27] HANGUL SYLLABLE GGYEOG..HANGUL SYLLABLE GGYEOH - {0xAF10, 0xAF10, prLV}, // Lo HANGUL SYLLABLE GGYE - {0xAF11, 0xAF2B, prLVT}, // Lo [27] HANGUL SYLLABLE GGYEG..HANGUL SYLLABLE GGYEH - {0xAF2C, 0xAF2C, prLV}, // Lo HANGUL SYLLABLE GGO - {0xAF2D, 0xAF47, prLVT}, // Lo [27] HANGUL SYLLABLE GGOG..HANGUL SYLLABLE GGOH - {0xAF48, 0xAF48, prLV}, // Lo HANGUL SYLLABLE GGWA - {0xAF49, 0xAF63, prLVT}, // Lo [27] HANGUL SYLLABLE GGWAG..HANGUL SYLLABLE GGWAH - {0xAF64, 0xAF64, prLV}, // Lo HANGUL SYLLABLE GGWAE - {0xAF65, 0xAF7F, prLVT}, // Lo [27] HANGUL SYLLABLE GGWAEG..HANGUL SYLLABLE GGWAEH - {0xAF80, 0xAF80, prLV}, // Lo HANGUL SYLLABLE GGOE - {0xAF81, 0xAF9B, prLVT}, // Lo [27] HANGUL SYLLABLE GGOEG..HANGUL SYLLABLE GGOEH - {0xAF9C, 0xAF9C, prLV}, // Lo HANGUL SYLLABLE GGYO - {0xAF9D, 0xAFB7, prLVT}, // Lo [27] HANGUL SYLLABLE GGYOG..HANGUL SYLLABLE GGYOH - {0xAFB8, 0xAFB8, prLV}, // Lo HANGUL SYLLABLE GGU - {0xAFB9, 0xAFD3, prLVT}, // Lo [27] HANGUL SYLLABLE GGUG..HANGUL SYLLABLE GGUH - {0xAFD4, 0xAFD4, prLV}, // Lo HANGUL SYLLABLE GGWEO - {0xAFD5, 0xAFEF, prLVT}, // Lo [27] HANGUL SYLLABLE GGWEOG..HANGUL SYLLABLE GGWEOH - {0xAFF0, 0xAFF0, prLV}, // Lo HANGUL SYLLABLE GGWE - {0xAFF1, 0xB00B, prLVT}, // Lo [27] HANGUL SYLLABLE GGWEG..HANGUL SYLLABLE GGWEH - {0xB00C, 0xB00C, prLV}, // Lo HANGUL SYLLABLE GGWI - {0xB00D, 0xB027, prLVT}, // Lo [27] HANGUL SYLLABLE GGWIG..HANGUL SYLLABLE GGWIH - {0xB028, 0xB028, prLV}, // Lo HANGUL SYLLABLE GGYU - {0xB029, 0xB043, prLVT}, // Lo [27] HANGUL SYLLABLE GGYUG..HANGUL SYLLABLE GGYUH - {0xB044, 0xB044, prLV}, // Lo HANGUL SYLLABLE GGEU - {0xB045, 0xB05F, prLVT}, // Lo [27] HANGUL SYLLABLE GGEUG..HANGUL SYLLABLE GGEUH - {0xB060, 0xB060, prLV}, // Lo HANGUL SYLLABLE GGYI - {0xB061, 0xB07B, prLVT}, // Lo [27] HANGUL SYLLABLE GGYIG..HANGUL SYLLABLE GGYIH - {0xB07C, 0xB07C, prLV}, // Lo HANGUL SYLLABLE GGI - {0xB07D, 0xB097, prLVT}, // Lo [27] HANGUL SYLLABLE GGIG..HANGUL SYLLABLE GGIH - {0xB098, 0xB098, prLV}, // Lo HANGUL SYLLABLE NA - {0xB099, 0xB0B3, prLVT}, // Lo [27] HANGUL SYLLABLE NAG..HANGUL SYLLABLE NAH - {0xB0B4, 0xB0B4, prLV}, // Lo HANGUL SYLLABLE NAE - {0xB0B5, 0xB0CF, prLVT}, // Lo [27] HANGUL SYLLABLE NAEG..HANGUL SYLLABLE NAEH - {0xB0D0, 0xB0D0, prLV}, // Lo HANGUL SYLLABLE NYA - {0xB0D1, 0xB0EB, prLVT}, // Lo [27] HANGUL SYLLABLE NYAG..HANGUL SYLLABLE NYAH - {0xB0EC, 0xB0EC, prLV}, // Lo HANGUL SYLLABLE NYAE - {0xB0ED, 0xB107, prLVT}, // Lo [27] HANGUL SYLLABLE NYAEG..HANGUL SYLLABLE NYAEH - {0xB108, 0xB108, prLV}, // Lo HANGUL SYLLABLE NEO - {0xB109, 0xB123, prLVT}, // Lo [27] HANGUL SYLLABLE NEOG..HANGUL SYLLABLE NEOH - {0xB124, 0xB124, prLV}, // Lo HANGUL SYLLABLE NE - {0xB125, 0xB13F, prLVT}, // Lo [27] HANGUL SYLLABLE NEG..HANGUL SYLLABLE NEH - {0xB140, 0xB140, prLV}, // Lo HANGUL SYLLABLE NYEO - {0xB141, 0xB15B, prLVT}, // Lo [27] HANGUL SYLLABLE NYEOG..HANGUL SYLLABLE NYEOH - {0xB15C, 0xB15C, prLV}, // Lo HANGUL SYLLABLE NYE - {0xB15D, 0xB177, prLVT}, // Lo [27] HANGUL SYLLABLE NYEG..HANGUL SYLLABLE NYEH - {0xB178, 0xB178, prLV}, // Lo HANGUL SYLLABLE NO - {0xB179, 0xB193, prLVT}, // Lo [27] HANGUL SYLLABLE NOG..HANGUL SYLLABLE NOH - {0xB194, 0xB194, prLV}, // Lo HANGUL SYLLABLE NWA - {0xB195, 0xB1AF, prLVT}, // Lo [27] HANGUL SYLLABLE NWAG..HANGUL SYLLABLE NWAH - {0xB1B0, 0xB1B0, prLV}, // Lo HANGUL SYLLABLE NWAE - {0xB1B1, 0xB1CB, prLVT}, // Lo [27] HANGUL SYLLABLE NWAEG..HANGUL SYLLABLE NWAEH - {0xB1CC, 0xB1CC, prLV}, // Lo HANGUL SYLLABLE NOE - {0xB1CD, 0xB1E7, prLVT}, // Lo [27] HANGUL SYLLABLE NOEG..HANGUL SYLLABLE NOEH - {0xB1E8, 0xB1E8, prLV}, // Lo HANGUL SYLLABLE NYO - {0xB1E9, 0xB203, prLVT}, // Lo [27] HANGUL SYLLABLE NYOG..HANGUL SYLLABLE NYOH - {0xB204, 0xB204, prLV}, // Lo HANGUL SYLLABLE NU - {0xB205, 0xB21F, prLVT}, // Lo [27] HANGUL SYLLABLE NUG..HANGUL SYLLABLE NUH - {0xB220, 0xB220, prLV}, // Lo HANGUL SYLLABLE NWEO - {0xB221, 0xB23B, prLVT}, // Lo [27] HANGUL SYLLABLE NWEOG..HANGUL SYLLABLE NWEOH - {0xB23C, 0xB23C, prLV}, // Lo HANGUL SYLLABLE NWE - {0xB23D, 0xB257, prLVT}, // Lo [27] HANGUL SYLLABLE NWEG..HANGUL SYLLABLE NWEH - {0xB258, 0xB258, prLV}, // Lo HANGUL SYLLABLE NWI - {0xB259, 0xB273, prLVT}, // Lo [27] HANGUL SYLLABLE NWIG..HANGUL SYLLABLE NWIH - {0xB274, 0xB274, prLV}, // Lo HANGUL SYLLABLE NYU - {0xB275, 0xB28F, prLVT}, // Lo [27] HANGUL SYLLABLE NYUG..HANGUL SYLLABLE NYUH - {0xB290, 0xB290, prLV}, // Lo HANGUL SYLLABLE NEU - {0xB291, 0xB2AB, prLVT}, // Lo [27] HANGUL SYLLABLE NEUG..HANGUL SYLLABLE NEUH - {0xB2AC, 0xB2AC, prLV}, // Lo HANGUL SYLLABLE NYI - {0xB2AD, 0xB2C7, prLVT}, // Lo [27] HANGUL SYLLABLE NYIG..HANGUL SYLLABLE NYIH - {0xB2C8, 0xB2C8, prLV}, // Lo HANGUL SYLLABLE NI - {0xB2C9, 0xB2E3, prLVT}, // Lo [27] HANGUL SYLLABLE NIG..HANGUL SYLLABLE NIH - {0xB2E4, 0xB2E4, prLV}, // Lo HANGUL SYLLABLE DA - {0xB2E5, 0xB2FF, prLVT}, // Lo [27] HANGUL SYLLABLE DAG..HANGUL SYLLABLE DAH - {0xB300, 0xB300, prLV}, // Lo HANGUL SYLLABLE DAE - {0xB301, 0xB31B, prLVT}, // Lo [27] HANGUL SYLLABLE DAEG..HANGUL SYLLABLE DAEH - {0xB31C, 0xB31C, prLV}, // Lo HANGUL SYLLABLE DYA - {0xB31D, 0xB337, prLVT}, // Lo [27] HANGUL SYLLABLE DYAG..HANGUL SYLLABLE DYAH - {0xB338, 0xB338, prLV}, // Lo HANGUL SYLLABLE DYAE - {0xB339, 0xB353, prLVT}, // Lo [27] HANGUL SYLLABLE DYAEG..HANGUL SYLLABLE DYAEH - {0xB354, 0xB354, prLV}, // Lo HANGUL SYLLABLE DEO - {0xB355, 0xB36F, prLVT}, // Lo [27] HANGUL SYLLABLE DEOG..HANGUL SYLLABLE DEOH - {0xB370, 0xB370, prLV}, // Lo HANGUL SYLLABLE DE - {0xB371, 0xB38B, prLVT}, // Lo [27] HANGUL SYLLABLE DEG..HANGUL SYLLABLE DEH - {0xB38C, 0xB38C, prLV}, // Lo HANGUL SYLLABLE DYEO - {0xB38D, 0xB3A7, prLVT}, // Lo [27] HANGUL SYLLABLE DYEOG..HANGUL SYLLABLE DYEOH - {0xB3A8, 0xB3A8, prLV}, // Lo HANGUL SYLLABLE DYE - {0xB3A9, 0xB3C3, prLVT}, // Lo [27] HANGUL SYLLABLE DYEG..HANGUL SYLLABLE DYEH - {0xB3C4, 0xB3C4, prLV}, // Lo HANGUL SYLLABLE DO - {0xB3C5, 0xB3DF, prLVT}, // Lo [27] HANGUL SYLLABLE DOG..HANGUL SYLLABLE DOH - {0xB3E0, 0xB3E0, prLV}, // Lo HANGUL SYLLABLE DWA - {0xB3E1, 0xB3FB, prLVT}, // Lo [27] HANGUL SYLLABLE DWAG..HANGUL SYLLABLE DWAH - {0xB3FC, 0xB3FC, prLV}, // Lo HANGUL SYLLABLE DWAE - {0xB3FD, 0xB417, prLVT}, // Lo [27] HANGUL SYLLABLE DWAEG..HANGUL SYLLABLE DWAEH - {0xB418, 0xB418, prLV}, // Lo HANGUL SYLLABLE DOE - {0xB419, 0xB433, prLVT}, // Lo [27] HANGUL SYLLABLE DOEG..HANGUL SYLLABLE DOEH - {0xB434, 0xB434, prLV}, // Lo HANGUL SYLLABLE DYO - {0xB435, 0xB44F, prLVT}, // Lo [27] HANGUL SYLLABLE DYOG..HANGUL SYLLABLE DYOH - {0xB450, 0xB450, prLV}, // Lo HANGUL SYLLABLE DU - {0xB451, 0xB46B, prLVT}, // Lo [27] HANGUL SYLLABLE DUG..HANGUL SYLLABLE DUH - {0xB46C, 0xB46C, prLV}, // Lo HANGUL SYLLABLE DWEO - {0xB46D, 0xB487, prLVT}, // Lo [27] HANGUL SYLLABLE DWEOG..HANGUL SYLLABLE DWEOH - {0xB488, 0xB488, prLV}, // Lo HANGUL SYLLABLE DWE - {0xB489, 0xB4A3, prLVT}, // Lo [27] HANGUL SYLLABLE DWEG..HANGUL SYLLABLE DWEH - {0xB4A4, 0xB4A4, prLV}, // Lo HANGUL SYLLABLE DWI - {0xB4A5, 0xB4BF, prLVT}, // Lo [27] HANGUL SYLLABLE DWIG..HANGUL SYLLABLE DWIH - {0xB4C0, 0xB4C0, prLV}, // Lo HANGUL SYLLABLE DYU - {0xB4C1, 0xB4DB, prLVT}, // Lo [27] HANGUL SYLLABLE DYUG..HANGUL SYLLABLE DYUH - {0xB4DC, 0xB4DC, prLV}, // Lo HANGUL SYLLABLE DEU - {0xB4DD, 0xB4F7, prLVT}, // Lo [27] HANGUL SYLLABLE DEUG..HANGUL SYLLABLE DEUH - {0xB4F8, 0xB4F8, prLV}, // Lo HANGUL SYLLABLE DYI - {0xB4F9, 0xB513, prLVT}, // Lo [27] HANGUL SYLLABLE DYIG..HANGUL SYLLABLE DYIH - {0xB514, 0xB514, prLV}, // Lo HANGUL SYLLABLE DI - {0xB515, 0xB52F, prLVT}, // Lo [27] HANGUL SYLLABLE DIG..HANGUL SYLLABLE DIH - {0xB530, 0xB530, prLV}, // Lo HANGUL SYLLABLE DDA - {0xB531, 0xB54B, prLVT}, // Lo [27] HANGUL SYLLABLE DDAG..HANGUL SYLLABLE DDAH - {0xB54C, 0xB54C, prLV}, // Lo HANGUL SYLLABLE DDAE - {0xB54D, 0xB567, prLVT}, // Lo [27] HANGUL SYLLABLE DDAEG..HANGUL SYLLABLE DDAEH - {0xB568, 0xB568, prLV}, // Lo HANGUL SYLLABLE DDYA - {0xB569, 0xB583, prLVT}, // Lo [27] HANGUL SYLLABLE DDYAG..HANGUL SYLLABLE DDYAH - {0xB584, 0xB584, prLV}, // Lo HANGUL SYLLABLE DDYAE - {0xB585, 0xB59F, prLVT}, // Lo [27] HANGUL SYLLABLE DDYAEG..HANGUL SYLLABLE DDYAEH - {0xB5A0, 0xB5A0, prLV}, // Lo HANGUL SYLLABLE DDEO - {0xB5A1, 0xB5BB, prLVT}, // Lo [27] HANGUL SYLLABLE DDEOG..HANGUL SYLLABLE DDEOH - {0xB5BC, 0xB5BC, prLV}, // Lo HANGUL SYLLABLE DDE - {0xB5BD, 0xB5D7, prLVT}, // Lo [27] HANGUL SYLLABLE DDEG..HANGUL SYLLABLE DDEH - {0xB5D8, 0xB5D8, prLV}, // Lo HANGUL SYLLABLE DDYEO - {0xB5D9, 0xB5F3, prLVT}, // Lo [27] HANGUL SYLLABLE DDYEOG..HANGUL SYLLABLE DDYEOH - {0xB5F4, 0xB5F4, prLV}, // Lo HANGUL SYLLABLE DDYE - {0xB5F5, 0xB60F, prLVT}, // Lo [27] HANGUL SYLLABLE DDYEG..HANGUL SYLLABLE DDYEH - {0xB610, 0xB610, prLV}, // Lo HANGUL SYLLABLE DDO - {0xB611, 0xB62B, prLVT}, // Lo [27] HANGUL SYLLABLE DDOG..HANGUL SYLLABLE DDOH - {0xB62C, 0xB62C, prLV}, // Lo HANGUL SYLLABLE DDWA - {0xB62D, 0xB647, prLVT}, // Lo [27] HANGUL SYLLABLE DDWAG..HANGUL SYLLABLE DDWAH - {0xB648, 0xB648, prLV}, // Lo HANGUL SYLLABLE DDWAE - {0xB649, 0xB663, prLVT}, // Lo [27] HANGUL SYLLABLE DDWAEG..HANGUL SYLLABLE DDWAEH - {0xB664, 0xB664, prLV}, // Lo HANGUL SYLLABLE DDOE - {0xB665, 0xB67F, prLVT}, // Lo [27] HANGUL SYLLABLE DDOEG..HANGUL SYLLABLE DDOEH - {0xB680, 0xB680, prLV}, // Lo HANGUL SYLLABLE DDYO - {0xB681, 0xB69B, prLVT}, // Lo [27] HANGUL SYLLABLE DDYOG..HANGUL SYLLABLE DDYOH - {0xB69C, 0xB69C, prLV}, // Lo HANGUL SYLLABLE DDU - {0xB69D, 0xB6B7, prLVT}, // Lo [27] HANGUL SYLLABLE DDUG..HANGUL SYLLABLE DDUH - {0xB6B8, 0xB6B8, prLV}, // Lo HANGUL SYLLABLE DDWEO - {0xB6B9, 0xB6D3, prLVT}, // Lo [27] HANGUL SYLLABLE DDWEOG..HANGUL SYLLABLE DDWEOH - {0xB6D4, 0xB6D4, prLV}, // Lo HANGUL SYLLABLE DDWE - {0xB6D5, 0xB6EF, prLVT}, // Lo [27] HANGUL SYLLABLE DDWEG..HANGUL SYLLABLE DDWEH - {0xB6F0, 0xB6F0, prLV}, // Lo HANGUL SYLLABLE DDWI - {0xB6F1, 0xB70B, prLVT}, // Lo [27] HANGUL SYLLABLE DDWIG..HANGUL SYLLABLE DDWIH - {0xB70C, 0xB70C, prLV}, // Lo HANGUL SYLLABLE DDYU - {0xB70D, 0xB727, prLVT}, // Lo [27] HANGUL SYLLABLE DDYUG..HANGUL SYLLABLE DDYUH - {0xB728, 0xB728, prLV}, // Lo HANGUL SYLLABLE DDEU - {0xB729, 0xB743, prLVT}, // Lo [27] HANGUL SYLLABLE DDEUG..HANGUL SYLLABLE DDEUH - {0xB744, 0xB744, prLV}, // Lo HANGUL SYLLABLE DDYI - {0xB745, 0xB75F, prLVT}, // Lo [27] HANGUL SYLLABLE DDYIG..HANGUL SYLLABLE DDYIH - {0xB760, 0xB760, prLV}, // Lo HANGUL SYLLABLE DDI - {0xB761, 0xB77B, prLVT}, // Lo [27] HANGUL SYLLABLE DDIG..HANGUL SYLLABLE DDIH - {0xB77C, 0xB77C, prLV}, // Lo HANGUL SYLLABLE RA - {0xB77D, 0xB797, prLVT}, // Lo [27] HANGUL SYLLABLE RAG..HANGUL SYLLABLE RAH - {0xB798, 0xB798, prLV}, // Lo HANGUL SYLLABLE RAE - {0xB799, 0xB7B3, prLVT}, // Lo [27] HANGUL SYLLABLE RAEG..HANGUL SYLLABLE RAEH - {0xB7B4, 0xB7B4, prLV}, // Lo HANGUL SYLLABLE RYA - {0xB7B5, 0xB7CF, prLVT}, // Lo [27] HANGUL SYLLABLE RYAG..HANGUL SYLLABLE RYAH - {0xB7D0, 0xB7D0, prLV}, // Lo HANGUL SYLLABLE RYAE - {0xB7D1, 0xB7EB, prLVT}, // Lo [27] HANGUL SYLLABLE RYAEG..HANGUL SYLLABLE RYAEH - {0xB7EC, 0xB7EC, prLV}, // Lo HANGUL SYLLABLE REO - {0xB7ED, 0xB807, prLVT}, // Lo [27] HANGUL SYLLABLE REOG..HANGUL SYLLABLE REOH - {0xB808, 0xB808, prLV}, // Lo HANGUL SYLLABLE RE - {0xB809, 0xB823, prLVT}, // Lo [27] HANGUL SYLLABLE REG..HANGUL SYLLABLE REH - {0xB824, 0xB824, prLV}, // Lo HANGUL SYLLABLE RYEO - {0xB825, 0xB83F, prLVT}, // Lo [27] HANGUL SYLLABLE RYEOG..HANGUL SYLLABLE RYEOH - {0xB840, 0xB840, prLV}, // Lo HANGUL SYLLABLE RYE - {0xB841, 0xB85B, prLVT}, // Lo [27] HANGUL SYLLABLE RYEG..HANGUL SYLLABLE RYEH - {0xB85C, 0xB85C, prLV}, // Lo HANGUL SYLLABLE RO - {0xB85D, 0xB877, prLVT}, // Lo [27] HANGUL SYLLABLE ROG..HANGUL SYLLABLE ROH - {0xB878, 0xB878, prLV}, // Lo HANGUL SYLLABLE RWA - {0xB879, 0xB893, prLVT}, // Lo [27] HANGUL SYLLABLE RWAG..HANGUL SYLLABLE RWAH - {0xB894, 0xB894, prLV}, // Lo HANGUL SYLLABLE RWAE - {0xB895, 0xB8AF, prLVT}, // Lo [27] HANGUL SYLLABLE RWAEG..HANGUL SYLLABLE RWAEH - {0xB8B0, 0xB8B0, prLV}, // Lo HANGUL SYLLABLE ROE - {0xB8B1, 0xB8CB, prLVT}, // Lo [27] HANGUL SYLLABLE ROEG..HANGUL SYLLABLE ROEH - {0xB8CC, 0xB8CC, prLV}, // Lo HANGUL SYLLABLE RYO - {0xB8CD, 0xB8E7, prLVT}, // Lo [27] HANGUL SYLLABLE RYOG..HANGUL SYLLABLE RYOH - {0xB8E8, 0xB8E8, prLV}, // Lo HANGUL SYLLABLE RU - {0xB8E9, 0xB903, prLVT}, // Lo [27] HANGUL SYLLABLE RUG..HANGUL SYLLABLE RUH - {0xB904, 0xB904, prLV}, // Lo HANGUL SYLLABLE RWEO - {0xB905, 0xB91F, prLVT}, // Lo [27] HANGUL SYLLABLE RWEOG..HANGUL SYLLABLE RWEOH - {0xB920, 0xB920, prLV}, // Lo HANGUL SYLLABLE RWE - {0xB921, 0xB93B, prLVT}, // Lo [27] HANGUL SYLLABLE RWEG..HANGUL SYLLABLE RWEH - {0xB93C, 0xB93C, prLV}, // Lo HANGUL SYLLABLE RWI - {0xB93D, 0xB957, prLVT}, // Lo [27] HANGUL SYLLABLE RWIG..HANGUL SYLLABLE RWIH - {0xB958, 0xB958, prLV}, // Lo HANGUL SYLLABLE RYU - {0xB959, 0xB973, prLVT}, // Lo [27] HANGUL SYLLABLE RYUG..HANGUL SYLLABLE RYUH - {0xB974, 0xB974, prLV}, // Lo HANGUL SYLLABLE REU - {0xB975, 0xB98F, prLVT}, // Lo [27] HANGUL SYLLABLE REUG..HANGUL SYLLABLE REUH - {0xB990, 0xB990, prLV}, // Lo HANGUL SYLLABLE RYI - {0xB991, 0xB9AB, prLVT}, // Lo [27] HANGUL SYLLABLE RYIG..HANGUL SYLLABLE RYIH - {0xB9AC, 0xB9AC, prLV}, // Lo HANGUL SYLLABLE RI - {0xB9AD, 0xB9C7, prLVT}, // Lo [27] HANGUL SYLLABLE RIG..HANGUL SYLLABLE RIH - {0xB9C8, 0xB9C8, prLV}, // Lo HANGUL SYLLABLE MA - {0xB9C9, 0xB9E3, prLVT}, // Lo [27] HANGUL SYLLABLE MAG..HANGUL SYLLABLE MAH - {0xB9E4, 0xB9E4, prLV}, // Lo HANGUL SYLLABLE MAE - {0xB9E5, 0xB9FF, prLVT}, // Lo [27] HANGUL SYLLABLE MAEG..HANGUL SYLLABLE MAEH - {0xBA00, 0xBA00, prLV}, // Lo HANGUL SYLLABLE MYA - {0xBA01, 0xBA1B, prLVT}, // Lo [27] HANGUL SYLLABLE MYAG..HANGUL SYLLABLE MYAH - {0xBA1C, 0xBA1C, prLV}, // Lo HANGUL SYLLABLE MYAE - {0xBA1D, 0xBA37, prLVT}, // Lo [27] HANGUL SYLLABLE MYAEG..HANGUL SYLLABLE MYAEH - {0xBA38, 0xBA38, prLV}, // Lo HANGUL SYLLABLE MEO - {0xBA39, 0xBA53, prLVT}, // Lo [27] HANGUL SYLLABLE MEOG..HANGUL SYLLABLE MEOH - {0xBA54, 0xBA54, prLV}, // Lo HANGUL SYLLABLE ME - {0xBA55, 0xBA6F, prLVT}, // Lo [27] HANGUL SYLLABLE MEG..HANGUL SYLLABLE MEH - {0xBA70, 0xBA70, prLV}, // Lo HANGUL SYLLABLE MYEO - {0xBA71, 0xBA8B, prLVT}, // Lo [27] HANGUL SYLLABLE MYEOG..HANGUL SYLLABLE MYEOH - {0xBA8C, 0xBA8C, prLV}, // Lo HANGUL SYLLABLE MYE - {0xBA8D, 0xBAA7, prLVT}, // Lo [27] HANGUL SYLLABLE MYEG..HANGUL SYLLABLE MYEH - {0xBAA8, 0xBAA8, prLV}, // Lo HANGUL SYLLABLE MO - {0xBAA9, 0xBAC3, prLVT}, // Lo [27] HANGUL SYLLABLE MOG..HANGUL SYLLABLE MOH - {0xBAC4, 0xBAC4, prLV}, // Lo HANGUL SYLLABLE MWA - {0xBAC5, 0xBADF, prLVT}, // Lo [27] HANGUL SYLLABLE MWAG..HANGUL SYLLABLE MWAH - {0xBAE0, 0xBAE0, prLV}, // Lo HANGUL SYLLABLE MWAE - {0xBAE1, 0xBAFB, prLVT}, // Lo [27] HANGUL SYLLABLE MWAEG..HANGUL SYLLABLE MWAEH - {0xBAFC, 0xBAFC, prLV}, // Lo HANGUL SYLLABLE MOE - {0xBAFD, 0xBB17, prLVT}, // Lo [27] HANGUL SYLLABLE MOEG..HANGUL SYLLABLE MOEH - {0xBB18, 0xBB18, prLV}, // Lo HANGUL SYLLABLE MYO - {0xBB19, 0xBB33, prLVT}, // Lo [27] HANGUL SYLLABLE MYOG..HANGUL SYLLABLE MYOH - {0xBB34, 0xBB34, prLV}, // Lo HANGUL SYLLABLE MU - {0xBB35, 0xBB4F, prLVT}, // Lo [27] HANGUL SYLLABLE MUG..HANGUL SYLLABLE MUH - {0xBB50, 0xBB50, prLV}, // Lo HANGUL SYLLABLE MWEO - {0xBB51, 0xBB6B, prLVT}, // Lo [27] HANGUL SYLLABLE MWEOG..HANGUL SYLLABLE MWEOH - {0xBB6C, 0xBB6C, prLV}, // Lo HANGUL SYLLABLE MWE - {0xBB6D, 0xBB87, prLVT}, // Lo [27] HANGUL SYLLABLE MWEG..HANGUL SYLLABLE MWEH - {0xBB88, 0xBB88, prLV}, // Lo HANGUL SYLLABLE MWI - {0xBB89, 0xBBA3, prLVT}, // Lo [27] HANGUL SYLLABLE MWIG..HANGUL SYLLABLE MWIH - {0xBBA4, 0xBBA4, prLV}, // Lo HANGUL SYLLABLE MYU - {0xBBA5, 0xBBBF, prLVT}, // Lo [27] HANGUL SYLLABLE MYUG..HANGUL SYLLABLE MYUH - {0xBBC0, 0xBBC0, prLV}, // Lo HANGUL SYLLABLE MEU - {0xBBC1, 0xBBDB, prLVT}, // Lo [27] HANGUL SYLLABLE MEUG..HANGUL SYLLABLE MEUH - {0xBBDC, 0xBBDC, prLV}, // Lo HANGUL SYLLABLE MYI - {0xBBDD, 0xBBF7, prLVT}, // Lo [27] HANGUL SYLLABLE MYIG..HANGUL SYLLABLE MYIH - {0xBBF8, 0xBBF8, prLV}, // Lo HANGUL SYLLABLE MI - {0xBBF9, 0xBC13, prLVT}, // Lo [27] HANGUL SYLLABLE MIG..HANGUL SYLLABLE MIH - {0xBC14, 0xBC14, prLV}, // Lo HANGUL SYLLABLE BA - {0xBC15, 0xBC2F, prLVT}, // Lo [27] HANGUL SYLLABLE BAG..HANGUL SYLLABLE BAH - {0xBC30, 0xBC30, prLV}, // Lo HANGUL SYLLABLE BAE - {0xBC31, 0xBC4B, prLVT}, // Lo [27] HANGUL SYLLABLE BAEG..HANGUL SYLLABLE BAEH - {0xBC4C, 0xBC4C, prLV}, // Lo HANGUL SYLLABLE BYA - {0xBC4D, 0xBC67, prLVT}, // Lo [27] HANGUL SYLLABLE BYAG..HANGUL SYLLABLE BYAH - {0xBC68, 0xBC68, prLV}, // Lo HANGUL SYLLABLE BYAE - {0xBC69, 0xBC83, prLVT}, // Lo [27] HANGUL SYLLABLE BYAEG..HANGUL SYLLABLE BYAEH - {0xBC84, 0xBC84, prLV}, // Lo HANGUL SYLLABLE BEO - {0xBC85, 0xBC9F, prLVT}, // Lo [27] HANGUL SYLLABLE BEOG..HANGUL SYLLABLE BEOH - {0xBCA0, 0xBCA0, prLV}, // Lo HANGUL SYLLABLE BE - {0xBCA1, 0xBCBB, prLVT}, // Lo [27] HANGUL SYLLABLE BEG..HANGUL SYLLABLE BEH - {0xBCBC, 0xBCBC, prLV}, // Lo HANGUL SYLLABLE BYEO - {0xBCBD, 0xBCD7, prLVT}, // Lo [27] HANGUL SYLLABLE BYEOG..HANGUL SYLLABLE BYEOH - {0xBCD8, 0xBCD8, prLV}, // Lo HANGUL SYLLABLE BYE - {0xBCD9, 0xBCF3, prLVT}, // Lo [27] HANGUL SYLLABLE BYEG..HANGUL SYLLABLE BYEH - {0xBCF4, 0xBCF4, prLV}, // Lo HANGUL SYLLABLE BO - {0xBCF5, 0xBD0F, prLVT}, // Lo [27] HANGUL SYLLABLE BOG..HANGUL SYLLABLE BOH - {0xBD10, 0xBD10, prLV}, // Lo HANGUL SYLLABLE BWA - {0xBD11, 0xBD2B, prLVT}, // Lo [27] HANGUL SYLLABLE BWAG..HANGUL SYLLABLE BWAH - {0xBD2C, 0xBD2C, prLV}, // Lo HANGUL SYLLABLE BWAE - {0xBD2D, 0xBD47, prLVT}, // Lo [27] HANGUL SYLLABLE BWAEG..HANGUL SYLLABLE BWAEH - {0xBD48, 0xBD48, prLV}, // Lo HANGUL SYLLABLE BOE - {0xBD49, 0xBD63, prLVT}, // Lo [27] HANGUL SYLLABLE BOEG..HANGUL SYLLABLE BOEH - {0xBD64, 0xBD64, prLV}, // Lo HANGUL SYLLABLE BYO - {0xBD65, 0xBD7F, prLVT}, // Lo [27] HANGUL SYLLABLE BYOG..HANGUL SYLLABLE BYOH - {0xBD80, 0xBD80, prLV}, // Lo HANGUL SYLLABLE BU - {0xBD81, 0xBD9B, prLVT}, // Lo [27] HANGUL SYLLABLE BUG..HANGUL SYLLABLE BUH - {0xBD9C, 0xBD9C, prLV}, // Lo HANGUL SYLLABLE BWEO - {0xBD9D, 0xBDB7, prLVT}, // Lo [27] HANGUL SYLLABLE BWEOG..HANGUL SYLLABLE BWEOH - {0xBDB8, 0xBDB8, prLV}, // Lo HANGUL SYLLABLE BWE - {0xBDB9, 0xBDD3, prLVT}, // Lo [27] HANGUL SYLLABLE BWEG..HANGUL SYLLABLE BWEH - {0xBDD4, 0xBDD4, prLV}, // Lo HANGUL SYLLABLE BWI - {0xBDD5, 0xBDEF, prLVT}, // Lo [27] HANGUL SYLLABLE BWIG..HANGUL SYLLABLE BWIH - {0xBDF0, 0xBDF0, prLV}, // Lo HANGUL SYLLABLE BYU - {0xBDF1, 0xBE0B, prLVT}, // Lo [27] HANGUL SYLLABLE BYUG..HANGUL SYLLABLE BYUH - {0xBE0C, 0xBE0C, prLV}, // Lo HANGUL SYLLABLE BEU - {0xBE0D, 0xBE27, prLVT}, // Lo [27] HANGUL SYLLABLE BEUG..HANGUL SYLLABLE BEUH - {0xBE28, 0xBE28, prLV}, // Lo HANGUL SYLLABLE BYI - {0xBE29, 0xBE43, prLVT}, // Lo [27] HANGUL SYLLABLE BYIG..HANGUL SYLLABLE BYIH - {0xBE44, 0xBE44, prLV}, // Lo HANGUL SYLLABLE BI - {0xBE45, 0xBE5F, prLVT}, // Lo [27] HANGUL SYLLABLE BIG..HANGUL SYLLABLE BIH - {0xBE60, 0xBE60, prLV}, // Lo HANGUL SYLLABLE BBA - {0xBE61, 0xBE7B, prLVT}, // Lo [27] HANGUL SYLLABLE BBAG..HANGUL SYLLABLE BBAH - {0xBE7C, 0xBE7C, prLV}, // Lo HANGUL SYLLABLE BBAE - {0xBE7D, 0xBE97, prLVT}, // Lo [27] HANGUL SYLLABLE BBAEG..HANGUL SYLLABLE BBAEH - {0xBE98, 0xBE98, prLV}, // Lo HANGUL SYLLABLE BBYA - {0xBE99, 0xBEB3, prLVT}, // Lo [27] HANGUL SYLLABLE BBYAG..HANGUL SYLLABLE BBYAH - {0xBEB4, 0xBEB4, prLV}, // Lo HANGUL SYLLABLE BBYAE - {0xBEB5, 0xBECF, prLVT}, // Lo [27] HANGUL SYLLABLE BBYAEG..HANGUL SYLLABLE BBYAEH - {0xBED0, 0xBED0, prLV}, // Lo HANGUL SYLLABLE BBEO - {0xBED1, 0xBEEB, prLVT}, // Lo [27] HANGUL SYLLABLE BBEOG..HANGUL SYLLABLE BBEOH - {0xBEEC, 0xBEEC, prLV}, // Lo HANGUL SYLLABLE BBE - {0xBEED, 0xBF07, prLVT}, // Lo [27] HANGUL SYLLABLE BBEG..HANGUL SYLLABLE BBEH - {0xBF08, 0xBF08, prLV}, // Lo HANGUL SYLLABLE BBYEO - {0xBF09, 0xBF23, prLVT}, // Lo [27] HANGUL SYLLABLE BBYEOG..HANGUL SYLLABLE BBYEOH - {0xBF24, 0xBF24, prLV}, // Lo HANGUL SYLLABLE BBYE - {0xBF25, 0xBF3F, prLVT}, // Lo [27] HANGUL SYLLABLE BBYEG..HANGUL SYLLABLE BBYEH - {0xBF40, 0xBF40, prLV}, // Lo HANGUL SYLLABLE BBO - {0xBF41, 0xBF5B, prLVT}, // Lo [27] HANGUL SYLLABLE BBOG..HANGUL SYLLABLE BBOH - {0xBF5C, 0xBF5C, prLV}, // Lo HANGUL SYLLABLE BBWA - {0xBF5D, 0xBF77, prLVT}, // Lo [27] HANGUL SYLLABLE BBWAG..HANGUL SYLLABLE BBWAH - {0xBF78, 0xBF78, prLV}, // Lo HANGUL SYLLABLE BBWAE - {0xBF79, 0xBF93, prLVT}, // Lo [27] HANGUL SYLLABLE BBWAEG..HANGUL SYLLABLE BBWAEH - {0xBF94, 0xBF94, prLV}, // Lo HANGUL SYLLABLE BBOE - {0xBF95, 0xBFAF, prLVT}, // Lo [27] HANGUL SYLLABLE BBOEG..HANGUL SYLLABLE BBOEH - {0xBFB0, 0xBFB0, prLV}, // Lo HANGUL SYLLABLE BBYO - {0xBFB1, 0xBFCB, prLVT}, // Lo [27] HANGUL SYLLABLE BBYOG..HANGUL SYLLABLE BBYOH - {0xBFCC, 0xBFCC, prLV}, // Lo HANGUL SYLLABLE BBU - {0xBFCD, 0xBFE7, prLVT}, // Lo [27] HANGUL SYLLABLE BBUG..HANGUL SYLLABLE BBUH - {0xBFE8, 0xBFE8, prLV}, // Lo HANGUL SYLLABLE BBWEO - {0xBFE9, 0xC003, prLVT}, // Lo [27] HANGUL SYLLABLE BBWEOG..HANGUL SYLLABLE BBWEOH - {0xC004, 0xC004, prLV}, // Lo HANGUL SYLLABLE BBWE - {0xC005, 0xC01F, prLVT}, // Lo [27] HANGUL SYLLABLE BBWEG..HANGUL SYLLABLE BBWEH - {0xC020, 0xC020, prLV}, // Lo HANGUL SYLLABLE BBWI - {0xC021, 0xC03B, prLVT}, // Lo [27] HANGUL SYLLABLE BBWIG..HANGUL SYLLABLE BBWIH - {0xC03C, 0xC03C, prLV}, // Lo HANGUL SYLLABLE BBYU - {0xC03D, 0xC057, prLVT}, // Lo [27] HANGUL SYLLABLE BBYUG..HANGUL SYLLABLE BBYUH - {0xC058, 0xC058, prLV}, // Lo HANGUL SYLLABLE BBEU - {0xC059, 0xC073, prLVT}, // Lo [27] HANGUL SYLLABLE BBEUG..HANGUL SYLLABLE BBEUH - {0xC074, 0xC074, prLV}, // Lo HANGUL SYLLABLE BBYI - {0xC075, 0xC08F, prLVT}, // Lo [27] HANGUL SYLLABLE BBYIG..HANGUL SYLLABLE BBYIH - {0xC090, 0xC090, prLV}, // Lo HANGUL SYLLABLE BBI - {0xC091, 0xC0AB, prLVT}, // Lo [27] HANGUL SYLLABLE BBIG..HANGUL SYLLABLE BBIH - {0xC0AC, 0xC0AC, prLV}, // Lo HANGUL SYLLABLE SA - {0xC0AD, 0xC0C7, prLVT}, // Lo [27] HANGUL SYLLABLE SAG..HANGUL SYLLABLE SAH - {0xC0C8, 0xC0C8, prLV}, // Lo HANGUL SYLLABLE SAE - {0xC0C9, 0xC0E3, prLVT}, // Lo [27] HANGUL SYLLABLE SAEG..HANGUL SYLLABLE SAEH - {0xC0E4, 0xC0E4, prLV}, // Lo HANGUL SYLLABLE SYA - {0xC0E5, 0xC0FF, prLVT}, // Lo [27] HANGUL SYLLABLE SYAG..HANGUL SYLLABLE SYAH - {0xC100, 0xC100, prLV}, // Lo HANGUL SYLLABLE SYAE - {0xC101, 0xC11B, prLVT}, // Lo [27] HANGUL SYLLABLE SYAEG..HANGUL SYLLABLE SYAEH - {0xC11C, 0xC11C, prLV}, // Lo HANGUL SYLLABLE SEO - {0xC11D, 0xC137, prLVT}, // Lo [27] HANGUL SYLLABLE SEOG..HANGUL SYLLABLE SEOH - {0xC138, 0xC138, prLV}, // Lo HANGUL SYLLABLE SE - {0xC139, 0xC153, prLVT}, // Lo [27] HANGUL SYLLABLE SEG..HANGUL SYLLABLE SEH - {0xC154, 0xC154, prLV}, // Lo HANGUL SYLLABLE SYEO - {0xC155, 0xC16F, prLVT}, // Lo [27] HANGUL SYLLABLE SYEOG..HANGUL SYLLABLE SYEOH - {0xC170, 0xC170, prLV}, // Lo HANGUL SYLLABLE SYE - {0xC171, 0xC18B, prLVT}, // Lo [27] HANGUL SYLLABLE SYEG..HANGUL SYLLABLE SYEH - {0xC18C, 0xC18C, prLV}, // Lo HANGUL SYLLABLE SO - {0xC18D, 0xC1A7, prLVT}, // Lo [27] HANGUL SYLLABLE SOG..HANGUL SYLLABLE SOH - {0xC1A8, 0xC1A8, prLV}, // Lo HANGUL SYLLABLE SWA - {0xC1A9, 0xC1C3, prLVT}, // Lo [27] HANGUL SYLLABLE SWAG..HANGUL SYLLABLE SWAH - {0xC1C4, 0xC1C4, prLV}, // Lo HANGUL SYLLABLE SWAE - {0xC1C5, 0xC1DF, prLVT}, // Lo [27] HANGUL SYLLABLE SWAEG..HANGUL SYLLABLE SWAEH - {0xC1E0, 0xC1E0, prLV}, // Lo HANGUL SYLLABLE SOE - {0xC1E1, 0xC1FB, prLVT}, // Lo [27] HANGUL SYLLABLE SOEG..HANGUL SYLLABLE SOEH - {0xC1FC, 0xC1FC, prLV}, // Lo HANGUL SYLLABLE SYO - {0xC1FD, 0xC217, prLVT}, // Lo [27] HANGUL SYLLABLE SYOG..HANGUL SYLLABLE SYOH - {0xC218, 0xC218, prLV}, // Lo HANGUL SYLLABLE SU - {0xC219, 0xC233, prLVT}, // Lo [27] HANGUL SYLLABLE SUG..HANGUL SYLLABLE SUH - {0xC234, 0xC234, prLV}, // Lo HANGUL SYLLABLE SWEO - {0xC235, 0xC24F, prLVT}, // Lo [27] HANGUL SYLLABLE SWEOG..HANGUL SYLLABLE SWEOH - {0xC250, 0xC250, prLV}, // Lo HANGUL SYLLABLE SWE - {0xC251, 0xC26B, prLVT}, // Lo [27] HANGUL SYLLABLE SWEG..HANGUL SYLLABLE SWEH - {0xC26C, 0xC26C, prLV}, // Lo HANGUL SYLLABLE SWI - {0xC26D, 0xC287, prLVT}, // Lo [27] HANGUL SYLLABLE SWIG..HANGUL SYLLABLE SWIH - {0xC288, 0xC288, prLV}, // Lo HANGUL SYLLABLE SYU - {0xC289, 0xC2A3, prLVT}, // Lo [27] HANGUL SYLLABLE SYUG..HANGUL SYLLABLE SYUH - {0xC2A4, 0xC2A4, prLV}, // Lo HANGUL SYLLABLE SEU - {0xC2A5, 0xC2BF, prLVT}, // Lo [27] HANGUL SYLLABLE SEUG..HANGUL SYLLABLE SEUH - {0xC2C0, 0xC2C0, prLV}, // Lo HANGUL SYLLABLE SYI - {0xC2C1, 0xC2DB, prLVT}, // Lo [27] HANGUL SYLLABLE SYIG..HANGUL SYLLABLE SYIH - {0xC2DC, 0xC2DC, prLV}, // Lo HANGUL SYLLABLE SI - {0xC2DD, 0xC2F7, prLVT}, // Lo [27] HANGUL SYLLABLE SIG..HANGUL SYLLABLE SIH - {0xC2F8, 0xC2F8, prLV}, // Lo HANGUL SYLLABLE SSA - {0xC2F9, 0xC313, prLVT}, // Lo [27] HANGUL SYLLABLE SSAG..HANGUL SYLLABLE SSAH - {0xC314, 0xC314, prLV}, // Lo HANGUL SYLLABLE SSAE - {0xC315, 0xC32F, prLVT}, // Lo [27] HANGUL SYLLABLE SSAEG..HANGUL SYLLABLE SSAEH - {0xC330, 0xC330, prLV}, // Lo HANGUL SYLLABLE SSYA - {0xC331, 0xC34B, prLVT}, // Lo [27] HANGUL SYLLABLE SSYAG..HANGUL SYLLABLE SSYAH - {0xC34C, 0xC34C, prLV}, // Lo HANGUL SYLLABLE SSYAE - {0xC34D, 0xC367, prLVT}, // Lo [27] HANGUL SYLLABLE SSYAEG..HANGUL SYLLABLE SSYAEH - {0xC368, 0xC368, prLV}, // Lo HANGUL SYLLABLE SSEO - {0xC369, 0xC383, prLVT}, // Lo [27] HANGUL SYLLABLE SSEOG..HANGUL SYLLABLE SSEOH - {0xC384, 0xC384, prLV}, // Lo HANGUL SYLLABLE SSE - {0xC385, 0xC39F, prLVT}, // Lo [27] HANGUL SYLLABLE SSEG..HANGUL SYLLABLE SSEH - {0xC3A0, 0xC3A0, prLV}, // Lo HANGUL SYLLABLE SSYEO - {0xC3A1, 0xC3BB, prLVT}, // Lo [27] HANGUL SYLLABLE SSYEOG..HANGUL SYLLABLE SSYEOH - {0xC3BC, 0xC3BC, prLV}, // Lo HANGUL SYLLABLE SSYE - {0xC3BD, 0xC3D7, prLVT}, // Lo [27] HANGUL SYLLABLE SSYEG..HANGUL SYLLABLE SSYEH - {0xC3D8, 0xC3D8, prLV}, // Lo HANGUL SYLLABLE SSO - {0xC3D9, 0xC3F3, prLVT}, // Lo [27] HANGUL SYLLABLE SSOG..HANGUL SYLLABLE SSOH - {0xC3F4, 0xC3F4, prLV}, // Lo HANGUL SYLLABLE SSWA - {0xC3F5, 0xC40F, prLVT}, // Lo [27] HANGUL SYLLABLE SSWAG..HANGUL SYLLABLE SSWAH - {0xC410, 0xC410, prLV}, // Lo HANGUL SYLLABLE SSWAE - {0xC411, 0xC42B, prLVT}, // Lo [27] HANGUL SYLLABLE SSWAEG..HANGUL SYLLABLE SSWAEH - {0xC42C, 0xC42C, prLV}, // Lo HANGUL SYLLABLE SSOE - {0xC42D, 0xC447, prLVT}, // Lo [27] HANGUL SYLLABLE SSOEG..HANGUL SYLLABLE SSOEH - {0xC448, 0xC448, prLV}, // Lo HANGUL SYLLABLE SSYO - {0xC449, 0xC463, prLVT}, // Lo [27] HANGUL SYLLABLE SSYOG..HANGUL SYLLABLE SSYOH - {0xC464, 0xC464, prLV}, // Lo HANGUL SYLLABLE SSU - {0xC465, 0xC47F, prLVT}, // Lo [27] HANGUL SYLLABLE SSUG..HANGUL SYLLABLE SSUH - {0xC480, 0xC480, prLV}, // Lo HANGUL SYLLABLE SSWEO - {0xC481, 0xC49B, prLVT}, // Lo [27] HANGUL SYLLABLE SSWEOG..HANGUL SYLLABLE SSWEOH - {0xC49C, 0xC49C, prLV}, // Lo HANGUL SYLLABLE SSWE - {0xC49D, 0xC4B7, prLVT}, // Lo [27] HANGUL SYLLABLE SSWEG..HANGUL SYLLABLE SSWEH - {0xC4B8, 0xC4B8, prLV}, // Lo HANGUL SYLLABLE SSWI - {0xC4B9, 0xC4D3, prLVT}, // Lo [27] HANGUL SYLLABLE SSWIG..HANGUL SYLLABLE SSWIH - {0xC4D4, 0xC4D4, prLV}, // Lo HANGUL SYLLABLE SSYU - {0xC4D5, 0xC4EF, prLVT}, // Lo [27] HANGUL SYLLABLE SSYUG..HANGUL SYLLABLE SSYUH - {0xC4F0, 0xC4F0, prLV}, // Lo HANGUL SYLLABLE SSEU - {0xC4F1, 0xC50B, prLVT}, // Lo [27] HANGUL SYLLABLE SSEUG..HANGUL SYLLABLE SSEUH - {0xC50C, 0xC50C, prLV}, // Lo HANGUL SYLLABLE SSYI - {0xC50D, 0xC527, prLVT}, // Lo [27] HANGUL SYLLABLE SSYIG..HANGUL SYLLABLE SSYIH - {0xC528, 0xC528, prLV}, // Lo HANGUL SYLLABLE SSI - {0xC529, 0xC543, prLVT}, // Lo [27] HANGUL SYLLABLE SSIG..HANGUL SYLLABLE SSIH - {0xC544, 0xC544, prLV}, // Lo HANGUL SYLLABLE A - {0xC545, 0xC55F, prLVT}, // Lo [27] HANGUL SYLLABLE AG..HANGUL SYLLABLE AH - {0xC560, 0xC560, prLV}, // Lo HANGUL SYLLABLE AE - {0xC561, 0xC57B, prLVT}, // Lo [27] HANGUL SYLLABLE AEG..HANGUL SYLLABLE AEH - {0xC57C, 0xC57C, prLV}, // Lo HANGUL SYLLABLE YA - {0xC57D, 0xC597, prLVT}, // Lo [27] HANGUL SYLLABLE YAG..HANGUL SYLLABLE YAH - {0xC598, 0xC598, prLV}, // Lo HANGUL SYLLABLE YAE - {0xC599, 0xC5B3, prLVT}, // Lo [27] HANGUL SYLLABLE YAEG..HANGUL SYLLABLE YAEH - {0xC5B4, 0xC5B4, prLV}, // Lo HANGUL SYLLABLE EO - {0xC5B5, 0xC5CF, prLVT}, // Lo [27] HANGUL SYLLABLE EOG..HANGUL SYLLABLE EOH - {0xC5D0, 0xC5D0, prLV}, // Lo HANGUL SYLLABLE E - {0xC5D1, 0xC5EB, prLVT}, // Lo [27] HANGUL SYLLABLE EG..HANGUL SYLLABLE EH - {0xC5EC, 0xC5EC, prLV}, // Lo HANGUL SYLLABLE YEO - {0xC5ED, 0xC607, prLVT}, // Lo [27] HANGUL SYLLABLE YEOG..HANGUL SYLLABLE YEOH - {0xC608, 0xC608, prLV}, // Lo HANGUL SYLLABLE YE - {0xC609, 0xC623, prLVT}, // Lo [27] HANGUL SYLLABLE YEG..HANGUL SYLLABLE YEH - {0xC624, 0xC624, prLV}, // Lo HANGUL SYLLABLE O - {0xC625, 0xC63F, prLVT}, // Lo [27] HANGUL SYLLABLE OG..HANGUL SYLLABLE OH - {0xC640, 0xC640, prLV}, // Lo HANGUL SYLLABLE WA - {0xC641, 0xC65B, prLVT}, // Lo [27] HANGUL SYLLABLE WAG..HANGUL SYLLABLE WAH - {0xC65C, 0xC65C, prLV}, // Lo HANGUL SYLLABLE WAE - {0xC65D, 0xC677, prLVT}, // Lo [27] HANGUL SYLLABLE WAEG..HANGUL SYLLABLE WAEH - {0xC678, 0xC678, prLV}, // Lo HANGUL SYLLABLE OE - {0xC679, 0xC693, prLVT}, // Lo [27] HANGUL SYLLABLE OEG..HANGUL SYLLABLE OEH - {0xC694, 0xC694, prLV}, // Lo HANGUL SYLLABLE YO - {0xC695, 0xC6AF, prLVT}, // Lo [27] HANGUL SYLLABLE YOG..HANGUL SYLLABLE YOH - {0xC6B0, 0xC6B0, prLV}, // Lo HANGUL SYLLABLE U - {0xC6B1, 0xC6CB, prLVT}, // Lo [27] HANGUL SYLLABLE UG..HANGUL SYLLABLE UH - {0xC6CC, 0xC6CC, prLV}, // Lo HANGUL SYLLABLE WEO - {0xC6CD, 0xC6E7, prLVT}, // Lo [27] HANGUL SYLLABLE WEOG..HANGUL SYLLABLE WEOH - {0xC6E8, 0xC6E8, prLV}, // Lo HANGUL SYLLABLE WE - {0xC6E9, 0xC703, prLVT}, // Lo [27] HANGUL SYLLABLE WEG..HANGUL SYLLABLE WEH - {0xC704, 0xC704, prLV}, // Lo HANGUL SYLLABLE WI - {0xC705, 0xC71F, prLVT}, // Lo [27] HANGUL SYLLABLE WIG..HANGUL SYLLABLE WIH - {0xC720, 0xC720, prLV}, // Lo HANGUL SYLLABLE YU - {0xC721, 0xC73B, prLVT}, // Lo [27] HANGUL SYLLABLE YUG..HANGUL SYLLABLE YUH - {0xC73C, 0xC73C, prLV}, // Lo HANGUL SYLLABLE EU - {0xC73D, 0xC757, prLVT}, // Lo [27] HANGUL SYLLABLE EUG..HANGUL SYLLABLE EUH - {0xC758, 0xC758, prLV}, // Lo HANGUL SYLLABLE YI - {0xC759, 0xC773, prLVT}, // Lo [27] HANGUL SYLLABLE YIG..HANGUL SYLLABLE YIH - {0xC774, 0xC774, prLV}, // Lo HANGUL SYLLABLE I - {0xC775, 0xC78F, prLVT}, // Lo [27] HANGUL SYLLABLE IG..HANGUL SYLLABLE IH - {0xC790, 0xC790, prLV}, // Lo HANGUL SYLLABLE JA - {0xC791, 0xC7AB, prLVT}, // Lo [27] HANGUL SYLLABLE JAG..HANGUL SYLLABLE JAH - {0xC7AC, 0xC7AC, prLV}, // Lo HANGUL SYLLABLE JAE - {0xC7AD, 0xC7C7, prLVT}, // Lo [27] HANGUL SYLLABLE JAEG..HANGUL SYLLABLE JAEH - {0xC7C8, 0xC7C8, prLV}, // Lo HANGUL SYLLABLE JYA - {0xC7C9, 0xC7E3, prLVT}, // Lo [27] HANGUL SYLLABLE JYAG..HANGUL SYLLABLE JYAH - {0xC7E4, 0xC7E4, prLV}, // Lo HANGUL SYLLABLE JYAE - {0xC7E5, 0xC7FF, prLVT}, // Lo [27] HANGUL SYLLABLE JYAEG..HANGUL SYLLABLE JYAEH - {0xC800, 0xC800, prLV}, // Lo HANGUL SYLLABLE JEO - {0xC801, 0xC81B, prLVT}, // Lo [27] HANGUL SYLLABLE JEOG..HANGUL SYLLABLE JEOH - {0xC81C, 0xC81C, prLV}, // Lo HANGUL SYLLABLE JE - {0xC81D, 0xC837, prLVT}, // Lo [27] HANGUL SYLLABLE JEG..HANGUL SYLLABLE JEH - {0xC838, 0xC838, prLV}, // Lo HANGUL SYLLABLE JYEO - {0xC839, 0xC853, prLVT}, // Lo [27] HANGUL SYLLABLE JYEOG..HANGUL SYLLABLE JYEOH - {0xC854, 0xC854, prLV}, // Lo HANGUL SYLLABLE JYE - {0xC855, 0xC86F, prLVT}, // Lo [27] HANGUL SYLLABLE JYEG..HANGUL SYLLABLE JYEH - {0xC870, 0xC870, prLV}, // Lo HANGUL SYLLABLE JO - {0xC871, 0xC88B, prLVT}, // Lo [27] HANGUL SYLLABLE JOG..HANGUL SYLLABLE JOH - {0xC88C, 0xC88C, prLV}, // Lo HANGUL SYLLABLE JWA - {0xC88D, 0xC8A7, prLVT}, // Lo [27] HANGUL SYLLABLE JWAG..HANGUL SYLLABLE JWAH - {0xC8A8, 0xC8A8, prLV}, // Lo HANGUL SYLLABLE JWAE - {0xC8A9, 0xC8C3, prLVT}, // Lo [27] HANGUL SYLLABLE JWAEG..HANGUL SYLLABLE JWAEH - {0xC8C4, 0xC8C4, prLV}, // Lo HANGUL SYLLABLE JOE - {0xC8C5, 0xC8DF, prLVT}, // Lo [27] HANGUL SYLLABLE JOEG..HANGUL SYLLABLE JOEH - {0xC8E0, 0xC8E0, prLV}, // Lo HANGUL SYLLABLE JYO - {0xC8E1, 0xC8FB, prLVT}, // Lo [27] HANGUL SYLLABLE JYOG..HANGUL SYLLABLE JYOH - {0xC8FC, 0xC8FC, prLV}, // Lo HANGUL SYLLABLE JU - {0xC8FD, 0xC917, prLVT}, // Lo [27] HANGUL SYLLABLE JUG..HANGUL SYLLABLE JUH - {0xC918, 0xC918, prLV}, // Lo HANGUL SYLLABLE JWEO - {0xC919, 0xC933, prLVT}, // Lo [27] HANGUL SYLLABLE JWEOG..HANGUL SYLLABLE JWEOH - {0xC934, 0xC934, prLV}, // Lo HANGUL SYLLABLE JWE - {0xC935, 0xC94F, prLVT}, // Lo [27] HANGUL SYLLABLE JWEG..HANGUL SYLLABLE JWEH - {0xC950, 0xC950, prLV}, // Lo HANGUL SYLLABLE JWI - {0xC951, 0xC96B, prLVT}, // Lo [27] HANGUL SYLLABLE JWIG..HANGUL SYLLABLE JWIH - {0xC96C, 0xC96C, prLV}, // Lo HANGUL SYLLABLE JYU - {0xC96D, 0xC987, prLVT}, // Lo [27] HANGUL SYLLABLE JYUG..HANGUL SYLLABLE JYUH - {0xC988, 0xC988, prLV}, // Lo HANGUL SYLLABLE JEU - {0xC989, 0xC9A3, prLVT}, // Lo [27] HANGUL SYLLABLE JEUG..HANGUL SYLLABLE JEUH - {0xC9A4, 0xC9A4, prLV}, // Lo HANGUL SYLLABLE JYI - {0xC9A5, 0xC9BF, prLVT}, // Lo [27] HANGUL SYLLABLE JYIG..HANGUL SYLLABLE JYIH - {0xC9C0, 0xC9C0, prLV}, // Lo HANGUL SYLLABLE JI - {0xC9C1, 0xC9DB, prLVT}, // Lo [27] HANGUL SYLLABLE JIG..HANGUL SYLLABLE JIH - {0xC9DC, 0xC9DC, prLV}, // Lo HANGUL SYLLABLE JJA - {0xC9DD, 0xC9F7, prLVT}, // Lo [27] HANGUL SYLLABLE JJAG..HANGUL SYLLABLE JJAH - {0xC9F8, 0xC9F8, prLV}, // Lo HANGUL SYLLABLE JJAE - {0xC9F9, 0xCA13, prLVT}, // Lo [27] HANGUL SYLLABLE JJAEG..HANGUL SYLLABLE JJAEH - {0xCA14, 0xCA14, prLV}, // Lo HANGUL SYLLABLE JJYA - {0xCA15, 0xCA2F, prLVT}, // Lo [27] HANGUL SYLLABLE JJYAG..HANGUL SYLLABLE JJYAH - {0xCA30, 0xCA30, prLV}, // Lo HANGUL SYLLABLE JJYAE - {0xCA31, 0xCA4B, prLVT}, // Lo [27] HANGUL SYLLABLE JJYAEG..HANGUL SYLLABLE JJYAEH - {0xCA4C, 0xCA4C, prLV}, // Lo HANGUL SYLLABLE JJEO - {0xCA4D, 0xCA67, prLVT}, // Lo [27] HANGUL SYLLABLE JJEOG..HANGUL SYLLABLE JJEOH - {0xCA68, 0xCA68, prLV}, // Lo HANGUL SYLLABLE JJE - {0xCA69, 0xCA83, prLVT}, // Lo [27] HANGUL SYLLABLE JJEG..HANGUL SYLLABLE JJEH - {0xCA84, 0xCA84, prLV}, // Lo HANGUL SYLLABLE JJYEO - {0xCA85, 0xCA9F, prLVT}, // Lo [27] HANGUL SYLLABLE JJYEOG..HANGUL SYLLABLE JJYEOH - {0xCAA0, 0xCAA0, prLV}, // Lo HANGUL SYLLABLE JJYE - {0xCAA1, 0xCABB, prLVT}, // Lo [27] HANGUL SYLLABLE JJYEG..HANGUL SYLLABLE JJYEH - {0xCABC, 0xCABC, prLV}, // Lo HANGUL SYLLABLE JJO - {0xCABD, 0xCAD7, prLVT}, // Lo [27] HANGUL SYLLABLE JJOG..HANGUL SYLLABLE JJOH - {0xCAD8, 0xCAD8, prLV}, // Lo HANGUL SYLLABLE JJWA - {0xCAD9, 0xCAF3, prLVT}, // Lo [27] HANGUL SYLLABLE JJWAG..HANGUL SYLLABLE JJWAH - {0xCAF4, 0xCAF4, prLV}, // Lo HANGUL SYLLABLE JJWAE - {0xCAF5, 0xCB0F, prLVT}, // Lo [27] HANGUL SYLLABLE JJWAEG..HANGUL SYLLABLE JJWAEH - {0xCB10, 0xCB10, prLV}, // Lo HANGUL SYLLABLE JJOE - {0xCB11, 0xCB2B, prLVT}, // Lo [27] HANGUL SYLLABLE JJOEG..HANGUL SYLLABLE JJOEH - {0xCB2C, 0xCB2C, prLV}, // Lo HANGUL SYLLABLE JJYO - {0xCB2D, 0xCB47, prLVT}, // Lo [27] HANGUL SYLLABLE JJYOG..HANGUL SYLLABLE JJYOH - {0xCB48, 0xCB48, prLV}, // Lo HANGUL SYLLABLE JJU - {0xCB49, 0xCB63, prLVT}, // Lo [27] HANGUL SYLLABLE JJUG..HANGUL SYLLABLE JJUH - {0xCB64, 0xCB64, prLV}, // Lo HANGUL SYLLABLE JJWEO - {0xCB65, 0xCB7F, prLVT}, // Lo [27] HANGUL SYLLABLE JJWEOG..HANGUL SYLLABLE JJWEOH - {0xCB80, 0xCB80, prLV}, // Lo HANGUL SYLLABLE JJWE - {0xCB81, 0xCB9B, prLVT}, // Lo [27] HANGUL SYLLABLE JJWEG..HANGUL SYLLABLE JJWEH - {0xCB9C, 0xCB9C, prLV}, // Lo HANGUL SYLLABLE JJWI - {0xCB9D, 0xCBB7, prLVT}, // Lo [27] HANGUL SYLLABLE JJWIG..HANGUL SYLLABLE JJWIH - {0xCBB8, 0xCBB8, prLV}, // Lo HANGUL SYLLABLE JJYU - {0xCBB9, 0xCBD3, prLVT}, // Lo [27] HANGUL SYLLABLE JJYUG..HANGUL SYLLABLE JJYUH - {0xCBD4, 0xCBD4, prLV}, // Lo HANGUL SYLLABLE JJEU - {0xCBD5, 0xCBEF, prLVT}, // Lo [27] HANGUL SYLLABLE JJEUG..HANGUL SYLLABLE JJEUH - {0xCBF0, 0xCBF0, prLV}, // Lo HANGUL SYLLABLE JJYI - {0xCBF1, 0xCC0B, prLVT}, // Lo [27] HANGUL SYLLABLE JJYIG..HANGUL SYLLABLE JJYIH - {0xCC0C, 0xCC0C, prLV}, // Lo HANGUL SYLLABLE JJI - {0xCC0D, 0xCC27, prLVT}, // Lo [27] HANGUL SYLLABLE JJIG..HANGUL SYLLABLE JJIH - {0xCC28, 0xCC28, prLV}, // Lo HANGUL SYLLABLE CA - {0xCC29, 0xCC43, prLVT}, // Lo [27] HANGUL SYLLABLE CAG..HANGUL SYLLABLE CAH - {0xCC44, 0xCC44, prLV}, // Lo HANGUL SYLLABLE CAE - {0xCC45, 0xCC5F, prLVT}, // Lo [27] HANGUL SYLLABLE CAEG..HANGUL SYLLABLE CAEH - {0xCC60, 0xCC60, prLV}, // Lo HANGUL SYLLABLE CYA - {0xCC61, 0xCC7B, prLVT}, // Lo [27] HANGUL SYLLABLE CYAG..HANGUL SYLLABLE CYAH - {0xCC7C, 0xCC7C, prLV}, // Lo HANGUL SYLLABLE CYAE - {0xCC7D, 0xCC97, prLVT}, // Lo [27] HANGUL SYLLABLE CYAEG..HANGUL SYLLABLE CYAEH - {0xCC98, 0xCC98, prLV}, // Lo HANGUL SYLLABLE CEO - {0xCC99, 0xCCB3, prLVT}, // Lo [27] HANGUL SYLLABLE CEOG..HANGUL SYLLABLE CEOH - {0xCCB4, 0xCCB4, prLV}, // Lo HANGUL SYLLABLE CE - {0xCCB5, 0xCCCF, prLVT}, // Lo [27] HANGUL SYLLABLE CEG..HANGUL SYLLABLE CEH - {0xCCD0, 0xCCD0, prLV}, // Lo HANGUL SYLLABLE CYEO - {0xCCD1, 0xCCEB, prLVT}, // Lo [27] HANGUL SYLLABLE CYEOG..HANGUL SYLLABLE CYEOH - {0xCCEC, 0xCCEC, prLV}, // Lo HANGUL SYLLABLE CYE - {0xCCED, 0xCD07, prLVT}, // Lo [27] HANGUL SYLLABLE CYEG..HANGUL SYLLABLE CYEH - {0xCD08, 0xCD08, prLV}, // Lo HANGUL SYLLABLE CO - {0xCD09, 0xCD23, prLVT}, // Lo [27] HANGUL SYLLABLE COG..HANGUL SYLLABLE COH - {0xCD24, 0xCD24, prLV}, // Lo HANGUL SYLLABLE CWA - {0xCD25, 0xCD3F, prLVT}, // Lo [27] HANGUL SYLLABLE CWAG..HANGUL SYLLABLE CWAH - {0xCD40, 0xCD40, prLV}, // Lo HANGUL SYLLABLE CWAE - {0xCD41, 0xCD5B, prLVT}, // Lo [27] HANGUL SYLLABLE CWAEG..HANGUL SYLLABLE CWAEH - {0xCD5C, 0xCD5C, prLV}, // Lo HANGUL SYLLABLE COE - {0xCD5D, 0xCD77, prLVT}, // Lo [27] HANGUL SYLLABLE COEG..HANGUL SYLLABLE COEH - {0xCD78, 0xCD78, prLV}, // Lo HANGUL SYLLABLE CYO - {0xCD79, 0xCD93, prLVT}, // Lo [27] HANGUL SYLLABLE CYOG..HANGUL SYLLABLE CYOH - {0xCD94, 0xCD94, prLV}, // Lo HANGUL SYLLABLE CU - {0xCD95, 0xCDAF, prLVT}, // Lo [27] HANGUL SYLLABLE CUG..HANGUL SYLLABLE CUH - {0xCDB0, 0xCDB0, prLV}, // Lo HANGUL SYLLABLE CWEO - {0xCDB1, 0xCDCB, prLVT}, // Lo [27] HANGUL SYLLABLE CWEOG..HANGUL SYLLABLE CWEOH - {0xCDCC, 0xCDCC, prLV}, // Lo HANGUL SYLLABLE CWE - {0xCDCD, 0xCDE7, prLVT}, // Lo [27] HANGUL SYLLABLE CWEG..HANGUL SYLLABLE CWEH - {0xCDE8, 0xCDE8, prLV}, // Lo HANGUL SYLLABLE CWI - {0xCDE9, 0xCE03, prLVT}, // Lo [27] HANGUL SYLLABLE CWIG..HANGUL SYLLABLE CWIH - {0xCE04, 0xCE04, prLV}, // Lo HANGUL SYLLABLE CYU - {0xCE05, 0xCE1F, prLVT}, // Lo [27] HANGUL SYLLABLE CYUG..HANGUL SYLLABLE CYUH - {0xCE20, 0xCE20, prLV}, // Lo HANGUL SYLLABLE CEU - {0xCE21, 0xCE3B, prLVT}, // Lo [27] HANGUL SYLLABLE CEUG..HANGUL SYLLABLE CEUH - {0xCE3C, 0xCE3C, prLV}, // Lo HANGUL SYLLABLE CYI - {0xCE3D, 0xCE57, prLVT}, // Lo [27] HANGUL SYLLABLE CYIG..HANGUL SYLLABLE CYIH - {0xCE58, 0xCE58, prLV}, // Lo HANGUL SYLLABLE CI - {0xCE59, 0xCE73, prLVT}, // Lo [27] HANGUL SYLLABLE CIG..HANGUL SYLLABLE CIH - {0xCE74, 0xCE74, prLV}, // Lo HANGUL SYLLABLE KA - {0xCE75, 0xCE8F, prLVT}, // Lo [27] HANGUL SYLLABLE KAG..HANGUL SYLLABLE KAH - {0xCE90, 0xCE90, prLV}, // Lo HANGUL SYLLABLE KAE - {0xCE91, 0xCEAB, prLVT}, // Lo [27] HANGUL SYLLABLE KAEG..HANGUL SYLLABLE KAEH - {0xCEAC, 0xCEAC, prLV}, // Lo HANGUL SYLLABLE KYA - {0xCEAD, 0xCEC7, prLVT}, // Lo [27] HANGUL SYLLABLE KYAG..HANGUL SYLLABLE KYAH - {0xCEC8, 0xCEC8, prLV}, // Lo HANGUL SYLLABLE KYAE - {0xCEC9, 0xCEE3, prLVT}, // Lo [27] HANGUL SYLLABLE KYAEG..HANGUL SYLLABLE KYAEH - {0xCEE4, 0xCEE4, prLV}, // Lo HANGUL SYLLABLE KEO - {0xCEE5, 0xCEFF, prLVT}, // Lo [27] HANGUL SYLLABLE KEOG..HANGUL SYLLABLE KEOH - {0xCF00, 0xCF00, prLV}, // Lo HANGUL SYLLABLE KE - {0xCF01, 0xCF1B, prLVT}, // Lo [27] HANGUL SYLLABLE KEG..HANGUL SYLLABLE KEH - {0xCF1C, 0xCF1C, prLV}, // Lo HANGUL SYLLABLE KYEO - {0xCF1D, 0xCF37, prLVT}, // Lo [27] HANGUL SYLLABLE KYEOG..HANGUL SYLLABLE KYEOH - {0xCF38, 0xCF38, prLV}, // Lo HANGUL SYLLABLE KYE - {0xCF39, 0xCF53, prLVT}, // Lo [27] HANGUL SYLLABLE KYEG..HANGUL SYLLABLE KYEH - {0xCF54, 0xCF54, prLV}, // Lo HANGUL SYLLABLE KO - {0xCF55, 0xCF6F, prLVT}, // Lo [27] HANGUL SYLLABLE KOG..HANGUL SYLLABLE KOH - {0xCF70, 0xCF70, prLV}, // Lo HANGUL SYLLABLE KWA - {0xCF71, 0xCF8B, prLVT}, // Lo [27] HANGUL SYLLABLE KWAG..HANGUL SYLLABLE KWAH - {0xCF8C, 0xCF8C, prLV}, // Lo HANGUL SYLLABLE KWAE - {0xCF8D, 0xCFA7, prLVT}, // Lo [27] HANGUL SYLLABLE KWAEG..HANGUL SYLLABLE KWAEH - {0xCFA8, 0xCFA8, prLV}, // Lo HANGUL SYLLABLE KOE - {0xCFA9, 0xCFC3, prLVT}, // Lo [27] HANGUL SYLLABLE KOEG..HANGUL SYLLABLE KOEH - {0xCFC4, 0xCFC4, prLV}, // Lo HANGUL SYLLABLE KYO - {0xCFC5, 0xCFDF, prLVT}, // Lo [27] HANGUL SYLLABLE KYOG..HANGUL SYLLABLE KYOH - {0xCFE0, 0xCFE0, prLV}, // Lo HANGUL SYLLABLE KU - {0xCFE1, 0xCFFB, prLVT}, // Lo [27] HANGUL SYLLABLE KUG..HANGUL SYLLABLE KUH - {0xCFFC, 0xCFFC, prLV}, // Lo HANGUL SYLLABLE KWEO - {0xCFFD, 0xD017, prLVT}, // Lo [27] HANGUL SYLLABLE KWEOG..HANGUL SYLLABLE KWEOH - {0xD018, 0xD018, prLV}, // Lo HANGUL SYLLABLE KWE - {0xD019, 0xD033, prLVT}, // Lo [27] HANGUL SYLLABLE KWEG..HANGUL SYLLABLE KWEH - {0xD034, 0xD034, prLV}, // Lo HANGUL SYLLABLE KWI - {0xD035, 0xD04F, prLVT}, // Lo [27] HANGUL SYLLABLE KWIG..HANGUL SYLLABLE KWIH - {0xD050, 0xD050, prLV}, // Lo HANGUL SYLLABLE KYU - {0xD051, 0xD06B, prLVT}, // Lo [27] HANGUL SYLLABLE KYUG..HANGUL SYLLABLE KYUH - {0xD06C, 0xD06C, prLV}, // Lo HANGUL SYLLABLE KEU - {0xD06D, 0xD087, prLVT}, // Lo [27] HANGUL SYLLABLE KEUG..HANGUL SYLLABLE KEUH - {0xD088, 0xD088, prLV}, // Lo HANGUL SYLLABLE KYI - {0xD089, 0xD0A3, prLVT}, // Lo [27] HANGUL SYLLABLE KYIG..HANGUL SYLLABLE KYIH - {0xD0A4, 0xD0A4, prLV}, // Lo HANGUL SYLLABLE KI - {0xD0A5, 0xD0BF, prLVT}, // Lo [27] HANGUL SYLLABLE KIG..HANGUL SYLLABLE KIH - {0xD0C0, 0xD0C0, prLV}, // Lo HANGUL SYLLABLE TA - {0xD0C1, 0xD0DB, prLVT}, // Lo [27] HANGUL SYLLABLE TAG..HANGUL SYLLABLE TAH - {0xD0DC, 0xD0DC, prLV}, // Lo HANGUL SYLLABLE TAE - {0xD0DD, 0xD0F7, prLVT}, // Lo [27] HANGUL SYLLABLE TAEG..HANGUL SYLLABLE TAEH - {0xD0F8, 0xD0F8, prLV}, // Lo HANGUL SYLLABLE TYA - {0xD0F9, 0xD113, prLVT}, // Lo [27] HANGUL SYLLABLE TYAG..HANGUL SYLLABLE TYAH - {0xD114, 0xD114, prLV}, // Lo HANGUL SYLLABLE TYAE - {0xD115, 0xD12F, prLVT}, // Lo [27] HANGUL SYLLABLE TYAEG..HANGUL SYLLABLE TYAEH - {0xD130, 0xD130, prLV}, // Lo HANGUL SYLLABLE TEO - {0xD131, 0xD14B, prLVT}, // Lo [27] HANGUL SYLLABLE TEOG..HANGUL SYLLABLE TEOH - {0xD14C, 0xD14C, prLV}, // Lo HANGUL SYLLABLE TE - {0xD14D, 0xD167, prLVT}, // Lo [27] HANGUL SYLLABLE TEG..HANGUL SYLLABLE TEH - {0xD168, 0xD168, prLV}, // Lo HANGUL SYLLABLE TYEO - {0xD169, 0xD183, prLVT}, // Lo [27] HANGUL SYLLABLE TYEOG..HANGUL SYLLABLE TYEOH - {0xD184, 0xD184, prLV}, // Lo HANGUL SYLLABLE TYE - {0xD185, 0xD19F, prLVT}, // Lo [27] HANGUL SYLLABLE TYEG..HANGUL SYLLABLE TYEH - {0xD1A0, 0xD1A0, prLV}, // Lo HANGUL SYLLABLE TO - {0xD1A1, 0xD1BB, prLVT}, // Lo [27] HANGUL SYLLABLE TOG..HANGUL SYLLABLE TOH - {0xD1BC, 0xD1BC, prLV}, // Lo HANGUL SYLLABLE TWA - {0xD1BD, 0xD1D7, prLVT}, // Lo [27] HANGUL SYLLABLE TWAG..HANGUL SYLLABLE TWAH - {0xD1D8, 0xD1D8, prLV}, // Lo HANGUL SYLLABLE TWAE - {0xD1D9, 0xD1F3, prLVT}, // Lo [27] HANGUL SYLLABLE TWAEG..HANGUL SYLLABLE TWAEH - {0xD1F4, 0xD1F4, prLV}, // Lo HANGUL SYLLABLE TOE - {0xD1F5, 0xD20F, prLVT}, // Lo [27] HANGUL SYLLABLE TOEG..HANGUL SYLLABLE TOEH - {0xD210, 0xD210, prLV}, // Lo HANGUL SYLLABLE TYO - {0xD211, 0xD22B, prLVT}, // Lo [27] HANGUL SYLLABLE TYOG..HANGUL SYLLABLE TYOH - {0xD22C, 0xD22C, prLV}, // Lo HANGUL SYLLABLE TU - {0xD22D, 0xD247, prLVT}, // Lo [27] HANGUL SYLLABLE TUG..HANGUL SYLLABLE TUH - {0xD248, 0xD248, prLV}, // Lo HANGUL SYLLABLE TWEO - {0xD249, 0xD263, prLVT}, // Lo [27] HANGUL SYLLABLE TWEOG..HANGUL SYLLABLE TWEOH - {0xD264, 0xD264, prLV}, // Lo HANGUL SYLLABLE TWE - {0xD265, 0xD27F, prLVT}, // Lo [27] HANGUL SYLLABLE TWEG..HANGUL SYLLABLE TWEH - {0xD280, 0xD280, prLV}, // Lo HANGUL SYLLABLE TWI - {0xD281, 0xD29B, prLVT}, // Lo [27] HANGUL SYLLABLE TWIG..HANGUL SYLLABLE TWIH - {0xD29C, 0xD29C, prLV}, // Lo HANGUL SYLLABLE TYU - {0xD29D, 0xD2B7, prLVT}, // Lo [27] HANGUL SYLLABLE TYUG..HANGUL SYLLABLE TYUH - {0xD2B8, 0xD2B8, prLV}, // Lo HANGUL SYLLABLE TEU - {0xD2B9, 0xD2D3, prLVT}, // Lo [27] HANGUL SYLLABLE TEUG..HANGUL SYLLABLE TEUH - {0xD2D4, 0xD2D4, prLV}, // Lo HANGUL SYLLABLE TYI - {0xD2D5, 0xD2EF, prLVT}, // Lo [27] HANGUL SYLLABLE TYIG..HANGUL SYLLABLE TYIH - {0xD2F0, 0xD2F0, prLV}, // Lo HANGUL SYLLABLE TI - {0xD2F1, 0xD30B, prLVT}, // Lo [27] HANGUL SYLLABLE TIG..HANGUL SYLLABLE TIH - {0xD30C, 0xD30C, prLV}, // Lo HANGUL SYLLABLE PA - {0xD30D, 0xD327, prLVT}, // Lo [27] HANGUL SYLLABLE PAG..HANGUL SYLLABLE PAH - {0xD328, 0xD328, prLV}, // Lo HANGUL SYLLABLE PAE - {0xD329, 0xD343, prLVT}, // Lo [27] HANGUL SYLLABLE PAEG..HANGUL SYLLABLE PAEH - {0xD344, 0xD344, prLV}, // Lo HANGUL SYLLABLE PYA - {0xD345, 0xD35F, prLVT}, // Lo [27] HANGUL SYLLABLE PYAG..HANGUL SYLLABLE PYAH - {0xD360, 0xD360, prLV}, // Lo HANGUL SYLLABLE PYAE - {0xD361, 0xD37B, prLVT}, // Lo [27] HANGUL SYLLABLE PYAEG..HANGUL SYLLABLE PYAEH - {0xD37C, 0xD37C, prLV}, // Lo HANGUL SYLLABLE PEO - {0xD37D, 0xD397, prLVT}, // Lo [27] HANGUL SYLLABLE PEOG..HANGUL SYLLABLE PEOH - {0xD398, 0xD398, prLV}, // Lo HANGUL SYLLABLE PE - {0xD399, 0xD3B3, prLVT}, // Lo [27] HANGUL SYLLABLE PEG..HANGUL SYLLABLE PEH - {0xD3B4, 0xD3B4, prLV}, // Lo HANGUL SYLLABLE PYEO - {0xD3B5, 0xD3CF, prLVT}, // Lo [27] HANGUL SYLLABLE PYEOG..HANGUL SYLLABLE PYEOH - {0xD3D0, 0xD3D0, prLV}, // Lo HANGUL SYLLABLE PYE - {0xD3D1, 0xD3EB, prLVT}, // Lo [27] HANGUL SYLLABLE PYEG..HANGUL SYLLABLE PYEH - {0xD3EC, 0xD3EC, prLV}, // Lo HANGUL SYLLABLE PO - {0xD3ED, 0xD407, prLVT}, // Lo [27] HANGUL SYLLABLE POG..HANGUL SYLLABLE POH - {0xD408, 0xD408, prLV}, // Lo HANGUL SYLLABLE PWA - {0xD409, 0xD423, prLVT}, // Lo [27] HANGUL SYLLABLE PWAG..HANGUL SYLLABLE PWAH - {0xD424, 0xD424, prLV}, // Lo HANGUL SYLLABLE PWAE - {0xD425, 0xD43F, prLVT}, // Lo [27] HANGUL SYLLABLE PWAEG..HANGUL SYLLABLE PWAEH - {0xD440, 0xD440, prLV}, // Lo HANGUL SYLLABLE POE - {0xD441, 0xD45B, prLVT}, // Lo [27] HANGUL SYLLABLE POEG..HANGUL SYLLABLE POEH - {0xD45C, 0xD45C, prLV}, // Lo HANGUL SYLLABLE PYO - {0xD45D, 0xD477, prLVT}, // Lo [27] HANGUL SYLLABLE PYOG..HANGUL SYLLABLE PYOH - {0xD478, 0xD478, prLV}, // Lo HANGUL SYLLABLE PU - {0xD479, 0xD493, prLVT}, // Lo [27] HANGUL SYLLABLE PUG..HANGUL SYLLABLE PUH - {0xD494, 0xD494, prLV}, // Lo HANGUL SYLLABLE PWEO - {0xD495, 0xD4AF, prLVT}, // Lo [27] HANGUL SYLLABLE PWEOG..HANGUL SYLLABLE PWEOH - {0xD4B0, 0xD4B0, prLV}, // Lo HANGUL SYLLABLE PWE - {0xD4B1, 0xD4CB, prLVT}, // Lo [27] HANGUL SYLLABLE PWEG..HANGUL SYLLABLE PWEH - {0xD4CC, 0xD4CC, prLV}, // Lo HANGUL SYLLABLE PWI - {0xD4CD, 0xD4E7, prLVT}, // Lo [27] HANGUL SYLLABLE PWIG..HANGUL SYLLABLE PWIH - {0xD4E8, 0xD4E8, prLV}, // Lo HANGUL SYLLABLE PYU - {0xD4E9, 0xD503, prLVT}, // Lo [27] HANGUL SYLLABLE PYUG..HANGUL SYLLABLE PYUH - {0xD504, 0xD504, prLV}, // Lo HANGUL SYLLABLE PEU - {0xD505, 0xD51F, prLVT}, // Lo [27] HANGUL SYLLABLE PEUG..HANGUL SYLLABLE PEUH - {0xD520, 0xD520, prLV}, // Lo HANGUL SYLLABLE PYI - {0xD521, 0xD53B, prLVT}, // Lo [27] HANGUL SYLLABLE PYIG..HANGUL SYLLABLE PYIH - {0xD53C, 0xD53C, prLV}, // Lo HANGUL SYLLABLE PI - {0xD53D, 0xD557, prLVT}, // Lo [27] HANGUL SYLLABLE PIG..HANGUL SYLLABLE PIH - {0xD558, 0xD558, prLV}, // Lo HANGUL SYLLABLE HA - {0xD559, 0xD573, prLVT}, // Lo [27] HANGUL SYLLABLE HAG..HANGUL SYLLABLE HAH - {0xD574, 0xD574, prLV}, // Lo HANGUL SYLLABLE HAE - {0xD575, 0xD58F, prLVT}, // Lo [27] HANGUL SYLLABLE HAEG..HANGUL SYLLABLE HAEH - {0xD590, 0xD590, prLV}, // Lo HANGUL SYLLABLE HYA - {0xD591, 0xD5AB, prLVT}, // Lo [27] HANGUL SYLLABLE HYAG..HANGUL SYLLABLE HYAH - {0xD5AC, 0xD5AC, prLV}, // Lo HANGUL SYLLABLE HYAE - {0xD5AD, 0xD5C7, prLVT}, // Lo [27] HANGUL SYLLABLE HYAEG..HANGUL SYLLABLE HYAEH - {0xD5C8, 0xD5C8, prLV}, // Lo HANGUL SYLLABLE HEO - {0xD5C9, 0xD5E3, prLVT}, // Lo [27] HANGUL SYLLABLE HEOG..HANGUL SYLLABLE HEOH - {0xD5E4, 0xD5E4, prLV}, // Lo HANGUL SYLLABLE HE - {0xD5E5, 0xD5FF, prLVT}, // Lo [27] HANGUL SYLLABLE HEG..HANGUL SYLLABLE HEH - {0xD600, 0xD600, prLV}, // Lo HANGUL SYLLABLE HYEO - {0xD601, 0xD61B, prLVT}, // Lo [27] HANGUL SYLLABLE HYEOG..HANGUL SYLLABLE HYEOH - {0xD61C, 0xD61C, prLV}, // Lo HANGUL SYLLABLE HYE - {0xD61D, 0xD637, prLVT}, // Lo [27] HANGUL SYLLABLE HYEG..HANGUL SYLLABLE HYEH - {0xD638, 0xD638, prLV}, // Lo HANGUL SYLLABLE HO - {0xD639, 0xD653, prLVT}, // Lo [27] HANGUL SYLLABLE HOG..HANGUL SYLLABLE HOH - {0xD654, 0xD654, prLV}, // Lo HANGUL SYLLABLE HWA - {0xD655, 0xD66F, prLVT}, // Lo [27] HANGUL SYLLABLE HWAG..HANGUL SYLLABLE HWAH - {0xD670, 0xD670, prLV}, // Lo HANGUL SYLLABLE HWAE - {0xD671, 0xD68B, prLVT}, // Lo [27] HANGUL SYLLABLE HWAEG..HANGUL SYLLABLE HWAEH - {0xD68C, 0xD68C, prLV}, // Lo HANGUL SYLLABLE HOE - {0xD68D, 0xD6A7, prLVT}, // Lo [27] HANGUL SYLLABLE HOEG..HANGUL SYLLABLE HOEH - {0xD6A8, 0xD6A8, prLV}, // Lo HANGUL SYLLABLE HYO - {0xD6A9, 0xD6C3, prLVT}, // Lo [27] HANGUL SYLLABLE HYOG..HANGUL SYLLABLE HYOH - {0xD6C4, 0xD6C4, prLV}, // Lo HANGUL SYLLABLE HU - {0xD6C5, 0xD6DF, prLVT}, // Lo [27] HANGUL SYLLABLE HUG..HANGUL SYLLABLE HUH - {0xD6E0, 0xD6E0, prLV}, // Lo HANGUL SYLLABLE HWEO - {0xD6E1, 0xD6FB, prLVT}, // Lo [27] HANGUL SYLLABLE HWEOG..HANGUL SYLLABLE HWEOH - {0xD6FC, 0xD6FC, prLV}, // Lo HANGUL SYLLABLE HWE - {0xD6FD, 0xD717, prLVT}, // Lo [27] HANGUL SYLLABLE HWEG..HANGUL SYLLABLE HWEH - {0xD718, 0xD718, prLV}, // Lo HANGUL SYLLABLE HWI - {0xD719, 0xD733, prLVT}, // Lo [27] HANGUL SYLLABLE HWIG..HANGUL SYLLABLE HWIH - {0xD734, 0xD734, prLV}, // Lo HANGUL SYLLABLE HYU - {0xD735, 0xD74F, prLVT}, // Lo [27] HANGUL SYLLABLE HYUG..HANGUL SYLLABLE HYUH - {0xD750, 0xD750, prLV}, // Lo HANGUL SYLLABLE HEU - {0xD751, 0xD76B, prLVT}, // Lo [27] HANGUL SYLLABLE HEUG..HANGUL SYLLABLE HEUH - {0xD76C, 0xD76C, prLV}, // Lo HANGUL SYLLABLE HYI - {0xD76D, 0xD787, prLVT}, // Lo [27] HANGUL SYLLABLE HYIG..HANGUL SYLLABLE HYIH - {0xD788, 0xD788, prLV}, // Lo HANGUL SYLLABLE HI - {0xD789, 0xD7A3, prLVT}, // Lo [27] HANGUL SYLLABLE HIG..HANGUL SYLLABLE HIH - {0xD7B0, 0xD7C6, prV}, // Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E - {0xD7CB, 0xD7FB, prT}, // Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH - {0xFB1E, 0xFB1E, prExtend}, // Mn HEBREW POINT JUDEO-SPANISH VARIKA - {0xFE00, 0xFE0F, prExtend}, // Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 - {0xFE20, 0xFE2F, prExtend}, // Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF - {0xFEFF, 0xFEFF, prControl}, // Cf ZERO WIDTH NO-BREAK SPACE - {0xFF9E, 0xFF9F, prExtend}, // Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK - {0xFFF0, 0xFFF8, prControl}, // Cn [9] .. - {0xFFF9, 0xFFFB, prControl}, // Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR - {0x101FD, 0x101FD, prExtend}, // Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE - {0x102E0, 0x102E0, prExtend}, // Mn COPTIC EPACT THOUSANDS MARK - {0x10376, 0x1037A, prExtend}, // Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII - {0x10A01, 0x10A03, prExtend}, // Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R - {0x10A05, 0x10A06, prExtend}, // Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O - {0x10A0C, 0x10A0F, prExtend}, // Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA - {0x10A38, 0x10A3A, prExtend}, // Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW - {0x10A3F, 0x10A3F, prExtend}, // Mn KHAROSHTHI VIRAMA - {0x10AE5, 0x10AE6, prExtend}, // Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW - {0x10D24, 0x10D27, prExtend}, // Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI - {0x10F46, 0x10F50, prExtend}, // Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW - {0x11000, 0x11000, prSpacingMark}, // Mc BRAHMI SIGN CANDRABINDU - {0x11001, 0x11001, prExtend}, // Mn BRAHMI SIGN ANUSVARA - {0x11002, 0x11002, prSpacingMark}, // Mc BRAHMI SIGN VISARGA - {0x11038, 0x11046, prExtend}, // Mn [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA - {0x1107F, 0x11081, prExtend}, // Mn [3] BRAHMI NUMBER JOINER..KAITHI SIGN ANUSVARA - {0x11082, 0x11082, prSpacingMark}, // Mc KAITHI SIGN VISARGA - {0x110B0, 0x110B2, prSpacingMark}, // Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II - {0x110B3, 0x110B6, prExtend}, // Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI - {0x110B7, 0x110B8, prSpacingMark}, // Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU - {0x110B9, 0x110BA, prExtend}, // Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA - {0x110BD, 0x110BD, prPreprend}, // Cf KAITHI NUMBER SIGN - {0x110CD, 0x110CD, prPreprend}, // Cf KAITHI NUMBER SIGN ABOVE - {0x11100, 0x11102, prExtend}, // Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA - {0x11127, 0x1112B, prExtend}, // Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU - {0x1112C, 0x1112C, prSpacingMark}, // Mc CHAKMA VOWEL SIGN E - {0x1112D, 0x11134, prExtend}, // Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA - {0x11145, 0x11146, prSpacingMark}, // Mc [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI - {0x11173, 0x11173, prExtend}, // Mn MAHAJANI SIGN NUKTA - {0x11180, 0x11181, prExtend}, // Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA - {0x11182, 0x11182, prSpacingMark}, // Mc SHARADA SIGN VISARGA - {0x111B3, 0x111B5, prSpacingMark}, // Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II - {0x111B6, 0x111BE, prExtend}, // Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O - {0x111BF, 0x111C0, prSpacingMark}, // Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA - {0x111C2, 0x111C3, prPreprend}, // Lo [2] SHARADA SIGN JIHVAMULIYA..SHARADA SIGN UPADHMANIYA - {0x111C9, 0x111CC, prExtend}, // Mn [4] SHARADA SANDHI MARK..SHARADA EXTRA SHORT VOWEL MARK - {0x1122C, 0x1122E, prSpacingMark}, // Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II - {0x1122F, 0x11231, prExtend}, // Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI - {0x11232, 0x11233, prSpacingMark}, // Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU - {0x11234, 0x11234, prExtend}, // Mn KHOJKI SIGN ANUSVARA - {0x11235, 0x11235, prSpacingMark}, // Mc KHOJKI SIGN VIRAMA - {0x11236, 0x11237, prExtend}, // Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA - {0x1123E, 0x1123E, prExtend}, // Mn KHOJKI SIGN SUKUN - {0x112DF, 0x112DF, prExtend}, // Mn KHUDAWADI SIGN ANUSVARA - {0x112E0, 0x112E2, prSpacingMark}, // Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II - {0x112E3, 0x112EA, prExtend}, // Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA - {0x11300, 0x11301, prExtend}, // Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU - {0x11302, 0x11303, prSpacingMark}, // Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA - {0x1133B, 0x1133C, prExtend}, // Mn [2] COMBINING BINDU BELOW..GRANTHA SIGN NUKTA - {0x1133E, 0x1133E, prExtend}, // Mc GRANTHA VOWEL SIGN AA - {0x1133F, 0x1133F, prSpacingMark}, // Mc GRANTHA VOWEL SIGN I - {0x11340, 0x11340, prExtend}, // Mn GRANTHA VOWEL SIGN II - {0x11341, 0x11344, prSpacingMark}, // Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR - {0x11347, 0x11348, prSpacingMark}, // Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI - {0x1134B, 0x1134D, prSpacingMark}, // Mc [3] GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA - {0x11357, 0x11357, prExtend}, // Mc GRANTHA AU LENGTH MARK - {0x11362, 0x11363, prSpacingMark}, // Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL - {0x11366, 0x1136C, prExtend}, // Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX - {0x11370, 0x11374, prExtend}, // Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA - {0x11435, 0x11437, prSpacingMark}, // Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II - {0x11438, 0x1143F, prExtend}, // Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI - {0x11440, 0x11441, prSpacingMark}, // Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU - {0x11442, 0x11444, prExtend}, // Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA - {0x11445, 0x11445, prSpacingMark}, // Mc NEWA SIGN VISARGA - {0x11446, 0x11446, prExtend}, // Mn NEWA SIGN NUKTA - {0x1145E, 0x1145E, prExtend}, // Mn NEWA SANDHI MARK - {0x114B0, 0x114B0, prExtend}, // Mc TIRHUTA VOWEL SIGN AA - {0x114B1, 0x114B2, prSpacingMark}, // Mc [2] TIRHUTA VOWEL SIGN I..TIRHUTA VOWEL SIGN II - {0x114B3, 0x114B8, prExtend}, // Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL - {0x114B9, 0x114B9, prSpacingMark}, // Mc TIRHUTA VOWEL SIGN E - {0x114BA, 0x114BA, prExtend}, // Mn TIRHUTA VOWEL SIGN SHORT E - {0x114BB, 0x114BC, prSpacingMark}, // Mc [2] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN O - {0x114BD, 0x114BD, prExtend}, // Mc TIRHUTA VOWEL SIGN SHORT O - {0x114BE, 0x114BE, prSpacingMark}, // Mc TIRHUTA VOWEL SIGN AU - {0x114BF, 0x114C0, prExtend}, // Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA - {0x114C1, 0x114C1, prSpacingMark}, // Mc TIRHUTA SIGN VISARGA - {0x114C2, 0x114C3, prExtend}, // Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA - {0x115AF, 0x115AF, prExtend}, // Mc SIDDHAM VOWEL SIGN AA - {0x115B0, 0x115B1, prSpacingMark}, // Mc [2] SIDDHAM VOWEL SIGN I..SIDDHAM VOWEL SIGN II - {0x115B2, 0x115B5, prExtend}, // Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR - {0x115B8, 0x115BB, prSpacingMark}, // Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU - {0x115BC, 0x115BD, prExtend}, // Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA - {0x115BE, 0x115BE, prSpacingMark}, // Mc SIDDHAM SIGN VISARGA - {0x115BF, 0x115C0, prExtend}, // Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA - {0x115DC, 0x115DD, prExtend}, // Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU - {0x11630, 0x11632, prSpacingMark}, // Mc [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II - {0x11633, 0x1163A, prExtend}, // Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI - {0x1163B, 0x1163C, prSpacingMark}, // Mc [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU - {0x1163D, 0x1163D, prExtend}, // Mn MODI SIGN ANUSVARA - {0x1163E, 0x1163E, prSpacingMark}, // Mc MODI SIGN VISARGA - {0x1163F, 0x11640, prExtend}, // Mn [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA - {0x116AB, 0x116AB, prExtend}, // Mn TAKRI SIGN ANUSVARA - {0x116AC, 0x116AC, prSpacingMark}, // Mc TAKRI SIGN VISARGA - {0x116AD, 0x116AD, prExtend}, // Mn TAKRI VOWEL SIGN AA - {0x116AE, 0x116AF, prSpacingMark}, // Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II - {0x116B0, 0x116B5, prExtend}, // Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU - {0x116B6, 0x116B6, prSpacingMark}, // Mc TAKRI SIGN VIRAMA - {0x116B7, 0x116B7, prExtend}, // Mn TAKRI SIGN NUKTA - {0x1171D, 0x1171F, prExtend}, // Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA - {0x11720, 0x11721, prSpacingMark}, // Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA - {0x11722, 0x11725, prExtend}, // Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU - {0x11726, 0x11726, prSpacingMark}, // Mc AHOM VOWEL SIGN E - {0x11727, 0x1172B, prExtend}, // Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER - {0x1182C, 0x1182E, prSpacingMark}, // Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II - {0x1182F, 0x11837, prExtend}, // Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA - {0x11838, 0x11838, prSpacingMark}, // Mc DOGRA SIGN VISARGA - {0x11839, 0x1183A, prExtend}, // Mn [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA - {0x119D1, 0x119D3, prSpacingMark}, // Mc [3] NANDINAGARI VOWEL SIGN AA..NANDINAGARI VOWEL SIGN II - {0x119D4, 0x119D7, prExtend}, // Mn [4] NANDINAGARI VOWEL SIGN U..NANDINAGARI VOWEL SIGN VOCALIC RR - {0x119DA, 0x119DB, prExtend}, // Mn [2] NANDINAGARI VOWEL SIGN E..NANDINAGARI VOWEL SIGN AI - {0x119DC, 0x119DF, prSpacingMark}, // Mc [4] NANDINAGARI VOWEL SIGN O..NANDINAGARI SIGN VISARGA - {0x119E0, 0x119E0, prExtend}, // Mn NANDINAGARI SIGN VIRAMA - {0x119E4, 0x119E4, prSpacingMark}, // Mc NANDINAGARI VOWEL SIGN PRISHTHAMATRA E - {0x11A01, 0x11A0A, prExtend}, // Mn [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK - {0x11A33, 0x11A38, prExtend}, // Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA - {0x11A39, 0x11A39, prSpacingMark}, // Mc ZANABAZAR SQUARE SIGN VISARGA - {0x11A3A, 0x11A3A, prPreprend}, // Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA - {0x11A3B, 0x11A3E, prExtend}, // Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA - {0x11A47, 0x11A47, prExtend}, // Mn ZANABAZAR SQUARE SUBJOINER - {0x11A51, 0x11A56, prExtend}, // Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE - {0x11A57, 0x11A58, prSpacingMark}, // Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU - {0x11A59, 0x11A5B, prExtend}, // Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK - {0x11A84, 0x11A89, prPreprend}, // Lo [6] SOYOMBO SIGN JIHVAMULIYA..SOYOMBO CLUSTER-INITIAL LETTER SA - {0x11A8A, 0x11A96, prExtend}, // Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA - {0x11A97, 0x11A97, prSpacingMark}, // Mc SOYOMBO SIGN VISARGA - {0x11A98, 0x11A99, prExtend}, // Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER - {0x11C2F, 0x11C2F, prSpacingMark}, // Mc BHAIKSUKI VOWEL SIGN AA - {0x11C30, 0x11C36, prExtend}, // Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L - {0x11C38, 0x11C3D, prExtend}, // Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA - {0x11C3E, 0x11C3E, prSpacingMark}, // Mc BHAIKSUKI SIGN VISARGA - {0x11C3F, 0x11C3F, prExtend}, // Mn BHAIKSUKI SIGN VIRAMA - {0x11C92, 0x11CA7, prExtend}, // Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA - {0x11CA9, 0x11CA9, prSpacingMark}, // Mc MARCHEN SUBJOINED LETTER YA - {0x11CAA, 0x11CB0, prExtend}, // Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA - {0x11CB1, 0x11CB1, prSpacingMark}, // Mc MARCHEN VOWEL SIGN I - {0x11CB2, 0x11CB3, prExtend}, // Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E - {0x11CB4, 0x11CB4, prSpacingMark}, // Mc MARCHEN VOWEL SIGN O - {0x11CB5, 0x11CB6, prExtend}, // Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU - {0x11D31, 0x11D36, prExtend}, // Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R - {0x11D3A, 0x11D3A, prExtend}, // Mn MASARAM GONDI VOWEL SIGN E - {0x11D3C, 0x11D3D, prExtend}, // Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O - {0x11D3F, 0x11D45, prExtend}, // Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA - {0x11D46, 0x11D46, prPreprend}, // Lo MASARAM GONDI REPHA - {0x11D47, 0x11D47, prExtend}, // Mn MASARAM GONDI RA-KARA - {0x11D8A, 0x11D8E, prSpacingMark}, // Mc [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU - {0x11D90, 0x11D91, prExtend}, // Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI - {0x11D93, 0x11D94, prSpacingMark}, // Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU - {0x11D95, 0x11D95, prExtend}, // Mn GUNJALA GONDI SIGN ANUSVARA - {0x11D96, 0x11D96, prSpacingMark}, // Mc GUNJALA GONDI SIGN VISARGA - {0x11D97, 0x11D97, prExtend}, // Mn GUNJALA GONDI VIRAMA - {0x11EF3, 0x11EF4, prExtend}, // Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U - {0x11EF5, 0x11EF6, prSpacingMark}, // Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O - {0x13430, 0x13438, prControl}, // Cf [9] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END SEGMENT - {0x16AF0, 0x16AF4, prExtend}, // Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE - {0x16B30, 0x16B36, prExtend}, // Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM - {0x16F4F, 0x16F4F, prExtend}, // Mn MIAO SIGN CONSONANT MODIFIER BAR - {0x16F51, 0x16F87, prSpacingMark}, // Mc [55] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN UI - {0x16F8F, 0x16F92, prExtend}, // Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW - {0x1BC9D, 0x1BC9E, prExtend}, // Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK - {0x1BCA0, 0x1BCA3, prControl}, // Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP - {0x1D165, 0x1D165, prExtend}, // Mc MUSICAL SYMBOL COMBINING STEM - {0x1D166, 0x1D166, prSpacingMark}, // Mc MUSICAL SYMBOL COMBINING SPRECHGESANG STEM - {0x1D167, 0x1D169, prExtend}, // Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 - {0x1D16D, 0x1D16D, prSpacingMark}, // Mc MUSICAL SYMBOL COMBINING AUGMENTATION DOT - {0x1D16E, 0x1D172, prExtend}, // Mc [5] MUSICAL SYMBOL COMBINING FLAG-1..MUSICAL SYMBOL COMBINING FLAG-5 - {0x1D173, 0x1D17A, prControl}, // Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE - {0x1D17B, 0x1D182, prExtend}, // Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE - {0x1D185, 0x1D18B, prExtend}, // Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE - {0x1D1AA, 0x1D1AD, prExtend}, // Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO - {0x1D242, 0x1D244, prExtend}, // Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME - {0x1DA00, 0x1DA36, prExtend}, // Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN - {0x1DA3B, 0x1DA6C, prExtend}, // Mn [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT - {0x1DA75, 0x1DA75, prExtend}, // Mn SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS - {0x1DA84, 0x1DA84, prExtend}, // Mn SIGNWRITING LOCATION HEAD NECK - {0x1DA9B, 0x1DA9F, prExtend}, // Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 - {0x1DAA1, 0x1DAAF, prExtend}, // Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 - {0x1E000, 0x1E006, prExtend}, // Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE - {0x1E008, 0x1E018, prExtend}, // Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU - {0x1E01B, 0x1E021, prExtend}, // Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI - {0x1E023, 0x1E024, prExtend}, // Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS - {0x1E026, 0x1E02A, prExtend}, // Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA - {0x1E130, 0x1E136, prExtend}, // Mn [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D - {0x1E2EC, 0x1E2EF, prExtend}, // Mn [4] WANCHO TONE TUP..WANCHO TONE KOINI - {0x1E8D0, 0x1E8D6, prExtend}, // Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS - {0x1E944, 0x1E94A, prExtend}, // Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA - {0x1F000, 0x1F02B, prExtendedPictographic}, // 5.1 [44] (🀀..🀫) MAHJONG TILE EAST WIND..MAHJONG TILE BACK - {0x1F02C, 0x1F02F, prExtendedPictographic}, // NA [4] (🀬..🀯) .. - {0x1F030, 0x1F093, prExtendedPictographic}, // 5.1[100] (🀰..đź‚“) DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06 - {0x1F094, 0x1F09F, prExtendedPictographic}, // NA [12] (đź‚”..🂟) .. - {0x1F0A0, 0x1F0AE, prExtendedPictographic}, // 6.0 [15] (đź‚ ..đź‚®) PLAYING CARD BACK..PLAYING CARD KING OF SPADES - {0x1F0AF, 0x1F0B0, prExtendedPictographic}, // NA [2] (🂯..đź‚°) .. - {0x1F0B1, 0x1F0BE, prExtendedPictographic}, // 6.0 [14] (🂱..🂾) PLAYING CARD ACE OF HEARTS..PLAYING CARD KING OF HEARTS - {0x1F0BF, 0x1F0BF, prExtendedPictographic}, // 7.0 [1] (🂿) PLAYING CARD RED JOKER - {0x1F0C0, 0x1F0C0, prExtendedPictographic}, // NA [1] (đź€) - {0x1F0C1, 0x1F0CF, prExtendedPictographic}, // 6.0 [15] (đź..đźŹ) PLAYING CARD ACE OF DIAMONDS..joker - {0x1F0D0, 0x1F0D0, prExtendedPictographic}, // NA [1] (đź) - {0x1F0D1, 0x1F0DF, prExtendedPictographic}, // 6.0 [15] (đź‘..đźź) PLAYING CARD ACE OF CLUBS..PLAYING CARD WHITE JOKER - {0x1F0E0, 0x1F0F5, prExtendedPictographic}, // 7.0 [22] (đź ..đźµ) PLAYING CARD FOOL..PLAYING CARD TRUMP-21 - {0x1F0F6, 0x1F0FF, prExtendedPictographic}, // NA [10] (đź¶..đźż) .. - {0x1F10D, 0x1F10F, prExtendedPictographic}, // NA [3] (🄍..🄏) .. - {0x1F12F, 0x1F12F, prExtendedPictographic}, // 11.0 [1] (🄯) COPYLEFT SYMBOL - {0x1F16C, 0x1F16C, prExtendedPictographic}, // 12.0 [1] (đź…¬) RAISED MR SIGN - {0x1F16D, 0x1F16F, prExtendedPictographic}, // NA [3] (đź…­..đź…Ż) .. - {0x1F170, 0x1F171, prExtendedPictographic}, // 6.0 [2] (🅰️..🅱️) A button (blood type)..B button (blood type) - {0x1F17E, 0x1F17E, prExtendedPictographic}, // 6.0 [1] (🅾️) O button (blood type) - {0x1F17F, 0x1F17F, prExtendedPictographic}, // 5.2 [1] (🅿️) P button - {0x1F18E, 0x1F18E, prExtendedPictographic}, // 6.0 [1] (🆎) AB button (blood type) - {0x1F191, 0x1F19A, prExtendedPictographic}, // 6.0 [10] (🆑..🆚) CL button..VS button - {0x1F1AD, 0x1F1E5, prExtendedPictographic}, // NA [57] (🆭..🇥) .. - {0x1F1E6, 0x1F1FF, prRegionalIndicator}, // So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z - {0x1F201, 0x1F202, prExtendedPictographic}, // 6.0 [2] (đź..đź‚️) Japanese “here” button..Japanese “service charge” button - {0x1F203, 0x1F20F, prExtendedPictographic}, // NA [13] (đź..đźŹ) .. - {0x1F21A, 0x1F21A, prExtendedPictographic}, // 5.2 [1] (đźš) Japanese “free of charge” button - {0x1F22F, 0x1F22F, prExtendedPictographic}, // 5.2 [1] (đźŻ) Japanese “reserved” button - {0x1F232, 0x1F23A, prExtendedPictographic}, // 6.0 [9] (đź˛..đźş) Japanese “prohibited” button..Japanese “open for business” button - {0x1F23C, 0x1F23F, prExtendedPictographic}, // NA [4] (đźĽ..đźż) .. - {0x1F249, 0x1F24F, prExtendedPictographic}, // NA [7] (🉉..🉏) .. - {0x1F250, 0x1F251, prExtendedPictographic}, // 6.0 [2] (đź‰..🉑) Japanese “bargain” button..Japanese “acceptable” button - {0x1F252, 0x1F25F, prExtendedPictographic}, // NA [14] (🉒..🉟) .. - {0x1F260, 0x1F265, prExtendedPictographic}, // 10.0 [6] (🉠..🉥) ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI - {0x1F266, 0x1F2FF, prExtendedPictographic}, // NA[154] (🉦..🋿) .. - {0x1F300, 0x1F320, prExtendedPictographic}, // 6.0 [33] (🌀..🌠) cyclone..shooting star - {0x1F321, 0x1F32C, prExtendedPictographic}, // 7.0 [12] (🌡️..🌬️) thermometer..wind face - {0x1F32D, 0x1F32F, prExtendedPictographic}, // 8.0 [3] (🌭..🌯) hot dog..burrito - {0x1F330, 0x1F335, prExtendedPictographic}, // 6.0 [6] (🌰..🌵) chestnut..cactus - {0x1F336, 0x1F336, prExtendedPictographic}, // 7.0 [1] (🌶️) hot pepper - {0x1F337, 0x1F37C, prExtendedPictographic}, // 6.0 [70] (🌷..🍼) tulip..baby bottle - {0x1F37D, 0x1F37D, prExtendedPictographic}, // 7.0 [1] (🍽️) fork and knife with plate - {0x1F37E, 0x1F37F, prExtendedPictographic}, // 8.0 [2] (🍾..🍿) bottle with popping cork..popcorn - {0x1F380, 0x1F393, prExtendedPictographic}, // 6.0 [20] (🎀..🎓) ribbon..graduation cap - {0x1F394, 0x1F39F, prExtendedPictographic}, // 7.0 [12] (🎔..🎟️) HEART WITH TIP ON THE LEFT..admission tickets - {0x1F3A0, 0x1F3C4, prExtendedPictographic}, // 6.0 [37] (🎠..🏄) carousel horse..person surfing - {0x1F3C5, 0x1F3C5, prExtendedPictographic}, // 7.0 [1] (🏅) sports medal - {0x1F3C6, 0x1F3CA, prExtendedPictographic}, // 6.0 [5] (🏆..🏊) trophy..person swimming - {0x1F3CB, 0x1F3CE, prExtendedPictographic}, // 7.0 [4] (🏋️..🏎️) person lifting weights..racing car - {0x1F3CF, 0x1F3D3, prExtendedPictographic}, // 8.0 [5] (🏏..🏓) cricket game..ping pong - {0x1F3D4, 0x1F3DF, prExtendedPictographic}, // 7.0 [12] (🏔️..🏟️) snow-capped mountain..stadium - {0x1F3E0, 0x1F3F0, prExtendedPictographic}, // 6.0 [17] (🏠..🏰) house..castle - {0x1F3F1, 0x1F3F7, prExtendedPictographic}, // 7.0 [7] (🏱..🏷️) WHITE PENNANT..label - {0x1F3F8, 0x1F3FA, prExtendedPictographic}, // 8.0 [3] (🏸..🏺) badminton..amphora - {0x1F3FB, 0x1F3FF, prExtend}, // Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 - {0x1F400, 0x1F43E, prExtendedPictographic}, // 6.0 [63] (đź€..đźľ) rat..paw prints - {0x1F43F, 0x1F43F, prExtendedPictographic}, // 7.0 [1] (đźżď¸Ź) chipmunk - {0x1F440, 0x1F440, prExtendedPictographic}, // 6.0 [1] (đź‘€) eyes - {0x1F441, 0x1F441, prExtendedPictographic}, // 7.0 [1] (đź‘️) eye - {0x1F442, 0x1F4F7, prExtendedPictographic}, // 6.0[182] (đź‘‚..đź“·) ear..camera - {0x1F4F8, 0x1F4F8, prExtendedPictographic}, // 7.0 [1] (📸) camera with flash - {0x1F4F9, 0x1F4FC, prExtendedPictographic}, // 6.0 [4] (📹..📼) video camera..videocassette - {0x1F4FD, 0x1F4FE, prExtendedPictographic}, // 7.0 [2] (📽️..📾) film projector..PORTABLE STEREO - {0x1F4FF, 0x1F4FF, prExtendedPictographic}, // 8.0 [1] (📿) prayer beads - {0x1F500, 0x1F53D, prExtendedPictographic}, // 6.0 [62] (🔀..đź”˝) shuffle tracks button..downwards button - {0x1F546, 0x1F54A, prExtendedPictographic}, // 7.0 [5] (🕆..🕊️) WHITE LATIN CROSS..dove - {0x1F54B, 0x1F54F, prExtendedPictographic}, // 8.0 [5] (đź•‹..🕏) kaaba..BOWL OF HYGIEIA - {0x1F550, 0x1F567, prExtendedPictographic}, // 6.0 [24] (đź•..đź•§) one o’clock..twelve-thirty - {0x1F568, 0x1F579, prExtendedPictographic}, // 7.0 [18] (🕨..🕹️) RIGHT SPEAKER..joystick - {0x1F57A, 0x1F57A, prExtendedPictographic}, // 9.0 [1] (🕺) man dancing - {0x1F57B, 0x1F5A3, prExtendedPictographic}, // 7.0 [41] (đź•»..đź–Ł) LEFT HAND TELEPHONE RECEIVER..BLACK DOWN POINTING BACKHAND INDEX - {0x1F5A4, 0x1F5A4, prExtendedPictographic}, // 9.0 [1] (đź–¤) black heart - {0x1F5A5, 0x1F5FA, prExtendedPictographic}, // 7.0 [86] (🖥️..🗺️) desktop computer..world map - {0x1F5FB, 0x1F5FF, prExtendedPictographic}, // 6.0 [5] (đź—»..đź—ż) mount fuji..moai - {0x1F600, 0x1F600, prExtendedPictographic}, // 6.1 [1] (đź€) grinning face - {0x1F601, 0x1F610, prExtendedPictographic}, // 6.0 [16] (đź..đź) beaming face with smiling eyes..neutral face - {0x1F611, 0x1F611, prExtendedPictographic}, // 6.1 [1] (đź‘) expressionless face - {0x1F612, 0x1F614, prExtendedPictographic}, // 6.0 [3] (đź’..đź”) unamused face..pensive face - {0x1F615, 0x1F615, prExtendedPictographic}, // 6.1 [1] (đź•) confused face - {0x1F616, 0x1F616, prExtendedPictographic}, // 6.0 [1] (đź–) confounded face - {0x1F617, 0x1F617, prExtendedPictographic}, // 6.1 [1] (đź—) kissing face - {0x1F618, 0x1F618, prExtendedPictographic}, // 6.0 [1] (đź) face blowing a kiss - {0x1F619, 0x1F619, prExtendedPictographic}, // 6.1 [1] (đź™) kissing face with smiling eyes - {0x1F61A, 0x1F61A, prExtendedPictographic}, // 6.0 [1] (đźš) kissing face with closed eyes - {0x1F61B, 0x1F61B, prExtendedPictographic}, // 6.1 [1] (đź›) face with tongue - {0x1F61C, 0x1F61E, prExtendedPictographic}, // 6.0 [3] (đźś..đźž) winking face with tongue..disappointed face - {0x1F61F, 0x1F61F, prExtendedPictographic}, // 6.1 [1] (đźź) worried face - {0x1F620, 0x1F625, prExtendedPictographic}, // 6.0 [6] (đź ..đźĄ) angry face..sad but relieved face - {0x1F626, 0x1F627, prExtendedPictographic}, // 6.1 [2] (đź¦..đź§) frowning face with open mouth..anguished face - {0x1F628, 0x1F62B, prExtendedPictographic}, // 6.0 [4] (đź¨..đź«) fearful face..tired face - {0x1F62C, 0x1F62C, prExtendedPictographic}, // 6.1 [1] (đź¬) grimacing face - {0x1F62D, 0x1F62D, prExtendedPictographic}, // 6.0 [1] (đź­) loudly crying face - {0x1F62E, 0x1F62F, prExtendedPictographic}, // 6.1 [2] (đź®..đźŻ) face with open mouth..hushed face - {0x1F630, 0x1F633, prExtendedPictographic}, // 6.0 [4] (đź°..đźł) anxious face with sweat..flushed face - {0x1F634, 0x1F634, prExtendedPictographic}, // 6.1 [1] (đź´) sleeping face - {0x1F635, 0x1F640, prExtendedPictographic}, // 6.0 [12] (đźµ..🙀) dizzy face..weary cat - {0x1F641, 0x1F642, prExtendedPictographic}, // 7.0 [2] (đź™..🙂) slightly frowning face..slightly smiling face - {0x1F643, 0x1F644, prExtendedPictographic}, // 8.0 [2] (đź™..🙄) upside-down face..face with rolling eyes - {0x1F645, 0x1F64F, prExtendedPictographic}, // 6.0 [11] (đź™…..🙏) person gesturing NO..folded hands - {0x1F680, 0x1F6C5, prExtendedPictographic}, // 6.0 [70] (🚀..đź›…) rocket..left luggage - {0x1F6C6, 0x1F6CF, prExtendedPictographic}, // 7.0 [10] (🛆..🛏️) TRIANGLE WITH ROUNDED CORNERS..bed - {0x1F6D0, 0x1F6D0, prExtendedPictographic}, // 8.0 [1] (đź›) place of worship - {0x1F6D1, 0x1F6D2, prExtendedPictographic}, // 9.0 [2] (🛑..đź›’) stop sign..shopping cart - {0x1F6D3, 0x1F6D4, prExtendedPictographic}, // 10.0 [2] (🛓..đź›”) STUPA..PAGODA - {0x1F6D5, 0x1F6D5, prExtendedPictographic}, // 12.0 [1] (🛕) hindu temple - {0x1F6D6, 0x1F6DF, prExtendedPictographic}, // NA [10] (đź›–..🛟) .. - {0x1F6E0, 0x1F6EC, prExtendedPictographic}, // 7.0 [13] (🛠️..🛬) hammer and wrench..airplane arrival - {0x1F6ED, 0x1F6EF, prExtendedPictographic}, // NA [3] (đź›­..🛯) .. - {0x1F6F0, 0x1F6F3, prExtendedPictographic}, // 7.0 [4] (🛰️..🛳️) satellite..passenger ship - {0x1F6F4, 0x1F6F6, prExtendedPictographic}, // 9.0 [3] (đź›´..đź›¶) kick scooter..canoe - {0x1F6F7, 0x1F6F8, prExtendedPictographic}, // 10.0 [2] (đź›·..🛸) sled..flying saucer - {0x1F6F9, 0x1F6F9, prExtendedPictographic}, // 11.0 [1] (🛹) skateboard - {0x1F6FA, 0x1F6FA, prExtendedPictographic}, // 12.0 [1] (🛺) auto rickshaw - {0x1F6FB, 0x1F6FF, prExtendedPictographic}, // NA [5] (đź›»..🛿) .. - {0x1F774, 0x1F77F, prExtendedPictographic}, // NA [12] (đźť´..đźťż) .. - {0x1F7D5, 0x1F7D8, prExtendedPictographic}, // 11.0 [4] (đźź•..đźź) CIRCLED TRIANGLE..NEGATIVE CIRCLED SQUARE - {0x1F7D9, 0x1F7DF, prExtendedPictographic}, // NA [7] (đźź™..đźźź) .. - {0x1F7E0, 0x1F7EB, prExtendedPictographic}, // 12.0 [12] (đźź ..đźź«) orange circle..brown square - {0x1F7EC, 0x1F7FF, prExtendedPictographic}, // NA [20] (🟬..đźźż) .. - {0x1F80C, 0x1F80F, prExtendedPictographic}, // NA [4] (đź Ś..đź Ź) .. - {0x1F848, 0x1F84F, prExtendedPictographic}, // NA [8] (đźˇ..🡏) .. - {0x1F85A, 0x1F85F, prExtendedPictographic}, // NA [6] (🡚..🡟) .. - {0x1F888, 0x1F88F, prExtendedPictographic}, // NA [8] (đź˘..🢏) .. - {0x1F8AE, 0x1F8FF, prExtendedPictographic}, // NA [82] (🢮..🣿) .. - {0x1F90C, 0x1F90C, prExtendedPictographic}, // NA [1] (🤌) - {0x1F90D, 0x1F90F, prExtendedPictographic}, // 12.0 [3] (🤍..🤏) white heart..pinching hand - {0x1F910, 0x1F918, prExtendedPictographic}, // 8.0 [9] (đź¤..đź¤) zipper-mouth face..sign of the horns - {0x1F919, 0x1F91E, prExtendedPictographic}, // 9.0 [6] (🤙..🤞) call me hand..crossed fingers - {0x1F91F, 0x1F91F, prExtendedPictographic}, // 10.0 [1] (🤟) love-you gesture - {0x1F920, 0x1F927, prExtendedPictographic}, // 9.0 [8] (🤠..🤧) cowboy hat face..sneezing face - {0x1F928, 0x1F92F, prExtendedPictographic}, // 10.0 [8] (🤨..🤯) face with raised eyebrow..exploding head - {0x1F930, 0x1F930, prExtendedPictographic}, // 9.0 [1] (🤰) pregnant woman - {0x1F931, 0x1F932, prExtendedPictographic}, // 10.0 [2] (🤱..🤲) breast-feeding..palms up together - {0x1F933, 0x1F93A, prExtendedPictographic}, // 9.0 [8] (🤳..🤺) selfie..person fencing - {0x1F93C, 0x1F93E, prExtendedPictographic}, // 9.0 [3] (🤼..🤾) people wrestling..person playing handball - {0x1F93F, 0x1F93F, prExtendedPictographic}, // 12.0 [1] (🤿) diving mask - {0x1F940, 0x1F945, prExtendedPictographic}, // 9.0 [6] (🥀..🥅) wilted flower..goal net - {0x1F947, 0x1F94B, prExtendedPictographic}, // 9.0 [5] (🥇..🥋) 1st place medal..martial arts uniform - {0x1F94C, 0x1F94C, prExtendedPictographic}, // 10.0 [1] (🥌) curling stone - {0x1F94D, 0x1F94F, prExtendedPictographic}, // 11.0 [3] (🥍..🥏) lacrosse..flying disc - {0x1F950, 0x1F95E, prExtendedPictographic}, // 9.0 [15] (đźĄ..🥞) croissant..pancakes - {0x1F95F, 0x1F96B, prExtendedPictographic}, // 10.0 [13] (🥟..🥫) dumpling..canned food - {0x1F96C, 0x1F970, prExtendedPictographic}, // 11.0 [5] (🥬..🥰) leafy green..smiling face with hearts - {0x1F971, 0x1F971, prExtendedPictographic}, // 12.0 [1] (🥱) yawning face - {0x1F972, 0x1F972, prExtendedPictographic}, // NA [1] (🥲) - {0x1F973, 0x1F976, prExtendedPictographic}, // 11.0 [4] (🥳..🥶) partying face..cold face - {0x1F977, 0x1F979, prExtendedPictographic}, // NA [3] (🥷..🥹) .. - {0x1F97A, 0x1F97A, prExtendedPictographic}, // 11.0 [1] (🥺) pleading face - {0x1F97B, 0x1F97B, prExtendedPictographic}, // 12.0 [1] (🥻) sari - {0x1F97C, 0x1F97F, prExtendedPictographic}, // 11.0 [4] (🥼..🥿) lab coat..flat shoe - {0x1F980, 0x1F984, prExtendedPictographic}, // 8.0 [5] (🦀..🦄) crab..unicorn - {0x1F985, 0x1F991, prExtendedPictographic}, // 9.0 [13] (🦅..🦑) eagle..squid - {0x1F992, 0x1F997, prExtendedPictographic}, // 10.0 [6] (🦒..🦗) giraffe..cricket - {0x1F998, 0x1F9A2, prExtendedPictographic}, // 11.0 [11] (đź¦..🦢) kangaroo..swan - {0x1F9A3, 0x1F9A4, prExtendedPictographic}, // NA [2] (🦣..🦤) .. - {0x1F9A5, 0x1F9AA, prExtendedPictographic}, // 12.0 [6] (🦥..🦪) sloth..oyster - {0x1F9AB, 0x1F9AD, prExtendedPictographic}, // NA [3] (🦫..🦭) .. - {0x1F9AE, 0x1F9AF, prExtendedPictographic}, // 12.0 [2] (🦮..🦯) guide dog..probing cane - {0x1F9B0, 0x1F9B9, prExtendedPictographic}, // 11.0 [10] (🦰..🦹) red hair..supervillain - {0x1F9BA, 0x1F9BF, prExtendedPictographic}, // 12.0 [6] (🦺..🦿) safety vest..mechanical leg - {0x1F9C0, 0x1F9C0, prExtendedPictographic}, // 8.0 [1] (đź§€) cheese wedge - {0x1F9C1, 0x1F9C2, prExtendedPictographic}, // 11.0 [2] (đź§..đź§‚) cupcake..salt - {0x1F9C3, 0x1F9CA, prExtendedPictographic}, // 12.0 [8] (đź§..đź§Š) beverage box..ice cube - {0x1F9CB, 0x1F9CC, prExtendedPictographic}, // NA [2] (đź§‹..đź§Ś) .. - {0x1F9CD, 0x1F9CF, prExtendedPictographic}, // 12.0 [3] (đź§Ť..đź§Ź) person standing..deaf person - {0x1F9D0, 0x1F9E6, prExtendedPictographic}, // 10.0 [23] (đź§..🧦) face with monocle..socks - {0x1F9E7, 0x1F9FF, prExtendedPictographic}, // 11.0 [25] (đź§§..đź§ż) red envelope..nazar amulet - {0x1FA00, 0x1FA53, prExtendedPictographic}, // 12.0 [84] (🨀..đź©“) NEUTRAL CHESS KING..BLACK CHESS KNIGHT-BISHOP - {0x1FA54, 0x1FA5F, prExtendedPictographic}, // NA [12] (đź©”..🩟) .. - {0x1FA60, 0x1FA6D, prExtendedPictographic}, // 11.0 [14] (đź© ..đź©­) XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER - {0x1FA6E, 0x1FA6F, prExtendedPictographic}, // NA [2] (đź©®..🩯) .. - {0x1FA70, 0x1FA73, prExtendedPictographic}, // 12.0 [4] (đź©°..🩳) ballet shoes..shorts - {0x1FA74, 0x1FA77, prExtendedPictographic}, // NA [4] (đź©´..đź©·) .. - {0x1FA78, 0x1FA7A, prExtendedPictographic}, // 12.0 [3] (🩸..🩺) drop of blood..stethoscope - {0x1FA7B, 0x1FA7F, prExtendedPictographic}, // NA [5] (đź©»..🩿) .. - {0x1FA80, 0x1FA82, prExtendedPictographic}, // 12.0 [3] (🪀..🪂) yo-yo..parachute - {0x1FA83, 0x1FA8F, prExtendedPictographic}, // NA [13] (đźŞ..🪏) .. - {0x1FA90, 0x1FA95, prExtendedPictographic}, // 12.0 [6] (đźŞ..🪕) ringed planet..banjo - {0x1FA96, 0x1FFFD, prExtendedPictographic}, // NA[1384] (🪖..đźż˝) .. - {0xE0000, 0xE0000, prControl}, // Cn - {0xE0001, 0xE0001, prControl}, // Cf LANGUAGE TAG - {0xE0002, 0xE001F, prControl}, // Cn [30] .. - {0xE0020, 0xE007F, prExtend}, // Cf [96] TAG SPACE..CANCEL TAG - {0xE0080, 0xE00FF, prControl}, // Cn [128] .. - {0xE0100, 0xE01EF, prExtend}, // Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 - {0xE01F0, 0xE0FFF, prControl}, // Cn [3600] .. -} +// Unicode General Categories. Only the ones needed in the context of this +// package are included. +const ( + gcNone = iota // gcNone must be 0. + gcCc + gcZs + gcPo + gcSc + gcPs + gcPe + gcSm + gcPd + gcNd + gcLu + gcSk + gcPc + gcLl + gcSo + gcLo + gcPi + gcCf + gcNo + gcPf + gcLC + gcLm + gcMn + gcMe + gcMc + gcNl + gcZl + gcZp + gcCn + gcCs + gcCo +) -// property returns the Unicode property value (see constants above) of the -// given code point. -func property(r rune) int { +// propertySearch performs a binary search on a property slice and returns the +// entry whose range (start = first array element, end = second array element) +// includes r, or an array of 0's if no such entry was found. +func propertySearch[E interface{ [3]int | [4]int }](dictionary []E, r rune) (result E) { // Run a binary search. from := 0 - to := len(codePoints) + to := len(dictionary) for to > from { middle := (from + to) / 2 - cpRange := codePoints[middle] + cpRange := dictionary[middle] if int(r) < cpRange[0] { to = middle continue @@ -1652,7 +142,20 @@ func property(r rune) int { from = middle + 1 continue } - return cpRange[2] + return cpRange } - return prAny + return +} + +// property returns the Unicode property value (see constants above) of the +// given code point. +func property(dictionary [][3]int, r rune) int { + return propertySearch(dictionary, r)[2] +} + +// propertyWithGenCat returns the Unicode property value and General Category +// (see constants above) of the given code point. +func propertyWithGenCat(dictionary [][4]int, r rune) (property, generalCategory int) { + entry := propertySearch(dictionary, r) + return entry[2], entry[3] } diff --git a/vendor/github.com/rivo/uniseg/sentence.go b/vendor/github.com/rivo/uniseg/sentence.go new file mode 100644 index 000000000..b7fc70996 --- /dev/null +++ b/vendor/github.com/rivo/uniseg/sentence.go @@ -0,0 +1,88 @@ +package uniseg + +import "unicode/utf8" + +// FirstSentence returns the first sentence found in the given byte slice +// according to the rules of Unicode Standard Annex #29, Sentence Boundaries. +// This function can be called continuously to extract all sentences from a byte +// slice, as illustrated in the example below. +// +// If you don't know the current state, for example when calling the function +// for the first time, you must pass -1. For consecutive calls, pass the state +// and rest slice returned by the previous call. +// +// The "rest" slice is the sub-slice of the original byte slice "b" starting +// after the last byte of the identified sentence. If the length of the "rest" +// slice is 0, the entire byte slice "b" has been processed. The "sentence" byte +// slice is the sub-slice of the input slice containing the identified sentence. +// +// Given an empty byte slice "b", the function returns nil values. +func FirstSentence(b []byte, state int) (sentence, rest []byte, newState int) { + // An empty byte slice returns nothing. + if len(b) == 0 { + return + } + + // Extract the first rune. + r, length := utf8.DecodeRune(b) + if len(b) <= length { // If we're already past the end, there is nothing else to parse. + return b, nil, sbAny + } + + // If we don't know the state, determine it now. + if state < 0 { + state, _ = transitionSentenceBreakState(state, r, b[length:], "") + } + + // Transition until we find a boundary. + var boundary bool + for { + r, l := utf8.DecodeRune(b[length:]) + state, boundary = transitionSentenceBreakState(state, r, b[length+l:], "") + + if boundary { + return b[:length], b[length:], state + } + + length += l + if len(b) <= length { + return b, nil, sbAny + } + } +} + +// FirstSentenceInString is like [FirstSentence] but its input and outputs are +// strings. +func FirstSentenceInString(str string, state int) (sentence, rest string, newState int) { + // An empty byte slice returns nothing. + if len(str) == 0 { + return + } + + // Extract the first rune. + r, length := utf8.DecodeRuneInString(str) + if len(str) <= length { // If we're already past the end, there is nothing else to parse. + return str, "", sbAny + } + + // If we don't know the state, determine it now. + if state < 0 { + state, _ = transitionSentenceBreakState(state, r, nil, str[length:]) + } + + // Transition until we find a boundary. + var boundary bool + for { + r, l := utf8.DecodeRuneInString(str[length:]) + state, boundary = transitionSentenceBreakState(state, r, nil, str[length+l:]) + + if boundary { + return str[:length], str[length:], state + } + + length += l + if len(str) <= length { + return str, "", sbAny + } + } +} diff --git a/vendor/github.com/rivo/uniseg/sentenceproperties.go b/vendor/github.com/rivo/uniseg/sentenceproperties.go new file mode 100644 index 000000000..e6fe7254c --- /dev/null +++ b/vendor/github.com/rivo/uniseg/sentenceproperties.go @@ -0,0 +1,2812 @@ +package uniseg + +// Code generated via go generate from gen_properties.go. DO NOT EDIT. + +// sentenceBreakCodePoints are taken from +// https://www.unicode.org/Public/14.0.0/ucd/auxiliary/SentenceBreakProperty.txt +// on July 25, 2022. See https://www.unicode.org/license.html for the Unicode +// license agreement. +var sentenceBreakCodePoints = [][3]int{ + {0x0009, 0x0009, prSp}, // Cc + {0x000A, 0x000A, prLF}, // Cc + {0x000B, 0x000C, prSp}, // Cc [2] .. + {0x000D, 0x000D, prCR}, // Cc + {0x0020, 0x0020, prSp}, // Zs SPACE + {0x0021, 0x0021, prSTerm}, // Po EXCLAMATION MARK + {0x0022, 0x0022, prClose}, // Po QUOTATION MARK + {0x0027, 0x0027, prClose}, // Po APOSTROPHE + {0x0028, 0x0028, prClose}, // Ps LEFT PARENTHESIS + {0x0029, 0x0029, prClose}, // Pe RIGHT PARENTHESIS + {0x002C, 0x002C, prSContinue}, // Po COMMA + {0x002D, 0x002D, prSContinue}, // Pd HYPHEN-MINUS + {0x002E, 0x002E, prATerm}, // Po FULL STOP + {0x0030, 0x0039, prNumeric}, // Nd [10] DIGIT ZERO..DIGIT NINE + {0x003A, 0x003A, prSContinue}, // Po COLON + {0x003F, 0x003F, prSTerm}, // Po QUESTION MARK + {0x0041, 0x005A, prUpper}, // L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z + {0x005B, 0x005B, prClose}, // Ps LEFT SQUARE BRACKET + {0x005D, 0x005D, prClose}, // Pe RIGHT SQUARE BRACKET + {0x0061, 0x007A, prLower}, // L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z + {0x007B, 0x007B, prClose}, // Ps LEFT CURLY BRACKET + {0x007D, 0x007D, prClose}, // Pe RIGHT CURLY BRACKET + {0x0085, 0x0085, prSep}, // Cc + {0x00A0, 0x00A0, prSp}, // Zs NO-BREAK SPACE + {0x00AA, 0x00AA, prLower}, // Lo FEMININE ORDINAL INDICATOR + {0x00AB, 0x00AB, prClose}, // Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + {0x00AD, 0x00AD, prFormat}, // Cf SOFT HYPHEN + {0x00B5, 0x00B5, prLower}, // L& MICRO SIGN + {0x00BA, 0x00BA, prLower}, // Lo MASCULINE ORDINAL INDICATOR + {0x00BB, 0x00BB, prClose}, // Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + {0x00C0, 0x00D6, prUpper}, // L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS + {0x00D8, 0x00DE, prUpper}, // L& [7] LATIN CAPITAL LETTER O WITH STROKE..LATIN CAPITAL LETTER THORN + {0x00DF, 0x00F6, prLower}, // L& [24] LATIN SMALL LETTER SHARP S..LATIN SMALL LETTER O WITH DIAERESIS + {0x00F8, 0x00FF, prLower}, // L& [8] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER Y WITH DIAERESIS + {0x0100, 0x0100, prUpper}, // L& LATIN CAPITAL LETTER A WITH MACRON + {0x0101, 0x0101, prLower}, // L& LATIN SMALL LETTER A WITH MACRON + {0x0102, 0x0102, prUpper}, // L& LATIN CAPITAL LETTER A WITH BREVE + {0x0103, 0x0103, prLower}, // L& LATIN SMALL LETTER A WITH BREVE + {0x0104, 0x0104, prUpper}, // L& LATIN CAPITAL LETTER A WITH OGONEK + {0x0105, 0x0105, prLower}, // L& LATIN SMALL LETTER A WITH OGONEK + {0x0106, 0x0106, prUpper}, // L& LATIN CAPITAL LETTER C WITH ACUTE + {0x0107, 0x0107, prLower}, // L& LATIN SMALL LETTER C WITH ACUTE + {0x0108, 0x0108, prUpper}, // L& LATIN CAPITAL LETTER C WITH CIRCUMFLEX + {0x0109, 0x0109, prLower}, // L& LATIN SMALL LETTER C WITH CIRCUMFLEX + {0x010A, 0x010A, prUpper}, // L& LATIN CAPITAL LETTER C WITH DOT ABOVE + {0x010B, 0x010B, prLower}, // L& LATIN SMALL LETTER C WITH DOT ABOVE + {0x010C, 0x010C, prUpper}, // L& LATIN CAPITAL LETTER C WITH CARON + {0x010D, 0x010D, prLower}, // L& LATIN SMALL LETTER C WITH CARON + {0x010E, 0x010E, prUpper}, // L& LATIN CAPITAL LETTER D WITH CARON + {0x010F, 0x010F, prLower}, // L& LATIN SMALL LETTER D WITH CARON + {0x0110, 0x0110, prUpper}, // L& LATIN CAPITAL LETTER D WITH STROKE + {0x0111, 0x0111, prLower}, // L& LATIN SMALL LETTER D WITH STROKE + {0x0112, 0x0112, prUpper}, // L& LATIN CAPITAL LETTER E WITH MACRON + {0x0113, 0x0113, prLower}, // L& LATIN SMALL LETTER E WITH MACRON + {0x0114, 0x0114, prUpper}, // L& LATIN CAPITAL LETTER E WITH BREVE + {0x0115, 0x0115, prLower}, // L& LATIN SMALL LETTER E WITH BREVE + {0x0116, 0x0116, prUpper}, // L& LATIN CAPITAL LETTER E WITH DOT ABOVE + {0x0117, 0x0117, prLower}, // L& LATIN SMALL LETTER E WITH DOT ABOVE + {0x0118, 0x0118, prUpper}, // L& LATIN CAPITAL LETTER E WITH OGONEK + {0x0119, 0x0119, prLower}, // L& LATIN SMALL LETTER E WITH OGONEK + {0x011A, 0x011A, prUpper}, // L& LATIN CAPITAL LETTER E WITH CARON + {0x011B, 0x011B, prLower}, // L& LATIN SMALL LETTER E WITH CARON + {0x011C, 0x011C, prUpper}, // L& LATIN CAPITAL LETTER G WITH CIRCUMFLEX + {0x011D, 0x011D, prLower}, // L& LATIN SMALL LETTER G WITH CIRCUMFLEX + {0x011E, 0x011E, prUpper}, // L& LATIN CAPITAL LETTER G WITH BREVE + {0x011F, 0x011F, prLower}, // L& LATIN SMALL LETTER G WITH BREVE + {0x0120, 0x0120, prUpper}, // L& LATIN CAPITAL LETTER G WITH DOT ABOVE + {0x0121, 0x0121, prLower}, // L& LATIN SMALL LETTER G WITH DOT ABOVE + {0x0122, 0x0122, prUpper}, // L& LATIN CAPITAL LETTER G WITH CEDILLA + {0x0123, 0x0123, prLower}, // L& LATIN SMALL LETTER G WITH CEDILLA + {0x0124, 0x0124, prUpper}, // L& LATIN CAPITAL LETTER H WITH CIRCUMFLEX + {0x0125, 0x0125, prLower}, // L& LATIN SMALL LETTER H WITH CIRCUMFLEX + {0x0126, 0x0126, prUpper}, // L& LATIN CAPITAL LETTER H WITH STROKE + {0x0127, 0x0127, prLower}, // L& LATIN SMALL LETTER H WITH STROKE + {0x0128, 0x0128, prUpper}, // L& LATIN CAPITAL LETTER I WITH TILDE + {0x0129, 0x0129, prLower}, // L& LATIN SMALL LETTER I WITH TILDE + {0x012A, 0x012A, prUpper}, // L& LATIN CAPITAL LETTER I WITH MACRON + {0x012B, 0x012B, prLower}, // L& LATIN SMALL LETTER I WITH MACRON + {0x012C, 0x012C, prUpper}, // L& LATIN CAPITAL LETTER I WITH BREVE + {0x012D, 0x012D, prLower}, // L& LATIN SMALL LETTER I WITH BREVE + {0x012E, 0x012E, prUpper}, // L& LATIN CAPITAL LETTER I WITH OGONEK + {0x012F, 0x012F, prLower}, // L& LATIN SMALL LETTER I WITH OGONEK + {0x0130, 0x0130, prUpper}, // L& LATIN CAPITAL LETTER I WITH DOT ABOVE + {0x0131, 0x0131, prLower}, // L& LATIN SMALL LETTER DOTLESS I + {0x0132, 0x0132, prUpper}, // L& LATIN CAPITAL LIGATURE IJ + {0x0133, 0x0133, prLower}, // L& LATIN SMALL LIGATURE IJ + {0x0134, 0x0134, prUpper}, // L& LATIN CAPITAL LETTER J WITH CIRCUMFLEX + {0x0135, 0x0135, prLower}, // L& LATIN SMALL LETTER J WITH CIRCUMFLEX + {0x0136, 0x0136, prUpper}, // L& LATIN CAPITAL LETTER K WITH CEDILLA + {0x0137, 0x0138, prLower}, // L& [2] LATIN SMALL LETTER K WITH CEDILLA..LATIN SMALL LETTER KRA + {0x0139, 0x0139, prUpper}, // L& LATIN CAPITAL LETTER L WITH ACUTE + {0x013A, 0x013A, prLower}, // L& LATIN SMALL LETTER L WITH ACUTE + {0x013B, 0x013B, prUpper}, // L& LATIN CAPITAL LETTER L WITH CEDILLA + {0x013C, 0x013C, prLower}, // L& LATIN SMALL LETTER L WITH CEDILLA + {0x013D, 0x013D, prUpper}, // L& LATIN CAPITAL LETTER L WITH CARON + {0x013E, 0x013E, prLower}, // L& LATIN SMALL LETTER L WITH CARON + {0x013F, 0x013F, prUpper}, // L& LATIN CAPITAL LETTER L WITH MIDDLE DOT + {0x0140, 0x0140, prLower}, // L& LATIN SMALL LETTER L WITH MIDDLE DOT + {0x0141, 0x0141, prUpper}, // L& LATIN CAPITAL LETTER L WITH STROKE + {0x0142, 0x0142, prLower}, // L& LATIN SMALL LETTER L WITH STROKE + {0x0143, 0x0143, prUpper}, // L& LATIN CAPITAL LETTER N WITH ACUTE + {0x0144, 0x0144, prLower}, // L& LATIN SMALL LETTER N WITH ACUTE + {0x0145, 0x0145, prUpper}, // L& LATIN CAPITAL LETTER N WITH CEDILLA + {0x0146, 0x0146, prLower}, // L& LATIN SMALL LETTER N WITH CEDILLA + {0x0147, 0x0147, prUpper}, // L& LATIN CAPITAL LETTER N WITH CARON + {0x0148, 0x0149, prLower}, // L& [2] LATIN SMALL LETTER N WITH CARON..LATIN SMALL LETTER N PRECEDED BY APOSTROPHE + {0x014A, 0x014A, prUpper}, // L& LATIN CAPITAL LETTER ENG + {0x014B, 0x014B, prLower}, // L& LATIN SMALL LETTER ENG + {0x014C, 0x014C, prUpper}, // L& LATIN CAPITAL LETTER O WITH MACRON + {0x014D, 0x014D, prLower}, // L& LATIN SMALL LETTER O WITH MACRON + {0x014E, 0x014E, prUpper}, // L& LATIN CAPITAL LETTER O WITH BREVE + {0x014F, 0x014F, prLower}, // L& LATIN SMALL LETTER O WITH BREVE + {0x0150, 0x0150, prUpper}, // L& LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + {0x0151, 0x0151, prLower}, // L& LATIN SMALL LETTER O WITH DOUBLE ACUTE + {0x0152, 0x0152, prUpper}, // L& LATIN CAPITAL LIGATURE OE + {0x0153, 0x0153, prLower}, // L& LATIN SMALL LIGATURE OE + {0x0154, 0x0154, prUpper}, // L& LATIN CAPITAL LETTER R WITH ACUTE + {0x0155, 0x0155, prLower}, // L& LATIN SMALL LETTER R WITH ACUTE + {0x0156, 0x0156, prUpper}, // L& LATIN CAPITAL LETTER R WITH CEDILLA + {0x0157, 0x0157, prLower}, // L& LATIN SMALL LETTER R WITH CEDILLA + {0x0158, 0x0158, prUpper}, // L& LATIN CAPITAL LETTER R WITH CARON + {0x0159, 0x0159, prLower}, // L& LATIN SMALL LETTER R WITH CARON + {0x015A, 0x015A, prUpper}, // L& LATIN CAPITAL LETTER S WITH ACUTE + {0x015B, 0x015B, prLower}, // L& LATIN SMALL LETTER S WITH ACUTE + {0x015C, 0x015C, prUpper}, // L& LATIN CAPITAL LETTER S WITH CIRCUMFLEX + {0x015D, 0x015D, prLower}, // L& LATIN SMALL LETTER S WITH CIRCUMFLEX + {0x015E, 0x015E, prUpper}, // L& LATIN CAPITAL LETTER S WITH CEDILLA + {0x015F, 0x015F, prLower}, // L& LATIN SMALL LETTER S WITH CEDILLA + {0x0160, 0x0160, prUpper}, // L& LATIN CAPITAL LETTER S WITH CARON + {0x0161, 0x0161, prLower}, // L& LATIN SMALL LETTER S WITH CARON + {0x0162, 0x0162, prUpper}, // L& LATIN CAPITAL LETTER T WITH CEDILLA + {0x0163, 0x0163, prLower}, // L& LATIN SMALL LETTER T WITH CEDILLA + {0x0164, 0x0164, prUpper}, // L& LATIN CAPITAL LETTER T WITH CARON + {0x0165, 0x0165, prLower}, // L& LATIN SMALL LETTER T WITH CARON + {0x0166, 0x0166, prUpper}, // L& LATIN CAPITAL LETTER T WITH STROKE + {0x0167, 0x0167, prLower}, // L& LATIN SMALL LETTER T WITH STROKE + {0x0168, 0x0168, prUpper}, // L& LATIN CAPITAL LETTER U WITH TILDE + {0x0169, 0x0169, prLower}, // L& LATIN SMALL LETTER U WITH TILDE + {0x016A, 0x016A, prUpper}, // L& LATIN CAPITAL LETTER U WITH MACRON + {0x016B, 0x016B, prLower}, // L& LATIN SMALL LETTER U WITH MACRON + {0x016C, 0x016C, prUpper}, // L& LATIN CAPITAL LETTER U WITH BREVE + {0x016D, 0x016D, prLower}, // L& LATIN SMALL LETTER U WITH BREVE + {0x016E, 0x016E, prUpper}, // L& LATIN CAPITAL LETTER U WITH RING ABOVE + {0x016F, 0x016F, prLower}, // L& LATIN SMALL LETTER U WITH RING ABOVE + {0x0170, 0x0170, prUpper}, // L& LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + {0x0171, 0x0171, prLower}, // L& LATIN SMALL LETTER U WITH DOUBLE ACUTE + {0x0172, 0x0172, prUpper}, // L& LATIN CAPITAL LETTER U WITH OGONEK + {0x0173, 0x0173, prLower}, // L& LATIN SMALL LETTER U WITH OGONEK + {0x0174, 0x0174, prUpper}, // L& LATIN CAPITAL LETTER W WITH CIRCUMFLEX + {0x0175, 0x0175, prLower}, // L& LATIN SMALL LETTER W WITH CIRCUMFLEX + {0x0176, 0x0176, prUpper}, // L& LATIN CAPITAL LETTER Y WITH CIRCUMFLEX + {0x0177, 0x0177, prLower}, // L& LATIN SMALL LETTER Y WITH CIRCUMFLEX + {0x0178, 0x0179, prUpper}, // L& [2] LATIN CAPITAL LETTER Y WITH DIAERESIS..LATIN CAPITAL LETTER Z WITH ACUTE + {0x017A, 0x017A, prLower}, // L& LATIN SMALL LETTER Z WITH ACUTE + {0x017B, 0x017B, prUpper}, // L& LATIN CAPITAL LETTER Z WITH DOT ABOVE + {0x017C, 0x017C, prLower}, // L& LATIN SMALL LETTER Z WITH DOT ABOVE + {0x017D, 0x017D, prUpper}, // L& LATIN CAPITAL LETTER Z WITH CARON + {0x017E, 0x0180, prLower}, // L& [3] LATIN SMALL LETTER Z WITH CARON..LATIN SMALL LETTER B WITH STROKE + {0x0181, 0x0182, prUpper}, // L& [2] LATIN CAPITAL LETTER B WITH HOOK..LATIN CAPITAL LETTER B WITH TOPBAR + {0x0183, 0x0183, prLower}, // L& LATIN SMALL LETTER B WITH TOPBAR + {0x0184, 0x0184, prUpper}, // L& LATIN CAPITAL LETTER TONE SIX + {0x0185, 0x0185, prLower}, // L& LATIN SMALL LETTER TONE SIX + {0x0186, 0x0187, prUpper}, // L& [2] LATIN CAPITAL LETTER OPEN O..LATIN CAPITAL LETTER C WITH HOOK + {0x0188, 0x0188, prLower}, // L& LATIN SMALL LETTER C WITH HOOK + {0x0189, 0x018B, prUpper}, // L& [3] LATIN CAPITAL LETTER AFRICAN D..LATIN CAPITAL LETTER D WITH TOPBAR + {0x018C, 0x018D, prLower}, // L& [2] LATIN SMALL LETTER D WITH TOPBAR..LATIN SMALL LETTER TURNED DELTA + {0x018E, 0x0191, prUpper}, // L& [4] LATIN CAPITAL LETTER REVERSED E..LATIN CAPITAL LETTER F WITH HOOK + {0x0192, 0x0192, prLower}, // L& LATIN SMALL LETTER F WITH HOOK + {0x0193, 0x0194, prUpper}, // L& [2] LATIN CAPITAL LETTER G WITH HOOK..LATIN CAPITAL LETTER GAMMA + {0x0195, 0x0195, prLower}, // L& LATIN SMALL LETTER HV + {0x0196, 0x0198, prUpper}, // L& [3] LATIN CAPITAL LETTER IOTA..LATIN CAPITAL LETTER K WITH HOOK + {0x0199, 0x019B, prLower}, // L& [3] LATIN SMALL LETTER K WITH HOOK..LATIN SMALL LETTER LAMBDA WITH STROKE + {0x019C, 0x019D, prUpper}, // L& [2] LATIN CAPITAL LETTER TURNED M..LATIN CAPITAL LETTER N WITH LEFT HOOK + {0x019E, 0x019E, prLower}, // L& LATIN SMALL LETTER N WITH LONG RIGHT LEG + {0x019F, 0x01A0, prUpper}, // L& [2] LATIN CAPITAL LETTER O WITH MIDDLE TILDE..LATIN CAPITAL LETTER O WITH HORN + {0x01A1, 0x01A1, prLower}, // L& LATIN SMALL LETTER O WITH HORN + {0x01A2, 0x01A2, prUpper}, // L& LATIN CAPITAL LETTER OI + {0x01A3, 0x01A3, prLower}, // L& LATIN SMALL LETTER OI + {0x01A4, 0x01A4, prUpper}, // L& LATIN CAPITAL LETTER P WITH HOOK + {0x01A5, 0x01A5, prLower}, // L& LATIN SMALL LETTER P WITH HOOK + {0x01A6, 0x01A7, prUpper}, // L& [2] LATIN LETTER YR..LATIN CAPITAL LETTER TONE TWO + {0x01A8, 0x01A8, prLower}, // L& LATIN SMALL LETTER TONE TWO + {0x01A9, 0x01A9, prUpper}, // L& LATIN CAPITAL LETTER ESH + {0x01AA, 0x01AB, prLower}, // L& [2] LATIN LETTER REVERSED ESH LOOP..LATIN SMALL LETTER T WITH PALATAL HOOK + {0x01AC, 0x01AC, prUpper}, // L& LATIN CAPITAL LETTER T WITH HOOK + {0x01AD, 0x01AD, prLower}, // L& LATIN SMALL LETTER T WITH HOOK + {0x01AE, 0x01AF, prUpper}, // L& [2] LATIN CAPITAL LETTER T WITH RETROFLEX HOOK..LATIN CAPITAL LETTER U WITH HORN + {0x01B0, 0x01B0, prLower}, // L& LATIN SMALL LETTER U WITH HORN + {0x01B1, 0x01B3, prUpper}, // L& [3] LATIN CAPITAL LETTER UPSILON..LATIN CAPITAL LETTER Y WITH HOOK + {0x01B4, 0x01B4, prLower}, // L& LATIN SMALL LETTER Y WITH HOOK + {0x01B5, 0x01B5, prUpper}, // L& LATIN CAPITAL LETTER Z WITH STROKE + {0x01B6, 0x01B6, prLower}, // L& LATIN SMALL LETTER Z WITH STROKE + {0x01B7, 0x01B8, prUpper}, // L& [2] LATIN CAPITAL LETTER EZH..LATIN CAPITAL LETTER EZH REVERSED + {0x01B9, 0x01BA, prLower}, // L& [2] LATIN SMALL LETTER EZH REVERSED..LATIN SMALL LETTER EZH WITH TAIL + {0x01BB, 0x01BB, prOLetter}, // Lo LATIN LETTER TWO WITH STROKE + {0x01BC, 0x01BC, prUpper}, // L& LATIN CAPITAL LETTER TONE FIVE + {0x01BD, 0x01BF, prLower}, // L& [3] LATIN SMALL LETTER TONE FIVE..LATIN LETTER WYNN + {0x01C0, 0x01C3, prOLetter}, // Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK + {0x01C4, 0x01C5, prUpper}, // L& [2] LATIN CAPITAL LETTER DZ WITH CARON..LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON + {0x01C6, 0x01C6, prLower}, // L& LATIN SMALL LETTER DZ WITH CARON + {0x01C7, 0x01C8, prUpper}, // L& [2] LATIN CAPITAL LETTER LJ..LATIN CAPITAL LETTER L WITH SMALL LETTER J + {0x01C9, 0x01C9, prLower}, // L& LATIN SMALL LETTER LJ + {0x01CA, 0x01CB, prUpper}, // L& [2] LATIN CAPITAL LETTER NJ..LATIN CAPITAL LETTER N WITH SMALL LETTER J + {0x01CC, 0x01CC, prLower}, // L& LATIN SMALL LETTER NJ + {0x01CD, 0x01CD, prUpper}, // L& LATIN CAPITAL LETTER A WITH CARON + {0x01CE, 0x01CE, prLower}, // L& LATIN SMALL LETTER A WITH CARON + {0x01CF, 0x01CF, prUpper}, // L& LATIN CAPITAL LETTER I WITH CARON + {0x01D0, 0x01D0, prLower}, // L& LATIN SMALL LETTER I WITH CARON + {0x01D1, 0x01D1, prUpper}, // L& LATIN CAPITAL LETTER O WITH CARON + {0x01D2, 0x01D2, prLower}, // L& LATIN SMALL LETTER O WITH CARON + {0x01D3, 0x01D3, prUpper}, // L& LATIN CAPITAL LETTER U WITH CARON + {0x01D4, 0x01D4, prLower}, // L& LATIN SMALL LETTER U WITH CARON + {0x01D5, 0x01D5, prUpper}, // L& LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON + {0x01D6, 0x01D6, prLower}, // L& LATIN SMALL LETTER U WITH DIAERESIS AND MACRON + {0x01D7, 0x01D7, prUpper}, // L& LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE + {0x01D8, 0x01D8, prLower}, // L& LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE + {0x01D9, 0x01D9, prUpper}, // L& LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON + {0x01DA, 0x01DA, prLower}, // L& LATIN SMALL LETTER U WITH DIAERESIS AND CARON + {0x01DB, 0x01DB, prUpper}, // L& LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE + {0x01DC, 0x01DD, prLower}, // L& [2] LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE..LATIN SMALL LETTER TURNED E + {0x01DE, 0x01DE, prUpper}, // L& LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON + {0x01DF, 0x01DF, prLower}, // L& LATIN SMALL LETTER A WITH DIAERESIS AND MACRON + {0x01E0, 0x01E0, prUpper}, // L& LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON + {0x01E1, 0x01E1, prLower}, // L& LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON + {0x01E2, 0x01E2, prUpper}, // L& LATIN CAPITAL LETTER AE WITH MACRON + {0x01E3, 0x01E3, prLower}, // L& LATIN SMALL LETTER AE WITH MACRON + {0x01E4, 0x01E4, prUpper}, // L& LATIN CAPITAL LETTER G WITH STROKE + {0x01E5, 0x01E5, prLower}, // L& LATIN SMALL LETTER G WITH STROKE + {0x01E6, 0x01E6, prUpper}, // L& LATIN CAPITAL LETTER G WITH CARON + {0x01E7, 0x01E7, prLower}, // L& LATIN SMALL LETTER G WITH CARON + {0x01E8, 0x01E8, prUpper}, // L& LATIN CAPITAL LETTER K WITH CARON + {0x01E9, 0x01E9, prLower}, // L& LATIN SMALL LETTER K WITH CARON + {0x01EA, 0x01EA, prUpper}, // L& LATIN CAPITAL LETTER O WITH OGONEK + {0x01EB, 0x01EB, prLower}, // L& LATIN SMALL LETTER O WITH OGONEK + {0x01EC, 0x01EC, prUpper}, // L& LATIN CAPITAL LETTER O WITH OGONEK AND MACRON + {0x01ED, 0x01ED, prLower}, // L& LATIN SMALL LETTER O WITH OGONEK AND MACRON + {0x01EE, 0x01EE, prUpper}, // L& LATIN CAPITAL LETTER EZH WITH CARON + {0x01EF, 0x01F0, prLower}, // L& [2] LATIN SMALL LETTER EZH WITH CARON..LATIN SMALL LETTER J WITH CARON + {0x01F1, 0x01F2, prUpper}, // L& [2] LATIN CAPITAL LETTER DZ..LATIN CAPITAL LETTER D WITH SMALL LETTER Z + {0x01F3, 0x01F3, prLower}, // L& LATIN SMALL LETTER DZ + {0x01F4, 0x01F4, prUpper}, // L& LATIN CAPITAL LETTER G WITH ACUTE + {0x01F5, 0x01F5, prLower}, // L& LATIN SMALL LETTER G WITH ACUTE + {0x01F6, 0x01F8, prUpper}, // L& [3] LATIN CAPITAL LETTER HWAIR..LATIN CAPITAL LETTER N WITH GRAVE + {0x01F9, 0x01F9, prLower}, // L& LATIN SMALL LETTER N WITH GRAVE + {0x01FA, 0x01FA, prUpper}, // L& LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE + {0x01FB, 0x01FB, prLower}, // L& LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE + {0x01FC, 0x01FC, prUpper}, // L& LATIN CAPITAL LETTER AE WITH ACUTE + {0x01FD, 0x01FD, prLower}, // L& LATIN SMALL LETTER AE WITH ACUTE + {0x01FE, 0x01FE, prUpper}, // L& LATIN CAPITAL LETTER O WITH STROKE AND ACUTE + {0x01FF, 0x01FF, prLower}, // L& LATIN SMALL LETTER O WITH STROKE AND ACUTE + {0x0200, 0x0200, prUpper}, // L& LATIN CAPITAL LETTER A WITH DOUBLE GRAVE + {0x0201, 0x0201, prLower}, // L& LATIN SMALL LETTER A WITH DOUBLE GRAVE + {0x0202, 0x0202, prUpper}, // L& LATIN CAPITAL LETTER A WITH INVERTED BREVE + {0x0203, 0x0203, prLower}, // L& LATIN SMALL LETTER A WITH INVERTED BREVE + {0x0204, 0x0204, prUpper}, // L& LATIN CAPITAL LETTER E WITH DOUBLE GRAVE + {0x0205, 0x0205, prLower}, // L& LATIN SMALL LETTER E WITH DOUBLE GRAVE + {0x0206, 0x0206, prUpper}, // L& LATIN CAPITAL LETTER E WITH INVERTED BREVE + {0x0207, 0x0207, prLower}, // L& LATIN SMALL LETTER E WITH INVERTED BREVE + {0x0208, 0x0208, prUpper}, // L& LATIN CAPITAL LETTER I WITH DOUBLE GRAVE + {0x0209, 0x0209, prLower}, // L& LATIN SMALL LETTER I WITH DOUBLE GRAVE + {0x020A, 0x020A, prUpper}, // L& LATIN CAPITAL LETTER I WITH INVERTED BREVE + {0x020B, 0x020B, prLower}, // L& LATIN SMALL LETTER I WITH INVERTED BREVE + {0x020C, 0x020C, prUpper}, // L& LATIN CAPITAL LETTER O WITH DOUBLE GRAVE + {0x020D, 0x020D, prLower}, // L& LATIN SMALL LETTER O WITH DOUBLE GRAVE + {0x020E, 0x020E, prUpper}, // L& LATIN CAPITAL LETTER O WITH INVERTED BREVE + {0x020F, 0x020F, prLower}, // L& LATIN SMALL LETTER O WITH INVERTED BREVE + {0x0210, 0x0210, prUpper}, // L& LATIN CAPITAL LETTER R WITH DOUBLE GRAVE + {0x0211, 0x0211, prLower}, // L& LATIN SMALL LETTER R WITH DOUBLE GRAVE + {0x0212, 0x0212, prUpper}, // L& LATIN CAPITAL LETTER R WITH INVERTED BREVE + {0x0213, 0x0213, prLower}, // L& LATIN SMALL LETTER R WITH INVERTED BREVE + {0x0214, 0x0214, prUpper}, // L& LATIN CAPITAL LETTER U WITH DOUBLE GRAVE + {0x0215, 0x0215, prLower}, // L& LATIN SMALL LETTER U WITH DOUBLE GRAVE + {0x0216, 0x0216, prUpper}, // L& LATIN CAPITAL LETTER U WITH INVERTED BREVE + {0x0217, 0x0217, prLower}, // L& LATIN SMALL LETTER U WITH INVERTED BREVE + {0x0218, 0x0218, prUpper}, // L& LATIN CAPITAL LETTER S WITH COMMA BELOW + {0x0219, 0x0219, prLower}, // L& LATIN SMALL LETTER S WITH COMMA BELOW + {0x021A, 0x021A, prUpper}, // L& LATIN CAPITAL LETTER T WITH COMMA BELOW + {0x021B, 0x021B, prLower}, // L& LATIN SMALL LETTER T WITH COMMA BELOW + {0x021C, 0x021C, prUpper}, // L& LATIN CAPITAL LETTER YOGH + {0x021D, 0x021D, prLower}, // L& LATIN SMALL LETTER YOGH + {0x021E, 0x021E, prUpper}, // L& LATIN CAPITAL LETTER H WITH CARON + {0x021F, 0x021F, prLower}, // L& LATIN SMALL LETTER H WITH CARON + {0x0220, 0x0220, prUpper}, // L& LATIN CAPITAL LETTER N WITH LONG RIGHT LEG + {0x0221, 0x0221, prLower}, // L& LATIN SMALL LETTER D WITH CURL + {0x0222, 0x0222, prUpper}, // L& LATIN CAPITAL LETTER OU + {0x0223, 0x0223, prLower}, // L& LATIN SMALL LETTER OU + {0x0224, 0x0224, prUpper}, // L& LATIN CAPITAL LETTER Z WITH HOOK + {0x0225, 0x0225, prLower}, // L& LATIN SMALL LETTER Z WITH HOOK + {0x0226, 0x0226, prUpper}, // L& LATIN CAPITAL LETTER A WITH DOT ABOVE + {0x0227, 0x0227, prLower}, // L& LATIN SMALL LETTER A WITH DOT ABOVE + {0x0228, 0x0228, prUpper}, // L& LATIN CAPITAL LETTER E WITH CEDILLA + {0x0229, 0x0229, prLower}, // L& LATIN SMALL LETTER E WITH CEDILLA + {0x022A, 0x022A, prUpper}, // L& LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON + {0x022B, 0x022B, prLower}, // L& LATIN SMALL LETTER O WITH DIAERESIS AND MACRON + {0x022C, 0x022C, prUpper}, // L& LATIN CAPITAL LETTER O WITH TILDE AND MACRON + {0x022D, 0x022D, prLower}, // L& LATIN SMALL LETTER O WITH TILDE AND MACRON + {0x022E, 0x022E, prUpper}, // L& LATIN CAPITAL LETTER O WITH DOT ABOVE + {0x022F, 0x022F, prLower}, // L& LATIN SMALL LETTER O WITH DOT ABOVE + {0x0230, 0x0230, prUpper}, // L& LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON + {0x0231, 0x0231, prLower}, // L& LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON + {0x0232, 0x0232, prUpper}, // L& LATIN CAPITAL LETTER Y WITH MACRON + {0x0233, 0x0239, prLower}, // L& [7] LATIN SMALL LETTER Y WITH MACRON..LATIN SMALL LETTER QP DIGRAPH + {0x023A, 0x023B, prUpper}, // L& [2] LATIN CAPITAL LETTER A WITH STROKE..LATIN CAPITAL LETTER C WITH STROKE + {0x023C, 0x023C, prLower}, // L& LATIN SMALL LETTER C WITH STROKE + {0x023D, 0x023E, prUpper}, // L& [2] LATIN CAPITAL LETTER L WITH BAR..LATIN CAPITAL LETTER T WITH DIAGONAL STROKE + {0x023F, 0x0240, prLower}, // L& [2] LATIN SMALL LETTER S WITH SWASH TAIL..LATIN SMALL LETTER Z WITH SWASH TAIL + {0x0241, 0x0241, prUpper}, // L& LATIN CAPITAL LETTER GLOTTAL STOP + {0x0242, 0x0242, prLower}, // L& LATIN SMALL LETTER GLOTTAL STOP + {0x0243, 0x0246, prUpper}, // L& [4] LATIN CAPITAL LETTER B WITH STROKE..LATIN CAPITAL LETTER E WITH STROKE + {0x0247, 0x0247, prLower}, // L& LATIN SMALL LETTER E WITH STROKE + {0x0248, 0x0248, prUpper}, // L& LATIN CAPITAL LETTER J WITH STROKE + {0x0249, 0x0249, prLower}, // L& LATIN SMALL LETTER J WITH STROKE + {0x024A, 0x024A, prUpper}, // L& LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL + {0x024B, 0x024B, prLower}, // L& LATIN SMALL LETTER Q WITH HOOK TAIL + {0x024C, 0x024C, prUpper}, // L& LATIN CAPITAL LETTER R WITH STROKE + {0x024D, 0x024D, prLower}, // L& LATIN SMALL LETTER R WITH STROKE + {0x024E, 0x024E, prUpper}, // L& LATIN CAPITAL LETTER Y WITH STROKE + {0x024F, 0x0293, prLower}, // L& [69] LATIN SMALL LETTER Y WITH STROKE..LATIN SMALL LETTER EZH WITH CURL + {0x0294, 0x0294, prOLetter}, // Lo LATIN LETTER GLOTTAL STOP + {0x0295, 0x02AF, prLower}, // L& [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL + {0x02B0, 0x02B8, prLower}, // Lm [9] MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y + {0x02B9, 0x02BF, prOLetter}, // Lm [7] MODIFIER LETTER PRIME..MODIFIER LETTER LEFT HALF RING + {0x02C0, 0x02C1, prLower}, // Lm [2] MODIFIER LETTER GLOTTAL STOP..MODIFIER LETTER REVERSED GLOTTAL STOP + {0x02C6, 0x02D1, prOLetter}, // Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON + {0x02E0, 0x02E4, prLower}, // Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP + {0x02EC, 0x02EC, prOLetter}, // Lm MODIFIER LETTER VOICING + {0x02EE, 0x02EE, prOLetter}, // Lm MODIFIER LETTER DOUBLE APOSTROPHE + {0x0300, 0x036F, prExtend}, // Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X + {0x0370, 0x0370, prUpper}, // L& GREEK CAPITAL LETTER HETA + {0x0371, 0x0371, prLower}, // L& GREEK SMALL LETTER HETA + {0x0372, 0x0372, prUpper}, // L& GREEK CAPITAL LETTER ARCHAIC SAMPI + {0x0373, 0x0373, prLower}, // L& GREEK SMALL LETTER ARCHAIC SAMPI + {0x0374, 0x0374, prOLetter}, // Lm GREEK NUMERAL SIGN + {0x0376, 0x0376, prUpper}, // L& GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA + {0x0377, 0x0377, prLower}, // L& GREEK SMALL LETTER PAMPHYLIAN DIGAMMA + {0x037A, 0x037A, prLower}, // Lm GREEK YPOGEGRAMMENI + {0x037B, 0x037D, prLower}, // L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL + {0x037F, 0x037F, prUpper}, // L& GREEK CAPITAL LETTER YOT + {0x0386, 0x0386, prUpper}, // L& GREEK CAPITAL LETTER ALPHA WITH TONOS + {0x0388, 0x038A, prUpper}, // L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS + {0x038C, 0x038C, prUpper}, // L& GREEK CAPITAL LETTER OMICRON WITH TONOS + {0x038E, 0x038F, prUpper}, // L& [2] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER OMEGA WITH TONOS + {0x0390, 0x0390, prLower}, // L& GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + {0x0391, 0x03A1, prUpper}, // L& [17] GREEK CAPITAL LETTER ALPHA..GREEK CAPITAL LETTER RHO + {0x03A3, 0x03AB, prUpper}, // L& [9] GREEK CAPITAL LETTER SIGMA..GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + {0x03AC, 0x03CE, prLower}, // L& [35] GREEK SMALL LETTER ALPHA WITH TONOS..GREEK SMALL LETTER OMEGA WITH TONOS + {0x03CF, 0x03CF, prUpper}, // L& GREEK CAPITAL KAI SYMBOL + {0x03D0, 0x03D1, prLower}, // L& [2] GREEK BETA SYMBOL..GREEK THETA SYMBOL + {0x03D2, 0x03D4, prUpper}, // L& [3] GREEK UPSILON WITH HOOK SYMBOL..GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL + {0x03D5, 0x03D7, prLower}, // L& [3] GREEK PHI SYMBOL..GREEK KAI SYMBOL + {0x03D8, 0x03D8, prUpper}, // L& GREEK LETTER ARCHAIC KOPPA + {0x03D9, 0x03D9, prLower}, // L& GREEK SMALL LETTER ARCHAIC KOPPA + {0x03DA, 0x03DA, prUpper}, // L& GREEK LETTER STIGMA + {0x03DB, 0x03DB, prLower}, // L& GREEK SMALL LETTER STIGMA + {0x03DC, 0x03DC, prUpper}, // L& GREEK LETTER DIGAMMA + {0x03DD, 0x03DD, prLower}, // L& GREEK SMALL LETTER DIGAMMA + {0x03DE, 0x03DE, prUpper}, // L& GREEK LETTER KOPPA + {0x03DF, 0x03DF, prLower}, // L& GREEK SMALL LETTER KOPPA + {0x03E0, 0x03E0, prUpper}, // L& GREEK LETTER SAMPI + {0x03E1, 0x03E1, prLower}, // L& GREEK SMALL LETTER SAMPI + {0x03E2, 0x03E2, prUpper}, // L& COPTIC CAPITAL LETTER SHEI + {0x03E3, 0x03E3, prLower}, // L& COPTIC SMALL LETTER SHEI + {0x03E4, 0x03E4, prUpper}, // L& COPTIC CAPITAL LETTER FEI + {0x03E5, 0x03E5, prLower}, // L& COPTIC SMALL LETTER FEI + {0x03E6, 0x03E6, prUpper}, // L& COPTIC CAPITAL LETTER KHEI + {0x03E7, 0x03E7, prLower}, // L& COPTIC SMALL LETTER KHEI + {0x03E8, 0x03E8, prUpper}, // L& COPTIC CAPITAL LETTER HORI + {0x03E9, 0x03E9, prLower}, // L& COPTIC SMALL LETTER HORI + {0x03EA, 0x03EA, prUpper}, // L& COPTIC CAPITAL LETTER GANGIA + {0x03EB, 0x03EB, prLower}, // L& COPTIC SMALL LETTER GANGIA + {0x03EC, 0x03EC, prUpper}, // L& COPTIC CAPITAL LETTER SHIMA + {0x03ED, 0x03ED, prLower}, // L& COPTIC SMALL LETTER SHIMA + {0x03EE, 0x03EE, prUpper}, // L& COPTIC CAPITAL LETTER DEI + {0x03EF, 0x03F3, prLower}, // L& [5] COPTIC SMALL LETTER DEI..GREEK LETTER YOT + {0x03F4, 0x03F4, prUpper}, // L& GREEK CAPITAL THETA SYMBOL + {0x03F5, 0x03F5, prLower}, // L& GREEK LUNATE EPSILON SYMBOL + {0x03F7, 0x03F7, prUpper}, // L& GREEK CAPITAL LETTER SHO + {0x03F8, 0x03F8, prLower}, // L& GREEK SMALL LETTER SHO + {0x03F9, 0x03FA, prUpper}, // L& [2] GREEK CAPITAL LUNATE SIGMA SYMBOL..GREEK CAPITAL LETTER SAN + {0x03FB, 0x03FC, prLower}, // L& [2] GREEK SMALL LETTER SAN..GREEK RHO WITH STROKE SYMBOL + {0x03FD, 0x042F, prUpper}, // L& [51] GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL..CYRILLIC CAPITAL LETTER YA + {0x0430, 0x045F, prLower}, // L& [48] CYRILLIC SMALL LETTER A..CYRILLIC SMALL LETTER DZHE + {0x0460, 0x0460, prUpper}, // L& CYRILLIC CAPITAL LETTER OMEGA + {0x0461, 0x0461, prLower}, // L& CYRILLIC SMALL LETTER OMEGA + {0x0462, 0x0462, prUpper}, // L& CYRILLIC CAPITAL LETTER YAT + {0x0463, 0x0463, prLower}, // L& CYRILLIC SMALL LETTER YAT + {0x0464, 0x0464, prUpper}, // L& CYRILLIC CAPITAL LETTER IOTIFIED E + {0x0465, 0x0465, prLower}, // L& CYRILLIC SMALL LETTER IOTIFIED E + {0x0466, 0x0466, prUpper}, // L& CYRILLIC CAPITAL LETTER LITTLE YUS + {0x0467, 0x0467, prLower}, // L& CYRILLIC SMALL LETTER LITTLE YUS + {0x0468, 0x0468, prUpper}, // L& CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS + {0x0469, 0x0469, prLower}, // L& CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS + {0x046A, 0x046A, prUpper}, // L& CYRILLIC CAPITAL LETTER BIG YUS + {0x046B, 0x046B, prLower}, // L& CYRILLIC SMALL LETTER BIG YUS + {0x046C, 0x046C, prUpper}, // L& CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS + {0x046D, 0x046D, prLower}, // L& CYRILLIC SMALL LETTER IOTIFIED BIG YUS + {0x046E, 0x046E, prUpper}, // L& CYRILLIC CAPITAL LETTER KSI + {0x046F, 0x046F, prLower}, // L& CYRILLIC SMALL LETTER KSI + {0x0470, 0x0470, prUpper}, // L& CYRILLIC CAPITAL LETTER PSI + {0x0471, 0x0471, prLower}, // L& CYRILLIC SMALL LETTER PSI + {0x0472, 0x0472, prUpper}, // L& CYRILLIC CAPITAL LETTER FITA + {0x0473, 0x0473, prLower}, // L& CYRILLIC SMALL LETTER FITA + {0x0474, 0x0474, prUpper}, // L& CYRILLIC CAPITAL LETTER IZHITSA + {0x0475, 0x0475, prLower}, // L& CYRILLIC SMALL LETTER IZHITSA + {0x0476, 0x0476, prUpper}, // L& CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT + {0x0477, 0x0477, prLower}, // L& CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT + {0x0478, 0x0478, prUpper}, // L& CYRILLIC CAPITAL LETTER UK + {0x0479, 0x0479, prLower}, // L& CYRILLIC SMALL LETTER UK + {0x047A, 0x047A, prUpper}, // L& CYRILLIC CAPITAL LETTER ROUND OMEGA + {0x047B, 0x047B, prLower}, // L& CYRILLIC SMALL LETTER ROUND OMEGA + {0x047C, 0x047C, prUpper}, // L& CYRILLIC CAPITAL LETTER OMEGA WITH TITLO + {0x047D, 0x047D, prLower}, // L& CYRILLIC SMALL LETTER OMEGA WITH TITLO + {0x047E, 0x047E, prUpper}, // L& CYRILLIC CAPITAL LETTER OT + {0x047F, 0x047F, prLower}, // L& CYRILLIC SMALL LETTER OT + {0x0480, 0x0480, prUpper}, // L& CYRILLIC CAPITAL LETTER KOPPA + {0x0481, 0x0481, prLower}, // L& CYRILLIC SMALL LETTER KOPPA + {0x0483, 0x0487, prExtend}, // Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE + {0x0488, 0x0489, prExtend}, // Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN + {0x048A, 0x048A, prUpper}, // L& CYRILLIC CAPITAL LETTER SHORT I WITH TAIL + {0x048B, 0x048B, prLower}, // L& CYRILLIC SMALL LETTER SHORT I WITH TAIL + {0x048C, 0x048C, prUpper}, // L& CYRILLIC CAPITAL LETTER SEMISOFT SIGN + {0x048D, 0x048D, prLower}, // L& CYRILLIC SMALL LETTER SEMISOFT SIGN + {0x048E, 0x048E, prUpper}, // L& CYRILLIC CAPITAL LETTER ER WITH TICK + {0x048F, 0x048F, prLower}, // L& CYRILLIC SMALL LETTER ER WITH TICK + {0x0490, 0x0490, prUpper}, // L& CYRILLIC CAPITAL LETTER GHE WITH UPTURN + {0x0491, 0x0491, prLower}, // L& CYRILLIC SMALL LETTER GHE WITH UPTURN + {0x0492, 0x0492, prUpper}, // L& CYRILLIC CAPITAL LETTER GHE WITH STROKE + {0x0493, 0x0493, prLower}, // L& CYRILLIC SMALL LETTER GHE WITH STROKE + {0x0494, 0x0494, prUpper}, // L& CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK + {0x0495, 0x0495, prLower}, // L& CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK + {0x0496, 0x0496, prUpper}, // L& CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER + {0x0497, 0x0497, prLower}, // L& CYRILLIC SMALL LETTER ZHE WITH DESCENDER + {0x0498, 0x0498, prUpper}, // L& CYRILLIC CAPITAL LETTER ZE WITH DESCENDER + {0x0499, 0x0499, prLower}, // L& CYRILLIC SMALL LETTER ZE WITH DESCENDER + {0x049A, 0x049A, prUpper}, // L& CYRILLIC CAPITAL LETTER KA WITH DESCENDER + {0x049B, 0x049B, prLower}, // L& CYRILLIC SMALL LETTER KA WITH DESCENDER + {0x049C, 0x049C, prUpper}, // L& CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE + {0x049D, 0x049D, prLower}, // L& CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE + {0x049E, 0x049E, prUpper}, // L& CYRILLIC CAPITAL LETTER KA WITH STROKE + {0x049F, 0x049F, prLower}, // L& CYRILLIC SMALL LETTER KA WITH STROKE + {0x04A0, 0x04A0, prUpper}, // L& CYRILLIC CAPITAL LETTER BASHKIR KA + {0x04A1, 0x04A1, prLower}, // L& CYRILLIC SMALL LETTER BASHKIR KA + {0x04A2, 0x04A2, prUpper}, // L& CYRILLIC CAPITAL LETTER EN WITH DESCENDER + {0x04A3, 0x04A3, prLower}, // L& CYRILLIC SMALL LETTER EN WITH DESCENDER + {0x04A4, 0x04A4, prUpper}, // L& CYRILLIC CAPITAL LIGATURE EN GHE + {0x04A5, 0x04A5, prLower}, // L& CYRILLIC SMALL LIGATURE EN GHE + {0x04A6, 0x04A6, prUpper}, // L& CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK + {0x04A7, 0x04A7, prLower}, // L& CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK + {0x04A8, 0x04A8, prUpper}, // L& CYRILLIC CAPITAL LETTER ABKHASIAN HA + {0x04A9, 0x04A9, prLower}, // L& CYRILLIC SMALL LETTER ABKHASIAN HA + {0x04AA, 0x04AA, prUpper}, // L& CYRILLIC CAPITAL LETTER ES WITH DESCENDER + {0x04AB, 0x04AB, prLower}, // L& CYRILLIC SMALL LETTER ES WITH DESCENDER + {0x04AC, 0x04AC, prUpper}, // L& CYRILLIC CAPITAL LETTER TE WITH DESCENDER + {0x04AD, 0x04AD, prLower}, // L& CYRILLIC SMALL LETTER TE WITH DESCENDER + {0x04AE, 0x04AE, prUpper}, // L& CYRILLIC CAPITAL LETTER STRAIGHT U + {0x04AF, 0x04AF, prLower}, // L& CYRILLIC SMALL LETTER STRAIGHT U + {0x04B0, 0x04B0, prUpper}, // L& CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE + {0x04B1, 0x04B1, prLower}, // L& CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE + {0x04B2, 0x04B2, prUpper}, // L& CYRILLIC CAPITAL LETTER HA WITH DESCENDER + {0x04B3, 0x04B3, prLower}, // L& CYRILLIC SMALL LETTER HA WITH DESCENDER + {0x04B4, 0x04B4, prUpper}, // L& CYRILLIC CAPITAL LIGATURE TE TSE + {0x04B5, 0x04B5, prLower}, // L& CYRILLIC SMALL LIGATURE TE TSE + {0x04B6, 0x04B6, prUpper}, // L& CYRILLIC CAPITAL LETTER CHE WITH DESCENDER + {0x04B7, 0x04B7, prLower}, // L& CYRILLIC SMALL LETTER CHE WITH DESCENDER + {0x04B8, 0x04B8, prUpper}, // L& CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE + {0x04B9, 0x04B9, prLower}, // L& CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE + {0x04BA, 0x04BA, prUpper}, // L& CYRILLIC CAPITAL LETTER SHHA + {0x04BB, 0x04BB, prLower}, // L& CYRILLIC SMALL LETTER SHHA + {0x04BC, 0x04BC, prUpper}, // L& CYRILLIC CAPITAL LETTER ABKHASIAN CHE + {0x04BD, 0x04BD, prLower}, // L& CYRILLIC SMALL LETTER ABKHASIAN CHE + {0x04BE, 0x04BE, prUpper}, // L& CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER + {0x04BF, 0x04BF, prLower}, // L& CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER + {0x04C0, 0x04C1, prUpper}, // L& [2] CYRILLIC LETTER PALOCHKA..CYRILLIC CAPITAL LETTER ZHE WITH BREVE + {0x04C2, 0x04C2, prLower}, // L& CYRILLIC SMALL LETTER ZHE WITH BREVE + {0x04C3, 0x04C3, prUpper}, // L& CYRILLIC CAPITAL LETTER KA WITH HOOK + {0x04C4, 0x04C4, prLower}, // L& CYRILLIC SMALL LETTER KA WITH HOOK + {0x04C5, 0x04C5, prUpper}, // L& CYRILLIC CAPITAL LETTER EL WITH TAIL + {0x04C6, 0x04C6, prLower}, // L& CYRILLIC SMALL LETTER EL WITH TAIL + {0x04C7, 0x04C7, prUpper}, // L& CYRILLIC CAPITAL LETTER EN WITH HOOK + {0x04C8, 0x04C8, prLower}, // L& CYRILLIC SMALL LETTER EN WITH HOOK + {0x04C9, 0x04C9, prUpper}, // L& CYRILLIC CAPITAL LETTER EN WITH TAIL + {0x04CA, 0x04CA, prLower}, // L& CYRILLIC SMALL LETTER EN WITH TAIL + {0x04CB, 0x04CB, prUpper}, // L& CYRILLIC CAPITAL LETTER KHAKASSIAN CHE + {0x04CC, 0x04CC, prLower}, // L& CYRILLIC SMALL LETTER KHAKASSIAN CHE + {0x04CD, 0x04CD, prUpper}, // L& CYRILLIC CAPITAL LETTER EM WITH TAIL + {0x04CE, 0x04CF, prLower}, // L& [2] CYRILLIC SMALL LETTER EM WITH TAIL..CYRILLIC SMALL LETTER PALOCHKA + {0x04D0, 0x04D0, prUpper}, // L& CYRILLIC CAPITAL LETTER A WITH BREVE + {0x04D1, 0x04D1, prLower}, // L& CYRILLIC SMALL LETTER A WITH BREVE + {0x04D2, 0x04D2, prUpper}, // L& CYRILLIC CAPITAL LETTER A WITH DIAERESIS + {0x04D3, 0x04D3, prLower}, // L& CYRILLIC SMALL LETTER A WITH DIAERESIS + {0x04D4, 0x04D4, prUpper}, // L& CYRILLIC CAPITAL LIGATURE A IE + {0x04D5, 0x04D5, prLower}, // L& CYRILLIC SMALL LIGATURE A IE + {0x04D6, 0x04D6, prUpper}, // L& CYRILLIC CAPITAL LETTER IE WITH BREVE + {0x04D7, 0x04D7, prLower}, // L& CYRILLIC SMALL LETTER IE WITH BREVE + {0x04D8, 0x04D8, prUpper}, // L& CYRILLIC CAPITAL LETTER SCHWA + {0x04D9, 0x04D9, prLower}, // L& CYRILLIC SMALL LETTER SCHWA + {0x04DA, 0x04DA, prUpper}, // L& CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS + {0x04DB, 0x04DB, prLower}, // L& CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS + {0x04DC, 0x04DC, prUpper}, // L& CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS + {0x04DD, 0x04DD, prLower}, // L& CYRILLIC SMALL LETTER ZHE WITH DIAERESIS + {0x04DE, 0x04DE, prUpper}, // L& CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS + {0x04DF, 0x04DF, prLower}, // L& CYRILLIC SMALL LETTER ZE WITH DIAERESIS + {0x04E0, 0x04E0, prUpper}, // L& CYRILLIC CAPITAL LETTER ABKHASIAN DZE + {0x04E1, 0x04E1, prLower}, // L& CYRILLIC SMALL LETTER ABKHASIAN DZE + {0x04E2, 0x04E2, prUpper}, // L& CYRILLIC CAPITAL LETTER I WITH MACRON + {0x04E3, 0x04E3, prLower}, // L& CYRILLIC SMALL LETTER I WITH MACRON + {0x04E4, 0x04E4, prUpper}, // L& CYRILLIC CAPITAL LETTER I WITH DIAERESIS + {0x04E5, 0x04E5, prLower}, // L& CYRILLIC SMALL LETTER I WITH DIAERESIS + {0x04E6, 0x04E6, prUpper}, // L& CYRILLIC CAPITAL LETTER O WITH DIAERESIS + {0x04E7, 0x04E7, prLower}, // L& CYRILLIC SMALL LETTER O WITH DIAERESIS + {0x04E8, 0x04E8, prUpper}, // L& CYRILLIC CAPITAL LETTER BARRED O + {0x04E9, 0x04E9, prLower}, // L& CYRILLIC SMALL LETTER BARRED O + {0x04EA, 0x04EA, prUpper}, // L& CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS + {0x04EB, 0x04EB, prLower}, // L& CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS + {0x04EC, 0x04EC, prUpper}, // L& CYRILLIC CAPITAL LETTER E WITH DIAERESIS + {0x04ED, 0x04ED, prLower}, // L& CYRILLIC SMALL LETTER E WITH DIAERESIS + {0x04EE, 0x04EE, prUpper}, // L& CYRILLIC CAPITAL LETTER U WITH MACRON + {0x04EF, 0x04EF, prLower}, // L& CYRILLIC SMALL LETTER U WITH MACRON + {0x04F0, 0x04F0, prUpper}, // L& CYRILLIC CAPITAL LETTER U WITH DIAERESIS + {0x04F1, 0x04F1, prLower}, // L& CYRILLIC SMALL LETTER U WITH DIAERESIS + {0x04F2, 0x04F2, prUpper}, // L& CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE + {0x04F3, 0x04F3, prLower}, // L& CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE + {0x04F4, 0x04F4, prUpper}, // L& CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS + {0x04F5, 0x04F5, prLower}, // L& CYRILLIC SMALL LETTER CHE WITH DIAERESIS + {0x04F6, 0x04F6, prUpper}, // L& CYRILLIC CAPITAL LETTER GHE WITH DESCENDER + {0x04F7, 0x04F7, prLower}, // L& CYRILLIC SMALL LETTER GHE WITH DESCENDER + {0x04F8, 0x04F8, prUpper}, // L& CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS + {0x04F9, 0x04F9, prLower}, // L& CYRILLIC SMALL LETTER YERU WITH DIAERESIS + {0x04FA, 0x04FA, prUpper}, // L& CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK + {0x04FB, 0x04FB, prLower}, // L& CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK + {0x04FC, 0x04FC, prUpper}, // L& CYRILLIC CAPITAL LETTER HA WITH HOOK + {0x04FD, 0x04FD, prLower}, // L& CYRILLIC SMALL LETTER HA WITH HOOK + {0x04FE, 0x04FE, prUpper}, // L& CYRILLIC CAPITAL LETTER HA WITH STROKE + {0x04FF, 0x04FF, prLower}, // L& CYRILLIC SMALL LETTER HA WITH STROKE + {0x0500, 0x0500, prUpper}, // L& CYRILLIC CAPITAL LETTER KOMI DE + {0x0501, 0x0501, prLower}, // L& CYRILLIC SMALL LETTER KOMI DE + {0x0502, 0x0502, prUpper}, // L& CYRILLIC CAPITAL LETTER KOMI DJE + {0x0503, 0x0503, prLower}, // L& CYRILLIC SMALL LETTER KOMI DJE + {0x0504, 0x0504, prUpper}, // L& CYRILLIC CAPITAL LETTER KOMI ZJE + {0x0505, 0x0505, prLower}, // L& CYRILLIC SMALL LETTER KOMI ZJE + {0x0506, 0x0506, prUpper}, // L& CYRILLIC CAPITAL LETTER KOMI DZJE + {0x0507, 0x0507, prLower}, // L& CYRILLIC SMALL LETTER KOMI DZJE + {0x0508, 0x0508, prUpper}, // L& CYRILLIC CAPITAL LETTER KOMI LJE + {0x0509, 0x0509, prLower}, // L& CYRILLIC SMALL LETTER KOMI LJE + {0x050A, 0x050A, prUpper}, // L& CYRILLIC CAPITAL LETTER KOMI NJE + {0x050B, 0x050B, prLower}, // L& CYRILLIC SMALL LETTER KOMI NJE + {0x050C, 0x050C, prUpper}, // L& CYRILLIC CAPITAL LETTER KOMI SJE + {0x050D, 0x050D, prLower}, // L& CYRILLIC SMALL LETTER KOMI SJE + {0x050E, 0x050E, prUpper}, // L& CYRILLIC CAPITAL LETTER KOMI TJE + {0x050F, 0x050F, prLower}, // L& CYRILLIC SMALL LETTER KOMI TJE + {0x0510, 0x0510, prUpper}, // L& CYRILLIC CAPITAL LETTER REVERSED ZE + {0x0511, 0x0511, prLower}, // L& CYRILLIC SMALL LETTER REVERSED ZE + {0x0512, 0x0512, prUpper}, // L& CYRILLIC CAPITAL LETTER EL WITH HOOK + {0x0513, 0x0513, prLower}, // L& CYRILLIC SMALL LETTER EL WITH HOOK + {0x0514, 0x0514, prUpper}, // L& CYRILLIC CAPITAL LETTER LHA + {0x0515, 0x0515, prLower}, // L& CYRILLIC SMALL LETTER LHA + {0x0516, 0x0516, prUpper}, // L& CYRILLIC CAPITAL LETTER RHA + {0x0517, 0x0517, prLower}, // L& CYRILLIC SMALL LETTER RHA + {0x0518, 0x0518, prUpper}, // L& CYRILLIC CAPITAL LETTER YAE + {0x0519, 0x0519, prLower}, // L& CYRILLIC SMALL LETTER YAE + {0x051A, 0x051A, prUpper}, // L& CYRILLIC CAPITAL LETTER QA + {0x051B, 0x051B, prLower}, // L& CYRILLIC SMALL LETTER QA + {0x051C, 0x051C, prUpper}, // L& CYRILLIC CAPITAL LETTER WE + {0x051D, 0x051D, prLower}, // L& CYRILLIC SMALL LETTER WE + {0x051E, 0x051E, prUpper}, // L& CYRILLIC CAPITAL LETTER ALEUT KA + {0x051F, 0x051F, prLower}, // L& CYRILLIC SMALL LETTER ALEUT KA + {0x0520, 0x0520, prUpper}, // L& CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK + {0x0521, 0x0521, prLower}, // L& CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK + {0x0522, 0x0522, prUpper}, // L& CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK + {0x0523, 0x0523, prLower}, // L& CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK + {0x0524, 0x0524, prUpper}, // L& CYRILLIC CAPITAL LETTER PE WITH DESCENDER + {0x0525, 0x0525, prLower}, // L& CYRILLIC SMALL LETTER PE WITH DESCENDER + {0x0526, 0x0526, prUpper}, // L& CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER + {0x0527, 0x0527, prLower}, // L& CYRILLIC SMALL LETTER SHHA WITH DESCENDER + {0x0528, 0x0528, prUpper}, // L& CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK + {0x0529, 0x0529, prLower}, // L& CYRILLIC SMALL LETTER EN WITH LEFT HOOK + {0x052A, 0x052A, prUpper}, // L& CYRILLIC CAPITAL LETTER DZZHE + {0x052B, 0x052B, prLower}, // L& CYRILLIC SMALL LETTER DZZHE + {0x052C, 0x052C, prUpper}, // L& CYRILLIC CAPITAL LETTER DCHE + {0x052D, 0x052D, prLower}, // L& CYRILLIC SMALL LETTER DCHE + {0x052E, 0x052E, prUpper}, // L& CYRILLIC CAPITAL LETTER EL WITH DESCENDER + {0x052F, 0x052F, prLower}, // L& CYRILLIC SMALL LETTER EL WITH DESCENDER + {0x0531, 0x0556, prUpper}, // L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH + {0x0559, 0x0559, prOLetter}, // Lm ARMENIAN MODIFIER LETTER LEFT HALF RING + {0x055D, 0x055D, prSContinue}, // Po ARMENIAN COMMA + {0x0560, 0x0588, prLower}, // L& [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE + {0x0589, 0x0589, prSTerm}, // Po ARMENIAN FULL STOP + {0x0591, 0x05BD, prExtend}, // Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG + {0x05BF, 0x05BF, prExtend}, // Mn HEBREW POINT RAFE + {0x05C1, 0x05C2, prExtend}, // Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT + {0x05C4, 0x05C5, prExtend}, // Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT + {0x05C7, 0x05C7, prExtend}, // Mn HEBREW POINT QAMATS QATAN + {0x05D0, 0x05EA, prOLetter}, // Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV + {0x05EF, 0x05F2, prOLetter}, // Lo [4] HEBREW YOD TRIANGLE..HEBREW LIGATURE YIDDISH DOUBLE YOD + {0x05F3, 0x05F3, prOLetter}, // Po HEBREW PUNCTUATION GERESH + {0x0600, 0x0605, prFormat}, // Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE + {0x060C, 0x060D, prSContinue}, // Po [2] ARABIC COMMA..ARABIC DATE SEPARATOR + {0x0610, 0x061A, prExtend}, // Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA + {0x061C, 0x061C, prFormat}, // Cf ARABIC LETTER MARK + {0x061D, 0x061F, prSTerm}, // Po [3] ARABIC END OF TEXT MARK..ARABIC QUESTION MARK + {0x0620, 0x063F, prOLetter}, // Lo [32] ARABIC LETTER KASHMIRI YEH..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE + {0x0640, 0x0640, prOLetter}, // Lm ARABIC TATWEEL + {0x0641, 0x064A, prOLetter}, // Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH + {0x064B, 0x065F, prExtend}, // Mn [21] ARABIC FATHATAN..ARABIC WAVY HAMZA BELOW + {0x0660, 0x0669, prNumeric}, // Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE + {0x066B, 0x066C, prNumeric}, // Po [2] ARABIC DECIMAL SEPARATOR..ARABIC THOUSANDS SEPARATOR + {0x066E, 0x066F, prOLetter}, // Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF + {0x0670, 0x0670, prExtend}, // Mn ARABIC LETTER SUPERSCRIPT ALEF + {0x0671, 0x06D3, prOLetter}, // Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE + {0x06D4, 0x06D4, prSTerm}, // Po ARABIC FULL STOP + {0x06D5, 0x06D5, prOLetter}, // Lo ARABIC LETTER AE + {0x06D6, 0x06DC, prExtend}, // Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN + {0x06DD, 0x06DD, prFormat}, // Cf ARABIC END OF AYAH + {0x06DF, 0x06E4, prExtend}, // Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA + {0x06E5, 0x06E6, prOLetter}, // Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH + {0x06E7, 0x06E8, prExtend}, // Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON + {0x06EA, 0x06ED, prExtend}, // Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM + {0x06EE, 0x06EF, prOLetter}, // Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V + {0x06F0, 0x06F9, prNumeric}, // Nd [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE + {0x06FA, 0x06FC, prOLetter}, // Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW + {0x06FF, 0x06FF, prOLetter}, // Lo ARABIC LETTER HEH WITH INVERTED V + {0x0700, 0x0702, prSTerm}, // Po [3] SYRIAC END OF PARAGRAPH..SYRIAC SUBLINEAR FULL STOP + {0x070F, 0x070F, prFormat}, // Cf SYRIAC ABBREVIATION MARK + {0x0710, 0x0710, prOLetter}, // Lo SYRIAC LETTER ALAPH + {0x0711, 0x0711, prExtend}, // Mn SYRIAC LETTER SUPERSCRIPT ALAPH + {0x0712, 0x072F, prOLetter}, // Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH + {0x0730, 0x074A, prExtend}, // Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH + {0x074D, 0x07A5, prOLetter}, // Lo [89] SYRIAC LETTER SOGDIAN ZHAIN..THAANA LETTER WAAVU + {0x07A6, 0x07B0, prExtend}, // Mn [11] THAANA ABAFILI..THAANA SUKUN + {0x07B1, 0x07B1, prOLetter}, // Lo THAANA LETTER NAA + {0x07C0, 0x07C9, prNumeric}, // Nd [10] NKO DIGIT ZERO..NKO DIGIT NINE + {0x07CA, 0x07EA, prOLetter}, // Lo [33] NKO LETTER A..NKO LETTER JONA RA + {0x07EB, 0x07F3, prExtend}, // Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE + {0x07F4, 0x07F5, prOLetter}, // Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE + {0x07F8, 0x07F8, prSContinue}, // Po NKO COMMA + {0x07F9, 0x07F9, prSTerm}, // Po NKO EXCLAMATION MARK + {0x07FA, 0x07FA, prOLetter}, // Lm NKO LAJANYALAN + {0x07FD, 0x07FD, prExtend}, // Mn NKO DANTAYALAN + {0x0800, 0x0815, prOLetter}, // Lo [22] SAMARITAN LETTER ALAF..SAMARITAN LETTER TAAF + {0x0816, 0x0819, prExtend}, // Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH + {0x081A, 0x081A, prOLetter}, // Lm SAMARITAN MODIFIER LETTER EPENTHETIC YUT + {0x081B, 0x0823, prExtend}, // Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A + {0x0824, 0x0824, prOLetter}, // Lm SAMARITAN MODIFIER LETTER SHORT A + {0x0825, 0x0827, prExtend}, // Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U + {0x0828, 0x0828, prOLetter}, // Lm SAMARITAN MODIFIER LETTER I + {0x0829, 0x082D, prExtend}, // Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA + {0x0837, 0x0837, prSTerm}, // Po SAMARITAN PUNCTUATION MELODIC QITSA + {0x0839, 0x0839, prSTerm}, // Po SAMARITAN PUNCTUATION QITSA + {0x083D, 0x083E, prSTerm}, // Po [2] SAMARITAN PUNCTUATION SOF MASHFAAT..SAMARITAN PUNCTUATION ANNAAU + {0x0840, 0x0858, prOLetter}, // Lo [25] MANDAIC LETTER HALQA..MANDAIC LETTER AIN + {0x0859, 0x085B, prExtend}, // Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK + {0x0860, 0x086A, prOLetter}, // Lo [11] SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA + {0x0870, 0x0887, prOLetter}, // Lo [24] ARABIC LETTER ALEF WITH ATTACHED FATHA..ARABIC BASELINE ROUND DOT + {0x0889, 0x088E, prOLetter}, // Lo [6] ARABIC LETTER NOON WITH INVERTED SMALL V..ARABIC VERTICAL TAIL + {0x0890, 0x0891, prFormat}, // Cf [2] ARABIC POUND MARK ABOVE..ARABIC PIASTRE MARK ABOVE + {0x0898, 0x089F, prExtend}, // Mn [8] ARABIC SMALL HIGH WORD AL-JUZ..ARABIC HALF MADDA OVER MADDA + {0x08A0, 0x08C8, prOLetter}, // Lo [41] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER GRAF + {0x08C9, 0x08C9, prOLetter}, // Lm ARABIC SMALL FARSI YEH + {0x08CA, 0x08E1, prExtend}, // Mn [24] ARABIC SMALL HIGH FARSI YEH..ARABIC SMALL HIGH SIGN SAFHA + {0x08E2, 0x08E2, prFormat}, // Cf ARABIC DISPUTED END OF AYAH + {0x08E3, 0x0902, prExtend}, // Mn [32] ARABIC TURNED DAMMA BELOW..DEVANAGARI SIGN ANUSVARA + {0x0903, 0x0903, prExtend}, // Mc DEVANAGARI SIGN VISARGA + {0x0904, 0x0939, prOLetter}, // Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA + {0x093A, 0x093A, prExtend}, // Mn DEVANAGARI VOWEL SIGN OE + {0x093B, 0x093B, prExtend}, // Mc DEVANAGARI VOWEL SIGN OOE + {0x093C, 0x093C, prExtend}, // Mn DEVANAGARI SIGN NUKTA + {0x093D, 0x093D, prOLetter}, // Lo DEVANAGARI SIGN AVAGRAHA + {0x093E, 0x0940, prExtend}, // Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II + {0x0941, 0x0948, prExtend}, // Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI + {0x0949, 0x094C, prExtend}, // Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU + {0x094D, 0x094D, prExtend}, // Mn DEVANAGARI SIGN VIRAMA + {0x094E, 0x094F, prExtend}, // Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW + {0x0950, 0x0950, prOLetter}, // Lo DEVANAGARI OM + {0x0951, 0x0957, prExtend}, // Mn [7] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN UUE + {0x0958, 0x0961, prOLetter}, // Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL + {0x0962, 0x0963, prExtend}, // Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL + {0x0964, 0x0965, prSTerm}, // Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA + {0x0966, 0x096F, prNumeric}, // Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE + {0x0971, 0x0971, prOLetter}, // Lm DEVANAGARI SIGN HIGH SPACING DOT + {0x0972, 0x0980, prOLetter}, // Lo [15] DEVANAGARI LETTER CANDRA A..BENGALI ANJI + {0x0981, 0x0981, prExtend}, // Mn BENGALI SIGN CANDRABINDU + {0x0982, 0x0983, prExtend}, // Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA + {0x0985, 0x098C, prOLetter}, // Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L + {0x098F, 0x0990, prOLetter}, // Lo [2] BENGALI LETTER E..BENGALI LETTER AI + {0x0993, 0x09A8, prOLetter}, // Lo [22] BENGALI LETTER O..BENGALI LETTER NA + {0x09AA, 0x09B0, prOLetter}, // Lo [7] BENGALI LETTER PA..BENGALI LETTER RA + {0x09B2, 0x09B2, prOLetter}, // Lo BENGALI LETTER LA + {0x09B6, 0x09B9, prOLetter}, // Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA + {0x09BC, 0x09BC, prExtend}, // Mn BENGALI SIGN NUKTA + {0x09BD, 0x09BD, prOLetter}, // Lo BENGALI SIGN AVAGRAHA + {0x09BE, 0x09C0, prExtend}, // Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II + {0x09C1, 0x09C4, prExtend}, // Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR + {0x09C7, 0x09C8, prExtend}, // Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI + {0x09CB, 0x09CC, prExtend}, // Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU + {0x09CD, 0x09CD, prExtend}, // Mn BENGALI SIGN VIRAMA + {0x09CE, 0x09CE, prOLetter}, // Lo BENGALI LETTER KHANDA TA + {0x09D7, 0x09D7, prExtend}, // Mc BENGALI AU LENGTH MARK + {0x09DC, 0x09DD, prOLetter}, // Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA + {0x09DF, 0x09E1, prOLetter}, // Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL + {0x09E2, 0x09E3, prExtend}, // Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL + {0x09E6, 0x09EF, prNumeric}, // Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE + {0x09F0, 0x09F1, prOLetter}, // Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL + {0x09FC, 0x09FC, prOLetter}, // Lo BENGALI LETTER VEDIC ANUSVARA + {0x09FE, 0x09FE, prExtend}, // Mn BENGALI SANDHI MARK + {0x0A01, 0x0A02, prExtend}, // Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI + {0x0A03, 0x0A03, prExtend}, // Mc GURMUKHI SIGN VISARGA + {0x0A05, 0x0A0A, prOLetter}, // Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU + {0x0A0F, 0x0A10, prOLetter}, // Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI + {0x0A13, 0x0A28, prOLetter}, // Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA + {0x0A2A, 0x0A30, prOLetter}, // Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA + {0x0A32, 0x0A33, prOLetter}, // Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA + {0x0A35, 0x0A36, prOLetter}, // Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA + {0x0A38, 0x0A39, prOLetter}, // Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA + {0x0A3C, 0x0A3C, prExtend}, // Mn GURMUKHI SIGN NUKTA + {0x0A3E, 0x0A40, prExtend}, // Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II + {0x0A41, 0x0A42, prExtend}, // Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU + {0x0A47, 0x0A48, prExtend}, // Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI + {0x0A4B, 0x0A4D, prExtend}, // Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA + {0x0A51, 0x0A51, prExtend}, // Mn GURMUKHI SIGN UDAAT + {0x0A59, 0x0A5C, prOLetter}, // Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA + {0x0A5E, 0x0A5E, prOLetter}, // Lo GURMUKHI LETTER FA + {0x0A66, 0x0A6F, prNumeric}, // Nd [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE + {0x0A70, 0x0A71, prExtend}, // Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK + {0x0A72, 0x0A74, prOLetter}, // Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR + {0x0A75, 0x0A75, prExtend}, // Mn GURMUKHI SIGN YAKASH + {0x0A81, 0x0A82, prExtend}, // Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA + {0x0A83, 0x0A83, prExtend}, // Mc GUJARATI SIGN VISARGA + {0x0A85, 0x0A8D, prOLetter}, // Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E + {0x0A8F, 0x0A91, prOLetter}, // Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O + {0x0A93, 0x0AA8, prOLetter}, // Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA + {0x0AAA, 0x0AB0, prOLetter}, // Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA + {0x0AB2, 0x0AB3, prOLetter}, // Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA + {0x0AB5, 0x0AB9, prOLetter}, // Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA + {0x0ABC, 0x0ABC, prExtend}, // Mn GUJARATI SIGN NUKTA + {0x0ABD, 0x0ABD, prOLetter}, // Lo GUJARATI SIGN AVAGRAHA + {0x0ABE, 0x0AC0, prExtend}, // Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II + {0x0AC1, 0x0AC5, prExtend}, // Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E + {0x0AC7, 0x0AC8, prExtend}, // Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI + {0x0AC9, 0x0AC9, prExtend}, // Mc GUJARATI VOWEL SIGN CANDRA O + {0x0ACB, 0x0ACC, prExtend}, // Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU + {0x0ACD, 0x0ACD, prExtend}, // Mn GUJARATI SIGN VIRAMA + {0x0AD0, 0x0AD0, prOLetter}, // Lo GUJARATI OM + {0x0AE0, 0x0AE1, prOLetter}, // Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL + {0x0AE2, 0x0AE3, prExtend}, // Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL + {0x0AE6, 0x0AEF, prNumeric}, // Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE + {0x0AF9, 0x0AF9, prOLetter}, // Lo GUJARATI LETTER ZHA + {0x0AFA, 0x0AFF, prExtend}, // Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE + {0x0B01, 0x0B01, prExtend}, // Mn ORIYA SIGN CANDRABINDU + {0x0B02, 0x0B03, prExtend}, // Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA + {0x0B05, 0x0B0C, prOLetter}, // Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L + {0x0B0F, 0x0B10, prOLetter}, // Lo [2] ORIYA LETTER E..ORIYA LETTER AI + {0x0B13, 0x0B28, prOLetter}, // Lo [22] ORIYA LETTER O..ORIYA LETTER NA + {0x0B2A, 0x0B30, prOLetter}, // Lo [7] ORIYA LETTER PA..ORIYA LETTER RA + {0x0B32, 0x0B33, prOLetter}, // Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA + {0x0B35, 0x0B39, prOLetter}, // Lo [5] ORIYA LETTER VA..ORIYA LETTER HA + {0x0B3C, 0x0B3C, prExtend}, // Mn ORIYA SIGN NUKTA + {0x0B3D, 0x0B3D, prOLetter}, // Lo ORIYA SIGN AVAGRAHA + {0x0B3E, 0x0B3E, prExtend}, // Mc ORIYA VOWEL SIGN AA + {0x0B3F, 0x0B3F, prExtend}, // Mn ORIYA VOWEL SIGN I + {0x0B40, 0x0B40, prExtend}, // Mc ORIYA VOWEL SIGN II + {0x0B41, 0x0B44, prExtend}, // Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR + {0x0B47, 0x0B48, prExtend}, // Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI + {0x0B4B, 0x0B4C, prExtend}, // Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU + {0x0B4D, 0x0B4D, prExtend}, // Mn ORIYA SIGN VIRAMA + {0x0B55, 0x0B56, prExtend}, // Mn [2] ORIYA SIGN OVERLINE..ORIYA AI LENGTH MARK + {0x0B57, 0x0B57, prExtend}, // Mc ORIYA AU LENGTH MARK + {0x0B5C, 0x0B5D, prOLetter}, // Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA + {0x0B5F, 0x0B61, prOLetter}, // Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL + {0x0B62, 0x0B63, prExtend}, // Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL + {0x0B66, 0x0B6F, prNumeric}, // Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE + {0x0B71, 0x0B71, prOLetter}, // Lo ORIYA LETTER WA + {0x0B82, 0x0B82, prExtend}, // Mn TAMIL SIGN ANUSVARA + {0x0B83, 0x0B83, prOLetter}, // Lo TAMIL SIGN VISARGA + {0x0B85, 0x0B8A, prOLetter}, // Lo [6] TAMIL LETTER A..TAMIL LETTER UU + {0x0B8E, 0x0B90, prOLetter}, // Lo [3] TAMIL LETTER E..TAMIL LETTER AI + {0x0B92, 0x0B95, prOLetter}, // Lo [4] TAMIL LETTER O..TAMIL LETTER KA + {0x0B99, 0x0B9A, prOLetter}, // Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA + {0x0B9C, 0x0B9C, prOLetter}, // Lo TAMIL LETTER JA + {0x0B9E, 0x0B9F, prOLetter}, // Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA + {0x0BA3, 0x0BA4, prOLetter}, // Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA + {0x0BA8, 0x0BAA, prOLetter}, // Lo [3] TAMIL LETTER NA..TAMIL LETTER PA + {0x0BAE, 0x0BB9, prOLetter}, // Lo [12] TAMIL LETTER MA..TAMIL LETTER HA + {0x0BBE, 0x0BBF, prExtend}, // Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I + {0x0BC0, 0x0BC0, prExtend}, // Mn TAMIL VOWEL SIGN II + {0x0BC1, 0x0BC2, prExtend}, // Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU + {0x0BC6, 0x0BC8, prExtend}, // Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI + {0x0BCA, 0x0BCC, prExtend}, // Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU + {0x0BCD, 0x0BCD, prExtend}, // Mn TAMIL SIGN VIRAMA + {0x0BD0, 0x0BD0, prOLetter}, // Lo TAMIL OM + {0x0BD7, 0x0BD7, prExtend}, // Mc TAMIL AU LENGTH MARK + {0x0BE6, 0x0BEF, prNumeric}, // Nd [10] TAMIL DIGIT ZERO..TAMIL DIGIT NINE + {0x0C00, 0x0C00, prExtend}, // Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE + {0x0C01, 0x0C03, prExtend}, // Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA + {0x0C04, 0x0C04, prExtend}, // Mn TELUGU SIGN COMBINING ANUSVARA ABOVE + {0x0C05, 0x0C0C, prOLetter}, // Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L + {0x0C0E, 0x0C10, prOLetter}, // Lo [3] TELUGU LETTER E..TELUGU LETTER AI + {0x0C12, 0x0C28, prOLetter}, // Lo [23] TELUGU LETTER O..TELUGU LETTER NA + {0x0C2A, 0x0C39, prOLetter}, // Lo [16] TELUGU LETTER PA..TELUGU LETTER HA + {0x0C3C, 0x0C3C, prExtend}, // Mn TELUGU SIGN NUKTA + {0x0C3D, 0x0C3D, prOLetter}, // Lo TELUGU SIGN AVAGRAHA + {0x0C3E, 0x0C40, prExtend}, // Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II + {0x0C41, 0x0C44, prExtend}, // Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR + {0x0C46, 0x0C48, prExtend}, // Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI + {0x0C4A, 0x0C4D, prExtend}, // Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA + {0x0C55, 0x0C56, prExtend}, // Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK + {0x0C58, 0x0C5A, prOLetter}, // Lo [3] TELUGU LETTER TSA..TELUGU LETTER RRRA + {0x0C5D, 0x0C5D, prOLetter}, // Lo TELUGU LETTER NAKAARA POLLU + {0x0C60, 0x0C61, prOLetter}, // Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL + {0x0C62, 0x0C63, prExtend}, // Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL + {0x0C66, 0x0C6F, prNumeric}, // Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE + {0x0C80, 0x0C80, prOLetter}, // Lo KANNADA SIGN SPACING CANDRABINDU + {0x0C81, 0x0C81, prExtend}, // Mn KANNADA SIGN CANDRABINDU + {0x0C82, 0x0C83, prExtend}, // Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA + {0x0C85, 0x0C8C, prOLetter}, // Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L + {0x0C8E, 0x0C90, prOLetter}, // Lo [3] KANNADA LETTER E..KANNADA LETTER AI + {0x0C92, 0x0CA8, prOLetter}, // Lo [23] KANNADA LETTER O..KANNADA LETTER NA + {0x0CAA, 0x0CB3, prOLetter}, // Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA + {0x0CB5, 0x0CB9, prOLetter}, // Lo [5] KANNADA LETTER VA..KANNADA LETTER HA + {0x0CBC, 0x0CBC, prExtend}, // Mn KANNADA SIGN NUKTA + {0x0CBD, 0x0CBD, prOLetter}, // Lo KANNADA SIGN AVAGRAHA + {0x0CBE, 0x0CBE, prExtend}, // Mc KANNADA VOWEL SIGN AA + {0x0CBF, 0x0CBF, prExtend}, // Mn KANNADA VOWEL SIGN I + {0x0CC0, 0x0CC4, prExtend}, // Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR + {0x0CC6, 0x0CC6, prExtend}, // Mn KANNADA VOWEL SIGN E + {0x0CC7, 0x0CC8, prExtend}, // Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI + {0x0CCA, 0x0CCB, prExtend}, // Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO + {0x0CCC, 0x0CCD, prExtend}, // Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA + {0x0CD5, 0x0CD6, prExtend}, // Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK + {0x0CDD, 0x0CDE, prOLetter}, // Lo [2] KANNADA LETTER NAKAARA POLLU..KANNADA LETTER FA + {0x0CE0, 0x0CE1, prOLetter}, // Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL + {0x0CE2, 0x0CE3, prExtend}, // Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL + {0x0CE6, 0x0CEF, prNumeric}, // Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE + {0x0CF1, 0x0CF2, prOLetter}, // Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA + {0x0D00, 0x0D01, prExtend}, // Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU + {0x0D02, 0x0D03, prExtend}, // Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA + {0x0D04, 0x0D0C, prOLetter}, // Lo [9] MALAYALAM LETTER VEDIC ANUSVARA..MALAYALAM LETTER VOCALIC L + {0x0D0E, 0x0D10, prOLetter}, // Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI + {0x0D12, 0x0D3A, prOLetter}, // Lo [41] MALAYALAM LETTER O..MALAYALAM LETTER TTTA + {0x0D3B, 0x0D3C, prExtend}, // Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA + {0x0D3D, 0x0D3D, prOLetter}, // Lo MALAYALAM SIGN AVAGRAHA + {0x0D3E, 0x0D40, prExtend}, // Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II + {0x0D41, 0x0D44, prExtend}, // Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR + {0x0D46, 0x0D48, prExtend}, // Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI + {0x0D4A, 0x0D4C, prExtend}, // Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU + {0x0D4D, 0x0D4D, prExtend}, // Mn MALAYALAM SIGN VIRAMA + {0x0D4E, 0x0D4E, prOLetter}, // Lo MALAYALAM LETTER DOT REPH + {0x0D54, 0x0D56, prOLetter}, // Lo [3] MALAYALAM LETTER CHILLU M..MALAYALAM LETTER CHILLU LLL + {0x0D57, 0x0D57, prExtend}, // Mc MALAYALAM AU LENGTH MARK + {0x0D5F, 0x0D61, prOLetter}, // Lo [3] MALAYALAM LETTER ARCHAIC II..MALAYALAM LETTER VOCALIC LL + {0x0D62, 0x0D63, prExtend}, // Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL + {0x0D66, 0x0D6F, prNumeric}, // Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE + {0x0D7A, 0x0D7F, prOLetter}, // Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K + {0x0D81, 0x0D81, prExtend}, // Mn SINHALA SIGN CANDRABINDU + {0x0D82, 0x0D83, prExtend}, // Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA + {0x0D85, 0x0D96, prOLetter}, // Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA + {0x0D9A, 0x0DB1, prOLetter}, // Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA + {0x0DB3, 0x0DBB, prOLetter}, // Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA + {0x0DBD, 0x0DBD, prOLetter}, // Lo SINHALA LETTER DANTAJA LAYANNA + {0x0DC0, 0x0DC6, prOLetter}, // Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA + {0x0DCA, 0x0DCA, prExtend}, // Mn SINHALA SIGN AL-LAKUNA + {0x0DCF, 0x0DD1, prExtend}, // Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA + {0x0DD2, 0x0DD4, prExtend}, // Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA + {0x0DD6, 0x0DD6, prExtend}, // Mn SINHALA VOWEL SIGN DIGA PAA-PILLA + {0x0DD8, 0x0DDF, prExtend}, // Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA + {0x0DE6, 0x0DEF, prNumeric}, // Nd [10] SINHALA LITH DIGIT ZERO..SINHALA LITH DIGIT NINE + {0x0DF2, 0x0DF3, prExtend}, // Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA + {0x0E01, 0x0E30, prOLetter}, // Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A + {0x0E31, 0x0E31, prExtend}, // Mn THAI CHARACTER MAI HAN-AKAT + {0x0E32, 0x0E33, prOLetter}, // Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM + {0x0E34, 0x0E3A, prExtend}, // Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU + {0x0E40, 0x0E45, prOLetter}, // Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO + {0x0E46, 0x0E46, prOLetter}, // Lm THAI CHARACTER MAIYAMOK + {0x0E47, 0x0E4E, prExtend}, // Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN + {0x0E50, 0x0E59, prNumeric}, // Nd [10] THAI DIGIT ZERO..THAI DIGIT NINE + {0x0E81, 0x0E82, prOLetter}, // Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG + {0x0E84, 0x0E84, prOLetter}, // Lo LAO LETTER KHO TAM + {0x0E86, 0x0E8A, prOLetter}, // Lo [5] LAO LETTER PALI GHA..LAO LETTER SO TAM + {0x0E8C, 0x0EA3, prOLetter}, // Lo [24] LAO LETTER PALI JHA..LAO LETTER LO LING + {0x0EA5, 0x0EA5, prOLetter}, // Lo LAO LETTER LO LOOT + {0x0EA7, 0x0EB0, prOLetter}, // Lo [10] LAO LETTER WO..LAO VOWEL SIGN A + {0x0EB1, 0x0EB1, prExtend}, // Mn LAO VOWEL SIGN MAI KAN + {0x0EB2, 0x0EB3, prOLetter}, // Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM + {0x0EB4, 0x0EBC, prExtend}, // Mn [9] LAO VOWEL SIGN I..LAO SEMIVOWEL SIGN LO + {0x0EBD, 0x0EBD, prOLetter}, // Lo LAO SEMIVOWEL SIGN NYO + {0x0EC0, 0x0EC4, prOLetter}, // Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI + {0x0EC6, 0x0EC6, prOLetter}, // Lm LAO KO LA + {0x0EC8, 0x0ECD, prExtend}, // Mn [6] LAO TONE MAI EK..LAO NIGGAHITA + {0x0ED0, 0x0ED9, prNumeric}, // Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE + {0x0EDC, 0x0EDF, prOLetter}, // Lo [4] LAO HO NO..LAO LETTER KHMU NYO + {0x0F00, 0x0F00, prOLetter}, // Lo TIBETAN SYLLABLE OM + {0x0F18, 0x0F19, prExtend}, // Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS + {0x0F20, 0x0F29, prNumeric}, // Nd [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE + {0x0F35, 0x0F35, prExtend}, // Mn TIBETAN MARK NGAS BZUNG NYI ZLA + {0x0F37, 0x0F37, prExtend}, // Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS + {0x0F39, 0x0F39, prExtend}, // Mn TIBETAN MARK TSA -PHRU + {0x0F3A, 0x0F3A, prClose}, // Ps TIBETAN MARK GUG RTAGS GYON + {0x0F3B, 0x0F3B, prClose}, // Pe TIBETAN MARK GUG RTAGS GYAS + {0x0F3C, 0x0F3C, prClose}, // Ps TIBETAN MARK ANG KHANG GYON + {0x0F3D, 0x0F3D, prClose}, // Pe TIBETAN MARK ANG KHANG GYAS + {0x0F3E, 0x0F3F, prExtend}, // Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES + {0x0F40, 0x0F47, prOLetter}, // Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA + {0x0F49, 0x0F6C, prOLetter}, // Lo [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA + {0x0F71, 0x0F7E, prExtend}, // Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO + {0x0F7F, 0x0F7F, prExtend}, // Mc TIBETAN SIGN RNAM BCAD + {0x0F80, 0x0F84, prExtend}, // Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA + {0x0F86, 0x0F87, prExtend}, // Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS + {0x0F88, 0x0F8C, prOLetter}, // Lo [5] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN INVERTED MCHU CAN + {0x0F8D, 0x0F97, prExtend}, // Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA + {0x0F99, 0x0FBC, prExtend}, // Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA + {0x0FC6, 0x0FC6, prExtend}, // Mn TIBETAN SYMBOL PADMA GDAN + {0x1000, 0x102A, prOLetter}, // Lo [43] MYANMAR LETTER KA..MYANMAR LETTER AU + {0x102B, 0x102C, prExtend}, // Mc [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA + {0x102D, 0x1030, prExtend}, // Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU + {0x1031, 0x1031, prExtend}, // Mc MYANMAR VOWEL SIGN E + {0x1032, 0x1037, prExtend}, // Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW + {0x1038, 0x1038, prExtend}, // Mc MYANMAR SIGN VISARGA + {0x1039, 0x103A, prExtend}, // Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT + {0x103B, 0x103C, prExtend}, // Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA + {0x103D, 0x103E, prExtend}, // Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA + {0x103F, 0x103F, prOLetter}, // Lo MYANMAR LETTER GREAT SA + {0x1040, 0x1049, prNumeric}, // Nd [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE + {0x104A, 0x104B, prSTerm}, // Po [2] MYANMAR SIGN LITTLE SECTION..MYANMAR SIGN SECTION + {0x1050, 0x1055, prOLetter}, // Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL + {0x1056, 0x1057, prExtend}, // Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR + {0x1058, 0x1059, prExtend}, // Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL + {0x105A, 0x105D, prOLetter}, // Lo [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE + {0x105E, 0x1060, prExtend}, // Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA + {0x1061, 0x1061, prOLetter}, // Lo MYANMAR LETTER SGAW KAREN SHA + {0x1062, 0x1064, prExtend}, // Mc [3] MYANMAR VOWEL SIGN SGAW KAREN EU..MYANMAR TONE MARK SGAW KAREN KE PHO + {0x1065, 0x1066, prOLetter}, // Lo [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA + {0x1067, 0x106D, prExtend}, // Mc [7] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR SIGN WESTERN PWO KAREN TONE-5 + {0x106E, 0x1070, prOLetter}, // Lo [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA + {0x1071, 0x1074, prExtend}, // Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE + {0x1075, 0x1081, prOLetter}, // Lo [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA + {0x1082, 0x1082, prExtend}, // Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA + {0x1083, 0x1084, prExtend}, // Mc [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E + {0x1085, 0x1086, prExtend}, // Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y + {0x1087, 0x108C, prExtend}, // Mc [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3 + {0x108D, 0x108D, prExtend}, // Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE + {0x108E, 0x108E, prOLetter}, // Lo MYANMAR LETTER RUMAI PALAUNG FA + {0x108F, 0x108F, prExtend}, // Mc MYANMAR SIGN RUMAI PALAUNG TONE-5 + {0x1090, 0x1099, prNumeric}, // Nd [10] MYANMAR SHAN DIGIT ZERO..MYANMAR SHAN DIGIT NINE + {0x109A, 0x109C, prExtend}, // Mc [3] MYANMAR SIGN KHAMTI TONE-1..MYANMAR VOWEL SIGN AITON A + {0x109D, 0x109D, prExtend}, // Mn MYANMAR VOWEL SIGN AITON AI + {0x10A0, 0x10C5, prUpper}, // L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE + {0x10C7, 0x10C7, prUpper}, // L& GEORGIAN CAPITAL LETTER YN + {0x10CD, 0x10CD, prUpper}, // L& GEORGIAN CAPITAL LETTER AEN + {0x10D0, 0x10FA, prOLetter}, // L& [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN + {0x10FC, 0x10FC, prOLetter}, // Lm MODIFIER LETTER GEORGIAN NAR + {0x10FD, 0x10FF, prOLetter}, // L& [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN + {0x1100, 0x1248, prOLetter}, // Lo [329] HANGUL CHOSEONG KIYEOK..ETHIOPIC SYLLABLE QWA + {0x124A, 0x124D, prOLetter}, // Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE + {0x1250, 0x1256, prOLetter}, // Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO + {0x1258, 0x1258, prOLetter}, // Lo ETHIOPIC SYLLABLE QHWA + {0x125A, 0x125D, prOLetter}, // Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE + {0x1260, 0x1288, prOLetter}, // Lo [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA + {0x128A, 0x128D, prOLetter}, // Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE + {0x1290, 0x12B0, prOLetter}, // Lo [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA + {0x12B2, 0x12B5, prOLetter}, // Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE + {0x12B8, 0x12BE, prOLetter}, // Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO + {0x12C0, 0x12C0, prOLetter}, // Lo ETHIOPIC SYLLABLE KXWA + {0x12C2, 0x12C5, prOLetter}, // Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE + {0x12C8, 0x12D6, prOLetter}, // Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O + {0x12D8, 0x1310, prOLetter}, // Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA + {0x1312, 0x1315, prOLetter}, // Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE + {0x1318, 0x135A, prOLetter}, // Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA + {0x135D, 0x135F, prExtend}, // Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK + {0x1362, 0x1362, prSTerm}, // Po ETHIOPIC FULL STOP + {0x1367, 0x1368, prSTerm}, // Po [2] ETHIOPIC QUESTION MARK..ETHIOPIC PARAGRAPH SEPARATOR + {0x1380, 0x138F, prOLetter}, // Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE + {0x13A0, 0x13F5, prUpper}, // L& [86] CHEROKEE LETTER A..CHEROKEE LETTER MV + {0x13F8, 0x13FD, prLower}, // L& [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV + {0x1401, 0x166C, prOLetter}, // Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA + {0x166E, 0x166E, prSTerm}, // Po CANADIAN SYLLABICS FULL STOP + {0x166F, 0x167F, prOLetter}, // Lo [17] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS BLACKFOOT W + {0x1680, 0x1680, prSp}, // Zs OGHAM SPACE MARK + {0x1681, 0x169A, prOLetter}, // Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH + {0x169B, 0x169B, prClose}, // Ps OGHAM FEATHER MARK + {0x169C, 0x169C, prClose}, // Pe OGHAM REVERSED FEATHER MARK + {0x16A0, 0x16EA, prOLetter}, // Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X + {0x16EE, 0x16F0, prOLetter}, // Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL + {0x16F1, 0x16F8, prOLetter}, // Lo [8] RUNIC LETTER K..RUNIC LETTER FRANKS CASKET AESC + {0x1700, 0x1711, prOLetter}, // Lo [18] TAGALOG LETTER A..TAGALOG LETTER HA + {0x1712, 0x1714, prExtend}, // Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA + {0x1715, 0x1715, prExtend}, // Mc TAGALOG SIGN PAMUDPOD + {0x171F, 0x1731, prOLetter}, // Lo [19] TAGALOG LETTER ARCHAIC RA..HANUNOO LETTER HA + {0x1732, 0x1733, prExtend}, // Mn [2] HANUNOO VOWEL SIGN I..HANUNOO VOWEL SIGN U + {0x1734, 0x1734, prExtend}, // Mc HANUNOO SIGN PAMUDPOD + {0x1735, 0x1736, prSTerm}, // Po [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION + {0x1740, 0x1751, prOLetter}, // Lo [18] BUHID LETTER A..BUHID LETTER HA + {0x1752, 0x1753, prExtend}, // Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U + {0x1760, 0x176C, prOLetter}, // Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA + {0x176E, 0x1770, prOLetter}, // Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA + {0x1772, 0x1773, prExtend}, // Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U + {0x1780, 0x17B3, prOLetter}, // Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU + {0x17B4, 0x17B5, prExtend}, // Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA + {0x17B6, 0x17B6, prExtend}, // Mc KHMER VOWEL SIGN AA + {0x17B7, 0x17BD, prExtend}, // Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA + {0x17BE, 0x17C5, prExtend}, // Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU + {0x17C6, 0x17C6, prExtend}, // Mn KHMER SIGN NIKAHIT + {0x17C7, 0x17C8, prExtend}, // Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU + {0x17C9, 0x17D3, prExtend}, // Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT + {0x17D7, 0x17D7, prOLetter}, // Lm KHMER SIGN LEK TOO + {0x17DC, 0x17DC, prOLetter}, // Lo KHMER SIGN AVAKRAHASANYA + {0x17DD, 0x17DD, prExtend}, // Mn KHMER SIGN ATTHACAN + {0x17E0, 0x17E9, prNumeric}, // Nd [10] KHMER DIGIT ZERO..KHMER DIGIT NINE + {0x1802, 0x1802, prSContinue}, // Po MONGOLIAN COMMA + {0x1803, 0x1803, prSTerm}, // Po MONGOLIAN FULL STOP + {0x1808, 0x1808, prSContinue}, // Po MONGOLIAN MANCHU COMMA + {0x1809, 0x1809, prSTerm}, // Po MONGOLIAN MANCHU FULL STOP + {0x180B, 0x180D, prExtend}, // Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE + {0x180E, 0x180E, prFormat}, // Cf MONGOLIAN VOWEL SEPARATOR + {0x180F, 0x180F, prExtend}, // Mn MONGOLIAN FREE VARIATION SELECTOR FOUR + {0x1810, 0x1819, prNumeric}, // Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE + {0x1820, 0x1842, prOLetter}, // Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI + {0x1843, 0x1843, prOLetter}, // Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN + {0x1844, 0x1878, prOLetter}, // Lo [53] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER CHA WITH TWO DOTS + {0x1880, 0x1884, prOLetter}, // Lo [5] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI INVERTED UBADAMA + {0x1885, 0x1886, prExtend}, // Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA + {0x1887, 0x18A8, prOLetter}, // Lo [34] MONGOLIAN LETTER ALI GALI A..MONGOLIAN LETTER MANCHU ALI GALI BHA + {0x18A9, 0x18A9, prExtend}, // Mn MONGOLIAN LETTER ALI GALI DAGALGA + {0x18AA, 0x18AA, prOLetter}, // Lo MONGOLIAN LETTER MANCHU ALI GALI LHA + {0x18B0, 0x18F5, prOLetter}, // Lo [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S + {0x1900, 0x191E, prOLetter}, // Lo [31] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER TRA + {0x1920, 0x1922, prExtend}, // Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U + {0x1923, 0x1926, prExtend}, // Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU + {0x1927, 0x1928, prExtend}, // Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O + {0x1929, 0x192B, prExtend}, // Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA + {0x1930, 0x1931, prExtend}, // Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA + {0x1932, 0x1932, prExtend}, // Mn LIMBU SMALL LETTER ANUSVARA + {0x1933, 0x1938, prExtend}, // Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA + {0x1939, 0x193B, prExtend}, // Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I + {0x1944, 0x1945, prSTerm}, // Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK + {0x1946, 0x194F, prNumeric}, // Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE + {0x1950, 0x196D, prOLetter}, // Lo [30] TAI LE LETTER KA..TAI LE LETTER AI + {0x1970, 0x1974, prOLetter}, // Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 + {0x1980, 0x19AB, prOLetter}, // Lo [44] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW SUA + {0x19B0, 0x19C9, prOLetter}, // Lo [26] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE TONE MARK-2 + {0x19D0, 0x19D9, prNumeric}, // Nd [10] NEW TAI LUE DIGIT ZERO..NEW TAI LUE DIGIT NINE + {0x1A00, 0x1A16, prOLetter}, // Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA + {0x1A17, 0x1A18, prExtend}, // Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U + {0x1A19, 0x1A1A, prExtend}, // Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O + {0x1A1B, 0x1A1B, prExtend}, // Mn BUGINESE VOWEL SIGN AE + {0x1A20, 0x1A54, prOLetter}, // Lo [53] TAI THAM LETTER HIGH KA..TAI THAM LETTER GREAT SA + {0x1A55, 0x1A55, prExtend}, // Mc TAI THAM CONSONANT SIGN MEDIAL RA + {0x1A56, 0x1A56, prExtend}, // Mn TAI THAM CONSONANT SIGN MEDIAL LA + {0x1A57, 0x1A57, prExtend}, // Mc TAI THAM CONSONANT SIGN LA TANG LAI + {0x1A58, 0x1A5E, prExtend}, // Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA + {0x1A60, 0x1A60, prExtend}, // Mn TAI THAM SIGN SAKOT + {0x1A61, 0x1A61, prExtend}, // Mc TAI THAM VOWEL SIGN A + {0x1A62, 0x1A62, prExtend}, // Mn TAI THAM VOWEL SIGN MAI SAT + {0x1A63, 0x1A64, prExtend}, // Mc [2] TAI THAM VOWEL SIGN AA..TAI THAM VOWEL SIGN TALL AA + {0x1A65, 0x1A6C, prExtend}, // Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW + {0x1A6D, 0x1A72, prExtend}, // Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI + {0x1A73, 0x1A7C, prExtend}, // Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN + {0x1A7F, 0x1A7F, prExtend}, // Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT + {0x1A80, 0x1A89, prNumeric}, // Nd [10] TAI THAM HORA DIGIT ZERO..TAI THAM HORA DIGIT NINE + {0x1A90, 0x1A99, prNumeric}, // Nd [10] TAI THAM THAM DIGIT ZERO..TAI THAM THAM DIGIT NINE + {0x1AA7, 0x1AA7, prOLetter}, // Lm TAI THAM SIGN MAI YAMOK + {0x1AA8, 0x1AAB, prSTerm}, // Po [4] TAI THAM SIGN KAAN..TAI THAM SIGN SATKAANKUU + {0x1AB0, 0x1ABD, prExtend}, // Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW + {0x1ABE, 0x1ABE, prExtend}, // Me COMBINING PARENTHESES OVERLAY + {0x1ABF, 0x1ACE, prExtend}, // Mn [16] COMBINING LATIN SMALL LETTER W BELOW..COMBINING LATIN SMALL LETTER INSULAR T + {0x1B00, 0x1B03, prExtend}, // Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG + {0x1B04, 0x1B04, prExtend}, // Mc BALINESE SIGN BISAH + {0x1B05, 0x1B33, prOLetter}, // Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA + {0x1B34, 0x1B34, prExtend}, // Mn BALINESE SIGN REREKAN + {0x1B35, 0x1B35, prExtend}, // Mc BALINESE VOWEL SIGN TEDUNG + {0x1B36, 0x1B3A, prExtend}, // Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA + {0x1B3B, 0x1B3B, prExtend}, // Mc BALINESE VOWEL SIGN RA REPA TEDUNG + {0x1B3C, 0x1B3C, prExtend}, // Mn BALINESE VOWEL SIGN LA LENGA + {0x1B3D, 0x1B41, prExtend}, // Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG + {0x1B42, 0x1B42, prExtend}, // Mn BALINESE VOWEL SIGN PEPET + {0x1B43, 0x1B44, prExtend}, // Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG + {0x1B45, 0x1B4C, prOLetter}, // Lo [8] BALINESE LETTER KAF SASAK..BALINESE LETTER ARCHAIC JNYA + {0x1B50, 0x1B59, prNumeric}, // Nd [10] BALINESE DIGIT ZERO..BALINESE DIGIT NINE + {0x1B5A, 0x1B5B, prSTerm}, // Po [2] BALINESE PANTI..BALINESE PAMADA + {0x1B5E, 0x1B5F, prSTerm}, // Po [2] BALINESE CARIK SIKI..BALINESE CARIK PAREREN + {0x1B6B, 0x1B73, prExtend}, // Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG + {0x1B7D, 0x1B7E, prSTerm}, // Po [2] BALINESE PANTI LANTANG..BALINESE PAMADA LANTANG + {0x1B80, 0x1B81, prExtend}, // Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR + {0x1B82, 0x1B82, prExtend}, // Mc SUNDANESE SIGN PANGWISAD + {0x1B83, 0x1BA0, prOLetter}, // Lo [30] SUNDANESE LETTER A..SUNDANESE LETTER HA + {0x1BA1, 0x1BA1, prExtend}, // Mc SUNDANESE CONSONANT SIGN PAMINGKAL + {0x1BA2, 0x1BA5, prExtend}, // Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU + {0x1BA6, 0x1BA7, prExtend}, // Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG + {0x1BA8, 0x1BA9, prExtend}, // Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG + {0x1BAA, 0x1BAA, prExtend}, // Mc SUNDANESE SIGN PAMAAEH + {0x1BAB, 0x1BAD, prExtend}, // Mn [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA + {0x1BAE, 0x1BAF, prOLetter}, // Lo [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA + {0x1BB0, 0x1BB9, prNumeric}, // Nd [10] SUNDANESE DIGIT ZERO..SUNDANESE DIGIT NINE + {0x1BBA, 0x1BE5, prOLetter}, // Lo [44] SUNDANESE AVAGRAHA..BATAK LETTER U + {0x1BE6, 0x1BE6, prExtend}, // Mn BATAK SIGN TOMPI + {0x1BE7, 0x1BE7, prExtend}, // Mc BATAK VOWEL SIGN E + {0x1BE8, 0x1BE9, prExtend}, // Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE + {0x1BEA, 0x1BEC, prExtend}, // Mc [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O + {0x1BED, 0x1BED, prExtend}, // Mn BATAK VOWEL SIGN KARO O + {0x1BEE, 0x1BEE, prExtend}, // Mc BATAK VOWEL SIGN U + {0x1BEF, 0x1BF1, prExtend}, // Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H + {0x1BF2, 0x1BF3, prExtend}, // Mc [2] BATAK PANGOLAT..BATAK PANONGONAN + {0x1C00, 0x1C23, prOLetter}, // Lo [36] LEPCHA LETTER KA..LEPCHA LETTER A + {0x1C24, 0x1C2B, prExtend}, // Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU + {0x1C2C, 0x1C33, prExtend}, // Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T + {0x1C34, 0x1C35, prExtend}, // Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG + {0x1C36, 0x1C37, prExtend}, // Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA + {0x1C3B, 0x1C3C, prSTerm}, // Po [2] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION NYET THYOOM TA-ROL + {0x1C40, 0x1C49, prNumeric}, // Nd [10] LEPCHA DIGIT ZERO..LEPCHA DIGIT NINE + {0x1C4D, 0x1C4F, prOLetter}, // Lo [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA + {0x1C50, 0x1C59, prNumeric}, // Nd [10] OL CHIKI DIGIT ZERO..OL CHIKI DIGIT NINE + {0x1C5A, 0x1C77, prOLetter}, // Lo [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH + {0x1C78, 0x1C7D, prOLetter}, // Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD + {0x1C7E, 0x1C7F, prSTerm}, // Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD + {0x1C80, 0x1C88, prLower}, // L& [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK + {0x1C90, 0x1CBA, prOLetter}, // L& [43] GEORGIAN MTAVRULI CAPITAL LETTER AN..GEORGIAN MTAVRULI CAPITAL LETTER AIN + {0x1CBD, 0x1CBF, prOLetter}, // L& [3] GEORGIAN MTAVRULI CAPITAL LETTER AEN..GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN + {0x1CD0, 0x1CD2, prExtend}, // Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA + {0x1CD4, 0x1CE0, prExtend}, // Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA + {0x1CE1, 0x1CE1, prExtend}, // Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA + {0x1CE2, 0x1CE8, prExtend}, // Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL + {0x1CE9, 0x1CEC, prOLetter}, // Lo [4] VEDIC SIGN ANUSVARA ANTARGOMUKHA..VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL + {0x1CED, 0x1CED, prExtend}, // Mn VEDIC SIGN TIRYAK + {0x1CEE, 0x1CF3, prOLetter}, // Lo [6] VEDIC SIGN HEXIFORM LONG ANUSVARA..VEDIC SIGN ROTATED ARDHAVISARGA + {0x1CF4, 0x1CF4, prExtend}, // Mn VEDIC TONE CANDRA ABOVE + {0x1CF5, 0x1CF6, prOLetter}, // Lo [2] VEDIC SIGN JIHVAMULIYA..VEDIC SIGN UPADHMANIYA + {0x1CF7, 0x1CF7, prExtend}, // Mc VEDIC SIGN ATIKRAMA + {0x1CF8, 0x1CF9, prExtend}, // Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE + {0x1CFA, 0x1CFA, prOLetter}, // Lo VEDIC SIGN DOUBLE ANUSVARA ANTARGOMUKHA + {0x1D00, 0x1D2B, prLower}, // L& [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL + {0x1D2C, 0x1D6A, prLower}, // Lm [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI + {0x1D6B, 0x1D77, prLower}, // L& [13] LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G + {0x1D78, 0x1D78, prLower}, // Lm MODIFIER LETTER CYRILLIC EN + {0x1D79, 0x1D9A, prLower}, // L& [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK + {0x1D9B, 0x1DBF, prLower}, // Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA + {0x1DC0, 0x1DFF, prExtend}, // Mn [64] COMBINING DOTTED GRAVE ACCENT..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW + {0x1E00, 0x1E00, prUpper}, // L& LATIN CAPITAL LETTER A WITH RING BELOW + {0x1E01, 0x1E01, prLower}, // L& LATIN SMALL LETTER A WITH RING BELOW + {0x1E02, 0x1E02, prUpper}, // L& LATIN CAPITAL LETTER B WITH DOT ABOVE + {0x1E03, 0x1E03, prLower}, // L& LATIN SMALL LETTER B WITH DOT ABOVE + {0x1E04, 0x1E04, prUpper}, // L& LATIN CAPITAL LETTER B WITH DOT BELOW + {0x1E05, 0x1E05, prLower}, // L& LATIN SMALL LETTER B WITH DOT BELOW + {0x1E06, 0x1E06, prUpper}, // L& LATIN CAPITAL LETTER B WITH LINE BELOW + {0x1E07, 0x1E07, prLower}, // L& LATIN SMALL LETTER B WITH LINE BELOW + {0x1E08, 0x1E08, prUpper}, // L& LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE + {0x1E09, 0x1E09, prLower}, // L& LATIN SMALL LETTER C WITH CEDILLA AND ACUTE + {0x1E0A, 0x1E0A, prUpper}, // L& LATIN CAPITAL LETTER D WITH DOT ABOVE + {0x1E0B, 0x1E0B, prLower}, // L& LATIN SMALL LETTER D WITH DOT ABOVE + {0x1E0C, 0x1E0C, prUpper}, // L& LATIN CAPITAL LETTER D WITH DOT BELOW + {0x1E0D, 0x1E0D, prLower}, // L& LATIN SMALL LETTER D WITH DOT BELOW + {0x1E0E, 0x1E0E, prUpper}, // L& LATIN CAPITAL LETTER D WITH LINE BELOW + {0x1E0F, 0x1E0F, prLower}, // L& LATIN SMALL LETTER D WITH LINE BELOW + {0x1E10, 0x1E10, prUpper}, // L& LATIN CAPITAL LETTER D WITH CEDILLA + {0x1E11, 0x1E11, prLower}, // L& LATIN SMALL LETTER D WITH CEDILLA + {0x1E12, 0x1E12, prUpper}, // L& LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW + {0x1E13, 0x1E13, prLower}, // L& LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW + {0x1E14, 0x1E14, prUpper}, // L& LATIN CAPITAL LETTER E WITH MACRON AND GRAVE + {0x1E15, 0x1E15, prLower}, // L& LATIN SMALL LETTER E WITH MACRON AND GRAVE + {0x1E16, 0x1E16, prUpper}, // L& LATIN CAPITAL LETTER E WITH MACRON AND ACUTE + {0x1E17, 0x1E17, prLower}, // L& LATIN SMALL LETTER E WITH MACRON AND ACUTE + {0x1E18, 0x1E18, prUpper}, // L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW + {0x1E19, 0x1E19, prLower}, // L& LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW + {0x1E1A, 0x1E1A, prUpper}, // L& LATIN CAPITAL LETTER E WITH TILDE BELOW + {0x1E1B, 0x1E1B, prLower}, // L& LATIN SMALL LETTER E WITH TILDE BELOW + {0x1E1C, 0x1E1C, prUpper}, // L& LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE + {0x1E1D, 0x1E1D, prLower}, // L& LATIN SMALL LETTER E WITH CEDILLA AND BREVE + {0x1E1E, 0x1E1E, prUpper}, // L& LATIN CAPITAL LETTER F WITH DOT ABOVE + {0x1E1F, 0x1E1F, prLower}, // L& LATIN SMALL LETTER F WITH DOT ABOVE + {0x1E20, 0x1E20, prUpper}, // L& LATIN CAPITAL LETTER G WITH MACRON + {0x1E21, 0x1E21, prLower}, // L& LATIN SMALL LETTER G WITH MACRON + {0x1E22, 0x1E22, prUpper}, // L& LATIN CAPITAL LETTER H WITH DOT ABOVE + {0x1E23, 0x1E23, prLower}, // L& LATIN SMALL LETTER H WITH DOT ABOVE + {0x1E24, 0x1E24, prUpper}, // L& LATIN CAPITAL LETTER H WITH DOT BELOW + {0x1E25, 0x1E25, prLower}, // L& LATIN SMALL LETTER H WITH DOT BELOW + {0x1E26, 0x1E26, prUpper}, // L& LATIN CAPITAL LETTER H WITH DIAERESIS + {0x1E27, 0x1E27, prLower}, // L& LATIN SMALL LETTER H WITH DIAERESIS + {0x1E28, 0x1E28, prUpper}, // L& LATIN CAPITAL LETTER H WITH CEDILLA + {0x1E29, 0x1E29, prLower}, // L& LATIN SMALL LETTER H WITH CEDILLA + {0x1E2A, 0x1E2A, prUpper}, // L& LATIN CAPITAL LETTER H WITH BREVE BELOW + {0x1E2B, 0x1E2B, prLower}, // L& LATIN SMALL LETTER H WITH BREVE BELOW + {0x1E2C, 0x1E2C, prUpper}, // L& LATIN CAPITAL LETTER I WITH TILDE BELOW + {0x1E2D, 0x1E2D, prLower}, // L& LATIN SMALL LETTER I WITH TILDE BELOW + {0x1E2E, 0x1E2E, prUpper}, // L& LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE + {0x1E2F, 0x1E2F, prLower}, // L& LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE + {0x1E30, 0x1E30, prUpper}, // L& LATIN CAPITAL LETTER K WITH ACUTE + {0x1E31, 0x1E31, prLower}, // L& LATIN SMALL LETTER K WITH ACUTE + {0x1E32, 0x1E32, prUpper}, // L& LATIN CAPITAL LETTER K WITH DOT BELOW + {0x1E33, 0x1E33, prLower}, // L& LATIN SMALL LETTER K WITH DOT BELOW + {0x1E34, 0x1E34, prUpper}, // L& LATIN CAPITAL LETTER K WITH LINE BELOW + {0x1E35, 0x1E35, prLower}, // L& LATIN SMALL LETTER K WITH LINE BELOW + {0x1E36, 0x1E36, prUpper}, // L& LATIN CAPITAL LETTER L WITH DOT BELOW + {0x1E37, 0x1E37, prLower}, // L& LATIN SMALL LETTER L WITH DOT BELOW + {0x1E38, 0x1E38, prUpper}, // L& LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON + {0x1E39, 0x1E39, prLower}, // L& LATIN SMALL LETTER L WITH DOT BELOW AND MACRON + {0x1E3A, 0x1E3A, prUpper}, // L& LATIN CAPITAL LETTER L WITH LINE BELOW + {0x1E3B, 0x1E3B, prLower}, // L& LATIN SMALL LETTER L WITH LINE BELOW + {0x1E3C, 0x1E3C, prUpper}, // L& LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW + {0x1E3D, 0x1E3D, prLower}, // L& LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW + {0x1E3E, 0x1E3E, prUpper}, // L& LATIN CAPITAL LETTER M WITH ACUTE + {0x1E3F, 0x1E3F, prLower}, // L& LATIN SMALL LETTER M WITH ACUTE + {0x1E40, 0x1E40, prUpper}, // L& LATIN CAPITAL LETTER M WITH DOT ABOVE + {0x1E41, 0x1E41, prLower}, // L& LATIN SMALL LETTER M WITH DOT ABOVE + {0x1E42, 0x1E42, prUpper}, // L& LATIN CAPITAL LETTER M WITH DOT BELOW + {0x1E43, 0x1E43, prLower}, // L& LATIN SMALL LETTER M WITH DOT BELOW + {0x1E44, 0x1E44, prUpper}, // L& LATIN CAPITAL LETTER N WITH DOT ABOVE + {0x1E45, 0x1E45, prLower}, // L& LATIN SMALL LETTER N WITH DOT ABOVE + {0x1E46, 0x1E46, prUpper}, // L& LATIN CAPITAL LETTER N WITH DOT BELOW + {0x1E47, 0x1E47, prLower}, // L& LATIN SMALL LETTER N WITH DOT BELOW + {0x1E48, 0x1E48, prUpper}, // L& LATIN CAPITAL LETTER N WITH LINE BELOW + {0x1E49, 0x1E49, prLower}, // L& LATIN SMALL LETTER N WITH LINE BELOW + {0x1E4A, 0x1E4A, prUpper}, // L& LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW + {0x1E4B, 0x1E4B, prLower}, // L& LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW + {0x1E4C, 0x1E4C, prUpper}, // L& LATIN CAPITAL LETTER O WITH TILDE AND ACUTE + {0x1E4D, 0x1E4D, prLower}, // L& LATIN SMALL LETTER O WITH TILDE AND ACUTE + {0x1E4E, 0x1E4E, prUpper}, // L& LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS + {0x1E4F, 0x1E4F, prLower}, // L& LATIN SMALL LETTER O WITH TILDE AND DIAERESIS + {0x1E50, 0x1E50, prUpper}, // L& LATIN CAPITAL LETTER O WITH MACRON AND GRAVE + {0x1E51, 0x1E51, prLower}, // L& LATIN SMALL LETTER O WITH MACRON AND GRAVE + {0x1E52, 0x1E52, prUpper}, // L& LATIN CAPITAL LETTER O WITH MACRON AND ACUTE + {0x1E53, 0x1E53, prLower}, // L& LATIN SMALL LETTER O WITH MACRON AND ACUTE + {0x1E54, 0x1E54, prUpper}, // L& LATIN CAPITAL LETTER P WITH ACUTE + {0x1E55, 0x1E55, prLower}, // L& LATIN SMALL LETTER P WITH ACUTE + {0x1E56, 0x1E56, prUpper}, // L& LATIN CAPITAL LETTER P WITH DOT ABOVE + {0x1E57, 0x1E57, prLower}, // L& LATIN SMALL LETTER P WITH DOT ABOVE + {0x1E58, 0x1E58, prUpper}, // L& LATIN CAPITAL LETTER R WITH DOT ABOVE + {0x1E59, 0x1E59, prLower}, // L& LATIN SMALL LETTER R WITH DOT ABOVE + {0x1E5A, 0x1E5A, prUpper}, // L& LATIN CAPITAL LETTER R WITH DOT BELOW + {0x1E5B, 0x1E5B, prLower}, // L& LATIN SMALL LETTER R WITH DOT BELOW + {0x1E5C, 0x1E5C, prUpper}, // L& LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON + {0x1E5D, 0x1E5D, prLower}, // L& LATIN SMALL LETTER R WITH DOT BELOW AND MACRON + {0x1E5E, 0x1E5E, prUpper}, // L& LATIN CAPITAL LETTER R WITH LINE BELOW + {0x1E5F, 0x1E5F, prLower}, // L& LATIN SMALL LETTER R WITH LINE BELOW + {0x1E60, 0x1E60, prUpper}, // L& LATIN CAPITAL LETTER S WITH DOT ABOVE + {0x1E61, 0x1E61, prLower}, // L& LATIN SMALL LETTER S WITH DOT ABOVE + {0x1E62, 0x1E62, prUpper}, // L& LATIN CAPITAL LETTER S WITH DOT BELOW + {0x1E63, 0x1E63, prLower}, // L& LATIN SMALL LETTER S WITH DOT BELOW + {0x1E64, 0x1E64, prUpper}, // L& LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE + {0x1E65, 0x1E65, prLower}, // L& LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE + {0x1E66, 0x1E66, prUpper}, // L& LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE + {0x1E67, 0x1E67, prLower}, // L& LATIN SMALL LETTER S WITH CARON AND DOT ABOVE + {0x1E68, 0x1E68, prUpper}, // L& LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE + {0x1E69, 0x1E69, prLower}, // L& LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE + {0x1E6A, 0x1E6A, prUpper}, // L& LATIN CAPITAL LETTER T WITH DOT ABOVE + {0x1E6B, 0x1E6B, prLower}, // L& LATIN SMALL LETTER T WITH DOT ABOVE + {0x1E6C, 0x1E6C, prUpper}, // L& LATIN CAPITAL LETTER T WITH DOT BELOW + {0x1E6D, 0x1E6D, prLower}, // L& LATIN SMALL LETTER T WITH DOT BELOW + {0x1E6E, 0x1E6E, prUpper}, // L& LATIN CAPITAL LETTER T WITH LINE BELOW + {0x1E6F, 0x1E6F, prLower}, // L& LATIN SMALL LETTER T WITH LINE BELOW + {0x1E70, 0x1E70, prUpper}, // L& LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW + {0x1E71, 0x1E71, prLower}, // L& LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW + {0x1E72, 0x1E72, prUpper}, // L& LATIN CAPITAL LETTER U WITH DIAERESIS BELOW + {0x1E73, 0x1E73, prLower}, // L& LATIN SMALL LETTER U WITH DIAERESIS BELOW + {0x1E74, 0x1E74, prUpper}, // L& LATIN CAPITAL LETTER U WITH TILDE BELOW + {0x1E75, 0x1E75, prLower}, // L& LATIN SMALL LETTER U WITH TILDE BELOW + {0x1E76, 0x1E76, prUpper}, // L& LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW + {0x1E77, 0x1E77, prLower}, // L& LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW + {0x1E78, 0x1E78, prUpper}, // L& LATIN CAPITAL LETTER U WITH TILDE AND ACUTE + {0x1E79, 0x1E79, prLower}, // L& LATIN SMALL LETTER U WITH TILDE AND ACUTE + {0x1E7A, 0x1E7A, prUpper}, // L& LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS + {0x1E7B, 0x1E7B, prLower}, // L& LATIN SMALL LETTER U WITH MACRON AND DIAERESIS + {0x1E7C, 0x1E7C, prUpper}, // L& LATIN CAPITAL LETTER V WITH TILDE + {0x1E7D, 0x1E7D, prLower}, // L& LATIN SMALL LETTER V WITH TILDE + {0x1E7E, 0x1E7E, prUpper}, // L& LATIN CAPITAL LETTER V WITH DOT BELOW + {0x1E7F, 0x1E7F, prLower}, // L& LATIN SMALL LETTER V WITH DOT BELOW + {0x1E80, 0x1E80, prUpper}, // L& LATIN CAPITAL LETTER W WITH GRAVE + {0x1E81, 0x1E81, prLower}, // L& LATIN SMALL LETTER W WITH GRAVE + {0x1E82, 0x1E82, prUpper}, // L& LATIN CAPITAL LETTER W WITH ACUTE + {0x1E83, 0x1E83, prLower}, // L& LATIN SMALL LETTER W WITH ACUTE + {0x1E84, 0x1E84, prUpper}, // L& LATIN CAPITAL LETTER W WITH DIAERESIS + {0x1E85, 0x1E85, prLower}, // L& LATIN SMALL LETTER W WITH DIAERESIS + {0x1E86, 0x1E86, prUpper}, // L& LATIN CAPITAL LETTER W WITH DOT ABOVE + {0x1E87, 0x1E87, prLower}, // L& LATIN SMALL LETTER W WITH DOT ABOVE + {0x1E88, 0x1E88, prUpper}, // L& LATIN CAPITAL LETTER W WITH DOT BELOW + {0x1E89, 0x1E89, prLower}, // L& LATIN SMALL LETTER W WITH DOT BELOW + {0x1E8A, 0x1E8A, prUpper}, // L& LATIN CAPITAL LETTER X WITH DOT ABOVE + {0x1E8B, 0x1E8B, prLower}, // L& LATIN SMALL LETTER X WITH DOT ABOVE + {0x1E8C, 0x1E8C, prUpper}, // L& LATIN CAPITAL LETTER X WITH DIAERESIS + {0x1E8D, 0x1E8D, prLower}, // L& LATIN SMALL LETTER X WITH DIAERESIS + {0x1E8E, 0x1E8E, prUpper}, // L& LATIN CAPITAL LETTER Y WITH DOT ABOVE + {0x1E8F, 0x1E8F, prLower}, // L& LATIN SMALL LETTER Y WITH DOT ABOVE + {0x1E90, 0x1E90, prUpper}, // L& LATIN CAPITAL LETTER Z WITH CIRCUMFLEX + {0x1E91, 0x1E91, prLower}, // L& LATIN SMALL LETTER Z WITH CIRCUMFLEX + {0x1E92, 0x1E92, prUpper}, // L& LATIN CAPITAL LETTER Z WITH DOT BELOW + {0x1E93, 0x1E93, prLower}, // L& LATIN SMALL LETTER Z WITH DOT BELOW + {0x1E94, 0x1E94, prUpper}, // L& LATIN CAPITAL LETTER Z WITH LINE BELOW + {0x1E95, 0x1E9D, prLower}, // L& [9] LATIN SMALL LETTER Z WITH LINE BELOW..LATIN SMALL LETTER LONG S WITH HIGH STROKE + {0x1E9E, 0x1E9E, prUpper}, // L& LATIN CAPITAL LETTER SHARP S + {0x1E9F, 0x1E9F, prLower}, // L& LATIN SMALL LETTER DELTA + {0x1EA0, 0x1EA0, prUpper}, // L& LATIN CAPITAL LETTER A WITH DOT BELOW + {0x1EA1, 0x1EA1, prLower}, // L& LATIN SMALL LETTER A WITH DOT BELOW + {0x1EA2, 0x1EA2, prUpper}, // L& LATIN CAPITAL LETTER A WITH HOOK ABOVE + {0x1EA3, 0x1EA3, prLower}, // L& LATIN SMALL LETTER A WITH HOOK ABOVE + {0x1EA4, 0x1EA4, prUpper}, // L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE + {0x1EA5, 0x1EA5, prLower}, // L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE + {0x1EA6, 0x1EA6, prUpper}, // L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE + {0x1EA7, 0x1EA7, prLower}, // L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE + {0x1EA8, 0x1EA8, prUpper}, // L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE + {0x1EA9, 0x1EA9, prLower}, // L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE + {0x1EAA, 0x1EAA, prUpper}, // L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE + {0x1EAB, 0x1EAB, prLower}, // L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE + {0x1EAC, 0x1EAC, prUpper}, // L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW + {0x1EAD, 0x1EAD, prLower}, // L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW + {0x1EAE, 0x1EAE, prUpper}, // L& LATIN CAPITAL LETTER A WITH BREVE AND ACUTE + {0x1EAF, 0x1EAF, prLower}, // L& LATIN SMALL LETTER A WITH BREVE AND ACUTE + {0x1EB0, 0x1EB0, prUpper}, // L& LATIN CAPITAL LETTER A WITH BREVE AND GRAVE + {0x1EB1, 0x1EB1, prLower}, // L& LATIN SMALL LETTER A WITH BREVE AND GRAVE + {0x1EB2, 0x1EB2, prUpper}, // L& LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE + {0x1EB3, 0x1EB3, prLower}, // L& LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE + {0x1EB4, 0x1EB4, prUpper}, // L& LATIN CAPITAL LETTER A WITH BREVE AND TILDE + {0x1EB5, 0x1EB5, prLower}, // L& LATIN SMALL LETTER A WITH BREVE AND TILDE + {0x1EB6, 0x1EB6, prUpper}, // L& LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW + {0x1EB7, 0x1EB7, prLower}, // L& LATIN SMALL LETTER A WITH BREVE AND DOT BELOW + {0x1EB8, 0x1EB8, prUpper}, // L& LATIN CAPITAL LETTER E WITH DOT BELOW + {0x1EB9, 0x1EB9, prLower}, // L& LATIN SMALL LETTER E WITH DOT BELOW + {0x1EBA, 0x1EBA, prUpper}, // L& LATIN CAPITAL LETTER E WITH HOOK ABOVE + {0x1EBB, 0x1EBB, prLower}, // L& LATIN SMALL LETTER E WITH HOOK ABOVE + {0x1EBC, 0x1EBC, prUpper}, // L& LATIN CAPITAL LETTER E WITH TILDE + {0x1EBD, 0x1EBD, prLower}, // L& LATIN SMALL LETTER E WITH TILDE + {0x1EBE, 0x1EBE, prUpper}, // L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE + {0x1EBF, 0x1EBF, prLower}, // L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE + {0x1EC0, 0x1EC0, prUpper}, // L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE + {0x1EC1, 0x1EC1, prLower}, // L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE + {0x1EC2, 0x1EC2, prUpper}, // L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE + {0x1EC3, 0x1EC3, prLower}, // L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE + {0x1EC4, 0x1EC4, prUpper}, // L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE + {0x1EC5, 0x1EC5, prLower}, // L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE + {0x1EC6, 0x1EC6, prUpper}, // L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW + {0x1EC7, 0x1EC7, prLower}, // L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW + {0x1EC8, 0x1EC8, prUpper}, // L& LATIN CAPITAL LETTER I WITH HOOK ABOVE + {0x1EC9, 0x1EC9, prLower}, // L& LATIN SMALL LETTER I WITH HOOK ABOVE + {0x1ECA, 0x1ECA, prUpper}, // L& LATIN CAPITAL LETTER I WITH DOT BELOW + {0x1ECB, 0x1ECB, prLower}, // L& LATIN SMALL LETTER I WITH DOT BELOW + {0x1ECC, 0x1ECC, prUpper}, // L& LATIN CAPITAL LETTER O WITH DOT BELOW + {0x1ECD, 0x1ECD, prLower}, // L& LATIN SMALL LETTER O WITH DOT BELOW + {0x1ECE, 0x1ECE, prUpper}, // L& LATIN CAPITAL LETTER O WITH HOOK ABOVE + {0x1ECF, 0x1ECF, prLower}, // L& LATIN SMALL LETTER O WITH HOOK ABOVE + {0x1ED0, 0x1ED0, prUpper}, // L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE + {0x1ED1, 0x1ED1, prLower}, // L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE + {0x1ED2, 0x1ED2, prUpper}, // L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE + {0x1ED3, 0x1ED3, prLower}, // L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE + {0x1ED4, 0x1ED4, prUpper}, // L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE + {0x1ED5, 0x1ED5, prLower}, // L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE + {0x1ED6, 0x1ED6, prUpper}, // L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE + {0x1ED7, 0x1ED7, prLower}, // L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE + {0x1ED8, 0x1ED8, prUpper}, // L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW + {0x1ED9, 0x1ED9, prLower}, // L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW + {0x1EDA, 0x1EDA, prUpper}, // L& LATIN CAPITAL LETTER O WITH HORN AND ACUTE + {0x1EDB, 0x1EDB, prLower}, // L& LATIN SMALL LETTER O WITH HORN AND ACUTE + {0x1EDC, 0x1EDC, prUpper}, // L& LATIN CAPITAL LETTER O WITH HORN AND GRAVE + {0x1EDD, 0x1EDD, prLower}, // L& LATIN SMALL LETTER O WITH HORN AND GRAVE + {0x1EDE, 0x1EDE, prUpper}, // L& LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE + {0x1EDF, 0x1EDF, prLower}, // L& LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE + {0x1EE0, 0x1EE0, prUpper}, // L& LATIN CAPITAL LETTER O WITH HORN AND TILDE + {0x1EE1, 0x1EE1, prLower}, // L& LATIN SMALL LETTER O WITH HORN AND TILDE + {0x1EE2, 0x1EE2, prUpper}, // L& LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW + {0x1EE3, 0x1EE3, prLower}, // L& LATIN SMALL LETTER O WITH HORN AND DOT BELOW + {0x1EE4, 0x1EE4, prUpper}, // L& LATIN CAPITAL LETTER U WITH DOT BELOW + {0x1EE5, 0x1EE5, prLower}, // L& LATIN SMALL LETTER U WITH DOT BELOW + {0x1EE6, 0x1EE6, prUpper}, // L& LATIN CAPITAL LETTER U WITH HOOK ABOVE + {0x1EE7, 0x1EE7, prLower}, // L& LATIN SMALL LETTER U WITH HOOK ABOVE + {0x1EE8, 0x1EE8, prUpper}, // L& LATIN CAPITAL LETTER U WITH HORN AND ACUTE + {0x1EE9, 0x1EE9, prLower}, // L& LATIN SMALL LETTER U WITH HORN AND ACUTE + {0x1EEA, 0x1EEA, prUpper}, // L& LATIN CAPITAL LETTER U WITH HORN AND GRAVE + {0x1EEB, 0x1EEB, prLower}, // L& LATIN SMALL LETTER U WITH HORN AND GRAVE + {0x1EEC, 0x1EEC, prUpper}, // L& LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE + {0x1EED, 0x1EED, prLower}, // L& LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE + {0x1EEE, 0x1EEE, prUpper}, // L& LATIN CAPITAL LETTER U WITH HORN AND TILDE + {0x1EEF, 0x1EEF, prLower}, // L& LATIN SMALL LETTER U WITH HORN AND TILDE + {0x1EF0, 0x1EF0, prUpper}, // L& LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW + {0x1EF1, 0x1EF1, prLower}, // L& LATIN SMALL LETTER U WITH HORN AND DOT BELOW + {0x1EF2, 0x1EF2, prUpper}, // L& LATIN CAPITAL LETTER Y WITH GRAVE + {0x1EF3, 0x1EF3, prLower}, // L& LATIN SMALL LETTER Y WITH GRAVE + {0x1EF4, 0x1EF4, prUpper}, // L& LATIN CAPITAL LETTER Y WITH DOT BELOW + {0x1EF5, 0x1EF5, prLower}, // L& LATIN SMALL LETTER Y WITH DOT BELOW + {0x1EF6, 0x1EF6, prUpper}, // L& LATIN CAPITAL LETTER Y WITH HOOK ABOVE + {0x1EF7, 0x1EF7, prLower}, // L& LATIN SMALL LETTER Y WITH HOOK ABOVE + {0x1EF8, 0x1EF8, prUpper}, // L& LATIN CAPITAL LETTER Y WITH TILDE + {0x1EF9, 0x1EF9, prLower}, // L& LATIN SMALL LETTER Y WITH TILDE + {0x1EFA, 0x1EFA, prUpper}, // L& LATIN CAPITAL LETTER MIDDLE-WELSH LL + {0x1EFB, 0x1EFB, prLower}, // L& LATIN SMALL LETTER MIDDLE-WELSH LL + {0x1EFC, 0x1EFC, prUpper}, // L& LATIN CAPITAL LETTER MIDDLE-WELSH V + {0x1EFD, 0x1EFD, prLower}, // L& LATIN SMALL LETTER MIDDLE-WELSH V + {0x1EFE, 0x1EFE, prUpper}, // L& LATIN CAPITAL LETTER Y WITH LOOP + {0x1EFF, 0x1F07, prLower}, // L& [9] LATIN SMALL LETTER Y WITH LOOP..GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI + {0x1F08, 0x1F0F, prUpper}, // L& [8] GREEK CAPITAL LETTER ALPHA WITH PSILI..GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI + {0x1F10, 0x1F15, prLower}, // L& [6] GREEK SMALL LETTER EPSILON WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA + {0x1F18, 0x1F1D, prUpper}, // L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA + {0x1F20, 0x1F27, prLower}, // L& [8] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI + {0x1F28, 0x1F2F, prUpper}, // L& [8] GREEK CAPITAL LETTER ETA WITH PSILI..GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI + {0x1F30, 0x1F37, prLower}, // L& [8] GREEK SMALL LETTER IOTA WITH PSILI..GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI + {0x1F38, 0x1F3F, prUpper}, // L& [8] GREEK CAPITAL LETTER IOTA WITH PSILI..GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI + {0x1F40, 0x1F45, prLower}, // L& [6] GREEK SMALL LETTER OMICRON WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA + {0x1F48, 0x1F4D, prUpper}, // L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA + {0x1F50, 0x1F57, prLower}, // L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI + {0x1F59, 0x1F59, prUpper}, // L& GREEK CAPITAL LETTER UPSILON WITH DASIA + {0x1F5B, 0x1F5B, prUpper}, // L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA + {0x1F5D, 0x1F5D, prUpper}, // L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA + {0x1F5F, 0x1F5F, prUpper}, // L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI + {0x1F60, 0x1F67, prLower}, // L& [8] GREEK SMALL LETTER OMEGA WITH PSILI..GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI + {0x1F68, 0x1F6F, prUpper}, // L& [8] GREEK CAPITAL LETTER OMEGA WITH PSILI..GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI + {0x1F70, 0x1F7D, prLower}, // L& [14] GREEK SMALL LETTER ALPHA WITH VARIA..GREEK SMALL LETTER OMEGA WITH OXIA + {0x1F80, 0x1F87, prLower}, // L& [8] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + {0x1F88, 0x1F8F, prUpper}, // L& [8] GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI..GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + {0x1F90, 0x1F97, prLower}, // L& [8] GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + {0x1F98, 0x1F9F, prUpper}, // L& [8] GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI..GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + {0x1FA0, 0x1FA7, prLower}, // L& [8] GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + {0x1FA8, 0x1FAF, prUpper}, // L& [8] GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI..GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + {0x1FB0, 0x1FB4, prLower}, // L& [5] GREEK SMALL LETTER ALPHA WITH VRACHY..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI + {0x1FB6, 0x1FB7, prLower}, // L& [2] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI + {0x1FB8, 0x1FBC, prUpper}, // L& [5] GREEK CAPITAL LETTER ALPHA WITH VRACHY..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI + {0x1FBE, 0x1FBE, prLower}, // L& GREEK PROSGEGRAMMENI + {0x1FC2, 0x1FC4, prLower}, // L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI + {0x1FC6, 0x1FC7, prLower}, // L& [2] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI + {0x1FC8, 0x1FCC, prUpper}, // L& [5] GREEK CAPITAL LETTER EPSILON WITH VARIA..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI + {0x1FD0, 0x1FD3, prLower}, // L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA + {0x1FD6, 0x1FD7, prLower}, // L& [2] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI + {0x1FD8, 0x1FDB, prUpper}, // L& [4] GREEK CAPITAL LETTER IOTA WITH VRACHY..GREEK CAPITAL LETTER IOTA WITH OXIA + {0x1FE0, 0x1FE7, prLower}, // L& [8] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI + {0x1FE8, 0x1FEC, prUpper}, // L& [5] GREEK CAPITAL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA + {0x1FF2, 0x1FF4, prLower}, // L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI + {0x1FF6, 0x1FF7, prLower}, // L& [2] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI + {0x1FF8, 0x1FFC, prUpper}, // L& [5] GREEK CAPITAL LETTER OMICRON WITH VARIA..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI + {0x2000, 0x200A, prSp}, // Zs [11] EN QUAD..HAIR SPACE + {0x200B, 0x200B, prFormat}, // Cf ZERO WIDTH SPACE + {0x200C, 0x200D, prExtend}, // Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER + {0x200E, 0x200F, prFormat}, // Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK + {0x2013, 0x2014, prSContinue}, // Pd [2] EN DASH..EM DASH + {0x2018, 0x2018, prClose}, // Pi LEFT SINGLE QUOTATION MARK + {0x2019, 0x2019, prClose}, // Pf RIGHT SINGLE QUOTATION MARK + {0x201A, 0x201A, prClose}, // Ps SINGLE LOW-9 QUOTATION MARK + {0x201B, 0x201C, prClose}, // Pi [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK + {0x201D, 0x201D, prClose}, // Pf RIGHT DOUBLE QUOTATION MARK + {0x201E, 0x201E, prClose}, // Ps DOUBLE LOW-9 QUOTATION MARK + {0x201F, 0x201F, prClose}, // Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK + {0x2024, 0x2024, prATerm}, // Po ONE DOT LEADER + {0x2028, 0x2028, prSep}, // Zl LINE SEPARATOR + {0x2029, 0x2029, prSep}, // Zp PARAGRAPH SEPARATOR + {0x202A, 0x202E, prFormat}, // Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE + {0x202F, 0x202F, prSp}, // Zs NARROW NO-BREAK SPACE + {0x2039, 0x2039, prClose}, // Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK + {0x203A, 0x203A, prClose}, // Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + {0x203C, 0x203D, prSTerm}, // Po [2] DOUBLE EXCLAMATION MARK..INTERROBANG + {0x2045, 0x2045, prClose}, // Ps LEFT SQUARE BRACKET WITH QUILL + {0x2046, 0x2046, prClose}, // Pe RIGHT SQUARE BRACKET WITH QUILL + {0x2047, 0x2049, prSTerm}, // Po [3] DOUBLE QUESTION MARK..EXCLAMATION QUESTION MARK + {0x205F, 0x205F, prSp}, // Zs MEDIUM MATHEMATICAL SPACE + {0x2060, 0x2064, prFormat}, // Cf [5] WORD JOINER..INVISIBLE PLUS + {0x2066, 0x206F, prFormat}, // Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES + {0x2071, 0x2071, prLower}, // Lm SUPERSCRIPT LATIN SMALL LETTER I + {0x207D, 0x207D, prClose}, // Ps SUPERSCRIPT LEFT PARENTHESIS + {0x207E, 0x207E, prClose}, // Pe SUPERSCRIPT RIGHT PARENTHESIS + {0x207F, 0x207F, prLower}, // Lm SUPERSCRIPT LATIN SMALL LETTER N + {0x208D, 0x208D, prClose}, // Ps SUBSCRIPT LEFT PARENTHESIS + {0x208E, 0x208E, prClose}, // Pe SUBSCRIPT RIGHT PARENTHESIS + {0x2090, 0x209C, prLower}, // Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T + {0x20D0, 0x20DC, prExtend}, // Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE + {0x20DD, 0x20E0, prExtend}, // Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH + {0x20E1, 0x20E1, prExtend}, // Mn COMBINING LEFT RIGHT ARROW ABOVE + {0x20E2, 0x20E4, prExtend}, // Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE + {0x20E5, 0x20F0, prExtend}, // Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE + {0x2102, 0x2102, prUpper}, // L& DOUBLE-STRUCK CAPITAL C + {0x2107, 0x2107, prUpper}, // L& EULER CONSTANT + {0x210A, 0x210A, prLower}, // L& SCRIPT SMALL G + {0x210B, 0x210D, prUpper}, // L& [3] SCRIPT CAPITAL H..DOUBLE-STRUCK CAPITAL H + {0x210E, 0x210F, prLower}, // L& [2] PLANCK CONSTANT..PLANCK CONSTANT OVER TWO PI + {0x2110, 0x2112, prUpper}, // L& [3] SCRIPT CAPITAL I..SCRIPT CAPITAL L + {0x2113, 0x2113, prLower}, // L& SCRIPT SMALL L + {0x2115, 0x2115, prUpper}, // L& DOUBLE-STRUCK CAPITAL N + {0x2119, 0x211D, prUpper}, // L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R + {0x2124, 0x2124, prUpper}, // L& DOUBLE-STRUCK CAPITAL Z + {0x2126, 0x2126, prUpper}, // L& OHM SIGN + {0x2128, 0x2128, prUpper}, // L& BLACK-LETTER CAPITAL Z + {0x212A, 0x212D, prUpper}, // L& [4] KELVIN SIGN..BLACK-LETTER CAPITAL C + {0x212F, 0x212F, prLower}, // L& SCRIPT SMALL E + {0x2130, 0x2133, prUpper}, // L& [4] SCRIPT CAPITAL E..SCRIPT CAPITAL M + {0x2134, 0x2134, prLower}, // L& SCRIPT SMALL O + {0x2135, 0x2138, prOLetter}, // Lo [4] ALEF SYMBOL..DALET SYMBOL + {0x2139, 0x2139, prLower}, // L& INFORMATION SOURCE + {0x213C, 0x213D, prLower}, // L& [2] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK SMALL GAMMA + {0x213E, 0x213F, prUpper}, // L& [2] DOUBLE-STRUCK CAPITAL GAMMA..DOUBLE-STRUCK CAPITAL PI + {0x2145, 0x2145, prUpper}, // L& DOUBLE-STRUCK ITALIC CAPITAL D + {0x2146, 0x2149, prLower}, // L& [4] DOUBLE-STRUCK ITALIC SMALL D..DOUBLE-STRUCK ITALIC SMALL J + {0x214E, 0x214E, prLower}, // L& TURNED SMALL F + {0x2160, 0x216F, prUpper}, // Nl [16] ROMAN NUMERAL ONE..ROMAN NUMERAL ONE THOUSAND + {0x2170, 0x217F, prLower}, // Nl [16] SMALL ROMAN NUMERAL ONE..SMALL ROMAN NUMERAL ONE THOUSAND + {0x2180, 0x2182, prOLetter}, // Nl [3] ROMAN NUMERAL ONE THOUSAND C D..ROMAN NUMERAL TEN THOUSAND + {0x2183, 0x2183, prUpper}, // L& ROMAN NUMERAL REVERSED ONE HUNDRED + {0x2184, 0x2184, prLower}, // L& LATIN SMALL LETTER REVERSED C + {0x2185, 0x2188, prOLetter}, // Nl [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND + {0x2308, 0x2308, prClose}, // Ps LEFT CEILING + {0x2309, 0x2309, prClose}, // Pe RIGHT CEILING + {0x230A, 0x230A, prClose}, // Ps LEFT FLOOR + {0x230B, 0x230B, prClose}, // Pe RIGHT FLOOR + {0x2329, 0x2329, prClose}, // Ps LEFT-POINTING ANGLE BRACKET + {0x232A, 0x232A, prClose}, // Pe RIGHT-POINTING ANGLE BRACKET + {0x24B6, 0x24CF, prUpper}, // So [26] CIRCLED LATIN CAPITAL LETTER A..CIRCLED LATIN CAPITAL LETTER Z + {0x24D0, 0x24E9, prLower}, // So [26] CIRCLED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z + {0x275B, 0x2760, prClose}, // So [6] HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT..HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT + {0x2768, 0x2768, prClose}, // Ps MEDIUM LEFT PARENTHESIS ORNAMENT + {0x2769, 0x2769, prClose}, // Pe MEDIUM RIGHT PARENTHESIS ORNAMENT + {0x276A, 0x276A, prClose}, // Ps MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT + {0x276B, 0x276B, prClose}, // Pe MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT + {0x276C, 0x276C, prClose}, // Ps MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT + {0x276D, 0x276D, prClose}, // Pe MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT + {0x276E, 0x276E, prClose}, // Ps HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT + {0x276F, 0x276F, prClose}, // Pe HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT + {0x2770, 0x2770, prClose}, // Ps HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT + {0x2771, 0x2771, prClose}, // Pe HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT + {0x2772, 0x2772, prClose}, // Ps LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT + {0x2773, 0x2773, prClose}, // Pe LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT + {0x2774, 0x2774, prClose}, // Ps MEDIUM LEFT CURLY BRACKET ORNAMENT + {0x2775, 0x2775, prClose}, // Pe MEDIUM RIGHT CURLY BRACKET ORNAMENT + {0x27C5, 0x27C5, prClose}, // Ps LEFT S-SHAPED BAG DELIMITER + {0x27C6, 0x27C6, prClose}, // Pe RIGHT S-SHAPED BAG DELIMITER + {0x27E6, 0x27E6, prClose}, // Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET + {0x27E7, 0x27E7, prClose}, // Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET + {0x27E8, 0x27E8, prClose}, // Ps MATHEMATICAL LEFT ANGLE BRACKET + {0x27E9, 0x27E9, prClose}, // Pe MATHEMATICAL RIGHT ANGLE BRACKET + {0x27EA, 0x27EA, prClose}, // Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET + {0x27EB, 0x27EB, prClose}, // Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET + {0x27EC, 0x27EC, prClose}, // Ps MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET + {0x27ED, 0x27ED, prClose}, // Pe MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET + {0x27EE, 0x27EE, prClose}, // Ps MATHEMATICAL LEFT FLATTENED PARENTHESIS + {0x27EF, 0x27EF, prClose}, // Pe MATHEMATICAL RIGHT FLATTENED PARENTHESIS + {0x2983, 0x2983, prClose}, // Ps LEFT WHITE CURLY BRACKET + {0x2984, 0x2984, prClose}, // Pe RIGHT WHITE CURLY BRACKET + {0x2985, 0x2985, prClose}, // Ps LEFT WHITE PARENTHESIS + {0x2986, 0x2986, prClose}, // Pe RIGHT WHITE PARENTHESIS + {0x2987, 0x2987, prClose}, // Ps Z NOTATION LEFT IMAGE BRACKET + {0x2988, 0x2988, prClose}, // Pe Z NOTATION RIGHT IMAGE BRACKET + {0x2989, 0x2989, prClose}, // Ps Z NOTATION LEFT BINDING BRACKET + {0x298A, 0x298A, prClose}, // Pe Z NOTATION RIGHT BINDING BRACKET + {0x298B, 0x298B, prClose}, // Ps LEFT SQUARE BRACKET WITH UNDERBAR + {0x298C, 0x298C, prClose}, // Pe RIGHT SQUARE BRACKET WITH UNDERBAR + {0x298D, 0x298D, prClose}, // Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER + {0x298E, 0x298E, prClose}, // Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER + {0x298F, 0x298F, prClose}, // Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER + {0x2990, 0x2990, prClose}, // Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER + {0x2991, 0x2991, prClose}, // Ps LEFT ANGLE BRACKET WITH DOT + {0x2992, 0x2992, prClose}, // Pe RIGHT ANGLE BRACKET WITH DOT + {0x2993, 0x2993, prClose}, // Ps LEFT ARC LESS-THAN BRACKET + {0x2994, 0x2994, prClose}, // Pe RIGHT ARC GREATER-THAN BRACKET + {0x2995, 0x2995, prClose}, // Ps DOUBLE LEFT ARC GREATER-THAN BRACKET + {0x2996, 0x2996, prClose}, // Pe DOUBLE RIGHT ARC LESS-THAN BRACKET + {0x2997, 0x2997, prClose}, // Ps LEFT BLACK TORTOISE SHELL BRACKET + {0x2998, 0x2998, prClose}, // Pe RIGHT BLACK TORTOISE SHELL BRACKET + {0x29D8, 0x29D8, prClose}, // Ps LEFT WIGGLY FENCE + {0x29D9, 0x29D9, prClose}, // Pe RIGHT WIGGLY FENCE + {0x29DA, 0x29DA, prClose}, // Ps LEFT DOUBLE WIGGLY FENCE + {0x29DB, 0x29DB, prClose}, // Pe RIGHT DOUBLE WIGGLY FENCE + {0x29FC, 0x29FC, prClose}, // Ps LEFT-POINTING CURVED ANGLE BRACKET + {0x29FD, 0x29FD, prClose}, // Pe RIGHT-POINTING CURVED ANGLE BRACKET + {0x2C00, 0x2C2F, prUpper}, // L& [48] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER CAUDATE CHRIVI + {0x2C30, 0x2C5F, prLower}, // L& [48] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER CAUDATE CHRIVI + {0x2C60, 0x2C60, prUpper}, // L& LATIN CAPITAL LETTER L WITH DOUBLE BAR + {0x2C61, 0x2C61, prLower}, // L& LATIN SMALL LETTER L WITH DOUBLE BAR + {0x2C62, 0x2C64, prUpper}, // L& [3] LATIN CAPITAL LETTER L WITH MIDDLE TILDE..LATIN CAPITAL LETTER R WITH TAIL + {0x2C65, 0x2C66, prLower}, // L& [2] LATIN SMALL LETTER A WITH STROKE..LATIN SMALL LETTER T WITH DIAGONAL STROKE + {0x2C67, 0x2C67, prUpper}, // L& LATIN CAPITAL LETTER H WITH DESCENDER + {0x2C68, 0x2C68, prLower}, // L& LATIN SMALL LETTER H WITH DESCENDER + {0x2C69, 0x2C69, prUpper}, // L& LATIN CAPITAL LETTER K WITH DESCENDER + {0x2C6A, 0x2C6A, prLower}, // L& LATIN SMALL LETTER K WITH DESCENDER + {0x2C6B, 0x2C6B, prUpper}, // L& LATIN CAPITAL LETTER Z WITH DESCENDER + {0x2C6C, 0x2C6C, prLower}, // L& LATIN SMALL LETTER Z WITH DESCENDER + {0x2C6D, 0x2C70, prUpper}, // L& [4] LATIN CAPITAL LETTER ALPHA..LATIN CAPITAL LETTER TURNED ALPHA + {0x2C71, 0x2C71, prLower}, // L& LATIN SMALL LETTER V WITH RIGHT HOOK + {0x2C72, 0x2C72, prUpper}, // L& LATIN CAPITAL LETTER W WITH HOOK + {0x2C73, 0x2C74, prLower}, // L& [2] LATIN SMALL LETTER W WITH HOOK..LATIN SMALL LETTER V WITH CURL + {0x2C75, 0x2C75, prUpper}, // L& LATIN CAPITAL LETTER HALF H + {0x2C76, 0x2C7B, prLower}, // L& [6] LATIN SMALL LETTER HALF H..LATIN LETTER SMALL CAPITAL TURNED E + {0x2C7C, 0x2C7D, prLower}, // Lm [2] LATIN SUBSCRIPT SMALL LETTER J..MODIFIER LETTER CAPITAL V + {0x2C7E, 0x2C80, prUpper}, // L& [3] LATIN CAPITAL LETTER S WITH SWASH TAIL..COPTIC CAPITAL LETTER ALFA + {0x2C81, 0x2C81, prLower}, // L& COPTIC SMALL LETTER ALFA + {0x2C82, 0x2C82, prUpper}, // L& COPTIC CAPITAL LETTER VIDA + {0x2C83, 0x2C83, prLower}, // L& COPTIC SMALL LETTER VIDA + {0x2C84, 0x2C84, prUpper}, // L& COPTIC CAPITAL LETTER GAMMA + {0x2C85, 0x2C85, prLower}, // L& COPTIC SMALL LETTER GAMMA + {0x2C86, 0x2C86, prUpper}, // L& COPTIC CAPITAL LETTER DALDA + {0x2C87, 0x2C87, prLower}, // L& COPTIC SMALL LETTER DALDA + {0x2C88, 0x2C88, prUpper}, // L& COPTIC CAPITAL LETTER EIE + {0x2C89, 0x2C89, prLower}, // L& COPTIC SMALL LETTER EIE + {0x2C8A, 0x2C8A, prUpper}, // L& COPTIC CAPITAL LETTER SOU + {0x2C8B, 0x2C8B, prLower}, // L& COPTIC SMALL LETTER SOU + {0x2C8C, 0x2C8C, prUpper}, // L& COPTIC CAPITAL LETTER ZATA + {0x2C8D, 0x2C8D, prLower}, // L& COPTIC SMALL LETTER ZATA + {0x2C8E, 0x2C8E, prUpper}, // L& COPTIC CAPITAL LETTER HATE + {0x2C8F, 0x2C8F, prLower}, // L& COPTIC SMALL LETTER HATE + {0x2C90, 0x2C90, prUpper}, // L& COPTIC CAPITAL LETTER THETHE + {0x2C91, 0x2C91, prLower}, // L& COPTIC SMALL LETTER THETHE + {0x2C92, 0x2C92, prUpper}, // L& COPTIC CAPITAL LETTER IAUDA + {0x2C93, 0x2C93, prLower}, // L& COPTIC SMALL LETTER IAUDA + {0x2C94, 0x2C94, prUpper}, // L& COPTIC CAPITAL LETTER KAPA + {0x2C95, 0x2C95, prLower}, // L& COPTIC SMALL LETTER KAPA + {0x2C96, 0x2C96, prUpper}, // L& COPTIC CAPITAL LETTER LAULA + {0x2C97, 0x2C97, prLower}, // L& COPTIC SMALL LETTER LAULA + {0x2C98, 0x2C98, prUpper}, // L& COPTIC CAPITAL LETTER MI + {0x2C99, 0x2C99, prLower}, // L& COPTIC SMALL LETTER MI + {0x2C9A, 0x2C9A, prUpper}, // L& COPTIC CAPITAL LETTER NI + {0x2C9B, 0x2C9B, prLower}, // L& COPTIC SMALL LETTER NI + {0x2C9C, 0x2C9C, prUpper}, // L& COPTIC CAPITAL LETTER KSI + {0x2C9D, 0x2C9D, prLower}, // L& COPTIC SMALL LETTER KSI + {0x2C9E, 0x2C9E, prUpper}, // L& COPTIC CAPITAL LETTER O + {0x2C9F, 0x2C9F, prLower}, // L& COPTIC SMALL LETTER O + {0x2CA0, 0x2CA0, prUpper}, // L& COPTIC CAPITAL LETTER PI + {0x2CA1, 0x2CA1, prLower}, // L& COPTIC SMALL LETTER PI + {0x2CA2, 0x2CA2, prUpper}, // L& COPTIC CAPITAL LETTER RO + {0x2CA3, 0x2CA3, prLower}, // L& COPTIC SMALL LETTER RO + {0x2CA4, 0x2CA4, prUpper}, // L& COPTIC CAPITAL LETTER SIMA + {0x2CA5, 0x2CA5, prLower}, // L& COPTIC SMALL LETTER SIMA + {0x2CA6, 0x2CA6, prUpper}, // L& COPTIC CAPITAL LETTER TAU + {0x2CA7, 0x2CA7, prLower}, // L& COPTIC SMALL LETTER TAU + {0x2CA8, 0x2CA8, prUpper}, // L& COPTIC CAPITAL LETTER UA + {0x2CA9, 0x2CA9, prLower}, // L& COPTIC SMALL LETTER UA + {0x2CAA, 0x2CAA, prUpper}, // L& COPTIC CAPITAL LETTER FI + {0x2CAB, 0x2CAB, prLower}, // L& COPTIC SMALL LETTER FI + {0x2CAC, 0x2CAC, prUpper}, // L& COPTIC CAPITAL LETTER KHI + {0x2CAD, 0x2CAD, prLower}, // L& COPTIC SMALL LETTER KHI + {0x2CAE, 0x2CAE, prUpper}, // L& COPTIC CAPITAL LETTER PSI + {0x2CAF, 0x2CAF, prLower}, // L& COPTIC SMALL LETTER PSI + {0x2CB0, 0x2CB0, prUpper}, // L& COPTIC CAPITAL LETTER OOU + {0x2CB1, 0x2CB1, prLower}, // L& COPTIC SMALL LETTER OOU + {0x2CB2, 0x2CB2, prUpper}, // L& COPTIC CAPITAL LETTER DIALECT-P ALEF + {0x2CB3, 0x2CB3, prLower}, // L& COPTIC SMALL LETTER DIALECT-P ALEF + {0x2CB4, 0x2CB4, prUpper}, // L& COPTIC CAPITAL LETTER OLD COPTIC AIN + {0x2CB5, 0x2CB5, prLower}, // L& COPTIC SMALL LETTER OLD COPTIC AIN + {0x2CB6, 0x2CB6, prUpper}, // L& COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE + {0x2CB7, 0x2CB7, prLower}, // L& COPTIC SMALL LETTER CRYPTOGRAMMIC EIE + {0x2CB8, 0x2CB8, prUpper}, // L& COPTIC CAPITAL LETTER DIALECT-P KAPA + {0x2CB9, 0x2CB9, prLower}, // L& COPTIC SMALL LETTER DIALECT-P KAPA + {0x2CBA, 0x2CBA, prUpper}, // L& COPTIC CAPITAL LETTER DIALECT-P NI + {0x2CBB, 0x2CBB, prLower}, // L& COPTIC SMALL LETTER DIALECT-P NI + {0x2CBC, 0x2CBC, prUpper}, // L& COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI + {0x2CBD, 0x2CBD, prLower}, // L& COPTIC SMALL LETTER CRYPTOGRAMMIC NI + {0x2CBE, 0x2CBE, prUpper}, // L& COPTIC CAPITAL LETTER OLD COPTIC OOU + {0x2CBF, 0x2CBF, prLower}, // L& COPTIC SMALL LETTER OLD COPTIC OOU + {0x2CC0, 0x2CC0, prUpper}, // L& COPTIC CAPITAL LETTER SAMPI + {0x2CC1, 0x2CC1, prLower}, // L& COPTIC SMALL LETTER SAMPI + {0x2CC2, 0x2CC2, prUpper}, // L& COPTIC CAPITAL LETTER CROSSED SHEI + {0x2CC3, 0x2CC3, prLower}, // L& COPTIC SMALL LETTER CROSSED SHEI + {0x2CC4, 0x2CC4, prUpper}, // L& COPTIC CAPITAL LETTER OLD COPTIC SHEI + {0x2CC5, 0x2CC5, prLower}, // L& COPTIC SMALL LETTER OLD COPTIC SHEI + {0x2CC6, 0x2CC6, prUpper}, // L& COPTIC CAPITAL LETTER OLD COPTIC ESH + {0x2CC7, 0x2CC7, prLower}, // L& COPTIC SMALL LETTER OLD COPTIC ESH + {0x2CC8, 0x2CC8, prUpper}, // L& COPTIC CAPITAL LETTER AKHMIMIC KHEI + {0x2CC9, 0x2CC9, prLower}, // L& COPTIC SMALL LETTER AKHMIMIC KHEI + {0x2CCA, 0x2CCA, prUpper}, // L& COPTIC CAPITAL LETTER DIALECT-P HORI + {0x2CCB, 0x2CCB, prLower}, // L& COPTIC SMALL LETTER DIALECT-P HORI + {0x2CCC, 0x2CCC, prUpper}, // L& COPTIC CAPITAL LETTER OLD COPTIC HORI + {0x2CCD, 0x2CCD, prLower}, // L& COPTIC SMALL LETTER OLD COPTIC HORI + {0x2CCE, 0x2CCE, prUpper}, // L& COPTIC CAPITAL LETTER OLD COPTIC HA + {0x2CCF, 0x2CCF, prLower}, // L& COPTIC SMALL LETTER OLD COPTIC HA + {0x2CD0, 0x2CD0, prUpper}, // L& COPTIC CAPITAL LETTER L-SHAPED HA + {0x2CD1, 0x2CD1, prLower}, // L& COPTIC SMALL LETTER L-SHAPED HA + {0x2CD2, 0x2CD2, prUpper}, // L& COPTIC CAPITAL LETTER OLD COPTIC HEI + {0x2CD3, 0x2CD3, prLower}, // L& COPTIC SMALL LETTER OLD COPTIC HEI + {0x2CD4, 0x2CD4, prUpper}, // L& COPTIC CAPITAL LETTER OLD COPTIC HAT + {0x2CD5, 0x2CD5, prLower}, // L& COPTIC SMALL LETTER OLD COPTIC HAT + {0x2CD6, 0x2CD6, prUpper}, // L& COPTIC CAPITAL LETTER OLD COPTIC GANGIA + {0x2CD7, 0x2CD7, prLower}, // L& COPTIC SMALL LETTER OLD COPTIC GANGIA + {0x2CD8, 0x2CD8, prUpper}, // L& COPTIC CAPITAL LETTER OLD COPTIC DJA + {0x2CD9, 0x2CD9, prLower}, // L& COPTIC SMALL LETTER OLD COPTIC DJA + {0x2CDA, 0x2CDA, prUpper}, // L& COPTIC CAPITAL LETTER OLD COPTIC SHIMA + {0x2CDB, 0x2CDB, prLower}, // L& COPTIC SMALL LETTER OLD COPTIC SHIMA + {0x2CDC, 0x2CDC, prUpper}, // L& COPTIC CAPITAL LETTER OLD NUBIAN SHIMA + {0x2CDD, 0x2CDD, prLower}, // L& COPTIC SMALL LETTER OLD NUBIAN SHIMA + {0x2CDE, 0x2CDE, prUpper}, // L& COPTIC CAPITAL LETTER OLD NUBIAN NGI + {0x2CDF, 0x2CDF, prLower}, // L& COPTIC SMALL LETTER OLD NUBIAN NGI + {0x2CE0, 0x2CE0, prUpper}, // L& COPTIC CAPITAL LETTER OLD NUBIAN NYI + {0x2CE1, 0x2CE1, prLower}, // L& COPTIC SMALL LETTER OLD NUBIAN NYI + {0x2CE2, 0x2CE2, prUpper}, // L& COPTIC CAPITAL LETTER OLD NUBIAN WAU + {0x2CE3, 0x2CE4, prLower}, // L& [2] COPTIC SMALL LETTER OLD NUBIAN WAU..COPTIC SYMBOL KAI + {0x2CEB, 0x2CEB, prUpper}, // L& COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI + {0x2CEC, 0x2CEC, prLower}, // L& COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI + {0x2CED, 0x2CED, prUpper}, // L& COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA + {0x2CEE, 0x2CEE, prLower}, // L& COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA + {0x2CEF, 0x2CF1, prExtend}, // Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS + {0x2CF2, 0x2CF2, prUpper}, // L& COPTIC CAPITAL LETTER BOHAIRIC KHEI + {0x2CF3, 0x2CF3, prLower}, // L& COPTIC SMALL LETTER BOHAIRIC KHEI + {0x2D00, 0x2D25, prLower}, // L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE + {0x2D27, 0x2D27, prLower}, // L& GEORGIAN SMALL LETTER YN + {0x2D2D, 0x2D2D, prLower}, // L& GEORGIAN SMALL LETTER AEN + {0x2D30, 0x2D67, prOLetter}, // Lo [56] TIFINAGH LETTER YA..TIFINAGH LETTER YO + {0x2D6F, 0x2D6F, prOLetter}, // Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK + {0x2D7F, 0x2D7F, prExtend}, // Mn TIFINAGH CONSONANT JOINER + {0x2D80, 0x2D96, prOLetter}, // Lo [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE + {0x2DA0, 0x2DA6, prOLetter}, // Lo [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO + {0x2DA8, 0x2DAE, prOLetter}, // Lo [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO + {0x2DB0, 0x2DB6, prOLetter}, // Lo [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO + {0x2DB8, 0x2DBE, prOLetter}, // Lo [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO + {0x2DC0, 0x2DC6, prOLetter}, // Lo [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO + {0x2DC8, 0x2DCE, prOLetter}, // Lo [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO + {0x2DD0, 0x2DD6, prOLetter}, // Lo [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO + {0x2DD8, 0x2DDE, prOLetter}, // Lo [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO + {0x2DE0, 0x2DFF, prExtend}, // Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS + {0x2E00, 0x2E01, prClose}, // Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER + {0x2E02, 0x2E02, prClose}, // Pi LEFT SUBSTITUTION BRACKET + {0x2E03, 0x2E03, prClose}, // Pf RIGHT SUBSTITUTION BRACKET + {0x2E04, 0x2E04, prClose}, // Pi LEFT DOTTED SUBSTITUTION BRACKET + {0x2E05, 0x2E05, prClose}, // Pf RIGHT DOTTED SUBSTITUTION BRACKET + {0x2E06, 0x2E08, prClose}, // Po [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER + {0x2E09, 0x2E09, prClose}, // Pi LEFT TRANSPOSITION BRACKET + {0x2E0A, 0x2E0A, prClose}, // Pf RIGHT TRANSPOSITION BRACKET + {0x2E0B, 0x2E0B, prClose}, // Po RAISED SQUARE + {0x2E0C, 0x2E0C, prClose}, // Pi LEFT RAISED OMISSION BRACKET + {0x2E0D, 0x2E0D, prClose}, // Pf RIGHT RAISED OMISSION BRACKET + {0x2E1C, 0x2E1C, prClose}, // Pi LEFT LOW PARAPHRASE BRACKET + {0x2E1D, 0x2E1D, prClose}, // Pf RIGHT LOW PARAPHRASE BRACKET + {0x2E20, 0x2E20, prClose}, // Pi LEFT VERTICAL BAR WITH QUILL + {0x2E21, 0x2E21, prClose}, // Pf RIGHT VERTICAL BAR WITH QUILL + {0x2E22, 0x2E22, prClose}, // Ps TOP LEFT HALF BRACKET + {0x2E23, 0x2E23, prClose}, // Pe TOP RIGHT HALF BRACKET + {0x2E24, 0x2E24, prClose}, // Ps BOTTOM LEFT HALF BRACKET + {0x2E25, 0x2E25, prClose}, // Pe BOTTOM RIGHT HALF BRACKET + {0x2E26, 0x2E26, prClose}, // Ps LEFT SIDEWAYS U BRACKET + {0x2E27, 0x2E27, prClose}, // Pe RIGHT SIDEWAYS U BRACKET + {0x2E28, 0x2E28, prClose}, // Ps LEFT DOUBLE PARENTHESIS + {0x2E29, 0x2E29, prClose}, // Pe RIGHT DOUBLE PARENTHESIS + {0x2E2E, 0x2E2E, prSTerm}, // Po REVERSED QUESTION MARK + {0x2E2F, 0x2E2F, prOLetter}, // Lm VERTICAL TILDE + {0x2E3C, 0x2E3C, prSTerm}, // Po STENOGRAPHIC FULL STOP + {0x2E42, 0x2E42, prClose}, // Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK + {0x2E53, 0x2E54, prSTerm}, // Po [2] MEDIEVAL EXCLAMATION MARK..MEDIEVAL QUESTION MARK + {0x2E55, 0x2E55, prClose}, // Ps LEFT SQUARE BRACKET WITH STROKE + {0x2E56, 0x2E56, prClose}, // Pe RIGHT SQUARE BRACKET WITH STROKE + {0x2E57, 0x2E57, prClose}, // Ps LEFT SQUARE BRACKET WITH DOUBLE STROKE + {0x2E58, 0x2E58, prClose}, // Pe RIGHT SQUARE BRACKET WITH DOUBLE STROKE + {0x2E59, 0x2E59, prClose}, // Ps TOP HALF LEFT PARENTHESIS + {0x2E5A, 0x2E5A, prClose}, // Pe TOP HALF RIGHT PARENTHESIS + {0x2E5B, 0x2E5B, prClose}, // Ps BOTTOM HALF LEFT PARENTHESIS + {0x2E5C, 0x2E5C, prClose}, // Pe BOTTOM HALF RIGHT PARENTHESIS + {0x3000, 0x3000, prSp}, // Zs IDEOGRAPHIC SPACE + {0x3001, 0x3001, prSContinue}, // Po IDEOGRAPHIC COMMA + {0x3002, 0x3002, prSTerm}, // Po IDEOGRAPHIC FULL STOP + {0x3005, 0x3005, prOLetter}, // Lm IDEOGRAPHIC ITERATION MARK + {0x3006, 0x3006, prOLetter}, // Lo IDEOGRAPHIC CLOSING MARK + {0x3007, 0x3007, prOLetter}, // Nl IDEOGRAPHIC NUMBER ZERO + {0x3008, 0x3008, prClose}, // Ps LEFT ANGLE BRACKET + {0x3009, 0x3009, prClose}, // Pe RIGHT ANGLE BRACKET + {0x300A, 0x300A, prClose}, // Ps LEFT DOUBLE ANGLE BRACKET + {0x300B, 0x300B, prClose}, // Pe RIGHT DOUBLE ANGLE BRACKET + {0x300C, 0x300C, prClose}, // Ps LEFT CORNER BRACKET + {0x300D, 0x300D, prClose}, // Pe RIGHT CORNER BRACKET + {0x300E, 0x300E, prClose}, // Ps LEFT WHITE CORNER BRACKET + {0x300F, 0x300F, prClose}, // Pe RIGHT WHITE CORNER BRACKET + {0x3010, 0x3010, prClose}, // Ps LEFT BLACK LENTICULAR BRACKET + {0x3011, 0x3011, prClose}, // Pe RIGHT BLACK LENTICULAR BRACKET + {0x3014, 0x3014, prClose}, // Ps LEFT TORTOISE SHELL BRACKET + {0x3015, 0x3015, prClose}, // Pe RIGHT TORTOISE SHELL BRACKET + {0x3016, 0x3016, prClose}, // Ps LEFT WHITE LENTICULAR BRACKET + {0x3017, 0x3017, prClose}, // Pe RIGHT WHITE LENTICULAR BRACKET + {0x3018, 0x3018, prClose}, // Ps LEFT WHITE TORTOISE SHELL BRACKET + {0x3019, 0x3019, prClose}, // Pe RIGHT WHITE TORTOISE SHELL BRACKET + {0x301A, 0x301A, prClose}, // Ps LEFT WHITE SQUARE BRACKET + {0x301B, 0x301B, prClose}, // Pe RIGHT WHITE SQUARE BRACKET + {0x301D, 0x301D, prClose}, // Ps REVERSED DOUBLE PRIME QUOTATION MARK + {0x301E, 0x301F, prClose}, // Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK + {0x3021, 0x3029, prOLetter}, // Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE + {0x302A, 0x302D, prExtend}, // Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK + {0x302E, 0x302F, prExtend}, // Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK + {0x3031, 0x3035, prOLetter}, // Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF + {0x3038, 0x303A, prOLetter}, // Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY + {0x303B, 0x303B, prOLetter}, // Lm VERTICAL IDEOGRAPHIC ITERATION MARK + {0x303C, 0x303C, prOLetter}, // Lo MASU MARK + {0x3041, 0x3096, prOLetter}, // Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE + {0x3099, 0x309A, prExtend}, // Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + {0x309D, 0x309E, prOLetter}, // Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK + {0x309F, 0x309F, prOLetter}, // Lo HIRAGANA DIGRAPH YORI + {0x30A1, 0x30FA, prOLetter}, // Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO + {0x30FC, 0x30FE, prOLetter}, // Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK + {0x30FF, 0x30FF, prOLetter}, // Lo KATAKANA DIGRAPH KOTO + {0x3105, 0x312F, prOLetter}, // Lo [43] BOPOMOFO LETTER B..BOPOMOFO LETTER NN + {0x3131, 0x318E, prOLetter}, // Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE + {0x31A0, 0x31BF, prOLetter}, // Lo [32] BOPOMOFO LETTER BU..BOPOMOFO LETTER AH + {0x31F0, 0x31FF, prOLetter}, // Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO + {0x3400, 0x4DBF, prOLetter}, // Lo [6592] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DBF + {0x4E00, 0xA014, prOLetter}, // Lo [21013] CJK UNIFIED IDEOGRAPH-4E00..YI SYLLABLE E + {0xA015, 0xA015, prOLetter}, // Lm YI SYLLABLE WU + {0xA016, 0xA48C, prOLetter}, // Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR + {0xA4D0, 0xA4F7, prOLetter}, // Lo [40] LISU LETTER BA..LISU LETTER OE + {0xA4F8, 0xA4FD, prOLetter}, // Lm [6] LISU LETTER TONE MYA TI..LISU LETTER TONE MYA JEU + {0xA4FF, 0xA4FF, prSTerm}, // Po LISU PUNCTUATION FULL STOP + {0xA500, 0xA60B, prOLetter}, // Lo [268] VAI SYLLABLE EE..VAI SYLLABLE NG + {0xA60C, 0xA60C, prOLetter}, // Lm VAI SYLLABLE LENGTHENER + {0xA60E, 0xA60F, prSTerm}, // Po [2] VAI FULL STOP..VAI QUESTION MARK + {0xA610, 0xA61F, prOLetter}, // Lo [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG + {0xA620, 0xA629, prNumeric}, // Nd [10] VAI DIGIT ZERO..VAI DIGIT NINE + {0xA62A, 0xA62B, prOLetter}, // Lo [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO + {0xA640, 0xA640, prUpper}, // L& CYRILLIC CAPITAL LETTER ZEMLYA + {0xA641, 0xA641, prLower}, // L& CYRILLIC SMALL LETTER ZEMLYA + {0xA642, 0xA642, prUpper}, // L& CYRILLIC CAPITAL LETTER DZELO + {0xA643, 0xA643, prLower}, // L& CYRILLIC SMALL LETTER DZELO + {0xA644, 0xA644, prUpper}, // L& CYRILLIC CAPITAL LETTER REVERSED DZE + {0xA645, 0xA645, prLower}, // L& CYRILLIC SMALL LETTER REVERSED DZE + {0xA646, 0xA646, prUpper}, // L& CYRILLIC CAPITAL LETTER IOTA + {0xA647, 0xA647, prLower}, // L& CYRILLIC SMALL LETTER IOTA + {0xA648, 0xA648, prUpper}, // L& CYRILLIC CAPITAL LETTER DJERV + {0xA649, 0xA649, prLower}, // L& CYRILLIC SMALL LETTER DJERV + {0xA64A, 0xA64A, prUpper}, // L& CYRILLIC CAPITAL LETTER MONOGRAPH UK + {0xA64B, 0xA64B, prLower}, // L& CYRILLIC SMALL LETTER MONOGRAPH UK + {0xA64C, 0xA64C, prUpper}, // L& CYRILLIC CAPITAL LETTER BROAD OMEGA + {0xA64D, 0xA64D, prLower}, // L& CYRILLIC SMALL LETTER BROAD OMEGA + {0xA64E, 0xA64E, prUpper}, // L& CYRILLIC CAPITAL LETTER NEUTRAL YER + {0xA64F, 0xA64F, prLower}, // L& CYRILLIC SMALL LETTER NEUTRAL YER + {0xA650, 0xA650, prUpper}, // L& CYRILLIC CAPITAL LETTER YERU WITH BACK YER + {0xA651, 0xA651, prLower}, // L& CYRILLIC SMALL LETTER YERU WITH BACK YER + {0xA652, 0xA652, prUpper}, // L& CYRILLIC CAPITAL LETTER IOTIFIED YAT + {0xA653, 0xA653, prLower}, // L& CYRILLIC SMALL LETTER IOTIFIED YAT + {0xA654, 0xA654, prUpper}, // L& CYRILLIC CAPITAL LETTER REVERSED YU + {0xA655, 0xA655, prLower}, // L& CYRILLIC SMALL LETTER REVERSED YU + {0xA656, 0xA656, prUpper}, // L& CYRILLIC CAPITAL LETTER IOTIFIED A + {0xA657, 0xA657, prLower}, // L& CYRILLIC SMALL LETTER IOTIFIED A + {0xA658, 0xA658, prUpper}, // L& CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS + {0xA659, 0xA659, prLower}, // L& CYRILLIC SMALL LETTER CLOSED LITTLE YUS + {0xA65A, 0xA65A, prUpper}, // L& CYRILLIC CAPITAL LETTER BLENDED YUS + {0xA65B, 0xA65B, prLower}, // L& CYRILLIC SMALL LETTER BLENDED YUS + {0xA65C, 0xA65C, prUpper}, // L& CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS + {0xA65D, 0xA65D, prLower}, // L& CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS + {0xA65E, 0xA65E, prUpper}, // L& CYRILLIC CAPITAL LETTER YN + {0xA65F, 0xA65F, prLower}, // L& CYRILLIC SMALL LETTER YN + {0xA660, 0xA660, prUpper}, // L& CYRILLIC CAPITAL LETTER REVERSED TSE + {0xA661, 0xA661, prLower}, // L& CYRILLIC SMALL LETTER REVERSED TSE + {0xA662, 0xA662, prUpper}, // L& CYRILLIC CAPITAL LETTER SOFT DE + {0xA663, 0xA663, prLower}, // L& CYRILLIC SMALL LETTER SOFT DE + {0xA664, 0xA664, prUpper}, // L& CYRILLIC CAPITAL LETTER SOFT EL + {0xA665, 0xA665, prLower}, // L& CYRILLIC SMALL LETTER SOFT EL + {0xA666, 0xA666, prUpper}, // L& CYRILLIC CAPITAL LETTER SOFT EM + {0xA667, 0xA667, prLower}, // L& CYRILLIC SMALL LETTER SOFT EM + {0xA668, 0xA668, prUpper}, // L& CYRILLIC CAPITAL LETTER MONOCULAR O + {0xA669, 0xA669, prLower}, // L& CYRILLIC SMALL LETTER MONOCULAR O + {0xA66A, 0xA66A, prUpper}, // L& CYRILLIC CAPITAL LETTER BINOCULAR O + {0xA66B, 0xA66B, prLower}, // L& CYRILLIC SMALL LETTER BINOCULAR O + {0xA66C, 0xA66C, prUpper}, // L& CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O + {0xA66D, 0xA66D, prLower}, // L& CYRILLIC SMALL LETTER DOUBLE MONOCULAR O + {0xA66E, 0xA66E, prOLetter}, // Lo CYRILLIC LETTER MULTIOCULAR O + {0xA66F, 0xA66F, prExtend}, // Mn COMBINING CYRILLIC VZMET + {0xA670, 0xA672, prExtend}, // Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN + {0xA674, 0xA67D, prExtend}, // Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK + {0xA67F, 0xA67F, prOLetter}, // Lm CYRILLIC PAYEROK + {0xA680, 0xA680, prUpper}, // L& CYRILLIC CAPITAL LETTER DWE + {0xA681, 0xA681, prLower}, // L& CYRILLIC SMALL LETTER DWE + {0xA682, 0xA682, prUpper}, // L& CYRILLIC CAPITAL LETTER DZWE + {0xA683, 0xA683, prLower}, // L& CYRILLIC SMALL LETTER DZWE + {0xA684, 0xA684, prUpper}, // L& CYRILLIC CAPITAL LETTER ZHWE + {0xA685, 0xA685, prLower}, // L& CYRILLIC SMALL LETTER ZHWE + {0xA686, 0xA686, prUpper}, // L& CYRILLIC CAPITAL LETTER CCHE + {0xA687, 0xA687, prLower}, // L& CYRILLIC SMALL LETTER CCHE + {0xA688, 0xA688, prUpper}, // L& CYRILLIC CAPITAL LETTER DZZE + {0xA689, 0xA689, prLower}, // L& CYRILLIC SMALL LETTER DZZE + {0xA68A, 0xA68A, prUpper}, // L& CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK + {0xA68B, 0xA68B, prLower}, // L& CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK + {0xA68C, 0xA68C, prUpper}, // L& CYRILLIC CAPITAL LETTER TWE + {0xA68D, 0xA68D, prLower}, // L& CYRILLIC SMALL LETTER TWE + {0xA68E, 0xA68E, prUpper}, // L& CYRILLIC CAPITAL LETTER TSWE + {0xA68F, 0xA68F, prLower}, // L& CYRILLIC SMALL LETTER TSWE + {0xA690, 0xA690, prUpper}, // L& CYRILLIC CAPITAL LETTER TSSE + {0xA691, 0xA691, prLower}, // L& CYRILLIC SMALL LETTER TSSE + {0xA692, 0xA692, prUpper}, // L& CYRILLIC CAPITAL LETTER TCHE + {0xA693, 0xA693, prLower}, // L& CYRILLIC SMALL LETTER TCHE + {0xA694, 0xA694, prUpper}, // L& CYRILLIC CAPITAL LETTER HWE + {0xA695, 0xA695, prLower}, // L& CYRILLIC SMALL LETTER HWE + {0xA696, 0xA696, prUpper}, // L& CYRILLIC CAPITAL LETTER SHWE + {0xA697, 0xA697, prLower}, // L& CYRILLIC SMALL LETTER SHWE + {0xA698, 0xA698, prUpper}, // L& CYRILLIC CAPITAL LETTER DOUBLE O + {0xA699, 0xA699, prLower}, // L& CYRILLIC SMALL LETTER DOUBLE O + {0xA69A, 0xA69A, prUpper}, // L& CYRILLIC CAPITAL LETTER CROSSED O + {0xA69B, 0xA69B, prLower}, // L& CYRILLIC SMALL LETTER CROSSED O + {0xA69C, 0xA69D, prLower}, // Lm [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER LETTER CYRILLIC SOFT SIGN + {0xA69E, 0xA69F, prExtend}, // Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E + {0xA6A0, 0xA6E5, prOLetter}, // Lo [70] BAMUM LETTER A..BAMUM LETTER KI + {0xA6E6, 0xA6EF, prOLetter}, // Nl [10] BAMUM LETTER MO..BAMUM LETTER KOGHOM + {0xA6F0, 0xA6F1, prExtend}, // Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS + {0xA6F3, 0xA6F3, prSTerm}, // Po BAMUM FULL STOP + {0xA6F7, 0xA6F7, prSTerm}, // Po BAMUM QUESTION MARK + {0xA717, 0xA71F, prOLetter}, // Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK + {0xA722, 0xA722, prUpper}, // L& LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF + {0xA723, 0xA723, prLower}, // L& LATIN SMALL LETTER EGYPTOLOGICAL ALEF + {0xA724, 0xA724, prUpper}, // L& LATIN CAPITAL LETTER EGYPTOLOGICAL AIN + {0xA725, 0xA725, prLower}, // L& LATIN SMALL LETTER EGYPTOLOGICAL AIN + {0xA726, 0xA726, prUpper}, // L& LATIN CAPITAL LETTER HENG + {0xA727, 0xA727, prLower}, // L& LATIN SMALL LETTER HENG + {0xA728, 0xA728, prUpper}, // L& LATIN CAPITAL LETTER TZ + {0xA729, 0xA729, prLower}, // L& LATIN SMALL LETTER TZ + {0xA72A, 0xA72A, prUpper}, // L& LATIN CAPITAL LETTER TRESILLO + {0xA72B, 0xA72B, prLower}, // L& LATIN SMALL LETTER TRESILLO + {0xA72C, 0xA72C, prUpper}, // L& LATIN CAPITAL LETTER CUATRILLO + {0xA72D, 0xA72D, prLower}, // L& LATIN SMALL LETTER CUATRILLO + {0xA72E, 0xA72E, prUpper}, // L& LATIN CAPITAL LETTER CUATRILLO WITH COMMA + {0xA72F, 0xA731, prLower}, // L& [3] LATIN SMALL LETTER CUATRILLO WITH COMMA..LATIN LETTER SMALL CAPITAL S + {0xA732, 0xA732, prUpper}, // L& LATIN CAPITAL LETTER AA + {0xA733, 0xA733, prLower}, // L& LATIN SMALL LETTER AA + {0xA734, 0xA734, prUpper}, // L& LATIN CAPITAL LETTER AO + {0xA735, 0xA735, prLower}, // L& LATIN SMALL LETTER AO + {0xA736, 0xA736, prUpper}, // L& LATIN CAPITAL LETTER AU + {0xA737, 0xA737, prLower}, // L& LATIN SMALL LETTER AU + {0xA738, 0xA738, prUpper}, // L& LATIN CAPITAL LETTER AV + {0xA739, 0xA739, prLower}, // L& LATIN SMALL LETTER AV + {0xA73A, 0xA73A, prUpper}, // L& LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR + {0xA73B, 0xA73B, prLower}, // L& LATIN SMALL LETTER AV WITH HORIZONTAL BAR + {0xA73C, 0xA73C, prUpper}, // L& LATIN CAPITAL LETTER AY + {0xA73D, 0xA73D, prLower}, // L& LATIN SMALL LETTER AY + {0xA73E, 0xA73E, prUpper}, // L& LATIN CAPITAL LETTER REVERSED C WITH DOT + {0xA73F, 0xA73F, prLower}, // L& LATIN SMALL LETTER REVERSED C WITH DOT + {0xA740, 0xA740, prUpper}, // L& LATIN CAPITAL LETTER K WITH STROKE + {0xA741, 0xA741, prLower}, // L& LATIN SMALL LETTER K WITH STROKE + {0xA742, 0xA742, prUpper}, // L& LATIN CAPITAL LETTER K WITH DIAGONAL STROKE + {0xA743, 0xA743, prLower}, // L& LATIN SMALL LETTER K WITH DIAGONAL STROKE + {0xA744, 0xA744, prUpper}, // L& LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE + {0xA745, 0xA745, prLower}, // L& LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE + {0xA746, 0xA746, prUpper}, // L& LATIN CAPITAL LETTER BROKEN L + {0xA747, 0xA747, prLower}, // L& LATIN SMALL LETTER BROKEN L + {0xA748, 0xA748, prUpper}, // L& LATIN CAPITAL LETTER L WITH HIGH STROKE + {0xA749, 0xA749, prLower}, // L& LATIN SMALL LETTER L WITH HIGH STROKE + {0xA74A, 0xA74A, prUpper}, // L& LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY + {0xA74B, 0xA74B, prLower}, // L& LATIN SMALL LETTER O WITH LONG STROKE OVERLAY + {0xA74C, 0xA74C, prUpper}, // L& LATIN CAPITAL LETTER O WITH LOOP + {0xA74D, 0xA74D, prLower}, // L& LATIN SMALL LETTER O WITH LOOP + {0xA74E, 0xA74E, prUpper}, // L& LATIN CAPITAL LETTER OO + {0xA74F, 0xA74F, prLower}, // L& LATIN SMALL LETTER OO + {0xA750, 0xA750, prUpper}, // L& LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER + {0xA751, 0xA751, prLower}, // L& LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER + {0xA752, 0xA752, prUpper}, // L& LATIN CAPITAL LETTER P WITH FLOURISH + {0xA753, 0xA753, prLower}, // L& LATIN SMALL LETTER P WITH FLOURISH + {0xA754, 0xA754, prUpper}, // L& LATIN CAPITAL LETTER P WITH SQUIRREL TAIL + {0xA755, 0xA755, prLower}, // L& LATIN SMALL LETTER P WITH SQUIRREL TAIL + {0xA756, 0xA756, prUpper}, // L& LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER + {0xA757, 0xA757, prLower}, // L& LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER + {0xA758, 0xA758, prUpper}, // L& LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE + {0xA759, 0xA759, prLower}, // L& LATIN SMALL LETTER Q WITH DIAGONAL STROKE + {0xA75A, 0xA75A, prUpper}, // L& LATIN CAPITAL LETTER R ROTUNDA + {0xA75B, 0xA75B, prLower}, // L& LATIN SMALL LETTER R ROTUNDA + {0xA75C, 0xA75C, prUpper}, // L& LATIN CAPITAL LETTER RUM ROTUNDA + {0xA75D, 0xA75D, prLower}, // L& LATIN SMALL LETTER RUM ROTUNDA + {0xA75E, 0xA75E, prUpper}, // L& LATIN CAPITAL LETTER V WITH DIAGONAL STROKE + {0xA75F, 0xA75F, prLower}, // L& LATIN SMALL LETTER V WITH DIAGONAL STROKE + {0xA760, 0xA760, prUpper}, // L& LATIN CAPITAL LETTER VY + {0xA761, 0xA761, prLower}, // L& LATIN SMALL LETTER VY + {0xA762, 0xA762, prUpper}, // L& LATIN CAPITAL LETTER VISIGOTHIC Z + {0xA763, 0xA763, prLower}, // L& LATIN SMALL LETTER VISIGOTHIC Z + {0xA764, 0xA764, prUpper}, // L& LATIN CAPITAL LETTER THORN WITH STROKE + {0xA765, 0xA765, prLower}, // L& LATIN SMALL LETTER THORN WITH STROKE + {0xA766, 0xA766, prUpper}, // L& LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER + {0xA767, 0xA767, prLower}, // L& LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER + {0xA768, 0xA768, prUpper}, // L& LATIN CAPITAL LETTER VEND + {0xA769, 0xA769, prLower}, // L& LATIN SMALL LETTER VEND + {0xA76A, 0xA76A, prUpper}, // L& LATIN CAPITAL LETTER ET + {0xA76B, 0xA76B, prLower}, // L& LATIN SMALL LETTER ET + {0xA76C, 0xA76C, prUpper}, // L& LATIN CAPITAL LETTER IS + {0xA76D, 0xA76D, prLower}, // L& LATIN SMALL LETTER IS + {0xA76E, 0xA76E, prUpper}, // L& LATIN CAPITAL LETTER CON + {0xA76F, 0xA76F, prLower}, // L& LATIN SMALL LETTER CON + {0xA770, 0xA770, prLower}, // Lm MODIFIER LETTER US + {0xA771, 0xA778, prLower}, // L& [8] LATIN SMALL LETTER DUM..LATIN SMALL LETTER UM + {0xA779, 0xA779, prUpper}, // L& LATIN CAPITAL LETTER INSULAR D + {0xA77A, 0xA77A, prLower}, // L& LATIN SMALL LETTER INSULAR D + {0xA77B, 0xA77B, prUpper}, // L& LATIN CAPITAL LETTER INSULAR F + {0xA77C, 0xA77C, prLower}, // L& LATIN SMALL LETTER INSULAR F + {0xA77D, 0xA77E, prUpper}, // L& [2] LATIN CAPITAL LETTER INSULAR G..LATIN CAPITAL LETTER TURNED INSULAR G + {0xA77F, 0xA77F, prLower}, // L& LATIN SMALL LETTER TURNED INSULAR G + {0xA780, 0xA780, prUpper}, // L& LATIN CAPITAL LETTER TURNED L + {0xA781, 0xA781, prLower}, // L& LATIN SMALL LETTER TURNED L + {0xA782, 0xA782, prUpper}, // L& LATIN CAPITAL LETTER INSULAR R + {0xA783, 0xA783, prLower}, // L& LATIN SMALL LETTER INSULAR R + {0xA784, 0xA784, prUpper}, // L& LATIN CAPITAL LETTER INSULAR S + {0xA785, 0xA785, prLower}, // L& LATIN SMALL LETTER INSULAR S + {0xA786, 0xA786, prUpper}, // L& LATIN CAPITAL LETTER INSULAR T + {0xA787, 0xA787, prLower}, // L& LATIN SMALL LETTER INSULAR T + {0xA788, 0xA788, prOLetter}, // Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT + {0xA78B, 0xA78B, prUpper}, // L& LATIN CAPITAL LETTER SALTILLO + {0xA78C, 0xA78C, prLower}, // L& LATIN SMALL LETTER SALTILLO + {0xA78D, 0xA78D, prUpper}, // L& LATIN CAPITAL LETTER TURNED H + {0xA78E, 0xA78E, prLower}, // L& LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT + {0xA78F, 0xA78F, prOLetter}, // Lo LATIN LETTER SINOLOGICAL DOT + {0xA790, 0xA790, prUpper}, // L& LATIN CAPITAL LETTER N WITH DESCENDER + {0xA791, 0xA791, prLower}, // L& LATIN SMALL LETTER N WITH DESCENDER + {0xA792, 0xA792, prUpper}, // L& LATIN CAPITAL LETTER C WITH BAR + {0xA793, 0xA795, prLower}, // L& [3] LATIN SMALL LETTER C WITH BAR..LATIN SMALL LETTER H WITH PALATAL HOOK + {0xA796, 0xA796, prUpper}, // L& LATIN CAPITAL LETTER B WITH FLOURISH + {0xA797, 0xA797, prLower}, // L& LATIN SMALL LETTER B WITH FLOURISH + {0xA798, 0xA798, prUpper}, // L& LATIN CAPITAL LETTER F WITH STROKE + {0xA799, 0xA799, prLower}, // L& LATIN SMALL LETTER F WITH STROKE + {0xA79A, 0xA79A, prUpper}, // L& LATIN CAPITAL LETTER VOLAPUK AE + {0xA79B, 0xA79B, prLower}, // L& LATIN SMALL LETTER VOLAPUK AE + {0xA79C, 0xA79C, prUpper}, // L& LATIN CAPITAL LETTER VOLAPUK OE + {0xA79D, 0xA79D, prLower}, // L& LATIN SMALL LETTER VOLAPUK OE + {0xA79E, 0xA79E, prUpper}, // L& LATIN CAPITAL LETTER VOLAPUK UE + {0xA79F, 0xA79F, prLower}, // L& LATIN SMALL LETTER VOLAPUK UE + {0xA7A0, 0xA7A0, prUpper}, // L& LATIN CAPITAL LETTER G WITH OBLIQUE STROKE + {0xA7A1, 0xA7A1, prLower}, // L& LATIN SMALL LETTER G WITH OBLIQUE STROKE + {0xA7A2, 0xA7A2, prUpper}, // L& LATIN CAPITAL LETTER K WITH OBLIQUE STROKE + {0xA7A3, 0xA7A3, prLower}, // L& LATIN SMALL LETTER K WITH OBLIQUE STROKE + {0xA7A4, 0xA7A4, prUpper}, // L& LATIN CAPITAL LETTER N WITH OBLIQUE STROKE + {0xA7A5, 0xA7A5, prLower}, // L& LATIN SMALL LETTER N WITH OBLIQUE STROKE + {0xA7A6, 0xA7A6, prUpper}, // L& LATIN CAPITAL LETTER R WITH OBLIQUE STROKE + {0xA7A7, 0xA7A7, prLower}, // L& LATIN SMALL LETTER R WITH OBLIQUE STROKE + {0xA7A8, 0xA7A8, prUpper}, // L& LATIN CAPITAL LETTER S WITH OBLIQUE STROKE + {0xA7A9, 0xA7A9, prLower}, // L& LATIN SMALL LETTER S WITH OBLIQUE STROKE + {0xA7AA, 0xA7AE, prUpper}, // L& [5] LATIN CAPITAL LETTER H WITH HOOK..LATIN CAPITAL LETTER SMALL CAPITAL I + {0xA7AF, 0xA7AF, prLower}, // L& LATIN LETTER SMALL CAPITAL Q + {0xA7B0, 0xA7B4, prUpper}, // L& [5] LATIN CAPITAL LETTER TURNED K..LATIN CAPITAL LETTER BETA + {0xA7B5, 0xA7B5, prLower}, // L& LATIN SMALL LETTER BETA + {0xA7B6, 0xA7B6, prUpper}, // L& LATIN CAPITAL LETTER OMEGA + {0xA7B7, 0xA7B7, prLower}, // L& LATIN SMALL LETTER OMEGA + {0xA7B8, 0xA7B8, prUpper}, // L& LATIN CAPITAL LETTER U WITH STROKE + {0xA7B9, 0xA7B9, prLower}, // L& LATIN SMALL LETTER U WITH STROKE + {0xA7BA, 0xA7BA, prUpper}, // L& LATIN CAPITAL LETTER GLOTTAL A + {0xA7BB, 0xA7BB, prLower}, // L& LATIN SMALL LETTER GLOTTAL A + {0xA7BC, 0xA7BC, prUpper}, // L& LATIN CAPITAL LETTER GLOTTAL I + {0xA7BD, 0xA7BD, prLower}, // L& LATIN SMALL LETTER GLOTTAL I + {0xA7BE, 0xA7BE, prUpper}, // L& LATIN CAPITAL LETTER GLOTTAL U + {0xA7BF, 0xA7BF, prLower}, // L& LATIN SMALL LETTER GLOTTAL U + {0xA7C0, 0xA7C0, prUpper}, // L& LATIN CAPITAL LETTER OLD POLISH O + {0xA7C1, 0xA7C1, prLower}, // L& LATIN SMALL LETTER OLD POLISH O + {0xA7C2, 0xA7C2, prUpper}, // L& LATIN CAPITAL LETTER ANGLICANA W + {0xA7C3, 0xA7C3, prLower}, // L& LATIN SMALL LETTER ANGLICANA W + {0xA7C4, 0xA7C7, prUpper}, // L& [4] LATIN CAPITAL LETTER C WITH PALATAL HOOK..LATIN CAPITAL LETTER D WITH SHORT STROKE OVERLAY + {0xA7C8, 0xA7C8, prLower}, // L& LATIN SMALL LETTER D WITH SHORT STROKE OVERLAY + {0xA7C9, 0xA7C9, prUpper}, // L& LATIN CAPITAL LETTER S WITH SHORT STROKE OVERLAY + {0xA7CA, 0xA7CA, prLower}, // L& LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY + {0xA7D0, 0xA7D0, prUpper}, // L& LATIN CAPITAL LETTER CLOSED INSULAR G + {0xA7D1, 0xA7D1, prLower}, // L& LATIN SMALL LETTER CLOSED INSULAR G + {0xA7D3, 0xA7D3, prLower}, // L& LATIN SMALL LETTER DOUBLE THORN + {0xA7D5, 0xA7D5, prLower}, // L& LATIN SMALL LETTER DOUBLE WYNN + {0xA7D6, 0xA7D6, prUpper}, // L& LATIN CAPITAL LETTER MIDDLE SCOTS S + {0xA7D7, 0xA7D7, prLower}, // L& LATIN SMALL LETTER MIDDLE SCOTS S + {0xA7D8, 0xA7D8, prUpper}, // L& LATIN CAPITAL LETTER SIGMOID S + {0xA7D9, 0xA7D9, prLower}, // L& LATIN SMALL LETTER SIGMOID S + {0xA7F2, 0xA7F4, prOLetter}, // Lm [3] MODIFIER LETTER CAPITAL C..MODIFIER LETTER CAPITAL Q + {0xA7F5, 0xA7F5, prUpper}, // L& LATIN CAPITAL LETTER REVERSED HALF H + {0xA7F6, 0xA7F6, prLower}, // L& LATIN SMALL LETTER REVERSED HALF H + {0xA7F7, 0xA7F7, prOLetter}, // Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I + {0xA7F8, 0xA7F9, prLower}, // Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE + {0xA7FA, 0xA7FA, prLower}, // L& LATIN LETTER SMALL CAPITAL TURNED M + {0xA7FB, 0xA801, prOLetter}, // Lo [7] LATIN EPIGRAPHIC LETTER REVERSED F..SYLOTI NAGRI LETTER I + {0xA802, 0xA802, prExtend}, // Mn SYLOTI NAGRI SIGN DVISVARA + {0xA803, 0xA805, prOLetter}, // Lo [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O + {0xA806, 0xA806, prExtend}, // Mn SYLOTI NAGRI SIGN HASANTA + {0xA807, 0xA80A, prOLetter}, // Lo [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO + {0xA80B, 0xA80B, prExtend}, // Mn SYLOTI NAGRI SIGN ANUSVARA + {0xA80C, 0xA822, prOLetter}, // Lo [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO + {0xA823, 0xA824, prExtend}, // Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I + {0xA825, 0xA826, prExtend}, // Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E + {0xA827, 0xA827, prExtend}, // Mc SYLOTI NAGRI VOWEL SIGN OO + {0xA82C, 0xA82C, prExtend}, // Mn SYLOTI NAGRI SIGN ALTERNATE HASANTA + {0xA840, 0xA873, prOLetter}, // Lo [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU + {0xA876, 0xA877, prSTerm}, // Po [2] PHAGS-PA MARK SHAD..PHAGS-PA MARK DOUBLE SHAD + {0xA880, 0xA881, prExtend}, // Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA + {0xA882, 0xA8B3, prOLetter}, // Lo [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA + {0xA8B4, 0xA8C3, prExtend}, // Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU + {0xA8C4, 0xA8C5, prExtend}, // Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU + {0xA8CE, 0xA8CF, prSTerm}, // Po [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA + {0xA8D0, 0xA8D9, prNumeric}, // Nd [10] SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE + {0xA8E0, 0xA8F1, prExtend}, // Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA + {0xA8F2, 0xA8F7, prOLetter}, // Lo [6] DEVANAGARI SIGN SPACING CANDRABINDU..DEVANAGARI SIGN CANDRABINDU AVAGRAHA + {0xA8FB, 0xA8FB, prOLetter}, // Lo DEVANAGARI HEADSTROKE + {0xA8FD, 0xA8FE, prOLetter}, // Lo [2] DEVANAGARI JAIN OM..DEVANAGARI LETTER AY + {0xA8FF, 0xA8FF, prExtend}, // Mn DEVANAGARI VOWEL SIGN AY + {0xA900, 0xA909, prNumeric}, // Nd [10] KAYAH LI DIGIT ZERO..KAYAH LI DIGIT NINE + {0xA90A, 0xA925, prOLetter}, // Lo [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO + {0xA926, 0xA92D, prExtend}, // Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU + {0xA92F, 0xA92F, prSTerm}, // Po KAYAH LI SIGN SHYA + {0xA930, 0xA946, prOLetter}, // Lo [23] REJANG LETTER KA..REJANG LETTER A + {0xA947, 0xA951, prExtend}, // Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R + {0xA952, 0xA953, prExtend}, // Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA + {0xA960, 0xA97C, prOLetter}, // Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH + {0xA980, 0xA982, prExtend}, // Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR + {0xA983, 0xA983, prExtend}, // Mc JAVANESE SIGN WIGNYAN + {0xA984, 0xA9B2, prOLetter}, // Lo [47] JAVANESE LETTER A..JAVANESE LETTER HA + {0xA9B3, 0xA9B3, prExtend}, // Mn JAVANESE SIGN CECAK TELU + {0xA9B4, 0xA9B5, prExtend}, // Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG + {0xA9B6, 0xA9B9, prExtend}, // Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT + {0xA9BA, 0xA9BB, prExtend}, // Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE + {0xA9BC, 0xA9BD, prExtend}, // Mn [2] JAVANESE VOWEL SIGN PEPET..JAVANESE CONSONANT SIGN KERET + {0xA9BE, 0xA9C0, prExtend}, // Mc [3] JAVANESE CONSONANT SIGN PENGKAL..JAVANESE PANGKON + {0xA9C8, 0xA9C9, prSTerm}, // Po [2] JAVANESE PADA LINGSA..JAVANESE PADA LUNGSI + {0xA9CF, 0xA9CF, prOLetter}, // Lm JAVANESE PANGRANGKEP + {0xA9D0, 0xA9D9, prNumeric}, // Nd [10] JAVANESE DIGIT ZERO..JAVANESE DIGIT NINE + {0xA9E0, 0xA9E4, prOLetter}, // Lo [5] MYANMAR LETTER SHAN GHA..MYANMAR LETTER SHAN BHA + {0xA9E5, 0xA9E5, prExtend}, // Mn MYANMAR SIGN SHAN SAW + {0xA9E6, 0xA9E6, prOLetter}, // Lm MYANMAR MODIFIER LETTER SHAN REDUPLICATION + {0xA9E7, 0xA9EF, prOLetter}, // Lo [9] MYANMAR LETTER TAI LAING NYA..MYANMAR LETTER TAI LAING NNA + {0xA9F0, 0xA9F9, prNumeric}, // Nd [10] MYANMAR TAI LAING DIGIT ZERO..MYANMAR TAI LAING DIGIT NINE + {0xA9FA, 0xA9FE, prOLetter}, // Lo [5] MYANMAR LETTER TAI LAING LLA..MYANMAR LETTER TAI LAING BHA + {0xAA00, 0xAA28, prOLetter}, // Lo [41] CHAM LETTER A..CHAM LETTER HA + {0xAA29, 0xAA2E, prExtend}, // Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE + {0xAA2F, 0xAA30, prExtend}, // Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI + {0xAA31, 0xAA32, prExtend}, // Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE + {0xAA33, 0xAA34, prExtend}, // Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA + {0xAA35, 0xAA36, prExtend}, // Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA + {0xAA40, 0xAA42, prOLetter}, // Lo [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG + {0xAA43, 0xAA43, prExtend}, // Mn CHAM CONSONANT SIGN FINAL NG + {0xAA44, 0xAA4B, prOLetter}, // Lo [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS + {0xAA4C, 0xAA4C, prExtend}, // Mn CHAM CONSONANT SIGN FINAL M + {0xAA4D, 0xAA4D, prExtend}, // Mc CHAM CONSONANT SIGN FINAL H + {0xAA50, 0xAA59, prNumeric}, // Nd [10] CHAM DIGIT ZERO..CHAM DIGIT NINE + {0xAA5D, 0xAA5F, prSTerm}, // Po [3] CHAM PUNCTUATION DANDA..CHAM PUNCTUATION TRIPLE DANDA + {0xAA60, 0xAA6F, prOLetter}, // Lo [16] MYANMAR LETTER KHAMTI GA..MYANMAR LETTER KHAMTI FA + {0xAA70, 0xAA70, prOLetter}, // Lm MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION + {0xAA71, 0xAA76, prOLetter}, // Lo [6] MYANMAR LETTER KHAMTI XA..MYANMAR LOGOGRAM KHAMTI HM + {0xAA7A, 0xAA7A, prOLetter}, // Lo MYANMAR LETTER AITON RA + {0xAA7B, 0xAA7B, prExtend}, // Mc MYANMAR SIGN PAO KAREN TONE + {0xAA7C, 0xAA7C, prExtend}, // Mn MYANMAR SIGN TAI LAING TONE-2 + {0xAA7D, 0xAA7D, prExtend}, // Mc MYANMAR SIGN TAI LAING TONE-5 + {0xAA7E, 0xAAAF, prOLetter}, // Lo [50] MYANMAR LETTER SHWE PALAUNG CHA..TAI VIET LETTER HIGH O + {0xAAB0, 0xAAB0, prExtend}, // Mn TAI VIET MAI KANG + {0xAAB1, 0xAAB1, prOLetter}, // Lo TAI VIET VOWEL AA + {0xAAB2, 0xAAB4, prExtend}, // Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U + {0xAAB5, 0xAAB6, prOLetter}, // Lo [2] TAI VIET VOWEL E..TAI VIET VOWEL O + {0xAAB7, 0xAAB8, prExtend}, // Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA + {0xAAB9, 0xAABD, prOLetter}, // Lo [5] TAI VIET VOWEL UEA..TAI VIET VOWEL AN + {0xAABE, 0xAABF, prExtend}, // Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK + {0xAAC0, 0xAAC0, prOLetter}, // Lo TAI VIET TONE MAI NUENG + {0xAAC1, 0xAAC1, prExtend}, // Mn TAI VIET TONE MAI THO + {0xAAC2, 0xAAC2, prOLetter}, // Lo TAI VIET TONE MAI SONG + {0xAADB, 0xAADC, prOLetter}, // Lo [2] TAI VIET SYMBOL KON..TAI VIET SYMBOL NUENG + {0xAADD, 0xAADD, prOLetter}, // Lm TAI VIET SYMBOL SAM + {0xAAE0, 0xAAEA, prOLetter}, // Lo [11] MEETEI MAYEK LETTER E..MEETEI MAYEK LETTER SSA + {0xAAEB, 0xAAEB, prExtend}, // Mc MEETEI MAYEK VOWEL SIGN II + {0xAAEC, 0xAAED, prExtend}, // Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI + {0xAAEE, 0xAAEF, prExtend}, // Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU + {0xAAF0, 0xAAF1, prSTerm}, // Po [2] MEETEI MAYEK CHEIKHAN..MEETEI MAYEK AHANG KHUDAM + {0xAAF2, 0xAAF2, prOLetter}, // Lo MEETEI MAYEK ANJI + {0xAAF3, 0xAAF4, prOLetter}, // Lm [2] MEETEI MAYEK SYLLABLE REPETITION MARK..MEETEI MAYEK WORD REPETITION MARK + {0xAAF5, 0xAAF5, prExtend}, // Mc MEETEI MAYEK VOWEL SIGN VISARGA + {0xAAF6, 0xAAF6, prExtend}, // Mn MEETEI MAYEK VIRAMA + {0xAB01, 0xAB06, prOLetter}, // Lo [6] ETHIOPIC SYLLABLE TTHU..ETHIOPIC SYLLABLE TTHO + {0xAB09, 0xAB0E, prOLetter}, // Lo [6] ETHIOPIC SYLLABLE DDHU..ETHIOPIC SYLLABLE DDHO + {0xAB11, 0xAB16, prOLetter}, // Lo [6] ETHIOPIC SYLLABLE DZU..ETHIOPIC SYLLABLE DZO + {0xAB20, 0xAB26, prOLetter}, // Lo [7] ETHIOPIC SYLLABLE CCHHA..ETHIOPIC SYLLABLE CCHHO + {0xAB28, 0xAB2E, prOLetter}, // Lo [7] ETHIOPIC SYLLABLE BBA..ETHIOPIC SYLLABLE BBO + {0xAB30, 0xAB5A, prLower}, // L& [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG + {0xAB5C, 0xAB5F, prLower}, // Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK + {0xAB60, 0xAB68, prLower}, // L& [9] LATIN SMALL LETTER SAKHA YAT..LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE + {0xAB69, 0xAB69, prOLetter}, // Lm MODIFIER LETTER SMALL TURNED W + {0xAB70, 0xABBF, prLower}, // L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA + {0xABC0, 0xABE2, prOLetter}, // Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM + {0xABE3, 0xABE4, prExtend}, // Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP + {0xABE5, 0xABE5, prExtend}, // Mn MEETEI MAYEK VOWEL SIGN ANAP + {0xABE6, 0xABE7, prExtend}, // Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP + {0xABE8, 0xABE8, prExtend}, // Mn MEETEI MAYEK VOWEL SIGN UNAP + {0xABE9, 0xABEA, prExtend}, // Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG + {0xABEB, 0xABEB, prSTerm}, // Po MEETEI MAYEK CHEIKHEI + {0xABEC, 0xABEC, prExtend}, // Mc MEETEI MAYEK LUM IYEK + {0xABED, 0xABED, prExtend}, // Mn MEETEI MAYEK APUN IYEK + {0xABF0, 0xABF9, prNumeric}, // Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT NINE + {0xAC00, 0xD7A3, prOLetter}, // Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH + {0xD7B0, 0xD7C6, prOLetter}, // Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E + {0xD7CB, 0xD7FB, prOLetter}, // Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH + {0xF900, 0xFA6D, prOLetter}, // Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D + {0xFA70, 0xFAD9, prOLetter}, // Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 + {0xFB00, 0xFB06, prLower}, // L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST + {0xFB13, 0xFB17, prLower}, // L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH + {0xFB1D, 0xFB1D, prOLetter}, // Lo HEBREW LETTER YOD WITH HIRIQ + {0xFB1E, 0xFB1E, prExtend}, // Mn HEBREW POINT JUDEO-SPANISH VARIKA + {0xFB1F, 0xFB28, prOLetter}, // Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV + {0xFB2A, 0xFB36, prOLetter}, // Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH + {0xFB38, 0xFB3C, prOLetter}, // Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH + {0xFB3E, 0xFB3E, prOLetter}, // Lo HEBREW LETTER MEM WITH DAGESH + {0xFB40, 0xFB41, prOLetter}, // Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH + {0xFB43, 0xFB44, prOLetter}, // Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH + {0xFB46, 0xFBB1, prOLetter}, // Lo [108] HEBREW LETTER TSADI WITH DAGESH..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM + {0xFBD3, 0xFD3D, prOLetter}, // Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM + {0xFD3E, 0xFD3E, prClose}, // Pe ORNATE LEFT PARENTHESIS + {0xFD3F, 0xFD3F, prClose}, // Ps ORNATE RIGHT PARENTHESIS + {0xFD50, 0xFD8F, prOLetter}, // Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM + {0xFD92, 0xFDC7, prOLetter}, // Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM + {0xFDF0, 0xFDFB, prOLetter}, // Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU + {0xFE00, 0xFE0F, prExtend}, // Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 + {0xFE10, 0xFE11, prSContinue}, // Po [2] PRESENTATION FORM FOR VERTICAL COMMA..PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA + {0xFE13, 0xFE13, prSContinue}, // Po PRESENTATION FORM FOR VERTICAL COLON + {0xFE17, 0xFE17, prClose}, // Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET + {0xFE18, 0xFE18, prClose}, // Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET + {0xFE20, 0xFE2F, prExtend}, // Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF + {0xFE31, 0xFE32, prSContinue}, // Pd [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH + {0xFE35, 0xFE35, prClose}, // Ps PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS + {0xFE36, 0xFE36, prClose}, // Pe PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS + {0xFE37, 0xFE37, prClose}, // Ps PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET + {0xFE38, 0xFE38, prClose}, // Pe PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET + {0xFE39, 0xFE39, prClose}, // Ps PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET + {0xFE3A, 0xFE3A, prClose}, // Pe PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET + {0xFE3B, 0xFE3B, prClose}, // Ps PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET + {0xFE3C, 0xFE3C, prClose}, // Pe PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET + {0xFE3D, 0xFE3D, prClose}, // Ps PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET + {0xFE3E, 0xFE3E, prClose}, // Pe PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET + {0xFE3F, 0xFE3F, prClose}, // Ps PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET + {0xFE40, 0xFE40, prClose}, // Pe PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET + {0xFE41, 0xFE41, prClose}, // Ps PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET + {0xFE42, 0xFE42, prClose}, // Pe PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET + {0xFE43, 0xFE43, prClose}, // Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET + {0xFE44, 0xFE44, prClose}, // Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET + {0xFE47, 0xFE47, prClose}, // Ps PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET + {0xFE48, 0xFE48, prClose}, // Pe PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET + {0xFE50, 0xFE51, prSContinue}, // Po [2] SMALL COMMA..SMALL IDEOGRAPHIC COMMA + {0xFE52, 0xFE52, prATerm}, // Po SMALL FULL STOP + {0xFE55, 0xFE55, prSContinue}, // Po SMALL COLON + {0xFE56, 0xFE57, prSTerm}, // Po [2] SMALL QUESTION MARK..SMALL EXCLAMATION MARK + {0xFE58, 0xFE58, prSContinue}, // Pd SMALL EM DASH + {0xFE59, 0xFE59, prClose}, // Ps SMALL LEFT PARENTHESIS + {0xFE5A, 0xFE5A, prClose}, // Pe SMALL RIGHT PARENTHESIS + {0xFE5B, 0xFE5B, prClose}, // Ps SMALL LEFT CURLY BRACKET + {0xFE5C, 0xFE5C, prClose}, // Pe SMALL RIGHT CURLY BRACKET + {0xFE5D, 0xFE5D, prClose}, // Ps SMALL LEFT TORTOISE SHELL BRACKET + {0xFE5E, 0xFE5E, prClose}, // Pe SMALL RIGHT TORTOISE SHELL BRACKET + {0xFE63, 0xFE63, prSContinue}, // Pd SMALL HYPHEN-MINUS + {0xFE70, 0xFE74, prOLetter}, // Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM + {0xFE76, 0xFEFC, prOLetter}, // Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM + {0xFEFF, 0xFEFF, prFormat}, // Cf ZERO WIDTH NO-BREAK SPACE + {0xFF01, 0xFF01, prSTerm}, // Po FULLWIDTH EXCLAMATION MARK + {0xFF08, 0xFF08, prClose}, // Ps FULLWIDTH LEFT PARENTHESIS + {0xFF09, 0xFF09, prClose}, // Pe FULLWIDTH RIGHT PARENTHESIS + {0xFF0C, 0xFF0C, prSContinue}, // Po FULLWIDTH COMMA + {0xFF0D, 0xFF0D, prSContinue}, // Pd FULLWIDTH HYPHEN-MINUS + {0xFF0E, 0xFF0E, prATerm}, // Po FULLWIDTH FULL STOP + {0xFF10, 0xFF19, prNumeric}, // Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE + {0xFF1A, 0xFF1A, prSContinue}, // Po FULLWIDTH COLON + {0xFF1F, 0xFF1F, prSTerm}, // Po FULLWIDTH QUESTION MARK + {0xFF21, 0xFF3A, prUpper}, // L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z + {0xFF3B, 0xFF3B, prClose}, // Ps FULLWIDTH LEFT SQUARE BRACKET + {0xFF3D, 0xFF3D, prClose}, // Pe FULLWIDTH RIGHT SQUARE BRACKET + {0xFF41, 0xFF5A, prLower}, // L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z + {0xFF5B, 0xFF5B, prClose}, // Ps FULLWIDTH LEFT CURLY BRACKET + {0xFF5D, 0xFF5D, prClose}, // Pe FULLWIDTH RIGHT CURLY BRACKET + {0xFF5F, 0xFF5F, prClose}, // Ps FULLWIDTH LEFT WHITE PARENTHESIS + {0xFF60, 0xFF60, prClose}, // Pe FULLWIDTH RIGHT WHITE PARENTHESIS + {0xFF61, 0xFF61, prSTerm}, // Po HALFWIDTH IDEOGRAPHIC FULL STOP + {0xFF62, 0xFF62, prClose}, // Ps HALFWIDTH LEFT CORNER BRACKET + {0xFF63, 0xFF63, prClose}, // Pe HALFWIDTH RIGHT CORNER BRACKET + {0xFF64, 0xFF64, prSContinue}, // Po HALFWIDTH IDEOGRAPHIC COMMA + {0xFF66, 0xFF6F, prOLetter}, // Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU + {0xFF70, 0xFF70, prOLetter}, // Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK + {0xFF71, 0xFF9D, prOLetter}, // Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N + {0xFF9E, 0xFF9F, prExtend}, // Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK + {0xFFA0, 0xFFBE, prOLetter}, // Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH + {0xFFC2, 0xFFC7, prOLetter}, // Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E + {0xFFCA, 0xFFCF, prOLetter}, // Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE + {0xFFD2, 0xFFD7, prOLetter}, // Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU + {0xFFDA, 0xFFDC, prOLetter}, // Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I + {0xFFF9, 0xFFFB, prFormat}, // Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR + {0x10000, 0x1000B, prOLetter}, // Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE + {0x1000D, 0x10026, prOLetter}, // Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO + {0x10028, 0x1003A, prOLetter}, // Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO + {0x1003C, 0x1003D, prOLetter}, // Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE + {0x1003F, 0x1004D, prOLetter}, // Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO + {0x10050, 0x1005D, prOLetter}, // Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 + {0x10080, 0x100FA, prOLetter}, // Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 + {0x10140, 0x10174, prOLetter}, // Nl [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS + {0x101FD, 0x101FD, prExtend}, // Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE + {0x10280, 0x1029C, prOLetter}, // Lo [29] LYCIAN LETTER A..LYCIAN LETTER X + {0x102A0, 0x102D0, prOLetter}, // Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3 + {0x102E0, 0x102E0, prExtend}, // Mn COPTIC EPACT THOUSANDS MARK + {0x10300, 0x1031F, prOLetter}, // Lo [32] OLD ITALIC LETTER A..OLD ITALIC LETTER ESS + {0x1032D, 0x10340, prOLetter}, // Lo [20] OLD ITALIC LETTER YE..GOTHIC LETTER PAIRTHRA + {0x10341, 0x10341, prOLetter}, // Nl GOTHIC LETTER NINETY + {0x10342, 0x10349, prOLetter}, // Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL + {0x1034A, 0x1034A, prOLetter}, // Nl GOTHIC LETTER NINE HUNDRED + {0x10350, 0x10375, prOLetter}, // Lo [38] OLD PERMIC LETTER AN..OLD PERMIC LETTER IA + {0x10376, 0x1037A, prExtend}, // Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII + {0x10380, 0x1039D, prOLetter}, // Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU + {0x103A0, 0x103C3, prOLetter}, // Lo [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA + {0x103C8, 0x103CF, prOLetter}, // Lo [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH + {0x103D1, 0x103D5, prOLetter}, // Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED + {0x10400, 0x10427, prUpper}, // L& [40] DESERET CAPITAL LETTER LONG I..DESERET CAPITAL LETTER EW + {0x10428, 0x1044F, prLower}, // L& [40] DESERET SMALL LETTER LONG I..DESERET SMALL LETTER EW + {0x10450, 0x1049D, prOLetter}, // Lo [78] SHAVIAN LETTER PEEP..OSMANYA LETTER OO + {0x104A0, 0x104A9, prNumeric}, // Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE + {0x104B0, 0x104D3, prUpper}, // L& [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA + {0x104D8, 0x104FB, prLower}, // L& [36] OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA + {0x10500, 0x10527, prOLetter}, // Lo [40] ELBASAN LETTER A..ELBASAN LETTER KHE + {0x10530, 0x10563, prOLetter}, // Lo [52] CAUCASIAN ALBANIAN LETTER ALT..CAUCASIAN ALBANIAN LETTER KIW + {0x10570, 0x1057A, prUpper}, // L& [11] VITHKUQI CAPITAL LETTER A..VITHKUQI CAPITAL LETTER GA + {0x1057C, 0x1058A, prUpper}, // L& [15] VITHKUQI CAPITAL LETTER HA..VITHKUQI CAPITAL LETTER RE + {0x1058C, 0x10592, prUpper}, // L& [7] VITHKUQI CAPITAL LETTER SE..VITHKUQI CAPITAL LETTER XE + {0x10594, 0x10595, prUpper}, // L& [2] VITHKUQI CAPITAL LETTER Y..VITHKUQI CAPITAL LETTER ZE + {0x10597, 0x105A1, prLower}, // L& [11] VITHKUQI SMALL LETTER A..VITHKUQI SMALL LETTER GA + {0x105A3, 0x105B1, prLower}, // L& [15] VITHKUQI SMALL LETTER HA..VITHKUQI SMALL LETTER RE + {0x105B3, 0x105B9, prLower}, // L& [7] VITHKUQI SMALL LETTER SE..VITHKUQI SMALL LETTER XE + {0x105BB, 0x105BC, prLower}, // L& [2] VITHKUQI SMALL LETTER Y..VITHKUQI SMALL LETTER ZE + {0x10600, 0x10736, prOLetter}, // Lo [311] LINEAR A SIGN AB001..LINEAR A SIGN A664 + {0x10740, 0x10755, prOLetter}, // Lo [22] LINEAR A SIGN A701 A..LINEAR A SIGN A732 JE + {0x10760, 0x10767, prOLetter}, // Lo [8] LINEAR A SIGN A800..LINEAR A SIGN A807 + {0x10780, 0x10780, prLower}, // Lm MODIFIER LETTER SMALL CAPITAL AA + {0x10781, 0x10782, prOLetter}, // Lm [2] MODIFIER LETTER SUPERSCRIPT TRIANGULAR COLON..MODIFIER LETTER SUPERSCRIPT HALF TRIANGULAR COLON + {0x10783, 0x10785, prLower}, // Lm [3] MODIFIER LETTER SMALL AE..MODIFIER LETTER SMALL B WITH HOOK + {0x10787, 0x107B0, prLower}, // Lm [42] MODIFIER LETTER SMALL DZ DIGRAPH..MODIFIER LETTER SMALL V WITH RIGHT HOOK + {0x107B2, 0x107BA, prLower}, // Lm [9] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL S WITH CURL + {0x10800, 0x10805, prOLetter}, // Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA + {0x10808, 0x10808, prOLetter}, // Lo CYPRIOT SYLLABLE JO + {0x1080A, 0x10835, prOLetter}, // Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO + {0x10837, 0x10838, prOLetter}, // Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE + {0x1083C, 0x1083C, prOLetter}, // Lo CYPRIOT SYLLABLE ZA + {0x1083F, 0x10855, prOLetter}, // Lo [23] CYPRIOT SYLLABLE ZO..IMPERIAL ARAMAIC LETTER TAW + {0x10860, 0x10876, prOLetter}, // Lo [23] PALMYRENE LETTER ALEPH..PALMYRENE LETTER TAW + {0x10880, 0x1089E, prOLetter}, // Lo [31] NABATAEAN LETTER FINAL ALEPH..NABATAEAN LETTER TAW + {0x108E0, 0x108F2, prOLetter}, // Lo [19] HATRAN LETTER ALEPH..HATRAN LETTER QOPH + {0x108F4, 0x108F5, prOLetter}, // Lo [2] HATRAN LETTER SHIN..HATRAN LETTER TAW + {0x10900, 0x10915, prOLetter}, // Lo [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU + {0x10920, 0x10939, prOLetter}, // Lo [26] LYDIAN LETTER A..LYDIAN LETTER C + {0x10980, 0x109B7, prOLetter}, // Lo [56] MEROITIC HIEROGLYPHIC LETTER A..MEROITIC CURSIVE LETTER DA + {0x109BE, 0x109BF, prOLetter}, // Lo [2] MEROITIC CURSIVE LOGOGRAM RMT..MEROITIC CURSIVE LOGOGRAM IMN + {0x10A00, 0x10A00, prOLetter}, // Lo KHAROSHTHI LETTER A + {0x10A01, 0x10A03, prExtend}, // Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R + {0x10A05, 0x10A06, prExtend}, // Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O + {0x10A0C, 0x10A0F, prExtend}, // Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA + {0x10A10, 0x10A13, prOLetter}, // Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA + {0x10A15, 0x10A17, prOLetter}, // Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA + {0x10A19, 0x10A35, prOLetter}, // Lo [29] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER VHA + {0x10A38, 0x10A3A, prExtend}, // Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW + {0x10A3F, 0x10A3F, prExtend}, // Mn KHAROSHTHI VIRAMA + {0x10A56, 0x10A57, prSTerm}, // Po [2] KHAROSHTHI PUNCTUATION DANDA..KHAROSHTHI PUNCTUATION DOUBLE DANDA + {0x10A60, 0x10A7C, prOLetter}, // Lo [29] OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH + {0x10A80, 0x10A9C, prOLetter}, // Lo [29] OLD NORTH ARABIAN LETTER HEH..OLD NORTH ARABIAN LETTER ZAH + {0x10AC0, 0x10AC7, prOLetter}, // Lo [8] MANICHAEAN LETTER ALEPH..MANICHAEAN LETTER WAW + {0x10AC9, 0x10AE4, prOLetter}, // Lo [28] MANICHAEAN LETTER ZAYIN..MANICHAEAN LETTER TAW + {0x10AE5, 0x10AE6, prExtend}, // Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW + {0x10B00, 0x10B35, prOLetter}, // Lo [54] AVESTAN LETTER A..AVESTAN LETTER HE + {0x10B40, 0x10B55, prOLetter}, // Lo [22] INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW + {0x10B60, 0x10B72, prOLetter}, // Lo [19] INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW + {0x10B80, 0x10B91, prOLetter}, // Lo [18] PSALTER PAHLAVI LETTER ALEPH..PSALTER PAHLAVI LETTER TAW + {0x10C00, 0x10C48, prOLetter}, // Lo [73] OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH + {0x10C80, 0x10CB2, prUpper}, // L& [51] OLD HUNGARIAN CAPITAL LETTER A..OLD HUNGARIAN CAPITAL LETTER US + {0x10CC0, 0x10CF2, prLower}, // L& [51] OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US + {0x10D00, 0x10D23, prOLetter}, // Lo [36] HANIFI ROHINGYA LETTER A..HANIFI ROHINGYA MARK NA KHONNA + {0x10D24, 0x10D27, prExtend}, // Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI + {0x10D30, 0x10D39, prNumeric}, // Nd [10] HANIFI ROHINGYA DIGIT ZERO..HANIFI ROHINGYA DIGIT NINE + {0x10E80, 0x10EA9, prOLetter}, // Lo [42] YEZIDI LETTER ELIF..YEZIDI LETTER ET + {0x10EAB, 0x10EAC, prExtend}, // Mn [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK + {0x10EB0, 0x10EB1, prOLetter}, // Lo [2] YEZIDI LETTER LAM WITH DOT ABOVE..YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE + {0x10F00, 0x10F1C, prOLetter}, // Lo [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL + {0x10F27, 0x10F27, prOLetter}, // Lo OLD SOGDIAN LIGATURE AYIN-DALETH + {0x10F30, 0x10F45, prOLetter}, // Lo [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN + {0x10F46, 0x10F50, prExtend}, // Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW + {0x10F55, 0x10F59, prSTerm}, // Po [5] SOGDIAN PUNCTUATION TWO VERTICAL BARS..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT + {0x10F70, 0x10F81, prOLetter}, // Lo [18] OLD UYGHUR LETTER ALEPH..OLD UYGHUR LETTER LESH + {0x10F82, 0x10F85, prExtend}, // Mn [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW + {0x10F86, 0x10F89, prSTerm}, // Po [4] OLD UYGHUR PUNCTUATION BAR..OLD UYGHUR PUNCTUATION FOUR DOTS + {0x10FB0, 0x10FC4, prOLetter}, // Lo [21] CHORASMIAN LETTER ALEPH..CHORASMIAN LETTER TAW + {0x10FE0, 0x10FF6, prOLetter}, // Lo [23] ELYMAIC LETTER ALEPH..ELYMAIC LIGATURE ZAYIN-YODH + {0x11000, 0x11000, prExtend}, // Mc BRAHMI SIGN CANDRABINDU + {0x11001, 0x11001, prExtend}, // Mn BRAHMI SIGN ANUSVARA + {0x11002, 0x11002, prExtend}, // Mc BRAHMI SIGN VISARGA + {0x11003, 0x11037, prOLetter}, // Lo [53] BRAHMI SIGN JIHVAMULIYA..BRAHMI LETTER OLD TAMIL NNNA + {0x11038, 0x11046, prExtend}, // Mn [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA + {0x11047, 0x11048, prSTerm}, // Po [2] BRAHMI DANDA..BRAHMI DOUBLE DANDA + {0x11066, 0x1106F, prNumeric}, // Nd [10] BRAHMI DIGIT ZERO..BRAHMI DIGIT NINE + {0x11070, 0x11070, prExtend}, // Mn BRAHMI SIGN OLD TAMIL VIRAMA + {0x11071, 0x11072, prOLetter}, // Lo [2] BRAHMI LETTER OLD TAMIL SHORT E..BRAHMI LETTER OLD TAMIL SHORT O + {0x11073, 0x11074, prExtend}, // Mn [2] BRAHMI VOWEL SIGN OLD TAMIL SHORT E..BRAHMI VOWEL SIGN OLD TAMIL SHORT O + {0x11075, 0x11075, prOLetter}, // Lo BRAHMI LETTER OLD TAMIL LLA + {0x1107F, 0x11081, prExtend}, // Mn [3] BRAHMI NUMBER JOINER..KAITHI SIGN ANUSVARA + {0x11082, 0x11082, prExtend}, // Mc KAITHI SIGN VISARGA + {0x11083, 0x110AF, prOLetter}, // Lo [45] KAITHI LETTER A..KAITHI LETTER HA + {0x110B0, 0x110B2, prExtend}, // Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II + {0x110B3, 0x110B6, prExtend}, // Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI + {0x110B7, 0x110B8, prExtend}, // Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU + {0x110B9, 0x110BA, prExtend}, // Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA + {0x110BD, 0x110BD, prFormat}, // Cf KAITHI NUMBER SIGN + {0x110BE, 0x110C1, prSTerm}, // Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA + {0x110C2, 0x110C2, prExtend}, // Mn KAITHI VOWEL SIGN VOCALIC R + {0x110CD, 0x110CD, prFormat}, // Cf KAITHI NUMBER SIGN ABOVE + {0x110D0, 0x110E8, prOLetter}, // Lo [25] SORA SOMPENG LETTER SAH..SORA SOMPENG LETTER MAE + {0x110F0, 0x110F9, prNumeric}, // Nd [10] SORA SOMPENG DIGIT ZERO..SORA SOMPENG DIGIT NINE + {0x11100, 0x11102, prExtend}, // Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA + {0x11103, 0x11126, prOLetter}, // Lo [36] CHAKMA LETTER AA..CHAKMA LETTER HAA + {0x11127, 0x1112B, prExtend}, // Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU + {0x1112C, 0x1112C, prExtend}, // Mc CHAKMA VOWEL SIGN E + {0x1112D, 0x11134, prExtend}, // Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA + {0x11136, 0x1113F, prNumeric}, // Nd [10] CHAKMA DIGIT ZERO..CHAKMA DIGIT NINE + {0x11141, 0x11143, prSTerm}, // Po [3] CHAKMA DANDA..CHAKMA QUESTION MARK + {0x11144, 0x11144, prOLetter}, // Lo CHAKMA LETTER LHAA + {0x11145, 0x11146, prExtend}, // Mc [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI + {0x11147, 0x11147, prOLetter}, // Lo CHAKMA LETTER VAA + {0x11150, 0x11172, prOLetter}, // Lo [35] MAHAJANI LETTER A..MAHAJANI LETTER RRA + {0x11173, 0x11173, prExtend}, // Mn MAHAJANI SIGN NUKTA + {0x11176, 0x11176, prOLetter}, // Lo MAHAJANI LIGATURE SHRI + {0x11180, 0x11181, prExtend}, // Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA + {0x11182, 0x11182, prExtend}, // Mc SHARADA SIGN VISARGA + {0x11183, 0x111B2, prOLetter}, // Lo [48] SHARADA LETTER A..SHARADA LETTER HA + {0x111B3, 0x111B5, prExtend}, // Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II + {0x111B6, 0x111BE, prExtend}, // Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O + {0x111BF, 0x111C0, prExtend}, // Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA + {0x111C1, 0x111C4, prOLetter}, // Lo [4] SHARADA SIGN AVAGRAHA..SHARADA OM + {0x111C5, 0x111C6, prSTerm}, // Po [2] SHARADA DANDA..SHARADA DOUBLE DANDA + {0x111C9, 0x111CC, prExtend}, // Mn [4] SHARADA SANDHI MARK..SHARADA EXTRA SHORT VOWEL MARK + {0x111CD, 0x111CD, prSTerm}, // Po SHARADA SUTRA MARK + {0x111CE, 0x111CE, prExtend}, // Mc SHARADA VOWEL SIGN PRISHTHAMATRA E + {0x111CF, 0x111CF, prExtend}, // Mn SHARADA SIGN INVERTED CANDRABINDU + {0x111D0, 0x111D9, prNumeric}, // Nd [10] SHARADA DIGIT ZERO..SHARADA DIGIT NINE + {0x111DA, 0x111DA, prOLetter}, // Lo SHARADA EKAM + {0x111DC, 0x111DC, prOLetter}, // Lo SHARADA HEADSTROKE + {0x111DE, 0x111DF, prSTerm}, // Po [2] SHARADA SECTION MARK-1..SHARADA SECTION MARK-2 + {0x11200, 0x11211, prOLetter}, // Lo [18] KHOJKI LETTER A..KHOJKI LETTER JJA + {0x11213, 0x1122B, prOLetter}, // Lo [25] KHOJKI LETTER NYA..KHOJKI LETTER LLA + {0x1122C, 0x1122E, prExtend}, // Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II + {0x1122F, 0x11231, prExtend}, // Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI + {0x11232, 0x11233, prExtend}, // Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU + {0x11234, 0x11234, prExtend}, // Mn KHOJKI SIGN ANUSVARA + {0x11235, 0x11235, prExtend}, // Mc KHOJKI SIGN VIRAMA + {0x11236, 0x11237, prExtend}, // Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA + {0x11238, 0x11239, prSTerm}, // Po [2] KHOJKI DANDA..KHOJKI DOUBLE DANDA + {0x1123B, 0x1123C, prSTerm}, // Po [2] KHOJKI SECTION MARK..KHOJKI DOUBLE SECTION MARK + {0x1123E, 0x1123E, prExtend}, // Mn KHOJKI SIGN SUKUN + {0x11280, 0x11286, prOLetter}, // Lo [7] MULTANI LETTER A..MULTANI LETTER GA + {0x11288, 0x11288, prOLetter}, // Lo MULTANI LETTER GHA + {0x1128A, 0x1128D, prOLetter}, // Lo [4] MULTANI LETTER CA..MULTANI LETTER JJA + {0x1128F, 0x1129D, prOLetter}, // Lo [15] MULTANI LETTER NYA..MULTANI LETTER BA + {0x1129F, 0x112A8, prOLetter}, // Lo [10] MULTANI LETTER BHA..MULTANI LETTER RHA + {0x112A9, 0x112A9, prSTerm}, // Po MULTANI SECTION MARK + {0x112B0, 0x112DE, prOLetter}, // Lo [47] KHUDAWADI LETTER A..KHUDAWADI LETTER HA + {0x112DF, 0x112DF, prExtend}, // Mn KHUDAWADI SIGN ANUSVARA + {0x112E0, 0x112E2, prExtend}, // Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II + {0x112E3, 0x112EA, prExtend}, // Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA + {0x112F0, 0x112F9, prNumeric}, // Nd [10] KHUDAWADI DIGIT ZERO..KHUDAWADI DIGIT NINE + {0x11300, 0x11301, prExtend}, // Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU + {0x11302, 0x11303, prExtend}, // Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA + {0x11305, 0x1130C, prOLetter}, // Lo [8] GRANTHA LETTER A..GRANTHA LETTER VOCALIC L + {0x1130F, 0x11310, prOLetter}, // Lo [2] GRANTHA LETTER EE..GRANTHA LETTER AI + {0x11313, 0x11328, prOLetter}, // Lo [22] GRANTHA LETTER OO..GRANTHA LETTER NA + {0x1132A, 0x11330, prOLetter}, // Lo [7] GRANTHA LETTER PA..GRANTHA LETTER RA + {0x11332, 0x11333, prOLetter}, // Lo [2] GRANTHA LETTER LA..GRANTHA LETTER LLA + {0x11335, 0x11339, prOLetter}, // Lo [5] GRANTHA LETTER VA..GRANTHA LETTER HA + {0x1133B, 0x1133C, prExtend}, // Mn [2] COMBINING BINDU BELOW..GRANTHA SIGN NUKTA + {0x1133D, 0x1133D, prOLetter}, // Lo GRANTHA SIGN AVAGRAHA + {0x1133E, 0x1133F, prExtend}, // Mc [2] GRANTHA VOWEL SIGN AA..GRANTHA VOWEL SIGN I + {0x11340, 0x11340, prExtend}, // Mn GRANTHA VOWEL SIGN II + {0x11341, 0x11344, prExtend}, // Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR + {0x11347, 0x11348, prExtend}, // Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI + {0x1134B, 0x1134D, prExtend}, // Mc [3] GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA + {0x11350, 0x11350, prOLetter}, // Lo GRANTHA OM + {0x11357, 0x11357, prExtend}, // Mc GRANTHA AU LENGTH MARK + {0x1135D, 0x11361, prOLetter}, // Lo [5] GRANTHA SIGN PLUTA..GRANTHA LETTER VOCALIC LL + {0x11362, 0x11363, prExtend}, // Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL + {0x11366, 0x1136C, prExtend}, // Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX + {0x11370, 0x11374, prExtend}, // Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA + {0x11400, 0x11434, prOLetter}, // Lo [53] NEWA LETTER A..NEWA LETTER HA + {0x11435, 0x11437, prExtend}, // Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II + {0x11438, 0x1143F, prExtend}, // Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI + {0x11440, 0x11441, prExtend}, // Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU + {0x11442, 0x11444, prExtend}, // Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA + {0x11445, 0x11445, prExtend}, // Mc NEWA SIGN VISARGA + {0x11446, 0x11446, prExtend}, // Mn NEWA SIGN NUKTA + {0x11447, 0x1144A, prOLetter}, // Lo [4] NEWA SIGN AVAGRAHA..NEWA SIDDHI + {0x1144B, 0x1144C, prSTerm}, // Po [2] NEWA DANDA..NEWA DOUBLE DANDA + {0x11450, 0x11459, prNumeric}, // Nd [10] NEWA DIGIT ZERO..NEWA DIGIT NINE + {0x1145E, 0x1145E, prExtend}, // Mn NEWA SANDHI MARK + {0x1145F, 0x11461, prOLetter}, // Lo [3] NEWA LETTER VEDIC ANUSVARA..NEWA SIGN UPADHMANIYA + {0x11480, 0x114AF, prOLetter}, // Lo [48] TIRHUTA ANJI..TIRHUTA LETTER HA + {0x114B0, 0x114B2, prExtend}, // Mc [3] TIRHUTA VOWEL SIGN AA..TIRHUTA VOWEL SIGN II + {0x114B3, 0x114B8, prExtend}, // Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL + {0x114B9, 0x114B9, prExtend}, // Mc TIRHUTA VOWEL SIGN E + {0x114BA, 0x114BA, prExtend}, // Mn TIRHUTA VOWEL SIGN SHORT E + {0x114BB, 0x114BE, prExtend}, // Mc [4] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN AU + {0x114BF, 0x114C0, prExtend}, // Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA + {0x114C1, 0x114C1, prExtend}, // Mc TIRHUTA SIGN VISARGA + {0x114C2, 0x114C3, prExtend}, // Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA + {0x114C4, 0x114C5, prOLetter}, // Lo [2] TIRHUTA SIGN AVAGRAHA..TIRHUTA GVANG + {0x114C7, 0x114C7, prOLetter}, // Lo TIRHUTA OM + {0x114D0, 0x114D9, prNumeric}, // Nd [10] TIRHUTA DIGIT ZERO..TIRHUTA DIGIT NINE + {0x11580, 0x115AE, prOLetter}, // Lo [47] SIDDHAM LETTER A..SIDDHAM LETTER HA + {0x115AF, 0x115B1, prExtend}, // Mc [3] SIDDHAM VOWEL SIGN AA..SIDDHAM VOWEL SIGN II + {0x115B2, 0x115B5, prExtend}, // Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR + {0x115B8, 0x115BB, prExtend}, // Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU + {0x115BC, 0x115BD, prExtend}, // Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA + {0x115BE, 0x115BE, prExtend}, // Mc SIDDHAM SIGN VISARGA + {0x115BF, 0x115C0, prExtend}, // Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA + {0x115C2, 0x115C3, prSTerm}, // Po [2] SIDDHAM DANDA..SIDDHAM DOUBLE DANDA + {0x115C9, 0x115D7, prSTerm}, // Po [15] SIDDHAM END OF TEXT MARK..SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES + {0x115D8, 0x115DB, prOLetter}, // Lo [4] SIDDHAM LETTER THREE-CIRCLE ALTERNATE I..SIDDHAM LETTER ALTERNATE U + {0x115DC, 0x115DD, prExtend}, // Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU + {0x11600, 0x1162F, prOLetter}, // Lo [48] MODI LETTER A..MODI LETTER LLA + {0x11630, 0x11632, prExtend}, // Mc [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II + {0x11633, 0x1163A, prExtend}, // Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI + {0x1163B, 0x1163C, prExtend}, // Mc [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU + {0x1163D, 0x1163D, prExtend}, // Mn MODI SIGN ANUSVARA + {0x1163E, 0x1163E, prExtend}, // Mc MODI SIGN VISARGA + {0x1163F, 0x11640, prExtend}, // Mn [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA + {0x11641, 0x11642, prSTerm}, // Po [2] MODI DANDA..MODI DOUBLE DANDA + {0x11644, 0x11644, prOLetter}, // Lo MODI SIGN HUVA + {0x11650, 0x11659, prNumeric}, // Nd [10] MODI DIGIT ZERO..MODI DIGIT NINE + {0x11680, 0x116AA, prOLetter}, // Lo [43] TAKRI LETTER A..TAKRI LETTER RRA + {0x116AB, 0x116AB, prExtend}, // Mn TAKRI SIGN ANUSVARA + {0x116AC, 0x116AC, prExtend}, // Mc TAKRI SIGN VISARGA + {0x116AD, 0x116AD, prExtend}, // Mn TAKRI VOWEL SIGN AA + {0x116AE, 0x116AF, prExtend}, // Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II + {0x116B0, 0x116B5, prExtend}, // Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU + {0x116B6, 0x116B6, prExtend}, // Mc TAKRI SIGN VIRAMA + {0x116B7, 0x116B7, prExtend}, // Mn TAKRI SIGN NUKTA + {0x116B8, 0x116B8, prOLetter}, // Lo TAKRI LETTER ARCHAIC KHA + {0x116C0, 0x116C9, prNumeric}, // Nd [10] TAKRI DIGIT ZERO..TAKRI DIGIT NINE + {0x11700, 0x1171A, prOLetter}, // Lo [27] AHOM LETTER KA..AHOM LETTER ALTERNATE BA + {0x1171D, 0x1171F, prExtend}, // Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA + {0x11720, 0x11721, prExtend}, // Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA + {0x11722, 0x11725, prExtend}, // Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU + {0x11726, 0x11726, prExtend}, // Mc AHOM VOWEL SIGN E + {0x11727, 0x1172B, prExtend}, // Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER + {0x11730, 0x11739, prNumeric}, // Nd [10] AHOM DIGIT ZERO..AHOM DIGIT NINE + {0x1173C, 0x1173E, prSTerm}, // Po [3] AHOM SIGN SMALL SECTION..AHOM SIGN RULAI + {0x11740, 0x11746, prOLetter}, // Lo [7] AHOM LETTER CA..AHOM LETTER LLA + {0x11800, 0x1182B, prOLetter}, // Lo [44] DOGRA LETTER A..DOGRA LETTER RRA + {0x1182C, 0x1182E, prExtend}, // Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II + {0x1182F, 0x11837, prExtend}, // Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA + {0x11838, 0x11838, prExtend}, // Mc DOGRA SIGN VISARGA + {0x11839, 0x1183A, prExtend}, // Mn [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA + {0x118A0, 0x118BF, prUpper}, // L& [32] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI CAPITAL LETTER VIYO + {0x118C0, 0x118DF, prLower}, // L& [32] WARANG CITI SMALL LETTER NGAA..WARANG CITI SMALL LETTER VIYO + {0x118E0, 0x118E9, prNumeric}, // Nd [10] WARANG CITI DIGIT ZERO..WARANG CITI DIGIT NINE + {0x118FF, 0x11906, prOLetter}, // Lo [8] WARANG CITI OM..DIVES AKURU LETTER E + {0x11909, 0x11909, prOLetter}, // Lo DIVES AKURU LETTER O + {0x1190C, 0x11913, prOLetter}, // Lo [8] DIVES AKURU LETTER KA..DIVES AKURU LETTER JA + {0x11915, 0x11916, prOLetter}, // Lo [2] DIVES AKURU LETTER NYA..DIVES AKURU LETTER TTA + {0x11918, 0x1192F, prOLetter}, // Lo [24] DIVES AKURU LETTER DDA..DIVES AKURU LETTER ZA + {0x11930, 0x11935, prExtend}, // Mc [6] DIVES AKURU VOWEL SIGN AA..DIVES AKURU VOWEL SIGN E + {0x11937, 0x11938, prExtend}, // Mc [2] DIVES AKURU VOWEL SIGN AI..DIVES AKURU VOWEL SIGN O + {0x1193B, 0x1193C, prExtend}, // Mn [2] DIVES AKURU SIGN ANUSVARA..DIVES AKURU SIGN CANDRABINDU + {0x1193D, 0x1193D, prExtend}, // Mc DIVES AKURU SIGN HALANTA + {0x1193E, 0x1193E, prExtend}, // Mn DIVES AKURU VIRAMA + {0x1193F, 0x1193F, prOLetter}, // Lo DIVES AKURU PREFIXED NASAL SIGN + {0x11940, 0x11940, prExtend}, // Mc DIVES AKURU MEDIAL YA + {0x11941, 0x11941, prOLetter}, // Lo DIVES AKURU INITIAL RA + {0x11942, 0x11942, prExtend}, // Mc DIVES AKURU MEDIAL RA + {0x11943, 0x11943, prExtend}, // Mn DIVES AKURU SIGN NUKTA + {0x11944, 0x11944, prSTerm}, // Po DIVES AKURU DOUBLE DANDA + {0x11946, 0x11946, prSTerm}, // Po DIVES AKURU END OF TEXT MARK + {0x11950, 0x11959, prNumeric}, // Nd [10] DIVES AKURU DIGIT ZERO..DIVES AKURU DIGIT NINE + {0x119A0, 0x119A7, prOLetter}, // Lo [8] NANDINAGARI LETTER A..NANDINAGARI LETTER VOCALIC RR + {0x119AA, 0x119D0, prOLetter}, // Lo [39] NANDINAGARI LETTER E..NANDINAGARI LETTER RRA + {0x119D1, 0x119D3, prExtend}, // Mc [3] NANDINAGARI VOWEL SIGN AA..NANDINAGARI VOWEL SIGN II + {0x119D4, 0x119D7, prExtend}, // Mn [4] NANDINAGARI VOWEL SIGN U..NANDINAGARI VOWEL SIGN VOCALIC RR + {0x119DA, 0x119DB, prExtend}, // Mn [2] NANDINAGARI VOWEL SIGN E..NANDINAGARI VOWEL SIGN AI + {0x119DC, 0x119DF, prExtend}, // Mc [4] NANDINAGARI VOWEL SIGN O..NANDINAGARI SIGN VISARGA + {0x119E0, 0x119E0, prExtend}, // Mn NANDINAGARI SIGN VIRAMA + {0x119E1, 0x119E1, prOLetter}, // Lo NANDINAGARI SIGN AVAGRAHA + {0x119E3, 0x119E3, prOLetter}, // Lo NANDINAGARI HEADSTROKE + {0x119E4, 0x119E4, prExtend}, // Mc NANDINAGARI VOWEL SIGN PRISHTHAMATRA E + {0x11A00, 0x11A00, prOLetter}, // Lo ZANABAZAR SQUARE LETTER A + {0x11A01, 0x11A0A, prExtend}, // Mn [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK + {0x11A0B, 0x11A32, prOLetter}, // Lo [40] ZANABAZAR SQUARE LETTER KA..ZANABAZAR SQUARE LETTER KSSA + {0x11A33, 0x11A38, prExtend}, // Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA + {0x11A39, 0x11A39, prExtend}, // Mc ZANABAZAR SQUARE SIGN VISARGA + {0x11A3A, 0x11A3A, prOLetter}, // Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA + {0x11A3B, 0x11A3E, prExtend}, // Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA + {0x11A42, 0x11A43, prSTerm}, // Po [2] ZANABAZAR SQUARE MARK SHAD..ZANABAZAR SQUARE MARK DOUBLE SHAD + {0x11A47, 0x11A47, prExtend}, // Mn ZANABAZAR SQUARE SUBJOINER + {0x11A50, 0x11A50, prOLetter}, // Lo SOYOMBO LETTER A + {0x11A51, 0x11A56, prExtend}, // Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE + {0x11A57, 0x11A58, prExtend}, // Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU + {0x11A59, 0x11A5B, prExtend}, // Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK + {0x11A5C, 0x11A89, prOLetter}, // Lo [46] SOYOMBO LETTER KA..SOYOMBO CLUSTER-INITIAL LETTER SA + {0x11A8A, 0x11A96, prExtend}, // Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA + {0x11A97, 0x11A97, prExtend}, // Mc SOYOMBO SIGN VISARGA + {0x11A98, 0x11A99, prExtend}, // Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER + {0x11A9B, 0x11A9C, prSTerm}, // Po [2] SOYOMBO MARK SHAD..SOYOMBO MARK DOUBLE SHAD + {0x11A9D, 0x11A9D, prOLetter}, // Lo SOYOMBO MARK PLUTA + {0x11AB0, 0x11AF8, prOLetter}, // Lo [73] CANADIAN SYLLABICS NATTILIK HI..PAU CIN HAU GLOTTAL STOP FINAL + {0x11C00, 0x11C08, prOLetter}, // Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L + {0x11C0A, 0x11C2E, prOLetter}, // Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA + {0x11C2F, 0x11C2F, prExtend}, // Mc BHAIKSUKI VOWEL SIGN AA + {0x11C30, 0x11C36, prExtend}, // Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L + {0x11C38, 0x11C3D, prExtend}, // Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA + {0x11C3E, 0x11C3E, prExtend}, // Mc BHAIKSUKI SIGN VISARGA + {0x11C3F, 0x11C3F, prExtend}, // Mn BHAIKSUKI SIGN VIRAMA + {0x11C40, 0x11C40, prOLetter}, // Lo BHAIKSUKI SIGN AVAGRAHA + {0x11C41, 0x11C42, prSTerm}, // Po [2] BHAIKSUKI DANDA..BHAIKSUKI DOUBLE DANDA + {0x11C50, 0x11C59, prNumeric}, // Nd [10] BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE + {0x11C72, 0x11C8F, prOLetter}, // Lo [30] MARCHEN LETTER KA..MARCHEN LETTER A + {0x11C92, 0x11CA7, prExtend}, // Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA + {0x11CA9, 0x11CA9, prExtend}, // Mc MARCHEN SUBJOINED LETTER YA + {0x11CAA, 0x11CB0, prExtend}, // Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA + {0x11CB1, 0x11CB1, prExtend}, // Mc MARCHEN VOWEL SIGN I + {0x11CB2, 0x11CB3, prExtend}, // Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E + {0x11CB4, 0x11CB4, prExtend}, // Mc MARCHEN VOWEL SIGN O + {0x11CB5, 0x11CB6, prExtend}, // Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU + {0x11D00, 0x11D06, prOLetter}, // Lo [7] MASARAM GONDI LETTER A..MASARAM GONDI LETTER E + {0x11D08, 0x11D09, prOLetter}, // Lo [2] MASARAM GONDI LETTER AI..MASARAM GONDI LETTER O + {0x11D0B, 0x11D30, prOLetter}, // Lo [38] MASARAM GONDI LETTER AU..MASARAM GONDI LETTER TRA + {0x11D31, 0x11D36, prExtend}, // Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R + {0x11D3A, 0x11D3A, prExtend}, // Mn MASARAM GONDI VOWEL SIGN E + {0x11D3C, 0x11D3D, prExtend}, // Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O + {0x11D3F, 0x11D45, prExtend}, // Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA + {0x11D46, 0x11D46, prOLetter}, // Lo MASARAM GONDI REPHA + {0x11D47, 0x11D47, prExtend}, // Mn MASARAM GONDI RA-KARA + {0x11D50, 0x11D59, prNumeric}, // Nd [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE + {0x11D60, 0x11D65, prOLetter}, // Lo [6] GUNJALA GONDI LETTER A..GUNJALA GONDI LETTER UU + {0x11D67, 0x11D68, prOLetter}, // Lo [2] GUNJALA GONDI LETTER EE..GUNJALA GONDI LETTER AI + {0x11D6A, 0x11D89, prOLetter}, // Lo [32] GUNJALA GONDI LETTER OO..GUNJALA GONDI LETTER SA + {0x11D8A, 0x11D8E, prExtend}, // Mc [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU + {0x11D90, 0x11D91, prExtend}, // Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI + {0x11D93, 0x11D94, prExtend}, // Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU + {0x11D95, 0x11D95, prExtend}, // Mn GUNJALA GONDI SIGN ANUSVARA + {0x11D96, 0x11D96, prExtend}, // Mc GUNJALA GONDI SIGN VISARGA + {0x11D97, 0x11D97, prExtend}, // Mn GUNJALA GONDI VIRAMA + {0x11D98, 0x11D98, prOLetter}, // Lo GUNJALA GONDI OM + {0x11DA0, 0x11DA9, prNumeric}, // Nd [10] GUNJALA GONDI DIGIT ZERO..GUNJALA GONDI DIGIT NINE + {0x11EE0, 0x11EF2, prOLetter}, // Lo [19] MAKASAR LETTER KA..MAKASAR ANGKA + {0x11EF3, 0x11EF4, prExtend}, // Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U + {0x11EF5, 0x11EF6, prExtend}, // Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O + {0x11EF7, 0x11EF8, prSTerm}, // Po [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION + {0x11FB0, 0x11FB0, prOLetter}, // Lo LISU LETTER YHA + {0x12000, 0x12399, prOLetter}, // Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U + {0x12400, 0x1246E, prOLetter}, // Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM + {0x12480, 0x12543, prOLetter}, // Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU + {0x12F90, 0x12FF0, prOLetter}, // Lo [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114 + {0x13000, 0x1342E, prOLetter}, // Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032 + {0x13430, 0x13438, prFormat}, // Cf [9] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END SEGMENT + {0x14400, 0x14646, prOLetter}, // Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530 + {0x16800, 0x16A38, prOLetter}, // Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ + {0x16A40, 0x16A5E, prOLetter}, // Lo [31] MRO LETTER TA..MRO LETTER TEK + {0x16A60, 0x16A69, prNumeric}, // Nd [10] MRO DIGIT ZERO..MRO DIGIT NINE + {0x16A6E, 0x16A6F, prSTerm}, // Po [2] MRO DANDA..MRO DOUBLE DANDA + {0x16A70, 0x16ABE, prOLetter}, // Lo [79] TANGSA LETTER OZ..TANGSA LETTER ZA + {0x16AC0, 0x16AC9, prNumeric}, // Nd [10] TANGSA DIGIT ZERO..TANGSA DIGIT NINE + {0x16AD0, 0x16AED, prOLetter}, // Lo [30] BASSA VAH LETTER ENNI..BASSA VAH LETTER I + {0x16AF0, 0x16AF4, prExtend}, // Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE + {0x16AF5, 0x16AF5, prSTerm}, // Po BASSA VAH FULL STOP + {0x16B00, 0x16B2F, prOLetter}, // Lo [48] PAHAWH HMONG VOWEL KEEB..PAHAWH HMONG CONSONANT CAU + {0x16B30, 0x16B36, prExtend}, // Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM + {0x16B37, 0x16B38, prSTerm}, // Po [2] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN VOS TSHAB CEEB + {0x16B40, 0x16B43, prOLetter}, // Lm [4] PAHAWH HMONG SIGN VOS SEEV..PAHAWH HMONG SIGN IB YAM + {0x16B44, 0x16B44, prSTerm}, // Po PAHAWH HMONG SIGN XAUS + {0x16B50, 0x16B59, prNumeric}, // Nd [10] PAHAWH HMONG DIGIT ZERO..PAHAWH HMONG DIGIT NINE + {0x16B63, 0x16B77, prOLetter}, // Lo [21] PAHAWH HMONG SIGN VOS LUB..PAHAWH HMONG SIGN CIM NRES TOS + {0x16B7D, 0x16B8F, prOLetter}, // Lo [19] PAHAWH HMONG CLAN SIGN TSHEEJ..PAHAWH HMONG CLAN SIGN VWJ + {0x16E40, 0x16E5F, prUpper}, // L& [32] MEDEFAIDRIN CAPITAL LETTER M..MEDEFAIDRIN CAPITAL LETTER Y + {0x16E60, 0x16E7F, prLower}, // L& [32] MEDEFAIDRIN SMALL LETTER M..MEDEFAIDRIN SMALL LETTER Y + {0x16E98, 0x16E98, prSTerm}, // Po MEDEFAIDRIN FULL STOP + {0x16F00, 0x16F4A, prOLetter}, // Lo [75] MIAO LETTER PA..MIAO LETTER RTE + {0x16F4F, 0x16F4F, prExtend}, // Mn MIAO SIGN CONSONANT MODIFIER BAR + {0x16F50, 0x16F50, prOLetter}, // Lo MIAO LETTER NASALIZATION + {0x16F51, 0x16F87, prExtend}, // Mc [55] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN UI + {0x16F8F, 0x16F92, prExtend}, // Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW + {0x16F93, 0x16F9F, prOLetter}, // Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 + {0x16FE0, 0x16FE1, prOLetter}, // Lm [2] TANGUT ITERATION MARK..NUSHU ITERATION MARK + {0x16FE3, 0x16FE3, prOLetter}, // Lm OLD CHINESE ITERATION MARK + {0x16FE4, 0x16FE4, prExtend}, // Mn KHITAN SMALL SCRIPT FILLER + {0x16FF0, 0x16FF1, prExtend}, // Mc [2] VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY + {0x17000, 0x187F7, prOLetter}, // Lo [6136] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187F7 + {0x18800, 0x18CD5, prOLetter}, // Lo [1238] TANGUT COMPONENT-001..KHITAN SMALL SCRIPT CHARACTER-18CD5 + {0x18D00, 0x18D08, prOLetter}, // Lo [9] TANGUT IDEOGRAPH-18D00..TANGUT IDEOGRAPH-18D08 + {0x1AFF0, 0x1AFF3, prOLetter}, // Lm [4] KATAKANA LETTER MINNAN TONE-2..KATAKANA LETTER MINNAN TONE-5 + {0x1AFF5, 0x1AFFB, prOLetter}, // Lm [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5 + {0x1AFFD, 0x1AFFE, prOLetter}, // Lm [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8 + {0x1B000, 0x1B122, prOLetter}, // Lo [291] KATAKANA LETTER ARCHAIC E..KATAKANA LETTER ARCHAIC WU + {0x1B150, 0x1B152, prOLetter}, // Lo [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO + {0x1B164, 0x1B167, prOLetter}, // Lo [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N + {0x1B170, 0x1B2FB, prOLetter}, // Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB + {0x1BC00, 0x1BC6A, prOLetter}, // Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M + {0x1BC70, 0x1BC7C, prOLetter}, // Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK + {0x1BC80, 0x1BC88, prOLetter}, // Lo [9] DUPLOYAN AFFIX HIGH ACUTE..DUPLOYAN AFFIX HIGH VERTICAL + {0x1BC90, 0x1BC99, prOLetter}, // Lo [10] DUPLOYAN AFFIX LOW ACUTE..DUPLOYAN AFFIX LOW ARROW + {0x1BC9D, 0x1BC9E, prExtend}, // Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK + {0x1BC9F, 0x1BC9F, prSTerm}, // Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP + {0x1BCA0, 0x1BCA3, prFormat}, // Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP + {0x1CF00, 0x1CF2D, prExtend}, // Mn [46] ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON LEFT..ZNAMENNY COMBINING MARK KRYZH ON LEFT + {0x1CF30, 0x1CF46, prExtend}, // Mn [23] ZNAMENNY COMBINING TONAL RANGE MARK MRACHNO..ZNAMENNY PRIZNAK MODIFIER ROG + {0x1D165, 0x1D166, prExtend}, // Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM + {0x1D167, 0x1D169, prExtend}, // Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 + {0x1D16D, 0x1D172, prExtend}, // Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 + {0x1D173, 0x1D17A, prFormat}, // Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE + {0x1D17B, 0x1D182, prExtend}, // Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE + {0x1D185, 0x1D18B, prExtend}, // Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE + {0x1D1AA, 0x1D1AD, prExtend}, // Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO + {0x1D242, 0x1D244, prExtend}, // Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME + {0x1D400, 0x1D419, prUpper}, // L& [26] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL BOLD CAPITAL Z + {0x1D41A, 0x1D433, prLower}, // L& [26] MATHEMATICAL BOLD SMALL A..MATHEMATICAL BOLD SMALL Z + {0x1D434, 0x1D44D, prUpper}, // L& [26] MATHEMATICAL ITALIC CAPITAL A..MATHEMATICAL ITALIC CAPITAL Z + {0x1D44E, 0x1D454, prLower}, // L& [7] MATHEMATICAL ITALIC SMALL A..MATHEMATICAL ITALIC SMALL G + {0x1D456, 0x1D467, prLower}, // L& [18] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL ITALIC SMALL Z + {0x1D468, 0x1D481, prUpper}, // L& [26] MATHEMATICAL BOLD ITALIC CAPITAL A..MATHEMATICAL BOLD ITALIC CAPITAL Z + {0x1D482, 0x1D49B, prLower}, // L& [26] MATHEMATICAL BOLD ITALIC SMALL A..MATHEMATICAL BOLD ITALIC SMALL Z + {0x1D49C, 0x1D49C, prUpper}, // L& MATHEMATICAL SCRIPT CAPITAL A + {0x1D49E, 0x1D49F, prUpper}, // L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D + {0x1D4A2, 0x1D4A2, prUpper}, // L& MATHEMATICAL SCRIPT CAPITAL G + {0x1D4A5, 0x1D4A6, prUpper}, // L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K + {0x1D4A9, 0x1D4AC, prUpper}, // L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q + {0x1D4AE, 0x1D4B5, prUpper}, // L& [8] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT CAPITAL Z + {0x1D4B6, 0x1D4B9, prLower}, // L& [4] MATHEMATICAL SCRIPT SMALL A..MATHEMATICAL SCRIPT SMALL D + {0x1D4BB, 0x1D4BB, prLower}, // L& MATHEMATICAL SCRIPT SMALL F + {0x1D4BD, 0x1D4C3, prLower}, // L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N + {0x1D4C5, 0x1D4CF, prLower}, // L& [11] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL SCRIPT SMALL Z + {0x1D4D0, 0x1D4E9, prUpper}, // L& [26] MATHEMATICAL BOLD SCRIPT CAPITAL A..MATHEMATICAL BOLD SCRIPT CAPITAL Z + {0x1D4EA, 0x1D503, prLower}, // L& [26] MATHEMATICAL BOLD SCRIPT SMALL A..MATHEMATICAL BOLD SCRIPT SMALL Z + {0x1D504, 0x1D505, prUpper}, // L& [2] MATHEMATICAL FRAKTUR CAPITAL A..MATHEMATICAL FRAKTUR CAPITAL B + {0x1D507, 0x1D50A, prUpper}, // L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G + {0x1D50D, 0x1D514, prUpper}, // L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q + {0x1D516, 0x1D51C, prUpper}, // L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y + {0x1D51E, 0x1D537, prLower}, // L& [26] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL FRAKTUR SMALL Z + {0x1D538, 0x1D539, prUpper}, // L& [2] MATHEMATICAL DOUBLE-STRUCK CAPITAL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B + {0x1D53B, 0x1D53E, prUpper}, // L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G + {0x1D540, 0x1D544, prUpper}, // L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M + {0x1D546, 0x1D546, prUpper}, // L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O + {0x1D54A, 0x1D550, prUpper}, // L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y + {0x1D552, 0x1D56B, prLower}, // L& [26] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL DOUBLE-STRUCK SMALL Z + {0x1D56C, 0x1D585, prUpper}, // L& [26] MATHEMATICAL BOLD FRAKTUR CAPITAL A..MATHEMATICAL BOLD FRAKTUR CAPITAL Z + {0x1D586, 0x1D59F, prLower}, // L& [26] MATHEMATICAL BOLD FRAKTUR SMALL A..MATHEMATICAL BOLD FRAKTUR SMALL Z + {0x1D5A0, 0x1D5B9, prUpper}, // L& [26] MATHEMATICAL SANS-SERIF CAPITAL A..MATHEMATICAL SANS-SERIF CAPITAL Z + {0x1D5BA, 0x1D5D3, prLower}, // L& [26] MATHEMATICAL SANS-SERIF SMALL A..MATHEMATICAL SANS-SERIF SMALL Z + {0x1D5D4, 0x1D5ED, prUpper}, // L& [26] MATHEMATICAL SANS-SERIF BOLD CAPITAL A..MATHEMATICAL SANS-SERIF BOLD CAPITAL Z + {0x1D5EE, 0x1D607, prLower}, // L& [26] MATHEMATICAL SANS-SERIF BOLD SMALL A..MATHEMATICAL SANS-SERIF BOLD SMALL Z + {0x1D608, 0x1D621, prUpper}, // L& [26] MATHEMATICAL SANS-SERIF ITALIC CAPITAL A..MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z + {0x1D622, 0x1D63B, prLower}, // L& [26] MATHEMATICAL SANS-SERIF ITALIC SMALL A..MATHEMATICAL SANS-SERIF ITALIC SMALL Z + {0x1D63C, 0x1D655, prUpper}, // L& [26] MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z + {0x1D656, 0x1D66F, prLower}, // L& [26] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z + {0x1D670, 0x1D689, prUpper}, // L& [26] MATHEMATICAL MONOSPACE CAPITAL A..MATHEMATICAL MONOSPACE CAPITAL Z + {0x1D68A, 0x1D6A5, prLower}, // L& [28] MATHEMATICAL MONOSPACE SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J + {0x1D6A8, 0x1D6C0, prUpper}, // L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA + {0x1D6C2, 0x1D6DA, prLower}, // L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA + {0x1D6DC, 0x1D6E1, prLower}, // L& [6] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL BOLD PI SYMBOL + {0x1D6E2, 0x1D6FA, prUpper}, // L& [25] MATHEMATICAL ITALIC CAPITAL ALPHA..MATHEMATICAL ITALIC CAPITAL OMEGA + {0x1D6FC, 0x1D714, prLower}, // L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA + {0x1D716, 0x1D71B, prLower}, // L& [6] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL ITALIC PI SYMBOL + {0x1D71C, 0x1D734, prUpper}, // L& [25] MATHEMATICAL BOLD ITALIC CAPITAL ALPHA..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA + {0x1D736, 0x1D74E, prLower}, // L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA + {0x1D750, 0x1D755, prLower}, // L& [6] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC PI SYMBOL + {0x1D756, 0x1D76E, prUpper}, // L& [25] MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA + {0x1D770, 0x1D788, prLower}, // L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA + {0x1D78A, 0x1D78F, prLower}, // L& [6] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD PI SYMBOL + {0x1D790, 0x1D7A8, prUpper}, // L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA + {0x1D7AA, 0x1D7C2, prLower}, // L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA + {0x1D7C4, 0x1D7C9, prLower}, // L& [6] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL + {0x1D7CA, 0x1D7CA, prUpper}, // L& MATHEMATICAL BOLD CAPITAL DIGAMMA + {0x1D7CB, 0x1D7CB, prLower}, // L& MATHEMATICAL BOLD SMALL DIGAMMA + {0x1D7CE, 0x1D7FF, prNumeric}, // Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE + {0x1DA00, 0x1DA36, prExtend}, // Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN + {0x1DA3B, 0x1DA6C, prExtend}, // Mn [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT + {0x1DA75, 0x1DA75, prExtend}, // Mn SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS + {0x1DA84, 0x1DA84, prExtend}, // Mn SIGNWRITING LOCATION HEAD NECK + {0x1DA88, 0x1DA88, prSTerm}, // Po SIGNWRITING FULL STOP + {0x1DA9B, 0x1DA9F, prExtend}, // Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 + {0x1DAA1, 0x1DAAF, prExtend}, // Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 + {0x1DF00, 0x1DF09, prLower}, // L& [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK + {0x1DF0A, 0x1DF0A, prOLetter}, // Lo LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK + {0x1DF0B, 0x1DF1E, prLower}, // L& [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL + {0x1E000, 0x1E006, prExtend}, // Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE + {0x1E008, 0x1E018, prExtend}, // Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU + {0x1E01B, 0x1E021, prExtend}, // Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI + {0x1E023, 0x1E024, prExtend}, // Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS + {0x1E026, 0x1E02A, prExtend}, // Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA + {0x1E100, 0x1E12C, prOLetter}, // Lo [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W + {0x1E130, 0x1E136, prExtend}, // Mn [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D + {0x1E137, 0x1E13D, prOLetter}, // Lm [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER + {0x1E140, 0x1E149, prNumeric}, // Nd [10] NYIAKENG PUACHUE HMONG DIGIT ZERO..NYIAKENG PUACHUE HMONG DIGIT NINE + {0x1E14E, 0x1E14E, prOLetter}, // Lo NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ + {0x1E290, 0x1E2AD, prOLetter}, // Lo [30] TOTO LETTER PA..TOTO LETTER A + {0x1E2AE, 0x1E2AE, prExtend}, // Mn TOTO SIGN RISING TONE + {0x1E2C0, 0x1E2EB, prOLetter}, // Lo [44] WANCHO LETTER AA..WANCHO LETTER YIH + {0x1E2EC, 0x1E2EF, prExtend}, // Mn [4] WANCHO TONE TUP..WANCHO TONE KOINI + {0x1E2F0, 0x1E2F9, prNumeric}, // Nd [10] WANCHO DIGIT ZERO..WANCHO DIGIT NINE + {0x1E7E0, 0x1E7E6, prOLetter}, // Lo [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO + {0x1E7E8, 0x1E7EB, prOLetter}, // Lo [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE + {0x1E7ED, 0x1E7EE, prOLetter}, // Lo [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE + {0x1E7F0, 0x1E7FE, prOLetter}, // Lo [15] ETHIOPIC SYLLABLE GURAGE QWI..ETHIOPIC SYLLABLE GURAGE PWEE + {0x1E800, 0x1E8C4, prOLetter}, // Lo [197] MENDE KIKAKUI SYLLABLE M001 KI..MENDE KIKAKUI SYLLABLE M060 NYON + {0x1E8D0, 0x1E8D6, prExtend}, // Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS + {0x1E900, 0x1E921, prUpper}, // L& [34] ADLAM CAPITAL LETTER ALIF..ADLAM CAPITAL LETTER SHA + {0x1E922, 0x1E943, prLower}, // L& [34] ADLAM SMALL LETTER ALIF..ADLAM SMALL LETTER SHA + {0x1E944, 0x1E94A, prExtend}, // Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA + {0x1E94B, 0x1E94B, prOLetter}, // Lm ADLAM NASALIZATION MARK + {0x1E950, 0x1E959, prNumeric}, // Nd [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE + {0x1EE00, 0x1EE03, prOLetter}, // Lo [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL + {0x1EE05, 0x1EE1F, prOLetter}, // Lo [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF + {0x1EE21, 0x1EE22, prOLetter}, // Lo [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM + {0x1EE24, 0x1EE24, prOLetter}, // Lo ARABIC MATHEMATICAL INITIAL HEH + {0x1EE27, 0x1EE27, prOLetter}, // Lo ARABIC MATHEMATICAL INITIAL HAH + {0x1EE29, 0x1EE32, prOLetter}, // Lo [10] ARABIC MATHEMATICAL INITIAL YEH..ARABIC MATHEMATICAL INITIAL QAF + {0x1EE34, 0x1EE37, prOLetter}, // Lo [4] ARABIC MATHEMATICAL INITIAL SHEEN..ARABIC MATHEMATICAL INITIAL KHAH + {0x1EE39, 0x1EE39, prOLetter}, // Lo ARABIC MATHEMATICAL INITIAL DAD + {0x1EE3B, 0x1EE3B, prOLetter}, // Lo ARABIC MATHEMATICAL INITIAL GHAIN + {0x1EE42, 0x1EE42, prOLetter}, // Lo ARABIC MATHEMATICAL TAILED JEEM + {0x1EE47, 0x1EE47, prOLetter}, // Lo ARABIC MATHEMATICAL TAILED HAH + {0x1EE49, 0x1EE49, prOLetter}, // Lo ARABIC MATHEMATICAL TAILED YEH + {0x1EE4B, 0x1EE4B, prOLetter}, // Lo ARABIC MATHEMATICAL TAILED LAM + {0x1EE4D, 0x1EE4F, prOLetter}, // Lo [3] ARABIC MATHEMATICAL TAILED NOON..ARABIC MATHEMATICAL TAILED AIN + {0x1EE51, 0x1EE52, prOLetter}, // Lo [2] ARABIC MATHEMATICAL TAILED SAD..ARABIC MATHEMATICAL TAILED QAF + {0x1EE54, 0x1EE54, prOLetter}, // Lo ARABIC MATHEMATICAL TAILED SHEEN + {0x1EE57, 0x1EE57, prOLetter}, // Lo ARABIC MATHEMATICAL TAILED KHAH + {0x1EE59, 0x1EE59, prOLetter}, // Lo ARABIC MATHEMATICAL TAILED DAD + {0x1EE5B, 0x1EE5B, prOLetter}, // Lo ARABIC MATHEMATICAL TAILED GHAIN + {0x1EE5D, 0x1EE5D, prOLetter}, // Lo ARABIC MATHEMATICAL TAILED DOTLESS NOON + {0x1EE5F, 0x1EE5F, prOLetter}, // Lo ARABIC MATHEMATICAL TAILED DOTLESS QAF + {0x1EE61, 0x1EE62, prOLetter}, // Lo [2] ARABIC MATHEMATICAL STRETCHED BEH..ARABIC MATHEMATICAL STRETCHED JEEM + {0x1EE64, 0x1EE64, prOLetter}, // Lo ARABIC MATHEMATICAL STRETCHED HEH + {0x1EE67, 0x1EE6A, prOLetter}, // Lo [4] ARABIC MATHEMATICAL STRETCHED HAH..ARABIC MATHEMATICAL STRETCHED KAF + {0x1EE6C, 0x1EE72, prOLetter}, // Lo [7] ARABIC MATHEMATICAL STRETCHED MEEM..ARABIC MATHEMATICAL STRETCHED QAF + {0x1EE74, 0x1EE77, prOLetter}, // Lo [4] ARABIC MATHEMATICAL STRETCHED SHEEN..ARABIC MATHEMATICAL STRETCHED KHAH + {0x1EE79, 0x1EE7C, prOLetter}, // Lo [4] ARABIC MATHEMATICAL STRETCHED DAD..ARABIC MATHEMATICAL STRETCHED DOTLESS BEH + {0x1EE7E, 0x1EE7E, prOLetter}, // Lo ARABIC MATHEMATICAL STRETCHED DOTLESS FEH + {0x1EE80, 0x1EE89, prOLetter}, // Lo [10] ARABIC MATHEMATICAL LOOPED ALEF..ARABIC MATHEMATICAL LOOPED YEH + {0x1EE8B, 0x1EE9B, prOLetter}, // Lo [17] ARABIC MATHEMATICAL LOOPED LAM..ARABIC MATHEMATICAL LOOPED GHAIN + {0x1EEA1, 0x1EEA3, prOLetter}, // Lo [3] ARABIC MATHEMATICAL DOUBLE-STRUCK BEH..ARABIC MATHEMATICAL DOUBLE-STRUCK DAL + {0x1EEA5, 0x1EEA9, prOLetter}, // Lo [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH + {0x1EEAB, 0x1EEBB, prOLetter}, // Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN + {0x1F130, 0x1F149, prUpper}, // So [26] SQUARED LATIN CAPITAL LETTER A..SQUARED LATIN CAPITAL LETTER Z + {0x1F150, 0x1F169, prUpper}, // So [26] NEGATIVE CIRCLED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z + {0x1F170, 0x1F189, prUpper}, // So [26] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER Z + {0x1F676, 0x1F678, prClose}, // So [3] SANS-SERIF HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT..SANS-SERIF HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT + {0x1FBF0, 0x1FBF9, prNumeric}, // Nd [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE + {0x20000, 0x2A6DF, prOLetter}, // Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF + {0x2A700, 0x2B738, prOLetter}, // Lo [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738 + {0x2B740, 0x2B81D, prOLetter}, // Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D + {0x2B820, 0x2CEA1, prOLetter}, // Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 + {0x2CEB0, 0x2EBE0, prOLetter}, // Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 + {0x2F800, 0x2FA1D, prOLetter}, // Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D + {0x30000, 0x3134A, prOLetter}, // Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A + {0xE0001, 0xE0001, prFormat}, // Cf LANGUAGE TAG + {0xE0020, 0xE007F, prExtend}, // Cf [96] TAG SPACE..CANCEL TAG + {0xE0100, 0xE01EF, prExtend}, // Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 +} diff --git a/vendor/github.com/rivo/uniseg/sentencerules.go b/vendor/github.com/rivo/uniseg/sentencerules.go new file mode 100644 index 000000000..58c04794e --- /dev/null +++ b/vendor/github.com/rivo/uniseg/sentencerules.go @@ -0,0 +1,205 @@ +package uniseg + +import "unicode/utf8" + +// The states of the sentence break parser. +const ( + sbAny = iota + sbCR + sbParaSep + sbATerm + sbUpper + sbLower + sbSB7 + sbSB8Close + sbSB8Sp + sbSTerm + sbSB8aClose + sbSB8aSp +) + +// The sentence break parser's breaking instructions. +const ( + sbDontBreak = iota + sbBreak +) + +// The sentence break parser's state transitions. It's anologous to +// grTransitions, see comments there for details. Unicode version 14.0.0. +var sbTransitions = map[[2]int][3]int{ + // SB3. + {sbAny, prCR}: {sbCR, sbDontBreak, 9990}, + {sbCR, prLF}: {sbParaSep, sbDontBreak, 30}, + + // SB4. + {sbAny, prSep}: {sbParaSep, sbDontBreak, 9990}, + {sbAny, prLF}: {sbParaSep, sbDontBreak, 9990}, + {sbParaSep, prAny}: {sbAny, sbBreak, 40}, + {sbCR, prAny}: {sbAny, sbBreak, 40}, + + // SB6. + {sbAny, prATerm}: {sbATerm, sbDontBreak, 9990}, + {sbATerm, prNumeric}: {sbAny, sbDontBreak, 60}, + {sbSB7, prNumeric}: {sbAny, sbDontBreak, 60}, // Because ATerm also appears in SB7. + + // SB7. + {sbAny, prUpper}: {sbUpper, sbDontBreak, 9990}, + {sbAny, prLower}: {sbLower, sbDontBreak, 9990}, + {sbUpper, prATerm}: {sbSB7, sbDontBreak, 70}, + {sbLower, prATerm}: {sbSB7, sbDontBreak, 70}, + {sbSB7, prUpper}: {sbUpper, sbDontBreak, 70}, + + // SB8a. + {sbAny, prSTerm}: {sbSTerm, sbDontBreak, 9990}, + {sbATerm, prSContinue}: {sbAny, sbDontBreak, 81}, + {sbATerm, prATerm}: {sbATerm, sbDontBreak, 81}, + {sbATerm, prSTerm}: {sbSTerm, sbDontBreak, 81}, + {sbSB7, prSContinue}: {sbAny, sbDontBreak, 81}, + {sbSB7, prATerm}: {sbATerm, sbDontBreak, 81}, + {sbSB7, prSTerm}: {sbSTerm, sbDontBreak, 81}, + {sbSB8Close, prSContinue}: {sbAny, sbDontBreak, 81}, + {sbSB8Close, prATerm}: {sbATerm, sbDontBreak, 81}, + {sbSB8Close, prSTerm}: {sbSTerm, sbDontBreak, 81}, + {sbSB8Sp, prSContinue}: {sbAny, sbDontBreak, 81}, + {sbSB8Sp, prATerm}: {sbATerm, sbDontBreak, 81}, + {sbSB8Sp, prSTerm}: {sbSTerm, sbDontBreak, 81}, + {sbSTerm, prSContinue}: {sbAny, sbDontBreak, 81}, + {sbSTerm, prATerm}: {sbATerm, sbDontBreak, 81}, + {sbSTerm, prSTerm}: {sbSTerm, sbDontBreak, 81}, + {sbSB8aClose, prSContinue}: {sbAny, sbDontBreak, 81}, + {sbSB8aClose, prATerm}: {sbATerm, sbDontBreak, 81}, + {sbSB8aClose, prSTerm}: {sbSTerm, sbDontBreak, 81}, + {sbSB8aSp, prSContinue}: {sbAny, sbDontBreak, 81}, + {sbSB8aSp, prATerm}: {sbATerm, sbDontBreak, 81}, + {sbSB8aSp, prSTerm}: {sbSTerm, sbDontBreak, 81}, + + // SB9. + {sbATerm, prClose}: {sbSB8Close, sbDontBreak, 90}, + {sbSB7, prClose}: {sbSB8Close, sbDontBreak, 90}, + {sbSB8Close, prClose}: {sbSB8Close, sbDontBreak, 90}, + {sbATerm, prSp}: {sbSB8Sp, sbDontBreak, 90}, + {sbSB7, prSp}: {sbSB8Sp, sbDontBreak, 90}, + {sbSB8Close, prSp}: {sbSB8Sp, sbDontBreak, 90}, + {sbSTerm, prClose}: {sbSB8aClose, sbDontBreak, 90}, + {sbSB8aClose, prClose}: {sbSB8aClose, sbDontBreak, 90}, + {sbSTerm, prSp}: {sbSB8aSp, sbDontBreak, 90}, + {sbSB8aClose, prSp}: {sbSB8aSp, sbDontBreak, 90}, + {sbATerm, prSep}: {sbParaSep, sbDontBreak, 90}, + {sbATerm, prCR}: {sbParaSep, sbDontBreak, 90}, + {sbATerm, prLF}: {sbParaSep, sbDontBreak, 90}, + {sbSB7, prSep}: {sbParaSep, sbDontBreak, 90}, + {sbSB7, prCR}: {sbParaSep, sbDontBreak, 90}, + {sbSB7, prLF}: {sbParaSep, sbDontBreak, 90}, + {sbSB8Close, prSep}: {sbParaSep, sbDontBreak, 90}, + {sbSB8Close, prCR}: {sbParaSep, sbDontBreak, 90}, + {sbSB8Close, prLF}: {sbParaSep, sbDontBreak, 90}, + {sbSTerm, prSep}: {sbParaSep, sbDontBreak, 90}, + {sbSTerm, prCR}: {sbParaSep, sbDontBreak, 90}, + {sbSTerm, prLF}: {sbParaSep, sbDontBreak, 90}, + {sbSB8aClose, prSep}: {sbParaSep, sbDontBreak, 90}, + {sbSB8aClose, prCR}: {sbParaSep, sbDontBreak, 90}, + {sbSB8aClose, prLF}: {sbParaSep, sbDontBreak, 90}, + + // SB10. + {sbSB8Sp, prSp}: {sbSB8Sp, sbDontBreak, 100}, + {sbSB8aSp, prSp}: {sbSB8aSp, sbDontBreak, 100}, + {sbSB8Sp, prSep}: {sbParaSep, sbDontBreak, 100}, + {sbSB8Sp, prCR}: {sbParaSep, sbDontBreak, 100}, + {sbSB8Sp, prLF}: {sbParaSep, sbDontBreak, 100}, + + // SB11. + {sbATerm, prAny}: {sbAny, sbBreak, 110}, + {sbSB7, prAny}: {sbAny, sbBreak, 110}, + {sbSB8Close, prAny}: {sbAny, sbBreak, 110}, + {sbSB8Sp, prAny}: {sbAny, sbBreak, 110}, + {sbSTerm, prAny}: {sbAny, sbBreak, 110}, + {sbSB8aClose, prAny}: {sbAny, sbBreak, 110}, + {sbSB8aSp, prAny}: {sbAny, sbBreak, 110}, + // We'll always break after ParaSep due to SB4. +} + +// transitionSentenceBreakState determines the new state of the sentence break +// parser given the current state and the next code point. It also returns +// whether a sentence boundary was detected. If more than one code point is +// needed to determine the new state, the byte slice or the string starting +// after rune "r" can be used (whichever is not nil or empty) for further +// lookups. +func transitionSentenceBreakState(state int, r rune, b []byte, str string) (newState int, sentenceBreak bool) { + // Determine the property of the next character. + nextProperty := property(sentenceBreakCodePoints, r) + + // SB5 (Replacing Ignore Rules). + if nextProperty == prExtend || nextProperty == prFormat { + if state == sbParaSep || state == sbCR { + return sbAny, true // Make sure we don't apply SB5 to SB3 or SB4. + } + if state < 0 { + return sbAny, true // SB1. + } + return state, false + } + + // Find the applicable transition in the table. + var rule int + transition, ok := sbTransitions[[2]int{state, nextProperty}] + if ok { + // We have a specific transition. We'll use it. + newState, sentenceBreak, rule = transition[0], transition[1] == sbBreak, transition[2] + } else { + // No specific transition found. Try the less specific ones. + transAnyProp, okAnyProp := sbTransitions[[2]int{state, prAny}] + transAnyState, okAnyState := sbTransitions[[2]int{sbAny, nextProperty}] + if okAnyProp && okAnyState { + // Both apply. We'll use a mix (see comments for grTransitions). + newState, sentenceBreak, rule = transAnyState[0], transAnyState[1] == sbBreak, transAnyState[2] + if transAnyProp[2] < transAnyState[2] { + sentenceBreak, rule = transAnyProp[1] == sbBreak, transAnyProp[2] + } + } else if okAnyProp { + // We only have a specific state. + newState, sentenceBreak, rule = transAnyProp[0], transAnyProp[1] == sbBreak, transAnyProp[2] + // This branch will probably never be reached because okAnyState will + // always be true given the current transition map. But we keep it here + // for future modifications to the transition map where this may not be + // true anymore. + } else if okAnyState { + // We only have a specific property. + newState, sentenceBreak, rule = transAnyState[0], transAnyState[1] == sbBreak, transAnyState[2] + } else { + // No known transition. SB999: Any Ă— Any. + newState, sentenceBreak, rule = sbAny, false, 9990 + } + } + + // SB8. + if rule > 80 && (state == sbATerm || state == sbSB8Close || state == sbSB8Sp || state == sbSB7) { + // Check the right side of the rule. + var length int + for nextProperty != prOLetter && + nextProperty != prUpper && + nextProperty != prLower && + nextProperty != prSep && + nextProperty != prCR && + nextProperty != prLF && + nextProperty != prATerm && + nextProperty != prSTerm { + // Move on to the next rune. + if b != nil { // Byte slice version. + r, length = utf8.DecodeRune(b) + b = b[length:] + } else { // String version. + r, length = utf8.DecodeRuneInString(str) + str = str[length:] + } + if r == utf8.RuneError { + break + } + nextProperty = property(sentenceBreakCodePoints, r) + } + if nextProperty == prLower { + return sbLower, false + } + } + + return +} diff --git a/vendor/github.com/rivo/uniseg/step.go b/vendor/github.com/rivo/uniseg/step.go new file mode 100644 index 000000000..8c515a966 --- /dev/null +++ b/vendor/github.com/rivo/uniseg/step.go @@ -0,0 +1,198 @@ +package uniseg + +import "unicode/utf8" + +// The bit masks used to extract boundary information returned by the Step() +// function. +const ( + MaskLine = 3 + MaskWord = 4 + MaskSentence = 8 +) + +// The bit positions by which boundary flags are shifted by the Step() function. +// This must correspond to the Mask constants. +const ( + shiftWord = 2 + shiftSentence = 3 +) + +// The bit positions by which states are shifted by the Step() function. These +// values must ensure state values defined for each of the boundary algorithms +// don't overlap (and that they all still fit in a single int). +const ( + shiftWordState = 4 + shiftSentenceState = 9 + shiftLineState = 13 +) + +// The bit mask used to extract the state returned by the Step() function, after +// shifting. These values must correspond to the shift constants. +const ( + maskGraphemeState = 0xf + maskWordState = 0x1f + maskSentenceState = 0xf + maskLineState = 0xff +) + +// Step returns the first grapheme cluster (user-perceived character) found in +// the given byte slice. It also returns information about the boundary between +// that grapheme cluster and the one following it. There are three types of +// boundary information: word boundaries, sentence boundaries, and line breaks. +// This function is therefore a combination of FirstGraphemeCluster(), +// FirstWord(), FirstSentence(), and FirstLineSegment(). +// +// The "boundaries" return value can be evaluated as follows: +// +// - boundaries&MaskWord != 0: The boundary is a word boundary. +// - boundaries&MaskWord == 0: The boundary is not a word boundary. +// - boundaries&MaskSentence != 0: The boundary is a sentence boundary. +// - boundaries&MaskSentence == 0: The boundary is not a sentence boundary. +// - boundaries&MaskLine == LineDontBreak: You must not break the line at the +// boundary. +// - boundaries&MaskLine == LineMustBreak: You must break the line at the +// boundary. +// - boundaries&MaskLine == LineCanBreak: You may or may not break the line at +// the boundary. +// +// This function can be called continuously to extract all grapheme clusters +// from a byte slice, as illustrated in the examples below. +// +// If you don't know which state to pass, for example when calling the function +// for the first time, you must pass -1. For consecutive calls, pass the state +// and rest slice returned by the previous call. +// +// The "rest" slice is the sub-slice of the original byte slice "b" starting +// after the last byte of the identified grapheme cluster. If the length of the +// "rest" slice is 0, the entire byte slice "b" has been processed. The +// "cluster" byte slice is the sub-slice of the input slice containing the +// first identified grapheme cluster. +// +// Given an empty byte slice "b", the function returns nil values. +// +// While slightly less convenient than using the Graphemes class, this function +// has much better performance and makes no allocations. It lends itself well to +// large byte slices. +// +// Note that in accordance with UAX #14 LB3, the final segment will end with +// a mandatory line break (boundaries&MaskLine == LineMustBreak). You can choose +// to ignore this by checking if the length of the "rest" slice is 0 and calling +// [HasTrailingLineBreak] or [HasTrailingLineBreakInString] on the last rune. +func Step(b []byte, state int) (cluster, rest []byte, boundaries int, newState int) { + // An empty byte slice returns nothing. + if len(b) == 0 { + return + } + + // Extract the first rune. + r, length := utf8.DecodeRune(b) + if len(b) <= length { // If we're already past the end, there is nothing else to parse. + return b, nil, LineMustBreak | (1 << shiftWord) | (1 << shiftSentence), grAny | (wbAny << shiftWordState) | (sbAny << shiftSentenceState) | (lbAny << shiftLineState) + } + + // If we don't know the state, determine it now. + var graphemeState, wordState, sentenceState, lineState int + remainder := b[length:] + if state < 0 { + graphemeState, _ = transitionGraphemeState(state, r) + wordState, _ = transitionWordBreakState(state, r, remainder, "") + sentenceState, _ = transitionSentenceBreakState(state, r, remainder, "") + lineState, _ = transitionLineBreakState(state, r, remainder, "") + } else { + graphemeState = state & maskGraphemeState + wordState = (state >> shiftWordState) & maskWordState + sentenceState = (state >> shiftSentenceState) & maskSentenceState + lineState = (state >> shiftLineState) & maskLineState + } + + // Transition until we find a grapheme cluster boundary. + var ( + graphemeBoundary, wordBoundary, sentenceBoundary bool + lineBreak int + ) + for { + r, l := utf8.DecodeRune(remainder) + remainder = b[length+l:] + + graphemeState, graphemeBoundary = transitionGraphemeState(graphemeState, r) + wordState, wordBoundary = transitionWordBreakState(wordState, r, remainder, "") + sentenceState, sentenceBoundary = transitionSentenceBreakState(sentenceState, r, remainder, "") + lineState, lineBreak = transitionLineBreakState(lineState, r, remainder, "") + + if graphemeBoundary { + boundary := lineBreak + if wordBoundary { + boundary |= 1 << shiftWord + } + if sentenceBoundary { + boundary |= 1 << shiftSentence + } + return b[:length], b[length:], boundary, graphemeState | (wordState << shiftWordState) | (sentenceState << shiftSentenceState) | (lineState << shiftLineState) + } + + length += l + if len(b) <= length { + return b, nil, LineMustBreak | (1 << shiftWord) | (1 << shiftSentence), grAny | (wbAny << shiftWordState) | (sbAny << shiftSentenceState) | (lbAny << shiftLineState) + } + } +} + +// StepString is like [Step] but its input and outputs are strings. +func StepString(str string, state int) (cluster, rest string, boundaries int, newState int) { + // An empty byte slice returns nothing. + if len(str) == 0 { + return + } + + // Extract the first rune. + r, length := utf8.DecodeRuneInString(str) + if len(str) <= length { // If we're already past the end, there is nothing else to parse. + return str, "", LineMustBreak | (1 << shiftWord) | (1 << shiftSentence), grAny | (wbAny << shiftWordState) | (sbAny << shiftSentenceState) | (lbAny << shiftLineState) + } + + // If we don't know the state, determine it now. + var graphemeState, wordState, sentenceState, lineState int + remainder := str[length:] + if state < 0 { + graphemeState, _ = transitionGraphemeState(state, r) + wordState, _ = transitionWordBreakState(state, r, nil, remainder) + sentenceState, _ = transitionSentenceBreakState(state, r, nil, remainder) + lineState, _ = transitionLineBreakState(state, r, nil, remainder) + } else { + graphemeState = state & maskGraphemeState + wordState = (state >> shiftWordState) & maskWordState + sentenceState = (state >> shiftSentenceState) & maskSentenceState + lineState = (state >> shiftLineState) & maskLineState + } + + // Transition until we find a grapheme cluster boundary. + var ( + graphemeBoundary, wordBoundary, sentenceBoundary bool + lineBreak int + ) + for { + r, l := utf8.DecodeRuneInString(remainder) + remainder = str[length+l:] + + graphemeState, graphemeBoundary = transitionGraphemeState(graphemeState, r) + wordState, wordBoundary = transitionWordBreakState(wordState, r, nil, remainder) + sentenceState, sentenceBoundary = transitionSentenceBreakState(sentenceState, r, nil, remainder) + lineState, lineBreak = transitionLineBreakState(lineState, r, nil, remainder) + + if graphemeBoundary { + boundary := lineBreak + if wordBoundary { + boundary |= 1 << shiftWord + } + if sentenceBoundary { + boundary |= 1 << shiftSentence + } + return str[:length], str[length:], boundary, graphemeState | (wordState << shiftWordState) | (sentenceState << shiftSentenceState) | (lineState << shiftLineState) + } + + length += l + if len(str) <= length { + return str, "", LineMustBreak | (1 << shiftWord) | (1 << shiftSentence), grAny | (wbAny << shiftWordState) | (sbAny << shiftSentenceState) | (lbAny << shiftLineState) + } + } +} diff --git a/vendor/github.com/rivo/uniseg/word.go b/vendor/github.com/rivo/uniseg/word.go new file mode 100644 index 000000000..785af1e87 --- /dev/null +++ b/vendor/github.com/rivo/uniseg/word.go @@ -0,0 +1,87 @@ +package uniseg + +import "unicode/utf8" + +// FirstWord returns the first word found in the given byte slice according to +// the rules of Unicode Standard Annex #29, Word Boundaries. This function can +// be called continuously to extract all words from a byte slice, as illustrated +// in the example below. +// +// If you don't know the current state, for example when calling the function +// for the first time, you must pass -1. For consecutive calls, pass the state +// and rest slice returned by the previous call. +// +// The "rest" slice is the sub-slice of the original byte slice "b" starting +// after the last byte of the identified word. If the length of the "rest" slice +// is 0, the entire byte slice "b" has been processed. The "word" byte slice is +// the sub-slice of the input slice containing the identified word. +// +// Given an empty byte slice "b", the function returns nil values. +func FirstWord(b []byte, state int) (word, rest []byte, newState int) { + // An empty byte slice returns nothing. + if len(b) == 0 { + return + } + + // Extract the first rune. + r, length := utf8.DecodeRune(b) + if len(b) <= length { // If we're already past the end, there is nothing else to parse. + return b, nil, wbAny + } + + // If we don't know the state, determine it now. + if state < 0 { + state, _ = transitionWordBreakState(state, r, b[length:], "") + } + + // Transition until we find a boundary. + var boundary bool + for { + r, l := utf8.DecodeRune(b[length:]) + state, boundary = transitionWordBreakState(state, r, b[length+l:], "") + + if boundary { + return b[:length], b[length:], state + } + + length += l + if len(b) <= length { + return b, nil, wbAny + } + } +} + +// FirstWordInString is like [FirstWord] but its input and outputs are strings. +func FirstWordInString(str string, state int) (word, rest string, newState int) { + // An empty byte slice returns nothing. + if len(str) == 0 { + return + } + + // Extract the first rune. + r, length := utf8.DecodeRuneInString(str) + if len(str) <= length { // If we're already past the end, there is nothing else to parse. + return str, "", wbAny + } + + // If we don't know the state, determine it now. + if state < 0 { + state, _ = transitionWordBreakState(state, r, nil, str[length:]) + } + + // Transition until we find a boundary. + var boundary bool + for { + r, l := utf8.DecodeRuneInString(str[length:]) + state, boundary = transitionWordBreakState(state, r, nil, str[length+l:]) + + if boundary { + return str[:length], str[length:], state + } + + length += l + if len(str) <= length { + return str, "", wbAny + } + } +} diff --git a/vendor/github.com/rivo/uniseg/wordproperties.go b/vendor/github.com/rivo/uniseg/wordproperties.go new file mode 100644 index 000000000..48697a433 --- /dev/null +++ b/vendor/github.com/rivo/uniseg/wordproperties.go @@ -0,0 +1,1848 @@ +package uniseg + +// Code generated via go generate from gen_properties.go. DO NOT EDIT. + +// workBreakCodePoints are taken from +// https://www.unicode.org/Public/14.0.0/ucd/auxiliary/WordBreakProperty.txt +// and +// https://unicode.org/Public/14.0.0/ucd/emoji/emoji-data.txt +// ("Extended_Pictographic" only) +// on July 25, 2022. See https://www.unicode.org/license.html for the Unicode +// license agreement. +var workBreakCodePoints = [][3]int{ + {0x000A, 0x000A, prLF}, // Cc + {0x000B, 0x000C, prNewline}, // Cc [2] .. + {0x000D, 0x000D, prCR}, // Cc + {0x0020, 0x0020, prWSegSpace}, // Zs SPACE + {0x0022, 0x0022, prDoubleQuote}, // Po QUOTATION MARK + {0x0027, 0x0027, prSingleQuote}, // Po APOSTROPHE + {0x002C, 0x002C, prMidNum}, // Po COMMA + {0x002E, 0x002E, prMidNumLet}, // Po FULL STOP + {0x0030, 0x0039, prNumeric}, // Nd [10] DIGIT ZERO..DIGIT NINE + {0x003A, 0x003A, prMidLetter}, // Po COLON + {0x003B, 0x003B, prMidNum}, // Po SEMICOLON + {0x0041, 0x005A, prALetter}, // L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z + {0x005F, 0x005F, prExtendNumLet}, // Pc LOW LINE + {0x0061, 0x007A, prALetter}, // L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z + {0x0085, 0x0085, prNewline}, // Cc + {0x00A9, 0x00A9, prExtendedPictographic}, // E0.6 [1] (©️) copyright + {0x00AA, 0x00AA, prALetter}, // Lo FEMININE ORDINAL INDICATOR + {0x00AD, 0x00AD, prFormat}, // Cf SOFT HYPHEN + {0x00AE, 0x00AE, prExtendedPictographic}, // E0.6 [1] (®️) registered + {0x00B5, 0x00B5, prALetter}, // L& MICRO SIGN + {0x00B7, 0x00B7, prMidLetter}, // Po MIDDLE DOT + {0x00BA, 0x00BA, prALetter}, // Lo MASCULINE ORDINAL INDICATOR + {0x00C0, 0x00D6, prALetter}, // L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS + {0x00D8, 0x00F6, prALetter}, // L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS + {0x00F8, 0x01BA, prALetter}, // L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL + {0x01BB, 0x01BB, prALetter}, // Lo LATIN LETTER TWO WITH STROKE + {0x01BC, 0x01BF, prALetter}, // L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN + {0x01C0, 0x01C3, prALetter}, // Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK + {0x01C4, 0x0293, prALetter}, // L& [208] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER EZH WITH CURL + {0x0294, 0x0294, prALetter}, // Lo LATIN LETTER GLOTTAL STOP + {0x0295, 0x02AF, prALetter}, // L& [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL + {0x02B0, 0x02C1, prALetter}, // Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP + {0x02C2, 0x02C5, prALetter}, // Sk [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD + {0x02C6, 0x02D1, prALetter}, // Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON + {0x02D2, 0x02D7, prALetter}, // Sk [6] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER MINUS SIGN + {0x02DE, 0x02DF, prALetter}, // Sk [2] MODIFIER LETTER RHOTIC HOOK..MODIFIER LETTER CROSS ACCENT + {0x02E0, 0x02E4, prALetter}, // Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP + {0x02E5, 0x02EB, prALetter}, // Sk [7] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER YANG DEPARTING TONE MARK + {0x02EC, 0x02EC, prALetter}, // Lm MODIFIER LETTER VOICING + {0x02ED, 0x02ED, prALetter}, // Sk MODIFIER LETTER UNASPIRATED + {0x02EE, 0x02EE, prALetter}, // Lm MODIFIER LETTER DOUBLE APOSTROPHE + {0x02EF, 0x02FF, prALetter}, // Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW + {0x0300, 0x036F, prExtend}, // Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X + {0x0370, 0x0373, prALetter}, // L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI + {0x0374, 0x0374, prALetter}, // Lm GREEK NUMERAL SIGN + {0x0376, 0x0377, prALetter}, // L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA + {0x037A, 0x037A, prALetter}, // Lm GREEK YPOGEGRAMMENI + {0x037B, 0x037D, prALetter}, // L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL + {0x037E, 0x037E, prMidNum}, // Po GREEK QUESTION MARK + {0x037F, 0x037F, prALetter}, // L& GREEK CAPITAL LETTER YOT + {0x0386, 0x0386, prALetter}, // L& GREEK CAPITAL LETTER ALPHA WITH TONOS + {0x0387, 0x0387, prMidLetter}, // Po GREEK ANO TELEIA + {0x0388, 0x038A, prALetter}, // L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS + {0x038C, 0x038C, prALetter}, // L& GREEK CAPITAL LETTER OMICRON WITH TONOS + {0x038E, 0x03A1, prALetter}, // L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO + {0x03A3, 0x03F5, prALetter}, // L& [83] GREEK CAPITAL LETTER SIGMA..GREEK LUNATE EPSILON SYMBOL + {0x03F7, 0x0481, prALetter}, // L& [139] GREEK CAPITAL LETTER SHO..CYRILLIC SMALL LETTER KOPPA + {0x0483, 0x0487, prExtend}, // Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE + {0x0488, 0x0489, prExtend}, // Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN + {0x048A, 0x052F, prALetter}, // L& [166] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EL WITH DESCENDER + {0x0531, 0x0556, prALetter}, // L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH + {0x0559, 0x0559, prALetter}, // Lm ARMENIAN MODIFIER LETTER LEFT HALF RING + {0x055A, 0x055C, prALetter}, // Po [3] ARMENIAN APOSTROPHE..ARMENIAN EXCLAMATION MARK + {0x055E, 0x055E, prALetter}, // Po ARMENIAN QUESTION MARK + {0x055F, 0x055F, prMidLetter}, // Po ARMENIAN ABBREVIATION MARK + {0x0560, 0x0588, prALetter}, // L& [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE + {0x0589, 0x0589, prMidNum}, // Po ARMENIAN FULL STOP + {0x058A, 0x058A, prALetter}, // Pd ARMENIAN HYPHEN + {0x0591, 0x05BD, prExtend}, // Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG + {0x05BF, 0x05BF, prExtend}, // Mn HEBREW POINT RAFE + {0x05C1, 0x05C2, prExtend}, // Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT + {0x05C4, 0x05C5, prExtend}, // Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT + {0x05C7, 0x05C7, prExtend}, // Mn HEBREW POINT QAMATS QATAN + {0x05D0, 0x05EA, prHebrewLetter}, // Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV + {0x05EF, 0x05F2, prHebrewLetter}, // Lo [4] HEBREW YOD TRIANGLE..HEBREW LIGATURE YIDDISH DOUBLE YOD + {0x05F3, 0x05F3, prALetter}, // Po HEBREW PUNCTUATION GERESH + {0x05F4, 0x05F4, prMidLetter}, // Po HEBREW PUNCTUATION GERSHAYIM + {0x0600, 0x0605, prFormat}, // Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE + {0x060C, 0x060D, prMidNum}, // Po [2] ARABIC COMMA..ARABIC DATE SEPARATOR + {0x0610, 0x061A, prExtend}, // Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA + {0x061C, 0x061C, prFormat}, // Cf ARABIC LETTER MARK + {0x0620, 0x063F, prALetter}, // Lo [32] ARABIC LETTER KASHMIRI YEH..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE + {0x0640, 0x0640, prALetter}, // Lm ARABIC TATWEEL + {0x0641, 0x064A, prALetter}, // Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH + {0x064B, 0x065F, prExtend}, // Mn [21] ARABIC FATHATAN..ARABIC WAVY HAMZA BELOW + {0x0660, 0x0669, prNumeric}, // Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE + {0x066B, 0x066B, prNumeric}, // Po ARABIC DECIMAL SEPARATOR + {0x066C, 0x066C, prMidNum}, // Po ARABIC THOUSANDS SEPARATOR + {0x066E, 0x066F, prALetter}, // Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF + {0x0670, 0x0670, prExtend}, // Mn ARABIC LETTER SUPERSCRIPT ALEF + {0x0671, 0x06D3, prALetter}, // Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE + {0x06D5, 0x06D5, prALetter}, // Lo ARABIC LETTER AE + {0x06D6, 0x06DC, prExtend}, // Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN + {0x06DD, 0x06DD, prFormat}, // Cf ARABIC END OF AYAH + {0x06DF, 0x06E4, prExtend}, // Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA + {0x06E5, 0x06E6, prALetter}, // Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH + {0x06E7, 0x06E8, prExtend}, // Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON + {0x06EA, 0x06ED, prExtend}, // Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM + {0x06EE, 0x06EF, prALetter}, // Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V + {0x06F0, 0x06F9, prNumeric}, // Nd [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE + {0x06FA, 0x06FC, prALetter}, // Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW + {0x06FF, 0x06FF, prALetter}, // Lo ARABIC LETTER HEH WITH INVERTED V + {0x070F, 0x070F, prFormat}, // Cf SYRIAC ABBREVIATION MARK + {0x0710, 0x0710, prALetter}, // Lo SYRIAC LETTER ALAPH + {0x0711, 0x0711, prExtend}, // Mn SYRIAC LETTER SUPERSCRIPT ALAPH + {0x0712, 0x072F, prALetter}, // Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH + {0x0730, 0x074A, prExtend}, // Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH + {0x074D, 0x07A5, prALetter}, // Lo [89] SYRIAC LETTER SOGDIAN ZHAIN..THAANA LETTER WAAVU + {0x07A6, 0x07B0, prExtend}, // Mn [11] THAANA ABAFILI..THAANA SUKUN + {0x07B1, 0x07B1, prALetter}, // Lo THAANA LETTER NAA + {0x07C0, 0x07C9, prNumeric}, // Nd [10] NKO DIGIT ZERO..NKO DIGIT NINE + {0x07CA, 0x07EA, prALetter}, // Lo [33] NKO LETTER A..NKO LETTER JONA RA + {0x07EB, 0x07F3, prExtend}, // Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE + {0x07F4, 0x07F5, prALetter}, // Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE + {0x07F8, 0x07F8, prMidNum}, // Po NKO COMMA + {0x07FA, 0x07FA, prALetter}, // Lm NKO LAJANYALAN + {0x07FD, 0x07FD, prExtend}, // Mn NKO DANTAYALAN + {0x0800, 0x0815, prALetter}, // Lo [22] SAMARITAN LETTER ALAF..SAMARITAN LETTER TAAF + {0x0816, 0x0819, prExtend}, // Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH + {0x081A, 0x081A, prALetter}, // Lm SAMARITAN MODIFIER LETTER EPENTHETIC YUT + {0x081B, 0x0823, prExtend}, // Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A + {0x0824, 0x0824, prALetter}, // Lm SAMARITAN MODIFIER LETTER SHORT A + {0x0825, 0x0827, prExtend}, // Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U + {0x0828, 0x0828, prALetter}, // Lm SAMARITAN MODIFIER LETTER I + {0x0829, 0x082D, prExtend}, // Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA + {0x0840, 0x0858, prALetter}, // Lo [25] MANDAIC LETTER HALQA..MANDAIC LETTER AIN + {0x0859, 0x085B, prExtend}, // Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK + {0x0860, 0x086A, prALetter}, // Lo [11] SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA + {0x0870, 0x0887, prALetter}, // Lo [24] ARABIC LETTER ALEF WITH ATTACHED FATHA..ARABIC BASELINE ROUND DOT + {0x0889, 0x088E, prALetter}, // Lo [6] ARABIC LETTER NOON WITH INVERTED SMALL V..ARABIC VERTICAL TAIL + {0x0890, 0x0891, prFormat}, // Cf [2] ARABIC POUND MARK ABOVE..ARABIC PIASTRE MARK ABOVE + {0x0898, 0x089F, prExtend}, // Mn [8] ARABIC SMALL HIGH WORD AL-JUZ..ARABIC HALF MADDA OVER MADDA + {0x08A0, 0x08C8, prALetter}, // Lo [41] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER GRAF + {0x08C9, 0x08C9, prALetter}, // Lm ARABIC SMALL FARSI YEH + {0x08CA, 0x08E1, prExtend}, // Mn [24] ARABIC SMALL HIGH FARSI YEH..ARABIC SMALL HIGH SIGN SAFHA + {0x08E2, 0x08E2, prFormat}, // Cf ARABIC DISPUTED END OF AYAH + {0x08E3, 0x0902, prExtend}, // Mn [32] ARABIC TURNED DAMMA BELOW..DEVANAGARI SIGN ANUSVARA + {0x0903, 0x0903, prExtend}, // Mc DEVANAGARI SIGN VISARGA + {0x0904, 0x0939, prALetter}, // Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA + {0x093A, 0x093A, prExtend}, // Mn DEVANAGARI VOWEL SIGN OE + {0x093B, 0x093B, prExtend}, // Mc DEVANAGARI VOWEL SIGN OOE + {0x093C, 0x093C, prExtend}, // Mn DEVANAGARI SIGN NUKTA + {0x093D, 0x093D, prALetter}, // Lo DEVANAGARI SIGN AVAGRAHA + {0x093E, 0x0940, prExtend}, // Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II + {0x0941, 0x0948, prExtend}, // Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI + {0x0949, 0x094C, prExtend}, // Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU + {0x094D, 0x094D, prExtend}, // Mn DEVANAGARI SIGN VIRAMA + {0x094E, 0x094F, prExtend}, // Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW + {0x0950, 0x0950, prALetter}, // Lo DEVANAGARI OM + {0x0951, 0x0957, prExtend}, // Mn [7] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN UUE + {0x0958, 0x0961, prALetter}, // Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL + {0x0962, 0x0963, prExtend}, // Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL + {0x0966, 0x096F, prNumeric}, // Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE + {0x0971, 0x0971, prALetter}, // Lm DEVANAGARI SIGN HIGH SPACING DOT + {0x0972, 0x0980, prALetter}, // Lo [15] DEVANAGARI LETTER CANDRA A..BENGALI ANJI + {0x0981, 0x0981, prExtend}, // Mn BENGALI SIGN CANDRABINDU + {0x0982, 0x0983, prExtend}, // Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA + {0x0985, 0x098C, prALetter}, // Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L + {0x098F, 0x0990, prALetter}, // Lo [2] BENGALI LETTER E..BENGALI LETTER AI + {0x0993, 0x09A8, prALetter}, // Lo [22] BENGALI LETTER O..BENGALI LETTER NA + {0x09AA, 0x09B0, prALetter}, // Lo [7] BENGALI LETTER PA..BENGALI LETTER RA + {0x09B2, 0x09B2, prALetter}, // Lo BENGALI LETTER LA + {0x09B6, 0x09B9, prALetter}, // Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA + {0x09BC, 0x09BC, prExtend}, // Mn BENGALI SIGN NUKTA + {0x09BD, 0x09BD, prALetter}, // Lo BENGALI SIGN AVAGRAHA + {0x09BE, 0x09C0, prExtend}, // Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II + {0x09C1, 0x09C4, prExtend}, // Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR + {0x09C7, 0x09C8, prExtend}, // Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI + {0x09CB, 0x09CC, prExtend}, // Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU + {0x09CD, 0x09CD, prExtend}, // Mn BENGALI SIGN VIRAMA + {0x09CE, 0x09CE, prALetter}, // Lo BENGALI LETTER KHANDA TA + {0x09D7, 0x09D7, prExtend}, // Mc BENGALI AU LENGTH MARK + {0x09DC, 0x09DD, prALetter}, // Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA + {0x09DF, 0x09E1, prALetter}, // Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL + {0x09E2, 0x09E3, prExtend}, // Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL + {0x09E6, 0x09EF, prNumeric}, // Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE + {0x09F0, 0x09F1, prALetter}, // Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL + {0x09FC, 0x09FC, prALetter}, // Lo BENGALI LETTER VEDIC ANUSVARA + {0x09FE, 0x09FE, prExtend}, // Mn BENGALI SANDHI MARK + {0x0A01, 0x0A02, prExtend}, // Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI + {0x0A03, 0x0A03, prExtend}, // Mc GURMUKHI SIGN VISARGA + {0x0A05, 0x0A0A, prALetter}, // Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU + {0x0A0F, 0x0A10, prALetter}, // Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI + {0x0A13, 0x0A28, prALetter}, // Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA + {0x0A2A, 0x0A30, prALetter}, // Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA + {0x0A32, 0x0A33, prALetter}, // Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA + {0x0A35, 0x0A36, prALetter}, // Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA + {0x0A38, 0x0A39, prALetter}, // Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA + {0x0A3C, 0x0A3C, prExtend}, // Mn GURMUKHI SIGN NUKTA + {0x0A3E, 0x0A40, prExtend}, // Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II + {0x0A41, 0x0A42, prExtend}, // Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU + {0x0A47, 0x0A48, prExtend}, // Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI + {0x0A4B, 0x0A4D, prExtend}, // Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA + {0x0A51, 0x0A51, prExtend}, // Mn GURMUKHI SIGN UDAAT + {0x0A59, 0x0A5C, prALetter}, // Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA + {0x0A5E, 0x0A5E, prALetter}, // Lo GURMUKHI LETTER FA + {0x0A66, 0x0A6F, prNumeric}, // Nd [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE + {0x0A70, 0x0A71, prExtend}, // Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK + {0x0A72, 0x0A74, prALetter}, // Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR + {0x0A75, 0x0A75, prExtend}, // Mn GURMUKHI SIGN YAKASH + {0x0A81, 0x0A82, prExtend}, // Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA + {0x0A83, 0x0A83, prExtend}, // Mc GUJARATI SIGN VISARGA + {0x0A85, 0x0A8D, prALetter}, // Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E + {0x0A8F, 0x0A91, prALetter}, // Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O + {0x0A93, 0x0AA8, prALetter}, // Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA + {0x0AAA, 0x0AB0, prALetter}, // Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA + {0x0AB2, 0x0AB3, prALetter}, // Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA + {0x0AB5, 0x0AB9, prALetter}, // Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA + {0x0ABC, 0x0ABC, prExtend}, // Mn GUJARATI SIGN NUKTA + {0x0ABD, 0x0ABD, prALetter}, // Lo GUJARATI SIGN AVAGRAHA + {0x0ABE, 0x0AC0, prExtend}, // Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II + {0x0AC1, 0x0AC5, prExtend}, // Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E + {0x0AC7, 0x0AC8, prExtend}, // Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI + {0x0AC9, 0x0AC9, prExtend}, // Mc GUJARATI VOWEL SIGN CANDRA O + {0x0ACB, 0x0ACC, prExtend}, // Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU + {0x0ACD, 0x0ACD, prExtend}, // Mn GUJARATI SIGN VIRAMA + {0x0AD0, 0x0AD0, prALetter}, // Lo GUJARATI OM + {0x0AE0, 0x0AE1, prALetter}, // Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL + {0x0AE2, 0x0AE3, prExtend}, // Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL + {0x0AE6, 0x0AEF, prNumeric}, // Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE + {0x0AF9, 0x0AF9, prALetter}, // Lo GUJARATI LETTER ZHA + {0x0AFA, 0x0AFF, prExtend}, // Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE + {0x0B01, 0x0B01, prExtend}, // Mn ORIYA SIGN CANDRABINDU + {0x0B02, 0x0B03, prExtend}, // Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA + {0x0B05, 0x0B0C, prALetter}, // Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L + {0x0B0F, 0x0B10, prALetter}, // Lo [2] ORIYA LETTER E..ORIYA LETTER AI + {0x0B13, 0x0B28, prALetter}, // Lo [22] ORIYA LETTER O..ORIYA LETTER NA + {0x0B2A, 0x0B30, prALetter}, // Lo [7] ORIYA LETTER PA..ORIYA LETTER RA + {0x0B32, 0x0B33, prALetter}, // Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA + {0x0B35, 0x0B39, prALetter}, // Lo [5] ORIYA LETTER VA..ORIYA LETTER HA + {0x0B3C, 0x0B3C, prExtend}, // Mn ORIYA SIGN NUKTA + {0x0B3D, 0x0B3D, prALetter}, // Lo ORIYA SIGN AVAGRAHA + {0x0B3E, 0x0B3E, prExtend}, // Mc ORIYA VOWEL SIGN AA + {0x0B3F, 0x0B3F, prExtend}, // Mn ORIYA VOWEL SIGN I + {0x0B40, 0x0B40, prExtend}, // Mc ORIYA VOWEL SIGN II + {0x0B41, 0x0B44, prExtend}, // Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR + {0x0B47, 0x0B48, prExtend}, // Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI + {0x0B4B, 0x0B4C, prExtend}, // Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU + {0x0B4D, 0x0B4D, prExtend}, // Mn ORIYA SIGN VIRAMA + {0x0B55, 0x0B56, prExtend}, // Mn [2] ORIYA SIGN OVERLINE..ORIYA AI LENGTH MARK + {0x0B57, 0x0B57, prExtend}, // Mc ORIYA AU LENGTH MARK + {0x0B5C, 0x0B5D, prALetter}, // Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA + {0x0B5F, 0x0B61, prALetter}, // Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL + {0x0B62, 0x0B63, prExtend}, // Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL + {0x0B66, 0x0B6F, prNumeric}, // Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE + {0x0B71, 0x0B71, prALetter}, // Lo ORIYA LETTER WA + {0x0B82, 0x0B82, prExtend}, // Mn TAMIL SIGN ANUSVARA + {0x0B83, 0x0B83, prALetter}, // Lo TAMIL SIGN VISARGA + {0x0B85, 0x0B8A, prALetter}, // Lo [6] TAMIL LETTER A..TAMIL LETTER UU + {0x0B8E, 0x0B90, prALetter}, // Lo [3] TAMIL LETTER E..TAMIL LETTER AI + {0x0B92, 0x0B95, prALetter}, // Lo [4] TAMIL LETTER O..TAMIL LETTER KA + {0x0B99, 0x0B9A, prALetter}, // Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA + {0x0B9C, 0x0B9C, prALetter}, // Lo TAMIL LETTER JA + {0x0B9E, 0x0B9F, prALetter}, // Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA + {0x0BA3, 0x0BA4, prALetter}, // Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA + {0x0BA8, 0x0BAA, prALetter}, // Lo [3] TAMIL LETTER NA..TAMIL LETTER PA + {0x0BAE, 0x0BB9, prALetter}, // Lo [12] TAMIL LETTER MA..TAMIL LETTER HA + {0x0BBE, 0x0BBF, prExtend}, // Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I + {0x0BC0, 0x0BC0, prExtend}, // Mn TAMIL VOWEL SIGN II + {0x0BC1, 0x0BC2, prExtend}, // Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU + {0x0BC6, 0x0BC8, prExtend}, // Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI + {0x0BCA, 0x0BCC, prExtend}, // Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU + {0x0BCD, 0x0BCD, prExtend}, // Mn TAMIL SIGN VIRAMA + {0x0BD0, 0x0BD0, prALetter}, // Lo TAMIL OM + {0x0BD7, 0x0BD7, prExtend}, // Mc TAMIL AU LENGTH MARK + {0x0BE6, 0x0BEF, prNumeric}, // Nd [10] TAMIL DIGIT ZERO..TAMIL DIGIT NINE + {0x0C00, 0x0C00, prExtend}, // Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE + {0x0C01, 0x0C03, prExtend}, // Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA + {0x0C04, 0x0C04, prExtend}, // Mn TELUGU SIGN COMBINING ANUSVARA ABOVE + {0x0C05, 0x0C0C, prALetter}, // Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L + {0x0C0E, 0x0C10, prALetter}, // Lo [3] TELUGU LETTER E..TELUGU LETTER AI + {0x0C12, 0x0C28, prALetter}, // Lo [23] TELUGU LETTER O..TELUGU LETTER NA + {0x0C2A, 0x0C39, prALetter}, // Lo [16] TELUGU LETTER PA..TELUGU LETTER HA + {0x0C3C, 0x0C3C, prExtend}, // Mn TELUGU SIGN NUKTA + {0x0C3D, 0x0C3D, prALetter}, // Lo TELUGU SIGN AVAGRAHA + {0x0C3E, 0x0C40, prExtend}, // Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II + {0x0C41, 0x0C44, prExtend}, // Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR + {0x0C46, 0x0C48, prExtend}, // Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI + {0x0C4A, 0x0C4D, prExtend}, // Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA + {0x0C55, 0x0C56, prExtend}, // Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK + {0x0C58, 0x0C5A, prALetter}, // Lo [3] TELUGU LETTER TSA..TELUGU LETTER RRRA + {0x0C5D, 0x0C5D, prALetter}, // Lo TELUGU LETTER NAKAARA POLLU + {0x0C60, 0x0C61, prALetter}, // Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL + {0x0C62, 0x0C63, prExtend}, // Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL + {0x0C66, 0x0C6F, prNumeric}, // Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE + {0x0C80, 0x0C80, prALetter}, // Lo KANNADA SIGN SPACING CANDRABINDU + {0x0C81, 0x0C81, prExtend}, // Mn KANNADA SIGN CANDRABINDU + {0x0C82, 0x0C83, prExtend}, // Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA + {0x0C85, 0x0C8C, prALetter}, // Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L + {0x0C8E, 0x0C90, prALetter}, // Lo [3] KANNADA LETTER E..KANNADA LETTER AI + {0x0C92, 0x0CA8, prALetter}, // Lo [23] KANNADA LETTER O..KANNADA LETTER NA + {0x0CAA, 0x0CB3, prALetter}, // Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA + {0x0CB5, 0x0CB9, prALetter}, // Lo [5] KANNADA LETTER VA..KANNADA LETTER HA + {0x0CBC, 0x0CBC, prExtend}, // Mn KANNADA SIGN NUKTA + {0x0CBD, 0x0CBD, prALetter}, // Lo KANNADA SIGN AVAGRAHA + {0x0CBE, 0x0CBE, prExtend}, // Mc KANNADA VOWEL SIGN AA + {0x0CBF, 0x0CBF, prExtend}, // Mn KANNADA VOWEL SIGN I + {0x0CC0, 0x0CC4, prExtend}, // Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR + {0x0CC6, 0x0CC6, prExtend}, // Mn KANNADA VOWEL SIGN E + {0x0CC7, 0x0CC8, prExtend}, // Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI + {0x0CCA, 0x0CCB, prExtend}, // Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO + {0x0CCC, 0x0CCD, prExtend}, // Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA + {0x0CD5, 0x0CD6, prExtend}, // Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK + {0x0CDD, 0x0CDE, prALetter}, // Lo [2] KANNADA LETTER NAKAARA POLLU..KANNADA LETTER FA + {0x0CE0, 0x0CE1, prALetter}, // Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL + {0x0CE2, 0x0CE3, prExtend}, // Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL + {0x0CE6, 0x0CEF, prNumeric}, // Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE + {0x0CF1, 0x0CF2, prALetter}, // Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA + {0x0D00, 0x0D01, prExtend}, // Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU + {0x0D02, 0x0D03, prExtend}, // Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA + {0x0D04, 0x0D0C, prALetter}, // Lo [9] MALAYALAM LETTER VEDIC ANUSVARA..MALAYALAM LETTER VOCALIC L + {0x0D0E, 0x0D10, prALetter}, // Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI + {0x0D12, 0x0D3A, prALetter}, // Lo [41] MALAYALAM LETTER O..MALAYALAM LETTER TTTA + {0x0D3B, 0x0D3C, prExtend}, // Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA + {0x0D3D, 0x0D3D, prALetter}, // Lo MALAYALAM SIGN AVAGRAHA + {0x0D3E, 0x0D40, prExtend}, // Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II + {0x0D41, 0x0D44, prExtend}, // Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR + {0x0D46, 0x0D48, prExtend}, // Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI + {0x0D4A, 0x0D4C, prExtend}, // Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU + {0x0D4D, 0x0D4D, prExtend}, // Mn MALAYALAM SIGN VIRAMA + {0x0D4E, 0x0D4E, prALetter}, // Lo MALAYALAM LETTER DOT REPH + {0x0D54, 0x0D56, prALetter}, // Lo [3] MALAYALAM LETTER CHILLU M..MALAYALAM LETTER CHILLU LLL + {0x0D57, 0x0D57, prExtend}, // Mc MALAYALAM AU LENGTH MARK + {0x0D5F, 0x0D61, prALetter}, // Lo [3] MALAYALAM LETTER ARCHAIC II..MALAYALAM LETTER VOCALIC LL + {0x0D62, 0x0D63, prExtend}, // Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL + {0x0D66, 0x0D6F, prNumeric}, // Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE + {0x0D7A, 0x0D7F, prALetter}, // Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K + {0x0D81, 0x0D81, prExtend}, // Mn SINHALA SIGN CANDRABINDU + {0x0D82, 0x0D83, prExtend}, // Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA + {0x0D85, 0x0D96, prALetter}, // Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA + {0x0D9A, 0x0DB1, prALetter}, // Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA + {0x0DB3, 0x0DBB, prALetter}, // Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA + {0x0DBD, 0x0DBD, prALetter}, // Lo SINHALA LETTER DANTAJA LAYANNA + {0x0DC0, 0x0DC6, prALetter}, // Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA + {0x0DCA, 0x0DCA, prExtend}, // Mn SINHALA SIGN AL-LAKUNA + {0x0DCF, 0x0DD1, prExtend}, // Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA + {0x0DD2, 0x0DD4, prExtend}, // Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA + {0x0DD6, 0x0DD6, prExtend}, // Mn SINHALA VOWEL SIGN DIGA PAA-PILLA + {0x0DD8, 0x0DDF, prExtend}, // Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA + {0x0DE6, 0x0DEF, prNumeric}, // Nd [10] SINHALA LITH DIGIT ZERO..SINHALA LITH DIGIT NINE + {0x0DF2, 0x0DF3, prExtend}, // Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA + {0x0E31, 0x0E31, prExtend}, // Mn THAI CHARACTER MAI HAN-AKAT + {0x0E34, 0x0E3A, prExtend}, // Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU + {0x0E47, 0x0E4E, prExtend}, // Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN + {0x0E50, 0x0E59, prNumeric}, // Nd [10] THAI DIGIT ZERO..THAI DIGIT NINE + {0x0EB1, 0x0EB1, prExtend}, // Mn LAO VOWEL SIGN MAI KAN + {0x0EB4, 0x0EBC, prExtend}, // Mn [9] LAO VOWEL SIGN I..LAO SEMIVOWEL SIGN LO + {0x0EC8, 0x0ECD, prExtend}, // Mn [6] LAO TONE MAI EK..LAO NIGGAHITA + {0x0ED0, 0x0ED9, prNumeric}, // Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE + {0x0F00, 0x0F00, prALetter}, // Lo TIBETAN SYLLABLE OM + {0x0F18, 0x0F19, prExtend}, // Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS + {0x0F20, 0x0F29, prNumeric}, // Nd [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE + {0x0F35, 0x0F35, prExtend}, // Mn TIBETAN MARK NGAS BZUNG NYI ZLA + {0x0F37, 0x0F37, prExtend}, // Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS + {0x0F39, 0x0F39, prExtend}, // Mn TIBETAN MARK TSA -PHRU + {0x0F3E, 0x0F3F, prExtend}, // Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES + {0x0F40, 0x0F47, prALetter}, // Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA + {0x0F49, 0x0F6C, prALetter}, // Lo [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA + {0x0F71, 0x0F7E, prExtend}, // Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO + {0x0F7F, 0x0F7F, prExtend}, // Mc TIBETAN SIGN RNAM BCAD + {0x0F80, 0x0F84, prExtend}, // Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA + {0x0F86, 0x0F87, prExtend}, // Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS + {0x0F88, 0x0F8C, prALetter}, // Lo [5] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN INVERTED MCHU CAN + {0x0F8D, 0x0F97, prExtend}, // Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA + {0x0F99, 0x0FBC, prExtend}, // Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA + {0x0FC6, 0x0FC6, prExtend}, // Mn TIBETAN SYMBOL PADMA GDAN + {0x102B, 0x102C, prExtend}, // Mc [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA + {0x102D, 0x1030, prExtend}, // Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU + {0x1031, 0x1031, prExtend}, // Mc MYANMAR VOWEL SIGN E + {0x1032, 0x1037, prExtend}, // Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW + {0x1038, 0x1038, prExtend}, // Mc MYANMAR SIGN VISARGA + {0x1039, 0x103A, prExtend}, // Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT + {0x103B, 0x103C, prExtend}, // Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA + {0x103D, 0x103E, prExtend}, // Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA + {0x1040, 0x1049, prNumeric}, // Nd [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE + {0x1056, 0x1057, prExtend}, // Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR + {0x1058, 0x1059, prExtend}, // Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL + {0x105E, 0x1060, prExtend}, // Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA + {0x1062, 0x1064, prExtend}, // Mc [3] MYANMAR VOWEL SIGN SGAW KAREN EU..MYANMAR TONE MARK SGAW KAREN KE PHO + {0x1067, 0x106D, prExtend}, // Mc [7] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR SIGN WESTERN PWO KAREN TONE-5 + {0x1071, 0x1074, prExtend}, // Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE + {0x1082, 0x1082, prExtend}, // Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA + {0x1083, 0x1084, prExtend}, // Mc [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E + {0x1085, 0x1086, prExtend}, // Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y + {0x1087, 0x108C, prExtend}, // Mc [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3 + {0x108D, 0x108D, prExtend}, // Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE + {0x108F, 0x108F, prExtend}, // Mc MYANMAR SIGN RUMAI PALAUNG TONE-5 + {0x1090, 0x1099, prNumeric}, // Nd [10] MYANMAR SHAN DIGIT ZERO..MYANMAR SHAN DIGIT NINE + {0x109A, 0x109C, prExtend}, // Mc [3] MYANMAR SIGN KHAMTI TONE-1..MYANMAR VOWEL SIGN AITON A + {0x109D, 0x109D, prExtend}, // Mn MYANMAR VOWEL SIGN AITON AI + {0x10A0, 0x10C5, prALetter}, // L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE + {0x10C7, 0x10C7, prALetter}, // L& GEORGIAN CAPITAL LETTER YN + {0x10CD, 0x10CD, prALetter}, // L& GEORGIAN CAPITAL LETTER AEN + {0x10D0, 0x10FA, prALetter}, // L& [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN + {0x10FC, 0x10FC, prALetter}, // Lm MODIFIER LETTER GEORGIAN NAR + {0x10FD, 0x10FF, prALetter}, // L& [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN + {0x1100, 0x1248, prALetter}, // Lo [329] HANGUL CHOSEONG KIYEOK..ETHIOPIC SYLLABLE QWA + {0x124A, 0x124D, prALetter}, // Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE + {0x1250, 0x1256, prALetter}, // Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO + {0x1258, 0x1258, prALetter}, // Lo ETHIOPIC SYLLABLE QHWA + {0x125A, 0x125D, prALetter}, // Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE + {0x1260, 0x1288, prALetter}, // Lo [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA + {0x128A, 0x128D, prALetter}, // Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE + {0x1290, 0x12B0, prALetter}, // Lo [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA + {0x12B2, 0x12B5, prALetter}, // Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE + {0x12B8, 0x12BE, prALetter}, // Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO + {0x12C0, 0x12C0, prALetter}, // Lo ETHIOPIC SYLLABLE KXWA + {0x12C2, 0x12C5, prALetter}, // Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE + {0x12C8, 0x12D6, prALetter}, // Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O + {0x12D8, 0x1310, prALetter}, // Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA + {0x1312, 0x1315, prALetter}, // Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE + {0x1318, 0x135A, prALetter}, // Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA + {0x135D, 0x135F, prExtend}, // Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK + {0x1380, 0x138F, prALetter}, // Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE + {0x13A0, 0x13F5, prALetter}, // L& [86] CHEROKEE LETTER A..CHEROKEE LETTER MV + {0x13F8, 0x13FD, prALetter}, // L& [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV + {0x1401, 0x166C, prALetter}, // Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA + {0x166F, 0x167F, prALetter}, // Lo [17] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS BLACKFOOT W + {0x1680, 0x1680, prWSegSpace}, // Zs OGHAM SPACE MARK + {0x1681, 0x169A, prALetter}, // Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH + {0x16A0, 0x16EA, prALetter}, // Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X + {0x16EE, 0x16F0, prALetter}, // Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL + {0x16F1, 0x16F8, prALetter}, // Lo [8] RUNIC LETTER K..RUNIC LETTER FRANKS CASKET AESC + {0x1700, 0x1711, prALetter}, // Lo [18] TAGALOG LETTER A..TAGALOG LETTER HA + {0x1712, 0x1714, prExtend}, // Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA + {0x1715, 0x1715, prExtend}, // Mc TAGALOG SIGN PAMUDPOD + {0x171F, 0x1731, prALetter}, // Lo [19] TAGALOG LETTER ARCHAIC RA..HANUNOO LETTER HA + {0x1732, 0x1733, prExtend}, // Mn [2] HANUNOO VOWEL SIGN I..HANUNOO VOWEL SIGN U + {0x1734, 0x1734, prExtend}, // Mc HANUNOO SIGN PAMUDPOD + {0x1740, 0x1751, prALetter}, // Lo [18] BUHID LETTER A..BUHID LETTER HA + {0x1752, 0x1753, prExtend}, // Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U + {0x1760, 0x176C, prALetter}, // Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA + {0x176E, 0x1770, prALetter}, // Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA + {0x1772, 0x1773, prExtend}, // Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U + {0x17B4, 0x17B5, prExtend}, // Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA + {0x17B6, 0x17B6, prExtend}, // Mc KHMER VOWEL SIGN AA + {0x17B7, 0x17BD, prExtend}, // Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA + {0x17BE, 0x17C5, prExtend}, // Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU + {0x17C6, 0x17C6, prExtend}, // Mn KHMER SIGN NIKAHIT + {0x17C7, 0x17C8, prExtend}, // Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU + {0x17C9, 0x17D3, prExtend}, // Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT + {0x17DD, 0x17DD, prExtend}, // Mn KHMER SIGN ATTHACAN + {0x17E0, 0x17E9, prNumeric}, // Nd [10] KHMER DIGIT ZERO..KHMER DIGIT NINE + {0x180B, 0x180D, prExtend}, // Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE + {0x180E, 0x180E, prFormat}, // Cf MONGOLIAN VOWEL SEPARATOR + {0x180F, 0x180F, prExtend}, // Mn MONGOLIAN FREE VARIATION SELECTOR FOUR + {0x1810, 0x1819, prNumeric}, // Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE + {0x1820, 0x1842, prALetter}, // Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI + {0x1843, 0x1843, prALetter}, // Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN + {0x1844, 0x1878, prALetter}, // Lo [53] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER CHA WITH TWO DOTS + {0x1880, 0x1884, prALetter}, // Lo [5] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI INVERTED UBADAMA + {0x1885, 0x1886, prExtend}, // Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA + {0x1887, 0x18A8, prALetter}, // Lo [34] MONGOLIAN LETTER ALI GALI A..MONGOLIAN LETTER MANCHU ALI GALI BHA + {0x18A9, 0x18A9, prExtend}, // Mn MONGOLIAN LETTER ALI GALI DAGALGA + {0x18AA, 0x18AA, prALetter}, // Lo MONGOLIAN LETTER MANCHU ALI GALI LHA + {0x18B0, 0x18F5, prALetter}, // Lo [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S + {0x1900, 0x191E, prALetter}, // Lo [31] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER TRA + {0x1920, 0x1922, prExtend}, // Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U + {0x1923, 0x1926, prExtend}, // Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU + {0x1927, 0x1928, prExtend}, // Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O + {0x1929, 0x192B, prExtend}, // Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA + {0x1930, 0x1931, prExtend}, // Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA + {0x1932, 0x1932, prExtend}, // Mn LIMBU SMALL LETTER ANUSVARA + {0x1933, 0x1938, prExtend}, // Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA + {0x1939, 0x193B, prExtend}, // Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I + {0x1946, 0x194F, prNumeric}, // Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE + {0x19D0, 0x19D9, prNumeric}, // Nd [10] NEW TAI LUE DIGIT ZERO..NEW TAI LUE DIGIT NINE + {0x1A00, 0x1A16, prALetter}, // Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA + {0x1A17, 0x1A18, prExtend}, // Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U + {0x1A19, 0x1A1A, prExtend}, // Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O + {0x1A1B, 0x1A1B, prExtend}, // Mn BUGINESE VOWEL SIGN AE + {0x1A55, 0x1A55, prExtend}, // Mc TAI THAM CONSONANT SIGN MEDIAL RA + {0x1A56, 0x1A56, prExtend}, // Mn TAI THAM CONSONANT SIGN MEDIAL LA + {0x1A57, 0x1A57, prExtend}, // Mc TAI THAM CONSONANT SIGN LA TANG LAI + {0x1A58, 0x1A5E, prExtend}, // Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA + {0x1A60, 0x1A60, prExtend}, // Mn TAI THAM SIGN SAKOT + {0x1A61, 0x1A61, prExtend}, // Mc TAI THAM VOWEL SIGN A + {0x1A62, 0x1A62, prExtend}, // Mn TAI THAM VOWEL SIGN MAI SAT + {0x1A63, 0x1A64, prExtend}, // Mc [2] TAI THAM VOWEL SIGN AA..TAI THAM VOWEL SIGN TALL AA + {0x1A65, 0x1A6C, prExtend}, // Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW + {0x1A6D, 0x1A72, prExtend}, // Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI + {0x1A73, 0x1A7C, prExtend}, // Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN + {0x1A7F, 0x1A7F, prExtend}, // Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT + {0x1A80, 0x1A89, prNumeric}, // Nd [10] TAI THAM HORA DIGIT ZERO..TAI THAM HORA DIGIT NINE + {0x1A90, 0x1A99, prNumeric}, // Nd [10] TAI THAM THAM DIGIT ZERO..TAI THAM THAM DIGIT NINE + {0x1AB0, 0x1ABD, prExtend}, // Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW + {0x1ABE, 0x1ABE, prExtend}, // Me COMBINING PARENTHESES OVERLAY + {0x1ABF, 0x1ACE, prExtend}, // Mn [16] COMBINING LATIN SMALL LETTER W BELOW..COMBINING LATIN SMALL LETTER INSULAR T + {0x1B00, 0x1B03, prExtend}, // Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG + {0x1B04, 0x1B04, prExtend}, // Mc BALINESE SIGN BISAH + {0x1B05, 0x1B33, prALetter}, // Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA + {0x1B34, 0x1B34, prExtend}, // Mn BALINESE SIGN REREKAN + {0x1B35, 0x1B35, prExtend}, // Mc BALINESE VOWEL SIGN TEDUNG + {0x1B36, 0x1B3A, prExtend}, // Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA + {0x1B3B, 0x1B3B, prExtend}, // Mc BALINESE VOWEL SIGN RA REPA TEDUNG + {0x1B3C, 0x1B3C, prExtend}, // Mn BALINESE VOWEL SIGN LA LENGA + {0x1B3D, 0x1B41, prExtend}, // Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG + {0x1B42, 0x1B42, prExtend}, // Mn BALINESE VOWEL SIGN PEPET + {0x1B43, 0x1B44, prExtend}, // Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG + {0x1B45, 0x1B4C, prALetter}, // Lo [8] BALINESE LETTER KAF SASAK..BALINESE LETTER ARCHAIC JNYA + {0x1B50, 0x1B59, prNumeric}, // Nd [10] BALINESE DIGIT ZERO..BALINESE DIGIT NINE + {0x1B6B, 0x1B73, prExtend}, // Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG + {0x1B80, 0x1B81, prExtend}, // Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR + {0x1B82, 0x1B82, prExtend}, // Mc SUNDANESE SIGN PANGWISAD + {0x1B83, 0x1BA0, prALetter}, // Lo [30] SUNDANESE LETTER A..SUNDANESE LETTER HA + {0x1BA1, 0x1BA1, prExtend}, // Mc SUNDANESE CONSONANT SIGN PAMINGKAL + {0x1BA2, 0x1BA5, prExtend}, // Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU + {0x1BA6, 0x1BA7, prExtend}, // Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG + {0x1BA8, 0x1BA9, prExtend}, // Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG + {0x1BAA, 0x1BAA, prExtend}, // Mc SUNDANESE SIGN PAMAAEH + {0x1BAB, 0x1BAD, prExtend}, // Mn [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA + {0x1BAE, 0x1BAF, prALetter}, // Lo [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA + {0x1BB0, 0x1BB9, prNumeric}, // Nd [10] SUNDANESE DIGIT ZERO..SUNDANESE DIGIT NINE + {0x1BBA, 0x1BE5, prALetter}, // Lo [44] SUNDANESE AVAGRAHA..BATAK LETTER U + {0x1BE6, 0x1BE6, prExtend}, // Mn BATAK SIGN TOMPI + {0x1BE7, 0x1BE7, prExtend}, // Mc BATAK VOWEL SIGN E + {0x1BE8, 0x1BE9, prExtend}, // Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE + {0x1BEA, 0x1BEC, prExtend}, // Mc [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O + {0x1BED, 0x1BED, prExtend}, // Mn BATAK VOWEL SIGN KARO O + {0x1BEE, 0x1BEE, prExtend}, // Mc BATAK VOWEL SIGN U + {0x1BEF, 0x1BF1, prExtend}, // Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H + {0x1BF2, 0x1BF3, prExtend}, // Mc [2] BATAK PANGOLAT..BATAK PANONGONAN + {0x1C00, 0x1C23, prALetter}, // Lo [36] LEPCHA LETTER KA..LEPCHA LETTER A + {0x1C24, 0x1C2B, prExtend}, // Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU + {0x1C2C, 0x1C33, prExtend}, // Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T + {0x1C34, 0x1C35, prExtend}, // Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG + {0x1C36, 0x1C37, prExtend}, // Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA + {0x1C40, 0x1C49, prNumeric}, // Nd [10] LEPCHA DIGIT ZERO..LEPCHA DIGIT NINE + {0x1C4D, 0x1C4F, prALetter}, // Lo [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA + {0x1C50, 0x1C59, prNumeric}, // Nd [10] OL CHIKI DIGIT ZERO..OL CHIKI DIGIT NINE + {0x1C5A, 0x1C77, prALetter}, // Lo [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH + {0x1C78, 0x1C7D, prALetter}, // Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD + {0x1C80, 0x1C88, prALetter}, // L& [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK + {0x1C90, 0x1CBA, prALetter}, // L& [43] GEORGIAN MTAVRULI CAPITAL LETTER AN..GEORGIAN MTAVRULI CAPITAL LETTER AIN + {0x1CBD, 0x1CBF, prALetter}, // L& [3] GEORGIAN MTAVRULI CAPITAL LETTER AEN..GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN + {0x1CD0, 0x1CD2, prExtend}, // Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA + {0x1CD4, 0x1CE0, prExtend}, // Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA + {0x1CE1, 0x1CE1, prExtend}, // Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA + {0x1CE2, 0x1CE8, prExtend}, // Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL + {0x1CE9, 0x1CEC, prALetter}, // Lo [4] VEDIC SIGN ANUSVARA ANTARGOMUKHA..VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL + {0x1CED, 0x1CED, prExtend}, // Mn VEDIC SIGN TIRYAK + {0x1CEE, 0x1CF3, prALetter}, // Lo [6] VEDIC SIGN HEXIFORM LONG ANUSVARA..VEDIC SIGN ROTATED ARDHAVISARGA + {0x1CF4, 0x1CF4, prExtend}, // Mn VEDIC TONE CANDRA ABOVE + {0x1CF5, 0x1CF6, prALetter}, // Lo [2] VEDIC SIGN JIHVAMULIYA..VEDIC SIGN UPADHMANIYA + {0x1CF7, 0x1CF7, prExtend}, // Mc VEDIC SIGN ATIKRAMA + {0x1CF8, 0x1CF9, prExtend}, // Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE + {0x1CFA, 0x1CFA, prALetter}, // Lo VEDIC SIGN DOUBLE ANUSVARA ANTARGOMUKHA + {0x1D00, 0x1D2B, prALetter}, // L& [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL + {0x1D2C, 0x1D6A, prALetter}, // Lm [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI + {0x1D6B, 0x1D77, prALetter}, // L& [13] LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G + {0x1D78, 0x1D78, prALetter}, // Lm MODIFIER LETTER CYRILLIC EN + {0x1D79, 0x1D9A, prALetter}, // L& [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK + {0x1D9B, 0x1DBF, prALetter}, // Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA + {0x1DC0, 0x1DFF, prExtend}, // Mn [64] COMBINING DOTTED GRAVE ACCENT..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW + {0x1E00, 0x1F15, prALetter}, // L& [278] LATIN CAPITAL LETTER A WITH RING BELOW..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA + {0x1F18, 0x1F1D, prALetter}, // L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA + {0x1F20, 0x1F45, prALetter}, // L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA + {0x1F48, 0x1F4D, prALetter}, // L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA + {0x1F50, 0x1F57, prALetter}, // L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI + {0x1F59, 0x1F59, prALetter}, // L& GREEK CAPITAL LETTER UPSILON WITH DASIA + {0x1F5B, 0x1F5B, prALetter}, // L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA + {0x1F5D, 0x1F5D, prALetter}, // L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA + {0x1F5F, 0x1F7D, prALetter}, // L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA + {0x1F80, 0x1FB4, prALetter}, // L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI + {0x1FB6, 0x1FBC, prALetter}, // L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI + {0x1FBE, 0x1FBE, prALetter}, // L& GREEK PROSGEGRAMMENI + {0x1FC2, 0x1FC4, prALetter}, // L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI + {0x1FC6, 0x1FCC, prALetter}, // L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI + {0x1FD0, 0x1FD3, prALetter}, // L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA + {0x1FD6, 0x1FDB, prALetter}, // L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA + {0x1FE0, 0x1FEC, prALetter}, // L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA + {0x1FF2, 0x1FF4, prALetter}, // L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI + {0x1FF6, 0x1FFC, prALetter}, // L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI + {0x2000, 0x2006, prWSegSpace}, // Zs [7] EN QUAD..SIX-PER-EM SPACE + {0x2008, 0x200A, prWSegSpace}, // Zs [3] PUNCTUATION SPACE..HAIR SPACE + {0x200C, 0x200C, prExtend}, // Cf ZERO WIDTH NON-JOINER + {0x200D, 0x200D, prZWJ}, // Cf ZERO WIDTH JOINER + {0x200E, 0x200F, prFormat}, // Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK + {0x2018, 0x2018, prMidNumLet}, // Pi LEFT SINGLE QUOTATION MARK + {0x2019, 0x2019, prMidNumLet}, // Pf RIGHT SINGLE QUOTATION MARK + {0x2024, 0x2024, prMidNumLet}, // Po ONE DOT LEADER + {0x2027, 0x2027, prMidLetter}, // Po HYPHENATION POINT + {0x2028, 0x2028, prNewline}, // Zl LINE SEPARATOR + {0x2029, 0x2029, prNewline}, // Zp PARAGRAPH SEPARATOR + {0x202A, 0x202E, prFormat}, // Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE + {0x202F, 0x202F, prExtendNumLet}, // Zs NARROW NO-BREAK SPACE + {0x203C, 0x203C, prExtendedPictographic}, // E0.6 [1] (‼️) double exclamation mark + {0x203F, 0x2040, prExtendNumLet}, // Pc [2] UNDERTIE..CHARACTER TIE + {0x2044, 0x2044, prMidNum}, // Sm FRACTION SLASH + {0x2049, 0x2049, prExtendedPictographic}, // E0.6 [1] (â‰ď¸Ź) exclamation question mark + {0x2054, 0x2054, prExtendNumLet}, // Pc INVERTED UNDERTIE + {0x205F, 0x205F, prWSegSpace}, // Zs MEDIUM MATHEMATICAL SPACE + {0x2060, 0x2064, prFormat}, // Cf [5] WORD JOINER..INVISIBLE PLUS + {0x2066, 0x206F, prFormat}, // Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES + {0x2071, 0x2071, prALetter}, // Lm SUPERSCRIPT LATIN SMALL LETTER I + {0x207F, 0x207F, prALetter}, // Lm SUPERSCRIPT LATIN SMALL LETTER N + {0x2090, 0x209C, prALetter}, // Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T + {0x20D0, 0x20DC, prExtend}, // Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE + {0x20DD, 0x20E0, prExtend}, // Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH + {0x20E1, 0x20E1, prExtend}, // Mn COMBINING LEFT RIGHT ARROW ABOVE + {0x20E2, 0x20E4, prExtend}, // Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE + {0x20E5, 0x20F0, prExtend}, // Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE + {0x2102, 0x2102, prALetter}, // L& DOUBLE-STRUCK CAPITAL C + {0x2107, 0x2107, prALetter}, // L& EULER CONSTANT + {0x210A, 0x2113, prALetter}, // L& [10] SCRIPT SMALL G..SCRIPT SMALL L + {0x2115, 0x2115, prALetter}, // L& DOUBLE-STRUCK CAPITAL N + {0x2119, 0x211D, prALetter}, // L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R + {0x2122, 0x2122, prExtendedPictographic}, // E0.6 [1] (™️) trade mark + {0x2124, 0x2124, prALetter}, // L& DOUBLE-STRUCK CAPITAL Z + {0x2126, 0x2126, prALetter}, // L& OHM SIGN + {0x2128, 0x2128, prALetter}, // L& BLACK-LETTER CAPITAL Z + {0x212A, 0x212D, prALetter}, // L& [4] KELVIN SIGN..BLACK-LETTER CAPITAL C + {0x212F, 0x2134, prALetter}, // L& [6] SCRIPT SMALL E..SCRIPT SMALL O + {0x2135, 0x2138, prALetter}, // Lo [4] ALEF SYMBOL..DALET SYMBOL + {0x2139, 0x2139, prALetter}, // L& INFORMATION SOURCE + {0x2139, 0x2139, prExtendedPictographic}, // E0.6 [1] (ℹ️) information + {0x213C, 0x213F, prALetter}, // L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI + {0x2145, 0x2149, prALetter}, // L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J + {0x214E, 0x214E, prALetter}, // L& TURNED SMALL F + {0x2160, 0x2182, prALetter}, // Nl [35] ROMAN NUMERAL ONE..ROMAN NUMERAL TEN THOUSAND + {0x2183, 0x2184, prALetter}, // L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C + {0x2185, 0x2188, prALetter}, // Nl [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND + {0x2194, 0x2199, prExtendedPictographic}, // E0.6 [6] (↔️..↙️) left-right arrow..down-left arrow + {0x21A9, 0x21AA, prExtendedPictographic}, // E0.6 [2] (↩️..↪️) right arrow curving left..left arrow curving right + {0x231A, 0x231B, prExtendedPictographic}, // E0.6 [2] (⌚..⌛) watch..hourglass done + {0x2328, 0x2328, prExtendedPictographic}, // E1.0 [1] (⌨️) keyboard + {0x2388, 0x2388, prExtendedPictographic}, // E0.0 [1] (âŽ) HELM SYMBOL + {0x23CF, 0x23CF, prExtendedPictographic}, // E1.0 [1] (⏏️) eject button + {0x23E9, 0x23EC, prExtendedPictographic}, // E0.6 [4] (⏩..⏬) fast-forward button..fast down button + {0x23ED, 0x23EE, prExtendedPictographic}, // E0.7 [2] (⏭️..⏮️) next track button..last track button + {0x23EF, 0x23EF, prExtendedPictographic}, // E1.0 [1] (⏯️) play or pause button + {0x23F0, 0x23F0, prExtendedPictographic}, // E0.6 [1] (⏰) alarm clock + {0x23F1, 0x23F2, prExtendedPictographic}, // E1.0 [2] (⏱️..⏲️) stopwatch..timer clock + {0x23F3, 0x23F3, prExtendedPictographic}, // E0.6 [1] (⏳) hourglass not done + {0x23F8, 0x23FA, prExtendedPictographic}, // E0.7 [3] (⏸️..⏺️) pause button..record button + {0x24B6, 0x24E9, prALetter}, // So [52] CIRCLED LATIN CAPITAL LETTER A..CIRCLED LATIN SMALL LETTER Z + {0x24C2, 0x24C2, prExtendedPictographic}, // E0.6 [1] (Ⓜ️) circled M + {0x25AA, 0x25AB, prExtendedPictographic}, // E0.6 [2] (▪️..▫️) black small square..white small square + {0x25B6, 0x25B6, prExtendedPictographic}, // E0.6 [1] (▶️) play button + {0x25C0, 0x25C0, prExtendedPictographic}, // E0.6 [1] (◀️) reverse button + {0x25FB, 0x25FE, prExtendedPictographic}, // E0.6 [4] (◻️..â—ľ) white medium square..black medium-small square + {0x2600, 0x2601, prExtendedPictographic}, // E0.6 [2] (â€ď¸Ź..â️) sun..cloud + {0x2602, 0x2603, prExtendedPictographic}, // E0.7 [2] (â‚️..â️) umbrella..snowman + {0x2604, 0x2604, prExtendedPictographic}, // E1.0 [1] (â„️) comet + {0x2605, 0x2605, prExtendedPictographic}, // E0.0 [1] (â…) BLACK STAR + {0x2607, 0x260D, prExtendedPictographic}, // E0.0 [7] (â‡..âŤ) LIGHTNING..OPPOSITION + {0x260E, 0x260E, prExtendedPictographic}, // E0.6 [1] (âŽď¸Ź) telephone + {0x260F, 0x2610, prExtendedPictographic}, // E0.0 [2] (âŹ..â) WHITE TELEPHONE..BALLOT BOX + {0x2611, 0x2611, prExtendedPictographic}, // E0.6 [1] (â‘️) check box with check + {0x2612, 0x2612, prExtendedPictographic}, // E0.0 [1] (â’) BALLOT BOX WITH X + {0x2614, 0x2615, prExtendedPictographic}, // E0.6 [2] (â”..â•) umbrella with rain drops..hot beverage + {0x2616, 0x2617, prExtendedPictographic}, // E0.0 [2] (â–..â—) WHITE SHOGI PIECE..BLACK SHOGI PIECE + {0x2618, 0x2618, prExtendedPictographic}, // E1.0 [1] (â️) shamrock + {0x2619, 0x261C, prExtendedPictographic}, // E0.0 [4] (â™..âś) REVERSED ROTATED FLORAL HEART BULLET..WHITE LEFT POINTING INDEX + {0x261D, 0x261D, prExtendedPictographic}, // E0.6 [1] (âťď¸Ź) index pointing up + {0x261E, 0x261F, prExtendedPictographic}, // E0.0 [2] (âž..âź) WHITE RIGHT POINTING INDEX..WHITE DOWN POINTING INDEX + {0x2620, 0x2620, prExtendedPictographic}, // E1.0 [1] (â ď¸Ź) skull and crossbones + {0x2621, 0x2621, prExtendedPictographic}, // E0.0 [1] (âˇ) CAUTION SIGN + {0x2622, 0x2623, prExtendedPictographic}, // E1.0 [2] (â˘ď¸Ź..âŁď¸Ź) radioactive..biohazard + {0x2624, 0x2625, prExtendedPictographic}, // E0.0 [2] (â¤..âĄ) CADUCEUS..ANKH + {0x2626, 0x2626, prExtendedPictographic}, // E1.0 [1] (â¦ď¸Ź) orthodox cross + {0x2627, 0x2629, prExtendedPictographic}, // E0.0 [3] (â§..â©) CHI RHO..CROSS OF JERUSALEM + {0x262A, 0x262A, prExtendedPictographic}, // E0.7 [1] (âŞď¸Ź) star and crescent + {0x262B, 0x262D, prExtendedPictographic}, // E0.0 [3] (â«..â­) FARSI SYMBOL..HAMMER AND SICKLE + {0x262E, 0x262E, prExtendedPictographic}, // E1.0 [1] (â®ď¸Ź) peace symbol + {0x262F, 0x262F, prExtendedPictographic}, // E0.7 [1] (âŻď¸Ź) yin yang + {0x2630, 0x2637, prExtendedPictographic}, // E0.0 [8] (â°..â·) TRIGRAM FOR HEAVEN..TRIGRAM FOR EARTH + {0x2638, 0x2639, prExtendedPictographic}, // E0.7 [2] (â¸ď¸Ź..âąď¸Ź) wheel of dharma..frowning face + {0x263A, 0x263A, prExtendedPictographic}, // E0.6 [1] (âşď¸Ź) smiling face + {0x263B, 0x263F, prExtendedPictographic}, // E0.0 [5] (â»..âż) BLACK SMILING FACE..MERCURY + {0x2640, 0x2640, prExtendedPictographic}, // E4.0 [1] (♀️) female sign + {0x2641, 0x2641, prExtendedPictographic}, // E0.0 [1] (â™) EARTH + {0x2642, 0x2642, prExtendedPictographic}, // E4.0 [1] (♂️) male sign + {0x2643, 0x2647, prExtendedPictographic}, // E0.0 [5] (â™..♇) JUPITER..PLUTO + {0x2648, 0x2653, prExtendedPictographic}, // E0.6 [12] (â™..♓) Aries..Pisces + {0x2654, 0x265E, prExtendedPictographic}, // E0.0 [11] (â™”..♞) WHITE CHESS KING..BLACK CHESS KNIGHT + {0x265F, 0x265F, prExtendedPictographic}, // E11.0 [1] (♟️) chess pawn + {0x2660, 0x2660, prExtendedPictographic}, // E0.6 [1] (♠️) spade suit + {0x2661, 0x2662, prExtendedPictographic}, // E0.0 [2] (♡..♢) WHITE HEART SUIT..WHITE DIAMOND SUIT + {0x2663, 0x2663, prExtendedPictographic}, // E0.6 [1] (♣️) club suit + {0x2664, 0x2664, prExtendedPictographic}, // E0.0 [1] (♤) WHITE SPADE SUIT + {0x2665, 0x2666, prExtendedPictographic}, // E0.6 [2] (♥️..♦️) heart suit..diamond suit + {0x2667, 0x2667, prExtendedPictographic}, // E0.0 [1] (â™§) WHITE CLUB SUIT + {0x2668, 0x2668, prExtendedPictographic}, // E0.6 [1] (♨️) hot springs + {0x2669, 0x267A, prExtendedPictographic}, // E0.0 [18] (♩..♺) QUARTER NOTE..RECYCLING SYMBOL FOR GENERIC MATERIALS + {0x267B, 0x267B, prExtendedPictographic}, // E0.6 [1] (♻️) recycling symbol + {0x267C, 0x267D, prExtendedPictographic}, // E0.0 [2] (♼..â™˝) RECYCLED PAPER SYMBOL..PARTIALLY-RECYCLED PAPER SYMBOL + {0x267E, 0x267E, prExtendedPictographic}, // E11.0 [1] (♾️) infinity + {0x267F, 0x267F, prExtendedPictographic}, // E0.6 [1] (♿) wheelchair symbol + {0x2680, 0x2685, prExtendedPictographic}, // E0.0 [6] (⚀..âš…) DIE FACE-1..DIE FACE-6 + {0x2690, 0x2691, prExtendedPictographic}, // E0.0 [2] (âš..âš‘) WHITE FLAG..BLACK FLAG + {0x2692, 0x2692, prExtendedPictographic}, // E1.0 [1] (⚒️) hammer and pick + {0x2693, 0x2693, prExtendedPictographic}, // E0.6 [1] (âš“) anchor + {0x2694, 0x2694, prExtendedPictographic}, // E1.0 [1] (⚔️) crossed swords + {0x2695, 0x2695, prExtendedPictographic}, // E4.0 [1] (⚕️) medical symbol + {0x2696, 0x2697, prExtendedPictographic}, // E1.0 [2] (⚖️..⚗️) balance scale..alembic + {0x2698, 0x2698, prExtendedPictographic}, // E0.0 [1] (âš) FLOWER + {0x2699, 0x2699, prExtendedPictographic}, // E1.0 [1] (⚙️) gear + {0x269A, 0x269A, prExtendedPictographic}, // E0.0 [1] (âšš) STAFF OF HERMES + {0x269B, 0x269C, prExtendedPictographic}, // E1.0 [2] (⚛️..⚜️) atom symbol..fleur-de-lis + {0x269D, 0x269F, prExtendedPictographic}, // E0.0 [3] (âšť..âšź) OUTLINED WHITE STAR..THREE LINES CONVERGING LEFT + {0x26A0, 0x26A1, prExtendedPictographic}, // E0.6 [2] (⚠️..⚡) warning..high voltage + {0x26A2, 0x26A6, prExtendedPictographic}, // E0.0 [5] (⚢..⚦) DOUBLED FEMALE SIGN..MALE WITH STROKE SIGN + {0x26A7, 0x26A7, prExtendedPictographic}, // E13.0 [1] (⚧️) transgender symbol + {0x26A8, 0x26A9, prExtendedPictographic}, // E0.0 [2] (⚨..âš©) VERTICAL MALE WITH STROKE SIGN..HORIZONTAL MALE WITH STROKE SIGN + {0x26AA, 0x26AB, prExtendedPictographic}, // E0.6 [2] (⚪..âš«) white circle..black circle + {0x26AC, 0x26AF, prExtendedPictographic}, // E0.0 [4] (⚬..⚯) MEDIUM SMALL WHITE CIRCLE..UNMARRIED PARTNERSHIP SYMBOL + {0x26B0, 0x26B1, prExtendedPictographic}, // E1.0 [2] (⚰️..⚱️) coffin..funeral urn + {0x26B2, 0x26BC, prExtendedPictographic}, // E0.0 [11] (⚲..⚼) NEUTER..SESQUIQUADRATE + {0x26BD, 0x26BE, prExtendedPictographic}, // E0.6 [2] (âš˝..âšľ) soccer ball..baseball + {0x26BF, 0x26C3, prExtendedPictographic}, // E0.0 [5] (âšż..â›) SQUARED KEY..BLACK DRAUGHTS KING + {0x26C4, 0x26C5, prExtendedPictographic}, // E0.6 [2] (⛄..â›…) snowman without snow..sun behind cloud + {0x26C6, 0x26C7, prExtendedPictographic}, // E0.0 [2] (⛆..⛇) RAIN..BLACK SNOWMAN + {0x26C8, 0x26C8, prExtendedPictographic}, // E0.7 [1] (â›ď¸Ź) cloud with lightning and rain + {0x26C9, 0x26CD, prExtendedPictographic}, // E0.0 [5] (⛉..⛍) TURNED WHITE SHOGI PIECE..DISABLED CAR + {0x26CE, 0x26CE, prExtendedPictographic}, // E0.6 [1] (⛎) Ophiuchus + {0x26CF, 0x26CF, prExtendedPictographic}, // E0.7 [1] (⛏️) pick + {0x26D0, 0x26D0, prExtendedPictographic}, // E0.0 [1] (â›) CAR SLIDING + {0x26D1, 0x26D1, prExtendedPictographic}, // E0.7 [1] (⛑️) rescue worker’s helmet + {0x26D2, 0x26D2, prExtendedPictographic}, // E0.0 [1] (â›’) CIRCLED CROSSING LANES + {0x26D3, 0x26D3, prExtendedPictographic}, // E0.7 [1] (⛓️) chains + {0x26D4, 0x26D4, prExtendedPictographic}, // E0.6 [1] (â›”) no entry + {0x26D5, 0x26E8, prExtendedPictographic}, // E0.0 [20] (⛕..⛨) ALTERNATE ONE-WAY LEFT WAY TRAFFIC..BLACK CROSS ON SHIELD + {0x26E9, 0x26E9, prExtendedPictographic}, // E0.7 [1] (⛩️) shinto shrine + {0x26EA, 0x26EA, prExtendedPictographic}, // E0.6 [1] (⛪) church + {0x26EB, 0x26EF, prExtendedPictographic}, // E0.0 [5] (⛫..⛯) CASTLE..MAP SYMBOL FOR LIGHTHOUSE + {0x26F0, 0x26F1, prExtendedPictographic}, // E0.7 [2] (⛰️..⛱️) mountain..umbrella on ground + {0x26F2, 0x26F3, prExtendedPictographic}, // E0.6 [2] (⛲..⛳) fountain..flag in hole + {0x26F4, 0x26F4, prExtendedPictographic}, // E0.7 [1] (⛴️) ferry + {0x26F5, 0x26F5, prExtendedPictographic}, // E0.6 [1] (⛵) sailboat + {0x26F6, 0x26F6, prExtendedPictographic}, // E0.0 [1] (â›¶) SQUARE FOUR CORNERS + {0x26F7, 0x26F9, prExtendedPictographic}, // E0.7 [3] (⛷️..⛹️) skier..person bouncing ball + {0x26FA, 0x26FA, prExtendedPictographic}, // E0.6 [1] (⛺) tent + {0x26FB, 0x26FC, prExtendedPictographic}, // E0.0 [2] (â›»..⛼) JAPANESE BANK SYMBOL..HEADSTONE GRAVEYARD SYMBOL + {0x26FD, 0x26FD, prExtendedPictographic}, // E0.6 [1] (â›˝) fuel pump + {0x26FE, 0x2701, prExtendedPictographic}, // E0.0 [4] (⛾..âś) CUP ON BLACK SQUARE..UPPER BLADE SCISSORS + {0x2702, 0x2702, prExtendedPictographic}, // E0.6 [1] (✂️) scissors + {0x2703, 0x2704, prExtendedPictographic}, // E0.0 [2] (âś..âś„) LOWER BLADE SCISSORS..WHITE SCISSORS + {0x2705, 0x2705, prExtendedPictographic}, // E0.6 [1] (âś…) check mark button + {0x2708, 0x270C, prExtendedPictographic}, // E0.6 [5] (âśď¸Ź..✌️) airplane..victory hand + {0x270D, 0x270D, prExtendedPictographic}, // E0.7 [1] (✍️) writing hand + {0x270E, 0x270E, prExtendedPictographic}, // E0.0 [1] (✎) LOWER RIGHT PENCIL + {0x270F, 0x270F, prExtendedPictographic}, // E0.6 [1] (✏️) pencil + {0x2710, 0x2711, prExtendedPictographic}, // E0.0 [2] (âś..âś‘) UPPER RIGHT PENCIL..WHITE NIB + {0x2712, 0x2712, prExtendedPictographic}, // E0.6 [1] (✒️) black nib + {0x2714, 0x2714, prExtendedPictographic}, // E0.6 [1] (✔️) check mark + {0x2716, 0x2716, prExtendedPictographic}, // E0.6 [1] (✖️) multiply + {0x271D, 0x271D, prExtendedPictographic}, // E0.7 [1] (✝️) latin cross + {0x2721, 0x2721, prExtendedPictographic}, // E0.7 [1] (✡️) star of David + {0x2728, 0x2728, prExtendedPictographic}, // E0.6 [1] (✨) sparkles + {0x2733, 0x2734, prExtendedPictographic}, // E0.6 [2] (✳️..✴️) eight-spoked asterisk..eight-pointed star + {0x2744, 0x2744, prExtendedPictographic}, // E0.6 [1] (❄️) snowflake + {0x2747, 0x2747, prExtendedPictographic}, // E0.6 [1] (❇️) sparkle + {0x274C, 0x274C, prExtendedPictographic}, // E0.6 [1] (❌) cross mark + {0x274E, 0x274E, prExtendedPictographic}, // E0.6 [1] (❎) cross mark button + {0x2753, 0x2755, prExtendedPictographic}, // E0.6 [3] (âť“..âť•) red question mark..white exclamation mark + {0x2757, 0x2757, prExtendedPictographic}, // E0.6 [1] (âť—) red exclamation mark + {0x2763, 0x2763, prExtendedPictographic}, // E1.0 [1] (❣️) heart exclamation + {0x2764, 0x2764, prExtendedPictographic}, // E0.6 [1] (❤️) red heart + {0x2765, 0x2767, prExtendedPictographic}, // E0.0 [3] (❥..âť§) ROTATED HEAVY BLACK HEART BULLET..ROTATED FLORAL HEART BULLET + {0x2795, 0x2797, prExtendedPictographic}, // E0.6 [3] (âž•..âž—) plus..divide + {0x27A1, 0x27A1, prExtendedPictographic}, // E0.6 [1] (➡️) right arrow + {0x27B0, 0x27B0, prExtendedPictographic}, // E0.6 [1] (âž°) curly loop + {0x27BF, 0x27BF, prExtendedPictographic}, // E1.0 [1] (âžż) double curly loop + {0x2934, 0x2935, prExtendedPictographic}, // E0.6 [2] (⤴️..⤵️) right arrow curving up..right arrow curving down + {0x2B05, 0x2B07, prExtendedPictographic}, // E0.6 [3] (⬅️..⬇️) left arrow..down arrow + {0x2B1B, 0x2B1C, prExtendedPictographic}, // E0.6 [2] (⬛..⬜) black large square..white large square + {0x2B50, 0x2B50, prExtendedPictographic}, // E0.6 [1] (â­) star + {0x2B55, 0x2B55, prExtendedPictographic}, // E0.6 [1] (â­•) hollow red circle + {0x2C00, 0x2C7B, prALetter}, // L& [124] GLAGOLITIC CAPITAL LETTER AZU..LATIN LETTER SMALL CAPITAL TURNED E + {0x2C7C, 0x2C7D, prALetter}, // Lm [2] LATIN SUBSCRIPT SMALL LETTER J..MODIFIER LETTER CAPITAL V + {0x2C7E, 0x2CE4, prALetter}, // L& [103] LATIN CAPITAL LETTER S WITH SWASH TAIL..COPTIC SYMBOL KAI + {0x2CEB, 0x2CEE, prALetter}, // L& [4] COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI..COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA + {0x2CEF, 0x2CF1, prExtend}, // Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS + {0x2CF2, 0x2CF3, prALetter}, // L& [2] COPTIC CAPITAL LETTER BOHAIRIC KHEI..COPTIC SMALL LETTER BOHAIRIC KHEI + {0x2D00, 0x2D25, prALetter}, // L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE + {0x2D27, 0x2D27, prALetter}, // L& GEORGIAN SMALL LETTER YN + {0x2D2D, 0x2D2D, prALetter}, // L& GEORGIAN SMALL LETTER AEN + {0x2D30, 0x2D67, prALetter}, // Lo [56] TIFINAGH LETTER YA..TIFINAGH LETTER YO + {0x2D6F, 0x2D6F, prALetter}, // Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK + {0x2D7F, 0x2D7F, prExtend}, // Mn TIFINAGH CONSONANT JOINER + {0x2D80, 0x2D96, prALetter}, // Lo [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE + {0x2DA0, 0x2DA6, prALetter}, // Lo [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO + {0x2DA8, 0x2DAE, prALetter}, // Lo [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO + {0x2DB0, 0x2DB6, prALetter}, // Lo [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO + {0x2DB8, 0x2DBE, prALetter}, // Lo [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO + {0x2DC0, 0x2DC6, prALetter}, // Lo [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO + {0x2DC8, 0x2DCE, prALetter}, // Lo [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO + {0x2DD0, 0x2DD6, prALetter}, // Lo [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO + {0x2DD8, 0x2DDE, prALetter}, // Lo [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO + {0x2DE0, 0x2DFF, prExtend}, // Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS + {0x2E2F, 0x2E2F, prALetter}, // Lm VERTICAL TILDE + {0x3000, 0x3000, prWSegSpace}, // Zs IDEOGRAPHIC SPACE + {0x3005, 0x3005, prALetter}, // Lm IDEOGRAPHIC ITERATION MARK + {0x302A, 0x302D, prExtend}, // Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK + {0x302E, 0x302F, prExtend}, // Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK + {0x3030, 0x3030, prExtendedPictographic}, // E0.6 [1] (〰️) wavy dash + {0x3031, 0x3035, prKatakana}, // Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF + {0x303B, 0x303B, prALetter}, // Lm VERTICAL IDEOGRAPHIC ITERATION MARK + {0x303C, 0x303C, prALetter}, // Lo MASU MARK + {0x303D, 0x303D, prExtendedPictographic}, // E0.6 [1] (〽️) part alternation mark + {0x3099, 0x309A, prExtend}, // Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + {0x309B, 0x309C, prKatakana}, // Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + {0x30A0, 0x30A0, prKatakana}, // Pd KATAKANA-HIRAGANA DOUBLE HYPHEN + {0x30A1, 0x30FA, prKatakana}, // Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO + {0x30FC, 0x30FE, prKatakana}, // Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK + {0x30FF, 0x30FF, prKatakana}, // Lo KATAKANA DIGRAPH KOTO + {0x3105, 0x312F, prALetter}, // Lo [43] BOPOMOFO LETTER B..BOPOMOFO LETTER NN + {0x3131, 0x318E, prALetter}, // Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE + {0x31A0, 0x31BF, prALetter}, // Lo [32] BOPOMOFO LETTER BU..BOPOMOFO LETTER AH + {0x31F0, 0x31FF, prKatakana}, // Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO + {0x3297, 0x3297, prExtendedPictographic}, // E0.6 [1] (㊗️) Japanese “congratulations” button + {0x3299, 0x3299, prExtendedPictographic}, // E0.6 [1] (㊙️) Japanese “secret” button + {0x32D0, 0x32FE, prKatakana}, // So [47] CIRCLED KATAKANA A..CIRCLED KATAKANA WO + {0x3300, 0x3357, prKatakana}, // So [88] SQUARE APAATO..SQUARE WATTO + {0xA000, 0xA014, prALetter}, // Lo [21] YI SYLLABLE IT..YI SYLLABLE E + {0xA015, 0xA015, prALetter}, // Lm YI SYLLABLE WU + {0xA016, 0xA48C, prALetter}, // Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR + {0xA4D0, 0xA4F7, prALetter}, // Lo [40] LISU LETTER BA..LISU LETTER OE + {0xA4F8, 0xA4FD, prALetter}, // Lm [6] LISU LETTER TONE MYA TI..LISU LETTER TONE MYA JEU + {0xA500, 0xA60B, prALetter}, // Lo [268] VAI SYLLABLE EE..VAI SYLLABLE NG + {0xA60C, 0xA60C, prALetter}, // Lm VAI SYLLABLE LENGTHENER + {0xA610, 0xA61F, prALetter}, // Lo [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG + {0xA620, 0xA629, prNumeric}, // Nd [10] VAI DIGIT ZERO..VAI DIGIT NINE + {0xA62A, 0xA62B, prALetter}, // Lo [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO + {0xA640, 0xA66D, prALetter}, // L& [46] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O + {0xA66E, 0xA66E, prALetter}, // Lo CYRILLIC LETTER MULTIOCULAR O + {0xA66F, 0xA66F, prExtend}, // Mn COMBINING CYRILLIC VZMET + {0xA670, 0xA672, prExtend}, // Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN + {0xA674, 0xA67D, prExtend}, // Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK + {0xA67F, 0xA67F, prALetter}, // Lm CYRILLIC PAYEROK + {0xA680, 0xA69B, prALetter}, // L& [28] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER CROSSED O + {0xA69C, 0xA69D, prALetter}, // Lm [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER LETTER CYRILLIC SOFT SIGN + {0xA69E, 0xA69F, prExtend}, // Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E + {0xA6A0, 0xA6E5, prALetter}, // Lo [70] BAMUM LETTER A..BAMUM LETTER KI + {0xA6E6, 0xA6EF, prALetter}, // Nl [10] BAMUM LETTER MO..BAMUM LETTER KOGHOM + {0xA6F0, 0xA6F1, prExtend}, // Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS + {0xA708, 0xA716, prALetter}, // Sk [15] MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR + {0xA717, 0xA71F, prALetter}, // Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK + {0xA720, 0xA721, prALetter}, // Sk [2] MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE + {0xA722, 0xA76F, prALetter}, // L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON + {0xA770, 0xA770, prALetter}, // Lm MODIFIER LETTER US + {0xA771, 0xA787, prALetter}, // L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T + {0xA788, 0xA788, prALetter}, // Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT + {0xA789, 0xA78A, prALetter}, // Sk [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN + {0xA78B, 0xA78E, prALetter}, // L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT + {0xA78F, 0xA78F, prALetter}, // Lo LATIN LETTER SINOLOGICAL DOT + {0xA790, 0xA7CA, prALetter}, // L& [59] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY + {0xA7D0, 0xA7D1, prALetter}, // L& [2] LATIN CAPITAL LETTER CLOSED INSULAR G..LATIN SMALL LETTER CLOSED INSULAR G + {0xA7D3, 0xA7D3, prALetter}, // L& LATIN SMALL LETTER DOUBLE THORN + {0xA7D5, 0xA7D9, prALetter}, // L& [5] LATIN SMALL LETTER DOUBLE WYNN..LATIN SMALL LETTER SIGMOID S + {0xA7F2, 0xA7F4, prALetter}, // Lm [3] MODIFIER LETTER CAPITAL C..MODIFIER LETTER CAPITAL Q + {0xA7F5, 0xA7F6, prALetter}, // L& [2] LATIN CAPITAL LETTER REVERSED HALF H..LATIN SMALL LETTER REVERSED HALF H + {0xA7F7, 0xA7F7, prALetter}, // Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I + {0xA7F8, 0xA7F9, prALetter}, // Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE + {0xA7FA, 0xA7FA, prALetter}, // L& LATIN LETTER SMALL CAPITAL TURNED M + {0xA7FB, 0xA801, prALetter}, // Lo [7] LATIN EPIGRAPHIC LETTER REVERSED F..SYLOTI NAGRI LETTER I + {0xA802, 0xA802, prExtend}, // Mn SYLOTI NAGRI SIGN DVISVARA + {0xA803, 0xA805, prALetter}, // Lo [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O + {0xA806, 0xA806, prExtend}, // Mn SYLOTI NAGRI SIGN HASANTA + {0xA807, 0xA80A, prALetter}, // Lo [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO + {0xA80B, 0xA80B, prExtend}, // Mn SYLOTI NAGRI SIGN ANUSVARA + {0xA80C, 0xA822, prALetter}, // Lo [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO + {0xA823, 0xA824, prExtend}, // Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I + {0xA825, 0xA826, prExtend}, // Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E + {0xA827, 0xA827, prExtend}, // Mc SYLOTI NAGRI VOWEL SIGN OO + {0xA82C, 0xA82C, prExtend}, // Mn SYLOTI NAGRI SIGN ALTERNATE HASANTA + {0xA840, 0xA873, prALetter}, // Lo [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU + {0xA880, 0xA881, prExtend}, // Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA + {0xA882, 0xA8B3, prALetter}, // Lo [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA + {0xA8B4, 0xA8C3, prExtend}, // Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU + {0xA8C4, 0xA8C5, prExtend}, // Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU + {0xA8D0, 0xA8D9, prNumeric}, // Nd [10] SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE + {0xA8E0, 0xA8F1, prExtend}, // Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA + {0xA8F2, 0xA8F7, prALetter}, // Lo [6] DEVANAGARI SIGN SPACING CANDRABINDU..DEVANAGARI SIGN CANDRABINDU AVAGRAHA + {0xA8FB, 0xA8FB, prALetter}, // Lo DEVANAGARI HEADSTROKE + {0xA8FD, 0xA8FE, prALetter}, // Lo [2] DEVANAGARI JAIN OM..DEVANAGARI LETTER AY + {0xA8FF, 0xA8FF, prExtend}, // Mn DEVANAGARI VOWEL SIGN AY + {0xA900, 0xA909, prNumeric}, // Nd [10] KAYAH LI DIGIT ZERO..KAYAH LI DIGIT NINE + {0xA90A, 0xA925, prALetter}, // Lo [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO + {0xA926, 0xA92D, prExtend}, // Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU + {0xA930, 0xA946, prALetter}, // Lo [23] REJANG LETTER KA..REJANG LETTER A + {0xA947, 0xA951, prExtend}, // Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R + {0xA952, 0xA953, prExtend}, // Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA + {0xA960, 0xA97C, prALetter}, // Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH + {0xA980, 0xA982, prExtend}, // Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR + {0xA983, 0xA983, prExtend}, // Mc JAVANESE SIGN WIGNYAN + {0xA984, 0xA9B2, prALetter}, // Lo [47] JAVANESE LETTER A..JAVANESE LETTER HA + {0xA9B3, 0xA9B3, prExtend}, // Mn JAVANESE SIGN CECAK TELU + {0xA9B4, 0xA9B5, prExtend}, // Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG + {0xA9B6, 0xA9B9, prExtend}, // Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT + {0xA9BA, 0xA9BB, prExtend}, // Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE + {0xA9BC, 0xA9BD, prExtend}, // Mn [2] JAVANESE VOWEL SIGN PEPET..JAVANESE CONSONANT SIGN KERET + {0xA9BE, 0xA9C0, prExtend}, // Mc [3] JAVANESE CONSONANT SIGN PENGKAL..JAVANESE PANGKON + {0xA9CF, 0xA9CF, prALetter}, // Lm JAVANESE PANGRANGKEP + {0xA9D0, 0xA9D9, prNumeric}, // Nd [10] JAVANESE DIGIT ZERO..JAVANESE DIGIT NINE + {0xA9E5, 0xA9E5, prExtend}, // Mn MYANMAR SIGN SHAN SAW + {0xA9F0, 0xA9F9, prNumeric}, // Nd [10] MYANMAR TAI LAING DIGIT ZERO..MYANMAR TAI LAING DIGIT NINE + {0xAA00, 0xAA28, prALetter}, // Lo [41] CHAM LETTER A..CHAM LETTER HA + {0xAA29, 0xAA2E, prExtend}, // Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE + {0xAA2F, 0xAA30, prExtend}, // Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI + {0xAA31, 0xAA32, prExtend}, // Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE + {0xAA33, 0xAA34, prExtend}, // Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA + {0xAA35, 0xAA36, prExtend}, // Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA + {0xAA40, 0xAA42, prALetter}, // Lo [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG + {0xAA43, 0xAA43, prExtend}, // Mn CHAM CONSONANT SIGN FINAL NG + {0xAA44, 0xAA4B, prALetter}, // Lo [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS + {0xAA4C, 0xAA4C, prExtend}, // Mn CHAM CONSONANT SIGN FINAL M + {0xAA4D, 0xAA4D, prExtend}, // Mc CHAM CONSONANT SIGN FINAL H + {0xAA50, 0xAA59, prNumeric}, // Nd [10] CHAM DIGIT ZERO..CHAM DIGIT NINE + {0xAA7B, 0xAA7B, prExtend}, // Mc MYANMAR SIGN PAO KAREN TONE + {0xAA7C, 0xAA7C, prExtend}, // Mn MYANMAR SIGN TAI LAING TONE-2 + {0xAA7D, 0xAA7D, prExtend}, // Mc MYANMAR SIGN TAI LAING TONE-5 + {0xAAB0, 0xAAB0, prExtend}, // Mn TAI VIET MAI KANG + {0xAAB2, 0xAAB4, prExtend}, // Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U + {0xAAB7, 0xAAB8, prExtend}, // Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA + {0xAABE, 0xAABF, prExtend}, // Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK + {0xAAC1, 0xAAC1, prExtend}, // Mn TAI VIET TONE MAI THO + {0xAAE0, 0xAAEA, prALetter}, // Lo [11] MEETEI MAYEK LETTER E..MEETEI MAYEK LETTER SSA + {0xAAEB, 0xAAEB, prExtend}, // Mc MEETEI MAYEK VOWEL SIGN II + {0xAAEC, 0xAAED, prExtend}, // Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI + {0xAAEE, 0xAAEF, prExtend}, // Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU + {0xAAF2, 0xAAF2, prALetter}, // Lo MEETEI MAYEK ANJI + {0xAAF3, 0xAAF4, prALetter}, // Lm [2] MEETEI MAYEK SYLLABLE REPETITION MARK..MEETEI MAYEK WORD REPETITION MARK + {0xAAF5, 0xAAF5, prExtend}, // Mc MEETEI MAYEK VOWEL SIGN VISARGA + {0xAAF6, 0xAAF6, prExtend}, // Mn MEETEI MAYEK VIRAMA + {0xAB01, 0xAB06, prALetter}, // Lo [6] ETHIOPIC SYLLABLE TTHU..ETHIOPIC SYLLABLE TTHO + {0xAB09, 0xAB0E, prALetter}, // Lo [6] ETHIOPIC SYLLABLE DDHU..ETHIOPIC SYLLABLE DDHO + {0xAB11, 0xAB16, prALetter}, // Lo [6] ETHIOPIC SYLLABLE DZU..ETHIOPIC SYLLABLE DZO + {0xAB20, 0xAB26, prALetter}, // Lo [7] ETHIOPIC SYLLABLE CCHHA..ETHIOPIC SYLLABLE CCHHO + {0xAB28, 0xAB2E, prALetter}, // Lo [7] ETHIOPIC SYLLABLE BBA..ETHIOPIC SYLLABLE BBO + {0xAB30, 0xAB5A, prALetter}, // L& [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG + {0xAB5B, 0xAB5B, prALetter}, // Sk MODIFIER BREVE WITH INVERTED BREVE + {0xAB5C, 0xAB5F, prALetter}, // Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK + {0xAB60, 0xAB68, prALetter}, // L& [9] LATIN SMALL LETTER SAKHA YAT..LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE + {0xAB69, 0xAB69, prALetter}, // Lm MODIFIER LETTER SMALL TURNED W + {0xAB70, 0xABBF, prALetter}, // L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA + {0xABC0, 0xABE2, prALetter}, // Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM + {0xABE3, 0xABE4, prExtend}, // Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP + {0xABE5, 0xABE5, prExtend}, // Mn MEETEI MAYEK VOWEL SIGN ANAP + {0xABE6, 0xABE7, prExtend}, // Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP + {0xABE8, 0xABE8, prExtend}, // Mn MEETEI MAYEK VOWEL SIGN UNAP + {0xABE9, 0xABEA, prExtend}, // Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG + {0xABEC, 0xABEC, prExtend}, // Mc MEETEI MAYEK LUM IYEK + {0xABED, 0xABED, prExtend}, // Mn MEETEI MAYEK APUN IYEK + {0xABF0, 0xABF9, prNumeric}, // Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT NINE + {0xAC00, 0xD7A3, prALetter}, // Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH + {0xD7B0, 0xD7C6, prALetter}, // Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E + {0xD7CB, 0xD7FB, prALetter}, // Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH + {0xFB00, 0xFB06, prALetter}, // L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST + {0xFB13, 0xFB17, prALetter}, // L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH + {0xFB1D, 0xFB1D, prHebrewLetter}, // Lo HEBREW LETTER YOD WITH HIRIQ + {0xFB1E, 0xFB1E, prExtend}, // Mn HEBREW POINT JUDEO-SPANISH VARIKA + {0xFB1F, 0xFB28, prHebrewLetter}, // Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV + {0xFB2A, 0xFB36, prHebrewLetter}, // Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH + {0xFB38, 0xFB3C, prHebrewLetter}, // Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH + {0xFB3E, 0xFB3E, prHebrewLetter}, // Lo HEBREW LETTER MEM WITH DAGESH + {0xFB40, 0xFB41, prHebrewLetter}, // Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH + {0xFB43, 0xFB44, prHebrewLetter}, // Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH + {0xFB46, 0xFB4F, prHebrewLetter}, // Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE ALEF LAMED + {0xFB50, 0xFBB1, prALetter}, // Lo [98] ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM + {0xFBD3, 0xFD3D, prALetter}, // Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM + {0xFD50, 0xFD8F, prALetter}, // Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM + {0xFD92, 0xFDC7, prALetter}, // Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM + {0xFDF0, 0xFDFB, prALetter}, // Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU + {0xFE00, 0xFE0F, prExtend}, // Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 + {0xFE10, 0xFE10, prMidNum}, // Po PRESENTATION FORM FOR VERTICAL COMMA + {0xFE13, 0xFE13, prMidLetter}, // Po PRESENTATION FORM FOR VERTICAL COLON + {0xFE14, 0xFE14, prMidNum}, // Po PRESENTATION FORM FOR VERTICAL SEMICOLON + {0xFE20, 0xFE2F, prExtend}, // Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF + {0xFE33, 0xFE34, prExtendNumLet}, // Pc [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE + {0xFE4D, 0xFE4F, prExtendNumLet}, // Pc [3] DASHED LOW LINE..WAVY LOW LINE + {0xFE50, 0xFE50, prMidNum}, // Po SMALL COMMA + {0xFE52, 0xFE52, prMidNumLet}, // Po SMALL FULL STOP + {0xFE54, 0xFE54, prMidNum}, // Po SMALL SEMICOLON + {0xFE55, 0xFE55, prMidLetter}, // Po SMALL COLON + {0xFE70, 0xFE74, prALetter}, // Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM + {0xFE76, 0xFEFC, prALetter}, // Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM + {0xFEFF, 0xFEFF, prFormat}, // Cf ZERO WIDTH NO-BREAK SPACE + {0xFF07, 0xFF07, prMidNumLet}, // Po FULLWIDTH APOSTROPHE + {0xFF0C, 0xFF0C, prMidNum}, // Po FULLWIDTH COMMA + {0xFF0E, 0xFF0E, prMidNumLet}, // Po FULLWIDTH FULL STOP + {0xFF10, 0xFF19, prNumeric}, // Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE + {0xFF1A, 0xFF1A, prMidLetter}, // Po FULLWIDTH COLON + {0xFF1B, 0xFF1B, prMidNum}, // Po FULLWIDTH SEMICOLON + {0xFF21, 0xFF3A, prALetter}, // L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z + {0xFF3F, 0xFF3F, prExtendNumLet}, // Pc FULLWIDTH LOW LINE + {0xFF41, 0xFF5A, prALetter}, // L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z + {0xFF66, 0xFF6F, prKatakana}, // Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU + {0xFF70, 0xFF70, prKatakana}, // Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK + {0xFF71, 0xFF9D, prKatakana}, // Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N + {0xFF9E, 0xFF9F, prExtend}, // Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK + {0xFFA0, 0xFFBE, prALetter}, // Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH + {0xFFC2, 0xFFC7, prALetter}, // Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E + {0xFFCA, 0xFFCF, prALetter}, // Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE + {0xFFD2, 0xFFD7, prALetter}, // Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU + {0xFFDA, 0xFFDC, prALetter}, // Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I + {0xFFF9, 0xFFFB, prFormat}, // Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR + {0x10000, 0x1000B, prALetter}, // Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE + {0x1000D, 0x10026, prALetter}, // Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO + {0x10028, 0x1003A, prALetter}, // Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO + {0x1003C, 0x1003D, prALetter}, // Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE + {0x1003F, 0x1004D, prALetter}, // Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO + {0x10050, 0x1005D, prALetter}, // Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 + {0x10080, 0x100FA, prALetter}, // Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 + {0x10140, 0x10174, prALetter}, // Nl [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS + {0x101FD, 0x101FD, prExtend}, // Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE + {0x10280, 0x1029C, prALetter}, // Lo [29] LYCIAN LETTER A..LYCIAN LETTER X + {0x102A0, 0x102D0, prALetter}, // Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3 + {0x102E0, 0x102E0, prExtend}, // Mn COPTIC EPACT THOUSANDS MARK + {0x10300, 0x1031F, prALetter}, // Lo [32] OLD ITALIC LETTER A..OLD ITALIC LETTER ESS + {0x1032D, 0x10340, prALetter}, // Lo [20] OLD ITALIC LETTER YE..GOTHIC LETTER PAIRTHRA + {0x10341, 0x10341, prALetter}, // Nl GOTHIC LETTER NINETY + {0x10342, 0x10349, prALetter}, // Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL + {0x1034A, 0x1034A, prALetter}, // Nl GOTHIC LETTER NINE HUNDRED + {0x10350, 0x10375, prALetter}, // Lo [38] OLD PERMIC LETTER AN..OLD PERMIC LETTER IA + {0x10376, 0x1037A, prExtend}, // Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII + {0x10380, 0x1039D, prALetter}, // Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU + {0x103A0, 0x103C3, prALetter}, // Lo [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA + {0x103C8, 0x103CF, prALetter}, // Lo [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH + {0x103D1, 0x103D5, prALetter}, // Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED + {0x10400, 0x1044F, prALetter}, // L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW + {0x10450, 0x1049D, prALetter}, // Lo [78] SHAVIAN LETTER PEEP..OSMANYA LETTER OO + {0x104A0, 0x104A9, prNumeric}, // Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE + {0x104B0, 0x104D3, prALetter}, // L& [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA + {0x104D8, 0x104FB, prALetter}, // L& [36] OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA + {0x10500, 0x10527, prALetter}, // Lo [40] ELBASAN LETTER A..ELBASAN LETTER KHE + {0x10530, 0x10563, prALetter}, // Lo [52] CAUCASIAN ALBANIAN LETTER ALT..CAUCASIAN ALBANIAN LETTER KIW + {0x10570, 0x1057A, prALetter}, // L& [11] VITHKUQI CAPITAL LETTER A..VITHKUQI CAPITAL LETTER GA + {0x1057C, 0x1058A, prALetter}, // L& [15] VITHKUQI CAPITAL LETTER HA..VITHKUQI CAPITAL LETTER RE + {0x1058C, 0x10592, prALetter}, // L& [7] VITHKUQI CAPITAL LETTER SE..VITHKUQI CAPITAL LETTER XE + {0x10594, 0x10595, prALetter}, // L& [2] VITHKUQI CAPITAL LETTER Y..VITHKUQI CAPITAL LETTER ZE + {0x10597, 0x105A1, prALetter}, // L& [11] VITHKUQI SMALL LETTER A..VITHKUQI SMALL LETTER GA + {0x105A3, 0x105B1, prALetter}, // L& [15] VITHKUQI SMALL LETTER HA..VITHKUQI SMALL LETTER RE + {0x105B3, 0x105B9, prALetter}, // L& [7] VITHKUQI SMALL LETTER SE..VITHKUQI SMALL LETTER XE + {0x105BB, 0x105BC, prALetter}, // L& [2] VITHKUQI SMALL LETTER Y..VITHKUQI SMALL LETTER ZE + {0x10600, 0x10736, prALetter}, // Lo [311] LINEAR A SIGN AB001..LINEAR A SIGN A664 + {0x10740, 0x10755, prALetter}, // Lo [22] LINEAR A SIGN A701 A..LINEAR A SIGN A732 JE + {0x10760, 0x10767, prALetter}, // Lo [8] LINEAR A SIGN A800..LINEAR A SIGN A807 + {0x10780, 0x10785, prALetter}, // Lm [6] MODIFIER LETTER SMALL CAPITAL AA..MODIFIER LETTER SMALL B WITH HOOK + {0x10787, 0x107B0, prALetter}, // Lm [42] MODIFIER LETTER SMALL DZ DIGRAPH..MODIFIER LETTER SMALL V WITH RIGHT HOOK + {0x107B2, 0x107BA, prALetter}, // Lm [9] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL S WITH CURL + {0x10800, 0x10805, prALetter}, // Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA + {0x10808, 0x10808, prALetter}, // Lo CYPRIOT SYLLABLE JO + {0x1080A, 0x10835, prALetter}, // Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO + {0x10837, 0x10838, prALetter}, // Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE + {0x1083C, 0x1083C, prALetter}, // Lo CYPRIOT SYLLABLE ZA + {0x1083F, 0x10855, prALetter}, // Lo [23] CYPRIOT SYLLABLE ZO..IMPERIAL ARAMAIC LETTER TAW + {0x10860, 0x10876, prALetter}, // Lo [23] PALMYRENE LETTER ALEPH..PALMYRENE LETTER TAW + {0x10880, 0x1089E, prALetter}, // Lo [31] NABATAEAN LETTER FINAL ALEPH..NABATAEAN LETTER TAW + {0x108E0, 0x108F2, prALetter}, // Lo [19] HATRAN LETTER ALEPH..HATRAN LETTER QOPH + {0x108F4, 0x108F5, prALetter}, // Lo [2] HATRAN LETTER SHIN..HATRAN LETTER TAW + {0x10900, 0x10915, prALetter}, // Lo [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU + {0x10920, 0x10939, prALetter}, // Lo [26] LYDIAN LETTER A..LYDIAN LETTER C + {0x10980, 0x109B7, prALetter}, // Lo [56] MEROITIC HIEROGLYPHIC LETTER A..MEROITIC CURSIVE LETTER DA + {0x109BE, 0x109BF, prALetter}, // Lo [2] MEROITIC CURSIVE LOGOGRAM RMT..MEROITIC CURSIVE LOGOGRAM IMN + {0x10A00, 0x10A00, prALetter}, // Lo KHAROSHTHI LETTER A + {0x10A01, 0x10A03, prExtend}, // Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R + {0x10A05, 0x10A06, prExtend}, // Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O + {0x10A0C, 0x10A0F, prExtend}, // Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA + {0x10A10, 0x10A13, prALetter}, // Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA + {0x10A15, 0x10A17, prALetter}, // Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA + {0x10A19, 0x10A35, prALetter}, // Lo [29] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER VHA + {0x10A38, 0x10A3A, prExtend}, // Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW + {0x10A3F, 0x10A3F, prExtend}, // Mn KHAROSHTHI VIRAMA + {0x10A60, 0x10A7C, prALetter}, // Lo [29] OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH + {0x10A80, 0x10A9C, prALetter}, // Lo [29] OLD NORTH ARABIAN LETTER HEH..OLD NORTH ARABIAN LETTER ZAH + {0x10AC0, 0x10AC7, prALetter}, // Lo [8] MANICHAEAN LETTER ALEPH..MANICHAEAN LETTER WAW + {0x10AC9, 0x10AE4, prALetter}, // Lo [28] MANICHAEAN LETTER ZAYIN..MANICHAEAN LETTER TAW + {0x10AE5, 0x10AE6, prExtend}, // Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW + {0x10B00, 0x10B35, prALetter}, // Lo [54] AVESTAN LETTER A..AVESTAN LETTER HE + {0x10B40, 0x10B55, prALetter}, // Lo [22] INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW + {0x10B60, 0x10B72, prALetter}, // Lo [19] INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW + {0x10B80, 0x10B91, prALetter}, // Lo [18] PSALTER PAHLAVI LETTER ALEPH..PSALTER PAHLAVI LETTER TAW + {0x10C00, 0x10C48, prALetter}, // Lo [73] OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH + {0x10C80, 0x10CB2, prALetter}, // L& [51] OLD HUNGARIAN CAPITAL LETTER A..OLD HUNGARIAN CAPITAL LETTER US + {0x10CC0, 0x10CF2, prALetter}, // L& [51] OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US + {0x10D00, 0x10D23, prALetter}, // Lo [36] HANIFI ROHINGYA LETTER A..HANIFI ROHINGYA MARK NA KHONNA + {0x10D24, 0x10D27, prExtend}, // Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI + {0x10D30, 0x10D39, prNumeric}, // Nd [10] HANIFI ROHINGYA DIGIT ZERO..HANIFI ROHINGYA DIGIT NINE + {0x10E80, 0x10EA9, prALetter}, // Lo [42] YEZIDI LETTER ELIF..YEZIDI LETTER ET + {0x10EAB, 0x10EAC, prExtend}, // Mn [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK + {0x10EB0, 0x10EB1, prALetter}, // Lo [2] YEZIDI LETTER LAM WITH DOT ABOVE..YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE + {0x10F00, 0x10F1C, prALetter}, // Lo [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL + {0x10F27, 0x10F27, prALetter}, // Lo OLD SOGDIAN LIGATURE AYIN-DALETH + {0x10F30, 0x10F45, prALetter}, // Lo [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN + {0x10F46, 0x10F50, prExtend}, // Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW + {0x10F70, 0x10F81, prALetter}, // Lo [18] OLD UYGHUR LETTER ALEPH..OLD UYGHUR LETTER LESH + {0x10F82, 0x10F85, prExtend}, // Mn [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW + {0x10FB0, 0x10FC4, prALetter}, // Lo [21] CHORASMIAN LETTER ALEPH..CHORASMIAN LETTER TAW + {0x10FE0, 0x10FF6, prALetter}, // Lo [23] ELYMAIC LETTER ALEPH..ELYMAIC LIGATURE ZAYIN-YODH + {0x11000, 0x11000, prExtend}, // Mc BRAHMI SIGN CANDRABINDU + {0x11001, 0x11001, prExtend}, // Mn BRAHMI SIGN ANUSVARA + {0x11002, 0x11002, prExtend}, // Mc BRAHMI SIGN VISARGA + {0x11003, 0x11037, prALetter}, // Lo [53] BRAHMI SIGN JIHVAMULIYA..BRAHMI LETTER OLD TAMIL NNNA + {0x11038, 0x11046, prExtend}, // Mn [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA + {0x11066, 0x1106F, prNumeric}, // Nd [10] BRAHMI DIGIT ZERO..BRAHMI DIGIT NINE + {0x11070, 0x11070, prExtend}, // Mn BRAHMI SIGN OLD TAMIL VIRAMA + {0x11071, 0x11072, prALetter}, // Lo [2] BRAHMI LETTER OLD TAMIL SHORT E..BRAHMI LETTER OLD TAMIL SHORT O + {0x11073, 0x11074, prExtend}, // Mn [2] BRAHMI VOWEL SIGN OLD TAMIL SHORT E..BRAHMI VOWEL SIGN OLD TAMIL SHORT O + {0x11075, 0x11075, prALetter}, // Lo BRAHMI LETTER OLD TAMIL LLA + {0x1107F, 0x11081, prExtend}, // Mn [3] BRAHMI NUMBER JOINER..KAITHI SIGN ANUSVARA + {0x11082, 0x11082, prExtend}, // Mc KAITHI SIGN VISARGA + {0x11083, 0x110AF, prALetter}, // Lo [45] KAITHI LETTER A..KAITHI LETTER HA + {0x110B0, 0x110B2, prExtend}, // Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II + {0x110B3, 0x110B6, prExtend}, // Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI + {0x110B7, 0x110B8, prExtend}, // Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU + {0x110B9, 0x110BA, prExtend}, // Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA + {0x110BD, 0x110BD, prFormat}, // Cf KAITHI NUMBER SIGN + {0x110C2, 0x110C2, prExtend}, // Mn KAITHI VOWEL SIGN VOCALIC R + {0x110CD, 0x110CD, prFormat}, // Cf KAITHI NUMBER SIGN ABOVE + {0x110D0, 0x110E8, prALetter}, // Lo [25] SORA SOMPENG LETTER SAH..SORA SOMPENG LETTER MAE + {0x110F0, 0x110F9, prNumeric}, // Nd [10] SORA SOMPENG DIGIT ZERO..SORA SOMPENG DIGIT NINE + {0x11100, 0x11102, prExtend}, // Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA + {0x11103, 0x11126, prALetter}, // Lo [36] CHAKMA LETTER AA..CHAKMA LETTER HAA + {0x11127, 0x1112B, prExtend}, // Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU + {0x1112C, 0x1112C, prExtend}, // Mc CHAKMA VOWEL SIGN E + {0x1112D, 0x11134, prExtend}, // Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA + {0x11136, 0x1113F, prNumeric}, // Nd [10] CHAKMA DIGIT ZERO..CHAKMA DIGIT NINE + {0x11144, 0x11144, prALetter}, // Lo CHAKMA LETTER LHAA + {0x11145, 0x11146, prExtend}, // Mc [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI + {0x11147, 0x11147, prALetter}, // Lo CHAKMA LETTER VAA + {0x11150, 0x11172, prALetter}, // Lo [35] MAHAJANI LETTER A..MAHAJANI LETTER RRA + {0x11173, 0x11173, prExtend}, // Mn MAHAJANI SIGN NUKTA + {0x11176, 0x11176, prALetter}, // Lo MAHAJANI LIGATURE SHRI + {0x11180, 0x11181, prExtend}, // Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA + {0x11182, 0x11182, prExtend}, // Mc SHARADA SIGN VISARGA + {0x11183, 0x111B2, prALetter}, // Lo [48] SHARADA LETTER A..SHARADA LETTER HA + {0x111B3, 0x111B5, prExtend}, // Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II + {0x111B6, 0x111BE, prExtend}, // Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O + {0x111BF, 0x111C0, prExtend}, // Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA + {0x111C1, 0x111C4, prALetter}, // Lo [4] SHARADA SIGN AVAGRAHA..SHARADA OM + {0x111C9, 0x111CC, prExtend}, // Mn [4] SHARADA SANDHI MARK..SHARADA EXTRA SHORT VOWEL MARK + {0x111CE, 0x111CE, prExtend}, // Mc SHARADA VOWEL SIGN PRISHTHAMATRA E + {0x111CF, 0x111CF, prExtend}, // Mn SHARADA SIGN INVERTED CANDRABINDU + {0x111D0, 0x111D9, prNumeric}, // Nd [10] SHARADA DIGIT ZERO..SHARADA DIGIT NINE + {0x111DA, 0x111DA, prALetter}, // Lo SHARADA EKAM + {0x111DC, 0x111DC, prALetter}, // Lo SHARADA HEADSTROKE + {0x11200, 0x11211, prALetter}, // Lo [18] KHOJKI LETTER A..KHOJKI LETTER JJA + {0x11213, 0x1122B, prALetter}, // Lo [25] KHOJKI LETTER NYA..KHOJKI LETTER LLA + {0x1122C, 0x1122E, prExtend}, // Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II + {0x1122F, 0x11231, prExtend}, // Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI + {0x11232, 0x11233, prExtend}, // Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU + {0x11234, 0x11234, prExtend}, // Mn KHOJKI SIGN ANUSVARA + {0x11235, 0x11235, prExtend}, // Mc KHOJKI SIGN VIRAMA + {0x11236, 0x11237, prExtend}, // Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA + {0x1123E, 0x1123E, prExtend}, // Mn KHOJKI SIGN SUKUN + {0x11280, 0x11286, prALetter}, // Lo [7] MULTANI LETTER A..MULTANI LETTER GA + {0x11288, 0x11288, prALetter}, // Lo MULTANI LETTER GHA + {0x1128A, 0x1128D, prALetter}, // Lo [4] MULTANI LETTER CA..MULTANI LETTER JJA + {0x1128F, 0x1129D, prALetter}, // Lo [15] MULTANI LETTER NYA..MULTANI LETTER BA + {0x1129F, 0x112A8, prALetter}, // Lo [10] MULTANI LETTER BHA..MULTANI LETTER RHA + {0x112B0, 0x112DE, prALetter}, // Lo [47] KHUDAWADI LETTER A..KHUDAWADI LETTER HA + {0x112DF, 0x112DF, prExtend}, // Mn KHUDAWADI SIGN ANUSVARA + {0x112E0, 0x112E2, prExtend}, // Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II + {0x112E3, 0x112EA, prExtend}, // Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA + {0x112F0, 0x112F9, prNumeric}, // Nd [10] KHUDAWADI DIGIT ZERO..KHUDAWADI DIGIT NINE + {0x11300, 0x11301, prExtend}, // Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU + {0x11302, 0x11303, prExtend}, // Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA + {0x11305, 0x1130C, prALetter}, // Lo [8] GRANTHA LETTER A..GRANTHA LETTER VOCALIC L + {0x1130F, 0x11310, prALetter}, // Lo [2] GRANTHA LETTER EE..GRANTHA LETTER AI + {0x11313, 0x11328, prALetter}, // Lo [22] GRANTHA LETTER OO..GRANTHA LETTER NA + {0x1132A, 0x11330, prALetter}, // Lo [7] GRANTHA LETTER PA..GRANTHA LETTER RA + {0x11332, 0x11333, prALetter}, // Lo [2] GRANTHA LETTER LA..GRANTHA LETTER LLA + {0x11335, 0x11339, prALetter}, // Lo [5] GRANTHA LETTER VA..GRANTHA LETTER HA + {0x1133B, 0x1133C, prExtend}, // Mn [2] COMBINING BINDU BELOW..GRANTHA SIGN NUKTA + {0x1133D, 0x1133D, prALetter}, // Lo GRANTHA SIGN AVAGRAHA + {0x1133E, 0x1133F, prExtend}, // Mc [2] GRANTHA VOWEL SIGN AA..GRANTHA VOWEL SIGN I + {0x11340, 0x11340, prExtend}, // Mn GRANTHA VOWEL SIGN II + {0x11341, 0x11344, prExtend}, // Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR + {0x11347, 0x11348, prExtend}, // Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI + {0x1134B, 0x1134D, prExtend}, // Mc [3] GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA + {0x11350, 0x11350, prALetter}, // Lo GRANTHA OM + {0x11357, 0x11357, prExtend}, // Mc GRANTHA AU LENGTH MARK + {0x1135D, 0x11361, prALetter}, // Lo [5] GRANTHA SIGN PLUTA..GRANTHA LETTER VOCALIC LL + {0x11362, 0x11363, prExtend}, // Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL + {0x11366, 0x1136C, prExtend}, // Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX + {0x11370, 0x11374, prExtend}, // Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA + {0x11400, 0x11434, prALetter}, // Lo [53] NEWA LETTER A..NEWA LETTER HA + {0x11435, 0x11437, prExtend}, // Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II + {0x11438, 0x1143F, prExtend}, // Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI + {0x11440, 0x11441, prExtend}, // Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU + {0x11442, 0x11444, prExtend}, // Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA + {0x11445, 0x11445, prExtend}, // Mc NEWA SIGN VISARGA + {0x11446, 0x11446, prExtend}, // Mn NEWA SIGN NUKTA + {0x11447, 0x1144A, prALetter}, // Lo [4] NEWA SIGN AVAGRAHA..NEWA SIDDHI + {0x11450, 0x11459, prNumeric}, // Nd [10] NEWA DIGIT ZERO..NEWA DIGIT NINE + {0x1145E, 0x1145E, prExtend}, // Mn NEWA SANDHI MARK + {0x1145F, 0x11461, prALetter}, // Lo [3] NEWA LETTER VEDIC ANUSVARA..NEWA SIGN UPADHMANIYA + {0x11480, 0x114AF, prALetter}, // Lo [48] TIRHUTA ANJI..TIRHUTA LETTER HA + {0x114B0, 0x114B2, prExtend}, // Mc [3] TIRHUTA VOWEL SIGN AA..TIRHUTA VOWEL SIGN II + {0x114B3, 0x114B8, prExtend}, // Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL + {0x114B9, 0x114B9, prExtend}, // Mc TIRHUTA VOWEL SIGN E + {0x114BA, 0x114BA, prExtend}, // Mn TIRHUTA VOWEL SIGN SHORT E + {0x114BB, 0x114BE, prExtend}, // Mc [4] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN AU + {0x114BF, 0x114C0, prExtend}, // Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA + {0x114C1, 0x114C1, prExtend}, // Mc TIRHUTA SIGN VISARGA + {0x114C2, 0x114C3, prExtend}, // Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA + {0x114C4, 0x114C5, prALetter}, // Lo [2] TIRHUTA SIGN AVAGRAHA..TIRHUTA GVANG + {0x114C7, 0x114C7, prALetter}, // Lo TIRHUTA OM + {0x114D0, 0x114D9, prNumeric}, // Nd [10] TIRHUTA DIGIT ZERO..TIRHUTA DIGIT NINE + {0x11580, 0x115AE, prALetter}, // Lo [47] SIDDHAM LETTER A..SIDDHAM LETTER HA + {0x115AF, 0x115B1, prExtend}, // Mc [3] SIDDHAM VOWEL SIGN AA..SIDDHAM VOWEL SIGN II + {0x115B2, 0x115B5, prExtend}, // Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR + {0x115B8, 0x115BB, prExtend}, // Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU + {0x115BC, 0x115BD, prExtend}, // Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA + {0x115BE, 0x115BE, prExtend}, // Mc SIDDHAM SIGN VISARGA + {0x115BF, 0x115C0, prExtend}, // Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA + {0x115D8, 0x115DB, prALetter}, // Lo [4] SIDDHAM LETTER THREE-CIRCLE ALTERNATE I..SIDDHAM LETTER ALTERNATE U + {0x115DC, 0x115DD, prExtend}, // Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU + {0x11600, 0x1162F, prALetter}, // Lo [48] MODI LETTER A..MODI LETTER LLA + {0x11630, 0x11632, prExtend}, // Mc [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II + {0x11633, 0x1163A, prExtend}, // Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI + {0x1163B, 0x1163C, prExtend}, // Mc [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU + {0x1163D, 0x1163D, prExtend}, // Mn MODI SIGN ANUSVARA + {0x1163E, 0x1163E, prExtend}, // Mc MODI SIGN VISARGA + {0x1163F, 0x11640, prExtend}, // Mn [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA + {0x11644, 0x11644, prALetter}, // Lo MODI SIGN HUVA + {0x11650, 0x11659, prNumeric}, // Nd [10] MODI DIGIT ZERO..MODI DIGIT NINE + {0x11680, 0x116AA, prALetter}, // Lo [43] TAKRI LETTER A..TAKRI LETTER RRA + {0x116AB, 0x116AB, prExtend}, // Mn TAKRI SIGN ANUSVARA + {0x116AC, 0x116AC, prExtend}, // Mc TAKRI SIGN VISARGA + {0x116AD, 0x116AD, prExtend}, // Mn TAKRI VOWEL SIGN AA + {0x116AE, 0x116AF, prExtend}, // Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II + {0x116B0, 0x116B5, prExtend}, // Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU + {0x116B6, 0x116B6, prExtend}, // Mc TAKRI SIGN VIRAMA + {0x116B7, 0x116B7, prExtend}, // Mn TAKRI SIGN NUKTA + {0x116B8, 0x116B8, prALetter}, // Lo TAKRI LETTER ARCHAIC KHA + {0x116C0, 0x116C9, prNumeric}, // Nd [10] TAKRI DIGIT ZERO..TAKRI DIGIT NINE + {0x1171D, 0x1171F, prExtend}, // Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA + {0x11720, 0x11721, prExtend}, // Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA + {0x11722, 0x11725, prExtend}, // Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU + {0x11726, 0x11726, prExtend}, // Mc AHOM VOWEL SIGN E + {0x11727, 0x1172B, prExtend}, // Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER + {0x11730, 0x11739, prNumeric}, // Nd [10] AHOM DIGIT ZERO..AHOM DIGIT NINE + {0x11800, 0x1182B, prALetter}, // Lo [44] DOGRA LETTER A..DOGRA LETTER RRA + {0x1182C, 0x1182E, prExtend}, // Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II + {0x1182F, 0x11837, prExtend}, // Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA + {0x11838, 0x11838, prExtend}, // Mc DOGRA SIGN VISARGA + {0x11839, 0x1183A, prExtend}, // Mn [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA + {0x118A0, 0x118DF, prALetter}, // L& [64] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI SMALL LETTER VIYO + {0x118E0, 0x118E9, prNumeric}, // Nd [10] WARANG CITI DIGIT ZERO..WARANG CITI DIGIT NINE + {0x118FF, 0x11906, prALetter}, // Lo [8] WARANG CITI OM..DIVES AKURU LETTER E + {0x11909, 0x11909, prALetter}, // Lo DIVES AKURU LETTER O + {0x1190C, 0x11913, prALetter}, // Lo [8] DIVES AKURU LETTER KA..DIVES AKURU LETTER JA + {0x11915, 0x11916, prALetter}, // Lo [2] DIVES AKURU LETTER NYA..DIVES AKURU LETTER TTA + {0x11918, 0x1192F, prALetter}, // Lo [24] DIVES AKURU LETTER DDA..DIVES AKURU LETTER ZA + {0x11930, 0x11935, prExtend}, // Mc [6] DIVES AKURU VOWEL SIGN AA..DIVES AKURU VOWEL SIGN E + {0x11937, 0x11938, prExtend}, // Mc [2] DIVES AKURU VOWEL SIGN AI..DIVES AKURU VOWEL SIGN O + {0x1193B, 0x1193C, prExtend}, // Mn [2] DIVES AKURU SIGN ANUSVARA..DIVES AKURU SIGN CANDRABINDU + {0x1193D, 0x1193D, prExtend}, // Mc DIVES AKURU SIGN HALANTA + {0x1193E, 0x1193E, prExtend}, // Mn DIVES AKURU VIRAMA + {0x1193F, 0x1193F, prALetter}, // Lo DIVES AKURU PREFIXED NASAL SIGN + {0x11940, 0x11940, prExtend}, // Mc DIVES AKURU MEDIAL YA + {0x11941, 0x11941, prALetter}, // Lo DIVES AKURU INITIAL RA + {0x11942, 0x11942, prExtend}, // Mc DIVES AKURU MEDIAL RA + {0x11943, 0x11943, prExtend}, // Mn DIVES AKURU SIGN NUKTA + {0x11950, 0x11959, prNumeric}, // Nd [10] DIVES AKURU DIGIT ZERO..DIVES AKURU DIGIT NINE + {0x119A0, 0x119A7, prALetter}, // Lo [8] NANDINAGARI LETTER A..NANDINAGARI LETTER VOCALIC RR + {0x119AA, 0x119D0, prALetter}, // Lo [39] NANDINAGARI LETTER E..NANDINAGARI LETTER RRA + {0x119D1, 0x119D3, prExtend}, // Mc [3] NANDINAGARI VOWEL SIGN AA..NANDINAGARI VOWEL SIGN II + {0x119D4, 0x119D7, prExtend}, // Mn [4] NANDINAGARI VOWEL SIGN U..NANDINAGARI VOWEL SIGN VOCALIC RR + {0x119DA, 0x119DB, prExtend}, // Mn [2] NANDINAGARI VOWEL SIGN E..NANDINAGARI VOWEL SIGN AI + {0x119DC, 0x119DF, prExtend}, // Mc [4] NANDINAGARI VOWEL SIGN O..NANDINAGARI SIGN VISARGA + {0x119E0, 0x119E0, prExtend}, // Mn NANDINAGARI SIGN VIRAMA + {0x119E1, 0x119E1, prALetter}, // Lo NANDINAGARI SIGN AVAGRAHA + {0x119E3, 0x119E3, prALetter}, // Lo NANDINAGARI HEADSTROKE + {0x119E4, 0x119E4, prExtend}, // Mc NANDINAGARI VOWEL SIGN PRISHTHAMATRA E + {0x11A00, 0x11A00, prALetter}, // Lo ZANABAZAR SQUARE LETTER A + {0x11A01, 0x11A0A, prExtend}, // Mn [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK + {0x11A0B, 0x11A32, prALetter}, // Lo [40] ZANABAZAR SQUARE LETTER KA..ZANABAZAR SQUARE LETTER KSSA + {0x11A33, 0x11A38, prExtend}, // Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA + {0x11A39, 0x11A39, prExtend}, // Mc ZANABAZAR SQUARE SIGN VISARGA + {0x11A3A, 0x11A3A, prALetter}, // Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA + {0x11A3B, 0x11A3E, prExtend}, // Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA + {0x11A47, 0x11A47, prExtend}, // Mn ZANABAZAR SQUARE SUBJOINER + {0x11A50, 0x11A50, prALetter}, // Lo SOYOMBO LETTER A + {0x11A51, 0x11A56, prExtend}, // Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE + {0x11A57, 0x11A58, prExtend}, // Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU + {0x11A59, 0x11A5B, prExtend}, // Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK + {0x11A5C, 0x11A89, prALetter}, // Lo [46] SOYOMBO LETTER KA..SOYOMBO CLUSTER-INITIAL LETTER SA + {0x11A8A, 0x11A96, prExtend}, // Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA + {0x11A97, 0x11A97, prExtend}, // Mc SOYOMBO SIGN VISARGA + {0x11A98, 0x11A99, prExtend}, // Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER + {0x11A9D, 0x11A9D, prALetter}, // Lo SOYOMBO MARK PLUTA + {0x11AB0, 0x11AF8, prALetter}, // Lo [73] CANADIAN SYLLABICS NATTILIK HI..PAU CIN HAU GLOTTAL STOP FINAL + {0x11C00, 0x11C08, prALetter}, // Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L + {0x11C0A, 0x11C2E, prALetter}, // Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA + {0x11C2F, 0x11C2F, prExtend}, // Mc BHAIKSUKI VOWEL SIGN AA + {0x11C30, 0x11C36, prExtend}, // Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L + {0x11C38, 0x11C3D, prExtend}, // Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA + {0x11C3E, 0x11C3E, prExtend}, // Mc BHAIKSUKI SIGN VISARGA + {0x11C3F, 0x11C3F, prExtend}, // Mn BHAIKSUKI SIGN VIRAMA + {0x11C40, 0x11C40, prALetter}, // Lo BHAIKSUKI SIGN AVAGRAHA + {0x11C50, 0x11C59, prNumeric}, // Nd [10] BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE + {0x11C72, 0x11C8F, prALetter}, // Lo [30] MARCHEN LETTER KA..MARCHEN LETTER A + {0x11C92, 0x11CA7, prExtend}, // Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA + {0x11CA9, 0x11CA9, prExtend}, // Mc MARCHEN SUBJOINED LETTER YA + {0x11CAA, 0x11CB0, prExtend}, // Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA + {0x11CB1, 0x11CB1, prExtend}, // Mc MARCHEN VOWEL SIGN I + {0x11CB2, 0x11CB3, prExtend}, // Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E + {0x11CB4, 0x11CB4, prExtend}, // Mc MARCHEN VOWEL SIGN O + {0x11CB5, 0x11CB6, prExtend}, // Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU + {0x11D00, 0x11D06, prALetter}, // Lo [7] MASARAM GONDI LETTER A..MASARAM GONDI LETTER E + {0x11D08, 0x11D09, prALetter}, // Lo [2] MASARAM GONDI LETTER AI..MASARAM GONDI LETTER O + {0x11D0B, 0x11D30, prALetter}, // Lo [38] MASARAM GONDI LETTER AU..MASARAM GONDI LETTER TRA + {0x11D31, 0x11D36, prExtend}, // Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R + {0x11D3A, 0x11D3A, prExtend}, // Mn MASARAM GONDI VOWEL SIGN E + {0x11D3C, 0x11D3D, prExtend}, // Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O + {0x11D3F, 0x11D45, prExtend}, // Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA + {0x11D46, 0x11D46, prALetter}, // Lo MASARAM GONDI REPHA + {0x11D47, 0x11D47, prExtend}, // Mn MASARAM GONDI RA-KARA + {0x11D50, 0x11D59, prNumeric}, // Nd [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE + {0x11D60, 0x11D65, prALetter}, // Lo [6] GUNJALA GONDI LETTER A..GUNJALA GONDI LETTER UU + {0x11D67, 0x11D68, prALetter}, // Lo [2] GUNJALA GONDI LETTER EE..GUNJALA GONDI LETTER AI + {0x11D6A, 0x11D89, prALetter}, // Lo [32] GUNJALA GONDI LETTER OO..GUNJALA GONDI LETTER SA + {0x11D8A, 0x11D8E, prExtend}, // Mc [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU + {0x11D90, 0x11D91, prExtend}, // Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI + {0x11D93, 0x11D94, prExtend}, // Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU + {0x11D95, 0x11D95, prExtend}, // Mn GUNJALA GONDI SIGN ANUSVARA + {0x11D96, 0x11D96, prExtend}, // Mc GUNJALA GONDI SIGN VISARGA + {0x11D97, 0x11D97, prExtend}, // Mn GUNJALA GONDI VIRAMA + {0x11D98, 0x11D98, prALetter}, // Lo GUNJALA GONDI OM + {0x11DA0, 0x11DA9, prNumeric}, // Nd [10] GUNJALA GONDI DIGIT ZERO..GUNJALA GONDI DIGIT NINE + {0x11EE0, 0x11EF2, prALetter}, // Lo [19] MAKASAR LETTER KA..MAKASAR ANGKA + {0x11EF3, 0x11EF4, prExtend}, // Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U + {0x11EF5, 0x11EF6, prExtend}, // Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O + {0x11FB0, 0x11FB0, prALetter}, // Lo LISU LETTER YHA + {0x12000, 0x12399, prALetter}, // Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U + {0x12400, 0x1246E, prALetter}, // Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM + {0x12480, 0x12543, prALetter}, // Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU + {0x12F90, 0x12FF0, prALetter}, // Lo [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114 + {0x13000, 0x1342E, prALetter}, // Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032 + {0x13430, 0x13438, prFormat}, // Cf [9] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END SEGMENT + {0x14400, 0x14646, prALetter}, // Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530 + {0x16800, 0x16A38, prALetter}, // Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ + {0x16A40, 0x16A5E, prALetter}, // Lo [31] MRO LETTER TA..MRO LETTER TEK + {0x16A60, 0x16A69, prNumeric}, // Nd [10] MRO DIGIT ZERO..MRO DIGIT NINE + {0x16A70, 0x16ABE, prALetter}, // Lo [79] TANGSA LETTER OZ..TANGSA LETTER ZA + {0x16AC0, 0x16AC9, prNumeric}, // Nd [10] TANGSA DIGIT ZERO..TANGSA DIGIT NINE + {0x16AD0, 0x16AED, prALetter}, // Lo [30] BASSA VAH LETTER ENNI..BASSA VAH LETTER I + {0x16AF0, 0x16AF4, prExtend}, // Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE + {0x16B00, 0x16B2F, prALetter}, // Lo [48] PAHAWH HMONG VOWEL KEEB..PAHAWH HMONG CONSONANT CAU + {0x16B30, 0x16B36, prExtend}, // Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM + {0x16B40, 0x16B43, prALetter}, // Lm [4] PAHAWH HMONG SIGN VOS SEEV..PAHAWH HMONG SIGN IB YAM + {0x16B50, 0x16B59, prNumeric}, // Nd [10] PAHAWH HMONG DIGIT ZERO..PAHAWH HMONG DIGIT NINE + {0x16B63, 0x16B77, prALetter}, // Lo [21] PAHAWH HMONG SIGN VOS LUB..PAHAWH HMONG SIGN CIM NRES TOS + {0x16B7D, 0x16B8F, prALetter}, // Lo [19] PAHAWH HMONG CLAN SIGN TSHEEJ..PAHAWH HMONG CLAN SIGN VWJ + {0x16E40, 0x16E7F, prALetter}, // L& [64] MEDEFAIDRIN CAPITAL LETTER M..MEDEFAIDRIN SMALL LETTER Y + {0x16F00, 0x16F4A, prALetter}, // Lo [75] MIAO LETTER PA..MIAO LETTER RTE + {0x16F4F, 0x16F4F, prExtend}, // Mn MIAO SIGN CONSONANT MODIFIER BAR + {0x16F50, 0x16F50, prALetter}, // Lo MIAO LETTER NASALIZATION + {0x16F51, 0x16F87, prExtend}, // Mc [55] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN UI + {0x16F8F, 0x16F92, prExtend}, // Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW + {0x16F93, 0x16F9F, prALetter}, // Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 + {0x16FE0, 0x16FE1, prALetter}, // Lm [2] TANGUT ITERATION MARK..NUSHU ITERATION MARK + {0x16FE3, 0x16FE3, prALetter}, // Lm OLD CHINESE ITERATION MARK + {0x16FE4, 0x16FE4, prExtend}, // Mn KHITAN SMALL SCRIPT FILLER + {0x16FF0, 0x16FF1, prExtend}, // Mc [2] VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY + {0x1AFF0, 0x1AFF3, prKatakana}, // Lm [4] KATAKANA LETTER MINNAN TONE-2..KATAKANA LETTER MINNAN TONE-5 + {0x1AFF5, 0x1AFFB, prKatakana}, // Lm [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5 + {0x1AFFD, 0x1AFFE, prKatakana}, // Lm [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8 + {0x1B000, 0x1B000, prKatakana}, // Lo KATAKANA LETTER ARCHAIC E + {0x1B120, 0x1B122, prKatakana}, // Lo [3] KATAKANA LETTER ARCHAIC YI..KATAKANA LETTER ARCHAIC WU + {0x1B164, 0x1B167, prKatakana}, // Lo [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N + {0x1BC00, 0x1BC6A, prALetter}, // Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M + {0x1BC70, 0x1BC7C, prALetter}, // Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK + {0x1BC80, 0x1BC88, prALetter}, // Lo [9] DUPLOYAN AFFIX HIGH ACUTE..DUPLOYAN AFFIX HIGH VERTICAL + {0x1BC90, 0x1BC99, prALetter}, // Lo [10] DUPLOYAN AFFIX LOW ACUTE..DUPLOYAN AFFIX LOW ARROW + {0x1BC9D, 0x1BC9E, prExtend}, // Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK + {0x1BCA0, 0x1BCA3, prFormat}, // Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP + {0x1CF00, 0x1CF2D, prExtend}, // Mn [46] ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON LEFT..ZNAMENNY COMBINING MARK KRYZH ON LEFT + {0x1CF30, 0x1CF46, prExtend}, // Mn [23] ZNAMENNY COMBINING TONAL RANGE MARK MRACHNO..ZNAMENNY PRIZNAK MODIFIER ROG + {0x1D165, 0x1D166, prExtend}, // Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM + {0x1D167, 0x1D169, prExtend}, // Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 + {0x1D16D, 0x1D172, prExtend}, // Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 + {0x1D173, 0x1D17A, prFormat}, // Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE + {0x1D17B, 0x1D182, prExtend}, // Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE + {0x1D185, 0x1D18B, prExtend}, // Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE + {0x1D1AA, 0x1D1AD, prExtend}, // Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO + {0x1D242, 0x1D244, prExtend}, // Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME + {0x1D400, 0x1D454, prALetter}, // L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G + {0x1D456, 0x1D49C, prALetter}, // L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A + {0x1D49E, 0x1D49F, prALetter}, // L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D + {0x1D4A2, 0x1D4A2, prALetter}, // L& MATHEMATICAL SCRIPT CAPITAL G + {0x1D4A5, 0x1D4A6, prALetter}, // L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K + {0x1D4A9, 0x1D4AC, prALetter}, // L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q + {0x1D4AE, 0x1D4B9, prALetter}, // L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D + {0x1D4BB, 0x1D4BB, prALetter}, // L& MATHEMATICAL SCRIPT SMALL F + {0x1D4BD, 0x1D4C3, prALetter}, // L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N + {0x1D4C5, 0x1D505, prALetter}, // L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B + {0x1D507, 0x1D50A, prALetter}, // L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G + {0x1D50D, 0x1D514, prALetter}, // L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q + {0x1D516, 0x1D51C, prALetter}, // L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y + {0x1D51E, 0x1D539, prALetter}, // L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B + {0x1D53B, 0x1D53E, prALetter}, // L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G + {0x1D540, 0x1D544, prALetter}, // L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M + {0x1D546, 0x1D546, prALetter}, // L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O + {0x1D54A, 0x1D550, prALetter}, // L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y + {0x1D552, 0x1D6A5, prALetter}, // L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J + {0x1D6A8, 0x1D6C0, prALetter}, // L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA + {0x1D6C2, 0x1D6DA, prALetter}, // L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA + {0x1D6DC, 0x1D6FA, prALetter}, // L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA + {0x1D6FC, 0x1D714, prALetter}, // L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA + {0x1D716, 0x1D734, prALetter}, // L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA + {0x1D736, 0x1D74E, prALetter}, // L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA + {0x1D750, 0x1D76E, prALetter}, // L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA + {0x1D770, 0x1D788, prALetter}, // L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA + {0x1D78A, 0x1D7A8, prALetter}, // L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA + {0x1D7AA, 0x1D7C2, prALetter}, // L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA + {0x1D7C4, 0x1D7CB, prALetter}, // L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA + {0x1D7CE, 0x1D7FF, prNumeric}, // Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE + {0x1DA00, 0x1DA36, prExtend}, // Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN + {0x1DA3B, 0x1DA6C, prExtend}, // Mn [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT + {0x1DA75, 0x1DA75, prExtend}, // Mn SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS + {0x1DA84, 0x1DA84, prExtend}, // Mn SIGNWRITING LOCATION HEAD NECK + {0x1DA9B, 0x1DA9F, prExtend}, // Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 + {0x1DAA1, 0x1DAAF, prExtend}, // Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 + {0x1DF00, 0x1DF09, prALetter}, // L& [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK + {0x1DF0A, 0x1DF0A, prALetter}, // Lo LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK + {0x1DF0B, 0x1DF1E, prALetter}, // L& [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL + {0x1E000, 0x1E006, prExtend}, // Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE + {0x1E008, 0x1E018, prExtend}, // Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU + {0x1E01B, 0x1E021, prExtend}, // Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI + {0x1E023, 0x1E024, prExtend}, // Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS + {0x1E026, 0x1E02A, prExtend}, // Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA + {0x1E100, 0x1E12C, prALetter}, // Lo [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W + {0x1E130, 0x1E136, prExtend}, // Mn [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D + {0x1E137, 0x1E13D, prALetter}, // Lm [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER + {0x1E140, 0x1E149, prNumeric}, // Nd [10] NYIAKENG PUACHUE HMONG DIGIT ZERO..NYIAKENG PUACHUE HMONG DIGIT NINE + {0x1E14E, 0x1E14E, prALetter}, // Lo NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ + {0x1E290, 0x1E2AD, prALetter}, // Lo [30] TOTO LETTER PA..TOTO LETTER A + {0x1E2AE, 0x1E2AE, prExtend}, // Mn TOTO SIGN RISING TONE + {0x1E2C0, 0x1E2EB, prALetter}, // Lo [44] WANCHO LETTER AA..WANCHO LETTER YIH + {0x1E2EC, 0x1E2EF, prExtend}, // Mn [4] WANCHO TONE TUP..WANCHO TONE KOINI + {0x1E2F0, 0x1E2F9, prNumeric}, // Nd [10] WANCHO DIGIT ZERO..WANCHO DIGIT NINE + {0x1E7E0, 0x1E7E6, prALetter}, // Lo [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO + {0x1E7E8, 0x1E7EB, prALetter}, // Lo [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE + {0x1E7ED, 0x1E7EE, prALetter}, // Lo [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE + {0x1E7F0, 0x1E7FE, prALetter}, // Lo [15] ETHIOPIC SYLLABLE GURAGE QWI..ETHIOPIC SYLLABLE GURAGE PWEE + {0x1E800, 0x1E8C4, prALetter}, // Lo [197] MENDE KIKAKUI SYLLABLE M001 KI..MENDE KIKAKUI SYLLABLE M060 NYON + {0x1E8D0, 0x1E8D6, prExtend}, // Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS + {0x1E900, 0x1E943, prALetter}, // L& [68] ADLAM CAPITAL LETTER ALIF..ADLAM SMALL LETTER SHA + {0x1E944, 0x1E94A, prExtend}, // Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA + {0x1E94B, 0x1E94B, prALetter}, // Lm ADLAM NASALIZATION MARK + {0x1E950, 0x1E959, prNumeric}, // Nd [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE + {0x1EE00, 0x1EE03, prALetter}, // Lo [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL + {0x1EE05, 0x1EE1F, prALetter}, // Lo [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF + {0x1EE21, 0x1EE22, prALetter}, // Lo [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM + {0x1EE24, 0x1EE24, prALetter}, // Lo ARABIC MATHEMATICAL INITIAL HEH + {0x1EE27, 0x1EE27, prALetter}, // Lo ARABIC MATHEMATICAL INITIAL HAH + {0x1EE29, 0x1EE32, prALetter}, // Lo [10] ARABIC MATHEMATICAL INITIAL YEH..ARABIC MATHEMATICAL INITIAL QAF + {0x1EE34, 0x1EE37, prALetter}, // Lo [4] ARABIC MATHEMATICAL INITIAL SHEEN..ARABIC MATHEMATICAL INITIAL KHAH + {0x1EE39, 0x1EE39, prALetter}, // Lo ARABIC MATHEMATICAL INITIAL DAD + {0x1EE3B, 0x1EE3B, prALetter}, // Lo ARABIC MATHEMATICAL INITIAL GHAIN + {0x1EE42, 0x1EE42, prALetter}, // Lo ARABIC MATHEMATICAL TAILED JEEM + {0x1EE47, 0x1EE47, prALetter}, // Lo ARABIC MATHEMATICAL TAILED HAH + {0x1EE49, 0x1EE49, prALetter}, // Lo ARABIC MATHEMATICAL TAILED YEH + {0x1EE4B, 0x1EE4B, prALetter}, // Lo ARABIC MATHEMATICAL TAILED LAM + {0x1EE4D, 0x1EE4F, prALetter}, // Lo [3] ARABIC MATHEMATICAL TAILED NOON..ARABIC MATHEMATICAL TAILED AIN + {0x1EE51, 0x1EE52, prALetter}, // Lo [2] ARABIC MATHEMATICAL TAILED SAD..ARABIC MATHEMATICAL TAILED QAF + {0x1EE54, 0x1EE54, prALetter}, // Lo ARABIC MATHEMATICAL TAILED SHEEN + {0x1EE57, 0x1EE57, prALetter}, // Lo ARABIC MATHEMATICAL TAILED KHAH + {0x1EE59, 0x1EE59, prALetter}, // Lo ARABIC MATHEMATICAL TAILED DAD + {0x1EE5B, 0x1EE5B, prALetter}, // Lo ARABIC MATHEMATICAL TAILED GHAIN + {0x1EE5D, 0x1EE5D, prALetter}, // Lo ARABIC MATHEMATICAL TAILED DOTLESS NOON + {0x1EE5F, 0x1EE5F, prALetter}, // Lo ARABIC MATHEMATICAL TAILED DOTLESS QAF + {0x1EE61, 0x1EE62, prALetter}, // Lo [2] ARABIC MATHEMATICAL STRETCHED BEH..ARABIC MATHEMATICAL STRETCHED JEEM + {0x1EE64, 0x1EE64, prALetter}, // Lo ARABIC MATHEMATICAL STRETCHED HEH + {0x1EE67, 0x1EE6A, prALetter}, // Lo [4] ARABIC MATHEMATICAL STRETCHED HAH..ARABIC MATHEMATICAL STRETCHED KAF + {0x1EE6C, 0x1EE72, prALetter}, // Lo [7] ARABIC MATHEMATICAL STRETCHED MEEM..ARABIC MATHEMATICAL STRETCHED QAF + {0x1EE74, 0x1EE77, prALetter}, // Lo [4] ARABIC MATHEMATICAL STRETCHED SHEEN..ARABIC MATHEMATICAL STRETCHED KHAH + {0x1EE79, 0x1EE7C, prALetter}, // Lo [4] ARABIC MATHEMATICAL STRETCHED DAD..ARABIC MATHEMATICAL STRETCHED DOTLESS BEH + {0x1EE7E, 0x1EE7E, prALetter}, // Lo ARABIC MATHEMATICAL STRETCHED DOTLESS FEH + {0x1EE80, 0x1EE89, prALetter}, // Lo [10] ARABIC MATHEMATICAL LOOPED ALEF..ARABIC MATHEMATICAL LOOPED YEH + {0x1EE8B, 0x1EE9B, prALetter}, // Lo [17] ARABIC MATHEMATICAL LOOPED LAM..ARABIC MATHEMATICAL LOOPED GHAIN + {0x1EEA1, 0x1EEA3, prALetter}, // Lo [3] ARABIC MATHEMATICAL DOUBLE-STRUCK BEH..ARABIC MATHEMATICAL DOUBLE-STRUCK DAL + {0x1EEA5, 0x1EEA9, prALetter}, // Lo [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH + {0x1EEAB, 0x1EEBB, prALetter}, // Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN + {0x1F000, 0x1F003, prExtendedPictographic}, // E0.0 [4] (🀀..đź€) MAHJONG TILE EAST WIND..MAHJONG TILE NORTH WIND + {0x1F004, 0x1F004, prExtendedPictographic}, // E0.6 [1] (🀄) mahjong red dragon + {0x1F005, 0x1F0CE, prExtendedPictographic}, // E0.0 [202] (🀅..đźŽ) MAHJONG TILE GREEN DRAGON..PLAYING CARD KING OF DIAMONDS + {0x1F0CF, 0x1F0CF, prExtendedPictographic}, // E0.6 [1] (đźŹ) joker + {0x1F0D0, 0x1F0FF, prExtendedPictographic}, // E0.0 [48] (đź..đźż) .. + {0x1F10D, 0x1F10F, prExtendedPictographic}, // E0.0 [3] (🄍..🄏) CIRCLED ZERO WITH SLASH..CIRCLED DOLLAR SIGN WITH OVERLAID BACKSLASH + {0x1F12F, 0x1F12F, prExtendedPictographic}, // E0.0 [1] (🄯) COPYLEFT SYMBOL + {0x1F130, 0x1F149, prALetter}, // So [26] SQUARED LATIN CAPITAL LETTER A..SQUARED LATIN CAPITAL LETTER Z + {0x1F150, 0x1F169, prALetter}, // So [26] NEGATIVE CIRCLED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z + {0x1F16C, 0x1F16F, prExtendedPictographic}, // E0.0 [4] (đź…¬..đź…Ż) RAISED MR SIGN..CIRCLED HUMAN FIGURE + {0x1F170, 0x1F189, prALetter}, // So [26] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER Z + {0x1F170, 0x1F171, prExtendedPictographic}, // E0.6 [2] (🅰️..🅱️) A button (blood type)..B button (blood type) + {0x1F17E, 0x1F17F, prExtendedPictographic}, // E0.6 [2] (🅾️..🅿️) O button (blood type)..P button + {0x1F18E, 0x1F18E, prExtendedPictographic}, // E0.6 [1] (🆎) AB button (blood type) + {0x1F191, 0x1F19A, prExtendedPictographic}, // E0.6 [10] (🆑..🆚) CL button..VS button + {0x1F1AD, 0x1F1E5, prExtendedPictographic}, // E0.0 [57] (🆭..🇥) MASK WORK SYMBOL.. + {0x1F1E6, 0x1F1FF, prRegionalIndicator}, // So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z + {0x1F201, 0x1F202, prExtendedPictographic}, // E0.6 [2] (đź..đź‚️) Japanese “here” button..Japanese “service charge” button + {0x1F203, 0x1F20F, prExtendedPictographic}, // E0.0 [13] (đź..đźŹ) .. + {0x1F21A, 0x1F21A, prExtendedPictographic}, // E0.6 [1] (đźš) Japanese “free of charge” button + {0x1F22F, 0x1F22F, prExtendedPictographic}, // E0.6 [1] (đźŻ) Japanese “reserved” button + {0x1F232, 0x1F23A, prExtendedPictographic}, // E0.6 [9] (đź˛..đźş) Japanese “prohibited” button..Japanese “open for business” button + {0x1F23C, 0x1F23F, prExtendedPictographic}, // E0.0 [4] (đźĽ..đźż) .. + {0x1F249, 0x1F24F, prExtendedPictographic}, // E0.0 [7] (🉉..🉏) .. + {0x1F250, 0x1F251, prExtendedPictographic}, // E0.6 [2] (đź‰..🉑) Japanese “bargain” button..Japanese “acceptable” button + {0x1F252, 0x1F2FF, prExtendedPictographic}, // E0.0 [174] (🉒..🋿) .. + {0x1F300, 0x1F30C, prExtendedPictographic}, // E0.6 [13] (🌀..🌌) cyclone..milky way + {0x1F30D, 0x1F30E, prExtendedPictographic}, // E0.7 [2] (🌍..🌎) globe showing Europe-Africa..globe showing Americas + {0x1F30F, 0x1F30F, prExtendedPictographic}, // E0.6 [1] (🌏) globe showing Asia-Australia + {0x1F310, 0x1F310, prExtendedPictographic}, // E1.0 [1] (đźŚ) globe with meridians + {0x1F311, 0x1F311, prExtendedPictographic}, // E0.6 [1] (🌑) new moon + {0x1F312, 0x1F312, prExtendedPictographic}, // E1.0 [1] (🌒) waxing crescent moon + {0x1F313, 0x1F315, prExtendedPictographic}, // E0.6 [3] (🌓..🌕) first quarter moon..full moon + {0x1F316, 0x1F318, prExtendedPictographic}, // E1.0 [3] (🌖..đźŚ) waning gibbous moon..waning crescent moon + {0x1F319, 0x1F319, prExtendedPictographic}, // E0.6 [1] (🌙) crescent moon + {0x1F31A, 0x1F31A, prExtendedPictographic}, // E1.0 [1] (🌚) new moon face + {0x1F31B, 0x1F31B, prExtendedPictographic}, // E0.6 [1] (🌛) first quarter moon face + {0x1F31C, 0x1F31C, prExtendedPictographic}, // E0.7 [1] (🌜) last quarter moon face + {0x1F31D, 0x1F31E, prExtendedPictographic}, // E1.0 [2] (🌝..🌞) full moon face..sun with face + {0x1F31F, 0x1F320, prExtendedPictographic}, // E0.6 [2] (🌟..🌠) glowing star..shooting star + {0x1F321, 0x1F321, prExtendedPictographic}, // E0.7 [1] (🌡️) thermometer + {0x1F322, 0x1F323, prExtendedPictographic}, // E0.0 [2] (🌢..🌣) BLACK DROPLET..WHITE SUN + {0x1F324, 0x1F32C, prExtendedPictographic}, // E0.7 [9] (🌤️..🌬️) sun behind small cloud..wind face + {0x1F32D, 0x1F32F, prExtendedPictographic}, // E1.0 [3] (🌭..🌯) hot dog..burrito + {0x1F330, 0x1F331, prExtendedPictographic}, // E0.6 [2] (🌰..🌱) chestnut..seedling + {0x1F332, 0x1F333, prExtendedPictographic}, // E1.0 [2] (🌲..🌳) evergreen tree..deciduous tree + {0x1F334, 0x1F335, prExtendedPictographic}, // E0.6 [2] (🌴..🌵) palm tree..cactus + {0x1F336, 0x1F336, prExtendedPictographic}, // E0.7 [1] (🌶️) hot pepper + {0x1F337, 0x1F34A, prExtendedPictographic}, // E0.6 [20] (🌷..🍊) tulip..tangerine + {0x1F34B, 0x1F34B, prExtendedPictographic}, // E1.0 [1] (🍋) lemon + {0x1F34C, 0x1F34F, prExtendedPictographic}, // E0.6 [4] (🍌..🍏) banana..green apple + {0x1F350, 0x1F350, prExtendedPictographic}, // E1.0 [1] (đźŤ) pear + {0x1F351, 0x1F37B, prExtendedPictographic}, // E0.6 [43] (🍑..🍻) peach..clinking beer mugs + {0x1F37C, 0x1F37C, prExtendedPictographic}, // E1.0 [1] (🍼) baby bottle + {0x1F37D, 0x1F37D, prExtendedPictographic}, // E0.7 [1] (🍽️) fork and knife with plate + {0x1F37E, 0x1F37F, prExtendedPictographic}, // E1.0 [2] (🍾..🍿) bottle with popping cork..popcorn + {0x1F380, 0x1F393, prExtendedPictographic}, // E0.6 [20] (🎀..🎓) ribbon..graduation cap + {0x1F394, 0x1F395, prExtendedPictographic}, // E0.0 [2] (🎔..🎕) HEART WITH TIP ON THE LEFT..BOUQUET OF FLOWERS + {0x1F396, 0x1F397, prExtendedPictographic}, // E0.7 [2] (🎖️..🎗️) military medal..reminder ribbon + {0x1F398, 0x1F398, prExtendedPictographic}, // E0.0 [1] (đźŽ) MUSICAL KEYBOARD WITH JACKS + {0x1F399, 0x1F39B, prExtendedPictographic}, // E0.7 [3] (🎙️..🎛️) studio microphone..control knobs + {0x1F39C, 0x1F39D, prExtendedPictographic}, // E0.0 [2] (🎜..🎝) BEAMED ASCENDING MUSICAL NOTES..BEAMED DESCENDING MUSICAL NOTES + {0x1F39E, 0x1F39F, prExtendedPictographic}, // E0.7 [2] (🎞️..🎟️) film frames..admission tickets + {0x1F3A0, 0x1F3C4, prExtendedPictographic}, // E0.6 [37] (🎠..🏄) carousel horse..person surfing + {0x1F3C5, 0x1F3C5, prExtendedPictographic}, // E1.0 [1] (🏅) sports medal + {0x1F3C6, 0x1F3C6, prExtendedPictographic}, // E0.6 [1] (🏆) trophy + {0x1F3C7, 0x1F3C7, prExtendedPictographic}, // E1.0 [1] (🏇) horse racing + {0x1F3C8, 0x1F3C8, prExtendedPictographic}, // E0.6 [1] (đźŹ) american football + {0x1F3C9, 0x1F3C9, prExtendedPictographic}, // E1.0 [1] (🏉) rugby football + {0x1F3CA, 0x1F3CA, prExtendedPictographic}, // E0.6 [1] (🏊) person swimming + {0x1F3CB, 0x1F3CE, prExtendedPictographic}, // E0.7 [4] (🏋️..🏎️) person lifting weights..racing car + {0x1F3CF, 0x1F3D3, prExtendedPictographic}, // E1.0 [5] (🏏..🏓) cricket game..ping pong + {0x1F3D4, 0x1F3DF, prExtendedPictographic}, // E0.7 [12] (🏔️..🏟️) snow-capped mountain..stadium + {0x1F3E0, 0x1F3E3, prExtendedPictographic}, // E0.6 [4] (🏠..🏣) house..Japanese post office + {0x1F3E4, 0x1F3E4, prExtendedPictographic}, // E1.0 [1] (🏤) post office + {0x1F3E5, 0x1F3F0, prExtendedPictographic}, // E0.6 [12] (🏥..🏰) hospital..castle + {0x1F3F1, 0x1F3F2, prExtendedPictographic}, // E0.0 [2] (🏱..🏲) WHITE PENNANT..BLACK PENNANT + {0x1F3F3, 0x1F3F3, prExtendedPictographic}, // E0.7 [1] (🏳️) white flag + {0x1F3F4, 0x1F3F4, prExtendedPictographic}, // E1.0 [1] (🏴) black flag + {0x1F3F5, 0x1F3F5, prExtendedPictographic}, // E0.7 [1] (🏵️) rosette + {0x1F3F6, 0x1F3F6, prExtendedPictographic}, // E0.0 [1] (🏶) BLACK ROSETTE + {0x1F3F7, 0x1F3F7, prExtendedPictographic}, // E0.7 [1] (🏷️) label + {0x1F3F8, 0x1F3FA, prExtendedPictographic}, // E1.0 [3] (🏸..🏺) badminton..amphora + {0x1F3FB, 0x1F3FF, prExtend}, // Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 + {0x1F400, 0x1F407, prExtendedPictographic}, // E1.0 [8] (đź€..đź‡) rat..rabbit + {0x1F408, 0x1F408, prExtendedPictographic}, // E0.7 [1] (đź) cat + {0x1F409, 0x1F40B, prExtendedPictographic}, // E1.0 [3] (đź‰..đź‹) dragon..whale + {0x1F40C, 0x1F40E, prExtendedPictographic}, // E0.6 [3] (đźŚ..đźŽ) snail..horse + {0x1F40F, 0x1F410, prExtendedPictographic}, // E1.0 [2] (đźŹ..đź) ram..goat + {0x1F411, 0x1F412, prExtendedPictographic}, // E0.6 [2] (đź‘..đź’) ewe..monkey + {0x1F413, 0x1F413, prExtendedPictographic}, // E1.0 [1] (đź“) rooster + {0x1F414, 0x1F414, prExtendedPictographic}, // E0.6 [1] (đź”) chicken + {0x1F415, 0x1F415, prExtendedPictographic}, // E0.7 [1] (đź•) dog + {0x1F416, 0x1F416, prExtendedPictographic}, // E1.0 [1] (đź–) pig + {0x1F417, 0x1F429, prExtendedPictographic}, // E0.6 [19] (đź—..đź©) boar..poodle + {0x1F42A, 0x1F42A, prExtendedPictographic}, // E1.0 [1] (đźŞ) camel + {0x1F42B, 0x1F43E, prExtendedPictographic}, // E0.6 [20] (đź«..đźľ) two-hump camel..paw prints + {0x1F43F, 0x1F43F, prExtendedPictographic}, // E0.7 [1] (đźżď¸Ź) chipmunk + {0x1F440, 0x1F440, prExtendedPictographic}, // E0.6 [1] (đź‘€) eyes + {0x1F441, 0x1F441, prExtendedPictographic}, // E0.7 [1] (đź‘️) eye + {0x1F442, 0x1F464, prExtendedPictographic}, // E0.6 [35] (đź‘‚..👤) ear..bust in silhouette + {0x1F465, 0x1F465, prExtendedPictographic}, // E1.0 [1] (👥) busts in silhouette + {0x1F466, 0x1F46B, prExtendedPictographic}, // E0.6 [6] (👦..đź‘«) boy..woman and man holding hands + {0x1F46C, 0x1F46D, prExtendedPictographic}, // E1.0 [2] (👬..đź‘­) men holding hands..women holding hands + {0x1F46E, 0x1F4AC, prExtendedPictographic}, // E0.6 [63] (đź‘®..đź’¬) police officer..speech balloon + {0x1F4AD, 0x1F4AD, prExtendedPictographic}, // E1.0 [1] (đź’­) thought balloon + {0x1F4AE, 0x1F4B5, prExtendedPictographic}, // E0.6 [8] (đź’®..đź’µ) white flower..dollar banknote + {0x1F4B6, 0x1F4B7, prExtendedPictographic}, // E1.0 [2] (đź’¶..đź’·) euro banknote..pound banknote + {0x1F4B8, 0x1F4EB, prExtendedPictographic}, // E0.6 [52] (đź’¸..đź“«) money with wings..closed mailbox with raised flag + {0x1F4EC, 0x1F4ED, prExtendedPictographic}, // E0.7 [2] (📬..đź“­) open mailbox with raised flag..open mailbox with lowered flag + {0x1F4EE, 0x1F4EE, prExtendedPictographic}, // E0.6 [1] (đź“®) postbox + {0x1F4EF, 0x1F4EF, prExtendedPictographic}, // E1.0 [1] (📯) postal horn + {0x1F4F0, 0x1F4F4, prExtendedPictographic}, // E0.6 [5] (đź“°..đź“´) newspaper..mobile phone off + {0x1F4F5, 0x1F4F5, prExtendedPictographic}, // E1.0 [1] (📵) no mobile phones + {0x1F4F6, 0x1F4F7, prExtendedPictographic}, // E0.6 [2] (đź“¶..đź“·) antenna bars..camera + {0x1F4F8, 0x1F4F8, prExtendedPictographic}, // E1.0 [1] (📸) camera with flash + {0x1F4F9, 0x1F4FC, prExtendedPictographic}, // E0.6 [4] (📹..📼) video camera..videocassette + {0x1F4FD, 0x1F4FD, prExtendedPictographic}, // E0.7 [1] (📽️) film projector + {0x1F4FE, 0x1F4FE, prExtendedPictographic}, // E0.0 [1] (📾) PORTABLE STEREO + {0x1F4FF, 0x1F502, prExtendedPictographic}, // E1.0 [4] (📿..🔂) prayer beads..repeat single button + {0x1F503, 0x1F503, prExtendedPictographic}, // E0.6 [1] (đź”) clockwise vertical arrows + {0x1F504, 0x1F507, prExtendedPictographic}, // E1.0 [4] (🔄..🔇) counterclockwise arrows button..muted speaker + {0x1F508, 0x1F508, prExtendedPictographic}, // E0.7 [1] (đź”) speaker low volume + {0x1F509, 0x1F509, prExtendedPictographic}, // E1.0 [1] (🔉) speaker medium volume + {0x1F50A, 0x1F514, prExtendedPictographic}, // E0.6 [11] (🔊..đź””) speaker high volume..bell + {0x1F515, 0x1F515, prExtendedPictographic}, // E1.0 [1] (🔕) bell with slash + {0x1F516, 0x1F52B, prExtendedPictographic}, // E0.6 [22] (đź”–..🔫) bookmark..water pistol + {0x1F52C, 0x1F52D, prExtendedPictographic}, // E1.0 [2] (🔬..đź”­) microscope..telescope + {0x1F52E, 0x1F53D, prExtendedPictographic}, // E0.6 [16] (đź”®..đź”˝) crystal ball..downwards button + {0x1F546, 0x1F548, prExtendedPictographic}, // E0.0 [3] (🕆..đź•) WHITE LATIN CROSS..CELTIC CROSS + {0x1F549, 0x1F54A, prExtendedPictographic}, // E0.7 [2] (🕉️..🕊️) om..dove + {0x1F54B, 0x1F54E, prExtendedPictographic}, // E1.0 [4] (đź•‹..🕎) kaaba..menorah + {0x1F54F, 0x1F54F, prExtendedPictographic}, // E0.0 [1] (🕏) BOWL OF HYGIEIA + {0x1F550, 0x1F55B, prExtendedPictographic}, // E0.6 [12] (đź•..đź•›) one o’clock..twelve o’clock + {0x1F55C, 0x1F567, prExtendedPictographic}, // E0.7 [12] (🕜..đź•§) one-thirty..twelve-thirty + {0x1F568, 0x1F56E, prExtendedPictographic}, // E0.0 [7] (🕨..đź•®) RIGHT SPEAKER..BOOK + {0x1F56F, 0x1F570, prExtendedPictographic}, // E0.7 [2] (🕯️..🕰️) candle..mantelpiece clock + {0x1F571, 0x1F572, prExtendedPictographic}, // E0.0 [2] (🕱..🕲) BLACK SKULL AND CROSSBONES..NO PIRACY + {0x1F573, 0x1F579, prExtendedPictographic}, // E0.7 [7] (🕳️..🕹️) hole..joystick + {0x1F57A, 0x1F57A, prExtendedPictographic}, // E3.0 [1] (🕺) man dancing + {0x1F57B, 0x1F586, prExtendedPictographic}, // E0.0 [12] (đź•»..đź–†) LEFT HAND TELEPHONE RECEIVER..PEN OVER STAMPED ENVELOPE + {0x1F587, 0x1F587, prExtendedPictographic}, // E0.7 [1] (🖇️) linked paperclips + {0x1F588, 0x1F589, prExtendedPictographic}, // E0.0 [2] (đź–..đź–‰) BLACK PUSHPIN..LOWER LEFT PENCIL + {0x1F58A, 0x1F58D, prExtendedPictographic}, // E0.7 [4] (🖊️..🖍️) pen..crayon + {0x1F58E, 0x1F58F, prExtendedPictographic}, // E0.0 [2] (đź–Ž..đź–Ź) LEFT WRITING HAND..TURNED OK HAND SIGN + {0x1F590, 0x1F590, prExtendedPictographic}, // E0.7 [1] (đź–️) hand with fingers splayed + {0x1F591, 0x1F594, prExtendedPictographic}, // E0.0 [4] (đź–‘..đź–”) REVERSED RAISED HAND WITH FINGERS SPLAYED..REVERSED VICTORY HAND + {0x1F595, 0x1F596, prExtendedPictographic}, // E1.0 [2] (đź–•..đź––) middle finger..vulcan salute + {0x1F597, 0x1F5A3, prExtendedPictographic}, // E0.0 [13] (đź–—..đź–Ł) WHITE DOWN POINTING LEFT HAND INDEX..BLACK DOWN POINTING BACKHAND INDEX + {0x1F5A4, 0x1F5A4, prExtendedPictographic}, // E3.0 [1] (đź–¤) black heart + {0x1F5A5, 0x1F5A5, prExtendedPictographic}, // E0.7 [1] (🖥️) desktop computer + {0x1F5A6, 0x1F5A7, prExtendedPictographic}, // E0.0 [2] (đź–¦..đź–§) KEYBOARD AND MOUSE..THREE NETWORKED COMPUTERS + {0x1F5A8, 0x1F5A8, prExtendedPictographic}, // E0.7 [1] (🖨️) printer + {0x1F5A9, 0x1F5B0, prExtendedPictographic}, // E0.0 [8] (đź–©..đź–°) POCKET CALCULATOR..TWO BUTTON MOUSE + {0x1F5B1, 0x1F5B2, prExtendedPictographic}, // E0.7 [2] (🖱️..🖲️) computer mouse..trackball + {0x1F5B3, 0x1F5BB, prExtendedPictographic}, // E0.0 [9] (đź–ł..đź–») OLD PERSONAL COMPUTER..DOCUMENT WITH PICTURE + {0x1F5BC, 0x1F5BC, prExtendedPictographic}, // E0.7 [1] (🖼️) framed picture + {0x1F5BD, 0x1F5C1, prExtendedPictographic}, // E0.0 [5] (đź–˝..đź—) FRAME WITH TILES..OPEN FOLDER + {0x1F5C2, 0x1F5C4, prExtendedPictographic}, // E0.7 [3] (🗂️..🗄️) card index dividers..file cabinet + {0x1F5C5, 0x1F5D0, prExtendedPictographic}, // E0.0 [12] (đź—…..đź—) EMPTY NOTE..PAGES + {0x1F5D1, 0x1F5D3, prExtendedPictographic}, // E0.7 [3] (🗑️..🗓️) wastebasket..spiral calendar + {0x1F5D4, 0x1F5DB, prExtendedPictographic}, // E0.0 [8] (đź—”..đź—›) DESKTOP WINDOW..DECREASE FONT SIZE SYMBOL + {0x1F5DC, 0x1F5DE, prExtendedPictographic}, // E0.7 [3] (🗜️..🗞️) clamp..rolled-up newspaper + {0x1F5DF, 0x1F5E0, prExtendedPictographic}, // E0.0 [2] (đź—ź..đź— ) PAGE WITH CIRCLED TEXT..STOCK CHART + {0x1F5E1, 0x1F5E1, prExtendedPictographic}, // E0.7 [1] (🗡️) dagger + {0x1F5E2, 0x1F5E2, prExtendedPictographic}, // E0.0 [1] (đź—˘) LIPS + {0x1F5E3, 0x1F5E3, prExtendedPictographic}, // E0.7 [1] (🗣️) speaking head + {0x1F5E4, 0x1F5E7, prExtendedPictographic}, // E0.0 [4] (đź—¤..đź—§) THREE RAYS ABOVE..THREE RAYS RIGHT + {0x1F5E8, 0x1F5E8, prExtendedPictographic}, // E2.0 [1] (🗨️) left speech bubble + {0x1F5E9, 0x1F5EE, prExtendedPictographic}, // E0.0 [6] (đź—©..đź—®) RIGHT SPEECH BUBBLE..LEFT ANGER BUBBLE + {0x1F5EF, 0x1F5EF, prExtendedPictographic}, // E0.7 [1] (🗯️) right anger bubble + {0x1F5F0, 0x1F5F2, prExtendedPictographic}, // E0.0 [3] (đź—°..đź—˛) MOOD BUBBLE..LIGHTNING MOOD + {0x1F5F3, 0x1F5F3, prExtendedPictographic}, // E0.7 [1] (🗳️) ballot box with ballot + {0x1F5F4, 0x1F5F9, prExtendedPictographic}, // E0.0 [6] (đź—´..đź—ą) BALLOT SCRIPT X..BALLOT BOX WITH BOLD CHECK + {0x1F5FA, 0x1F5FA, prExtendedPictographic}, // E0.7 [1] (🗺️) world map + {0x1F5FB, 0x1F5FF, prExtendedPictographic}, // E0.6 [5] (đź—»..đź—ż) mount fuji..moai + {0x1F600, 0x1F600, prExtendedPictographic}, // E1.0 [1] (đź€) grinning face + {0x1F601, 0x1F606, prExtendedPictographic}, // E0.6 [6] (đź..đź†) beaming face with smiling eyes..grinning squinting face + {0x1F607, 0x1F608, prExtendedPictographic}, // E1.0 [2] (đź‡..đź) smiling face with halo..smiling face with horns + {0x1F609, 0x1F60D, prExtendedPictographic}, // E0.6 [5] (đź‰..đźŤ) winking face..smiling face with heart-eyes + {0x1F60E, 0x1F60E, prExtendedPictographic}, // E1.0 [1] (đźŽ) smiling face with sunglasses + {0x1F60F, 0x1F60F, prExtendedPictographic}, // E0.6 [1] (đźŹ) smirking face + {0x1F610, 0x1F610, prExtendedPictographic}, // E0.7 [1] (đź) neutral face + {0x1F611, 0x1F611, prExtendedPictographic}, // E1.0 [1] (đź‘) expressionless face + {0x1F612, 0x1F614, prExtendedPictographic}, // E0.6 [3] (đź’..đź”) unamused face..pensive face + {0x1F615, 0x1F615, prExtendedPictographic}, // E1.0 [1] (đź•) confused face + {0x1F616, 0x1F616, prExtendedPictographic}, // E0.6 [1] (đź–) confounded face + {0x1F617, 0x1F617, prExtendedPictographic}, // E1.0 [1] (đź—) kissing face + {0x1F618, 0x1F618, prExtendedPictographic}, // E0.6 [1] (đź) face blowing a kiss + {0x1F619, 0x1F619, prExtendedPictographic}, // E1.0 [1] (đź™) kissing face with smiling eyes + {0x1F61A, 0x1F61A, prExtendedPictographic}, // E0.6 [1] (đźš) kissing face with closed eyes + {0x1F61B, 0x1F61B, prExtendedPictographic}, // E1.0 [1] (đź›) face with tongue + {0x1F61C, 0x1F61E, prExtendedPictographic}, // E0.6 [3] (đźś..đźž) winking face with tongue..disappointed face + {0x1F61F, 0x1F61F, prExtendedPictographic}, // E1.0 [1] (đźź) worried face + {0x1F620, 0x1F625, prExtendedPictographic}, // E0.6 [6] (đź ..đźĄ) angry face..sad but relieved face + {0x1F626, 0x1F627, prExtendedPictographic}, // E1.0 [2] (đź¦..đź§) frowning face with open mouth..anguished face + {0x1F628, 0x1F62B, prExtendedPictographic}, // E0.6 [4] (đź¨..đź«) fearful face..tired face + {0x1F62C, 0x1F62C, prExtendedPictographic}, // E1.0 [1] (đź¬) grimacing face + {0x1F62D, 0x1F62D, prExtendedPictographic}, // E0.6 [1] (đź­) loudly crying face + {0x1F62E, 0x1F62F, prExtendedPictographic}, // E1.0 [2] (đź®..đźŻ) face with open mouth..hushed face + {0x1F630, 0x1F633, prExtendedPictographic}, // E0.6 [4] (đź°..đźł) anxious face with sweat..flushed face + {0x1F634, 0x1F634, prExtendedPictographic}, // E1.0 [1] (đź´) sleeping face + {0x1F635, 0x1F635, prExtendedPictographic}, // E0.6 [1] (đźµ) face with crossed-out eyes + {0x1F636, 0x1F636, prExtendedPictographic}, // E1.0 [1] (đź¶) face without mouth + {0x1F637, 0x1F640, prExtendedPictographic}, // E0.6 [10] (đź·..🙀) face with medical mask..weary cat + {0x1F641, 0x1F644, prExtendedPictographic}, // E1.0 [4] (đź™..🙄) slightly frowning face..face with rolling eyes + {0x1F645, 0x1F64F, prExtendedPictographic}, // E0.6 [11] (đź™…..🙏) person gesturing NO..folded hands + {0x1F680, 0x1F680, prExtendedPictographic}, // E0.6 [1] (🚀) rocket + {0x1F681, 0x1F682, prExtendedPictographic}, // E1.0 [2] (đźš..đźš‚) helicopter..locomotive + {0x1F683, 0x1F685, prExtendedPictographic}, // E0.6 [3] (đźš..đźš…) railway car..bullet train + {0x1F686, 0x1F686, prExtendedPictographic}, // E1.0 [1] (🚆) train + {0x1F687, 0x1F687, prExtendedPictographic}, // E0.6 [1] (🚇) metro + {0x1F688, 0x1F688, prExtendedPictographic}, // E1.0 [1] (đźš) light rail + {0x1F689, 0x1F689, prExtendedPictographic}, // E0.6 [1] (🚉) station + {0x1F68A, 0x1F68B, prExtendedPictographic}, // E1.0 [2] (🚊..đźš‹) tram..tram car + {0x1F68C, 0x1F68C, prExtendedPictographic}, // E0.6 [1] (🚌) bus + {0x1F68D, 0x1F68D, prExtendedPictographic}, // E0.7 [1] (🚍) oncoming bus + {0x1F68E, 0x1F68E, prExtendedPictographic}, // E1.0 [1] (🚎) trolleybus + {0x1F68F, 0x1F68F, prExtendedPictographic}, // E0.6 [1] (🚏) bus stop + {0x1F690, 0x1F690, prExtendedPictographic}, // E1.0 [1] (đźš) minibus + {0x1F691, 0x1F693, prExtendedPictographic}, // E0.6 [3] (đźš‘..đźš“) ambulance..police car + {0x1F694, 0x1F694, prExtendedPictographic}, // E0.7 [1] (đźš”) oncoming police car + {0x1F695, 0x1F695, prExtendedPictographic}, // E0.6 [1] (đźš•) taxi + {0x1F696, 0x1F696, prExtendedPictographic}, // E1.0 [1] (đźš–) oncoming taxi + {0x1F697, 0x1F697, prExtendedPictographic}, // E0.6 [1] (đźš—) automobile + {0x1F698, 0x1F698, prExtendedPictographic}, // E0.7 [1] (đźš) oncoming automobile + {0x1F699, 0x1F69A, prExtendedPictographic}, // E0.6 [2] (đźš™..đźšš) sport utility vehicle..delivery truck + {0x1F69B, 0x1F6A1, prExtendedPictographic}, // E1.0 [7] (đźš›..🚡) articulated lorry..aerial tramway + {0x1F6A2, 0x1F6A2, prExtendedPictographic}, // E0.6 [1] (🚢) ship + {0x1F6A3, 0x1F6A3, prExtendedPictographic}, // E1.0 [1] (🚣) person rowing boat + {0x1F6A4, 0x1F6A5, prExtendedPictographic}, // E0.6 [2] (🚤..🚥) speedboat..horizontal traffic light + {0x1F6A6, 0x1F6A6, prExtendedPictographic}, // E1.0 [1] (🚦) vertical traffic light + {0x1F6A7, 0x1F6AD, prExtendedPictographic}, // E0.6 [7] (đźš§..đźš­) construction..no smoking + {0x1F6AE, 0x1F6B1, prExtendedPictographic}, // E1.0 [4] (đźš®..đźš±) litter in bin sign..non-potable water + {0x1F6B2, 0x1F6B2, prExtendedPictographic}, // E0.6 [1] (🚲) bicycle + {0x1F6B3, 0x1F6B5, prExtendedPictographic}, // E1.0 [3] (đźšł..đźšµ) no bicycles..person mountain biking + {0x1F6B6, 0x1F6B6, prExtendedPictographic}, // E0.6 [1] (đźš¶) person walking + {0x1F6B7, 0x1F6B8, prExtendedPictographic}, // E1.0 [2] (đźš·..🚸) no pedestrians..children crossing + {0x1F6B9, 0x1F6BE, prExtendedPictographic}, // E0.6 [6] (đźšą..đźšľ) men’s room..water closet + {0x1F6BF, 0x1F6BF, prExtendedPictographic}, // E1.0 [1] (đźšż) shower + {0x1F6C0, 0x1F6C0, prExtendedPictographic}, // E0.6 [1] (🛀) person taking bath + {0x1F6C1, 0x1F6C5, prExtendedPictographic}, // E1.0 [5] (đź›..đź›…) bathtub..left luggage + {0x1F6C6, 0x1F6CA, prExtendedPictographic}, // E0.0 [5] (🛆..🛊) TRIANGLE WITH ROUNDED CORNERS..GIRLS SYMBOL + {0x1F6CB, 0x1F6CB, prExtendedPictographic}, // E0.7 [1] (🛋️) couch and lamp + {0x1F6CC, 0x1F6CC, prExtendedPictographic}, // E1.0 [1] (🛌) person in bed + {0x1F6CD, 0x1F6CF, prExtendedPictographic}, // E0.7 [3] (🛍️..🛏️) shopping bags..bed + {0x1F6D0, 0x1F6D0, prExtendedPictographic}, // E1.0 [1] (đź›) place of worship + {0x1F6D1, 0x1F6D2, prExtendedPictographic}, // E3.0 [2] (🛑..đź›’) stop sign..shopping cart + {0x1F6D3, 0x1F6D4, prExtendedPictographic}, // E0.0 [2] (🛓..đź›”) STUPA..PAGODA + {0x1F6D5, 0x1F6D5, prExtendedPictographic}, // E12.0 [1] (🛕) hindu temple + {0x1F6D6, 0x1F6D7, prExtendedPictographic}, // E13.0 [2] (đź›–..đź›—) hut..elevator + {0x1F6D8, 0x1F6DC, prExtendedPictographic}, // E0.0 [5] (đź›..🛜) .. + {0x1F6DD, 0x1F6DF, prExtendedPictographic}, // E14.0 [3] (🛝..🛟) playground slide..ring buoy + {0x1F6E0, 0x1F6E5, prExtendedPictographic}, // E0.7 [6] (🛠️..🛥️) hammer and wrench..motor boat + {0x1F6E6, 0x1F6E8, prExtendedPictographic}, // E0.0 [3] (🛦..🛨) UP-POINTING MILITARY AIRPLANE..UP-POINTING SMALL AIRPLANE + {0x1F6E9, 0x1F6E9, prExtendedPictographic}, // E0.7 [1] (🛩️) small airplane + {0x1F6EA, 0x1F6EA, prExtendedPictographic}, // E0.0 [1] (🛪) NORTHEAST-POINTING AIRPLANE + {0x1F6EB, 0x1F6EC, prExtendedPictographic}, // E1.0 [2] (🛫..🛬) airplane departure..airplane arrival + {0x1F6ED, 0x1F6EF, prExtendedPictographic}, // E0.0 [3] (đź›­..🛯) .. + {0x1F6F0, 0x1F6F0, prExtendedPictographic}, // E0.7 [1] (🛰️) satellite + {0x1F6F1, 0x1F6F2, prExtendedPictographic}, // E0.0 [2] (đź›±..🛲) ONCOMING FIRE ENGINE..DIESEL LOCOMOTIVE + {0x1F6F3, 0x1F6F3, prExtendedPictographic}, // E0.7 [1] (🛳️) passenger ship + {0x1F6F4, 0x1F6F6, prExtendedPictographic}, // E3.0 [3] (đź›´..đź›¶) kick scooter..canoe + {0x1F6F7, 0x1F6F8, prExtendedPictographic}, // E5.0 [2] (đź›·..🛸) sled..flying saucer + {0x1F6F9, 0x1F6F9, prExtendedPictographic}, // E11.0 [1] (🛹) skateboard + {0x1F6FA, 0x1F6FA, prExtendedPictographic}, // E12.0 [1] (🛺) auto rickshaw + {0x1F6FB, 0x1F6FC, prExtendedPictographic}, // E13.0 [2] (đź›»..🛼) pickup truck..roller skate + {0x1F6FD, 0x1F6FF, prExtendedPictographic}, // E0.0 [3] (đź›˝..🛿) .. + {0x1F774, 0x1F77F, prExtendedPictographic}, // E0.0 [12] (đźť´..đźťż) .. + {0x1F7D5, 0x1F7DF, prExtendedPictographic}, // E0.0 [11] (đźź•..đźźź) CIRCLED TRIANGLE.. + {0x1F7E0, 0x1F7EB, prExtendedPictographic}, // E12.0 [12] (đźź ..đźź«) orange circle..brown square + {0x1F7EC, 0x1F7EF, prExtendedPictographic}, // E0.0 [4] (🟬..🟯) .. + {0x1F7F0, 0x1F7F0, prExtendedPictographic}, // E14.0 [1] (đźź°) heavy equals sign + {0x1F7F1, 0x1F7FF, prExtendedPictographic}, // E0.0 [15] (đźź±..đźźż) .. + {0x1F80C, 0x1F80F, prExtendedPictographic}, // E0.0 [4] (đź Ś..đź Ź) .. + {0x1F848, 0x1F84F, prExtendedPictographic}, // E0.0 [8] (đźˇ..🡏) .. + {0x1F85A, 0x1F85F, prExtendedPictographic}, // E0.0 [6] (🡚..🡟) .. + {0x1F888, 0x1F88F, prExtendedPictographic}, // E0.0 [8] (đź˘..🢏) .. + {0x1F8AE, 0x1F8FF, prExtendedPictographic}, // E0.0 [82] (🢮..🣿) .. + {0x1F90C, 0x1F90C, prExtendedPictographic}, // E13.0 [1] (🤌) pinched fingers + {0x1F90D, 0x1F90F, prExtendedPictographic}, // E12.0 [3] (🤍..🤏) white heart..pinching hand + {0x1F910, 0x1F918, prExtendedPictographic}, // E1.0 [9] (đź¤..đź¤) zipper-mouth face..sign of the horns + {0x1F919, 0x1F91E, prExtendedPictographic}, // E3.0 [6] (🤙..🤞) call me hand..crossed fingers + {0x1F91F, 0x1F91F, prExtendedPictographic}, // E5.0 [1] (🤟) love-you gesture + {0x1F920, 0x1F927, prExtendedPictographic}, // E3.0 [8] (🤠..🤧) cowboy hat face..sneezing face + {0x1F928, 0x1F92F, prExtendedPictographic}, // E5.0 [8] (🤨..🤯) face with raised eyebrow..exploding head + {0x1F930, 0x1F930, prExtendedPictographic}, // E3.0 [1] (🤰) pregnant woman + {0x1F931, 0x1F932, prExtendedPictographic}, // E5.0 [2] (🤱..🤲) breast-feeding..palms up together + {0x1F933, 0x1F93A, prExtendedPictographic}, // E3.0 [8] (🤳..🤺) selfie..person fencing + {0x1F93C, 0x1F93E, prExtendedPictographic}, // E3.0 [3] (🤼..🤾) people wrestling..person playing handball + {0x1F93F, 0x1F93F, prExtendedPictographic}, // E12.0 [1] (🤿) diving mask + {0x1F940, 0x1F945, prExtendedPictographic}, // E3.0 [6] (🥀..🥅) wilted flower..goal net + {0x1F947, 0x1F94B, prExtendedPictographic}, // E3.0 [5] (🥇..🥋) 1st place medal..martial arts uniform + {0x1F94C, 0x1F94C, prExtendedPictographic}, // E5.0 [1] (🥌) curling stone + {0x1F94D, 0x1F94F, prExtendedPictographic}, // E11.0 [3] (🥍..🥏) lacrosse..flying disc + {0x1F950, 0x1F95E, prExtendedPictographic}, // E3.0 [15] (đźĄ..🥞) croissant..pancakes + {0x1F95F, 0x1F96B, prExtendedPictographic}, // E5.0 [13] (🥟..🥫) dumpling..canned food + {0x1F96C, 0x1F970, prExtendedPictographic}, // E11.0 [5] (🥬..🥰) leafy green..smiling face with hearts + {0x1F971, 0x1F971, prExtendedPictographic}, // E12.0 [1] (🥱) yawning face + {0x1F972, 0x1F972, prExtendedPictographic}, // E13.0 [1] (🥲) smiling face with tear + {0x1F973, 0x1F976, prExtendedPictographic}, // E11.0 [4] (🥳..🥶) partying face..cold face + {0x1F977, 0x1F978, prExtendedPictographic}, // E13.0 [2] (🥷..🥸) ninja..disguised face + {0x1F979, 0x1F979, prExtendedPictographic}, // E14.0 [1] (🥹) face holding back tears + {0x1F97A, 0x1F97A, prExtendedPictographic}, // E11.0 [1] (🥺) pleading face + {0x1F97B, 0x1F97B, prExtendedPictographic}, // E12.0 [1] (🥻) sari + {0x1F97C, 0x1F97F, prExtendedPictographic}, // E11.0 [4] (🥼..🥿) lab coat..flat shoe + {0x1F980, 0x1F984, prExtendedPictographic}, // E1.0 [5] (🦀..🦄) crab..unicorn + {0x1F985, 0x1F991, prExtendedPictographic}, // E3.0 [13] (🦅..🦑) eagle..squid + {0x1F992, 0x1F997, prExtendedPictographic}, // E5.0 [6] (🦒..🦗) giraffe..cricket + {0x1F998, 0x1F9A2, prExtendedPictographic}, // E11.0 [11] (đź¦..🦢) kangaroo..swan + {0x1F9A3, 0x1F9A4, prExtendedPictographic}, // E13.0 [2] (🦣..🦤) mammoth..dodo + {0x1F9A5, 0x1F9AA, prExtendedPictographic}, // E12.0 [6] (🦥..🦪) sloth..oyster + {0x1F9AB, 0x1F9AD, prExtendedPictographic}, // E13.0 [3] (🦫..🦭) beaver..seal + {0x1F9AE, 0x1F9AF, prExtendedPictographic}, // E12.0 [2] (🦮..🦯) guide dog..white cane + {0x1F9B0, 0x1F9B9, prExtendedPictographic}, // E11.0 [10] (🦰..🦹) red hair..supervillain + {0x1F9BA, 0x1F9BF, prExtendedPictographic}, // E12.0 [6] (🦺..🦿) safety vest..mechanical leg + {0x1F9C0, 0x1F9C0, prExtendedPictographic}, // E1.0 [1] (đź§€) cheese wedge + {0x1F9C1, 0x1F9C2, prExtendedPictographic}, // E11.0 [2] (đź§..đź§‚) cupcake..salt + {0x1F9C3, 0x1F9CA, prExtendedPictographic}, // E12.0 [8] (đź§..đź§Š) beverage box..ice + {0x1F9CB, 0x1F9CB, prExtendedPictographic}, // E13.0 [1] (đź§‹) bubble tea + {0x1F9CC, 0x1F9CC, prExtendedPictographic}, // E14.0 [1] (đź§Ś) troll + {0x1F9CD, 0x1F9CF, prExtendedPictographic}, // E12.0 [3] (đź§Ť..đź§Ź) person standing..deaf person + {0x1F9D0, 0x1F9E6, prExtendedPictographic}, // E5.0 [23] (đź§..🧦) face with monocle..socks + {0x1F9E7, 0x1F9FF, prExtendedPictographic}, // E11.0 [25] (đź§§..đź§ż) red envelope..nazar amulet + {0x1FA00, 0x1FA6F, prExtendedPictographic}, // E0.0 [112] (🨀..🩯) NEUTRAL CHESS KING.. + {0x1FA70, 0x1FA73, prExtendedPictographic}, // E12.0 [4] (đź©°..🩳) ballet shoes..shorts + {0x1FA74, 0x1FA74, prExtendedPictographic}, // E13.0 [1] (đź©´) thong sandal + {0x1FA75, 0x1FA77, prExtendedPictographic}, // E0.0 [3] (🩵..đź©·) .. + {0x1FA78, 0x1FA7A, prExtendedPictographic}, // E12.0 [3] (🩸..🩺) drop of blood..stethoscope + {0x1FA7B, 0x1FA7C, prExtendedPictographic}, // E14.0 [2] (đź©»..🩼) x-ray..crutch + {0x1FA7D, 0x1FA7F, prExtendedPictographic}, // E0.0 [3] (đź©˝..🩿) .. + {0x1FA80, 0x1FA82, prExtendedPictographic}, // E12.0 [3] (🪀..🪂) yo-yo..parachute + {0x1FA83, 0x1FA86, prExtendedPictographic}, // E13.0 [4] (đźŞ..🪆) boomerang..nesting dolls + {0x1FA87, 0x1FA8F, prExtendedPictographic}, // E0.0 [9] (🪇..🪏) .. + {0x1FA90, 0x1FA95, prExtendedPictographic}, // E12.0 [6] (đźŞ..🪕) ringed planet..banjo + {0x1FA96, 0x1FAA8, prExtendedPictographic}, // E13.0 [19] (🪖..🪨) military helmet..rock + {0x1FAA9, 0x1FAAC, prExtendedPictographic}, // E14.0 [4] (🪩..🪬) mirror ball..hamsa + {0x1FAAD, 0x1FAAF, prExtendedPictographic}, // E0.0 [3] (🪭..🪯) .. + {0x1FAB0, 0x1FAB6, prExtendedPictographic}, // E13.0 [7] (🪰..🪶) fly..feather + {0x1FAB7, 0x1FABA, prExtendedPictographic}, // E14.0 [4] (🪷..🪺) lotus..nest with eggs + {0x1FABB, 0x1FABF, prExtendedPictographic}, // E0.0 [5] (🪻..🪿) .. + {0x1FAC0, 0x1FAC2, prExtendedPictographic}, // E13.0 [3] (đź«€..đź«‚) anatomical heart..people hugging + {0x1FAC3, 0x1FAC5, prExtendedPictographic}, // E14.0 [3] (đź«..đź«…) pregnant man..person with crown + {0x1FAC6, 0x1FACF, prExtendedPictographic}, // E0.0 [10] (🫆..🫏) .. + {0x1FAD0, 0x1FAD6, prExtendedPictographic}, // E13.0 [7] (đź«..đź«–) blueberries..teapot + {0x1FAD7, 0x1FAD9, prExtendedPictographic}, // E14.0 [3] (đź«—..đź«™) pouring liquid..jar + {0x1FADA, 0x1FADF, prExtendedPictographic}, // E0.0 [6] (🫚..🫟) .. + {0x1FAE0, 0x1FAE7, prExtendedPictographic}, // E14.0 [8] (đź« ..đź«§) melting face..bubbles + {0x1FAE8, 0x1FAEF, prExtendedPictographic}, // E0.0 [8] (🫨..🫯) .. + {0x1FAF0, 0x1FAF6, prExtendedPictographic}, // E14.0 [7] (đź«°..đź«¶) hand with index finger and thumb crossed..heart hands + {0x1FAF7, 0x1FAFF, prExtendedPictographic}, // E0.0 [9] (đź«·..🫿) .. + {0x1FBF0, 0x1FBF9, prNumeric}, // Nd [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE + {0x1FC00, 0x1FFFD, prExtendedPictographic}, // E0.0[1022] (đź°€..đźż˝) .. + {0xE0001, 0xE0001, prFormat}, // Cf LANGUAGE TAG + {0xE0020, 0xE007F, prExtend}, // Cf [96] TAG SPACE..CANCEL TAG + {0xE0100, 0xE01EF, prExtend}, // Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 +} diff --git a/vendor/github.com/rivo/uniseg/wordrules.go b/vendor/github.com/rivo/uniseg/wordrules.go new file mode 100644 index 000000000..325407e40 --- /dev/null +++ b/vendor/github.com/rivo/uniseg/wordrules.go @@ -0,0 +1,246 @@ +package uniseg + +import "unicode/utf8" + +// The states of the word break parser. +const ( + wbAny = iota + wbCR + wbLF + wbNewline + wbWSegSpace + wbHebrewLetter + wbALetter + wbWB7 + wbWB7c + wbNumeric + wbWB11 + wbKatakana + wbExtendNumLet + wbOddRI + wbEvenRI + wbZWJBit = 16 // This bit is set for any states followed by at least one zero-width joiner (see WB4 and WB3c). +) + +// The word break parser's breaking instructions. +const ( + wbDontBreak = iota + wbBreak +) + +// The word break parser's state transitions. It's anologous to grTransitions, +// see comments there for details. Unicode version 14.0.0. +var wbTransitions = map[[2]int][3]int{ + // WB3b. + {wbAny, prNewline}: {wbNewline, wbBreak, 32}, + {wbAny, prCR}: {wbCR, wbBreak, 32}, + {wbAny, prLF}: {wbLF, wbBreak, 32}, + + // WB3a. + {wbNewline, prAny}: {wbAny, wbBreak, 31}, + {wbCR, prAny}: {wbAny, wbBreak, 31}, + {wbLF, prAny}: {wbAny, wbBreak, 31}, + + // WB3. + {wbCR, prLF}: {wbLF, wbDontBreak, 30}, + + // WB3d. + {wbAny, prWSegSpace}: {wbWSegSpace, wbBreak, 9990}, + {wbWSegSpace, prWSegSpace}: {wbWSegSpace, wbDontBreak, 34}, + + // WB5. + {wbAny, prALetter}: {wbALetter, wbBreak, 9990}, + {wbAny, prHebrewLetter}: {wbHebrewLetter, wbBreak, 9990}, + {wbALetter, prALetter}: {wbALetter, wbDontBreak, 50}, + {wbALetter, prHebrewLetter}: {wbHebrewLetter, wbDontBreak, 50}, + {wbHebrewLetter, prALetter}: {wbALetter, wbDontBreak, 50}, + {wbHebrewLetter, prHebrewLetter}: {wbHebrewLetter, wbDontBreak, 50}, + + // WB7. Transitions to wbWB7 handled by transitionWordBreakState(). + {wbWB7, prALetter}: {wbALetter, wbDontBreak, 70}, + {wbWB7, prHebrewLetter}: {wbHebrewLetter, wbDontBreak, 70}, + + // WB7a. + {wbHebrewLetter, prSingleQuote}: {wbAny, wbDontBreak, 71}, + + // WB7c. Transitions to wbWB7c handled by transitionWordBreakState(). + {wbWB7c, prHebrewLetter}: {wbHebrewLetter, wbDontBreak, 73}, + + // WB8. + {wbAny, prNumeric}: {wbNumeric, wbBreak, 9990}, + {wbNumeric, prNumeric}: {wbNumeric, wbDontBreak, 80}, + + // WB9. + {wbALetter, prNumeric}: {wbNumeric, wbDontBreak, 90}, + {wbHebrewLetter, prNumeric}: {wbNumeric, wbDontBreak, 90}, + + // WB10. + {wbNumeric, prALetter}: {wbALetter, wbDontBreak, 100}, + {wbNumeric, prHebrewLetter}: {wbHebrewLetter, wbDontBreak, 100}, + + // WB11. Transitions to wbWB11 handled by transitionWordBreakState(). + {wbWB11, prNumeric}: {wbNumeric, wbDontBreak, 110}, + + // WB13. + {wbAny, prKatakana}: {wbKatakana, wbBreak, 9990}, + {wbKatakana, prKatakana}: {wbKatakana, wbDontBreak, 130}, + + // WB13a. + {wbAny, prExtendNumLet}: {wbExtendNumLet, wbBreak, 9990}, + {wbALetter, prExtendNumLet}: {wbExtendNumLet, wbDontBreak, 131}, + {wbHebrewLetter, prExtendNumLet}: {wbExtendNumLet, wbDontBreak, 131}, + {wbNumeric, prExtendNumLet}: {wbExtendNumLet, wbDontBreak, 131}, + {wbKatakana, prExtendNumLet}: {wbExtendNumLet, wbDontBreak, 131}, + {wbExtendNumLet, prExtendNumLet}: {wbExtendNumLet, wbDontBreak, 131}, + + // WB13b. + {wbExtendNumLet, prALetter}: {wbALetter, wbDontBreak, 132}, + {wbExtendNumLet, prHebrewLetter}: {wbHebrewLetter, wbDontBreak, 132}, + {wbExtendNumLet, prNumeric}: {wbNumeric, wbDontBreak, 132}, + {wbExtendNumLet, prKatakana}: {prKatakana, wbDontBreak, 132}, +} + +// transitionWordBreakState determines the new state of the word break parser +// given the current state and the next code point. It also returns whether a +// word boundary was detected. If more than one code point is needed to +// determine the new state, the byte slice or the string starting after rune "r" +// can be used (whichever is not nil or empty) for further lookups. +func transitionWordBreakState(state int, r rune, b []byte, str string) (newState int, wordBreak bool) { + // Determine the property of the next character. + nextProperty := property(workBreakCodePoints, r) + + // "Replacing Ignore Rules". + if nextProperty == prZWJ { + // WB4 (for zero-width joiners). + if state == wbNewline || state == wbCR || state == wbLF { + return wbAny | wbZWJBit, true // Make sure we don't apply WB4 to WB3a. + } + if state < 0 { + return wbAny | wbZWJBit, false + } + return state | wbZWJBit, false + } else if nextProperty == prExtend || nextProperty == prFormat { + // WB4 (for Extend and Format). + if state == wbNewline || state == wbCR || state == wbLF { + return wbAny, true // Make sure we don't apply WB4 to WB3a. + } + if state == wbWSegSpace || state == wbAny|wbZWJBit { + return wbAny, false // We don't break but this is also not WB3d or WB3c. + } + if state < 0 { + return wbAny, false + } + return state, false + } else if nextProperty == prExtendedPictographic && state >= 0 && state&wbZWJBit != 0 { + // WB3c. + return wbAny, false + } + if state >= 0 { + state = state &^ wbZWJBit + } + + // Find the applicable transition in the table. + var rule int + transition, ok := wbTransitions[[2]int{state, nextProperty}] + if ok { + // We have a specific transition. We'll use it. + newState, wordBreak, rule = transition[0], transition[1] == wbBreak, transition[2] + } else { + // No specific transition found. Try the less specific ones. + transAnyProp, okAnyProp := wbTransitions[[2]int{state, prAny}] + transAnyState, okAnyState := wbTransitions[[2]int{wbAny, nextProperty}] + if okAnyProp && okAnyState { + // Both apply. We'll use a mix (see comments for grTransitions). + newState, wordBreak, rule = transAnyState[0], transAnyState[1] == wbBreak, transAnyState[2] + if transAnyProp[2] < transAnyState[2] { + wordBreak, rule = transAnyProp[1] == wbBreak, transAnyProp[2] + } + } else if okAnyProp { + // We only have a specific state. + newState, wordBreak, rule = transAnyProp[0], transAnyProp[1] == wbBreak, transAnyProp[2] + // This branch will probably never be reached because okAnyState will + // always be true given the current transition map. But we keep it here + // for future modifications to the transition map where this may not be + // true anymore. + } else if okAnyState { + // We only have a specific property. + newState, wordBreak, rule = transAnyState[0], transAnyState[1] == wbBreak, transAnyState[2] + } else { + // No known transition. WB999: Any Ă· Any. + newState, wordBreak, rule = wbAny, true, 9990 + } + } + + // For those rules that need to look up runes further in the string, we + // determine the property after nextProperty, skipping over Format, Extend, + // and ZWJ (according to WB4). It's -1 if not needed, if such a rune cannot + // be determined (because the text ends or the rune is faulty). + farProperty := -1 + if rule > 60 && + (state == wbALetter || state == wbHebrewLetter || state == wbNumeric) && + (nextProperty == prMidLetter || nextProperty == prMidNumLet || nextProperty == prSingleQuote || // WB6. + nextProperty == prDoubleQuote || // WB7b. + nextProperty == prMidNum) { // WB12. + for { + var ( + r rune + length int + ) + if b != nil { // Byte slice version. + r, length = utf8.DecodeRune(b) + b = b[length:] + } else { // String version. + r, length = utf8.DecodeRuneInString(str) + str = str[length:] + } + if r == utf8.RuneError { + break + } + prop := property(workBreakCodePoints, r) + if prop == prExtend || prop == prFormat || prop == prZWJ { + continue + } + farProperty = prop + break + } + } + + // WB6. + if rule > 60 && + (state == wbALetter || state == wbHebrewLetter) && + (nextProperty == prMidLetter || nextProperty == prMidNumLet || nextProperty == prSingleQuote) && + (farProperty == prALetter || farProperty == prHebrewLetter) { + return wbWB7, false + } + + // WB7b. + if rule > 72 && + state == wbHebrewLetter && + nextProperty == prDoubleQuote && + farProperty == prHebrewLetter { + return wbWB7c, false + } + + // WB12. + if rule > 120 && + state == wbNumeric && + (nextProperty == prMidNum || nextProperty == prMidNumLet || nextProperty == prSingleQuote) && + farProperty == prNumeric { + return wbWB11, false + } + + // WB15 and WB16. + if newState == wbAny && nextProperty == prRegionalIndicator { + if state != wbOddRI && state != wbEvenRI { // Includes state == -1. + // Transition into the first RI. + return wbOddRI, true + } + if state == wbOddRI { + // Don't break pairs of Regional Indicators. + return wbEvenRI, false + } + return wbOddRI, true // We can break after a pair. + } + + return +} diff --git a/vendor/github.com/samber/lo/.gitignore b/vendor/github.com/samber/lo/.gitignore new file mode 100644 index 000000000..3aa3a0ad4 --- /dev/null +++ b/vendor/github.com/samber/lo/.gitignore @@ -0,0 +1,36 @@ + +# Created by https://www.toptal.com/developers/gitignore/api/go +# Edit at https://www.toptal.com/developers/gitignore?templates=go + +### Go ### +# If you prefer the allow list template instead of the deny list, see community template: +# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore +# +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Dependency directories (remove the comment below to include it) +# vendor/ + +# Go workspace file +go.work + +### Go Patch ### +/vendor/ +/Godeps/ + +# End of https://www.toptal.com/developers/gitignore/api/go + +cover.out +cover.html +.vscode diff --git a/vendor/github.com/samber/lo/CHANGELOG.md b/vendor/github.com/samber/lo/CHANGELOG.md new file mode 100644 index 000000000..aabeed120 --- /dev/null +++ b/vendor/github.com/samber/lo/CHANGELOG.md @@ -0,0 +1,71 @@ +# Changelog + +## 1.3.0 (2022-03-03) + +Last and Nth return errors + +## 1.2.0 (2022-03-03) + +Adding `lop.Map` and `lop.ForEach`. + +## 1.1.0 (2022-03-03) + +Adding `i int` param to `lo.Map()`, `lo.Filter()`, `lo.ForEach()` and `lo.Reduce()` predicates. + +## 1.0.0 (2022-03-02) + +*Initial release* + +Supported helpers for slices: + +- Filter +- Map +- Reduce +- ForEach +- Uniq +- UniqBy +- GroupBy +- Chunk +- Flatten +- Shuffle +- Reverse +- Fill +- ToMap + +Supported helpers for maps: + +- Keys +- Values +- Entries +- FromEntries +- Assign (maps merge) + +Supported intersection helpers: + +- Contains +- Every +- Some +- Intersect +- Difference + +Supported search helpers: + +- IndexOf +- LastIndexOf +- Find +- Min +- Max +- Last +- Nth + +Other functional programming helpers: + +- Ternary (1 line if/else statement) +- If / ElseIf / Else +- Switch / Case / Default +- ToPtr +- ToSlicePtr + +Constraints: + +- Clonable diff --git a/vendor/github.com/samber/lo/Dockerfile b/vendor/github.com/samber/lo/Dockerfile new file mode 100644 index 000000000..9f9f87192 --- /dev/null +++ b/vendor/github.com/samber/lo/Dockerfile @@ -0,0 +1,8 @@ + +FROM golang:1.18rc1-bullseye + +WORKDIR /go/src/github.com/samber/lo + +COPY Makefile go.* /go/src/github.com/samber/lo/ + +RUN make tools diff --git a/vendor/github.com/samber/lo/LICENSE b/vendor/github.com/samber/lo/LICENSE new file mode 100644 index 000000000..c3dc72d9a --- /dev/null +++ b/vendor/github.com/samber/lo/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Samuel Berthe + +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. diff --git a/vendor/github.com/samber/lo/Makefile b/vendor/github.com/samber/lo/Makefile new file mode 100644 index 000000000..11b09cd25 --- /dev/null +++ b/vendor/github.com/samber/lo/Makefile @@ -0,0 +1,51 @@ + +BIN=go +# BIN=go1.18beta1 + +go1.18beta1: + go install golang.org/dl/go1.18beta1@latest + go1.18beta1 download + +build: + ${BIN} build -v ./... + +test: + go test -race -v ./... +watch-test: + reflex -R assets.go -t 50ms -s -- sh -c 'gotest -race -v ./...' + +bench: + go test -benchmem -count 3 -bench ./... +watch-bench: + reflex -R assets.go -t 50ms -s -- sh -c 'go test -benchmem -count 3 -bench ./...' + +coverage: + ${BIN} test -v -coverprofile cover.out . + ${BIN} tool cover -html=cover.out -o cover.html + +# tools +tools: + ${BIN} install github.com/cespare/reflex@latest + ${BIN} install github.com/rakyll/gotest@latest + ${BIN} install github.com/psampaz/go-mod-outdated@latest + ${BIN} install github.com/jondot/goweight@latest + ${BIN} install github.com/golangci/golangci-lint/cmd/golangci-lint@latest + ${BIN} get -t -u golang.org/x/tools/cmd/cover + ${BIN} get -t -u github.com/sonatype-nexus-community/nancy@latest + go mod tidy + +lint: + golangci-lint run --timeout 60s --max-same-issues 50 ./... +lint-fix: + golangci-lint run --timeout 60s --max-same-issues 50 --fix ./... + +audit: tools + ${BIN} mod tidy + ${BIN} list -json -m all | nancy sleuth + +outdated: tools + ${BIN} mod tidy + ${BIN} list -u -m -json all | go-mod-outdated -update -direct + +weight: tools + goweight diff --git a/vendor/github.com/samber/lo/README.md b/vendor/github.com/samber/lo/README.md new file mode 100644 index 000000000..48dfdc004 --- /dev/null +++ b/vendor/github.com/samber/lo/README.md @@ -0,0 +1,981 @@ +# lo + +![Build Status](https://github.com/samber/lo/actions/workflows/go.yml/badge.svg) +[![GoDoc](https://godoc.org/github.com/samber/lo?status.svg)](https://pkg.go.dev/github.com/samber/lo) +[![Go report](https://goreportcard.com/badge/github.com/samber/lo)](https://goreportcard.com/report/github.com/samber/lo) + +✨ **`lo` is a Lodash-style Go library based on Go 1.18+ Generics.** + +This project started as an experiment with the new generics implementation. It may look like [Lodash](https://github.com/lodash/lodash) in some aspects. I used to code with the fantastic ["go-funk"](https://github.com/thoas/go-funk) package, but "go-funk" uses reflection and therefore is not typesafe. + +As expected, benchmarks demonstrate that generics will be much faster than implementations based on the "reflect" package. Benchmarks also show similar performance gains compared to pure `for` loops. [See below](#-benchmark). + +In the future, 5 to 10 helpers will overlap with those coming into the Go standard library (under package names `slices` and `maps`). I feel this library is legitimate and offers many more valuable abstractions. + +### Why this name? + +I wanted a **short name**, similar to "Lodash" and no Go package currently uses this name. + +## 🚀 Install + +```sh +go get github.com/samber/lo +``` + +## đź’ˇ Usage + +You can import `lo` using: + +```go +import ( + "github.com/samber/lo" + lop "github.com/samber/lo/parallel" +) +``` + +Then use one of the helpers below: + +```go +names := lo.Uniq[string]([]string{"Samuel", "Marc", "Samuel"}) +// []string{"Samuel", "Marc"} +``` + +Most of the time, the compiler will be able to infer the type so that you can call: `lo.Uniq([]string{...})`. + +## 🤠 Spec + +GoDoc: [https://godoc.org/github.com/samber/lo](https://godoc.org/github.com/samber/lo) + +Supported helpers for slices: + +- Filter +- Map +- FlatMap +- Reduce +- ForEach +- Times +- Uniq +- UniqBy +- GroupBy +- Chunk +- PartitionBy +- Flatten +- Shuffle +- Reverse +- Fill +- Repeat +- KeyBy +- Drop +- DropRight +- DropWhile +- DropRightWhile + +Supported helpers for maps: + +- Keys +- Values +- Entries +- FromEntries +- Assign (merge of maps) +- MapValues + +Supported helpers for tuples: + +- Zip2 -> Zip9 +- Unzip2 -> Unzip9 + +Supported intersection helpers: + +- Contains +- ContainsBy +- Every +- Some +- Intersect +- Difference +- Union + +Supported search helpers: + +- IndexOf +- LastIndexOf +- Find +- Min +- Max +- Last +- Nth +- Sample +- Samples + +Other functional programming helpers: + +- Ternary (1 line if/else statement) +- If / ElseIf / Else +- Switch / Case / Default +- ToPtr +- ToSlicePtr +- Attempt +- Range / RangeFrom / RangeWithSteps + +Constraints: + +- Clonable + +### Map + +Manipulates a slice of one type and transforms it into a slice of another type: + +```go +import "github.com/samber/lo" + +lo.Map[int64, string]([]int64{1, 2, 3, 4}, func(x int64, _ int) string { + return strconv.FormatInt(x, 10) +}) +// []string{"1", "2", "3", "4"} +``` + +Parallel processing: like `lo.Map()`, but the mapper function is called in a goroutine. Results are returned in the same order. + +```go +import lop "github.com/samber/lo/parallel" + +lop.Map[int64, string]([]int64{1, 2, 3, 4}, func(x int64, _ int) string { + return strconv.FormatInt(x, 10) +}) +// []string{"1", "2", "3", "4"} +``` + +### FlatMap + +Manipulates a slice and transforms and flattens it to a slice of another type. + +```go +lo.FlatMap[int, string]([]int{0, 1, 2}, func(x int, _ int) []string { + return []string{ + strconv.FormatInt(x, 10), + strconv.FormatInt(x, 10), + } +}) +// []string{"0", "0", "1", "1", "2", "2"} +``` + +### Filter + +Iterates over a collection and returns an array of all the elements the predicate function returns `true` for. + +```go +even := lo.Filter[int]([]int{1, 2, 3, 4}, func(x int, _ int) bool { + return x%2 == 0 +}) +// []int{2, 4} +``` + +### Contains + +Returns true if an element is present in a collection. + +```go +present := lo.Contains[int]([]int{0, 1, 2, 3, 4, 5}, 5) +// true +``` + +### Contains + +Returns true if the predicate function returns `true`. + +```go +present := lo.ContainsBy[int]([]int{0, 1, 2, 3, 4, 5}, func(x int) bool { + return x == 3 +}) +// true +``` + +### Reduce + +Reduces a collection to a single value. The value is calculated by accumulating the result of running each element in the collection through an accumulator function. Each successive invocation is supplied with the return value returned by the previous call. + +```go +sum := lo.Reduce[int, int]([]int{1, 2, 3, 4}, func(agg int, item int, _ int) int { + return agg + item +}, 0) +// 10 +``` + +### ForEach + +Iterates over elements of a collection and invokes the function over each element. + +```go +import "github.com/samber/lo" + +lo.ForEach[string]([]string{"hello", "world"}, func(x string, _ int) { + println(x) +}) +// prints "hello\nworld\n" +``` + +Parallel processing: like `lo.ForEach()`, but the callback is called as a goroutine. + +```go +import lop "github.com/samber/lo/parallel" + +lop.ForEach[string]([]string{"hello", "world"}, func(x string, _ int) { + println(x) +}) +// prints "hello\nworld\n" or "world\nhello\n" +``` + +### Times + +Times invokes the iteratee n times, returning an array of the results of each invocation. The iteratee is invoked with index as argument. + +```go +import "github.com/samber/lo" + +lo.Times[string](3, func(i int) string { + return strconv.FormatInt(int64(i), 10) +}) +// []string{"0", "1", "2"} +``` + +Parallel processing: like `lo.Times()`, but callback is called in goroutine. + +```go +import lop "github.com/samber/lo/parallel" + +lop.Times[string](3, func(i int) string { + return strconv.FormatInt(int64(i), 10) +}) +// []string{"0", "1", "2"} +``` + +### Uniq + +Returns a duplicate-free version of an array, in which only the first occurrence of each element is kept. The order of result values is determined by the order they occur in the array. + +```go +uniqValues := lo.Uniq[int]([]int{1, 2, 2, 1}) +// []int{1, 2} +``` + +### UniqBy + +Returns a duplicate-free version of an array, in which only the first occurrence of each element is kept. The order of result values is determined by the order they occur in the array. It accepts `iteratee` which is invoked for each element in array to generate the criterion by which uniqueness is computed. + +```go +uniqValues := lo.UniqBy[int, int]([]int{0, 1, 2, 3, 4, 5}, func(i int) int { + return i%3 +}) +// []int{0, 1, 2} +``` + +### GroupBy + +Returns an object composed of keys generated from the results of running each element of collection through iteratee. + +```go +import lo "github.com/samber/lo" + +groups := lo.GroupBy[int, int]([]int{0, 1, 2, 3, 4, 5}, func(i int) int { + return i%3 +}) +// map[int][]int{0: []int{0, 3}, 1: []int{1, 4}, 2: []int{2, 5}} +``` + +Parallel processing: like `lo.GroupBy()`, but callback is called in goroutine. + +```go +import lop "github.com/samber/lo/parallel" + +lop.GroupBy[int, int]([]int{0, 1, 2, 3, 4, 5}, func(i int) int { + return i%3 +}) +// map[int][]int{0: []int{0, 3}, 1: []int{1, 4}, 2: []int{2, 5}} +``` + +### Chunk + +Returns an array of elements split into groups the length of size. If array can't be split evenly, the final chunk will be the remaining elements. + +```go +lo.Chunk[int]([]int{0, 1, 2, 3, 4, 5}, 2) +// [][]int{{0, 1}, {2, 3}, {4, 5}} + +lo.Chunk[int]([]int{0, 1, 2, 3, 4, 5, 6}, 2) +// [][]int{{0, 1}, {2, 3}, {4, 5}, {6}} + +lo.Chunk[int]([]int{}, 2) +// [][]int{} + +lo.Chunk[int]([]int{0}, 2) +// [][]int{{0}} +``` + +### PartitionBy + +Returns an array of elements split into groups. The order of grouped values is determined by the order they occur in collection. The grouping is generated from the results of running each element of collection through iteratee. + +```go +import lo "github.com/samber/lo" + +partitions := lo.PartitionBy[int, string]([]int{-2, -1, 0, 1, 2, 3, 4, 5}, func(x int) string { + if x < 0 { + return "negative" + } else if x%2 == 0 { + return "even" + } + return "odd" +}) +// [][]int{{-2, -1}, {0, 2, 4}, {1, 3, 5}} +``` + +Parallel processing: like `lo.PartitionBy()`, but callback is called in goroutine. Results are returned in the same order. + +```go +import lop "github.com/samber/lo/parallel" + +partitions := lo.PartitionBy[int, string]([]int{-2, -1, 0, 1, 2, 3, 4, 5}, func(x int) string { + if x < 0 { + return "negative" + } else if x%2 == 0 { + return "even" + } + return "odd" +}) +// [][]int{{-2, -1}, {0, 2, 4}, {1, 3, 5}} +``` + +### Flatten + +Returns an array a single level deep. + +```go +flat := lo.Flatten[int]([][]int{{0, 1}, {2, 3, 4, 5}}) +// []int{0, 1, 2, 3, 4, 5} +``` + +### Shuffle + +Returns an array of shuffled values. Uses the Fisher-Yates shuffle algorithm. + +```go +randomOrder := lo.Shuffle[int]([]int{0, 1, 2, 3, 4, 5}) +// []int{0, 1, 2, 3, 4, 5} +``` + +### Reverse + +Reverses array so that the first element becomes the last, the second element becomes the second to last, and so on. + +```go +reverseOder := lo.Reverse[int]([]int{0, 1, 2, 3, 4, 5}) +// []int{5, 4, 3, 2, 1, 0} +``` + +### Fill + +Fills elements of array with `initial` value. + +```go +type foo struct { + bar string +} + +func (f foo) Clone() foo { + return foo{f.bar} +} + +initializedSlice := lo.Fill[foo]([]foo{foo{"a"}, foo{"a"}}, foo{"b"}) +// []foo{foo{"b"}, foo{"b"}} +``` + +### Repeat + +Builds a slice with N copies of initial value. + +```go +type foo struct { + bar string +} + +func (f foo) Clone() foo { + return foo{f.bar} +} + +initializedSlice := lo.Repeat[foo](2, foo{"a"}) +// []foo{foo{"a"}, foo{"a"}} +``` + +### KeyBy + +Transforms a slice or an array of structs to a map based on a pivot callback. + +```go +m := lo.KeyBy[int, string]([]string{"a", "aa", "aaa"}, func(str string) int { + return len(str) +}) +// map[int]string{1: "a", 2: "aa", 3: "aaa"} + +type Character struct { + dir string + code int +} +characters := []Character{ + {dir: "left", code: 97}, + {dir: "right", code: 100}, +} +result := KeyBy[Character, string](characters, func(char Character) string { + return string(rune(char.code)) +}) +//map[a:{dir:left code:97} d:{dir:right code:100}] +``` + +### Drop + +Drops n elements from the beginning of a slice or array. + +```go +l := lo.Drop[int]([]int{0, 1, 2, 3, 4, 5}, 2) +// []int{2, 3, 4, 5} +``` + +### DropRight + +Drops n elements from the end of a slice or array. + +```go +l := lo.DropRight[int]([]int{0, 1, 2, 3, 4, 5}, 2) +// []int{0, 1, 2, 3} +``` + +### DropWhile + +Drop elements from the beginning of a slice or array while the predicate returns true. + +```go +l := lo.DropWhile[string]([]string{"a", "aa", "aaa", "aa", "aa"}, func(val string) bool { + return len(val) <= 2 +}) +// []string{"aaa", "aa", "a"} +``` + +### DropRightWhile + +Drop elements from the end of a slice or array while the predicate returns true. + +```go +l := lo.DropRightWhile[string]([]string{"a", "aa", "aaa", "aa", "aa"}, func(val string) bool { + return len(val) <= 2 +}) +// []string{"a", "aa", "aaa"} +``` + +### Keys + +Creates an array of the map keys. + +```go +keys := lo.Keys[string, int](map[string]int{"foo": 1, "bar": 2}) +// []string{"bar", "foo"} +``` + +### Values + +Creates an array of the map values. + +```go +values := lo.Values[string, int](map[string]int{"foo": 1, "bar": 2}) +// []int{1, 2} +``` + +### Entries + +Transforms a map into array of key/value pairs. + +```go +entries := lo.Entries[string, int](map[string]int{"foo": 1, "bar": 2}) +// []lo.Entry[string, int]{ +// { +// Key: "foo", +// Value: 1, +// }, +// { +// Key: "bar", +// Value: 2, +// }, +// } +``` + +### FromEntries + +Transforms an array of key/value pairs into a map. + +```go +m := lo.FromEntries[string, int]([]lo.Entry[string, int]{ + { + Key: "foo", + Value: 1, + }, + { + Key: "bar", + Value: 2, + }, +}) +// map[string]int{"foo": 1, "bar": 2} +``` + +### Assign + +Merges multiple maps from left to right. + +```go +mergedMaps := lo.Assign[string, int]( + map[string]int{"a": 1, "b": 2}, + map[string]int{"b": 3, "c": 4}, +) +// map[string]int{"a": 1, "b": 3, "c": 4} +``` + +### MapValues + +Manipulates a map values and transforms it to a map of another type. + +```go +m1 := map[int]int64{1: 1, 2: 2, 3: 3} + +m2 := lo.MapValues[int, int64, string](m, func(x int64, _ int) string { + return strconv.FormatInt(x, 10) +}) +// map[int]string{1: "1", 2: "2", 3: "3"} +``` + +### Zip2 -> Zip9 + +Zip creates a slice of grouped elements, the first of which contains the first elements of the given arrays, the second of which contains the second elements of the given arrays, and so on. + +When collections have different size, the Tuple attributes are filled with zero value. + +```go +tuples := lo.Zip2[string, int]([]string{"a", "b"}, []int{1, 2}) +// []Tuple2[string, int]{{A: "a", B: 1}, {A: "b", B: 2}} +``` + +### Unzip2 -> Unzip9 + +Unzip accepts an array of grouped elements and creates an array regrouping the elements to their pre-zip configuration. + +```go +a, b := lo.Unzip2[string, int]([]Tuple2[string, int]{{A: "a", B: 1}, {A: "b", B: 2}}) +// []string{"a", "b"} +// []int{1, 2} +``` + +### Every + +Returns true if all elements of a subset are contained into a collection. + +```go +ok := lo.Every[int]([]int{0, 1, 2, 3, 4, 5}, []int{0, 2}) +// true + +ok := lo.Every[int]([]int{0, 1, 2, 3, 4, 5}, []int{0, 6}) +// false +``` + +### Some + +Returns true if at least 1 element of a subset is contained into a collection. + +```go +ok := lo.Some[int]([]int{0, 1, 2, 3, 4, 5}, []int{0, 2}) +// true + +ok := lo.Some[int]([]int{0, 1, 2, 3, 4, 5}, []int{-1, 6}) +// false +``` + +### Intersect + +Returns the intersection between two collections. + +```go +result1 := lo.Intersect[int]([]int{0, 1, 2, 3, 4, 5}, []int{0, 2}) +// []int{0, 2} + +result2 := lo.Intersect[int]([]int{0, 1, 2, 3, 4, 5}, []int{0, 6} +// []int{0} + +result3 := lo.Intersect[int]([]int{0, 1, 2, 3, 4, 5}, []int{-1, 6}) +// []int{} +``` + +### Difference + +Returns the difference between two collections. + +- The first value is the collection of element absent of list2. +- The second value is the collection of element absent of list1. + +```go +left, right := lo.Difference[int]([]int{0, 1, 2, 3, 4, 5}, []int{0, 2, 6}) +// []int{1, 3, 4, 5}, []int{6} + +left, right := Difference[int]([]int{0, 1, 2, 3, 4, 5}, []int{0, 1, 2, 3, 4, 5}) +// []int{}, []int{} +``` + +### Union + +Returns all distinct elements from both collections. Result will not change the order of elements relatively. + +```go +union := lo.Union[int]([]int{0, 1, 2, 3, 4, 5}, []int{0, 2, 10}) +// []int{0, 1, 2, 3, 4, 5, 10} +``` + +### IndexOf + +Returns the index at which the first occurrence of a value is found in an array or return -1 if the value cannot be found. + +```go +found := lo.IndexOf[int]([]int{0, 1, 2, 1, 2, 3}, 2) +// 2 + +notFound := lo.IndexOf[int]([]int{0, 1, 2, 1, 2, 3}, 6) +// -1 +``` + +### LastIndex + +Returns the index at which the last occurrence of a value is found in an array or return -1 if the value cannot be found. + +```go +found := lo.LastIndexOf[int]([]int{0, 1, 2, 1, 2, 3}, 2) +// 4 + +notFound := lo.LastIndexOf[int]([]int{0, 1, 2, 1, 2, 3}, 6) +// -1 +``` + +### Find + +Search an element in a slice based on a predicate. It returns element and true if element was found. + +```go +str, ok := lo.Find[string]([]string{"a", "b", "c", "d"}, func(i string) bool { + return i == "b" +}) +// "b", true + +str, ok := lo.Find[string]([]string{"foobar"}, func(i string) bool { + return i == "b" +}) +// "", false +``` + +### Min + +Search the minimum value of a collection. + +```go +min := lo.Min[int]([]int{1, 2, 3}) +// 1 + +min := lo.Min[int]([]int{}) +// 0 +``` + +### Max + +Search the maximum value of a collection. + +```go +max := lo.Max[int]([]int{1, 2, 3}) +// 3 + +max := lo.Max[int]([]int{}) +// 0 +``` + +### Last + +Returns the last element of a collection or error if empty. + +```go +last, err := lo.Last[int]([]int{1, 2, 3}) +// 3 +``` + +### Nth + +Returns the element at index `nth` of collection. If `nth` is negative, the nth element from the end is returned. An error is returned when nth is out of slice bounds. + +```go +nth, err := lo.Nth[int]([]int{0, 1, 2, 3}, 2) +// 2 + +nth, err := lo.Nth[int]([]int{0, 1, 2, 3}, -2) +// 2 +``` + +### Sample + +Returns a random item from collection. + +```go +lo.Sample[string]([]string{"a", "b", "c"}) +// a random string from []string{"a", "b", "c"} + +lo.Sample[string]([]string{}) +// "" +``` + +### Samples + +Returns N random unique items from collection. + +```go +lo.Samples[string]([]string{"a", "b", "c"}, 3) +// []string{"a", "b", "c"} in random order +``` + +### Ternary + +A 1 line if/else statement. + +```go +result := lo.Ternary[string](true, "a", "b") +// "a" + +result := lo.Ternary[string](false, "a", "b") +// "b" +``` + +### If / ElseIf / Else + +```go +result := lo.If[int](true, 1). + ElseIf(false, 2). + Else(3) +// 1 + +result := lo.If[int](false, 1). + ElseIf(true, 2). + Else(3) +// 2 + +result := lo.If[int](false, 1). + ElseIf(false, 2). + Else(3) +// 3 +``` + +### Switch / Case / Default + +```go +result := lo.Switch[int, string](1). + Case(1, "1"). + Case(2, "2"). + Default("3") +// "1" + +result := lo.Switch[int, string](2). + Case(1, "1"). + Case(2, "2"). + Default("3") +// "2" + +result := lo.Switch[int, string](42). + Case(1, "1"). + Case(2, "2"). + Default("3") +// "3" +``` + +Using callbacks: + +```go +result := lo.Switch[int, string](1). + CaseF(1, func() string { + return "1" + }). + CaseF(2, func() string { + return "2" + }). + DefaultF(func() string { + return "3" + }) +// "1" +``` + +### ToPtr + +Returns a pointer copy of value. + +```go +ptr := lo.ToPtr[string]("hello world") +// *string{"hello world"} +``` + +### ToSlicePtr + +Returns a slice of pointer copy of value. + +```go +ptr := lo.ToSlicePtr[string]([]string{"hello", "world"}) +// []*string{"hello", "world"} +``` + +### Attempt + +Invokes a function N times until it returns valid output. Returning either the caught error or nil. When first argument is less than `1`, the function runs until a sucessfull response is returned. + +```go +iter, err := lo.Attempt(42, func(i int) error { + if i == 5 { + return nil + } + + return fmt.Errorf("failed") +}) +// 6 +// nil + +iter, err := lo.Attempt(2, func(i int) error { + if i == 5 { + return nil + } + + return fmt.Errorf("failed") +}) +// 2 +// error "failed" + +iter, err := lo.Attempt(0, func(i int) error { + if i < 42 { + return fmt.Errorf("failed") + } + + return nil +}) +// 43 +// nil +``` + +### Range / RangeFrom / RangeWithSteps + +Creates an array of numbers (positive and/or negative) progressing from start up to, but not including end. + +```go +result := Range(4) +// [0, 1, 2, 3] + +result := Range(-4); +// [0, -1, -2, -3] + +result := RangeFrom(1, 5); +// [1, 2, 3, 4] + +result := RangeFrom[float64](1.0, 5); +// [1.0, 2.0, 3.0, 4.0] + +result := RangeWithSteps(0, 20, 5); +// [0, 5, 10, 15] + +result := RangeWithSteps[float32](-1.0, -4.0, -1.0); +// [-1.0, -2.0, -3.0] + +result := RangeWithSteps(1, 4, -1); +// [] + +result := Range(0); +// [] +``` + +For more advanced retry strategies (delay, exponential backoff...), please take a look on [cenkalti/backoff](https://github.com/cenkalti/backoff). + +## 🛩 Benchmark + +We executed a simple benchmark with the a dead-simple `lo.Map` loop: + +See the full implementation [here](./benchmark_test.go). + +```go +_ = lo.Map[int64](arr, func(x int64, i int) string { + return strconv.FormatInt(x, 10) +}) +``` + +**Result:** + +Here is a comparison between `lo.Map`, `lop.Map`, `go-funk` library and a simple Go `for` loop. + +``` +$ go test -benchmem -bench ./... +goos: linux +goarch: amd64 +pkg: github.com/samber/lo +cpu: Intel(R) Core(TM) i5-7267U CPU @ 3.10GHz +cpu: Intel(R) Core(TM) i7 CPU 920 @ 2.67GHz +BenchmarkMap/lo.Map-8 8 132728237 ns/op 39998945 B/op 1000002 allocs/op +BenchmarkMap/lop.Map-8 2 503947830 ns/op 119999956 B/op 3000007 allocs/op +BenchmarkMap/reflect-8 2 826400560 ns/op 170326512 B/op 4000042 allocs/op +BenchmarkMap/for-8 9 126252954 ns/op 39998674 B/op 1000001 allocs/op +PASS +ok github.com/samber/lo 6.657s +``` + +- `lo.Map` is way faster (x7) than `go-funk`, a relection-based Map implementation. +- `lo.Map` have the same allocation profile than `for`. +- `lo.Map` is 4% slower than `for`. +- `lop.Map` is slower than `lo.Map` because it implies more memory allocation and locks. `lop.Map` will be usefull for long-running callbacks, such as i/o bound processing. +- `for` beats other implementations for memory and CPU. + +## 🤝 Contributing + +- Ping me on twitter [@samuelberthe](https://twitter.com/samuelberthe) (DMs, mentions, whatever :)) +- Fork the [project](https://github.com/samber/lo) +- Fix [open issues](https://github.com/samber/lo/issues) or request new features + +Don't hesitate ;) + +### Install go 1.18 + +```bash +make go1.18beta1 +``` + +If your OS currently not default to Go 1.18, replace `BIN=go` by `BIN=go1.18beta1` in the Makefile. + +### With Docker + +```bash +docker-compose run --rm dev +``` + +### Without Docker + +```bash +# Install some dev dependencies +make tools + +# Run tests +make test +# or +make watch-test +``` + +## 👤 Authors + +- Samuel Berthe + +## đź’« Show your support + +Give a â­ď¸Ź if this project helped you! + +[![support us](https://c5.patreon.com/external/logo/become_a_patron_button.png)](https://www.patreon.com/samber) + +## 📝 License + +Copyright © 2022 [Samuel Berthe](https://github.com/samber). + +This project is [MIT](./LICENSE) licensed. diff --git a/vendor/github.com/samber/lo/condition.go b/vendor/github.com/samber/lo/condition.go new file mode 100644 index 000000000..2d9862cc5 --- /dev/null +++ b/vendor/github.com/samber/lo/condition.go @@ -0,0 +1,99 @@ +package lo + +// Ternary is a 1 line if/else statement. +func Ternary[T any](condition bool, ifOutput T, elseOutput T) T { + if condition { + return ifOutput + } + + return elseOutput +} + +type ifElse[T any] struct { + result T + done bool +} + +// If. +func If[T any](condition bool, result T) *ifElse[T] { + if condition { + return &ifElse[T]{result, true} + } + + var t T + return &ifElse[T]{t, false} +} + +// ElseIf. +func (i *ifElse[T]) ElseIf(condition bool, result T) *ifElse[T] { + if !i.done && condition { + i.result = result + i.done = true + } + + return i +} + +// Else. +func (i *ifElse[T]) Else(result T) T { + if i.done { + return i.result + } + + return result +} + +type switchCase[T comparable, R any] struct { + predicate T + result R + done bool +} + +// Switch is a pure functional switch/case/default statement. +func Switch[T comparable, R any](predicate T) *switchCase[T, R] { + var result R + + return &switchCase[T, R]{ + predicate, + result, + false, + } +} + +// Case. +func (s *switchCase[T, R]) Case(val T, result R) *switchCase[T, R] { + if !s.done && s.predicate == val { + s.result = result + s.done = true + } + + return s +} + +// CaseF. +func (s *switchCase[T, R]) CaseF(val T, cb func() R) *switchCase[T, R] { + if !s.done && s.predicate == val { + s.result = cb() + s.done = true + } + + return s +} + +// Default. +func (s *switchCase[T, R]) Default(result R) R { + if !s.done { + s.result = result + } + + return s.result +} + +// DefaultF. +func (s *switchCase[T, R]) DefaultF(cb func() R) R { + if !s.done { + s.result = cb() + } + + return s.result +} diff --git a/vendor/github.com/samber/lo/constraints.go b/vendor/github.com/samber/lo/constraints.go new file mode 100644 index 000000000..c1f352968 --- /dev/null +++ b/vendor/github.com/samber/lo/constraints.go @@ -0,0 +1,6 @@ +package lo + +// Clonable defines a constraint of types having Clone() T method. +type Clonable[T any] interface { + Clone() T +} diff --git a/vendor/github.com/samber/lo/docker-compose.yml b/vendor/github.com/samber/lo/docker-compose.yml new file mode 100644 index 000000000..c6f3f652b --- /dev/null +++ b/vendor/github.com/samber/lo/docker-compose.yml @@ -0,0 +1,9 @@ +version: '3' + +services: + dev: + build: . + volumes: + - ./:/go/src/github.com/samber/lo + working_dir: /go/src/github.com/samber/lo + command: bash -c 'make tools ; make watch-test' diff --git a/vendor/github.com/samber/lo/drop.go b/vendor/github.com/samber/lo/drop.go new file mode 100644 index 000000000..870b04aa3 --- /dev/null +++ b/vendor/github.com/samber/lo/drop.go @@ -0,0 +1,65 @@ +package lo + +//Drop drops n elements from the beginning of a slice or array. +func Drop[T any](collection []T, n int) []T { + if len(collection) <= n { + return make([]T, 0) + } + + result := make([]T, len(collection)-n) + for i := n; i < len(collection); i++ { + result[i-n] = collection[i] + } + + return result +} + +//DropWhile drops elements from the beginning of a slice or array while the predicate returns true. +func DropWhile[T any](collection []T, predicate func(T) bool) []T { + i := 0 + for ; i < len(collection); i++ { + if !predicate(collection[i]) { + break + } + } + + result := make([]T, len(collection)-i) + + for j := 0; i < len(collection); i, j = i+1, j+1 { + result[j] = collection[i] + } + + return result +} + +//DropRight drops n elements from the end of a slice or array. +func DropRight[T any](collection []T, n int) []T { + if len(collection) <= n { + return make([]T, 0) + } + + result := make([]T, len(collection)-n) + for i := len(collection) - 1 - n; i != 0; i-- { + result[i] = collection[i] + } + + return result +} + +//DropRightWhile drops elements from the end of a slice or array while the predicate returns true. +func DropRightWhile[T any](collection []T, predicate func(T) bool) []T { + i := len(collection) - 1 + for ; i >= 0; i-- { + if !predicate(collection[i]) { + break + } + } + + result := make([]T, i+1) + + for ; i >= 0; i-- { + result[i] = collection[i] + } + + return result +} diff --git a/vendor/github.com/samber/lo/find.go b/vendor/github.com/samber/lo/find.go new file mode 100644 index 000000000..e6d22ca05 --- /dev/null +++ b/vendor/github.com/samber/lo/find.go @@ -0,0 +1,157 @@ +package lo + +import ( + "fmt" + "math/rand" + "math" + "golang.org/x/exp/constraints" +) + +// import "golang.org/x/exp/constraints" + +// IndexOf returns the index at which the first occurrence of a value is found in an array or return -1 +// if the value cannot be found. +func IndexOf[T comparable](collection []T, element T) int { + for i, item := range collection { + if item == element { + return i + } + } + + return -1 +} + +// IndexOf returns the index at which the last occurrence of a value is found in an array or return -1 +// if the value cannot be found. +func LastIndexOf[T comparable](collection []T, element T) int { + length := len(collection) + + for i := length - 1; i >= 0; i-- { + if collection[i] == element { + return i + } + } + + return -1 +} + +// Find search an element in a slice based on a predicate. It returns element and true if element was found. +func Find[T any](collection []T, predicate func(T) bool) (T, bool) { + for _, item := range collection { + if predicate(item) { + return item, true + } + } + + var result T + return result, false +} + +// Min search the minimum value of a collection. +func Min[T constraints.Ordered](collection []T) T { + var min T + + if len(collection) == 0 { + return min + } + + min = collection[0] + + for i := 1; i < len(collection); i++ { + item := collection[i] + + // if item.Less(min) { + if item < min { + min = item + } + } + + return min +} + +// Max search the maximum value of a collection. +func Max[T constraints.Ordered](collection []T) T { + var max T + + if len(collection) == 0 { + return max + } + + max = collection[0] + + for i := 1; i < len(collection); i++ { + item := collection[i] + + if item > max { + max = item + } + } + + return max +} + +// Last returns the last element of a collection or error if empty. +func Last[T any](collection []T) (T, error) { + length := len(collection) + + if length == 0 { + var t T + return t, fmt.Errorf("last: cannot extract the last element of an empty slice") + } + + return collection[length-1], nil +} + +// Nth returns the element at index `nth` of collection. If `nth` is negative, the nth element +// from the end is returned. An error is returned when nth is out of slice bounds. +func Nth[T any](collection []T, nth int) (T, error) { + if int(math.Abs(float64(nth))) >= len(collection) { + var t T + return t, fmt.Errorf("nth: %d out of slice bounds", nth) + } + + length := len(collection) + + if nth >= 0 { + return collection[nth], nil + } + + return collection[length+nth], nil +} + +// Sample returns a random item from collection. +func Sample[T any](collection []T) T { + size := len(collection) + if size == 0 { + return Empty[T]() + } + + return collection[rand.Intn(size)] +} + +// Samples returns N random unique items from collection. +func Samples[T any](collection []T, count int) []T { + size := len(collection) + + // put values into a map, for faster deletion + cOpy := make([]T, 0, size) + for _, v := range collection { + cOpy = append(cOpy, v) + } + + results := []T{} + + for i := 0; i < size && i < count; i++ { + copyLength := size - i + + index := rand.Intn(size - i) + results = append(results, cOpy[index]) + + // Removes element. + // It is faster to swap with last element and remove it. + cOpy[index] = cOpy[copyLength-1] + cOpy = cOpy[:copyLength-1] + } + + return results +} diff --git a/vendor/github.com/samber/lo/intersect.go b/vendor/github.com/samber/lo/intersect.go new file mode 100644 index 000000000..f720d1a2f --- /dev/null +++ b/vendor/github.com/samber/lo/intersect.go @@ -0,0 +1,131 @@ +package lo + +// Contains returns true if an element is present in a collection. +func Contains[T comparable](collection []T, element T) bool { + for _, item := range collection { + if item == element { + return true + } + } + + return false +} + +// ContainsBy returns true if predicate function return true. +func ContainsBy[T any](collection []T, predicate func(T) bool) bool { + for _, item := range collection { + if predicate(item) { + return true + } + } + + return false +} + +// Every returns true if all elements of a subset are contained into a collection. +func Every[T comparable](collection []T, subset []T) bool { + for _, elem := range subset { + if !Contains(collection, elem) { + return false + } + } + + return true +} + +// Some returns true if at least 1 element of a subset is contained into a collection. +func Some[T comparable](collection []T, subset []T) bool { + for _, elem := range subset { + if Contains(collection, elem) { + return true + } + } + + return false +} + +// Intersect returns the intersection between two collections. +func Intersect[T comparable](list1 []T, list2 []T) []T { + result := []T{} + seen := map[T]struct{}{} + + for _, elem := range list1 { + seen[elem] = struct{}{} + } + + for _, elem := range list2 { + if _, ok := seen[elem]; ok { + result = append(result, elem) + } + } + + return result +} + +// Difference returns the difference between two collections. +// The first value is the collection of element absent of list2. +// The second value is the collection of element absent of list1. +func Difference[T comparable](list1 []T, list2 []T) ([]T, []T) { + left := []T{} + right := []T{} + + seenLeft := map[T]struct{}{} + seenRight := map[T]struct{}{} + + for _, elem := range list1 { + seenLeft[elem] = struct{}{} + } + + for _, elem := range list2 { + seenRight[elem] = struct{}{} + } + + for _, elem := range list1 { + if _, ok := seenRight[elem]; !ok { + left = append(left, elem) + } + } + + for _, elem := range list2 { + if _, ok := seenLeft[elem]; !ok { + right = append(right, elem) + } + } + + return left, right +} + +// Union returns all distinct elements from both collections. +// result returns will not change the order of elements relatively. +func Union[T comparable](list1 []T, list2 []T) []T { + result := []T{} + + seen := map[T]struct{}{} + hasAdd := map[T]struct{}{} + + for _, e := range list1 { + seen[e] = struct{}{} + } + + for _, e := range list2 { + seen[e] = struct{}{} + } + + for _, e := range list1 { + if _, ok := seen[e]; ok { + result = append(result, e) + hasAdd[e] = struct{}{} + } + } + + for _, e := range list2 { + if _, ok := hasAdd[e]; ok { + continue + } + if _, ok := seen[e]; ok { + result = append(result, e) + } + } + + return result +} diff --git a/vendor/github.com/samber/lo/map.go b/vendor/github.com/samber/lo/map.go new file mode 100644 index 000000000..92c77d8ba --- /dev/null +++ b/vendor/github.com/samber/lo/map.go @@ -0,0 +1,72 @@ +package lo + +// Keys creates an array of the map keys. +func Keys[K comparable, V any](in map[K]V) []K { + result := make([]K, 0, len(in)) + + for k, _ := range in { + result = append(result, k) + } + + return result +} + +// Values creates an array of the map values. +func Values[K comparable, V any](in map[K]V) []V { + result := make([]V, 0, len(in)) + + for _, v := range in { + result = append(result, v) + } + + return result +} + +// Entries transforms a map into array of key/value pairs. +func Entries[K comparable, V any](in map[K]V) []Entry[K, V] { + entries := make([]Entry[K, V], 0, len(in)) + + for k, v := range in { + entries = append(entries, Entry[K, V]{ + Key: k, + Value: v, + }) + } + + return entries +} + +// FromEntries transforms an array of key/value pairs into a map. +func FromEntries[K comparable, V any](entries []Entry[K, V]) map[K]V { + out := map[K]V{} + + for _, v := range entries { + out[v.Key] = v.Value + } + + return out +} + +// Assign merges multiple maps from left to right. +func Assign[K comparable, V any](maps ...map[K]V) map[K]V { + out := map[K]V{} + + for _, m := range maps { + for k, v := range m { + out[k] = v + } + } + + return out +} + +// MapValues manipulates a map values and transforms it to a map of another type. +func MapValues[K comparable, V any, R any](in map[K]V, iteratee func(V, K) R) map[K]R { + result := map[K]R{} + + for k, v := range in { + result[k] = iteratee(v, k) + } + + return result +} \ No newline at end of file diff --git a/vendor/github.com/samber/lo/pointers.go b/vendor/github.com/samber/lo/pointers.go new file mode 100644 index 000000000..9c6f7fe33 --- /dev/null +++ b/vendor/github.com/samber/lo/pointers.go @@ -0,0 +1,19 @@ +package lo + +// ToPtr returns a pointer copy of value. +func ToPtr[T any](x T) *T { + return &x +} + +// ToPtr returns a slice of pointer copy of value. +func ToSlicePtr[T any](collection []T) []*T { + return Map(collection, func (x T, _ int) *T { + return &x + }) +} + +// Empty returns an empty value. +func Empty[T any]() T { + var t T + return t +} diff --git a/vendor/github.com/samber/lo/retry.go b/vendor/github.com/samber/lo/retry.go new file mode 100644 index 000000000..ebdb31d29 --- /dev/null +++ b/vendor/github.com/samber/lo/retry.go @@ -0,0 +1,19 @@ +package lo + +// Attempt invokes a function N times until it returns valid output. Returning either the caught error or nil. When first argument is less than `1`, the function runs until a sucessfull response is returned. +func Attempt(maxIteration int, f func(int) error) (int, error) { + var err error + + for i := 0; maxIteration <= 0 || i < maxIteration; i++ { + // for retries >= 0 { + err = f(i) + if err == nil { + return i + 1, nil + } + } + + return maxIteration, err +} + +// throttle ? +// debounce ? diff --git a/vendor/github.com/samber/lo/slice.go b/vendor/github.com/samber/lo/slice.go new file mode 100644 index 000000000..f5e989358 --- /dev/null +++ b/vendor/github.com/samber/lo/slice.go @@ -0,0 +1,242 @@ +package lo + +import ( + "math/rand" +) + +// Filter iterates over elements of collection, returning an array of all elements predicate returns truthy for. +func Filter[V any](collection []V, predicate func(V, int) bool) []V { + result := []V{} + + for i, item := range collection { + if predicate(item, i) { + result = append(result, item) + } + } + + return result +} + +// Map manipulates a slice and transforms it to a slice of another type. +func Map[T any, R any](collection []T, iteratee func(T, int) R) []R { + result := make([]R, len(collection)) + + for i, item := range collection { + result[i] = iteratee(item, i) + } + + return result +} + +// FlatMap manipulates a slice and transforms and flattens it to a slice of another type. +func FlatMap[T any, R any](collection []T, iteratee func(T, int) []R) []R { + result := []R{} + + for i, item := range collection { + result = append(result, iteratee(item, i)...) + } + + return result +} + +// Reduce reduces collection to a value which is the accumulated result of running each element in collection +// through accumulator, where each successive invocation is supplied the return value of the previous. +func Reduce[T any, R any](collection []T, accumulator func(R, T, int) R, initial R) R { + for i, item := range collection { + initial = accumulator(initial, item, i) + } + + return initial +} + +// ForEach iterates over elements of collection and invokes iteratee for each element. +func ForEach[T any](collection []T, iteratee func(T, int)) { + for i, item := range collection { + iteratee(item, i) + } +} + +// Times invokes the iteratee n times, returning an array of the results of each invocation. +// The iteratee is invoked with index as argument. +func Times[T any](count int, iteratee func(int) T) []T { + result := make([]T, count) + + for i := 0; i < count; i++ { + result[i] = iteratee(i) + } + + return result +} + +// Uniq returns a duplicate-free version of an array, in which only the first occurrence of each element is kept. +// The order of result values is determined by the order they occur in the array. +func Uniq[T comparable](collection []T) []T { + result := make([]T, 0, len(collection)) + seen := make(map[T]struct{}, len(collection)) + + for _, item := range collection { + if _, ok := seen[item]; ok { + continue + } + + seen[item] = struct{}{} + result = append(result, item) + } + + return result +} + +// Uniq returns a duplicate-free version of an array, in which only the first occurrence of each element is kept. +// The order of result values is determined by the order they occur in the array. It accepts `iteratee` which is +// invoked for each element in array to generate the criterion by which uniqueness is computed. +func UniqBy[T any, U comparable](collection []T, iteratee func(T) U) []T { + result := make([]T, 0, len(collection)) + seen := make(map[U]struct{}, len(collection)) + + for _, item := range collection { + key := iteratee(item) + + if _, ok := seen[key]; ok { + continue + } + + seen[key] = struct{}{} + result = append(result, item) + } + + return result +} + +// GroupBy returns an object composed of keys generated from the results of running each element of collection through iteratee. +func GroupBy[T any, U comparable](collection []T, iteratee func(T) U) map[U][]T { + result := map[U][]T{} + + for _, item := range collection { + key := iteratee(item) + + if _, ok := result[key]; !ok { + result[key] = []T{} + } + + result[key] = append(result[key], item) + } + + return result +} + +// Chunk returns an array of elements split into groups the length of size. If array can't be split evenly, +// the final chunk will be the remaining elements. +func Chunk[T any](collection []T, size int) [][]T { + if size <= 0 { + panic("Second parameter must be greater than 0") + } + + result := make([][]T, 0, len(collection)/2+1) + length := len(collection) + + for i := 0; i < length; i++ { + chunk := i / size + + if i%size == 0 { + result = append(result, make([]T, 0, size)) + } + + result[chunk] = append(result[chunk], collection[i]) + } + + return result +} + +// PartitionBy returns an array of elements split into groups. The order of grouped values is +// determined by the order they occur in collection. The grouping is generated from the results +// of running each element of collection through iteratee. +func PartitionBy[T any, K comparable](collection []T, iteratee func(x T) K) [][]T { + result := [][]T{} + seen := map[K]int{} + + for _, item := range collection { + key := iteratee(item) + + resultIndex, ok := seen[key] + if !ok { + resultIndex = len(result) + seen[key] = resultIndex + result = append(result, []T{}) + } + + result[resultIndex] = append(result[resultIndex], item) + } + + return result + + // unordered: + // groups := GroupBy[T, K](collection, iteratee) + // return Values[K, []T](groups) +} + +// Flattens returns an array a single level deep. +func Flatten[T any](collection [][]T) []T { + result := []T{} + + for _, item := range collection { + result = append(result, item...) + } + + return result +} + +// Shuffle returns an array of shuffled values. Uses the Fisher-Yates shuffle algorithm. +func Shuffle[T any](collection []T) []T { + rand.Shuffle(len(collection), func(i, j int) { + collection[i], collection[j] = collection[j], collection[i] + }) + + return collection +} + +// Reverse reverses array so that the first element becomes the last, the second element becomes the second to last, and so on. +func Reverse[T any](collection []T) []T { + length := len(collection) + half := length / 2 + + for i := 0; i < half; i = i + 1 { + j := length - 1 - i + collection[i], collection[j] = collection[j], collection[i] + } + + return collection +} + +// Fill fills elements of array with `initial` value. +func Fill[T Clonable[T]](collection []T, initial T) []T { + result := make([]T, 0, len(collection)) + + for _ = range collection { + result = append(result, initial.Clone()) + } + + return result +} + +// Repeat builds a slice with N copies of initial value. +func Repeat[T Clonable[T]](count int, initial T) []T { + result := make([]T, 0, count) + + for i := 0; i < count; i++ { + result = append(result, initial.Clone()) + } + + return result +} + +// KeyBy transforms a slice or an array of structs to a map based on a pivot callback. +func KeyBy[K comparable, V any](collection []V, iteratee func(V) K) map[K]V { + result := make(map[K]V, len(collection)) + + for _, v := range collection { + k := iteratee(v) + result[k] = v + } + + return result +} diff --git a/vendor/github.com/samber/lo/tuples.go b/vendor/github.com/samber/lo/tuples.go new file mode 100644 index 000000000..6439952b8 --- /dev/null +++ b/vendor/github.com/samber/lo/tuples.go @@ -0,0 +1,413 @@ +package lo + +func longestCollection(collections ...[]interface{}) int { + max := 0 + + for _, collection := range collections { + if len(collection) > max { + max = len(collection) + } + } + + return max +} + +// Zip2 creates a slice of grouped elements, the first of which contains the first elements +// of the given arrays, the second of which contains the second elements of the given arrays, and so on. +// When collections have different size, the Tuple attributes are filled with zero value. +func Zip2[A any, B any](a []A, b []B) []Tuple2[A, B] { + size := Max[int]([]int{len(a), len(b)}) + + result := make([]Tuple2[A, B], 0, size) + + for index := 0; index < size; index++ { + _a, _ := Nth[A](a, index) + _b, _ := Nth[B](b, index) + + result = append(result, Tuple2[A, B]{ + A: _a, + B: _b, + }) + } + + return result +} + +// Zip3 creates a slice of grouped elements, the first of which contains the first elements +// of the given arrays, the second of which contains the second elements of the given arrays, and so on. +// When collections have different size, the Tuple attributes are filled with zero value. +func Zip3[A any, B any, C any](a []A, b []B, c []C) []Tuple3[A, B, C] { + size := Max[int]([]int{len(a), len(b), len(c)}) + + result := make([]Tuple3[A, B, C], 0, size) + + for index := 0; index < size; index++ { + _a, _ := Nth[A](a, index) + _b, _ := Nth[B](b, index) + _c, _ := Nth[C](c, index) + + result = append(result, Tuple3[A, B, C]{ + A: _a, + B: _b, + C: _c, + }) + } + + return result +} + +// Zip4 creates a slice of grouped elements, the first of which contains the first elements +// of the given arrays, the second of which contains the second elements of the given arrays, and so on. +// When collections have different size, the Tuple attributes are filled with zero value. +func Zip4[A any, B any, C any, D any](a []A, b []B, c []C, d []D) []Tuple4[A, B, C, D] { + size := Max[int]([]int{len(a), len(b), len(c), len(d)}) + + result := make([]Tuple4[A, B, C, D], 0, size) + + for index := 0; index < size; index++ { + _a, _ := Nth[A](a, index) + _b, _ := Nth[B](b, index) + _c, _ := Nth[C](c, index) + _d, _ := Nth[D](d, index) + + result = append(result, Tuple4[A, B, C, D]{ + A: _a, + B: _b, + C: _c, + D: _d, + }) + } + + return result +} + +// Zip5 creates a slice of grouped elements, the first of which contains the first elements +// of the given arrays, the second of which contains the second elements of the given arrays, and so on. +// When collections have different size, the Tuple attributes are filled with zero value. +func Zip5[A any, B any, C any, D any, E any](a []A, b []B, c []C, d []D, e []E) []Tuple5[A, B, C, D, E] { + size := Max[int]([]int{len(a), len(b), len(c), len(d), len(e)}) + + result := make([]Tuple5[A, B, C, D, E], 0, size) + + for index := 0; index < size; index++ { + _a, _ := Nth[A](a, index) + _b, _ := Nth[B](b, index) + _c, _ := Nth[C](c, index) + _d, _ := Nth[D](d, index) + _e, _ := Nth[E](e, index) + + result = append(result, Tuple5[A, B, C, D, E]{ + A: _a, + B: _b, + C: _c, + D: _d, + E: _e, + }) + } + + return result +} + +// Zip6 creates a slice of grouped elements, the first of which contains the first elements +// of the given arrays, the second of which contains the second elements of the given arrays, and so on. +// When collections have different size, the Tuple attributes are filled with zero value. +func Zip6[A any, B any, C any, D any, E any, F any](a []A, b []B, c []C, d []D, e []E, f []F) []Tuple6[A, B, C, D, E, F] { + size := Max[int]([]int{len(a), len(b), len(c), len(d), len(e), len(f)}) + + result := make([]Tuple6[A, B, C, D, E, F], 0, size) + + for index := 0; index < size; index++ { + _a, _ := Nth[A](a, index) + _b, _ := Nth[B](b, index) + _c, _ := Nth[C](c, index) + _d, _ := Nth[D](d, index) + _e, _ := Nth[E](e, index) + _f, _ := Nth[F](f, index) + + result = append(result, Tuple6[A, B, C, D, E, F]{ + A: _a, + B: _b, + C: _c, + D: _d, + E: _e, + F: _f, + }) + } + + return result +} + +// Zip7 creates a slice of grouped elements, the first of which contains the first elements +// of the given arrays, the second of which contains the second elements of the given arrays, and so on. +// When collections have different size, the Tuple attributes are filled with zero value. +func Zip7[A any, B any, C any, D any, E any, F any, G any](a []A, b []B, c []C, d []D, e []E, f []F, g []G) []Tuple7[A, B, C, D, E, F, G] { + size := Max[int]([]int{len(a), len(b), len(c), len(d), len(e), len(f), len(g)}) + + result := make([]Tuple7[A, B, C, D, E, F, G], 0, size) + + for index := 0; index < size; index++ { + _a, _ := Nth[A](a, index) + _b, _ := Nth[B](b, index) + _c, _ := Nth[C](c, index) + _d, _ := Nth[D](d, index) + _e, _ := Nth[E](e, index) + _f, _ := Nth[F](f, index) + _g, _ := Nth[G](g, index) + + result = append(result, Tuple7[A, B, C, D, E, F, G]{ + A: _a, + B: _b, + C: _c, + D: _d, + E: _e, + F: _f, + G: _g, + }) + } + + return result +} + +// Zip8 creates a slice of grouped elements, the first of which contains the first elements +// of the given arrays, the second of which contains the second elements of the given arrays, and so on. +// When collections have different size, the Tuple attributes are filled with zero value. +func Zip8[A any, B any, C any, D any, E any, F any, G any, H any](a []A, b []B, c []C, d []D, e []E, f []F, g []G, h []H) []Tuple8[A, B, C, D, E, F, G, H] { + size := Max[int]([]int{len(a), len(b), len(c), len(d), len(e), len(f), len(g), len(h)}) + + result := make([]Tuple8[A, B, C, D, E, F, G, H], 0, size) + + for index := 0; index < size; index++ { + _a, _ := Nth[A](a, index) + _b, _ := Nth[B](b, index) + _c, _ := Nth[C](c, index) + _d, _ := Nth[D](d, index) + _e, _ := Nth[E](e, index) + _f, _ := Nth[F](f, index) + _g, _ := Nth[G](g, index) + _h, _ := Nth[H](h, index) + + result = append(result, Tuple8[A, B, C, D, E, F, G, H]{ + A: _a, + B: _b, + C: _c, + D: _d, + E: _e, + F: _f, + G: _g, + H: _h, + }) + } + + return result +} + +// Zip9 creates a slice of grouped elements, the first of which contains the first elements +// of the given arrays, the second of which contains the second elements of the given arrays, and so on. +// When collections have different size, the Tuple attributes are filled with zero value. +func Zip9[A any, B any, C any, D any, E any, F any, G any, H any, I any](a []A, b []B, c []C, d []D, e []E, f []F, g []G, h []H, i []I) []Tuple9[A, B, C, D, E, F, G, H, I] { + size := Max[int]([]int{len(a), len(b), len(c), len(d), len(e), len(f), len(g), len(h), len(i)}) + + result := make([]Tuple9[A, B, C, D, E, F, G, H, I], 0, size) + + for index := 0; index < size; index++ { + _a, _ := Nth[A](a, index) + _b, _ := Nth[B](b, index) + _c, _ := Nth[C](c, index) + _d, _ := Nth[D](d, index) + _e, _ := Nth[E](e, index) + _f, _ := Nth[F](f, index) + _g, _ := Nth[G](g, index) + _h, _ := Nth[H](h, index) + _i, _ := Nth[I](i, index) + + result = append(result, Tuple9[A, B, C, D, E, F, G, H, I]{ + A: _a, + B: _b, + C: _c, + D: _d, + E: _e, + F: _f, + G: _g, + H: _h, + I: _i, + }) + } + + return result +} + +// Unzip2 accepts an array of grouped elements and creates an array regrouping the elements +// to their pre-zip configuration. +func Unzip2[A any, B any](tuples []Tuple2[A, B]) ([]A, []B) { + size := len(tuples) + r1 := make([]A, 0, size) + r2 := make([]B, 0, size) + + for _, tuple := range tuples { + r1 = append(r1, tuple.A) + r2 = append(r2, tuple.B) + } + + return r1, r2 +} + +// Unzip3 accepts an array of grouped elements and creates an array regrouping the elements +// to their pre-zip configuration. +func Unzip3[A any, B any, C any](tuples []Tuple3[A, B, C]) ([]A, []B, []C) { + size := len(tuples) + r1 := make([]A, 0, size) + r2 := make([]B, 0, size) + r3 := make([]C, 0, size) + + for _, tuple := range tuples { + r1 = append(r1, tuple.A) + r2 = append(r2, tuple.B) + r3 = append(r3, tuple.C) + } + + return r1, r2, r3 +} + +// Unzip4 accepts an array of grouped elements and creates an array regrouping the elements +// to their pre-zip configuration. +func Unzip4[A any, B any, C any, D any](tuples []Tuple4[A, B, C, D]) ([]A, []B, []C, []D) { + size := len(tuples) + r1 := make([]A, 0, size) + r2 := make([]B, 0, size) + r3 := make([]C, 0, size) + r4 := make([]D, 0, size) + + for _, tuple := range tuples { + r1 = append(r1, tuple.A) + r2 = append(r2, tuple.B) + r3 = append(r3, tuple.C) + r4 = append(r4, tuple.D) + } + + return r1, r2, r3, r4 +} + +// Unzip5 accepts an array of grouped elements and creates an array regrouping the elements +// to their pre-zip configuration. +func Unzip5[A any, B any, C any, D any, E any](tuples []Tuple5[A, B, C, D, E]) ([]A, []B, []C, []D, []E) { + size := len(tuples) + r1 := make([]A, 0, size) + r2 := make([]B, 0, size) + r3 := make([]C, 0, size) + r4 := make([]D, 0, size) + r5 := make([]E, 0, size) + + for _, tuple := range tuples { + r1 = append(r1, tuple.A) + r2 = append(r2, tuple.B) + r3 = append(r3, tuple.C) + r4 = append(r4, tuple.D) + r5 = append(r5, tuple.E) + } + + return r1, r2, r3, r4, r5 +} + +// Unzip6 accepts an array of grouped elements and creates an array regrouping the elements +// to their pre-zip configuration. +func Unzip6[A any, B any, C any, D any, E any, F any](tuples []Tuple6[A, B, C, D, E, F]) ([]A, []B, []C, []D, []E, []F) { + size := len(tuples) + r1 := make([]A, 0, size) + r2 := make([]B, 0, size) + r3 := make([]C, 0, size) + r4 := make([]D, 0, size) + r5 := make([]E, 0, size) + r6 := make([]F, 0, size) + + for _, tuple := range tuples { + r1 = append(r1, tuple.A) + r2 = append(r2, tuple.B) + r3 = append(r3, tuple.C) + r4 = append(r4, tuple.D) + r5 = append(r5, tuple.E) + r6 = append(r6, tuple.F) + } + + return r1, r2, r3, r4, r5, r6 +} + +// Unzip7 accepts an array of grouped elements and creates an array regrouping the elements +// to their pre-zip configuration. +func Unzip7[A any, B any, C any, D any, E any, F any, G any](tuples []Tuple7[A, B, C, D, E, F, G]) ([]A, []B, []C, []D, []E, []F, []G) { + size := len(tuples) + r1 := make([]A, 0, size) + r2 := make([]B, 0, size) + r3 := make([]C, 0, size) + r4 := make([]D, 0, size) + r5 := make([]E, 0, size) + r6 := make([]F, 0, size) + r7 := make([]G, 0, size) + + for _, tuple := range tuples { + r1 = append(r1, tuple.A) + r2 = append(r2, tuple.B) + r3 = append(r3, tuple.C) + r4 = append(r4, tuple.D) + r5 = append(r5, tuple.E) + r6 = append(r6, tuple.F) + r7 = append(r7, tuple.G) + } + + return r1, r2, r3, r4, r5, r6, r7 +} + +// Unzip8 accepts an array of grouped elements and creates an array regrouping the elements +// to their pre-zip configuration. +func Unzip8[A any, B any, C any, D any, E any, F any, G any, H any](tuples []Tuple8[A, B, C, D, E, F, G, H]) ([]A, []B, []C, []D, []E, []F, []G, []H) { + size := len(tuples) + r1 := make([]A, 0, size) + r2 := make([]B, 0, size) + r3 := make([]C, 0, size) + r4 := make([]D, 0, size) + r5 := make([]E, 0, size) + r6 := make([]F, 0, size) + r7 := make([]G, 0, size) + r8 := make([]H, 0, size) + + for _, tuple := range tuples { + r1 = append(r1, tuple.A) + r2 = append(r2, tuple.B) + r3 = append(r3, tuple.C) + r4 = append(r4, tuple.D) + r5 = append(r5, tuple.E) + r6 = append(r6, tuple.F) + r7 = append(r7, tuple.G) + r8 = append(r8, tuple.H) + } + + return r1, r2, r3, r4, r5, r6, r7, r8 +} + +// Unzip9 accepts an array of grouped elements and creates an array regrouping the elements +// to their pre-zip configuration. +func Unzip9[A any, B any, C any, D any, E any, F any, G any, H any, I any](tuples []Tuple9[A, B, C, D, E, F, G, H, I]) ([]A, []B, []C, []D, []E, []F, []G, []H, []I) { + size := len(tuples) + r1 := make([]A, 0, size) + r2 := make([]B, 0, size) + r3 := make([]C, 0, size) + r4 := make([]D, 0, size) + r5 := make([]E, 0, size) + r6 := make([]F, 0, size) + r7 := make([]G, 0, size) + r8 := make([]H, 0, size) + r9 := make([]I, 0, size) + + for _, tuple := range tuples { + r1 = append(r1, tuple.A) + r2 = append(r2, tuple.B) + r3 = append(r3, tuple.C) + r4 = append(r4, tuple.D) + r5 = append(r5, tuple.E) + r6 = append(r6, tuple.F) + r7 = append(r7, tuple.G) + r8 = append(r8, tuple.H) + r9 = append(r9, tuple.I) + } + + return r1, r2, r3, r4, r5, r6, r7, r8, r9 +} diff --git a/vendor/github.com/samber/lo/types.go b/vendor/github.com/samber/lo/types.go new file mode 100644 index 000000000..5361a02a1 --- /dev/null +++ b/vendor/github.com/samber/lo/types.go @@ -0,0 +1,83 @@ +package lo + +// Entry defines a key/value pairs. +type Entry[K comparable, V any] struct { + Key K + Value V +} + +// Tuple2 is a group of 2 elements (pair). +type Tuple2[A any, B any] struct { + A A + B B +} + +// Tuple3 is a group of 3 elements. +type Tuple3[A any, B any, C any] struct { + A A + B B + C C +} + +// Tuple4 is a group of 4 elements. +type Tuple4[A any, B any, C any, D any] struct { + A A + B B + C C + D D +} + +// Tuple5 is a group of 5 elements. +type Tuple5[A any, B any, C any, D any, E any] struct { + A A + B B + C C + D D + E E +} + +// Tuple6 is a group of 6 elements. +type Tuple6[A any, B any, C any, D any, E any, F any] struct { + A A + B B + C C + D D + E E + F F +} + +// Tuple7 is a group of 7 elements. +type Tuple7[A any, B any, C any, D any, E any, F any, G any] struct { + A A + B B + C C + D D + E E + F F + G G +} + +// Tuple8 is a group of 8 elements. +type Tuple8[A any, B any, C any, D any, E any, F any, G any, H any] struct { + A A + B B + C C + D D + E E + F F + G G + H H +} + +// Tuple9 is a group of 9 elements. +type Tuple9[A any, B any, C any, D any, E any, F any, G any, H any, I any] struct { + A A + B B + C C + D D + E E + F F + G G + H H + I I +} diff --git a/vendor/github.com/samber/lo/util.go b/vendor/github.com/samber/lo/util.go new file mode 100644 index 000000000..41ca9c80c --- /dev/null +++ b/vendor/github.com/samber/lo/util.go @@ -0,0 +1,50 @@ +package lo + +import "golang.org/x/exp/constraints" + +// Range creates an array of numbers (positive and/or negative) with given length. +func Range(elementNum int) []int { + length := If(elementNum < 0, -elementNum).Else(elementNum) + result := make([]int, length) + step := If(elementNum < 0, -1).Else(1) + for i, j := 0, 0; i < length; i, j = i+1, j+step { + result[i] = j + } + return result +} + +// RangeFrom creates an array of numbers from start with specified length. +func RangeFrom[T constraints.Integer | constraints.Float](start T, elementNum int) []T { + length := If(elementNum < 0, -elementNum).Else(elementNum) + result := make([]T, length) + step := If(elementNum < 0, -1).Else(1) + for i, j := 0, start; i < length; i, j = i+1, j+T(step) { + result[i] = j + } + return result +} + +// RangeWithSteps creates an array of numbers (positive and/or negative) progressing from start up to, but not including end. +// step set to zero will return empty array. +func RangeWithSteps[T constraints.Integer | constraints.Float](start, end, step T) []T { + result := []T{} + if start == end || step == 0 { + return result + } + if start < end { + if step < 0 { + return result + } + for i := start; i < end; i += step { + result = append(result, i) + } + return result + } + if step > 0 { + return result + } + for i := start; i > end; i += step { + result = append(result, i) + } + return result +} diff --git a/vendor/github.com/sanity-io/litter/go.mod b/vendor/github.com/sanity-io/litter/go.mod deleted file mode 100644 index c1c20c939..000000000 --- a/vendor/github.com/sanity-io/litter/go.mod +++ /dev/null @@ -1,9 +0,0 @@ -module github.com/sanity-io/litter - -go 1.14 - -require ( - github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b // indirect - github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0 // indirect - github.com/stretchr/testify v0.0.0-20161117074351-18a02ba4a312 -) diff --git a/vendor/github.com/sanity-io/litter/go.sum b/vendor/github.com/sanity-io/litter/go.sum deleted file mode 100644 index 800ae0053..000000000 --- a/vendor/github.com/sanity-io/litter/go.sum +++ /dev/null @@ -1,6 +0,0 @@ -github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b h1:XxMZvQZtTXpWMNWK82vdjCLCe7uGMFXdTsJH0v3Hkvw= -github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0 h1:GD+A8+e+wFkqje55/2fOVnZPkoDIu1VooBWfNrnY8Uo= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/testify v0.0.0-20161117074351-18a02ba4a312 h1:UsFdQ3ZmlzS0BqZYGxvYaXvFGUbCmPGy8DM7qWJJiIQ= -github.com/stretchr/testify v0.0.0-20161117074351-18a02ba4a312/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= diff --git a/vendor/github.com/sasha-s/go-deadlock/LICENSE b/vendor/github.com/sasha-s/go-deadlock/LICENSE new file mode 100644 index 000000000..8dada3eda --- /dev/null +++ b/vendor/github.com/sasha-s/go-deadlock/LICENSE @@ -0,0 +1,201 @@ + 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. diff --git a/vendor/github.com/sasha-s/go-deadlock/Readme.md b/vendor/github.com/sasha-s/go-deadlock/Readme.md new file mode 100644 index 000000000..e25cb9e31 --- /dev/null +++ b/vendor/github.com/sasha-s/go-deadlock/Readme.md @@ -0,0 +1,187 @@ +# Online deadlock detection in go (golang). [![Try it online](https://img.shields.io/badge/try%20it-online-blue.svg)](https://wandbox.org/permlink/hJc6QCZowxbNm9WW) [![Docs](https://godoc.org/github.com/sasha-s/go-deadlock?status.svg)](https://godoc.org/github.com/sasha-s/go-deadlock) [![Build Status](https://travis-ci.org/sasha-s/go-deadlock.svg?branch=master)](https://travis-ci.org/sasha-s/go-deadlock) [![codecov](https://codecov.io/gh/sasha-s/go-deadlock/branch/master/graph/badge.svg)](https://codecov.io/gh/sasha-s/go-deadlock) [![version](https://badge.fury.io/gh/sasha-s%2Fgo-deadlock.svg)](https://github.com/sasha-s/go-deadlock/releases) [![Go Report Card](https://goreportcard.com/badge/github.com/sasha-s/go-deadlock)](https://goreportcard.com/report/github.com/sasha-s/go-deadlock) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) + +## Why +Deadlocks happen and are painful to debug. + +## What +go-deadlock provides (RW)Mutex drop-in replacements for sync.(RW)Mutex. +It would not work if you create a spaghetti of channels. +Mutexes only. + +## Installation +```sh +go get github.com/sasha-s/go-deadlock/... +``` + +## Usage +```go +import "github.com/sasha-s/go-deadlock" +var mu deadlock.Mutex +// Use normally, it works exactly like sync.Mutex does. +mu.Lock() + +defer mu.Unlock() +// Or +var rw deadlock.RWMutex +rw.RLock() +defer rw.RUnlock() +``` + +### Deadlocks +One of the most common sources of deadlocks is inconsistent lock ordering: +say, you have two mutexes A and B, and in some goroutines you have +```go +A.Lock() // defer A.Unlock() or similar. +... +B.Lock() // defer B.Unlock() or similar. +``` +And in another goroutine the order of locks is reversed: +```go +B.Lock() // defer B.Unlock() or similar. +... +A.Lock() // defer A.Unlock() or similar. +``` + +Another common sources of deadlocks is duplicate take a lock in a goroutine: +``` +A.Rlock() or lock() + +A.lock() or A.RLock() +``` + +This does not guarantee a deadlock (maybe the goroutines above can never be running at the same time), but it usually a design flaw at least. + +go-deadlock can detect such cases (unless you cross goroutine boundary - say lock A, then spawn a goroutine, block until it is singals, and lock B inside of the goroutine), even if the deadlock itself happens very infrequently and is painful to reproduce! + +Each time go-deadlock sees a lock attempt for lock B, it records the order A before B, for each lock that is currently being held in the same goroutine, and it prints (and exits the program by default) when it sees the locking order being violated. + +In addition, if it sees that we are waiting on a lock for a long time (opts.DeadlockTimeout, 30 seconds by default), it reports a potential deadlock, also printing the stacktrace for a goroutine that is currently holding the lock we are desperately trying to grab. + + +## Sample output +#### Inconsistent lock ordering: +``` +POTENTIAL DEADLOCK: Inconsistent locking. saw this ordering in one goroutine: +happened before +inmem.go:623 bttest.(*server).ReadModifyWriteRow { r.mu.Lock() } <<<<< +inmem_test.go:118 bttest.TestConcurrentMutationsReadModifyAndGC.func4 { _, _ = s.ReadModifyWriteRow(ctx, rmw()) } + +happened after +inmem.go:629 bttest.(*server).ReadModifyWriteRow { tbl.mu.RLock() } <<<<< +inmem_test.go:118 bttest.TestConcurrentMutationsReadModifyAndGC.func4 { _, _ = s.ReadModifyWriteRow(ctx, rmw()) } + +in another goroutine: happened before +inmem.go:799 bttest.(*table).gc { t.mu.RLock() } <<<<< +inmem_test.go:125 bttest.TestConcurrentMutationsReadModifyAndGC.func5 { tbl.gc() } + +happend after +inmem.go:814 bttest.(*table).gc { r.mu.Lock() } <<<<< +inmem_test.go:125 bttest.TestConcurrentMutationsReadModifyAndGC.func5 { tbl.gc() } +``` + +#### Waiting for a lock for a long time: + +``` +POTENTIAL DEADLOCK: +Previous place where the lock was grabbed +goroutine 240 lock 0xc820160440 +inmem.go:799 bttest.(*table).gc { t.mu.RLock() } <<<<< +inmem_test.go:125 bttest.TestConcurrentMutationsReadModifyAndGC.func5 { tbl.gc() } + +Have been trying to lock it again for more than 40ms +goroutine 68 lock 0xc820160440 +inmem.go:785 bttest.(*table).mutableRow { t.mu.Lock() } <<<<< +inmem.go:428 bttest.(*server).MutateRow { r := tbl.mutableRow(string(req.RowKey)) } +inmem_test.go:111 bttest.TestConcurrentMutationsReadModifyAndGC.func3 { s.MutateRow(ctx, req) } + + +Here is what goroutine 240 doing now +goroutine 240 [select]: +github.com/sasha-s/go-deadlock.lock(0xc82028ca10, 0x5189e0, 0xc82013a9b0) + /Users/sasha/go/src/github.com/sasha-s/go-deadlock/deadlock.go:163 +0x1640 +github.com/sasha-s/go-deadlock.(*Mutex).Lock(0xc82013a9b0) + /Users/sasha/go/src/github.com/sasha-s/go-deadlock/deadlock.go:54 +0x86 +google.golang.org/cloud/bigtable/bttest.(*table).gc(0xc820160440) + /Users/sasha/go/src/google.golang.org/cloud/bigtable/bttest/inmem.go:814 +0x28d +google.golang.org/cloud/bigtable/bttest.TestConcurrentMutationsReadModifyAndGC.func5(0xc82015c760, 0xc820160440) /Users/sasha/go/src/google.golang.org/cloud/bigtable/bttest/inmem_test.go:125 +0x48 +created by google.golang.org/cloud/bigtable/bttest.TestConcurrentMutationsReadModifyAndGC + /Users/sasha/go/src/google.golang.org/cloud/bigtable/bttest/inmem_test.go:126 +0xb6f +``` + +## Used in +[cockroachdb: Potential deadlock between Gossip.SetStorage and Node.gossipStores](https://github.com/cockroachdb/cockroach/issues/7972) + +[bigtable/bttest: A race between GC and row mutations](https://code-review.googlesource.com#/c/5301/) + +## Need a mutex that works with net.context? +I have [one](https://github.com/sasha-s/go-csync). + +## Grabbing an RLock twice from the same goroutine +This is, surprisingly, not a good idea! + +From [RWMutex](https://golang.org/pkg/sync/#RWMutex) docs: + +>If a goroutine holds a RWMutex for reading and another goroutine might call Lock, no goroutine should expect to be able to acquire a read lock until the initial read lock is released. In particular, this prohibits recursive read locking. This is to ensure that the lock eventually becomes available; a blocked Lock call excludes new readers from acquiring the lock. + + +The following code will deadlock — [run the example on playground](https://play.golang.org/p/AkL-W63nq5f) or [try it online with go-deadlock on wandbox](https://wandbox.org/permlink/JwnL0GMySBju4SII): +```go +package main + +import ( + "fmt" + "sync" +) + +func main() { + var mu sync.RWMutex + + chrlockTwice := make(chan struct{}) // Used to control rlockTwice + rlockTwice := func() { + mu.RLock() + fmt.Println("first Rlock succeeded") + <-chrlockTwice + <-chrlockTwice + fmt.Println("trying to Rlock again") + mu.RLock() + fmt.Println("second Rlock succeeded") + mu.RUnlock() + mu.RUnlock() + } + + chLock := make(chan struct{}) // Used to contol lock + lock := func() { + <-chLock + fmt.Println("about to Lock") + mu.Lock() + fmt.Println("Lock succeeded") + mu.Unlock() + <-chLock + } + + control := func() { + chrlockTwice <- struct{}{} + chLock <- struct{}{} + + close(chrlockTwice) + close(chLock) + } + + go control() + go lock() + rlockTwice() +} +``` +## Configuring go-deadlock + +Have a look at [Opts](https://pkg.go.dev/github.com/sasha-s/go-deadlock#pkg-variables). + +* `Opts.Disable`: disables deadlock detection altogether +* `Opts.DisableLockOrderDetection`: disables lock order based deadlock detection. +* `Opts.DeadlockTimeout`: blocking on mutex for longer than DeadlockTimeout is considered a deadlock. ignored if negative +* `Opts.OnPotentialDeadlock`: callback for then deadlock is detected +* `Opts.MaxMapSize`: size of happens before // happens after table +* `Opts.PrintAllCurrentGoroutines`: dump stacktraces of all goroutines when inconsistent locking is detected, verbose +* `Opts.LogBuf`: where to write deadlock info/stacktraces + + diff --git a/vendor/github.com/sasha-s/go-deadlock/deadlock.go b/vendor/github.com/sasha-s/go-deadlock/deadlock.go new file mode 100644 index 000000000..558bc42e8 --- /dev/null +++ b/vendor/github.com/sasha-s/go-deadlock/deadlock.go @@ -0,0 +1,363 @@ +package deadlock + +import ( + "bufio" + "bytes" + "fmt" + "io" + "os" + "sync" + "time" + + "github.com/petermattis/goid" +) + +// Opts control how deadlock detection behaves. +// Options are supposed to be set once at a startup (say, when parsing flags). +var Opts = struct { + // Mutex/RWMutex would work exactly as their sync counterparts + // -- almost no runtime penalty, no deadlock detection if Disable == true. + Disable bool + // Would disable lock order based deadlock detection if DisableLockOrderDetection == true. + DisableLockOrderDetection bool + // Waiting for a lock for longer than DeadlockTimeout is considered a deadlock. + // Ignored is DeadlockTimeout <= 0. + DeadlockTimeout time.Duration + // OnPotentialDeadlock is called each time a potential deadlock is detected -- either based on + // lock order or on lock wait time. + OnPotentialDeadlock func() + // Will keep MaxMapSize lock pairs (happens before // happens after) in the map. + // The map resets once the threshold is reached. + MaxMapSize int + // Will dump stacktraces of all goroutines when inconsistent locking is detected. + PrintAllCurrentGoroutines bool + mu *sync.Mutex // Protects the LogBuf. + // Will print deadlock info to log buffer. + LogBuf io.Writer +}{ + DeadlockTimeout: time.Second * 30, + OnPotentialDeadlock: func() { + os.Exit(2) + }, + MaxMapSize: 1024 * 64, + mu: &sync.Mutex{}, + LogBuf: os.Stderr, +} + +// Cond is sync.Cond wrapper +type Cond struct { + sync.Cond +} + +// Locker is sync.Locker wrapper +type Locker struct { + sync.Locker +} + +// Once is sync.Once wrapper +type Once struct { + sync.Once +} + +// Pool is sync.Poll wrapper +type Pool struct { + sync.Pool +} + +// WaitGroup is sync.WaitGroup wrapper +type WaitGroup struct { + sync.WaitGroup +} + +// A Mutex is a drop-in replacement for sync.Mutex. +// Performs deadlock detection unless disabled in Opts. +type Mutex struct { + mu sync.Mutex +} + +// Lock locks the mutex. +// If the lock is already in use, the calling goroutine +// blocks until the mutex is available. +// +// Unless deadlock detection is disabled, logs potential deadlocks to Opts.LogBuf, +// calling Opts.OnPotentialDeadlock on each occasion. +func (m *Mutex) Lock() { + lock(m.mu.Lock, m) +} + +// Unlock unlocks the mutex. +// It is a run-time error if m is not locked on entry to Unlock. +// +// A locked Mutex is not associated with a particular goroutine. +// It is allowed for one goroutine to lock a Mutex and then +// arrange for another goroutine to unlock it. +func (m *Mutex) Unlock() { + m.mu.Unlock() + if !Opts.Disable { + postUnlock(m) + } +} + +// An RWMutex is a drop-in replacement for sync.RWMutex. +// Performs deadlock detection unless disabled in Opts. +type RWMutex struct { + mu sync.RWMutex +} + +// Lock locks rw for writing. +// If the lock is already locked for reading or writing, +// Lock blocks until the lock is available. +// To ensure that the lock eventually becomes available, +// a blocked Lock call excludes new readers from acquiring +// the lock. +// +// Unless deadlock detection is disabled, logs potential deadlocks to Opts.LogBuf, +// calling Opts.OnPotentialDeadlock on each occasion. +func (m *RWMutex) Lock() { + lock(m.mu.Lock, m) +} + +// Unlock unlocks the mutex for writing. It is a run-time error if rw is +// not locked for writing on entry to Unlock. +// +// As with Mutexes, a locked RWMutex is not associated with a particular +// goroutine. One goroutine may RLock (Lock) an RWMutex and then +// arrange for another goroutine to RUnlock (Unlock) it. +func (m *RWMutex) Unlock() { + m.mu.Unlock() + if !Opts.Disable { + postUnlock(m) + } +} + +// RLock locks the mutex for reading. +// +// Unless deadlock detection is disabled, logs potential deadlocks to Opts.LogBuf, +// calling Opts.OnPotentialDeadlock on each occasion. +func (m *RWMutex) RLock() { + lock(m.mu.RLock, m) +} + +// RUnlock undoes a single RLock call; +// it does not affect other simultaneous readers. +// It is a run-time error if rw is not locked for reading +// on entry to RUnlock. +func (m *RWMutex) RUnlock() { + m.mu.RUnlock() + if !Opts.Disable { + postUnlock(m) + } +} + +// RLocker returns a Locker interface that implements +// the Lock and Unlock methods by calling RLock and RUnlock. +func (m *RWMutex) RLocker() sync.Locker { + return (*rlocker)(m) +} + +func preLock(stack []uintptr, p interface{}) { + lo.preLock(stack, p) +} + +func postLock(stack []uintptr, p interface{}) { + lo.postLock(stack, p) +} + +func postUnlock(p interface{}) { + lo.postUnlock(p) +} + +func lock(lockFn func(), ptr interface{}) { + if Opts.Disable { + lockFn() + return + } + stack := callers(1) + preLock(stack, ptr) + if Opts.DeadlockTimeout <= 0 { + lockFn() + } else { + ch := make(chan struct{}) + currentID := goid.Get() + go func() { + for { + t := time.NewTimer(Opts.DeadlockTimeout) + defer t.Stop() // This runs after the losure finishes, but it's OK. + select { + case <-t.C: + lo.mu.Lock() + prev, ok := lo.cur[ptr] + if !ok { + lo.mu.Unlock() + break // Nobody seems to be holding the lock, try again. + } + Opts.mu.Lock() + fmt.Fprintln(Opts.LogBuf, header) + fmt.Fprintln(Opts.LogBuf, "Previous place where the lock was grabbed") + fmt.Fprintf(Opts.LogBuf, "goroutine %v lock %p\n", prev.gid, ptr) + printStack(Opts.LogBuf, prev.stack) + fmt.Fprintln(Opts.LogBuf, "Have been trying to lock it again for more than", Opts.DeadlockTimeout) + fmt.Fprintf(Opts.LogBuf, "goroutine %v lock %p\n", currentID, ptr) + printStack(Opts.LogBuf, stack) + stacks := stacks() + grs := bytes.Split(stacks, []byte("\n\n")) + for _, g := range grs { + if goid.ExtractGID(g) == prev.gid { + fmt.Fprintln(Opts.LogBuf, "Here is what goroutine", prev.gid, "doing now") + Opts.LogBuf.Write(g) + fmt.Fprintln(Opts.LogBuf) + } + } + lo.other(ptr) + if Opts.PrintAllCurrentGoroutines { + fmt.Fprintln(Opts.LogBuf, "All current goroutines:") + Opts.LogBuf.Write(stacks) + } + fmt.Fprintln(Opts.LogBuf) + if buf, ok := Opts.LogBuf.(*bufio.Writer); ok { + buf.Flush() + } + Opts.mu.Unlock() + lo.mu.Unlock() + Opts.OnPotentialDeadlock() + <-ch + return + case <-ch: + return + } + } + }() + lockFn() + postLock(stack, ptr) + close(ch) + return + } + postLock(stack, ptr) +} + +type lockOrder struct { + mu sync.Mutex + cur map[interface{}]stackGID // stacktraces + gids for the locks currently taken. + order map[beforeAfter]ss // expected order of locks. +} + +type stackGID struct { + stack []uintptr + gid int64 +} + +type beforeAfter struct { + before interface{} + after interface{} +} + +type ss struct { + before []uintptr + after []uintptr +} + +var lo = newLockOrder() + +func newLockOrder() *lockOrder { + return &lockOrder{ + cur: map[interface{}]stackGID{}, + order: map[beforeAfter]ss{}, + } +} + +func (l *lockOrder) postLock(stack []uintptr, p interface{}) { + gid := goid.Get() + l.mu.Lock() + l.cur[p] = stackGID{stack, gid} + l.mu.Unlock() +} + +func (l *lockOrder) preLock(stack []uintptr, p interface{}) { + if Opts.DisableLockOrderDetection { + return + } + gid := goid.Get() + l.mu.Lock() + for b, bs := range l.cur { + if b == p { + if bs.gid == gid { + Opts.mu.Lock() + fmt.Fprintln(Opts.LogBuf, header, "Recursive locking:") + fmt.Fprintf(Opts.LogBuf, "current goroutine %d lock %p\n", gid, b) + printStack(Opts.LogBuf, stack) + fmt.Fprintln(Opts.LogBuf, "Previous place where the lock was grabbed (same goroutine)") + printStack(Opts.LogBuf, bs.stack) + l.other(p) + if buf, ok := Opts.LogBuf.(*bufio.Writer); ok { + buf.Flush() + } + Opts.mu.Unlock() + Opts.OnPotentialDeadlock() + } + continue + } + if bs.gid != gid { // We want locks taken in the same goroutine only. + continue + } + if s, ok := l.order[beforeAfter{p, b}]; ok { + Opts.mu.Lock() + fmt.Fprintln(Opts.LogBuf, header, "Inconsistent locking. saw this ordering in one goroutine:") + fmt.Fprintln(Opts.LogBuf, "happened before") + printStack(Opts.LogBuf, s.before) + fmt.Fprintln(Opts.LogBuf, "happened after") + printStack(Opts.LogBuf, s.after) + fmt.Fprintln(Opts.LogBuf, "in another goroutine: happened before") + printStack(Opts.LogBuf, bs.stack) + fmt.Fprintln(Opts.LogBuf, "happened after") + printStack(Opts.LogBuf, stack) + l.other(p) + fmt.Fprintln(Opts.LogBuf) + if buf, ok := Opts.LogBuf.(*bufio.Writer); ok { + buf.Flush() + } + Opts.mu.Unlock() + Opts.OnPotentialDeadlock() + } + l.order[beforeAfter{b, p}] = ss{bs.stack, stack} + if len(l.order) == Opts.MaxMapSize { // Reset the map to keep memory footprint bounded. + l.order = map[beforeAfter]ss{} + } + } + l.mu.Unlock() +} + +func (l *lockOrder) postUnlock(p interface{}) { + l.mu.Lock() + delete(l.cur, p) + l.mu.Unlock() +} + +type rlocker RWMutex + +func (r *rlocker) Lock() { (*RWMutex)(r).RLock() } +func (r *rlocker) Unlock() { (*RWMutex)(r).RUnlock() } + +// Under lo.mu Locked. +func (l *lockOrder) other(ptr interface{}) { + empty := true + for k := range l.cur { + if k == ptr { + continue + } + empty = false + } + if empty { + return + } + fmt.Fprintln(Opts.LogBuf, "Other goroutines holding locks:") + for k, pp := range l.cur { + if k == ptr { + continue + } + fmt.Fprintf(Opts.LogBuf, "goroutine %v lock %p\n", pp.gid, k) + printStack(Opts.LogBuf, pp.stack) + } + fmt.Fprintln(Opts.LogBuf) +} + +const header = "POTENTIAL DEADLOCK:" diff --git a/vendor/github.com/sasha-s/go-deadlock/deadlock_map.go b/vendor/github.com/sasha-s/go-deadlock/deadlock_map.go new file mode 100644 index 000000000..ec66bdc0f --- /dev/null +++ b/vendor/github.com/sasha-s/go-deadlock/deadlock_map.go @@ -0,0 +1,10 @@ +// +build go1.9 + +package deadlock + +import "sync" + +// Map is sync.Map wrapper +type Map struct { + sync.Map +} diff --git a/vendor/github.com/sasha-s/go-deadlock/stacktraces.go b/vendor/github.com/sasha-s/go-deadlock/stacktraces.go new file mode 100644 index 000000000..d93050fcd --- /dev/null +++ b/vendor/github.com/sasha-s/go-deadlock/stacktraces.go @@ -0,0 +1,107 @@ +package deadlock + +import ( + "bytes" + "fmt" + "io" + "io/ioutil" + "os" + "os/user" + "path/filepath" + "runtime" + "strings" + "sync" +) + +func callers(skip int) []uintptr { + s := make([]uintptr, 50) // Most relevant context seem to appear near the top of the stack. + return s[:runtime.Callers(2+skip, s)] +} + +func printStack(w io.Writer, stack []uintptr) { + home := os.Getenv("HOME") + usr, err := user.Current() + if err == nil { + home = usr.HomeDir + } + cwd, _ := os.Getwd() + + for i, pc := range stack { + f := runtime.FuncForPC(pc) + name := f.Name() + pkg := "" + if pos := strings.LastIndex(name, "/"); pos >= 0 { + name = name[pos+1:] + } + if pos := strings.Index(name, "."); pos >= 0 { + pkg = name[:pos] + name = name[pos+1:] + } + file, line := f.FileLine(pc) + if (pkg == "runtime" && name == "goexit") || (pkg == "testing" && name == "tRunner") { + fmt.Fprintln(w) + return + } + tail := "" + if i == 0 { + tail = " <<<<<" // Make the line performing a lock prominent. + } + // Shorten the file name. + clean := file + if cwd != "" { + cl, err := filepath.Rel(cwd, file) + if err == nil { + clean = cl + } + } + if home != "" { + s2 := strings.Replace(file, home, "~", 1) + if len(clean) > len(s2) { + clean = s2 + } + } + fmt.Fprintf(w, "%s:%d %s.%s %s%s\n", clean, line-1, pkg, name, code(file, line), tail) + } + fmt.Fprintln(w) +} + +var fileSources struct { + sync.Mutex + lines map[string][][]byte +} + +// Reads souce file lines from disk if not cached already. +func getSourceLines(file string) [][]byte { + fileSources.Lock() + defer fileSources.Unlock() + if fileSources.lines == nil { + fileSources.lines = map[string][][]byte{} + } + if lines, ok := fileSources.lines[file]; ok { + return lines + } + text, _ := ioutil.ReadFile(file) + fileSources.lines[file] = bytes.Split(text, []byte{'\n'}) + return fileSources.lines[file] +} + +func code(file string, line int) string { + lines := getSourceLines(file) + line -= 2 + if line >= len(lines) || line < 0 { + return "???" + } + return "{ " + string(bytes.TrimSpace(lines[line])) + " }" +} + +// Stacktraces for all goroutines. +func stacks() []byte { + buf := make([]byte, 1024*16) + for { + n := runtime.Stack(buf, true) + if n < len(buf) { + return buf[:n] + } + buf = make([]byte, 2*len(buf)) + } +} diff --git a/vendor/github.com/sasha-s/go-deadlock/test.sh b/vendor/github.com/sasha-s/go-deadlock/test.sh new file mode 100644 index 000000000..f237424ae --- /dev/null +++ b/vendor/github.com/sasha-s/go-deadlock/test.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +set -e +echo "" > coverage.txt + +for d in $(go list ./...); do + go test -coverprofile=profile.out -covermode=atomic "$d" + if [ -f profile.out ]; then + cat profile.out >> coverage.txt + rm profile.out + fi +done diff --git a/vendor/github.com/sirupsen/logrus/go.mod b/vendor/github.com/sirupsen/logrus/go.mod deleted file mode 100644 index 12fdf9898..000000000 --- a/vendor/github.com/sirupsen/logrus/go.mod +++ /dev/null @@ -1,10 +0,0 @@ -module github.com/sirupsen/logrus - -require ( - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/konsorten/go-windows-terminal-sequences v1.0.1 - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/stretchr/objx v0.1.1 // indirect - github.com/stretchr/testify v1.2.2 - golang.org/x/sys v0.0.0-20190422165155-953cdadca894 -) diff --git a/vendor/github.com/sirupsen/logrus/go.sum b/vendor/github.com/sirupsen/logrus/go.sum deleted file mode 100644 index 596c318b9..000000000 --- a/vendor/github.com/sirupsen/logrus/go.sum +++ /dev/null @@ -1,16 +0,0 @@ -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/konsorten/go-windows-terminal-sequences v0.0.0-20180402223658-b729f2633dfe h1:CHRGQ8V7OlCYtwaKPJi3iA7J+YdNKdo8j7nG5IgDhjs= -github.com/konsorten/go-windows-terminal-sequences v0.0.0-20180402223658-b729f2633dfe/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33 h1:I6FyU15t786LL7oL/hn43zqTuEGr4PN7F4XJ1p4E3Y8= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/github.com/xanzy/ssh-agent/go.mod b/vendor/github.com/xanzy/ssh-agent/go.mod deleted file mode 100644 index 6664c4888..000000000 --- a/vendor/github.com/xanzy/ssh-agent/go.mod +++ /dev/null @@ -1,6 +0,0 @@ -module github.com/xanzy/ssh-agent - -require ( - golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2 - golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0 // indirect -) diff --git a/vendor/github.com/xanzy/ssh-agent/go.sum b/vendor/github.com/xanzy/ssh-agent/go.sum deleted file mode 100644 index a9a001692..000000000 --- a/vendor/github.com/xanzy/ssh-agent/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2 h1:NwxKRvbkH5MsNkvOtPZi3/3kmI8CAzs3mtv+GLQMkNo= -golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0 h1:bzeyCHgoAyjZjAhvTpks+qM7sdlh4cCSitmXeCEO3B4= -golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/vendor/github.com/xo/terminfo/go.mod b/vendor/github.com/xo/terminfo/go.mod deleted file mode 100644 index 7a3a7597a..000000000 --- a/vendor/github.com/xo/terminfo/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/xo/terminfo - -go 1.15 diff --git a/vendor/golang.org/x/sys/AUTHORS b/vendor/golang.org/x/exp/AUTHORS similarity index 100% rename from vendor/golang.org/x/sys/AUTHORS rename to vendor/golang.org/x/exp/AUTHORS diff --git a/vendor/golang.org/x/sys/CONTRIBUTORS b/vendor/golang.org/x/exp/CONTRIBUTORS similarity index 100% rename from vendor/golang.org/x/sys/CONTRIBUTORS rename to vendor/golang.org/x/exp/CONTRIBUTORS diff --git a/vendor/golang.org/x/exp/LICENSE b/vendor/golang.org/x/exp/LICENSE new file mode 100644 index 000000000..6a66aea5e --- /dev/null +++ b/vendor/golang.org/x/exp/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/golang.org/x/exp/PATENTS b/vendor/golang.org/x/exp/PATENTS new file mode 100644 index 000000000..733099041 --- /dev/null +++ b/vendor/golang.org/x/exp/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google 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, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/exp/constraints/constraints.go b/vendor/golang.org/x/exp/constraints/constraints.go new file mode 100644 index 000000000..2c033dff4 --- /dev/null +++ b/vendor/golang.org/x/exp/constraints/constraints.go @@ -0,0 +1,50 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package constraints defines a set of useful constraints to be used +// with type parameters. +package constraints + +// Signed is a constraint that permits any signed integer type. +// If future releases of Go add new predeclared signed integer types, +// this constraint will be modified to include them. +type Signed interface { + ~int | ~int8 | ~int16 | ~int32 | ~int64 +} + +// Unsigned is a constraint that permits any unsigned integer type. +// If future releases of Go add new predeclared unsigned integer types, +// this constraint will be modified to include them. +type Unsigned interface { + ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr +} + +// Integer is a constraint that permits any integer type. +// If future releases of Go add new predeclared integer types, +// this constraint will be modified to include them. +type Integer interface { + Signed | Unsigned +} + +// Float is a constraint that permits any floating-point type. +// If future releases of Go add new predeclared floating-point types, +// this constraint will be modified to include them. +type Float interface { + ~float32 | ~float64 +} + +// Complex is a constraint that permits any complex numeric type. +// If future releases of Go add new predeclared complex numeric types, +// this constraint will be modified to include them. +type Complex interface { + ~complex64 | ~complex128 +} + +// Ordered is a constraint that permits any ordered type: any type +// that supports the operators < <= >= >. +// If future releases of Go add new ordered types, +// this constraint will be modified to include them. +type Ordered interface { + Integer | Float | ~string +} diff --git a/vendor/golang.org/x/exp/slices/slices.go b/vendor/golang.org/x/exp/slices/slices.go new file mode 100644 index 000000000..df78daf90 --- /dev/null +++ b/vendor/golang.org/x/exp/slices/slices.go @@ -0,0 +1,213 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package slices defines various functions useful with slices of any type. +// Unless otherwise specified, these functions all apply to the elements +// of a slice at index 0 <= i < len(s). +package slices + +import "golang.org/x/exp/constraints" + +// Equal reports whether two slices are equal: the same length and all +// elements equal. If the lengths are different, Equal returns false. +// Otherwise, the elements are compared in increasing index order, and the +// comparison stops at the first unequal pair. +// Floating point NaNs are not considered equal. +func Equal[E comparable](s1, s2 []E) bool { + if len(s1) != len(s2) { + return false + } + for i := range s1 { + if s1[i] != s2[i] { + return false + } + } + return true +} + +// EqualFunc reports whether two slices are equal using a comparison +// function on each pair of elements. If the lengths are different, +// EqualFunc returns false. Otherwise, the elements are compared in +// increasing index order, and the comparison stops at the first index +// for which eq returns false. +func EqualFunc[E1, E2 any](s1 []E1, s2 []E2, eq func(E1, E2) bool) bool { + if len(s1) != len(s2) { + return false + } + for i, v1 := range s1 { + v2 := s2[i] + if !eq(v1, v2) { + return false + } + } + return true +} + +// Compare compares the elements of s1 and s2. +// The elements are compared sequentially, starting at index 0, +// until one element is not equal to the other. +// The result of comparing the first non-matching elements is returned. +// If both slices are equal until one of them ends, the shorter slice is +// considered less than the longer one. +// The result is 0 if s1 == s2, -1 if s1 < s2, and +1 if s1 > s2. +// Comparisons involving floating point NaNs are ignored. +func Compare[E constraints.Ordered](s1, s2 []E) int { + s2len := len(s2) + for i, v1 := range s1 { + if i >= s2len { + return +1 + } + v2 := s2[i] + switch { + case v1 < v2: + return -1 + case v1 > v2: + return +1 + } + } + if len(s1) < s2len { + return -1 + } + return 0 +} + +// CompareFunc is like Compare but uses a comparison function +// on each pair of elements. The elements are compared in increasing +// index order, and the comparisons stop after the first time cmp +// returns non-zero. +// The result is the first non-zero result of cmp; if cmp always +// returns 0 the result is 0 if len(s1) == len(s2), -1 if len(s1) < len(s2), +// and +1 if len(s1) > len(s2). +func CompareFunc[E1, E2 any](s1 []E1, s2 []E2, cmp func(E1, E2) int) int { + s2len := len(s2) + for i, v1 := range s1 { + if i >= s2len { + return +1 + } + v2 := s2[i] + if c := cmp(v1, v2); c != 0 { + return c + } + } + if len(s1) < s2len { + return -1 + } + return 0 +} + +// Index returns the index of the first occurrence of v in s, +// or -1 if not present. +func Index[E comparable](s []E, v E) int { + for i, vs := range s { + if v == vs { + return i + } + } + return -1 +} + +// IndexFunc returns the first index i satisfying f(s[i]), +// or -1 if none do. +func IndexFunc[E any](s []E, f func(E) bool) int { + for i, v := range s { + if f(v) { + return i + } + } + return -1 +} + +// Contains reports whether v is present in s. +func Contains[E comparable](s []E, v E) bool { + return Index(s, v) >= 0 +} + +// Insert inserts the values v... into s at index i, +// returning the modified slice. +// In the returned slice r, r[i] == v[0]. +// Insert panics if i is out of range. +// This function is O(len(s) + len(v)). +func Insert[S ~[]E, E any](s S, i int, v ...E) S { + tot := len(s) + len(v) + if tot <= cap(s) { + s2 := s[:tot] + copy(s2[i+len(v):], s[i:]) + copy(s2[i:], v) + return s2 + } + s2 := make(S, tot) + copy(s2, s[:i]) + copy(s2[i:], v) + copy(s2[i+len(v):], s[i:]) + return s2 +} + +// Delete removes the elements s[i:j] from s, returning the modified slice. +// Delete panics if s[i:j] is not a valid slice of s. +// Delete modifies the contents of the slice s; it does not create a new slice. +// Delete is O(len(s)-(j-i)), so if many items must be deleted, it is better to +// make a single call deleting them all together than to delete one at a time. +func Delete[S ~[]E, E any](s S, i, j int) S { + return append(s[:i], s[j:]...) +} + +// Clone returns a copy of the slice. +// The elements are copied using assignment, so this is a shallow clone. +func Clone[S ~[]E, E any](s S) S { + // Preserve nil in case it matters. + if s == nil { + return nil + } + return append(S([]E{}), s...) +} + +// Compact replaces consecutive runs of equal elements with a single copy. +// This is like the uniq command found on Unix. +// Compact modifies the contents of the slice s; it does not create a new slice. +func Compact[S ~[]E, E comparable](s S) S { + if len(s) == 0 { + return s + } + i := 1 + last := s[0] + for _, v := range s[1:] { + if v != last { + s[i] = v + i++ + last = v + } + } + return s[:i] +} + +// CompactFunc is like Compact but uses a comparison function. +func CompactFunc[S ~[]E, E any](s S, eq func(E, E) bool) S { + if len(s) == 0 { + return s + } + i := 1 + last := s[0] + for _, v := range s[1:] { + if !eq(v, last) { + s[i] = v + i++ + last = v + } + } + return s[:i] +} + +// Grow increases the slice's capacity, if necessary, to guarantee space for +// another n elements. After Grow(n), at least n elements can be appended +// to the slice without another allocation. Grow may modify elements of the +// slice between the length and the capacity. If n is negative or too large to +// allocate the memory, Grow panics. +func Grow[S ~[]E, E any](s S, n int) S { + return append(s, make(S, n)...)[:len(s)] +} + +// Clip removes unused capacity from the slice, returning s[:len(s):len(s)]. +func Clip[S ~[]E, E any](s S) S { + return s[:len(s):len(s)] +} diff --git a/vendor/golang.org/x/exp/slices/sort.go b/vendor/golang.org/x/exp/slices/sort.go new file mode 100644 index 000000000..b2035abe8 --- /dev/null +++ b/vendor/golang.org/x/exp/slices/sort.go @@ -0,0 +1,95 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package slices + +import "golang.org/x/exp/constraints" + +// Sort sorts a slice of any ordered type in ascending order. +func Sort[E constraints.Ordered](x []E) { + n := len(x) + quickSortOrdered(x, 0, n, maxDepth(n)) +} + +// Sort sorts the slice x in ascending order as determined by the less function. +// This sort is not guaranteed to be stable. +func SortFunc[E any](x []E, less func(a, b E) bool) { + n := len(x) + quickSortLessFunc(x, 0, n, maxDepth(n), less) +} + +// SortStable sorts the slice x while keeping the original order of equal +// elements, using less to compare elements. +func SortStableFunc[E any](x []E, less func(a, b E) bool) { + stableLessFunc(x, len(x), less) +} + +// IsSorted reports whether x is sorted in ascending order. +func IsSorted[E constraints.Ordered](x []E) bool { + for i := len(x) - 1; i > 0; i-- { + if x[i] < x[i-1] { + return false + } + } + return true +} + +// IsSortedFunc reports whether x is sorted in ascending order, with less as the +// comparison function. +func IsSortedFunc[E any](x []E, less func(a, b E) bool) bool { + for i := len(x) - 1; i > 0; i-- { + if less(x[i], x[i-1]) { + return false + } + } + return true +} + +// BinarySearch searches for target in a sorted slice and returns the smallest +// index at which target is found. If the target is not found, the index at +// which it could be inserted into the slice is returned; therefore, if the +// intention is to find target itself a separate check for equality with the +// element at the returned index is required. +func BinarySearch[E constraints.Ordered](x []E, target E) int { + return search(len(x), func(i int) bool { return x[i] >= target }) +} + +// BinarySearchFunc uses binary search to find and return the smallest index i +// in [0, n) at which ok(i) is true, assuming that on the range [0, n), +// ok(i) == true implies ok(i+1) == true. That is, BinarySearchFunc requires +// that ok is false for some (possibly empty) prefix of the input range [0, n) +// and then true for the (possibly empty) remainder; BinarySearchFunc returns +// the first true index. If there is no such index, BinarySearchFunc returns n. +// (Note that the "not found" return value is not -1 as in, for instance, +// strings.Index.) Search calls ok(i) only for i in the range [0, n). +func BinarySearchFunc[E any](x []E, ok func(E) bool) int { + return search(len(x), func(i int) bool { return ok(x[i]) }) +} + +// maxDepth returns a threshold at which quicksort should switch +// to heapsort. It returns 2*ceil(lg(n+1)). +func maxDepth(n int) int { + var depth int + for i := n; i > 0; i >>= 1 { + depth++ + } + return depth * 2 +} + +func search(n int, f func(int) bool) int { + // Define f(-1) == false and f(n) == true. + // Invariant: f(i-1) == false, f(j) == true. + i, j := 0, n + for i < j { + h := int(uint(i+j) >> 1) // avoid overflow when computing h + // i ≤ h < j + if !f(h) { + i = h + 1 // preserves f(i-1) == false + } else { + j = h // preserves f(j) == true + } + } + // i == j, f(i-1) == false, and f(j) (= f(i)) == true => answer is i. + return i +} diff --git a/vendor/golang.org/x/exp/slices/zsortfunc.go b/vendor/golang.org/x/exp/slices/zsortfunc.go new file mode 100644 index 000000000..82f156fd6 --- /dev/null +++ b/vendor/golang.org/x/exp/slices/zsortfunc.go @@ -0,0 +1,342 @@ +// Code generated by gen_sort_variants.go; DO NOT EDIT. + +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package slices + +// insertionSortLessFunc sorts data[a:b] using insertion sort. +func insertionSortLessFunc[Elem any](data []Elem, a, b int, less func(a, b Elem) bool) { + for i := a + 1; i < b; i++ { + for j := i; j > a && less(data[j], data[j-1]); j-- { + data[j], data[j-1] = data[j-1], data[j] + } + } +} + +// siftDownLessFunc implements the heap property on data[lo:hi]. +// first is an offset into the array where the root of the heap lies. +func siftDownLessFunc[Elem any](data []Elem, lo, hi, first int, less func(a, b Elem) bool) { + root := lo + for { + child := 2*root + 1 + if child >= hi { + break + } + if child+1 < hi && less(data[first+child], data[first+child+1]) { + child++ + } + if !less(data[first+root], data[first+child]) { + return + } + data[first+root], data[first+child] = data[first+child], data[first+root] + root = child + } +} + +func heapSortLessFunc[Elem any](data []Elem, a, b int, less func(a, b Elem) bool) { + first := a + lo := 0 + hi := b - a + + // Build heap with greatest element at top. + for i := (hi - 1) / 2; i >= 0; i-- { + siftDownLessFunc(data, i, hi, first, less) + } + + // Pop elements, largest first, into end of data. + for i := hi - 1; i >= 0; i-- { + data[first], data[first+i] = data[first+i], data[first] + siftDownLessFunc(data, lo, i, first, less) + } +} + +// Quicksort, loosely following Bentley and McIlroy, +// "Engineering a Sort Function" SP&E November 1993. + +// medianOfThreeLessFunc moves the median of the three values data[m0], data[m1], data[m2] into data[m1]. +func medianOfThreeLessFunc[Elem any](data []Elem, m1, m0, m2 int, less func(a, b Elem) bool) { + // sort 3 elements + if less(data[m1], data[m0]) { + data[m1], data[m0] = data[m0], data[m1] + } + // data[m0] <= data[m1] + if less(data[m2], data[m1]) { + data[m2], data[m1] = data[m1], data[m2] + // data[m0] <= data[m2] && data[m1] < data[m2] + if less(data[m1], data[m0]) { + data[m1], data[m0] = data[m0], data[m1] + } + } + // now data[m0] <= data[m1] <= data[m2] +} + +func swapRangeLessFunc[Elem any](data []Elem, a, b, n int, less func(a, b Elem) bool) { + for i := 0; i < n; i++ { + data[a+i], data[b+i] = data[b+i], data[a+i] + } +} + +func doPivotLessFunc[Elem any](data []Elem, lo, hi int, less func(a, b Elem) bool) (midlo, midhi int) { + m := int(uint(lo+hi) >> 1) // Written like this to avoid integer overflow. + if hi-lo > 40 { + // Tukey's "Ninther" median of three medians of three. + s := (hi - lo) / 8 + medianOfThreeLessFunc(data, lo, lo+s, lo+2*s, less) + medianOfThreeLessFunc(data, m, m-s, m+s, less) + medianOfThreeLessFunc(data, hi-1, hi-1-s, hi-1-2*s, less) + } + medianOfThreeLessFunc(data, lo, m, hi-1, less) + + // Invariants are: + // data[lo] = pivot (set up by ChoosePivot) + // data[lo < i < a] < pivot + // data[a <= i < b] <= pivot + // data[b <= i < c] unexamined + // data[c <= i < hi-1] > pivot + // data[hi-1] >= pivot + pivot := lo + a, c := lo+1, hi-1 + + for ; a < c && less(data[a], data[pivot]); a++ { + } + b := a + for { + for ; b < c && !less(data[pivot], data[b]); b++ { // data[b] <= pivot + } + for ; b < c && less(data[pivot], data[c-1]); c-- { // data[c-1] > pivot + } + if b >= c { + break + } + // data[b] > pivot; data[c-1] <= pivot + data[b], data[c-1] = data[c-1], data[b] + b++ + c-- + } + // If hi-c<3 then there are duplicates (by property of median of nine). + // Let's be a bit more conservative, and set border to 5. + protect := hi-c < 5 + if !protect && hi-c < (hi-lo)/4 { + // Lets test some points for equality to pivot + dups := 0 + if !less(data[pivot], data[hi-1]) { // data[hi-1] = pivot + data[c], data[hi-1] = data[hi-1], data[c] + c++ + dups++ + } + if !less(data[b-1], data[pivot]) { // data[b-1] = pivot + b-- + dups++ + } + // m-lo = (hi-lo)/2 > 6 + // b-lo > (hi-lo)*3/4-1 > 8 + // ==> m < b ==> data[m] <= pivot + if !less(data[m], data[pivot]) { // data[m] = pivot + data[m], data[b-1] = data[b-1], data[m] + b-- + dups++ + } + // if at least 2 points are equal to pivot, assume skewed distribution + protect = dups > 1 + } + if protect { + // Protect against a lot of duplicates + // Add invariant: + // data[a <= i < b] unexamined + // data[b <= i < c] = pivot + for { + for ; a < b && !less(data[b-1], data[pivot]); b-- { // data[b] == pivot + } + for ; a < b && less(data[a], data[pivot]); a++ { // data[a] < pivot + } + if a >= b { + break + } + // data[a] == pivot; data[b-1] < pivot + data[a], data[b-1] = data[b-1], data[a] + a++ + b-- + } + } + // Swap pivot into middle + data[pivot], data[b-1] = data[b-1], data[pivot] + return b - 1, c +} + +func quickSortLessFunc[Elem any](data []Elem, a, b, maxDepth int, less func(a, b Elem) bool) { + for b-a > 12 { // Use ShellSort for slices <= 12 elements + if maxDepth == 0 { + heapSortLessFunc(data, a, b, less) + return + } + maxDepth-- + mlo, mhi := doPivotLessFunc(data, a, b, less) + // Avoiding recursion on the larger subproblem guarantees + // a stack depth of at most lg(b-a). + if mlo-a < b-mhi { + quickSortLessFunc(data, a, mlo, maxDepth, less) + a = mhi // i.e., quickSortLessFunc(data, mhi, b) + } else { + quickSortLessFunc(data, mhi, b, maxDepth, less) + b = mlo // i.e., quickSortLessFunc(data, a, mlo) + } + } + if b-a > 1 { + // Do ShellSort pass with gap 6 + // It could be written in this simplified form cause b-a <= 12 + for i := a + 6; i < b; i++ { + if less(data[i], data[i-6]) { + data[i], data[i-6] = data[i-6], data[i] + } + } + insertionSortLessFunc(data, a, b, less) + } +} + +func stableLessFunc[Elem any](data []Elem, n int, less func(a, b Elem) bool) { + blockSize := 20 // must be > 0 + a, b := 0, blockSize + for b <= n { + insertionSortLessFunc(data, a, b, less) + a = b + b += blockSize + } + insertionSortLessFunc(data, a, n, less) + + for blockSize < n { + a, b = 0, 2*blockSize + for b <= n { + symMergeLessFunc(data, a, a+blockSize, b, less) + a = b + b += 2 * blockSize + } + if m := a + blockSize; m < n { + symMergeLessFunc(data, a, m, n, less) + } + blockSize *= 2 + } +} + +// symMergeLessFunc merges the two sorted subsequences data[a:m] and data[m:b] using +// the SymMerge algorithm from Pok-Son Kim and Arne Kutzner, "Stable Minimum +// Storage Merging by Symmetric Comparisons", in Susanne Albers and Tomasz +// Radzik, editors, Algorithms - ESA 2004, volume 3221 of Lecture Notes in +// Computer Science, pages 714-723. Springer, 2004. +// +// Let M = m-a and N = b-n. Wolog M < N. +// The recursion depth is bound by ceil(log(N+M)). +// The algorithm needs O(M*log(N/M + 1)) calls to data.Less. +// The algorithm needs O((M+N)*log(M)) calls to data.Swap. +// +// The paper gives O((M+N)*log(M)) as the number of assignments assuming a +// rotation algorithm which uses O(M+N+gcd(M+N)) assignments. The argumentation +// in the paper carries through for Swap operations, especially as the block +// swapping rotate uses only O(M+N) Swaps. +// +// symMerge assumes non-degenerate arguments: a < m && m < b. +// Having the caller check this condition eliminates many leaf recursion calls, +// which improves performance. +func symMergeLessFunc[Elem any](data []Elem, a, m, b int, less func(a, b Elem) bool) { + // Avoid unnecessary recursions of symMerge + // by direct insertion of data[a] into data[m:b] + // if data[a:m] only contains one element. + if m-a == 1 { + // Use binary search to find the lowest index i + // such that data[i] >= data[a] for m <= i < b. + // Exit the search loop with i == b in case no such index exists. + i := m + j := b + for i < j { + h := int(uint(i+j) >> 1) + if less(data[h], data[a]) { + i = h + 1 + } else { + j = h + } + } + // Swap values until data[a] reaches the position before i. + for k := a; k < i-1; k++ { + data[k], data[k+1] = data[k+1], data[k] + } + return + } + + // Avoid unnecessary recursions of symMerge + // by direct insertion of data[m] into data[a:m] + // if data[m:b] only contains one element. + if b-m == 1 { + // Use binary search to find the lowest index i + // such that data[i] > data[m] for a <= i < m. + // Exit the search loop with i == m in case no such index exists. + i := a + j := m + for i < j { + h := int(uint(i+j) >> 1) + if !less(data[m], data[h]) { + i = h + 1 + } else { + j = h + } + } + // Swap values until data[m] reaches the position i. + for k := m; k > i; k-- { + data[k], data[k-1] = data[k-1], data[k] + } + return + } + + mid := int(uint(a+b) >> 1) + n := mid + m + var start, r int + if m > mid { + start = n - b + r = mid + } else { + start = a + r = m + } + p := n - 1 + + for start < r { + c := int(uint(start+r) >> 1) + if !less(data[p-c], data[c]) { + start = c + 1 + } else { + r = c + } + } + + end := n - start + if start < m && m < end { + rotateLessFunc(data, start, m, end, less) + } + if a < start && start < mid { + symMergeLessFunc(data, a, start, mid, less) + } + if mid < end && end < b { + symMergeLessFunc(data, mid, end, b, less) + } +} + +// rotateLessFunc rotates two consecutive blocks u = data[a:m] and v = data[m:b] in data: +// Data of the form 'x u v y' is changed to 'x v u y'. +// rotate performs at most b-a many calls to data.Swap, +// and it assumes non-degenerate arguments: a < m && m < b. +func rotateLessFunc[Elem any](data []Elem, a, m, b int, less func(a, b Elem) bool) { + i := m - a + j := b - m + + for i != j { + if i > j { + swapRangeLessFunc(data, m-i, m, j, less) + i -= j + } else { + swapRangeLessFunc(data, m-i, m+j-i, i, less) + j -= i + } + } + // i == j + swapRangeLessFunc(data, m-i, m, i, less) +} diff --git a/vendor/golang.org/x/exp/slices/zsortordered.go b/vendor/golang.org/x/exp/slices/zsortordered.go new file mode 100644 index 000000000..6fa64a2e2 --- /dev/null +++ b/vendor/golang.org/x/exp/slices/zsortordered.go @@ -0,0 +1,344 @@ +// Code generated by gen_sort_variants.go; DO NOT EDIT. + +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package slices + +import "golang.org/x/exp/constraints" + +// insertionSortOrdered sorts data[a:b] using insertion sort. +func insertionSortOrdered[Elem constraints.Ordered](data []Elem, a, b int) { + for i := a + 1; i < b; i++ { + for j := i; j > a && (data[j] < data[j-1]); j-- { + data[j], data[j-1] = data[j-1], data[j] + } + } +} + +// siftDownOrdered implements the heap property on data[lo:hi]. +// first is an offset into the array where the root of the heap lies. +func siftDownOrdered[Elem constraints.Ordered](data []Elem, lo, hi, first int) { + root := lo + for { + child := 2*root + 1 + if child >= hi { + break + } + if child+1 < hi && (data[first+child] < data[first+child+1]) { + child++ + } + if !(data[first+root] < data[first+child]) { + return + } + data[first+root], data[first+child] = data[first+child], data[first+root] + root = child + } +} + +func heapSortOrdered[Elem constraints.Ordered](data []Elem, a, b int) { + first := a + lo := 0 + hi := b - a + + // Build heap with greatest element at top. + for i := (hi - 1) / 2; i >= 0; i-- { + siftDownOrdered(data, i, hi, first) + } + + // Pop elements, largest first, into end of data. + for i := hi - 1; i >= 0; i-- { + data[first], data[first+i] = data[first+i], data[first] + siftDownOrdered(data, lo, i, first) + } +} + +// Quicksort, loosely following Bentley and McIlroy, +// "Engineering a Sort Function" SP&E November 1993. + +// medianOfThreeOrdered moves the median of the three values data[m0], data[m1], data[m2] into data[m1]. +func medianOfThreeOrdered[Elem constraints.Ordered](data []Elem, m1, m0, m2 int) { + // sort 3 elements + if data[m1] < data[m0] { + data[m1], data[m0] = data[m0], data[m1] + } + // data[m0] <= data[m1] + if data[m2] < data[m1] { + data[m2], data[m1] = data[m1], data[m2] + // data[m0] <= data[m2] && data[m1] < data[m2] + if data[m1] < data[m0] { + data[m1], data[m0] = data[m0], data[m1] + } + } + // now data[m0] <= data[m1] <= data[m2] +} + +func swapRangeOrdered[Elem constraints.Ordered](data []Elem, a, b, n int) { + for i := 0; i < n; i++ { + data[a+i], data[b+i] = data[b+i], data[a+i] + } +} + +func doPivotOrdered[Elem constraints.Ordered](data []Elem, lo, hi int) (midlo, midhi int) { + m := int(uint(lo+hi) >> 1) // Written like this to avoid integer overflow. + if hi-lo > 40 { + // Tukey's "Ninther" median of three medians of three. + s := (hi - lo) / 8 + medianOfThreeOrdered(data, lo, lo+s, lo+2*s) + medianOfThreeOrdered(data, m, m-s, m+s) + medianOfThreeOrdered(data, hi-1, hi-1-s, hi-1-2*s) + } + medianOfThreeOrdered(data, lo, m, hi-1) + + // Invariants are: + // data[lo] = pivot (set up by ChoosePivot) + // data[lo < i < a] < pivot + // data[a <= i < b] <= pivot + // data[b <= i < c] unexamined + // data[c <= i < hi-1] > pivot + // data[hi-1] >= pivot + pivot := lo + a, c := lo+1, hi-1 + + for ; a < c && (data[a] < data[pivot]); a++ { + } + b := a + for { + for ; b < c && !(data[pivot] < data[b]); b++ { // data[b] <= pivot + } + for ; b < c && (data[pivot] < data[c-1]); c-- { // data[c-1] > pivot + } + if b >= c { + break + } + // data[b] > pivot; data[c-1] <= pivot + data[b], data[c-1] = data[c-1], data[b] + b++ + c-- + } + // If hi-c<3 then there are duplicates (by property of median of nine). + // Let's be a bit more conservative, and set border to 5. + protect := hi-c < 5 + if !protect && hi-c < (hi-lo)/4 { + // Lets test some points for equality to pivot + dups := 0 + if !(data[pivot] < data[hi-1]) { // data[hi-1] = pivot + data[c], data[hi-1] = data[hi-1], data[c] + c++ + dups++ + } + if !(data[b-1] < data[pivot]) { // data[b-1] = pivot + b-- + dups++ + } + // m-lo = (hi-lo)/2 > 6 + // b-lo > (hi-lo)*3/4-1 > 8 + // ==> m < b ==> data[m] <= pivot + if !(data[m] < data[pivot]) { // data[m] = pivot + data[m], data[b-1] = data[b-1], data[m] + b-- + dups++ + } + // if at least 2 points are equal to pivot, assume skewed distribution + protect = dups > 1 + } + if protect { + // Protect against a lot of duplicates + // Add invariant: + // data[a <= i < b] unexamined + // data[b <= i < c] = pivot + for { + for ; a < b && !(data[b-1] < data[pivot]); b-- { // data[b] == pivot + } + for ; a < b && (data[a] < data[pivot]); a++ { // data[a] < pivot + } + if a >= b { + break + } + // data[a] == pivot; data[b-1] < pivot + data[a], data[b-1] = data[b-1], data[a] + a++ + b-- + } + } + // Swap pivot into middle + data[pivot], data[b-1] = data[b-1], data[pivot] + return b - 1, c +} + +func quickSortOrdered[Elem constraints.Ordered](data []Elem, a, b, maxDepth int) { + for b-a > 12 { // Use ShellSort for slices <= 12 elements + if maxDepth == 0 { + heapSortOrdered(data, a, b) + return + } + maxDepth-- + mlo, mhi := doPivotOrdered(data, a, b) + // Avoiding recursion on the larger subproblem guarantees + // a stack depth of at most lg(b-a). + if mlo-a < b-mhi { + quickSortOrdered(data, a, mlo, maxDepth) + a = mhi // i.e., quickSortOrdered(data, mhi, b) + } else { + quickSortOrdered(data, mhi, b, maxDepth) + b = mlo // i.e., quickSortOrdered(data, a, mlo) + } + } + if b-a > 1 { + // Do ShellSort pass with gap 6 + // It could be written in this simplified form cause b-a <= 12 + for i := a + 6; i < b; i++ { + if data[i] < data[i-6] { + data[i], data[i-6] = data[i-6], data[i] + } + } + insertionSortOrdered(data, a, b) + } +} + +func stableOrdered[Elem constraints.Ordered](data []Elem, n int) { + blockSize := 20 // must be > 0 + a, b := 0, blockSize + for b <= n { + insertionSortOrdered(data, a, b) + a = b + b += blockSize + } + insertionSortOrdered(data, a, n) + + for blockSize < n { + a, b = 0, 2*blockSize + for b <= n { + symMergeOrdered(data, a, a+blockSize, b) + a = b + b += 2 * blockSize + } + if m := a + blockSize; m < n { + symMergeOrdered(data, a, m, n) + } + blockSize *= 2 + } +} + +// symMergeOrdered merges the two sorted subsequences data[a:m] and data[m:b] using +// the SymMerge algorithm from Pok-Son Kim and Arne Kutzner, "Stable Minimum +// Storage Merging by Symmetric Comparisons", in Susanne Albers and Tomasz +// Radzik, editors, Algorithms - ESA 2004, volume 3221 of Lecture Notes in +// Computer Science, pages 714-723. Springer, 2004. +// +// Let M = m-a and N = b-n. Wolog M < N. +// The recursion depth is bound by ceil(log(N+M)). +// The algorithm needs O(M*log(N/M + 1)) calls to data.Less. +// The algorithm needs O((M+N)*log(M)) calls to data.Swap. +// +// The paper gives O((M+N)*log(M)) as the number of assignments assuming a +// rotation algorithm which uses O(M+N+gcd(M+N)) assignments. The argumentation +// in the paper carries through for Swap operations, especially as the block +// swapping rotate uses only O(M+N) Swaps. +// +// symMerge assumes non-degenerate arguments: a < m && m < b. +// Having the caller check this condition eliminates many leaf recursion calls, +// which improves performance. +func symMergeOrdered[Elem constraints.Ordered](data []Elem, a, m, b int) { + // Avoid unnecessary recursions of symMerge + // by direct insertion of data[a] into data[m:b] + // if data[a:m] only contains one element. + if m-a == 1 { + // Use binary search to find the lowest index i + // such that data[i] >= data[a] for m <= i < b. + // Exit the search loop with i == b in case no such index exists. + i := m + j := b + for i < j { + h := int(uint(i+j) >> 1) + if data[h] < data[a] { + i = h + 1 + } else { + j = h + } + } + // Swap values until data[a] reaches the position before i. + for k := a; k < i-1; k++ { + data[k], data[k+1] = data[k+1], data[k] + } + return + } + + // Avoid unnecessary recursions of symMerge + // by direct insertion of data[m] into data[a:m] + // if data[m:b] only contains one element. + if b-m == 1 { + // Use binary search to find the lowest index i + // such that data[i] > data[m] for a <= i < m. + // Exit the search loop with i == m in case no such index exists. + i := a + j := m + for i < j { + h := int(uint(i+j) >> 1) + if !(data[m] < data[h]) { + i = h + 1 + } else { + j = h + } + } + // Swap values until data[m] reaches the position i. + for k := m; k > i; k-- { + data[k], data[k-1] = data[k-1], data[k] + } + return + } + + mid := int(uint(a+b) >> 1) + n := mid + m + var start, r int + if m > mid { + start = n - b + r = mid + } else { + start = a + r = m + } + p := n - 1 + + for start < r { + c := int(uint(start+r) >> 1) + if !(data[p-c] < data[c]) { + start = c + 1 + } else { + r = c + } + } + + end := n - start + if start < m && m < end { + rotateOrdered(data, start, m, end) + } + if a < start && start < mid { + symMergeOrdered(data, a, start, mid) + } + if mid < end && end < b { + symMergeOrdered(data, mid, end, b) + } +} + +// rotateOrdered rotates two consecutive blocks u = data[a:m] and v = data[m:b] in data: +// Data of the form 'x u v y' is changed to 'x v u y'. +// rotate performs at most b-a many calls to data.Swap, +// and it assumes non-degenerate arguments: a < m && m < b. +func rotateOrdered[Elem constraints.Ordered](data []Elem, a, m, b int) { + i := m - a + j := b - m + + for i != j { + if i > j { + swapRangeOrdered(data, m-i, m, j) + i -= j + } else { + swapRangeOrdered(data, m-i, m+j-i, i) + j -= i + } + } + // i == j + swapRangeOrdered(data, m-i, m, i) +} diff --git a/vendor/golang.org/x/sys/cpu/byteorder.go b/vendor/golang.org/x/sys/cpu/byteorder.go index dcbb14ef3..271055be0 100644 --- a/vendor/golang.org/x/sys/cpu/byteorder.go +++ b/vendor/golang.org/x/sys/cpu/byteorder.go @@ -46,6 +46,7 @@ func hostByteOrder() byteOrder { case "386", "amd64", "amd64p32", "alpha", "arm", "arm64", + "loong64", "mipsle", "mips64le", "mips64p32le", "nios2", "ppc64le", diff --git a/vendor/golang.org/x/sys/cpu/cpu.go b/vendor/golang.org/x/sys/cpu/cpu.go index b56886f26..83f112c4c 100644 --- a/vendor/golang.org/x/sys/cpu/cpu.go +++ b/vendor/golang.org/x/sys/cpu/cpu.go @@ -106,8 +106,8 @@ var ARM64 struct { // ARM contains the supported CPU features of the current ARM (32-bit) platform. // All feature flags are false if: -// 1. the current platform is not arm, or -// 2. the current operating system is not Linux. +// 1. the current platform is not arm, or +// 2. the current operating system is not Linux. var ARM struct { _ CacheLinePad HasSWP bool // SWP instruction support diff --git a/vendor/golang.org/x/sys/cpu/cpu_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_arm64.go index 87dd5e302..bbaba18bc 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_arm64.go +++ b/vendor/golang.org/x/sys/cpu/cpu_arm64.go @@ -41,13 +41,10 @@ func archInit() { switch runtime.GOOS { case "freebsd": readARM64Registers() - case "linux", "netbsd": + case "linux", "netbsd", "openbsd": doinit() default: - // Most platforms don't seem to allow reading these registers. - // - // OpenBSD: - // See https://golang.org/issue/31746 + // Many platforms don't seem to allow reading these registers. setMinimalFeatures() } } diff --git a/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c b/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c index e363c7d13..a4605e6d1 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c +++ b/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c @@ -7,6 +7,7 @@ #include #include +#include // Need to wrap __get_cpuid_count because it's declared as static. int @@ -17,27 +18,21 @@ gccgoGetCpuidCount(uint32_t leaf, uint32_t subleaf, return __get_cpuid_count(leaf, subleaf, eax, ebx, ecx, edx); } +#pragma GCC diagnostic ignored "-Wunknown-pragmas" +#pragma GCC push_options +#pragma GCC target("xsave") +#pragma clang attribute push (__attribute__((target("xsave"))), apply_to=function) + // xgetbv reads the contents of an XCR (Extended Control Register) // specified in the ECX register into registers EDX:EAX. // Currently, the only supported value for XCR is 0. -// -// TODO: Replace with a better alternative: -// -// #include -// -// #pragma GCC target("xsave") -// -// void gccgoXgetbv(uint32_t *eax, uint32_t *edx) { -// unsigned long long x = _xgetbv(0); -// *eax = x & 0xffffffff; -// *edx = (x >> 32) & 0xffffffff; -// } -// -// Note that _xgetbv is defined starting with GCC 8. void gccgoXgetbv(uint32_t *eax, uint32_t *edx) { - __asm(" xorl %%ecx, %%ecx\n" - " xgetbv" - : "=a"(*eax), "=d"(*edx)); + uint64_t v = _xgetbv(0); + *eax = v & 0xffffffff; + *edx = v >> 32; } + +#pragma clang attribute pop +#pragma GCC pop_options diff --git a/vendor/golang.org/x/sys/cpu/cpu_loong64.go b/vendor/golang.org/x/sys/cpu/cpu_loong64.go new file mode 100644 index 000000000..0f57b05bd --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_loong64.go @@ -0,0 +1,13 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build loong64 +// +build loong64 + +package cpu + +const cacheLineSize = 64 + +func initOptions() { +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_openbsd_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_openbsd_arm64.go new file mode 100644 index 000000000..85b64d5cc --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_openbsd_arm64.go @@ -0,0 +1,65 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cpu + +import ( + "syscall" + "unsafe" +) + +// Minimal copy of functionality from x/sys/unix so the cpu package can call +// sysctl without depending on x/sys/unix. + +const ( + // From OpenBSD's sys/sysctl.h. + _CTL_MACHDEP = 7 + + // From OpenBSD's machine/cpu.h. + _CPU_ID_AA64ISAR0 = 2 + _CPU_ID_AA64ISAR1 = 3 +) + +// Implemented in the runtime package (runtime/sys_openbsd3.go) +func syscall_syscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) + +//go:linkname syscall_syscall6 syscall.syscall6 + +func sysctl(mib []uint32, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + _, _, errno := syscall_syscall6(libc_sysctl_trampoline_addr, uintptr(unsafe.Pointer(&mib[0])), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if errno != 0 { + return errno + } + return nil +} + +var libc_sysctl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_sysctl sysctl "libc.so" + +func sysctlUint64(mib []uint32) (uint64, bool) { + var out uint64 + nout := unsafe.Sizeof(out) + if err := sysctl(mib, (*byte)(unsafe.Pointer(&out)), &nout, nil, 0); err != nil { + return 0, false + } + return out, true +} + +func doinit() { + setMinimalFeatures() + + // Get ID_AA64ISAR0 and ID_AA64ISAR1 from sysctl. + isar0, ok := sysctlUint64([]uint32{_CTL_MACHDEP, _CPU_ID_AA64ISAR0}) + if !ok { + return + } + isar1, ok := sysctlUint64([]uint32{_CTL_MACHDEP, _CPU_ID_AA64ISAR1}) + if !ok { + return + } + parseARM64SystemRegisters(isar0, isar1, 0) + + Initialized = true +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_openbsd_arm64.s b/vendor/golang.org/x/sys/cpu/cpu_openbsd_arm64.s new file mode 100644 index 000000000..054ba05d6 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_openbsd_arm64.s @@ -0,0 +1,11 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include "textflag.h" + +TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_sysctl(SB) + +GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $8 +DATA ·libc_sysctl_trampoline_addr(SB)/8, $libc_sysctl_trampoline<>(SB) diff --git a/vendor/golang.org/x/sys/cpu/cpu_other_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_other_arm64.go index f8c484f58..f3cde129b 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_other_arm64.go +++ b/vendor/golang.org/x/sys/cpu/cpu_other_arm64.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build !linux && !netbsd && arm64 -// +build !linux,!netbsd,arm64 +//go:build !linux && !netbsd && !openbsd && arm64 +// +build !linux,!netbsd,!openbsd,arm64 package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_other_riscv64.go b/vendor/golang.org/x/sys/cpu/cpu_other_riscv64.go new file mode 100644 index 000000000..dd10eb79f --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_other_riscv64.go @@ -0,0 +1,12 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !linux && riscv64 +// +build !linux,riscv64 + +package cpu + +func archInit() { + Initialized = true +} diff --git a/vendor/golang.org/x/sys/cpu/syscall_aix_gccgo.go b/vendor/golang.org/x/sys/cpu/syscall_aix_gccgo.go index a864f24d7..96134157a 100644 --- a/vendor/golang.org/x/sys/cpu/syscall_aix_gccgo.go +++ b/vendor/golang.org/x/sys/cpu/syscall_aix_gccgo.go @@ -5,7 +5,7 @@ // Recreate a getsystemcfg syscall handler instead of // using the one provided by x/sys/unix to avoid having // the dependency between them. (See golang.org/issue/32102) -// Morever, this file will be used during the building of +// Moreover, this file will be used during the building of // gccgo's libgo and thus must not used a CGo method. //go:build aix && gccgo diff --git a/vendor/golang.org/x/sys/plan9/syscall.go b/vendor/golang.org/x/sys/plan9/syscall.go index 602473cba..a25223b8f 100644 --- a/vendor/golang.org/x/sys/plan9/syscall.go +++ b/vendor/golang.org/x/sys/plan9/syscall.go @@ -113,5 +113,6 @@ func (tv *Timeval) Nano() int64 { // use is a no-op, but the compiler cannot see that it is. // Calling use(p) ensures that p is kept live until that point. +// //go:noescape func use(p unsafe.Pointer) diff --git a/vendor/golang.org/x/sys/plan9/syscall_plan9.go b/vendor/golang.org/x/sys/plan9/syscall_plan9.go index 723b1f400..d079d8116 100644 --- a/vendor/golang.org/x/sys/plan9/syscall_plan9.go +++ b/vendor/golang.org/x/sys/plan9/syscall_plan9.go @@ -115,6 +115,7 @@ func Write(fd int, p []byte) (n int, err error) { var ioSync int64 //sys fd2path(fd int, buf []byte) (err error) + func Fd2path(fd int) (path string, err error) { var buf [512]byte @@ -126,6 +127,7 @@ func Fd2path(fd int) (path string, err error) { } //sys pipe(p *[2]int32) (err error) + func Pipe(p []int) (err error) { if len(p) != 2 { return syscall.ErrorString("bad arg in system call") @@ -180,6 +182,7 @@ func (w Waitmsg) ExitStatus() int { } //sys await(s []byte) (n int, err error) + func Await(w *Waitmsg) (err error) { var buf [512]byte var f [5][]byte @@ -301,42 +304,49 @@ func Getgroups() (gids []int, err error) { } //sys open(path string, mode int) (fd int, err error) + func Open(path string, mode int) (fd int, err error) { fixwd() return open(path, mode) } //sys create(path string, mode int, perm uint32) (fd int, err error) + func Create(path string, mode int, perm uint32) (fd int, err error) { fixwd() return create(path, mode, perm) } //sys remove(path string) (err error) + func Remove(path string) error { fixwd() return remove(path) } //sys stat(path string, edir []byte) (n int, err error) + func Stat(path string, edir []byte) (n int, err error) { fixwd() return stat(path, edir) } //sys bind(name string, old string, flag int) (err error) + func Bind(name string, old string, flag int) (err error) { fixwd() return bind(name, old, flag) } //sys mount(fd int, afd int, old string, flag int, aname string) (err error) + func Mount(fd int, afd int, old string, flag int, aname string) (err error) { fixwd() return mount(fd, afd, old, flag, aname) } //sys wstat(path string, edir []byte) (err error) + func Wstat(path string, edir []byte) (err error) { fixwd() return wstat(path, edir) diff --git a/vendor/golang.org/x/sys/unix/asm_bsd_riscv64.s b/vendor/golang.org/x/sys/unix/asm_bsd_riscv64.s new file mode 100644 index 000000000..d560019ea --- /dev/null +++ b/vendor/golang.org/x/sys/unix/asm_bsd_riscv64.s @@ -0,0 +1,29 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build (darwin || freebsd || netbsd || openbsd) && gc +// +build darwin freebsd netbsd openbsd +// +build gc + +#include "textflag.h" + +// System call support for RISCV64 BSD + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-104 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) diff --git a/vendor/golang.org/x/sys/unix/asm_linux_loong64.s b/vendor/golang.org/x/sys/unix/asm_linux_loong64.s new file mode 100644 index 000000000..565357288 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/asm_linux_loong64.s @@ -0,0 +1,54 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build linux && loong64 && gc +// +build linux +// +build loong64 +// +build gc + +#include "textflag.h" + + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·SyscallNoError(SB),NOSPLIT,$0-48 + JAL runtime·entersyscall(SB) + MOVV a1+8(FP), R4 + MOVV a2+16(FP), R5 + MOVV a3+24(FP), R6 + MOVV R0, R7 + MOVV R0, R8 + MOVV R0, R9 + MOVV trap+0(FP), R11 // syscall entry + SYSCALL + MOVV R4, r1+32(FP) + MOVV R0, r2+40(FP) // r2 is not used. Always set to 0 + JAL runtime·exitsyscall(SB) + RET + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) + +TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48 + MOVV a1+8(FP), R4 + MOVV a2+16(FP), R5 + MOVV a3+24(FP), R6 + MOVV R0, R7 + MOVV R0, R8 + MOVV R0, R9 + MOVV trap+0(FP), R11 // syscall entry + SYSCALL + MOVV R4, r1+32(FP) + MOVV R0, r2+40(FP) // r2 is not used. Always set to 0 + RET diff --git a/vendor/golang.org/x/sys/unix/endian_little.go b/vendor/golang.org/x/sys/unix/endian_little.go index 4362f47e2..b0f2bc4ae 100644 --- a/vendor/golang.org/x/sys/unix/endian_little.go +++ b/vendor/golang.org/x/sys/unix/endian_little.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // -//go:build 386 || amd64 || amd64p32 || alpha || arm || arm64 || mipsle || mips64le || mips64p32le || nios2 || ppc64le || riscv || riscv64 || sh -// +build 386 amd64 amd64p32 alpha arm arm64 mipsle mips64le mips64p32le nios2 ppc64le riscv riscv64 sh +//go:build 386 || amd64 || amd64p32 || alpha || arm || arm64 || loong64 || mipsle || mips64le || mips64p32le || nios2 || ppc64le || riscv || riscv64 || sh +// +build 386 amd64 amd64p32 alpha arm arm64 loong64 mipsle mips64le mips64p32le nios2 ppc64le riscv riscv64 sh package unix diff --git a/vendor/golang.org/x/sys/unix/errors_freebsd_386.go b/vendor/golang.org/x/sys/unix/errors_freebsd_386.go deleted file mode 100644 index 761db66ef..000000000 --- a/vendor/golang.org/x/sys/unix/errors_freebsd_386.go +++ /dev/null @@ -1,233 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Constants that were deprecated or moved to enums in the FreeBSD headers. Keep -// them here for backwards compatibility. - -package unix - -const ( - DLT_HHDLC = 0x79 - IFF_SMART = 0x20 - IFT_1822 = 0x2 - IFT_A12MPPSWITCH = 0x82 - IFT_AAL2 = 0xbb - IFT_AAL5 = 0x31 - IFT_ADSL = 0x5e - IFT_AFLANE8023 = 0x3b - IFT_AFLANE8025 = 0x3c - IFT_ARAP = 0x58 - IFT_ARCNET = 0x23 - IFT_ARCNETPLUS = 0x24 - IFT_ASYNC = 0x54 - IFT_ATM = 0x25 - IFT_ATMDXI = 0x69 - IFT_ATMFUNI = 0x6a - IFT_ATMIMA = 0x6b - IFT_ATMLOGICAL = 0x50 - IFT_ATMRADIO = 0xbd - IFT_ATMSUBINTERFACE = 0x86 - IFT_ATMVCIENDPT = 0xc2 - IFT_ATMVIRTUAL = 0x95 - IFT_BGPPOLICYACCOUNTING = 0xa2 - IFT_BSC = 0x53 - IFT_CCTEMUL = 0x3d - IFT_CEPT = 0x13 - IFT_CES = 0x85 - IFT_CHANNEL = 0x46 - IFT_CNR = 0x55 - IFT_COFFEE = 0x84 - IFT_COMPOSITELINK = 0x9b - IFT_DCN = 0x8d - IFT_DIGITALPOWERLINE = 0x8a - IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba - IFT_DLSW = 0x4a - IFT_DOCSCABLEDOWNSTREAM = 0x80 - IFT_DOCSCABLEMACLAYER = 0x7f - IFT_DOCSCABLEUPSTREAM = 0x81 - IFT_DS0 = 0x51 - IFT_DS0BUNDLE = 0x52 - IFT_DS1FDL = 0xaa - IFT_DS3 = 0x1e - IFT_DTM = 0x8c - IFT_DVBASILN = 0xac - IFT_DVBASIOUT = 0xad - IFT_DVBRCCDOWNSTREAM = 0x93 - IFT_DVBRCCMACLAYER = 0x92 - IFT_DVBRCCUPSTREAM = 0x94 - IFT_ENC = 0xf4 - IFT_EON = 0x19 - IFT_EPLRS = 0x57 - IFT_ESCON = 0x49 - IFT_ETHER = 0x6 - IFT_FAITH = 0xf2 - IFT_FAST = 0x7d - IFT_FASTETHER = 0x3e - IFT_FASTETHERFX = 0x45 - IFT_FDDI = 0xf - IFT_FIBRECHANNEL = 0x38 - IFT_FRAMERELAYINTERCONNECT = 0x3a - IFT_FRAMERELAYMPI = 0x5c - IFT_FRDLCIENDPT = 0xc1 - IFT_FRELAY = 0x20 - IFT_FRELAYDCE = 0x2c - IFT_FRF16MFRBUNDLE = 0xa3 - IFT_FRFORWARD = 0x9e - IFT_G703AT2MB = 0x43 - IFT_G703AT64K = 0x42 - IFT_GIF = 0xf0 - IFT_GIGABITETHERNET = 0x75 - IFT_GR303IDT = 0xb2 - IFT_GR303RDT = 0xb1 - IFT_H323GATEKEEPER = 0xa4 - IFT_H323PROXY = 0xa5 - IFT_HDH1822 = 0x3 - IFT_HDLC = 0x76 - IFT_HDSL2 = 0xa8 - IFT_HIPERLAN2 = 0xb7 - IFT_HIPPI = 0x2f - IFT_HIPPIINTERFACE = 0x39 - IFT_HOSTPAD = 0x5a - IFT_HSSI = 0x2e - IFT_HY = 0xe - IFT_IBM370PARCHAN = 0x48 - IFT_IDSL = 0x9a - IFT_IEEE80211 = 0x47 - IFT_IEEE80212 = 0x37 - IFT_IEEE8023ADLAG = 0xa1 - IFT_IFGSN = 0x91 - IFT_IMT = 0xbe - IFT_INTERLEAVE = 0x7c - IFT_IP = 0x7e - IFT_IPFORWARD = 0x8e - IFT_IPOVERATM = 0x72 - IFT_IPOVERCDLC = 0x6d - IFT_IPOVERCLAW = 0x6e - IFT_IPSWITCH = 0x4e - IFT_IPXIP = 0xf9 - IFT_ISDN = 0x3f - IFT_ISDNBASIC = 0x14 - IFT_ISDNPRIMARY = 0x15 - IFT_ISDNS = 0x4b - IFT_ISDNU = 0x4c - IFT_ISO88022LLC = 0x29 - IFT_ISO88023 = 0x7 - IFT_ISO88024 = 0x8 - IFT_ISO88025 = 0x9 - IFT_ISO88025CRFPINT = 0x62 - IFT_ISO88025DTR = 0x56 - IFT_ISO88025FIBER = 0x73 - IFT_ISO88026 = 0xa - IFT_ISUP = 0xb3 - IFT_L3IPXVLAN = 0x89 - IFT_LAPB = 0x10 - IFT_LAPD = 0x4d - IFT_LAPF = 0x77 - IFT_LOCALTALK = 0x2a - IFT_LOOP = 0x18 - IFT_MEDIAMAILOVERIP = 0x8b - IFT_MFSIGLINK = 0xa7 - IFT_MIOX25 = 0x26 - IFT_MODEM = 0x30 - IFT_MPC = 0x71 - IFT_MPLS = 0xa6 - IFT_MPLSTUNNEL = 0x96 - IFT_MSDSL = 0x8f - IFT_MVL = 0xbf - IFT_MYRINET = 0x63 - IFT_NFAS = 0xaf - IFT_NSIP = 0x1b - IFT_OPTICALCHANNEL = 0xc3 - IFT_OPTICALTRANSPORT = 0xc4 - IFT_OTHER = 0x1 - IFT_P10 = 0xc - IFT_P80 = 0xd - IFT_PARA = 0x22 - IFT_PFLOG = 0xf6 - IFT_PFSYNC = 0xf7 - IFT_PLC = 0xae - IFT_POS = 0xab - IFT_PPPMULTILINKBUNDLE = 0x6c - IFT_PROPBWAP2MP = 0xb8 - IFT_PROPCNLS = 0x59 - IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 - IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 - IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 - IFT_PROPMUX = 0x36 - IFT_PROPWIRELESSP2P = 0x9d - IFT_PTPSERIAL = 0x16 - IFT_PVC = 0xf1 - IFT_QLLC = 0x44 - IFT_RADIOMAC = 0xbc - IFT_RADSL = 0x5f - IFT_REACHDSL = 0xc0 - IFT_RFC1483 = 0x9f - IFT_RS232 = 0x21 - IFT_RSRB = 0x4f - IFT_SDLC = 0x11 - IFT_SDSL = 0x60 - IFT_SHDSL = 0xa9 - IFT_SIP = 0x1f - IFT_SLIP = 0x1c - IFT_SMDSDXI = 0x2b - IFT_SMDSICIP = 0x34 - IFT_SONET = 0x27 - IFT_SONETOVERHEADCHANNEL = 0xb9 - IFT_SONETPATH = 0x32 - IFT_SONETVT = 0x33 - IFT_SRP = 0x97 - IFT_SS7SIGLINK = 0x9c - IFT_STACKTOSTACK = 0x6f - IFT_STARLAN = 0xb - IFT_STF = 0xd7 - IFT_T1 = 0x12 - IFT_TDLC = 0x74 - IFT_TERMPAD = 0x5b - IFT_TR008 = 0xb0 - IFT_TRANSPHDLC = 0x7b - IFT_TUNNEL = 0x83 - IFT_ULTRA = 0x1d - IFT_USB = 0xa0 - IFT_V11 = 0x40 - IFT_V35 = 0x2d - IFT_V36 = 0x41 - IFT_V37 = 0x78 - IFT_VDSL = 0x61 - IFT_VIRTUALIPADDRESS = 0x70 - IFT_VOICEEM = 0x64 - IFT_VOICEENCAP = 0x67 - IFT_VOICEFXO = 0x65 - IFT_VOICEFXS = 0x66 - IFT_VOICEOVERATM = 0x98 - IFT_VOICEOVERFRAMERELAY = 0x99 - IFT_VOICEOVERIP = 0x68 - IFT_X213 = 0x5d - IFT_X25 = 0x5 - IFT_X25DDN = 0x4 - IFT_X25HUNTGROUP = 0x7a - IFT_X25MLP = 0x79 - IFT_X25PLE = 0x28 - IFT_XETHER = 0x1a - IPPROTO_MAXID = 0x34 - IPV6_FAITH = 0x1d - IPV6_MIN_MEMBERSHIPS = 0x1f - IP_FAITH = 0x16 - IP_MAX_SOURCE_FILTER = 0x400 - IP_MIN_MEMBERSHIPS = 0x1f - MAP_NORESERVE = 0x40 - MAP_RENAME = 0x20 - NET_RT_MAXID = 0x6 - RTF_PRCLONING = 0x10000 - RTM_OLDADD = 0x9 - RTM_OLDDEL = 0xa - RT_CACHING_CONTEXT = 0x1 - RT_NORTREF = 0x2 - SIOCADDRT = 0x8030720a - SIOCALIFADDR = 0x8118691b - SIOCDELRT = 0x8030720b - SIOCDLIFADDR = 0x8118691d - SIOCGLIFADDR = 0xc118691c - SIOCGLIFPHYADDR = 0xc118694b - SIOCSLIFPHYADDR = 0x8118694a -) diff --git a/vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go deleted file mode 100644 index 070f44b65..000000000 --- a/vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go +++ /dev/null @@ -1,233 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Constants that were deprecated or moved to enums in the FreeBSD headers. Keep -// them here for backwards compatibility. - -package unix - -const ( - DLT_HHDLC = 0x79 - IFF_SMART = 0x20 - IFT_1822 = 0x2 - IFT_A12MPPSWITCH = 0x82 - IFT_AAL2 = 0xbb - IFT_AAL5 = 0x31 - IFT_ADSL = 0x5e - IFT_AFLANE8023 = 0x3b - IFT_AFLANE8025 = 0x3c - IFT_ARAP = 0x58 - IFT_ARCNET = 0x23 - IFT_ARCNETPLUS = 0x24 - IFT_ASYNC = 0x54 - IFT_ATM = 0x25 - IFT_ATMDXI = 0x69 - IFT_ATMFUNI = 0x6a - IFT_ATMIMA = 0x6b - IFT_ATMLOGICAL = 0x50 - IFT_ATMRADIO = 0xbd - IFT_ATMSUBINTERFACE = 0x86 - IFT_ATMVCIENDPT = 0xc2 - IFT_ATMVIRTUAL = 0x95 - IFT_BGPPOLICYACCOUNTING = 0xa2 - IFT_BSC = 0x53 - IFT_CCTEMUL = 0x3d - IFT_CEPT = 0x13 - IFT_CES = 0x85 - IFT_CHANNEL = 0x46 - IFT_CNR = 0x55 - IFT_COFFEE = 0x84 - IFT_COMPOSITELINK = 0x9b - IFT_DCN = 0x8d - IFT_DIGITALPOWERLINE = 0x8a - IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba - IFT_DLSW = 0x4a - IFT_DOCSCABLEDOWNSTREAM = 0x80 - IFT_DOCSCABLEMACLAYER = 0x7f - IFT_DOCSCABLEUPSTREAM = 0x81 - IFT_DS0 = 0x51 - IFT_DS0BUNDLE = 0x52 - IFT_DS1FDL = 0xaa - IFT_DS3 = 0x1e - IFT_DTM = 0x8c - IFT_DVBASILN = 0xac - IFT_DVBASIOUT = 0xad - IFT_DVBRCCDOWNSTREAM = 0x93 - IFT_DVBRCCMACLAYER = 0x92 - IFT_DVBRCCUPSTREAM = 0x94 - IFT_ENC = 0xf4 - IFT_EON = 0x19 - IFT_EPLRS = 0x57 - IFT_ESCON = 0x49 - IFT_ETHER = 0x6 - IFT_FAITH = 0xf2 - IFT_FAST = 0x7d - IFT_FASTETHER = 0x3e - IFT_FASTETHERFX = 0x45 - IFT_FDDI = 0xf - IFT_FIBRECHANNEL = 0x38 - IFT_FRAMERELAYINTERCONNECT = 0x3a - IFT_FRAMERELAYMPI = 0x5c - IFT_FRDLCIENDPT = 0xc1 - IFT_FRELAY = 0x20 - IFT_FRELAYDCE = 0x2c - IFT_FRF16MFRBUNDLE = 0xa3 - IFT_FRFORWARD = 0x9e - IFT_G703AT2MB = 0x43 - IFT_G703AT64K = 0x42 - IFT_GIF = 0xf0 - IFT_GIGABITETHERNET = 0x75 - IFT_GR303IDT = 0xb2 - IFT_GR303RDT = 0xb1 - IFT_H323GATEKEEPER = 0xa4 - IFT_H323PROXY = 0xa5 - IFT_HDH1822 = 0x3 - IFT_HDLC = 0x76 - IFT_HDSL2 = 0xa8 - IFT_HIPERLAN2 = 0xb7 - IFT_HIPPI = 0x2f - IFT_HIPPIINTERFACE = 0x39 - IFT_HOSTPAD = 0x5a - IFT_HSSI = 0x2e - IFT_HY = 0xe - IFT_IBM370PARCHAN = 0x48 - IFT_IDSL = 0x9a - IFT_IEEE80211 = 0x47 - IFT_IEEE80212 = 0x37 - IFT_IEEE8023ADLAG = 0xa1 - IFT_IFGSN = 0x91 - IFT_IMT = 0xbe - IFT_INTERLEAVE = 0x7c - IFT_IP = 0x7e - IFT_IPFORWARD = 0x8e - IFT_IPOVERATM = 0x72 - IFT_IPOVERCDLC = 0x6d - IFT_IPOVERCLAW = 0x6e - IFT_IPSWITCH = 0x4e - IFT_IPXIP = 0xf9 - IFT_ISDN = 0x3f - IFT_ISDNBASIC = 0x14 - IFT_ISDNPRIMARY = 0x15 - IFT_ISDNS = 0x4b - IFT_ISDNU = 0x4c - IFT_ISO88022LLC = 0x29 - IFT_ISO88023 = 0x7 - IFT_ISO88024 = 0x8 - IFT_ISO88025 = 0x9 - IFT_ISO88025CRFPINT = 0x62 - IFT_ISO88025DTR = 0x56 - IFT_ISO88025FIBER = 0x73 - IFT_ISO88026 = 0xa - IFT_ISUP = 0xb3 - IFT_L3IPXVLAN = 0x89 - IFT_LAPB = 0x10 - IFT_LAPD = 0x4d - IFT_LAPF = 0x77 - IFT_LOCALTALK = 0x2a - IFT_LOOP = 0x18 - IFT_MEDIAMAILOVERIP = 0x8b - IFT_MFSIGLINK = 0xa7 - IFT_MIOX25 = 0x26 - IFT_MODEM = 0x30 - IFT_MPC = 0x71 - IFT_MPLS = 0xa6 - IFT_MPLSTUNNEL = 0x96 - IFT_MSDSL = 0x8f - IFT_MVL = 0xbf - IFT_MYRINET = 0x63 - IFT_NFAS = 0xaf - IFT_NSIP = 0x1b - IFT_OPTICALCHANNEL = 0xc3 - IFT_OPTICALTRANSPORT = 0xc4 - IFT_OTHER = 0x1 - IFT_P10 = 0xc - IFT_P80 = 0xd - IFT_PARA = 0x22 - IFT_PFLOG = 0xf6 - IFT_PFSYNC = 0xf7 - IFT_PLC = 0xae - IFT_POS = 0xab - IFT_PPPMULTILINKBUNDLE = 0x6c - IFT_PROPBWAP2MP = 0xb8 - IFT_PROPCNLS = 0x59 - IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 - IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 - IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 - IFT_PROPMUX = 0x36 - IFT_PROPWIRELESSP2P = 0x9d - IFT_PTPSERIAL = 0x16 - IFT_PVC = 0xf1 - IFT_QLLC = 0x44 - IFT_RADIOMAC = 0xbc - IFT_RADSL = 0x5f - IFT_REACHDSL = 0xc0 - IFT_RFC1483 = 0x9f - IFT_RS232 = 0x21 - IFT_RSRB = 0x4f - IFT_SDLC = 0x11 - IFT_SDSL = 0x60 - IFT_SHDSL = 0xa9 - IFT_SIP = 0x1f - IFT_SLIP = 0x1c - IFT_SMDSDXI = 0x2b - IFT_SMDSICIP = 0x34 - IFT_SONET = 0x27 - IFT_SONETOVERHEADCHANNEL = 0xb9 - IFT_SONETPATH = 0x32 - IFT_SONETVT = 0x33 - IFT_SRP = 0x97 - IFT_SS7SIGLINK = 0x9c - IFT_STACKTOSTACK = 0x6f - IFT_STARLAN = 0xb - IFT_STF = 0xd7 - IFT_T1 = 0x12 - IFT_TDLC = 0x74 - IFT_TERMPAD = 0x5b - IFT_TR008 = 0xb0 - IFT_TRANSPHDLC = 0x7b - IFT_TUNNEL = 0x83 - IFT_ULTRA = 0x1d - IFT_USB = 0xa0 - IFT_V11 = 0x40 - IFT_V35 = 0x2d - IFT_V36 = 0x41 - IFT_V37 = 0x78 - IFT_VDSL = 0x61 - IFT_VIRTUALIPADDRESS = 0x70 - IFT_VOICEEM = 0x64 - IFT_VOICEENCAP = 0x67 - IFT_VOICEFXO = 0x65 - IFT_VOICEFXS = 0x66 - IFT_VOICEOVERATM = 0x98 - IFT_VOICEOVERFRAMERELAY = 0x99 - IFT_VOICEOVERIP = 0x68 - IFT_X213 = 0x5d - IFT_X25 = 0x5 - IFT_X25DDN = 0x4 - IFT_X25HUNTGROUP = 0x7a - IFT_X25MLP = 0x79 - IFT_X25PLE = 0x28 - IFT_XETHER = 0x1a - IPPROTO_MAXID = 0x34 - IPV6_FAITH = 0x1d - IPV6_MIN_MEMBERSHIPS = 0x1f - IP_FAITH = 0x16 - IP_MAX_SOURCE_FILTER = 0x400 - IP_MIN_MEMBERSHIPS = 0x1f - MAP_NORESERVE = 0x40 - MAP_RENAME = 0x20 - NET_RT_MAXID = 0x6 - RTF_PRCLONING = 0x10000 - RTM_OLDADD = 0x9 - RTM_OLDDEL = 0xa - RT_CACHING_CONTEXT = 0x1 - RT_NORTREF = 0x2 - SIOCADDRT = 0x8040720a - SIOCALIFADDR = 0x8118691b - SIOCDELRT = 0x8040720b - SIOCDLIFADDR = 0x8118691d - SIOCGLIFADDR = 0xc118691c - SIOCGLIFPHYADDR = 0xc118694b - SIOCSLIFPHYADDR = 0x8118694a -) diff --git a/vendor/golang.org/x/sys/unix/errors_freebsd_arm.go b/vendor/golang.org/x/sys/unix/errors_freebsd_arm.go deleted file mode 100644 index 856dca325..000000000 --- a/vendor/golang.org/x/sys/unix/errors_freebsd_arm.go +++ /dev/null @@ -1,226 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package unix - -const ( - IFT_1822 = 0x2 - IFT_A12MPPSWITCH = 0x82 - IFT_AAL2 = 0xbb - IFT_AAL5 = 0x31 - IFT_ADSL = 0x5e - IFT_AFLANE8023 = 0x3b - IFT_AFLANE8025 = 0x3c - IFT_ARAP = 0x58 - IFT_ARCNET = 0x23 - IFT_ARCNETPLUS = 0x24 - IFT_ASYNC = 0x54 - IFT_ATM = 0x25 - IFT_ATMDXI = 0x69 - IFT_ATMFUNI = 0x6a - IFT_ATMIMA = 0x6b - IFT_ATMLOGICAL = 0x50 - IFT_ATMRADIO = 0xbd - IFT_ATMSUBINTERFACE = 0x86 - IFT_ATMVCIENDPT = 0xc2 - IFT_ATMVIRTUAL = 0x95 - IFT_BGPPOLICYACCOUNTING = 0xa2 - IFT_BSC = 0x53 - IFT_CCTEMUL = 0x3d - IFT_CEPT = 0x13 - IFT_CES = 0x85 - IFT_CHANNEL = 0x46 - IFT_CNR = 0x55 - IFT_COFFEE = 0x84 - IFT_COMPOSITELINK = 0x9b - IFT_DCN = 0x8d - IFT_DIGITALPOWERLINE = 0x8a - IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba - IFT_DLSW = 0x4a - IFT_DOCSCABLEDOWNSTREAM = 0x80 - IFT_DOCSCABLEMACLAYER = 0x7f - IFT_DOCSCABLEUPSTREAM = 0x81 - IFT_DS0 = 0x51 - IFT_DS0BUNDLE = 0x52 - IFT_DS1FDL = 0xaa - IFT_DS3 = 0x1e - IFT_DTM = 0x8c - IFT_DVBASILN = 0xac - IFT_DVBASIOUT = 0xad - IFT_DVBRCCDOWNSTREAM = 0x93 - IFT_DVBRCCMACLAYER = 0x92 - IFT_DVBRCCUPSTREAM = 0x94 - IFT_ENC = 0xf4 - IFT_EON = 0x19 - IFT_EPLRS = 0x57 - IFT_ESCON = 0x49 - IFT_ETHER = 0x6 - IFT_FAST = 0x7d - IFT_FASTETHER = 0x3e - IFT_FASTETHERFX = 0x45 - IFT_FDDI = 0xf - IFT_FIBRECHANNEL = 0x38 - IFT_FRAMERELAYINTERCONNECT = 0x3a - IFT_FRAMERELAYMPI = 0x5c - IFT_FRDLCIENDPT = 0xc1 - IFT_FRELAY = 0x20 - IFT_FRELAYDCE = 0x2c - IFT_FRF16MFRBUNDLE = 0xa3 - IFT_FRFORWARD = 0x9e - IFT_G703AT2MB = 0x43 - IFT_G703AT64K = 0x42 - IFT_GIF = 0xf0 - IFT_GIGABITETHERNET = 0x75 - IFT_GR303IDT = 0xb2 - IFT_GR303RDT = 0xb1 - IFT_H323GATEKEEPER = 0xa4 - IFT_H323PROXY = 0xa5 - IFT_HDH1822 = 0x3 - IFT_HDLC = 0x76 - IFT_HDSL2 = 0xa8 - IFT_HIPERLAN2 = 0xb7 - IFT_HIPPI = 0x2f - IFT_HIPPIINTERFACE = 0x39 - IFT_HOSTPAD = 0x5a - IFT_HSSI = 0x2e - IFT_HY = 0xe - IFT_IBM370PARCHAN = 0x48 - IFT_IDSL = 0x9a - IFT_IEEE80211 = 0x47 - IFT_IEEE80212 = 0x37 - IFT_IEEE8023ADLAG = 0xa1 - IFT_IFGSN = 0x91 - IFT_IMT = 0xbe - IFT_INTERLEAVE = 0x7c - IFT_IP = 0x7e - IFT_IPFORWARD = 0x8e - IFT_IPOVERATM = 0x72 - IFT_IPOVERCDLC = 0x6d - IFT_IPOVERCLAW = 0x6e - IFT_IPSWITCH = 0x4e - IFT_ISDN = 0x3f - IFT_ISDNBASIC = 0x14 - IFT_ISDNPRIMARY = 0x15 - IFT_ISDNS = 0x4b - IFT_ISDNU = 0x4c - IFT_ISO88022LLC = 0x29 - IFT_ISO88023 = 0x7 - IFT_ISO88024 = 0x8 - IFT_ISO88025 = 0x9 - IFT_ISO88025CRFPINT = 0x62 - IFT_ISO88025DTR = 0x56 - IFT_ISO88025FIBER = 0x73 - IFT_ISO88026 = 0xa - IFT_ISUP = 0xb3 - IFT_L3IPXVLAN = 0x89 - IFT_LAPB = 0x10 - IFT_LAPD = 0x4d - IFT_LAPF = 0x77 - IFT_LOCALTALK = 0x2a - IFT_LOOP = 0x18 - IFT_MEDIAMAILOVERIP = 0x8b - IFT_MFSIGLINK = 0xa7 - IFT_MIOX25 = 0x26 - IFT_MODEM = 0x30 - IFT_MPC = 0x71 - IFT_MPLS = 0xa6 - IFT_MPLSTUNNEL = 0x96 - IFT_MSDSL = 0x8f - IFT_MVL = 0xbf - IFT_MYRINET = 0x63 - IFT_NFAS = 0xaf - IFT_NSIP = 0x1b - IFT_OPTICALCHANNEL = 0xc3 - IFT_OPTICALTRANSPORT = 0xc4 - IFT_OTHER = 0x1 - IFT_P10 = 0xc - IFT_P80 = 0xd - IFT_PARA = 0x22 - IFT_PFLOG = 0xf6 - IFT_PFSYNC = 0xf7 - IFT_PLC = 0xae - IFT_POS = 0xab - IFT_PPPMULTILINKBUNDLE = 0x6c - IFT_PROPBWAP2MP = 0xb8 - IFT_PROPCNLS = 0x59 - IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 - IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 - IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 - IFT_PROPMUX = 0x36 - IFT_PROPWIRELESSP2P = 0x9d - IFT_PTPSERIAL = 0x16 - IFT_PVC = 0xf1 - IFT_QLLC = 0x44 - IFT_RADIOMAC = 0xbc - IFT_RADSL = 0x5f - IFT_REACHDSL = 0xc0 - IFT_RFC1483 = 0x9f - IFT_RS232 = 0x21 - IFT_RSRB = 0x4f - IFT_SDLC = 0x11 - IFT_SDSL = 0x60 - IFT_SHDSL = 0xa9 - IFT_SIP = 0x1f - IFT_SLIP = 0x1c - IFT_SMDSDXI = 0x2b - IFT_SMDSICIP = 0x34 - IFT_SONET = 0x27 - IFT_SONETOVERHEADCHANNEL = 0xb9 - IFT_SONETPATH = 0x32 - IFT_SONETVT = 0x33 - IFT_SRP = 0x97 - IFT_SS7SIGLINK = 0x9c - IFT_STACKTOSTACK = 0x6f - IFT_STARLAN = 0xb - IFT_STF = 0xd7 - IFT_T1 = 0x12 - IFT_TDLC = 0x74 - IFT_TERMPAD = 0x5b - IFT_TR008 = 0xb0 - IFT_TRANSPHDLC = 0x7b - IFT_TUNNEL = 0x83 - IFT_ULTRA = 0x1d - IFT_USB = 0xa0 - IFT_V11 = 0x40 - IFT_V35 = 0x2d - IFT_V36 = 0x41 - IFT_V37 = 0x78 - IFT_VDSL = 0x61 - IFT_VIRTUALIPADDRESS = 0x70 - IFT_VOICEEM = 0x64 - IFT_VOICEENCAP = 0x67 - IFT_VOICEFXO = 0x65 - IFT_VOICEFXS = 0x66 - IFT_VOICEOVERATM = 0x98 - IFT_VOICEOVERFRAMERELAY = 0x99 - IFT_VOICEOVERIP = 0x68 - IFT_X213 = 0x5d - IFT_X25 = 0x5 - IFT_X25DDN = 0x4 - IFT_X25HUNTGROUP = 0x7a - IFT_X25MLP = 0x79 - IFT_X25PLE = 0x28 - IFT_XETHER = 0x1a - - // missing constants on FreeBSD-11.1-RELEASE, copied from old values in ztypes_freebsd_arm.go - IFF_SMART = 0x20 - IFT_FAITH = 0xf2 - IFT_IPXIP = 0xf9 - IPPROTO_MAXID = 0x34 - IPV6_FAITH = 0x1d - IP_FAITH = 0x16 - MAP_NORESERVE = 0x40 - MAP_RENAME = 0x20 - NET_RT_MAXID = 0x6 - RTF_PRCLONING = 0x10000 - RTM_OLDADD = 0x9 - RTM_OLDDEL = 0xa - SIOCADDRT = 0x8030720a - SIOCALIFADDR = 0x8118691b - SIOCDELRT = 0x8030720b - SIOCDLIFADDR = 0x8118691d - SIOCGLIFADDR = 0xc118691c - SIOCGLIFPHYADDR = 0xc118694b - SIOCSLIFPHYADDR = 0x8118694a -) diff --git a/vendor/golang.org/x/sys/unix/errors_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/errors_freebsd_arm64.go deleted file mode 100644 index 946dcf3fc..000000000 --- a/vendor/golang.org/x/sys/unix/errors_freebsd_arm64.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2020 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Constants that were deprecated or moved to enums in the FreeBSD headers. Keep -// them here for backwards compatibility. - -package unix - -const ( - DLT_HHDLC = 0x79 - IPV6_MIN_MEMBERSHIPS = 0x1f - IP_MAX_SOURCE_FILTER = 0x400 - IP_MIN_MEMBERSHIPS = 0x1f - RT_CACHING_CONTEXT = 0x1 - RT_NORTREF = 0x2 -) diff --git a/vendor/golang.org/x/sys/unix/ifreq_linux.go b/vendor/golang.org/x/sys/unix/ifreq_linux.go index 934af313c..15721a510 100644 --- a/vendor/golang.org/x/sys/unix/ifreq_linux.go +++ b/vendor/golang.org/x/sys/unix/ifreq_linux.go @@ -8,7 +8,6 @@ package unix import ( - "bytes" "unsafe" ) @@ -45,13 +44,7 @@ func NewIfreq(name string) (*Ifreq, error) { // Name returns the interface name associated with the Ifreq. func (ifr *Ifreq) Name() string { - // BytePtrToString requires a NULL terminator or the program may crash. If - // one is not present, just return the empty string. - if !bytes.Contains(ifr.raw.Ifrn[:], []byte{0x00}) { - return "" - } - - return BytePtrToString(&ifr.raw.Ifrn[0]) + return ByteSliceToString(ifr.raw.Ifrn[:]) } // According to netdevice(7), only AF_INET addresses are returned for numerous diff --git a/vendor/golang.org/x/sys/unix/ioctl_linux.go b/vendor/golang.org/x/sys/unix/ioctl_linux.go index 1dadead21..884430b81 100644 --- a/vendor/golang.org/x/sys/unix/ioctl_linux.go +++ b/vendor/golang.org/x/sys/unix/ioctl_linux.go @@ -194,3 +194,26 @@ func ioctlIfreqData(fd int, req uint, value *ifreqData) error { // identical so pass *IfreqData directly. return ioctlPtr(fd, req, unsafe.Pointer(value)) } + +// IoctlKCMClone attaches a new file descriptor to a multiplexor by cloning an +// existing KCM socket, returning a structure containing the file descriptor of +// the new socket. +func IoctlKCMClone(fd int) (*KCMClone, error) { + var info KCMClone + if err := ioctlPtr(fd, SIOCKCMCLONE, unsafe.Pointer(&info)); err != nil { + return nil, err + } + + return &info, nil +} + +// IoctlKCMAttach attaches a TCP socket and associated BPF program file +// descriptor to a multiplexor. +func IoctlKCMAttach(fd int, info KCMAttach) error { + return ioctlPtr(fd, SIOCKCMATTACH, unsafe.Pointer(&info)) +} + +// IoctlKCMUnattach unattaches a TCP socket file descriptor from a multiplexor. +func IoctlKCMUnattach(fd int, info KCMUnattach) error { + return ioctlPtr(fd, SIOCKCMUNATTACH, unsafe.Pointer(&info)) +} diff --git a/vendor/golang.org/x/sys/unix/mkall.sh b/vendor/golang.org/x/sys/unix/mkall.sh index ee7362348..6fc18353d 100644 --- a/vendor/golang.org/x/sys/unix/mkall.sh +++ b/vendor/golang.org/x/sys/unix/mkall.sh @@ -73,12 +73,12 @@ aix_ppc64) darwin_amd64) mkerrors="$mkerrors -m64" mktypes="GOARCH=$GOARCH go tool cgo -godefs" - mkasm="go run mkasm_darwin.go" + mkasm="go run mkasm.go" ;; darwin_arm64) mkerrors="$mkerrors -m64" mktypes="GOARCH=$GOARCH go tool cgo -godefs" - mkasm="go run mkasm_darwin.go" + mkasm="go run mkasm.go" ;; dragonfly_amd64) mkerrors="$mkerrors -m64" @@ -89,25 +89,30 @@ dragonfly_amd64) freebsd_386) mkerrors="$mkerrors -m32" mksyscall="go run mksyscall.go -l32" - mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'" + mksysnum="go run mksysnum.go 'https://cgit.freebsd.org/src/plain/sys/kern/syscalls.master?h=stable/12'" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; freebsd_amd64) mkerrors="$mkerrors -m64" - mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'" + mksysnum="go run mksysnum.go 'https://cgit.freebsd.org/src/plain/sys/kern/syscalls.master?h=stable/12'" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; freebsd_arm) mkerrors="$mkerrors" mksyscall="go run mksyscall.go -l32 -arm" - mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'" + mksysnum="go run mksysnum.go 'https://cgit.freebsd.org/src/plain/sys/kern/syscalls.master?h=stable/12'" # Let the type of C char be signed for making the bare syscall # API consistent across platforms. mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" ;; freebsd_arm64) mkerrors="$mkerrors -m64" - mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'" + mksysnum="go run mksysnum.go 'https://cgit.freebsd.org/src/plain/sys/kern/syscalls.master?h=stable/12'" + mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" + ;; +freebsd_riscv64) + mkerrors="$mkerrors -m64" + mksysnum="go run mksysnum.go 'https://cgit.freebsd.org/src/plain/sys/kern/syscalls.master?h=stable/12'" mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" ;; netbsd_386) @@ -137,17 +142,17 @@ netbsd_arm64) mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; openbsd_386) + mkasm="go run mkasm.go" mkerrors="$mkerrors -m32" - mksyscall="go run mksyscall.go -l32 -openbsd" + mksyscall="go run mksyscall.go -l32 -openbsd -libc" mksysctl="go run mksysctl_openbsd.go" - mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; openbsd_amd64) + mkasm="go run mkasm.go" mkerrors="$mkerrors -m64" - mksyscall="go run mksyscall.go -openbsd" + mksyscall="go run mksyscall.go -openbsd -libc" mksysctl="go run mksysctl_openbsd.go" - mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; openbsd_arm) @@ -160,10 +165,10 @@ openbsd_arm) mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" ;; openbsd_arm64) + mkasm="go run mkasm.go" mkerrors="$mkerrors -m64" - mksyscall="go run mksyscall.go -openbsd" + mksyscall="go run mksyscall.go -openbsd -libc" mksysctl="go run mksysctl_openbsd.go" - mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'" # Let the type of C char be signed for making the bare syscall # API consistent across platforms. mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" @@ -227,5 +232,5 @@ esac if [ -n "$mksysctl" ]; then echo "$mksysctl |gofmt >$zsysctl"; fi if [ -n "$mksysnum" ]; then echo "$mksysnum |gofmt >zsysnum_$GOOSARCH.go"; fi if [ -n "$mktypes" ]; then echo "$mktypes types_$GOOS.go | go run mkpost.go > ztypes_$GOOSARCH.go"; fi - if [ -n "$mkasm" ]; then echo "$mkasm $GOARCH"; fi + if [ -n "$mkasm" ]; then echo "$mkasm $GOOS $GOARCH"; fi ) | $run diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh index a47b035f9..2ab44aa65 100644 --- a/vendor/golang.org/x/sys/unix/mkerrors.sh +++ b/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -128,6 +128,7 @@ includes_FreeBSD=' #include #include #include +#include #include #include #include @@ -202,9 +203,11 @@ struct ltchars { #include #include #include +#include #include #include #include +#include #include #include #include @@ -214,6 +217,7 @@ struct ltchars { #include #include #include +#include #include #include #include @@ -231,6 +235,7 @@ struct ltchars { #include #include #include +#include #include #include #include @@ -292,6 +297,10 @@ struct ltchars { #define SOL_NETLINK 270 #endif +#ifndef SOL_SMC +#define SOL_SMC 286 +#endif + #ifdef SOL_BLUETOOTH // SPARC includes this in /usr/include/sparc64-linux-gnu/bits/socket.h // but it is already in bluetooth_linux.go @@ -503,6 +512,7 @@ ccflags="$@" $2 ~ /^O?XTABS$/ || $2 ~ /^TC[IO](ON|OFF)$/ || $2 ~ /^IN_/ || + $2 ~ /^KCM/ || $2 ~ /^LANDLOCK_/ || $2 ~ /^LOCK_(SH|EX|NB|UN)$/ || $2 ~ /^LO_(KEY|NAME)_SIZE$/ || @@ -525,7 +535,7 @@ ccflags="$@" $2 ~ /^(MS|MNT|MOUNT|UMOUNT)_/ || $2 ~ /^NS_GET_/ || $2 ~ /^TUN(SET|GET|ATTACH|DETACH)/ || - $2 ~ /^(O|F|[ES]?FD|NAME|S|PTRACE|PT|TFD)_/ || + $2 ~ /^(O|F|[ES]?FD|NAME|S|PTRACE|PT|PIOD|TFD)_/ || $2 ~ /^KEXEC_/ || $2 ~ /^LINUX_REBOOT_CMD_/ || $2 ~ /^LINUX_REBOOT_MAGIC[12]$/ || @@ -549,6 +559,7 @@ ccflags="$@" $2 ~ /^CLONE_[A-Z_]+/ || $2 !~ /^(BPF_TIMEVAL|BPF_FIB_LOOKUP_[A-Z]+)$/ && $2 ~ /^(BPF|DLT)_/ || + $2 ~ /^AUDIT_/ || $2 ~ /^(CLOCK|TIMER)_/ || $2 ~ /^CAN_/ || $2 ~ /^CAP_/ || @@ -571,7 +582,6 @@ ccflags="$@" $2 ~ /^SEEK_/ || $2 ~ /^SPLICE_/ || $2 ~ /^SYNC_FILE_RANGE_/ || - $2 !~ /^AUDIT_RECORD_MAGIC/ && $2 !~ /IOC_MAGIC/ && $2 ~ /^[A-Z][A-Z0-9_]+_MAGIC2?$/ || $2 ~ /^(VM|VMADDR)_/ || @@ -597,8 +607,10 @@ ccflags="$@" $2 ~ /^DEVLINK_/ || $2 ~ /^ETHTOOL_/ || $2 ~ /^LWTUNNEL_IP/ || + $2 ~ /^ITIMER_/ || $2 !~ "WMESGLEN" && $2 ~ /^W[A-Z0-9]+$/ || + $2 ~ /^P_/ || $2 ~/^PPPIOC/ || $2 ~ /^FAN_|FANOTIFY_/ || $2 == "HID_MAX_DESCRIPTOR_SIZE" || @@ -608,6 +620,7 @@ ccflags="$@" $2 ~ /^OTP/ || $2 ~ /^MEM/ || $2 ~ /^WG/ || + $2 ~ /^FIB_RULE_/ || $2 ~ /^BLK[A-Z]*(GET$|SET$|BUF$|PART$|SIZE)/ {printf("\t%s = C.%s\n", $2, $2)} $2 ~ /^__WCOREFLAG$/ {next} $2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)} diff --git a/vendor/golang.org/x/sys/unix/syscall_aix.go b/vendor/golang.org/x/sys/unix/syscall_aix.go index 4f55c8d99..2db1b51e9 100644 --- a/vendor/golang.org/x/sys/unix/syscall_aix.go +++ b/vendor/golang.org/x/sys/unix/syscall_aix.go @@ -37,6 +37,7 @@ func Creat(path string, mode uint32) (fd int, err error) { } //sys utimes(path string, times *[2]Timeval) (err error) + func Utimes(path string, tv []Timeval) error { if len(tv) != 2 { return EINVAL @@ -45,6 +46,7 @@ func Utimes(path string, tv []Timeval) error { } //sys utimensat(dirfd int, path string, times *[2]Timespec, flag int) (err error) + func UtimesNano(path string, ts []Timespec) error { if len(ts) != 2 { return EINVAL @@ -215,20 +217,63 @@ func Accept(fd int) (nfd int, sa Sockaddr, err error) { return } -func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { - // Recvmsg not implemented on AIX - sa := new(SockaddrUnix) - return -1, -1, -1, sa, ENOSYS -} - -func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { - _, err = SendmsgN(fd, p, oob, to, flags) +func recvmsgRaw(fd int, iov []Iovec, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn int, recvflags int, err error) { + var msg Msghdr + msg.Name = (*byte)(unsafe.Pointer(rsa)) + msg.Namelen = uint32(SizeofSockaddrAny) + var dummy byte + if len(oob) > 0 { + // receive at least one normal byte + if emptyIovecs(iov) { + var iova [1]Iovec + iova[0].Base = &dummy + iova[0].SetLen(1) + iov = iova[:] + } + msg.Control = (*byte)(unsafe.Pointer(&oob[0])) + msg.SetControllen(len(oob)) + } + if len(iov) > 0 { + msg.Iov = &iov[0] + msg.SetIovlen(len(iov)) + } + if n, err = recvmsg(fd, &msg, flags); n == -1 { + return + } + oobn = int(msg.Controllen) + recvflags = int(msg.Flags) return } -func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { - // SendmsgN not implemented on AIX - return -1, ENOSYS +func sendmsgN(fd int, iov []Iovec, oob []byte, ptr unsafe.Pointer, salen _Socklen, flags int) (n int, err error) { + var msg Msghdr + msg.Name = (*byte)(unsafe.Pointer(ptr)) + msg.Namelen = uint32(salen) + var dummy byte + var empty bool + if len(oob) > 0 { + // send at least one normal byte + empty = emptyIovecs(iov) + if empty { + var iova [1]Iovec + iova[0].Base = &dummy + iova[0].SetLen(1) + iov = iova[:] + } + msg.Control = (*byte)(unsafe.Pointer(&oob[0])) + msg.SetControllen(len(oob)) + } + if len(iov) > 0 { + msg.Iov = &iov[0] + msg.SetIovlen(len(iov)) + } + if n, err = sendmsg(fd, &msg, flags); err != nil { + return 0, err + } + if len(oob) > 0 && empty { + n = 0 + } + return n, nil } func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { @@ -306,11 +351,13 @@ func direntNamlen(buf []byte) (uint64, bool) { } //sys getdirent(fd int, buf []byte) (n int, err error) + func Getdents(fd int, buf []byte) (n int, err error) { return getdirent(fd, buf) } //sys wait4(pid Pid_t, status *_C_int, options int, rusage *Rusage) (wpid Pid_t, err error) + func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) { var status _C_int var r Pid_t @@ -378,6 +425,7 @@ func (w WaitStatus) TrapCause() int { return -1 } //sys fcntl(fd int, cmd int, arg int) (val int, err error) //sys fsyncRange(fd int, how int, start int64, length int64) (err error) = fsync_range + func Fsync(fd int) error { return fsyncRange(fd, O_SYNC, 0, 0) } @@ -458,8 +506,8 @@ func Fsync(fd int) error { //sys Listen(s int, n int) (err error) //sys lstat(path string, stat *Stat_t) (err error) //sys Pause() (err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) = pread64 -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = pwrite64 +//sys pread(fd int, p []byte, offset int64) (n int, err error) = pread64 +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) = pwrite64 //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) //sys Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) //sysnb Setregid(rgid int, egid int) (err error) @@ -542,6 +590,7 @@ func Poll(fds []PollFd, timeout int) (n int, err error) { //sys Getsystemcfg(label int) (n uint64) //sys umount(target string) (err error) + func Unmount(target string, flags int) (err error) { if flags != 0 { // AIX doesn't have any flags for umount. diff --git a/vendor/golang.org/x/sys/unix/syscall_bsd.go b/vendor/golang.org/x/sys/unix/syscall_bsd.go index 0ce452326..eda42671f 100644 --- a/vendor/golang.org/x/sys/unix/syscall_bsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_bsd.go @@ -325,80 +325,62 @@ func GetsockoptString(fd, level, opt int) (string, error) { //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) -func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { +func recvmsgRaw(fd int, iov []Iovec, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn int, recvflags int, err error) { var msg Msghdr - var rsa RawSockaddrAny - msg.Name = (*byte)(unsafe.Pointer(&rsa)) + msg.Name = (*byte)(unsafe.Pointer(rsa)) msg.Namelen = uint32(SizeofSockaddrAny) - var iov Iovec - if len(p) > 0 { - iov.Base = (*byte)(unsafe.Pointer(&p[0])) - iov.SetLen(len(p)) - } var dummy byte if len(oob) > 0 { // receive at least one normal byte - if len(p) == 0 { - iov.Base = &dummy - iov.SetLen(1) + if emptyIovecs(iov) { + var iova [1]Iovec + iova[0].Base = &dummy + iova[0].SetLen(1) + iov = iova[:] } msg.Control = (*byte)(unsafe.Pointer(&oob[0])) msg.SetControllen(len(oob)) } - msg.Iov = &iov - msg.Iovlen = 1 + if len(iov) > 0 { + msg.Iov = &iov[0] + msg.SetIovlen(len(iov)) + } if n, err = recvmsg(fd, &msg, flags); err != nil { return } oobn = int(msg.Controllen) recvflags = int(msg.Flags) - // source address is only specified if the socket is unconnected - if rsa.Addr.Family != AF_UNSPEC { - from, err = anyToSockaddr(fd, &rsa) - } return } //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) -func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { - _, err = SendmsgN(fd, p, oob, to, flags) - return -} - -func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { - var ptr unsafe.Pointer - var salen _Socklen - if to != nil { - ptr, salen, err = to.sockaddr() - if err != nil { - return 0, err - } - } +func sendmsgN(fd int, iov []Iovec, oob []byte, ptr unsafe.Pointer, salen _Socklen, flags int) (n int, err error) { var msg Msghdr msg.Name = (*byte)(unsafe.Pointer(ptr)) msg.Namelen = uint32(salen) - var iov Iovec - if len(p) > 0 { - iov.Base = (*byte)(unsafe.Pointer(&p[0])) - iov.SetLen(len(p)) - } var dummy byte + var empty bool if len(oob) > 0 { // send at least one normal byte - if len(p) == 0 { - iov.Base = &dummy - iov.SetLen(1) + empty = emptyIovecs(iov) + if empty { + var iova [1]Iovec + iova[0].Base = &dummy + iova[0].SetLen(1) + iov = iova[:] } msg.Control = (*byte)(unsafe.Pointer(&oob[0])) msg.SetControllen(len(oob)) } - msg.Iov = &iov - msg.Iovlen = 1 + if len(iov) > 0 { + msg.Iov = &iov[0] + msg.SetIovlen(len(iov)) + } if n, err = sendmsg(fd, &msg, flags); err != nil { return 0, err } - if len(oob) > 0 && len(p) == 0 { + if len(oob) > 0 && empty { n = 0 } return n, nil @@ -571,12 +553,7 @@ func UtimesNano(path string, ts []Timespec) error { if len(ts) != 2 { return EINVAL } - // Darwin setattrlist can set nanosecond timestamps - err := setattrlistTimes(path, ts, 0) - if err != ENOSYS { - return err - } - err = utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) + err := utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) if err != ENOSYS { return err } @@ -596,10 +573,6 @@ func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error { if len(ts) != 2 { return EINVAL } - err := setattrlistTimes(path, ts, flags) - if err != ENOSYS { - return err - } return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags) } diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin.go b/vendor/golang.org/x/sys/unix/syscall_darwin.go index 0eaab9131..4f87f16ea 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin.go @@ -141,16 +141,6 @@ func direntNamlen(buf []byte) (uint64, bool) { func PtraceAttach(pid int) (err error) { return ptrace(PT_ATTACH, pid, 0, 0) } func PtraceDetach(pid int) (err error) { return ptrace(PT_DETACH, pid, 0, 0) } -type attrList struct { - bitmapCount uint16 - _ uint16 - CommonAttr uint32 - VolAttr uint32 - DirAttr uint32 - FileAttr uint32 - Forkattr uint32 -} - //sysnb pipe(p *[2]int32) (err error) func Pipe(p []int) (err error) { @@ -282,36 +272,7 @@ func Flistxattr(fd int, dest []byte) (sz int, err error) { return flistxattr(fd, xattrPointer(dest), len(dest), 0) } -func setattrlistTimes(path string, times []Timespec, flags int) error { - _p0, err := BytePtrFromString(path) - if err != nil { - return err - } - - var attrList attrList - attrList.bitmapCount = ATTR_BIT_MAP_COUNT - attrList.CommonAttr = ATTR_CMN_MODTIME | ATTR_CMN_ACCTIME - - // order is mtime, atime: the opposite of Chtimes - attributes := [2]Timespec{times[1], times[0]} - options := 0 - if flags&AT_SYMLINK_NOFOLLOW != 0 { - options |= FSOPT_NOFOLLOW - } - return setattrlist( - _p0, - unsafe.Pointer(&attrList), - unsafe.Pointer(&attributes), - unsafe.Sizeof(attributes), - options) -} - -//sys setattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintptr, options int) (err error) - -func utimensat(dirfd int, path string, times *[2]Timespec, flags int) error { - // Darwin doesn't support SYS_UTIMENSAT - return ENOSYS -} +//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) /* * Wrapped @@ -432,6 +393,13 @@ func GetsockoptXucred(fd, level, opt int) (*Xucred, error) { return x, err } +func GetsockoptTCPConnectionInfo(fd, level, opt int) (*TCPConnectionInfo, error) { + var value TCPConnectionInfo + vallen := _Socklen(SizeofTCPConnectionInfo) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + func SysctlKinfoProc(name string, args ...int) (*KinfoProc, error) { mib, err := sysctlmib(name, args...) if err != nil { @@ -543,11 +511,12 @@ func SysctlKinfoProcSlice(name string, args ...int) ([]KinfoProc, error) { //sys Mkdirat(dirfd int, path string, mode uint32) (err error) //sys Mkfifo(path string, mode uint32) (err error) //sys Mknod(path string, mode uint32, dev int) (err error) +//sys Mount(fsType string, dir string, flags int, data unsafe.Pointer) (err error) //sys Open(path string, mode int, perm uint32) (fd int, err error) //sys Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) //sys Pathconf(path string, name int) (val int, err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys pread(fd int, p []byte, offset int64) (n int, err error) +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) //sys read(fd int, p []byte) (n int, err error) //sys Readlink(path string, buf []byte) (n int, err error) //sys Readlinkat(dirfd int, path string, buf []byte) (n int, err error) @@ -611,7 +580,6 @@ func SysctlKinfoProcSlice(name string, args ...int) ([]KinfoProc, error) { // Nfssvc // Getfh // Quotactl -// Mount // Csops // Waitid // Add_profil diff --git a/vendor/golang.org/x/sys/unix/syscall_dragonfly.go b/vendor/golang.org/x/sys/unix/syscall_dragonfly.go index 2e37c3167..61c0d0de1 100644 --- a/vendor/golang.org/x/sys/unix/syscall_dragonfly.go +++ b/vendor/golang.org/x/sys/unix/syscall_dragonfly.go @@ -125,12 +125,14 @@ func Pipe2(p []int, flags int) (err error) { } //sys extpread(fd int, p []byte, flags int, offset int64) (n int, err error) -func Pread(fd int, p []byte, offset int64) (n int, err error) { + +func pread(fd int, p []byte, offset int64) (n int, err error) { return extpread(fd, p, 0, offset) } //sys extpwrite(fd int, p []byte, flags int, offset int64) (n int, err error) -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + +func pwrite(fd int, p []byte, offset int64) (n int, err error) { return extpwrite(fd, p, 0, offset) } @@ -169,11 +171,6 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { return } -func setattrlistTimes(path string, times []Timespec, flags int) error { - // used on Darwin for UtimesNano - return ENOSYS -} - //sys ioctl(fd int, req uint, arg uintptr) (err error) //sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd.go b/vendor/golang.org/x/sys/unix/syscall_freebsd.go index 2f650ae66..de7c23e06 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd.go @@ -17,25 +17,12 @@ import ( "unsafe" ) -const ( - SYS_FSTAT_FREEBSD12 = 551 // { int fstat(int fd, _Out_ struct stat *sb); } - SYS_FSTATAT_FREEBSD12 = 552 // { int fstatat(int fd, _In_z_ char *path, \ - SYS_GETDIRENTRIES_FREEBSD12 = 554 // { ssize_t getdirentries(int fd, \ - SYS_STATFS_FREEBSD12 = 555 // { int statfs(_In_z_ char *path, \ - SYS_FSTATFS_FREEBSD12 = 556 // { int fstatfs(int fd, \ - SYS_GETFSSTAT_FREEBSD12 = 557 // { int getfsstat( \ - SYS_MKNODAT_FREEBSD12 = 559 // { int mknodat(int fd, _In_z_ char *path, \ -) - // See https://www.freebsd.org/doc/en_US.ISO8859-1/books/porters-handbook/versions.html. var ( osreldateOnce sync.Once osreldate uint32 ) -// INO64_FIRST from /usr/src/lib/libc/sys/compat-ino64.h -const _ino64First = 1200031 - func supportsABI(ver uint32) bool { osreldateOnce.Do(func() { osreldate, _ = SysctlUint32("kern.osreldate") }) return osreldate >= ver @@ -159,46 +146,21 @@ func Accept4(fd, flags int) (nfd int, sa Sockaddr, err error) { func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { var ( - _p0 unsafe.Pointer - bufsize uintptr - oldBuf []statfs_freebsd11_t - needsConvert bool + _p0 unsafe.Pointer + bufsize uintptr ) - if len(buf) > 0 { - if supportsABI(_ino64First) { - _p0 = unsafe.Pointer(&buf[0]) - bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) - } else { - n := len(buf) - oldBuf = make([]statfs_freebsd11_t, n) - _p0 = unsafe.Pointer(&oldBuf[0]) - bufsize = unsafe.Sizeof(statfs_freebsd11_t{}) * uintptr(n) - needsConvert = true - } + _p0 = unsafe.Pointer(&buf[0]) + bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) } - var sysno uintptr = SYS_GETFSSTAT - if supportsABI(_ino64First) { - sysno = SYS_GETFSSTAT_FREEBSD12 - } - r0, _, e1 := Syscall(sysno, uintptr(_p0), bufsize, uintptr(flags)) + r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags)) n = int(r0) if e1 != 0 { err = e1 } - if e1 == 0 && needsConvert { - for i := range oldBuf { - buf[i].convertFrom(&oldBuf[i]) - } - } return } -func setattrlistTimes(path string, times []Timespec, flags int) error { - // used on Darwin for UtimesNano - return ENOSYS -} - //sys ioctl(fd int, req uint, arg uintptr) (err error) //sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL @@ -250,87 +212,11 @@ func Uname(uname *Utsname) error { } func Stat(path string, st *Stat_t) (err error) { - var oldStat stat_freebsd11_t - if supportsABI(_ino64First) { - return fstatat_freebsd12(AT_FDCWD, path, st, 0) - } - err = stat(path, &oldStat) - if err != nil { - return err - } - - st.convertFrom(&oldStat) - return nil + return Fstatat(AT_FDCWD, path, st, 0) } func Lstat(path string, st *Stat_t) (err error) { - var oldStat stat_freebsd11_t - if supportsABI(_ino64First) { - return fstatat_freebsd12(AT_FDCWD, path, st, AT_SYMLINK_NOFOLLOW) - } - err = lstat(path, &oldStat) - if err != nil { - return err - } - - st.convertFrom(&oldStat) - return nil -} - -func Fstat(fd int, st *Stat_t) (err error) { - var oldStat stat_freebsd11_t - if supportsABI(_ino64First) { - return fstat_freebsd12(fd, st) - } - err = fstat(fd, &oldStat) - if err != nil { - return err - } - - st.convertFrom(&oldStat) - return nil -} - -func Fstatat(fd int, path string, st *Stat_t, flags int) (err error) { - var oldStat stat_freebsd11_t - if supportsABI(_ino64First) { - return fstatat_freebsd12(fd, path, st, flags) - } - err = fstatat(fd, path, &oldStat, flags) - if err != nil { - return err - } - - st.convertFrom(&oldStat) - return nil -} - -func Statfs(path string, st *Statfs_t) (err error) { - var oldStatfs statfs_freebsd11_t - if supportsABI(_ino64First) { - return statfs_freebsd12(path, st) - } - err = statfs(path, &oldStatfs) - if err != nil { - return err - } - - st.convertFrom(&oldStatfs) - return nil -} - -func Fstatfs(fd int, st *Statfs_t) (err error) { - var oldStatfs statfs_freebsd11_t - if supportsABI(_ino64First) { - return fstatfs_freebsd12(fd, st) - } - err = fstatfs(fd, &oldStatfs) - if err != nil { - return err - } - - st.convertFrom(&oldStatfs) - return nil + return Fstatat(AT_FDCWD, path, st, AT_SYMLINK_NOFOLLOW) } func Getdents(fd int, buf []byte) (n int, err error) { @@ -338,162 +224,25 @@ func Getdents(fd int, buf []byte) (n int, err error) { } func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { - if supportsABI(_ino64First) { - if basep == nil || unsafe.Sizeof(*basep) == 8 { - return getdirentries_freebsd12(fd, buf, (*uint64)(unsafe.Pointer(basep))) - } - // The freebsd12 syscall needs a 64-bit base. On 32-bit machines - // we can't just use the basep passed in. See #32498. - var base uint64 = uint64(*basep) - n, err = getdirentries_freebsd12(fd, buf, &base) - *basep = uintptr(base) - if base>>32 != 0 { - // We can't stuff the base back into a uintptr, so any - // future calls would be suspect. Generate an error. - // EIO is allowed by getdirentries. - err = EIO - } - return + if basep == nil || unsafe.Sizeof(*basep) == 8 { + return getdirentries(fd, buf, (*uint64)(unsafe.Pointer(basep))) } - - // The old syscall entries are smaller than the new. Use 1/4 of the original - // buffer size rounded up to DIRBLKSIZ (see /usr/src/lib/libc/sys/getdirentries.c). - oldBufLen := roundup(len(buf)/4, _dirblksiz) - oldBuf := make([]byte, oldBufLen) - n, err = getdirentries(fd, oldBuf, basep) - if err == nil && n > 0 { - n = convertFromDirents11(buf, oldBuf[:n]) + // The syscall needs a 64-bit base. On 32-bit machines + // we can't just use the basep passed in. See #32498. + var base uint64 = uint64(*basep) + n, err = getdirentries(fd, buf, &base) + *basep = uintptr(base) + if base>>32 != 0 { + // We can't stuff the base back into a uintptr, so any + // future calls would be suspect. Generate an error. + // EIO is allowed by getdirentries. + err = EIO } return } func Mknod(path string, mode uint32, dev uint64) (err error) { - var oldDev int - if supportsABI(_ino64First) { - return mknodat_freebsd12(AT_FDCWD, path, mode, dev) - } - oldDev = int(dev) - return mknod(path, mode, oldDev) -} - -func Mknodat(fd int, path string, mode uint32, dev uint64) (err error) { - var oldDev int - if supportsABI(_ino64First) { - return mknodat_freebsd12(fd, path, mode, dev) - } - oldDev = int(dev) - return mknodat(fd, path, mode, oldDev) -} - -// round x to the nearest multiple of y, larger or equal to x. -// -// from /usr/include/sys/param.h Macros for counting and rounding. -// #define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) -func roundup(x, y int) int { - return ((x + y - 1) / y) * y -} - -func (s *Stat_t) convertFrom(old *stat_freebsd11_t) { - *s = Stat_t{ - Dev: uint64(old.Dev), - Ino: uint64(old.Ino), - Nlink: uint64(old.Nlink), - Mode: old.Mode, - Uid: old.Uid, - Gid: old.Gid, - Rdev: uint64(old.Rdev), - Atim: old.Atim, - Mtim: old.Mtim, - Ctim: old.Ctim, - Btim: old.Btim, - Size: old.Size, - Blocks: old.Blocks, - Blksize: old.Blksize, - Flags: old.Flags, - Gen: uint64(old.Gen), - } -} - -func (s *Statfs_t) convertFrom(old *statfs_freebsd11_t) { - *s = Statfs_t{ - Version: _statfsVersion, - Type: old.Type, - Flags: old.Flags, - Bsize: old.Bsize, - Iosize: old.Iosize, - Blocks: old.Blocks, - Bfree: old.Bfree, - Bavail: old.Bavail, - Files: old.Files, - Ffree: old.Ffree, - Syncwrites: old.Syncwrites, - Asyncwrites: old.Asyncwrites, - Syncreads: old.Syncreads, - Asyncreads: old.Asyncreads, - // Spare - Namemax: old.Namemax, - Owner: old.Owner, - Fsid: old.Fsid, - // Charspare - // Fstypename - // Mntfromname - // Mntonname - } - - sl := old.Fstypename[:] - n := clen(*(*[]byte)(unsafe.Pointer(&sl))) - copy(s.Fstypename[:], old.Fstypename[:n]) - - sl = old.Mntfromname[:] - n = clen(*(*[]byte)(unsafe.Pointer(&sl))) - copy(s.Mntfromname[:], old.Mntfromname[:n]) - - sl = old.Mntonname[:] - n = clen(*(*[]byte)(unsafe.Pointer(&sl))) - copy(s.Mntonname[:], old.Mntonname[:n]) -} - -func convertFromDirents11(buf []byte, old []byte) int { - const ( - fixedSize = int(unsafe.Offsetof(Dirent{}.Name)) - oldFixedSize = int(unsafe.Offsetof(dirent_freebsd11{}.Name)) - ) - - dstPos := 0 - srcPos := 0 - for dstPos+fixedSize < len(buf) && srcPos+oldFixedSize < len(old) { - var dstDirent Dirent - var srcDirent dirent_freebsd11 - - // If multiple direntries are written, sometimes when we reach the final one, - // we may have cap of old less than size of dirent_freebsd11. - copy((*[unsafe.Sizeof(srcDirent)]byte)(unsafe.Pointer(&srcDirent))[:], old[srcPos:]) - - reclen := roundup(fixedSize+int(srcDirent.Namlen)+1, 8) - if dstPos+reclen > len(buf) { - break - } - - dstDirent.Fileno = uint64(srcDirent.Fileno) - dstDirent.Off = 0 - dstDirent.Reclen = uint16(reclen) - dstDirent.Type = srcDirent.Type - dstDirent.Pad0 = 0 - dstDirent.Namlen = uint16(srcDirent.Namlen) - dstDirent.Pad1 = 0 - - copy(dstDirent.Name[:], srcDirent.Name[:srcDirent.Namlen]) - copy(buf[dstPos:], (*[unsafe.Sizeof(dstDirent)]byte)(unsafe.Pointer(&dstDirent))[:]) - padding := buf[dstPos+fixedSize+int(dstDirent.Namlen) : dstPos+reclen] - for i := range padding { - padding[i] = 0 - } - - dstPos += int(dstDirent.Reclen) - srcPos += int(srcDirent.Reclen) - } - - return dstPos + return Mknodat(AT_FDCWD, path, mode, dev) } func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { @@ -506,31 +255,31 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e //sys ptrace(request int, pid int, addr uintptr, data int) (err error) func PtraceAttach(pid int) (err error) { - return ptrace(PTRACE_ATTACH, pid, 0, 0) + return ptrace(PT_ATTACH, pid, 0, 0) } func PtraceCont(pid int, signal int) (err error) { - return ptrace(PTRACE_CONT, pid, 1, signal) + return ptrace(PT_CONTINUE, pid, 1, signal) } func PtraceDetach(pid int) (err error) { - return ptrace(PTRACE_DETACH, pid, 1, 0) + return ptrace(PT_DETACH, pid, 1, 0) } func PtraceGetFpRegs(pid int, fpregsout *FpReg) (err error) { - return ptrace(PTRACE_GETFPREGS, pid, uintptr(unsafe.Pointer(fpregsout)), 0) + return ptrace(PT_GETFPREGS, pid, uintptr(unsafe.Pointer(fpregsout)), 0) } func PtraceGetRegs(pid int, regsout *Reg) (err error) { - return ptrace(PTRACE_GETREGS, pid, uintptr(unsafe.Pointer(regsout)), 0) + return ptrace(PT_GETREGS, pid, uintptr(unsafe.Pointer(regsout)), 0) } func PtraceLwpEvents(pid int, enable int) (err error) { - return ptrace(PTRACE_LWPEVENTS, pid, 0, enable) + return ptrace(PT_LWP_EVENTS, pid, 0, enable) } func PtraceLwpInfo(pid int, info uintptr) (err error) { - return ptrace(PTRACE_LWPINFO, pid, info, int(unsafe.Sizeof(PtraceLwpInfoStruct{}))) + return ptrace(PT_LWPINFO, pid, info, int(unsafe.Sizeof(PtraceLwpInfoStruct{}))) } func PtracePeekData(pid int, addr uintptr, out []byte) (count int, err error) { @@ -550,11 +299,11 @@ func PtracePokeText(pid int, addr uintptr, data []byte) (count int, err error) { } func PtraceSetRegs(pid int, regs *Reg) (err error) { - return ptrace(PTRACE_SETREGS, pid, uintptr(unsafe.Pointer(regs)), 0) + return ptrace(PT_SETREGS, pid, uintptr(unsafe.Pointer(regs)), 0) } func PtraceSingleStep(pid int) (err error) { - return ptrace(PTRACE_SINGLESTEP, pid, 1, 0) + return ptrace(PT_STEP, pid, 1, 0) } /* @@ -596,16 +345,12 @@ func PtraceSingleStep(pid int) (err error) { //sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) //sys Flock(fd int, how int) (err error) //sys Fpathconf(fd int, name int) (val int, err error) -//sys fstat(fd int, stat *stat_freebsd11_t) (err error) -//sys fstat_freebsd12(fd int, stat *Stat_t) (err error) -//sys fstatat(fd int, path string, stat *stat_freebsd11_t, flags int) (err error) -//sys fstatat_freebsd12(fd int, path string, stat *Stat_t, flags int) (err error) -//sys fstatfs(fd int, stat *statfs_freebsd11_t) (err error) -//sys fstatfs_freebsd12(fd int, stat *Statfs_t) (err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) +//sys Fstatfs(fd int, stat *Statfs_t) (err error) //sys Fsync(fd int) (err error) //sys Ftruncate(fd int, length int64) (err error) -//sys getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) -//sys getdirentries_freebsd12(fd int, buf []byte, basep *uint64) (n int, err error) +//sys getdirentries(fd int, buf []byte, basep *uint64) (n int, err error) //sys Getdtablesize() (size int) //sysnb Getegid() (egid int) //sysnb Geteuid() (uid int) @@ -627,19 +372,16 @@ func PtraceSingleStep(pid int) (err error) { //sys Link(path string, link string) (err error) //sys Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) //sys Listen(s int, backlog int) (err error) -//sys lstat(path string, stat *stat_freebsd11_t) (err error) //sys Mkdir(path string, mode uint32) (err error) //sys Mkdirat(dirfd int, path string, mode uint32) (err error) //sys Mkfifo(path string, mode uint32) (err error) -//sys mknod(path string, mode uint32, dev int) (err error) -//sys mknodat(fd int, path string, mode uint32, dev int) (err error) -//sys mknodat_freebsd12(fd int, path string, mode uint32, dev uint64) (err error) +//sys Mknodat(fd int, path string, mode uint32, dev uint64) (err error) //sys Nanosleep(time *Timespec, leftover *Timespec) (err error) //sys Open(path string, mode int, perm uint32) (fd int, err error) //sys Openat(fdat int, path string, mode int, perm uint32) (fd int, err error) //sys Pathconf(path string, name int) (val int, err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys pread(fd int, p []byte, offset int64) (n int, err error) +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) //sys read(fd int, p []byte) (n int, err error) //sys Readlink(path string, buf []byte) (n int, err error) //sys Readlinkat(dirfd int, path string, buf []byte) (n int, err error) @@ -663,9 +405,7 @@ func PtraceSingleStep(pid int) (err error) { //sysnb Setsid() (pid int, err error) //sysnb Settimeofday(tp *Timeval) (err error) //sysnb Setuid(uid int) (err error) -//sys stat(path string, stat *stat_freebsd11_t) (err error) -//sys statfs(path string, stat *statfs_freebsd11_t) (err error) -//sys statfs_freebsd12(path string, stat *Statfs_t) (err error) +//sys Statfs(path string, stat *Statfs_t) (err error) //sys Symlink(path string, link string) (err error) //sys Symlinkat(oldpath string, newdirfd int, newpath string) (err error) //sys Sync() (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go index 342fc32b1..c3c4c698e 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go @@ -57,11 +57,11 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) func PtraceGetFsBase(pid int, fsbase *int64) (err error) { - return ptrace(PTRACE_GETFSBASE, pid, uintptr(unsafe.Pointer(fsbase)), 0) + return ptrace(PT_GETFSBASE, pid, uintptr(unsafe.Pointer(fsbase)), 0) } func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) { ioDesc := PtraceIoDesc{Op: int32(req), Offs: (*byte)(unsafe.Pointer(addr)), Addr: (*byte)(unsafe.Pointer(&out[0])), Len: uint32(countin)} - err = ptrace(PTRACE_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0) + err = ptrace(PT_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0) return int(ioDesc.Len), err } diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go index a32d5aa4a..82be61a2f 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go @@ -57,11 +57,11 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) func PtraceGetFsBase(pid int, fsbase *int64) (err error) { - return ptrace(PTRACE_GETFSBASE, pid, uintptr(unsafe.Pointer(fsbase)), 0) + return ptrace(PT_GETFSBASE, pid, uintptr(unsafe.Pointer(fsbase)), 0) } func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) { ioDesc := PtraceIoDesc{Op: int32(req), Offs: (*byte)(unsafe.Pointer(addr)), Addr: (*byte)(unsafe.Pointer(&out[0])), Len: uint64(countin)} - err = ptrace(PTRACE_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0) + err = ptrace(PT_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0) return int(ioDesc.Len), err } diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go index 1e36d39ab..cd58f1026 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go @@ -58,6 +58,6 @@ func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) { ioDesc := PtraceIoDesc{Op: int32(req), Offs: (*byte)(unsafe.Pointer(addr)), Addr: (*byte)(unsafe.Pointer(&out[0])), Len: uint32(countin)} - err = ptrace(PTRACE_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0) + err = ptrace(PT_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0) return int(ioDesc.Len), err } diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go index a09a1537b..d6f538f9e 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go @@ -58,6 +58,6 @@ func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) { ioDesc := PtraceIoDesc{Op: int32(req), Offs: (*byte)(unsafe.Pointer(addr)), Addr: (*byte)(unsafe.Pointer(&out[0])), Len: uint64(countin)} - err = ptrace(PTRACE_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0) + err = ptrace(PT_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0) return int(ioDesc.Len), err } diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go new file mode 100644 index 000000000..8ea6e9610 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go @@ -0,0 +1,63 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build riscv64 && freebsd +// +build riscv64,freebsd + +package unix + +import ( + "syscall" + "unsafe" +) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint64(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (msghdr *Msghdr) SetIovlen(length int) { + msghdr.Iovlen = int32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var writtenOut uint64 = 0 + _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0, 0) + + written = int(writtenOut) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) + +func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) { + ioDesc := PtraceIoDesc{Op: int32(req), Offs: (*byte)(unsafe.Pointer(addr)), Addr: (*byte)(unsafe.Pointer(&out[0])), Len: uint64(countin)} + err = ptrace(PT_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0) + return int(ioDesc.Len), err +} diff --git a/vendor/golang.org/x/sys/unix/syscall_illumos.go b/vendor/golang.org/x/sys/unix/syscall_illumos.go index 8d5f294c4..e48244a9c 100644 --- a/vendor/golang.org/x/sys/unix/syscall_illumos.go +++ b/vendor/golang.org/x/sys/unix/syscall_illumos.go @@ -20,10 +20,9 @@ func bytes2iovec(bs [][]byte) []Iovec { for i, b := range bs { iovecs[i].SetLen(len(b)) if len(b) > 0 { - // somehow Iovec.Base on illumos is (*int8), not (*byte) - iovecs[i].Base = (*int8)(unsafe.Pointer(&b[0])) + iovecs[i].Base = &b[0] } else { - iovecs[i].Base = (*int8)(unsafe.Pointer(&_zero)) + iovecs[i].Base = (*byte)(unsafe.Pointer(&_zero)) } } return iovecs diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go index f432b0684..ecb0f27fb 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -14,6 +14,7 @@ package unix import ( "encoding/binary" "syscall" + "time" "unsafe" ) @@ -249,6 +250,13 @@ func Getwd() (wd string, err error) { if n < 1 || n > len(buf) || buf[n-1] != 0 { return "", EINVAL } + // In some cases, Linux can return a path that starts with the + // "(unreachable)" prefix, which can potentially be a valid relative + // path. To work around that, return ENOENT if path is not absolute. + if buf[0] != '/' { + return "", ENOENT + } + return string(buf[0 : n-1]), nil } @@ -358,6 +366,8 @@ func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, return } +//sys Waitid(idType int, id int, info *Siginfo, options int, rusage *Rusage) (err error) + func Mkfifo(path string, mode uint32) error { return Mknod(path, mode|S_IFIFO, 0) } @@ -502,24 +512,24 @@ func (sa *SockaddrL2) sockaddr() (unsafe.Pointer, _Socklen, error) { // // Server example: // -// fd, _ := Socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM) -// _ = unix.Bind(fd, &unix.SockaddrRFCOMM{ -// Channel: 1, -// Addr: [6]uint8{0, 0, 0, 0, 0, 0}, // BDADDR_ANY or 00:00:00:00:00:00 -// }) -// _ = Listen(fd, 1) -// nfd, sa, _ := Accept(fd) -// fmt.Printf("conn addr=%v fd=%d", sa.(*unix.SockaddrRFCOMM).Addr, nfd) -// Read(nfd, buf) +// fd, _ := Socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM) +// _ = unix.Bind(fd, &unix.SockaddrRFCOMM{ +// Channel: 1, +// Addr: [6]uint8{0, 0, 0, 0, 0, 0}, // BDADDR_ANY or 00:00:00:00:00:00 +// }) +// _ = Listen(fd, 1) +// nfd, sa, _ := Accept(fd) +// fmt.Printf("conn addr=%v fd=%d", sa.(*unix.SockaddrRFCOMM).Addr, nfd) +// Read(nfd, buf) // // Client example: // -// fd, _ := Socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM) -// _ = Connect(fd, &SockaddrRFCOMM{ -// Channel: 1, -// Addr: [6]byte{0x11, 0x22, 0x33, 0xaa, 0xbb, 0xcc}, // CC:BB:AA:33:22:11 -// }) -// Write(fd, []byte(`hello`)) +// fd, _ := Socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM) +// _ = Connect(fd, &SockaddrRFCOMM{ +// Channel: 1, +// Addr: [6]byte{0x11, 0x22, 0x33, 0xaa, 0xbb, 0xcc}, // CC:BB:AA:33:22:11 +// }) +// Write(fd, []byte(`hello`)) type SockaddrRFCOMM struct { // Addr represents a bluetooth address, byte ordering is little-endian. Addr [6]uint8 @@ -546,12 +556,12 @@ func (sa *SockaddrRFCOMM) sockaddr() (unsafe.Pointer, _Socklen, error) { // The SockaddrCAN struct must be bound to the socket file descriptor // using Bind before the CAN socket can be used. // -// // Read one raw CAN frame -// fd, _ := Socket(AF_CAN, SOCK_RAW, CAN_RAW) -// addr := &SockaddrCAN{Ifindex: index} -// Bind(fd, addr) -// frame := make([]byte, 16) -// Read(fd, frame) +// // Read one raw CAN frame +// fd, _ := Socket(AF_CAN, SOCK_RAW, CAN_RAW) +// addr := &SockaddrCAN{Ifindex: index} +// Bind(fd, addr) +// frame := make([]byte, 16) +// Read(fd, frame) // // The full SocketCAN documentation can be found in the linux kernel // archives at: https://www.kernel.org/doc/Documentation/networking/can.txt @@ -622,13 +632,13 @@ func (sa *SockaddrCANJ1939) sockaddr() (unsafe.Pointer, _Socklen, error) { // Here is an example of using an AF_ALG socket with SHA1 hashing. // The initial socket setup process is as follows: // -// // Open a socket to perform SHA1 hashing. -// fd, _ := unix.Socket(unix.AF_ALG, unix.SOCK_SEQPACKET, 0) -// addr := &unix.SockaddrALG{Type: "hash", Name: "sha1"} -// unix.Bind(fd, addr) -// // Note: unix.Accept does not work at this time; must invoke accept() -// // manually using unix.Syscall. -// hashfd, _, _ := unix.Syscall(unix.SYS_ACCEPT, uintptr(fd), 0, 0) +// // Open a socket to perform SHA1 hashing. +// fd, _ := unix.Socket(unix.AF_ALG, unix.SOCK_SEQPACKET, 0) +// addr := &unix.SockaddrALG{Type: "hash", Name: "sha1"} +// unix.Bind(fd, addr) +// // Note: unix.Accept does not work at this time; must invoke accept() +// // manually using unix.Syscall. +// hashfd, _, _ := unix.Syscall(unix.SYS_ACCEPT, uintptr(fd), 0, 0) // // Once a file descriptor has been returned from Accept, it may be used to // perform SHA1 hashing. The descriptor is not safe for concurrent use, but @@ -637,39 +647,39 @@ func (sa *SockaddrCANJ1939) sockaddr() (unsafe.Pointer, _Socklen, error) { // When hashing a small byte slice or string, a single Write and Read may // be used: // -// // Assume hashfd is already configured using the setup process. -// hash := os.NewFile(hashfd, "sha1") -// // Hash an input string and read the results. Each Write discards -// // previous hash state. Read always reads the current state. -// b := make([]byte, 20) -// for i := 0; i < 2; i++ { -// io.WriteString(hash, "Hello, world.") -// hash.Read(b) -// fmt.Println(hex.EncodeToString(b)) -// } -// // Output: -// // 2ae01472317d1935a84797ec1983ae243fc6aa28 -// // 2ae01472317d1935a84797ec1983ae243fc6aa28 +// // Assume hashfd is already configured using the setup process. +// hash := os.NewFile(hashfd, "sha1") +// // Hash an input string and read the results. Each Write discards +// // previous hash state. Read always reads the current state. +// b := make([]byte, 20) +// for i := 0; i < 2; i++ { +// io.WriteString(hash, "Hello, world.") +// hash.Read(b) +// fmt.Println(hex.EncodeToString(b)) +// } +// // Output: +// // 2ae01472317d1935a84797ec1983ae243fc6aa28 +// // 2ae01472317d1935a84797ec1983ae243fc6aa28 // // For hashing larger byte slices, or byte streams such as those read from // a file or socket, use Sendto with MSG_MORE to instruct the kernel to update // the hash digest instead of creating a new one for a given chunk and finalizing it. // -// // Assume hashfd and addr are already configured using the setup process. -// hash := os.NewFile(hashfd, "sha1") -// // Hash the contents of a file. -// f, _ := os.Open("/tmp/linux-4.10-rc7.tar.xz") -// b := make([]byte, 4096) -// for { -// n, err := f.Read(b) -// if err == io.EOF { -// break -// } -// unix.Sendto(hashfd, b[:n], unix.MSG_MORE, addr) -// } -// hash.Read(b) -// fmt.Println(hex.EncodeToString(b)) -// // Output: 85cdcad0c06eef66f805ecce353bec9accbeecc5 +// // Assume hashfd and addr are already configured using the setup process. +// hash := os.NewFile(hashfd, "sha1") +// // Hash the contents of a file. +// f, _ := os.Open("/tmp/linux-4.10-rc7.tar.xz") +// b := make([]byte, 4096) +// for { +// n, err := f.Read(b) +// if err == io.EOF { +// break +// } +// unix.Sendto(hashfd, b[:n], unix.MSG_MORE, addr) +// } +// hash.Read(b) +// fmt.Println(hex.EncodeToString(b)) +// // Output: 85cdcad0c06eef66f805ecce353bec9accbeecc5 // // For more information, see: http://www.chronox.de/crypto-API/crypto/userspace-if.html. type SockaddrALG struct { @@ -1489,19 +1499,13 @@ func KeyctlRestrictKeyring(ringid int, keyType string, restriction string) error //sys keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) = SYS_KEYCTL //sys keyctlRestrictKeyring(cmd int, arg2 int) (err error) = SYS_KEYCTL -func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { +func recvmsgRaw(fd int, iov []Iovec, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn int, recvflags int, err error) { var msg Msghdr - var rsa RawSockaddrAny - msg.Name = (*byte)(unsafe.Pointer(&rsa)) + msg.Name = (*byte)(unsafe.Pointer(rsa)) msg.Namelen = uint32(SizeofSockaddrAny) - var iov Iovec - if len(p) > 0 { - iov.Base = &p[0] - iov.SetLen(len(p)) - } var dummy byte if len(oob) > 0 { - if len(p) == 0 { + if emptyIovecs(iov) { var sockType int sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE) if err != nil { @@ -1509,53 +1513,36 @@ func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from } // receive at least one normal byte if sockType != SOCK_DGRAM { - iov.Base = &dummy - iov.SetLen(1) + var iova [1]Iovec + iova[0].Base = &dummy + iova[0].SetLen(1) + iov = iova[:] } } msg.Control = &oob[0] msg.SetControllen(len(oob)) } - msg.Iov = &iov - msg.Iovlen = 1 + if len(iov) > 0 { + msg.Iov = &iov[0] + msg.SetIovlen(len(iov)) + } if n, err = recvmsg(fd, &msg, flags); err != nil { return } oobn = int(msg.Controllen) recvflags = int(msg.Flags) - // source address is only specified if the socket is unconnected - if rsa.Addr.Family != AF_UNSPEC { - from, err = anyToSockaddr(fd, &rsa) - } return } -func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { - _, err = SendmsgN(fd, p, oob, to, flags) - return -} - -func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { - var ptr unsafe.Pointer - var salen _Socklen - if to != nil { - var err error - ptr, salen, err = to.sockaddr() - if err != nil { - return 0, err - } - } +func sendmsgN(fd int, iov []Iovec, oob []byte, ptr unsafe.Pointer, salen _Socklen, flags int) (n int, err error) { var msg Msghdr msg.Name = (*byte)(ptr) msg.Namelen = uint32(salen) - var iov Iovec - if len(p) > 0 { - iov.Base = &p[0] - iov.SetLen(len(p)) - } var dummy byte + var empty bool if len(oob) > 0 { - if len(p) == 0 { + empty = emptyIovecs(iov) + if empty { var sockType int sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE) if err != nil { @@ -1563,19 +1550,22 @@ func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) } // send at least one normal byte if sockType != SOCK_DGRAM { - iov.Base = &dummy - iov.SetLen(1) + var iova [1]Iovec + iova[0].Base = &dummy + iova[0].SetLen(1) } } msg.Control = &oob[0] msg.SetControllen(len(oob)) } - msg.Iov = &iov - msg.Iovlen = 1 + if len(iov) > 0 { + msg.Iov = &iov[0] + msg.SetIovlen(len(iov)) + } if n, err = sendmsg(fd, &msg, flags); err != nil { return 0, err } - if len(oob) > 0 && len(p) == 0 { + if len(oob) > 0 && empty { n = 0 } return n, nil @@ -1838,6 +1828,9 @@ func Dup2(oldfd, newfd int) error { //sys Fremovexattr(fd int, attr string) (err error) //sys Fsetxattr(fd int, attr string, dest []byte, flags int) (err error) //sys Fsync(fd int) (err error) +//sys Fsmount(fd int, flags int, mountAttrs int) (fsfd int, err error) +//sys Fsopen(fsName string, flags int) (fd int, err error) +//sys Fspick(dirfd int, pathName string, flags int) (fd int, err error) //sys Getdents(fd int, buf []byte) (n int, err error) = SYS_GETDENTS64 //sysnb Getpgid(pid int) (pgid int, err error) @@ -1868,7 +1861,9 @@ func Getpgrp() (pid int) { //sys MemfdCreate(name string, flags int) (fd int, err error) //sys Mkdirat(dirfd int, path string, mode uint32) (err error) //sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error) +//sys MoveMount(fromDirfd int, fromPathName string, toDirfd int, toPathName string, flags int) (err error) //sys Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys OpenTree(dfd int, fileName string, flags uint) (r int, err error) //sys PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) //sys PivotRoot(newroot string, putold string) (err error) = SYS_PIVOT_ROOT //sysnb Prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) = SYS_PRLIMIT64 @@ -2193,7 +2188,7 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { gid = Getgid() } - if uint32(gid) == st.Gid || isGroupMember(gid) { + if uint32(gid) == st.Gid || isGroupMember(int(st.Gid)) { fmode = (st.Mode >> 3) & 7 } else { fmode = st.Mode & 7 @@ -2308,17 +2303,63 @@ type RemoteIovec struct { //sys PidfdOpen(pid int, flags int) (fd int, err error) = SYS_PIDFD_OPEN //sys PidfdGetfd(pidfd int, targetfd int, flags int) (fd int, err error) = SYS_PIDFD_GETFD +//sys PidfdSendSignal(pidfd int, sig Signal, info *Siginfo, flags int) (err error) = SYS_PIDFD_SEND_SIGNAL //sys shmat(id int, addr uintptr, flag int) (ret uintptr, err error) //sys shmctl(id int, cmd int, buf *SysvShmDesc) (result int, err error) //sys shmdt(addr uintptr) (err error) //sys shmget(key int, size int, flag int) (id int, err error) +//sys getitimer(which int, currValue *Itimerval) (err error) +//sys setitimer(which int, newValue *Itimerval, oldValue *Itimerval) (err error) + +// MakeItimerval creates an Itimerval from interval and value durations. +func MakeItimerval(interval, value time.Duration) Itimerval { + return Itimerval{ + Interval: NsecToTimeval(interval.Nanoseconds()), + Value: NsecToTimeval(value.Nanoseconds()), + } +} + +// A value which may be passed to the which parameter for Getitimer and +// Setitimer. +type ItimerWhich int + +// Possible which values for Getitimer and Setitimer. +const ( + ItimerReal ItimerWhich = ITIMER_REAL + ItimerVirtual ItimerWhich = ITIMER_VIRTUAL + ItimerProf ItimerWhich = ITIMER_PROF +) + +// Getitimer wraps getitimer(2) to return the current value of the timer +// specified by which. +func Getitimer(which ItimerWhich) (Itimerval, error) { + var it Itimerval + if err := getitimer(int(which), &it); err != nil { + return Itimerval{}, err + } + + return it, nil +} + +// Setitimer wraps setitimer(2) to arm or disarm the timer specified by which. +// It returns the previous value of the timer. +// +// If the Itimerval argument is the zero value, the timer will be disarmed. +func Setitimer(which ItimerWhich, it Itimerval) (Itimerval, error) { + var prev Itimerval + if err := setitimer(int(which), &it, &prev); err != nil { + return Itimerval{}, err + } + + return prev, nil +} + /* * Unimplemented */ // AfsSyscall -// Alarm // ArchPrctl // Brk // ClockNanosleep @@ -2334,7 +2375,6 @@ type RemoteIovec struct { // GetMempolicy // GetRobustList // GetThreadArea -// Getitimer // Getpmsg // IoCancel // IoDestroy @@ -2412,5 +2452,4 @@ type RemoteIovec struct { // Vfork // Vhangup // Vserver -// Waitid // _Sysctl diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_386.go b/vendor/golang.org/x/sys/unix/syscall_linux_386.go index 5f757e8aa..518e476e6 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_386.go @@ -35,8 +35,8 @@ func setTimeval(sec, usec int64) Timeval { //sys Iopl(level int) (err error) //sys Lchown(path string, uid int, gid int) (err error) = SYS_LCHOWN32 //sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 -//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 //sys setfsgid(gid int) (prev int, err error) = SYS_SETFSGID32 @@ -173,14 +173,6 @@ const ( _SENDMMSG = 20 ) -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - fd, e := socketcall(_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) - if e != 0 { - err = e - } - return -} - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { fd, e := socketcall(_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) if e != 0 { diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_alarm.go b/vendor/golang.org/x/sys/unix/syscall_linux_alarm.go new file mode 100644 index 000000000..08086ac6a --- /dev/null +++ b/vendor/golang.org/x/sys/unix/syscall_linux_alarm.go @@ -0,0 +1,14 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build linux && (386 || amd64 || mips || mipsle || mips64 || mipsle || ppc64 || ppc64le || ppc || s390x || sparc64) +// +build linux +// +build 386 amd64 mips mipsle mips64 mipsle ppc64 ppc64le ppc s390x sparc64 + +package unix + +// SYS_ALARM is not defined on arm or riscv, but is available for other GOARCH +// values. + +//sys Alarm(seconds uint) (remaining uint, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go index 4299125aa..f5e9d6bef 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go @@ -28,9 +28,10 @@ func Lstat(path string, stat *Stat_t) (err error) { return Fstatat(AT_FDCWD, path, stat, AT_SYMLINK_NOFOLLOW) } +//sys MemfdSecret(flags int) (fd int, err error) //sys Pause() (err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK @@ -62,7 +63,6 @@ func Stat(path string, stat *Stat_t) (err error) { //sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) //sys Truncate(path string, length int64) (err error) //sys Ustat(dev int, ubuf *Ustat_t) (err error) -//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go index 79edeb9cb..c1a7778f1 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go @@ -27,7 +27,6 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { return newoffset, nil } -//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) @@ -97,8 +96,8 @@ func Utime(path string, buf *Utimbuf) error { //sys utimes(path string, times *[2]Timeval) (err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64 //sys Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64 diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go index 862890de2..d83e2c657 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go @@ -22,8 +22,9 @@ import "unsafe" //sysnb getrlimit(resource int, rlim *Rlimit) (err error) //sysnb Getuid() (uid int) //sys Listen(s int, n int) (err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys MemfdSecret(flags int) (fd int, err error) +//sys pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK @@ -66,7 +67,6 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { return ENOSYS } -//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go b/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go new file mode 100644 index 000000000..0b69c3eff --- /dev/null +++ b/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go @@ -0,0 +1,226 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build loong64 && linux +// +build loong64,linux + +package unix + +import "unsafe" + +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) = SYS_EPOLL_PWAIT +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getuid() (uid int) +//sys Listen(s int, n int) (err error) +//sys pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + var ts *Timespec + if timeout != nil { + ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} + } + return Pselect(nfd, r, w, e, ts, nil) +} + +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) +//sys setfsgid(gid int) (prev int, err error) +//sys setfsuid(uid int) (prev int, err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) + +func timespecFromStatxTimestamp(x StatxTimestamp) Timespec { + return Timespec{ + Sec: x.Sec, + Nsec: int64(x.Nsec), + } +} + +func Fstatat(fd int, path string, stat *Stat_t, flags int) error { + var r Statx_t + // Do it the glibc way, add AT_NO_AUTOMOUNT. + if err := Statx(fd, path, AT_NO_AUTOMOUNT|flags, STATX_BASIC_STATS, &r); err != nil { + return err + } + + stat.Dev = Mkdev(r.Dev_major, r.Dev_minor) + stat.Ino = r.Ino + stat.Mode = uint32(r.Mode) + stat.Nlink = r.Nlink + stat.Uid = r.Uid + stat.Gid = r.Gid + stat.Rdev = Mkdev(r.Rdev_major, r.Rdev_minor) + // hope we don't get to process files so large to overflow these size + // fields... + stat.Size = int64(r.Size) + stat.Blksize = int32(r.Blksize) + stat.Blocks = int64(r.Blocks) + stat.Atim = timespecFromStatxTimestamp(r.Atime) + stat.Mtim = timespecFromStatxTimestamp(r.Mtime) + stat.Ctim = timespecFromStatxTimestamp(r.Ctime) + + return nil +} + +func Fstat(fd int, stat *Stat_t) (err error) { + return Fstatat(fd, "", stat, AT_EMPTY_PATH) +} + +func Stat(path string, stat *Stat_t) (err error) { + return Fstatat(AT_FDCWD, path, stat, 0) +} + +func Lchown(path string, uid int, gid int) (err error) { + return Fchownat(AT_FDCWD, path, uid, gid, AT_SYMLINK_NOFOLLOW) +} + +func Lstat(path string, stat *Stat_t) (err error) { + return Fstatat(AT_FDCWD, path, stat, AT_SYMLINK_NOFOLLOW) +} + +//sys Statfs(path string, buf *Statfs_t) (err error) +//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) +//sys Truncate(path string, length int64) (err error) + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + return ENOSYS +} + +//sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) +//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) + +//sysnb Gettimeofday(tv *Timeval) (err error) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} +} + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + err = Prlimit(0, resource, nil, rlim) + return +} + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + err = Prlimit(0, resource, rlim, nil) + return +} + +func futimesat(dirfd int, path string, tv *[2]Timeval) (err error) { + if tv == nil { + return utimensat(dirfd, path, nil, 0) + } + + ts := []Timespec{ + NsecToTimespec(TimevalToNsec(tv[0])), + NsecToTimespec(TimevalToNsec(tv[1])), + } + return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) +} + +func Time(t *Time_t) (Time_t, error) { + var tv Timeval + err := Gettimeofday(&tv) + if err != nil { + return 0, err + } + if t != nil { + *t = Time_t(tv.Sec) + } + return Time_t(tv.Sec), nil +} + +func Utime(path string, buf *Utimbuf) error { + tv := []Timeval{ + {Sec: buf.Actime}, + {Sec: buf.Modtime}, + } + return Utimes(path, tv) +} + +func utimes(path string, tv *[2]Timeval) (err error) { + if tv == nil { + return utimensat(AT_FDCWD, path, nil, 0) + } + + ts := []Timespec{ + NsecToTimespec(TimevalToNsec(tv[0])), + NsecToTimespec(TimevalToNsec(tv[1])), + } + return utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) +} + +func (r *PtraceRegs) PC() uint64 { return r.Era } + +func (r *PtraceRegs) SetPC(era uint64) { r.Era = era } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint64(length) +} + +func (msghdr *Msghdr) SetIovlen(length int) { + msghdr.Iovlen = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint64(length) +} + +func (rsa *RawSockaddrNFCLLCP) SetServiceNameLen(length int) { + rsa.Service_name_len = uint64(length) +} + +func Pause() error { + _, err := ppoll(nil, 0, nil, nil) + return err +} + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + return Renameat2(olddirfd, oldpath, newdirfd, newpath, 0) +} + +//sys kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, flags int) (err error) + +func KexecFileLoad(kernelFd int, initrdFd int, cmdline string, flags int) error { + cmdlineLen := len(cmdline) + if cmdlineLen > 0 { + // Account for the additional NULL byte added by + // BytePtrFromString in kexecFileLoad. The kexec_file_load + // syscall expects a NULL-terminated string. + cmdlineLen++ + } + return kexecFileLoad(kernelFd, initrdFd, cmdlineLen, cmdline, flags) +} diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go index 8932e34ad..98a2660b9 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go @@ -21,8 +21,8 @@ package unix //sys Lchown(path string, uid int, gid int) (err error) //sys Listen(s int, n int) (err error) //sys Pause() (err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK @@ -48,7 +48,6 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err //sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) //sys Truncate(path string, length int64) (err error) //sys Ustat(dev int, ubuf *Ustat_t) (err error) -//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go index 7821c25d9..b8a18c0ad 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go @@ -25,8 +25,8 @@ func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, //sysnb Getuid() (uid int) //sys Lchown(path string, uid int, gid int) (err error) //sys Listen(s int, n int) (err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 @@ -41,7 +41,6 @@ func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, //sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) //sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64 //sys Ustat(dev int, ubuf *Ustat_t) (err error) -//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go b/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go index c5053a0f0..4ed9e67c6 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go @@ -27,8 +27,8 @@ import ( //sys Listen(s int, n int) (err error) //sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 //sys Pause() (err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 @@ -43,7 +43,6 @@ import ( //sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 //sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64 //sys Ustat(dev int, ubuf *Ustat_t) (err error) -//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go b/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go index 25786c421..db63d384c 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go @@ -26,8 +26,8 @@ package unix //sys Listen(s int, n int) (err error) //sys Lstat(path string, stat *Stat_t) (err error) //sys Pause() (err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT @@ -45,7 +45,6 @@ package unix //sys Statfs(path string, buf *Statfs_t) (err error) //sys Truncate(path string, length int64) (err error) //sys Ustat(dev int, ubuf *Ustat_t) (err error) -//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go index 6f9f71041..925a748a3 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go @@ -22,8 +22,9 @@ import "unsafe" //sysnb Getrlimit(resource int, rlim *Rlimit) (err error) //sysnb Getuid() (uid int) //sys Listen(s int, n int) (err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys MemfdSecret(flags int) (fd int, err error) +//sys pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { @@ -65,7 +66,6 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { return ENOSYS } -//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go index 6aa59cb27..6fcf277b0 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go @@ -26,8 +26,8 @@ import ( //sys Lchown(path string, uid int, gid int) (err error) //sys Lstat(path string, stat *Stat_t) (err error) //sys Pause() (err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) @@ -145,15 +145,6 @@ const ( netSendMMsg = 20 ) -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (int, error) { - args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))} - fd, _, err := Syscall(SYS_SOCKETCALL, netAccept, uintptr(unsafe.Pointer(&args)), 0) - if err != 0 { - return 0, err - } - return int(fd), nil -} - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (int, error) { args := [4]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags)} fd, _, err := Syscall(SYS_SOCKETCALL, netAccept4, uintptr(unsafe.Pointer(&args)), 0) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go b/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go index bbe8d174f..02a45d9cc 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go @@ -23,8 +23,8 @@ package unix //sys Listen(s int, n int) (err error) //sys Lstat(path string, stat *Stat_t) (err error) //sys Pause() (err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) @@ -42,7 +42,6 @@ package unix //sys Statfs(path string, buf *Statfs_t) (err error) //sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) //sys Truncate(path string, length int64) (err error) -//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd.go b/vendor/golang.org/x/sys/unix/syscall_netbsd.go index 696fed496..666f0a1b3 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd.go @@ -163,11 +163,6 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e return -1, ENOSYS } -func setattrlistTimes(path string, times []Timespec, flags int) error { - // used on Darwin for UtimesNano - return ENOSYS -} - //sys ioctl(fd int, req uint, arg uintptr) (err error) //sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL @@ -313,8 +308,8 @@ func Statvfs(path string, buf *Statvfs_t) (err error) { //sys Open(path string, mode int, perm uint32) (fd int, err error) //sys Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) //sys Pathconf(path string, name int) (val int, err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys pread(fd int, p []byte, offset int64) (n int, err error) +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) //sys read(fd int, p []byte) (n int, err error) //sys Readlink(path string, buf []byte) (n int, err error) //sys Readlinkat(dirfd int, path string, buf []byte) (n int, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd.go b/vendor/golang.org/x/sys/unix/syscall_openbsd.go index 11b1d419d..78daceb33 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd.go @@ -81,6 +81,7 @@ func Pipe(p []int) (err error) { } //sysnb pipe2(p *[2]_C_int, flags int) (err error) + func Pipe2(p []int, flags int) error { if len(p) != 2 { return EINVAL @@ -95,6 +96,7 @@ func Pipe2(p []int, flags int) error { } //sys Getdents(fd int, buf []byte) (n int, err error) + func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { n, err = Getdents(fd, buf) if err != nil || basep == nil { @@ -149,11 +151,6 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { return } -func setattrlistTimes(path string, times []Timespec, flags int) error { - // used on Darwin for UtimesNano - return ENOSYS -} - //sys ioctl(fd int, req uint, arg uintptr) (err error) //sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL @@ -274,8 +271,8 @@ func Uname(uname *Utsname) error { //sys Open(path string, mode int, perm uint32) (fd int, err error) //sys Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) //sys Pathconf(path string, name int) (val int, err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys pread(fd int, p []byte, offset int64) (n int, err error) +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) //sys read(fd int, p []byte) (n int, err error) //sys Readlink(path string, buf []byte) (n int, err error) //sys Readlinkat(dirfd int, path string, buf []byte) (n int, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_libc.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_libc.go new file mode 100644 index 000000000..e23c33de6 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_libc.go @@ -0,0 +1,27 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build (openbsd && 386) || (openbsd && amd64) || (openbsd && arm64) +// +build openbsd,386 openbsd,amd64 openbsd,arm64 + +package unix + +import _ "unsafe" + +// Implemented in the runtime package (runtime/sys_openbsd3.go) +func syscall_syscall(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) +func syscall_syscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) +func syscall_syscall10(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 uintptr) (r1, r2 uintptr, err Errno) +func syscall_rawSyscall(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) +func syscall_rawSyscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) + +//go:linkname syscall_syscall syscall.syscall +//go:linkname syscall_syscall6 syscall.syscall6 +//go:linkname syscall_syscall10 syscall.syscall10 +//go:linkname syscall_rawSyscall syscall.rawSyscall +//go:linkname syscall_rawSyscall6 syscall.rawSyscall6 + +func syscall_syscall9(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno) { + return syscall_syscall10(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, 0) +} diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_mips64.go index 30f285343..1378489f8 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd_mips64.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_mips64.go @@ -26,6 +26,10 @@ func (msghdr *Msghdr) SetControllen(length int) { msghdr.Controllen = uint32(length) } +func (msghdr *Msghdr) SetIovlen(length int) { + msghdr.Iovlen = uint32(length) +} + func (cmsg *Cmsghdr) SetLen(length int) { cmsg.Len = uint32(length) } diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris.go b/vendor/golang.org/x/sys/unix/syscall_solaris.go index 5c813921e..b5ec457cd 100644 --- a/vendor/golang.org/x/sys/unix/syscall_solaris.go +++ b/vendor/golang.org/x/sys/unix/syscall_solaris.go @@ -451,77 +451,59 @@ func Accept(fd int) (nfd int, sa Sockaddr, err error) { //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.__xnet_recvmsg -func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { +func recvmsgRaw(fd int, iov []Iovec, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn int, recvflags int, err error) { var msg Msghdr - var rsa RawSockaddrAny - msg.Name = (*byte)(unsafe.Pointer(&rsa)) + msg.Name = (*byte)(unsafe.Pointer(rsa)) msg.Namelen = uint32(SizeofSockaddrAny) - var iov Iovec - if len(p) > 0 { - iov.Base = (*int8)(unsafe.Pointer(&p[0])) - iov.SetLen(len(p)) - } - var dummy int8 + var dummy byte if len(oob) > 0 { // receive at least one normal byte - if len(p) == 0 { - iov.Base = &dummy - iov.SetLen(1) + if emptyIovecs(iov) { + var iova [1]Iovec + iova[0].Base = &dummy + iova[0].SetLen(1) + iov = iova[:] } msg.Accrightslen = int32(len(oob)) } - msg.Iov = &iov - msg.Iovlen = 1 + if len(iov) > 0 { + msg.Iov = &iov[0] + msg.SetIovlen(len(iov)) + } if n, err = recvmsg(fd, &msg, flags); n == -1 { return } oobn = int(msg.Accrightslen) - // source address is only specified if the socket is unconnected - if rsa.Addr.Family != AF_UNSPEC { - from, err = anyToSockaddr(fd, &rsa) - } - return -} - -func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { - _, err = SendmsgN(fd, p, oob, to, flags) return } //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.__xnet_sendmsg -func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { - var ptr unsafe.Pointer - var salen _Socklen - if to != nil { - ptr, salen, err = to.sockaddr() - if err != nil { - return 0, err - } - } +func sendmsgN(fd int, iov []Iovec, oob []byte, ptr unsafe.Pointer, salen _Socklen, flags int) (n int, err error) { var msg Msghdr msg.Name = (*byte)(unsafe.Pointer(ptr)) msg.Namelen = uint32(salen) - var iov Iovec - if len(p) > 0 { - iov.Base = (*int8)(unsafe.Pointer(&p[0])) - iov.SetLen(len(p)) - } - var dummy int8 + var dummy byte + var empty bool if len(oob) > 0 { // send at least one normal byte - if len(p) == 0 { - iov.Base = &dummy - iov.SetLen(1) + empty = emptyIovecs(iov) + if empty { + var iova [1]Iovec + iova[0].Base = &dummy + iova[0].SetLen(1) + iov = iova[:] } msg.Accrightslen = int32(len(oob)) } - msg.Iov = &iov - msg.Iovlen = 1 + if len(iov) > 0 { + msg.Iov = &iov[0] + msg.SetIovlen(len(iov)) + } if n, err = sendmsg(fd, &msg, flags); err != nil { return 0, err } - if len(oob) > 0 && len(p) == 0 { + if len(oob) > 0 && empty { n = 0 } return n, nil @@ -636,6 +618,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e //sys Getpriority(which int, who int) (n int, err error) //sysnb Getrlimit(which int, lim *Rlimit) (err error) //sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Getsid(pid int) (sid int, err error) //sysnb Gettimeofday(tv *Timeval) (err error) //sysnb Getuid() (uid int) //sys Kill(pid int, signum syscall.Signal) (err error) @@ -661,8 +644,8 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e //sys Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) //sys Pathconf(path string, name int) (val int, err error) //sys Pause() (err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys pread(fd int, p []byte, offset int64) (n int, err error) +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) //sys read(fd int, p []byte) (n int, err error) //sys Readlink(path string, buf []byte) (n int, err error) //sys Rename(from string, to string) (err error) @@ -755,8 +738,20 @@ type fileObjCookie struct { type EventPort struct { port int mu sync.Mutex - fds map[uintptr]interface{} + fds map[uintptr]*fileObjCookie paths map[string]*fileObjCookie + // The user cookie presents an interesting challenge from a memory management perspective. + // There are two paths by which we can discover that it is no longer in use: + // 1. The user calls port_dissociate before any events fire + // 2. An event fires and we return it to the user + // The tricky situation is if the event has fired in the kernel but + // the user hasn't requested/received it yet. + // If the user wants to port_dissociate before the event has been processed, + // we should handle things gracefully. To do so, we need to keep an extra + // reference to the cookie around until the event is processed + // thus the otherwise seemingly extraneous "cookies" map + // The key of this map is a pointer to the corresponding &fCookie.cookie + cookies map[*interface{}]*fileObjCookie } // PortEvent is an abstraction of the port_event C struct. @@ -780,9 +775,10 @@ func NewEventPort() (*EventPort, error) { return nil, err } e := &EventPort{ - port: port, - fds: make(map[uintptr]interface{}), - paths: make(map[string]*fileObjCookie), + port: port, + fds: make(map[uintptr]*fileObjCookie), + paths: make(map[string]*fileObjCookie), + cookies: make(map[*interface{}]*fileObjCookie), } return e, nil } @@ -797,9 +793,13 @@ func NewEventPort() (*EventPort, error) { func (e *EventPort) Close() error { e.mu.Lock() defer e.mu.Unlock() + err := Close(e.port) + if err != nil { + return err + } e.fds = nil e.paths = nil - return Close(e.port) + return nil } // PathIsWatched checks to see if path is associated with this EventPort. @@ -836,6 +836,7 @@ func (e *EventPort) AssociatePath(path string, stat os.FileInfo, events int, coo return err } e.paths[path] = fCookie + e.cookies[&fCookie.cookie] = fCookie return nil } @@ -848,11 +849,19 @@ func (e *EventPort) DissociatePath(path string) error { return fmt.Errorf("%v is not associated with this Event Port", path) } _, err := port_dissociate(e.port, PORT_SOURCE_FILE, uintptr(unsafe.Pointer(f.fobj))) - if err != nil { + // If the path is no longer associated with this event port (ENOENT) + // we should delete it from our map. We can still return ENOENT to the caller. + // But we need to save the cookie + if err != nil && err != ENOENT { return err } + if err == nil { + // dissociate was successful, safe to delete the cookie + fCookie := e.paths[path] + delete(e.cookies, &fCookie.cookie) + } delete(e.paths, path) - return nil + return err } // AssociateFd wraps calls to port_associate(3c) on file descriptors. @@ -862,12 +871,13 @@ func (e *EventPort) AssociateFd(fd uintptr, events int, cookie interface{}) erro if _, found := e.fds[fd]; found { return fmt.Errorf("%v is already associated with this Event Port", fd) } - pcookie := &cookie - _, err := port_associate(e.port, PORT_SOURCE_FD, fd, events, (*byte)(unsafe.Pointer(pcookie))) + fCookie := &fileObjCookie{nil, cookie} + _, err := port_associate(e.port, PORT_SOURCE_FD, fd, events, (*byte)(unsafe.Pointer(&fCookie.cookie))) if err != nil { return err } - e.fds[fd] = pcookie + e.fds[fd] = fCookie + e.cookies[&fCookie.cookie] = fCookie return nil } @@ -880,11 +890,16 @@ func (e *EventPort) DissociateFd(fd uintptr) error { return fmt.Errorf("%v is not associated with this Event Port", fd) } _, err := port_dissociate(e.port, PORT_SOURCE_FD, fd) - if err != nil { + if err != nil && err != ENOENT { return err } + if err == nil { + // dissociate was successful, safe to delete the cookie + fCookie := e.fds[fd] + delete(e.cookies, &fCookie.cookie) + } delete(e.fds, fd) - return nil + return err } func createFileObj(name string, stat os.FileInfo) (*fileObj, error) { @@ -912,26 +927,48 @@ func (e *EventPort) GetOne(t *Timespec) (*PortEvent, error) { return nil, err } p := new(PortEvent) - p.Events = pe.Events - p.Source = pe.Source e.mu.Lock() defer e.mu.Unlock() - switch pe.Source { - case PORT_SOURCE_FD: - p.Fd = uintptr(pe.Object) - cookie := (*interface{})(unsafe.Pointer(pe.User)) - p.Cookie = *cookie - delete(e.fds, p.Fd) - case PORT_SOURCE_FILE: - p.fobj = (*fileObj)(unsafe.Pointer(uintptr(pe.Object))) - p.Path = BytePtrToString((*byte)(unsafe.Pointer(p.fobj.Name))) - cookie := (*interface{})(unsafe.Pointer(pe.User)) - p.Cookie = *cookie - delete(e.paths, p.Path) - } + e.peIntToExt(pe, p) return p, nil } +// peIntToExt converts a cgo portEvent struct into the friendlier PortEvent +// NOTE: Always call this function while holding the e.mu mutex +func (e *EventPort) peIntToExt(peInt *portEvent, peExt *PortEvent) { + peExt.Events = peInt.Events + peExt.Source = peInt.Source + cookie := (*interface{})(unsafe.Pointer(peInt.User)) + peExt.Cookie = *cookie + switch peInt.Source { + case PORT_SOURCE_FD: + delete(e.cookies, cookie) + peExt.Fd = uintptr(peInt.Object) + // Only remove the fds entry if it exists and this cookie matches + if fobj, ok := e.fds[peExt.Fd]; ok { + if &fobj.cookie == cookie { + delete(e.fds, peExt.Fd) + } + } + case PORT_SOURCE_FILE: + if fCookie, ok := e.cookies[cookie]; ok && uintptr(unsafe.Pointer(fCookie.fobj)) == uintptr(peInt.Object) { + // Use our stashed reference rather than using unsafe on what we got back + // the unsafe version would be (*fileObj)(unsafe.Pointer(uintptr(peInt.Object))) + peExt.fobj = fCookie.fobj + } else { + panic("mismanaged memory") + } + delete(e.cookies, cookie) + peExt.Path = BytePtrToString((*byte)(unsafe.Pointer(peExt.fobj.Name))) + // Only remove the paths entry if it exists and this cookie matches + if fobj, ok := e.paths[peExt.Path]; ok { + if &fobj.cookie == cookie { + delete(e.paths, peExt.Path) + } + } + } +} + // Pending wraps port_getn(3c) and returns how many events are pending. func (e *EventPort) Pending() (int, error) { var n uint32 = 0 @@ -962,21 +999,7 @@ func (e *EventPort) Get(s []PortEvent, min int, timeout *Timespec) (int, error) e.mu.Lock() defer e.mu.Unlock() for i := 0; i < int(got); i++ { - s[i].Events = ps[i].Events - s[i].Source = ps[i].Source - switch ps[i].Source { - case PORT_SOURCE_FD: - s[i].Fd = uintptr(ps[i].Object) - cookie := (*interface{})(unsafe.Pointer(ps[i].User)) - s[i].Cookie = *cookie - delete(e.fds, s[i].Fd) - case PORT_SOURCE_FILE: - s[i].fobj = (*fileObj)(unsafe.Pointer(uintptr(ps[i].Object))) - s[i].Path = BytePtrToString((*byte)(unsafe.Pointer(s[i].fobj.Name))) - cookie := (*interface{})(unsafe.Pointer(ps[i].User)) - s[i].Cookie = *cookie - delete(e.paths, s[i].Path) - } + e.peIntToExt(&ps[i], &s[i]) } return int(got), err } diff --git a/vendor/golang.org/x/sys/unix/syscall_unix.go b/vendor/golang.org/x/sys/unix/syscall_unix.go index cf296a243..1ff5060b5 100644 --- a/vendor/golang.org/x/sys/unix/syscall_unix.go +++ b/vendor/golang.org/x/sys/unix/syscall_unix.go @@ -177,6 +177,30 @@ func Write(fd int, p []byte) (n int, err error) { return } +func Pread(fd int, p []byte, offset int64) (n int, err error) { + n, err = pread(fd, p, offset) + if raceenabled { + if n > 0 { + raceWriteRange(unsafe.Pointer(&p[0]), n) + } + if err == nil { + raceAcquire(unsafe.Pointer(&ioSync)) + } + } + return +} + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + if raceenabled { + raceReleaseMerge(unsafe.Pointer(&ioSync)) + } + n, err = pwrite(fd, p, offset) + if raceenabled && n > 0 { + raceReadRange(unsafe.Pointer(&p[0]), n) + } + return +} + // For testing: clients can set this flag to force // creation of IPv6 sockets to return EAFNOSUPPORT. var SocketDisableIPv6 bool @@ -313,6 +337,93 @@ func Recvfrom(fd int, p []byte, flags int) (n int, from Sockaddr, err error) { return } +func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { + var iov [1]Iovec + if len(p) > 0 { + iov[0].Base = &p[0] + iov[0].SetLen(len(p)) + } + var rsa RawSockaddrAny + n, oobn, recvflags, err = recvmsgRaw(fd, iov[:], oob, flags, &rsa) + // source address is only specified if the socket is unconnected + if rsa.Addr.Family != AF_UNSPEC { + from, err = anyToSockaddr(fd, &rsa) + } + return +} + +// RecvmsgBuffers receives a message from a socket using the recvmsg +// system call. The flags are passed to recvmsg. Any non-control data +// read is scattered into the buffers slices. The results are: +// - n is the number of non-control data read into bufs +// - oobn is the number of control data read into oob; this may be interpreted using [ParseSocketControlMessage] +// - recvflags is flags returned by recvmsg +// - from is the address of the sender +func RecvmsgBuffers(fd int, buffers [][]byte, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { + iov := make([]Iovec, len(buffers)) + for i := range buffers { + if len(buffers[i]) > 0 { + iov[i].Base = &buffers[i][0] + iov[i].SetLen(len(buffers[i])) + } else { + iov[i].Base = (*byte)(unsafe.Pointer(&_zero)) + } + } + var rsa RawSockaddrAny + n, oobn, recvflags, err = recvmsgRaw(fd, iov, oob, flags, &rsa) + if err == nil && rsa.Addr.Family != AF_UNSPEC { + from, err = anyToSockaddr(fd, &rsa) + } + return +} + +func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { + _, err = SendmsgN(fd, p, oob, to, flags) + return +} + +func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { + var iov [1]Iovec + if len(p) > 0 { + iov[0].Base = &p[0] + iov[0].SetLen(len(p)) + } + var ptr unsafe.Pointer + var salen _Socklen + if to != nil { + ptr, salen, err = to.sockaddr() + if err != nil { + return 0, err + } + } + return sendmsgN(fd, iov[:], oob, ptr, salen, flags) +} + +// SendmsgBuffers sends a message on a socket to an address using the sendmsg +// system call. The flags are passed to sendmsg. Any non-control data written +// is gathered from buffers. The function returns the number of bytes written +// to the socket. +func SendmsgBuffers(fd int, buffers [][]byte, oob []byte, to Sockaddr, flags int) (n int, err error) { + iov := make([]Iovec, len(buffers)) + for i := range buffers { + if len(buffers[i]) > 0 { + iov[i].Base = &buffers[i][0] + iov[i].SetLen(len(buffers[i])) + } else { + iov[i].Base = (*byte)(unsafe.Pointer(&_zero)) + } + } + var ptr unsafe.Pointer + var salen _Socklen + if to != nil { + ptr, salen, err = to.sockaddr() + if err != nil { + return 0, err + } + } + return sendmsgN(fd, iov, oob, ptr, salen, flags) +} + func Send(s int, buf []byte, flags int) (err error) { return sendto(s, buf, flags, nil, 0) } @@ -433,3 +544,13 @@ func Lutimes(path string, tv []Timeval) error { } return UtimesNanoAt(AT_FDCWD, path, ts, AT_SYMLINK_NOFOLLOW) } + +// emptyIovec reports whether there are no bytes in the slice of Iovec. +func emptyIovecs(iov []Iovec) bool { + for i := range iov { + if iov[i].Len > 0 { + return false + } + } + return true +} diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go index 440900112..f8c2c5138 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go @@ -151,6 +151,7 @@ const ( BIOCSETF = 0x80084267 BIOCSETFNR = 0x80084282 BIOCSETIF = 0x8020426c + BIOCSETVLANPCP = 0x80044285 BIOCSETWF = 0x8008427b BIOCSETZBUF = 0x800c4281 BIOCSHDRCMPLT = 0x80044275 @@ -447,7 +448,7 @@ const ( DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 DLT_INFINIBAND = 0xf7 DLT_IPFILTER = 0x74 - DLT_IPMB = 0xc7 + DLT_IPMB_KONTRON = 0xc7 DLT_IPMB_LINUX = 0xd1 DLT_IPMI_HPM_2 = 0x104 DLT_IPNET = 0xe2 @@ -487,10 +488,11 @@ const ( DLT_LINUX_LAPD = 0xb1 DLT_LINUX_PPP_WITHDIRECTION = 0xa6 DLT_LINUX_SLL = 0x71 + DLT_LINUX_SLL2 = 0x114 DLT_LOOP = 0x6c DLT_LORATAP = 0x10e DLT_LTALK = 0x72 - DLT_MATCHING_MAX = 0x113 + DLT_MATCHING_MAX = 0x114 DLT_MATCHING_MIN = 0x68 DLT_MFR = 0xb6 DLT_MOST = 0xd3 @@ -734,6 +736,7 @@ const ( IPPROTO_CMTP = 0x26 IPPROTO_CPHB = 0x49 IPPROTO_CPNX = 0x48 + IPPROTO_DCCP = 0x21 IPPROTO_DDP = 0x25 IPPROTO_DGP = 0x56 IPPROTO_DIVERT = 0x102 @@ -814,7 +817,6 @@ const ( IPPROTO_SCTP = 0x84 IPPROTO_SDRP = 0x2a IPPROTO_SEND = 0x103 - IPPROTO_SEP = 0x21 IPPROTO_SHIM6 = 0x8c IPPROTO_SKIP = 0x39 IPPROTO_SPACER = 0x7fff @@ -911,6 +913,7 @@ const ( IPV6_V6ONLY = 0x1b IPV6_VERSION = 0x60 IPV6_VERSION_MASK = 0xf0 + IPV6_VLAN_PCP = 0x4b IP_ADD_MEMBERSHIP = 0xc IP_ADD_SOURCE_MEMBERSHIP = 0x46 IP_BINDANY = 0x18 @@ -989,8 +992,12 @@ const ( IP_TOS = 0x3 IP_TTL = 0x4 IP_UNBLOCK_SOURCE = 0x49 + IP_VLAN_PCP = 0x4b ISIG = 0x80 ISTRIP = 0x20 + ITIMER_PROF = 0x2 + ITIMER_REAL = 0x0 + ITIMER_VIRTUAL = 0x1 IXANY = 0x800 IXOFF = 0x400 IXON = 0x200 @@ -1000,7 +1007,6 @@ const ( KERN_VERSION = 0x4 LOCAL_CONNWAIT = 0x4 LOCAL_CREDS = 0x2 - LOCAL_CREDS_PERSISTENT = 0x3 LOCAL_PEERCRED = 0x1 LOCAL_VENDOR = 0x80000000 LOCK_EX = 0x2 @@ -1179,6 +1185,8 @@ const ( O_NONBLOCK = 0x4 O_RDONLY = 0x0 O_RDWR = 0x2 + O_RESOLVE_BENEATH = 0x800000 + O_SEARCH = 0x40000 O_SHLOCK = 0x10 O_SYNC = 0x80 O_TRUNC = 0x400 @@ -1189,6 +1197,10 @@ const ( PARMRK = 0x8 PARODD = 0x2000 PENDIN = 0x20000000 + PIOD_READ_D = 0x1 + PIOD_READ_I = 0x3 + PIOD_WRITE_D = 0x2 + PIOD_WRITE_I = 0x4 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 @@ -1196,6 +1208,60 @@ const ( PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 + PTRACE_DEFAULT = 0x1 + PTRACE_EXEC = 0x1 + PTRACE_FORK = 0x8 + PTRACE_LWP = 0x10 + PTRACE_SCE = 0x2 + PTRACE_SCX = 0x4 + PTRACE_SYSCALL = 0x6 + PTRACE_VFORK = 0x20 + PT_ATTACH = 0xa + PT_CLEARSTEP = 0x10 + PT_CONTINUE = 0x7 + PT_DETACH = 0xb + PT_FIRSTMACH = 0x40 + PT_FOLLOW_FORK = 0x17 + PT_GETDBREGS = 0x25 + PT_GETFPREGS = 0x23 + PT_GETFSBASE = 0x47 + PT_GETGSBASE = 0x49 + PT_GETLWPLIST = 0xf + PT_GETNUMLWPS = 0xe + PT_GETREGS = 0x21 + PT_GETXMMREGS = 0x40 + PT_GETXSTATE = 0x45 + PT_GETXSTATE_INFO = 0x44 + PT_GET_EVENT_MASK = 0x19 + PT_GET_SC_ARGS = 0x1b + PT_GET_SC_RET = 0x1c + PT_IO = 0xc + PT_KILL = 0x8 + PT_LWPINFO = 0xd + PT_LWP_EVENTS = 0x18 + PT_READ_D = 0x2 + PT_READ_I = 0x1 + PT_RESUME = 0x13 + PT_SETDBREGS = 0x26 + PT_SETFPREGS = 0x24 + PT_SETFSBASE = 0x48 + PT_SETGSBASE = 0x4a + PT_SETREGS = 0x22 + PT_SETSTEP = 0x11 + PT_SETXMMREGS = 0x41 + PT_SETXSTATE = 0x46 + PT_SET_EVENT_MASK = 0x1a + PT_STEP = 0x9 + PT_SUSPEND = 0x12 + PT_SYSCALL = 0x16 + PT_TO_SCE = 0x14 + PT_TO_SCX = 0x15 + PT_TRACE_ME = 0x0 + PT_VM_ENTRY = 0x29 + PT_VM_TIMESTAMP = 0x28 + PT_WRITE_D = 0x5 + PT_WRITE_I = 0x4 + P_ZONEID = 0xc RLIMIT_AS = 0xa RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 @@ -1320,10 +1386,12 @@ const ( SIOCGHWADDR = 0xc020693e SIOCGI2C = 0xc020693d SIOCGIFADDR = 0xc0206921 + SIOCGIFALIAS = 0xc044692d SIOCGIFBRDADDR = 0xc0206923 SIOCGIFCAP = 0xc020691f SIOCGIFCONF = 0xc0086924 SIOCGIFDESCR = 0xc020692a + SIOCGIFDOWNREASON = 0xc058699a SIOCGIFDSTADDR = 0xc0206922 SIOCGIFFIB = 0xc020695c SIOCGIFFLAGS = 0xc0206911 @@ -1414,6 +1482,7 @@ const ( SO_RCVBUF = 0x1002 SO_RCVLOWAT = 0x1004 SO_RCVTIMEO = 0x1006 + SO_RERROR = 0x20000 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_REUSEPORT_LB = 0x10000 @@ -1472,22 +1541,40 @@ const ( TCOFLUSH = 0x2 TCOOFF = 0x1 TCOON = 0x2 + TCPOPT_EOL = 0x0 + TCPOPT_FAST_OPEN = 0x22 + TCPOPT_MAXSEG = 0x2 + TCPOPT_NOP = 0x1 + TCPOPT_PAD = 0x0 + TCPOPT_SACK = 0x5 + TCPOPT_SACK_PERMITTED = 0x4 + TCPOPT_SIGNATURE = 0x13 + TCPOPT_TIMESTAMP = 0x8 + TCPOPT_WINDOW = 0x3 TCP_BBR_ACK_COMP_ALG = 0x448 + TCP_BBR_ALGORITHM = 0x43b TCP_BBR_DRAIN_INC_EXTRA = 0x43c TCP_BBR_DRAIN_PG = 0x42e TCP_BBR_EXTRA_GAIN = 0x449 + TCP_BBR_EXTRA_STATE = 0x453 + TCP_BBR_FLOOR_MIN_TSO = 0x454 + TCP_BBR_HDWR_PACE = 0x451 + TCP_BBR_HOLD_TARGET = 0x436 TCP_BBR_IWINTSO = 0x42b TCP_BBR_LOWGAIN_FD = 0x436 TCP_BBR_LOWGAIN_HALF = 0x435 TCP_BBR_LOWGAIN_THRESH = 0x434 TCP_BBR_MAX_RTO = 0x439 TCP_BBR_MIN_RTO = 0x438 + TCP_BBR_MIN_TOPACEOUT = 0x455 TCP_BBR_ONE_RETRAN = 0x431 TCP_BBR_PACE_CROSS = 0x442 TCP_BBR_PACE_DEL_TAR = 0x43f + TCP_BBR_PACE_OH = 0x435 TCP_BBR_PACE_PER_SEC = 0x43e TCP_BBR_PACE_SEG_MAX = 0x440 TCP_BBR_PACE_SEG_MIN = 0x441 + TCP_BBR_POLICER_DETECT = 0x457 TCP_BBR_PROBE_RTT_GAIN = 0x44d TCP_BBR_PROBE_RTT_INT = 0x430 TCP_BBR_PROBE_RTT_LEN = 0x44e @@ -1496,12 +1583,18 @@ const ( TCP_BBR_REC_OVER_HPTS = 0x43a TCP_BBR_RETRAN_WTSO = 0x44b TCP_BBR_RWND_IS_APP = 0x42f + TCP_BBR_SEND_IWND_IN_TSO = 0x44f TCP_BBR_STARTUP_EXIT_EPOCH = 0x43d TCP_BBR_STARTUP_LOSS_EXIT = 0x432 TCP_BBR_STARTUP_PG = 0x42d + TCP_BBR_TMR_PACE_OH = 0x448 + TCP_BBR_TSLIMITS = 0x434 + TCP_BBR_TSTMP_RAISES = 0x456 TCP_BBR_UNLIMITED = 0x43b TCP_BBR_USEDEL_RATE = 0x437 TCP_BBR_USE_LOWGAIN = 0x433 + TCP_BBR_USE_RACK_CHEAT = 0x450 + TCP_BBR_UTTER_MAX_TSO = 0x452 TCP_CA_NAME_MAX = 0x10 TCP_CCALGOOPT = 0x41 TCP_CONGESTION = 0x40 @@ -1541,6 +1634,7 @@ const ( TCP_PCAP_OUT = 0x800 TCP_RACK_EARLY_RECOV = 0x423 TCP_RACK_EARLY_SEG = 0x424 + TCP_RACK_GP_INCREASE = 0x446 TCP_RACK_IDLE_REDUCE_HIGH = 0x444 TCP_RACK_MIN_PACE = 0x445 TCP_RACK_MIN_PACE_SEG = 0x446 @@ -1554,7 +1648,6 @@ const ( TCP_RACK_PRR_SENDALOT = 0x421 TCP_RACK_REORD_FADE = 0x426 TCP_RACK_REORD_THRESH = 0x425 - TCP_RACK_SESS_CWV = 0x42a TCP_RACK_TLP_INC_VAR = 0x429 TCP_RACK_TLP_REDUCE = 0x41c TCP_RACK_TLP_THRESH = 0x427 @@ -1694,12 +1787,13 @@ const ( EIDRM = syscall.Errno(0x52) EILSEQ = syscall.Errno(0x56) EINPROGRESS = syscall.Errno(0x24) + EINTEGRITY = syscall.Errno(0x61) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EISCONN = syscall.Errno(0x38) EISDIR = syscall.Errno(0x15) - ELAST = syscall.Errno(0x60) + ELAST = syscall.Errno(0x61) ELOOP = syscall.Errno(0x3e) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) @@ -1842,7 +1936,7 @@ var errorList = [...]struct { {32, "EPIPE", "broken pipe"}, {33, "EDOM", "numerical argument out of domain"}, {34, "ERANGE", "result too large"}, - {35, "EAGAIN", "resource temporarily unavailable"}, + {35, "EWOULDBLOCK", "resource temporarily unavailable"}, {36, "EINPROGRESS", "operation now in progress"}, {37, "EALREADY", "operation already in progress"}, {38, "ENOTSOCK", "socket operation on non-socket"}, @@ -1904,6 +1998,7 @@ var errorList = [...]struct { {94, "ECAPMODE", "not permitted in capability mode"}, {95, "ENOTRECOVERABLE", "state not recoverable"}, {96, "EOWNERDEAD", "previous owner died"}, + {97, "EINTEGRITY", "integrity check failed"}, } // Signal table diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go index 64520d312..96310c3be 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go @@ -151,6 +151,7 @@ const ( BIOCSETF = 0x80104267 BIOCSETFNR = 0x80104282 BIOCSETIF = 0x8020426c + BIOCSETVLANPCP = 0x80044285 BIOCSETWF = 0x8010427b BIOCSETZBUF = 0x80184281 BIOCSHDRCMPLT = 0x80044275 @@ -447,7 +448,7 @@ const ( DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 DLT_INFINIBAND = 0xf7 DLT_IPFILTER = 0x74 - DLT_IPMB = 0xc7 + DLT_IPMB_KONTRON = 0xc7 DLT_IPMB_LINUX = 0xd1 DLT_IPMI_HPM_2 = 0x104 DLT_IPNET = 0xe2 @@ -487,10 +488,11 @@ const ( DLT_LINUX_LAPD = 0xb1 DLT_LINUX_PPP_WITHDIRECTION = 0xa6 DLT_LINUX_SLL = 0x71 + DLT_LINUX_SLL2 = 0x114 DLT_LOOP = 0x6c DLT_LORATAP = 0x10e DLT_LTALK = 0x72 - DLT_MATCHING_MAX = 0x113 + DLT_MATCHING_MAX = 0x114 DLT_MATCHING_MIN = 0x68 DLT_MFR = 0xb6 DLT_MOST = 0xd3 @@ -734,6 +736,7 @@ const ( IPPROTO_CMTP = 0x26 IPPROTO_CPHB = 0x49 IPPROTO_CPNX = 0x48 + IPPROTO_DCCP = 0x21 IPPROTO_DDP = 0x25 IPPROTO_DGP = 0x56 IPPROTO_DIVERT = 0x102 @@ -814,7 +817,6 @@ const ( IPPROTO_SCTP = 0x84 IPPROTO_SDRP = 0x2a IPPROTO_SEND = 0x103 - IPPROTO_SEP = 0x21 IPPROTO_SHIM6 = 0x8c IPPROTO_SKIP = 0x39 IPPROTO_SPACER = 0x7fff @@ -911,6 +913,7 @@ const ( IPV6_V6ONLY = 0x1b IPV6_VERSION = 0x60 IPV6_VERSION_MASK = 0xf0 + IPV6_VLAN_PCP = 0x4b IP_ADD_MEMBERSHIP = 0xc IP_ADD_SOURCE_MEMBERSHIP = 0x46 IP_BINDANY = 0x18 @@ -989,8 +992,12 @@ const ( IP_TOS = 0x3 IP_TTL = 0x4 IP_UNBLOCK_SOURCE = 0x49 + IP_VLAN_PCP = 0x4b ISIG = 0x80 ISTRIP = 0x20 + ITIMER_PROF = 0x2 + ITIMER_REAL = 0x0 + ITIMER_VIRTUAL = 0x1 IXANY = 0x800 IXOFF = 0x400 IXON = 0x200 @@ -1000,7 +1007,6 @@ const ( KERN_VERSION = 0x4 LOCAL_CONNWAIT = 0x4 LOCAL_CREDS = 0x2 - LOCAL_CREDS_PERSISTENT = 0x3 LOCAL_PEERCRED = 0x1 LOCAL_VENDOR = 0x80000000 LOCK_EX = 0x2 @@ -1180,6 +1186,8 @@ const ( O_NONBLOCK = 0x4 O_RDONLY = 0x0 O_RDWR = 0x2 + O_RESOLVE_BENEATH = 0x800000 + O_SEARCH = 0x40000 O_SHLOCK = 0x10 O_SYNC = 0x80 O_TRUNC = 0x400 @@ -1190,6 +1198,10 @@ const ( PARMRK = 0x8 PARODD = 0x2000 PENDIN = 0x20000000 + PIOD_READ_D = 0x1 + PIOD_READ_I = 0x3 + PIOD_WRITE_D = 0x2 + PIOD_WRITE_I = 0x4 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 @@ -1197,6 +1209,58 @@ const ( PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 + PTRACE_DEFAULT = 0x1 + PTRACE_EXEC = 0x1 + PTRACE_FORK = 0x8 + PTRACE_LWP = 0x10 + PTRACE_SCE = 0x2 + PTRACE_SCX = 0x4 + PTRACE_SYSCALL = 0x6 + PTRACE_VFORK = 0x20 + PT_ATTACH = 0xa + PT_CLEARSTEP = 0x10 + PT_CONTINUE = 0x7 + PT_DETACH = 0xb + PT_FIRSTMACH = 0x40 + PT_FOLLOW_FORK = 0x17 + PT_GETDBREGS = 0x25 + PT_GETFPREGS = 0x23 + PT_GETFSBASE = 0x47 + PT_GETGSBASE = 0x49 + PT_GETLWPLIST = 0xf + PT_GETNUMLWPS = 0xe + PT_GETREGS = 0x21 + PT_GETXSTATE = 0x45 + PT_GETXSTATE_INFO = 0x44 + PT_GET_EVENT_MASK = 0x19 + PT_GET_SC_ARGS = 0x1b + PT_GET_SC_RET = 0x1c + PT_IO = 0xc + PT_KILL = 0x8 + PT_LWPINFO = 0xd + PT_LWP_EVENTS = 0x18 + PT_READ_D = 0x2 + PT_READ_I = 0x1 + PT_RESUME = 0x13 + PT_SETDBREGS = 0x26 + PT_SETFPREGS = 0x24 + PT_SETFSBASE = 0x48 + PT_SETGSBASE = 0x4a + PT_SETREGS = 0x22 + PT_SETSTEP = 0x11 + PT_SETXSTATE = 0x46 + PT_SET_EVENT_MASK = 0x1a + PT_STEP = 0x9 + PT_SUSPEND = 0x12 + PT_SYSCALL = 0x16 + PT_TO_SCE = 0x14 + PT_TO_SCX = 0x15 + PT_TRACE_ME = 0x0 + PT_VM_ENTRY = 0x29 + PT_VM_TIMESTAMP = 0x28 + PT_WRITE_D = 0x5 + PT_WRITE_I = 0x4 + P_ZONEID = 0xc RLIMIT_AS = 0xa RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 @@ -1321,10 +1385,12 @@ const ( SIOCGHWADDR = 0xc020693e SIOCGI2C = 0xc020693d SIOCGIFADDR = 0xc0206921 + SIOCGIFALIAS = 0xc044692d SIOCGIFBRDADDR = 0xc0206923 SIOCGIFCAP = 0xc020691f SIOCGIFCONF = 0xc0106924 SIOCGIFDESCR = 0xc020692a + SIOCGIFDOWNREASON = 0xc058699a SIOCGIFDSTADDR = 0xc0206922 SIOCGIFFIB = 0xc020695c SIOCGIFFLAGS = 0xc0206911 @@ -1415,6 +1481,7 @@ const ( SO_RCVBUF = 0x1002 SO_RCVLOWAT = 0x1004 SO_RCVTIMEO = 0x1006 + SO_RERROR = 0x20000 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_REUSEPORT_LB = 0x10000 @@ -1473,22 +1540,40 @@ const ( TCOFLUSH = 0x2 TCOOFF = 0x1 TCOON = 0x2 + TCPOPT_EOL = 0x0 + TCPOPT_FAST_OPEN = 0x22 + TCPOPT_MAXSEG = 0x2 + TCPOPT_NOP = 0x1 + TCPOPT_PAD = 0x0 + TCPOPT_SACK = 0x5 + TCPOPT_SACK_PERMITTED = 0x4 + TCPOPT_SIGNATURE = 0x13 + TCPOPT_TIMESTAMP = 0x8 + TCPOPT_WINDOW = 0x3 TCP_BBR_ACK_COMP_ALG = 0x448 + TCP_BBR_ALGORITHM = 0x43b TCP_BBR_DRAIN_INC_EXTRA = 0x43c TCP_BBR_DRAIN_PG = 0x42e TCP_BBR_EXTRA_GAIN = 0x449 + TCP_BBR_EXTRA_STATE = 0x453 + TCP_BBR_FLOOR_MIN_TSO = 0x454 + TCP_BBR_HDWR_PACE = 0x451 + TCP_BBR_HOLD_TARGET = 0x436 TCP_BBR_IWINTSO = 0x42b TCP_BBR_LOWGAIN_FD = 0x436 TCP_BBR_LOWGAIN_HALF = 0x435 TCP_BBR_LOWGAIN_THRESH = 0x434 TCP_BBR_MAX_RTO = 0x439 TCP_BBR_MIN_RTO = 0x438 + TCP_BBR_MIN_TOPACEOUT = 0x455 TCP_BBR_ONE_RETRAN = 0x431 TCP_BBR_PACE_CROSS = 0x442 TCP_BBR_PACE_DEL_TAR = 0x43f + TCP_BBR_PACE_OH = 0x435 TCP_BBR_PACE_PER_SEC = 0x43e TCP_BBR_PACE_SEG_MAX = 0x440 TCP_BBR_PACE_SEG_MIN = 0x441 + TCP_BBR_POLICER_DETECT = 0x457 TCP_BBR_PROBE_RTT_GAIN = 0x44d TCP_BBR_PROBE_RTT_INT = 0x430 TCP_BBR_PROBE_RTT_LEN = 0x44e @@ -1497,12 +1582,18 @@ const ( TCP_BBR_REC_OVER_HPTS = 0x43a TCP_BBR_RETRAN_WTSO = 0x44b TCP_BBR_RWND_IS_APP = 0x42f + TCP_BBR_SEND_IWND_IN_TSO = 0x44f TCP_BBR_STARTUP_EXIT_EPOCH = 0x43d TCP_BBR_STARTUP_LOSS_EXIT = 0x432 TCP_BBR_STARTUP_PG = 0x42d + TCP_BBR_TMR_PACE_OH = 0x448 + TCP_BBR_TSLIMITS = 0x434 + TCP_BBR_TSTMP_RAISES = 0x456 TCP_BBR_UNLIMITED = 0x43b TCP_BBR_USEDEL_RATE = 0x437 TCP_BBR_USE_LOWGAIN = 0x433 + TCP_BBR_USE_RACK_CHEAT = 0x450 + TCP_BBR_UTTER_MAX_TSO = 0x452 TCP_CA_NAME_MAX = 0x10 TCP_CCALGOOPT = 0x41 TCP_CONGESTION = 0x40 @@ -1542,6 +1633,7 @@ const ( TCP_PCAP_OUT = 0x800 TCP_RACK_EARLY_RECOV = 0x423 TCP_RACK_EARLY_SEG = 0x424 + TCP_RACK_GP_INCREASE = 0x446 TCP_RACK_IDLE_REDUCE_HIGH = 0x444 TCP_RACK_MIN_PACE = 0x445 TCP_RACK_MIN_PACE_SEG = 0x446 @@ -1555,7 +1647,6 @@ const ( TCP_RACK_PRR_SENDALOT = 0x421 TCP_RACK_REORD_FADE = 0x426 TCP_RACK_REORD_THRESH = 0x425 - TCP_RACK_SESS_CWV = 0x42a TCP_RACK_TLP_INC_VAR = 0x429 TCP_RACK_TLP_REDUCE = 0x41c TCP_RACK_TLP_THRESH = 0x427 @@ -1693,12 +1784,13 @@ const ( EIDRM = syscall.Errno(0x52) EILSEQ = syscall.Errno(0x56) EINPROGRESS = syscall.Errno(0x24) + EINTEGRITY = syscall.Errno(0x61) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EISCONN = syscall.Errno(0x38) EISDIR = syscall.Errno(0x15) - ELAST = syscall.Errno(0x60) + ELAST = syscall.Errno(0x61) ELOOP = syscall.Errno(0x3e) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) @@ -1841,7 +1933,7 @@ var errorList = [...]struct { {32, "EPIPE", "broken pipe"}, {33, "EDOM", "numerical argument out of domain"}, {34, "ERANGE", "result too large"}, - {35, "EAGAIN", "resource temporarily unavailable"}, + {35, "EWOULDBLOCK", "resource temporarily unavailable"}, {36, "EINPROGRESS", "operation now in progress"}, {37, "EALREADY", "operation already in progress"}, {38, "ENOTSOCK", "socket operation on non-socket"}, @@ -1903,6 +1995,7 @@ var errorList = [...]struct { {94, "ECAPMODE", "not permitted in capability mode"}, {95, "ENOTRECOVERABLE", "state not recoverable"}, {96, "EOWNERDEAD", "previous owner died"}, + {97, "EINTEGRITY", "integrity check failed"}, } // Signal table diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go index 99e9a0e06..777b69def 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go @@ -151,6 +151,7 @@ const ( BIOCSETF = 0x80084267 BIOCSETFNR = 0x80084282 BIOCSETIF = 0x8020426c + BIOCSETVLANPCP = 0x80044285 BIOCSETWF = 0x8008427b BIOCSETZBUF = 0x800c4281 BIOCSHDRCMPLT = 0x80044275 @@ -362,7 +363,7 @@ const ( CTL_KERN = 0x1 CTL_MAXNAME = 0x18 CTL_NET = 0x4 - DIOCGATTR = 0xc144648e + DIOCGATTR = 0xc148648e DIOCGDELETE = 0x80106488 DIOCGFLUSH = 0x20006487 DIOCGFRONTSTUFF = 0x40086486 @@ -377,7 +378,7 @@ const ( DIOCGSTRIPESIZE = 0x4008648b DIOCSKERNELDUMP = 0x804c6490 DIOCSKERNELDUMP_FREEBSD11 = 0x80046485 - DIOCZONECMD = 0xc06c648f + DIOCZONECMD = 0xc078648f DLT_A429 = 0xb8 DLT_A653_ICM = 0xb9 DLT_AIRONET_HEADER = 0x78 @@ -407,7 +408,9 @@ const ( DLT_C_HDLC_WITH_DIR = 0xcd DLT_DBUS = 0xe7 DLT_DECT = 0xdd + DLT_DISPLAYPORT_AUX = 0x113 DLT_DOCSIS = 0x8f + DLT_DOCSIS31_XRA31 = 0x111 DLT_DVB_CI = 0xeb DLT_ECONET = 0x73 DLT_EN10MB = 0x1 @@ -417,6 +420,7 @@ const ( DLT_ERF = 0xc5 DLT_ERF_ETH = 0xaf DLT_ERF_POS = 0xb0 + DLT_ETHERNET_MPACKET = 0x112 DLT_FC_2 = 0xe0 DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 DLT_FDDI = 0xa @@ -444,7 +448,7 @@ const ( DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 DLT_INFINIBAND = 0xf7 DLT_IPFILTER = 0x74 - DLT_IPMB = 0xc7 + DLT_IPMB_KONTRON = 0xc7 DLT_IPMB_LINUX = 0xd1 DLT_IPMI_HPM_2 = 0x104 DLT_IPNET = 0xe2 @@ -484,9 +488,11 @@ const ( DLT_LINUX_LAPD = 0xb1 DLT_LINUX_PPP_WITHDIRECTION = 0xa6 DLT_LINUX_SLL = 0x71 + DLT_LINUX_SLL2 = 0x114 DLT_LOOP = 0x6c + DLT_LORATAP = 0x10e DLT_LTALK = 0x72 - DLT_MATCHING_MAX = 0x109 + DLT_MATCHING_MAX = 0x114 DLT_MATCHING_MIN = 0x68 DLT_MFR = 0xb6 DLT_MOST = 0xd3 @@ -502,7 +508,9 @@ const ( DLT_NFC_LLCP = 0xf5 DLT_NFLOG = 0xef DLT_NG40 = 0xf4 + DLT_NORDIC_BLE = 0x110 DLT_NULL = 0x0 + DLT_OPENFLOW = 0x10b DLT_PCI_EXP = 0x7d DLT_PFLOG = 0x75 DLT_PFSYNC = 0x79 @@ -526,15 +534,18 @@ const ( DLT_RTAC_SERIAL = 0xfa DLT_SCCP = 0x8e DLT_SCTP = 0xf8 + DLT_SDLC = 0x10c DLT_SITA = 0xc4 DLT_SLIP = 0x8 DLT_SLIP_BSDOS = 0xd DLT_STANAG_5066_D_PDU = 0xed DLT_SUNATM = 0x7b DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TI_LLN_SNIFFER = 0x10d DLT_TZSP = 0x80 DLT_USB = 0xba DLT_USBPCAP = 0xf9 + DLT_USB_DARWIN = 0x10a DLT_USB_FREEBSD = 0xba DLT_USB_LINUX = 0xbd DLT_USB_LINUX_MMAPPED = 0xdc @@ -554,6 +565,7 @@ const ( DLT_USER7 = 0x9a DLT_USER8 = 0x9b DLT_USER9 = 0x9c + DLT_VSOCK = 0x10f DLT_WATTSTOPPER_DLM = 0x107 DLT_WIHART = 0xdf DLT_WIRESHARK_UPPER_PDU = 0xfc @@ -578,6 +590,7 @@ const ( ECHONL = 0x10 ECHOPRT = 0x20 EVFILT_AIO = -0x3 + EVFILT_EMPTY = -0xd EVFILT_FS = -0x9 EVFILT_LIO = -0xa EVFILT_PROC = -0x5 @@ -585,11 +598,12 @@ const ( EVFILT_READ = -0x1 EVFILT_SENDFILE = -0xc EVFILT_SIGNAL = -0x6 - EVFILT_SYSCOUNT = 0xc + EVFILT_SYSCOUNT = 0xd EVFILT_TIMER = -0x7 EVFILT_USER = -0xb EVFILT_VNODE = -0x4 EVFILT_WRITE = -0x2 + EVNAMEMAP_NAME_SIZE = 0x40 EV_ADD = 0x1 EV_CLEAR = 0x20 EV_DELETE = 0x2 @@ -606,6 +620,7 @@ const ( EV_RECEIPT = 0x40 EV_SYSFLAGS = 0xf000 EXTA = 0x4b00 + EXTATTR_MAXNAMELEN = 0xff EXTATTR_NAMESPACE_EMPTY = 0x0 EXTATTR_NAMESPACE_SYSTEM = 0x2 EXTATTR_NAMESPACE_USER = 0x1 @@ -647,6 +662,7 @@ const ( IEXTEN = 0x400 IFAN_ARRIVAL = 0x0 IFAN_DEPARTURE = 0x1 + IFCAP_WOL_MAGIC = 0x2000 IFF_ALLMULTI = 0x200 IFF_ALTPHYS = 0x4000 IFF_BROADCAST = 0x2 @@ -663,6 +679,7 @@ const ( IFF_MONITOR = 0x40000 IFF_MULTICAST = 0x8000 IFF_NOARP = 0x80 + IFF_NOGROUP = 0x800000 IFF_OACTIVE = 0x400 IFF_POINTOPOINT = 0x10 IFF_PPROMISC = 0x20000 @@ -719,6 +736,7 @@ const ( IPPROTO_CMTP = 0x26 IPPROTO_CPHB = 0x49 IPPROTO_CPNX = 0x48 + IPPROTO_DCCP = 0x21 IPPROTO_DDP = 0x25 IPPROTO_DGP = 0x56 IPPROTO_DIVERT = 0x102 @@ -799,7 +817,6 @@ const ( IPPROTO_SCTP = 0x84 IPPROTO_SDRP = 0x2a IPPROTO_SEND = 0x103 - IPPROTO_SEP = 0x21 IPPROTO_SHIM6 = 0x8c IPPROTO_SKIP = 0x39 IPPROTO_SPACER = 0x7fff @@ -837,6 +854,7 @@ const ( IPV6_DSTOPTS = 0x32 IPV6_FLOWID = 0x43 IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_LEN = 0x14 IPV6_FLOWLABEL_MASK = 0xffff0f00 IPV6_FLOWTYPE = 0x44 IPV6_FRAGTTL = 0x78 @@ -857,13 +875,13 @@ const ( IPV6_MAX_GROUP_SRC_FILTER = 0x200 IPV6_MAX_MEMBERSHIPS = 0xfff IPV6_MAX_SOCK_SRC_FILTER = 0x80 - IPV6_MIN_MEMBERSHIPS = 0x1f IPV6_MMTU = 0x500 IPV6_MSFILTER = 0x4a IPV6_MULTICAST_HOPS = 0xa IPV6_MULTICAST_IF = 0x9 IPV6_MULTICAST_LOOP = 0xb IPV6_NEXTHOP = 0x30 + IPV6_ORIGDSTADDR = 0x48 IPV6_PATHMTU = 0x2c IPV6_PKTINFO = 0x2e IPV6_PORTRANGE = 0xe @@ -875,6 +893,7 @@ const ( IPV6_RECVFLOWID = 0x46 IPV6_RECVHOPLIMIT = 0x25 IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVORIGDSTADDR = 0x48 IPV6_RECVPATHMTU = 0x2b IPV6_RECVPKTINFO = 0x24 IPV6_RECVRSSBUCKETID = 0x47 @@ -894,6 +913,7 @@ const ( IPV6_V6ONLY = 0x1b IPV6_VERSION = 0x60 IPV6_VERSION_MASK = 0xf0 + IPV6_VLAN_PCP = 0x4b IP_ADD_MEMBERSHIP = 0xc IP_ADD_SOURCE_MEMBERSHIP = 0x46 IP_BINDANY = 0x18 @@ -935,10 +955,8 @@ const ( IP_MAX_MEMBERSHIPS = 0xfff IP_MAX_SOCK_MUTE_FILTER = 0x80 IP_MAX_SOCK_SRC_FILTER = 0x80 - IP_MAX_SOURCE_FILTER = 0x400 IP_MF = 0x2000 IP_MINTTL = 0x42 - IP_MIN_MEMBERSHIPS = 0x1f IP_MSFILTER = 0x4a IP_MSS = 0x240 IP_MULTICAST_IF = 0x9 @@ -948,6 +966,7 @@ const ( IP_OFFMASK = 0x1fff IP_ONESBCAST = 0x17 IP_OPTIONS = 0x1 + IP_ORIGDSTADDR = 0x1b IP_PORTRANGE = 0x13 IP_PORTRANGE_DEFAULT = 0x0 IP_PORTRANGE_HIGH = 0x1 @@ -956,6 +975,7 @@ const ( IP_RECVFLOWID = 0x5d IP_RECVIF = 0x14 IP_RECVOPTS = 0x5 + IP_RECVORIGDSTADDR = 0x1b IP_RECVRETOPTS = 0x6 IP_RECVRSSBUCKETID = 0x5e IP_RECVTOS = 0x44 @@ -972,8 +992,12 @@ const ( IP_TOS = 0x3 IP_TTL = 0x4 IP_UNBLOCK_SOURCE = 0x49 + IP_VLAN_PCP = 0x4b ISIG = 0x80 ISTRIP = 0x20 + ITIMER_PROF = 0x2 + ITIMER_REAL = 0x0 + ITIMER_VIRTUAL = 0x1 IXANY = 0x800 IXOFF = 0x400 IXON = 0x200 @@ -983,7 +1007,6 @@ const ( KERN_VERSION = 0x4 LOCAL_CONNWAIT = 0x4 LOCAL_CREDS = 0x2 - LOCAL_CREDS_PERSISTENT = 0x3 LOCAL_PEERCRED = 0x1 LOCAL_VENDOR = 0x80000000 LOCK_EX = 0x2 @@ -1071,10 +1094,12 @@ const ( MNT_SUSPEND = 0x4 MNT_SYNCHRONOUS = 0x2 MNT_UNION = 0x20 + MNT_UNTRUSTED = 0x800000000 MNT_UPDATE = 0x10000 - MNT_UPDATEMASK = 0x2d8d0807e + MNT_UPDATEMASK = 0xad8d0807e MNT_USER = 0x8000 - MNT_VISFLAGMASK = 0x3fef0ffff + MNT_VERIFIED = 0x400000000 + MNT_VISFLAGMASK = 0xffef0ffff MNT_WAIT = 0x1 MSG_CMSG_CLOEXEC = 0x40000 MSG_COMPAT = 0x8000 @@ -1103,6 +1128,7 @@ const ( NFDBITS = 0x20 NOFLSH = 0x80000000 NOKERNINFO = 0x2000000 + NOTE_ABSTIME = 0x10 NOTE_ATTRIB = 0x8 NOTE_CHILD = 0x4 NOTE_CLOSE = 0x100 @@ -1159,6 +1185,8 @@ const ( O_NONBLOCK = 0x4 O_RDONLY = 0x0 O_RDWR = 0x2 + O_RESOLVE_BENEATH = 0x800000 + O_SEARCH = 0x40000 O_SHLOCK = 0x10 O_SYNC = 0x80 O_TRUNC = 0x400 @@ -1169,6 +1197,10 @@ const ( PARMRK = 0x8 PARODD = 0x2000 PENDIN = 0x20000000 + PIOD_READ_D = 0x1 + PIOD_READ_I = 0x3 + PIOD_WRITE_D = 0x2 + PIOD_WRITE_I = 0x4 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 @@ -1176,6 +1208,53 @@ const ( PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 + PTRACE_DEFAULT = 0x1 + PTRACE_EXEC = 0x1 + PTRACE_FORK = 0x8 + PTRACE_LWP = 0x10 + PTRACE_SCE = 0x2 + PTRACE_SCX = 0x4 + PTRACE_SYSCALL = 0x6 + PTRACE_VFORK = 0x20 + PT_ATTACH = 0xa + PT_CLEARSTEP = 0x10 + PT_CONTINUE = 0x7 + PT_DETACH = 0xb + PT_FIRSTMACH = 0x40 + PT_FOLLOW_FORK = 0x17 + PT_GETDBREGS = 0x25 + PT_GETFPREGS = 0x23 + PT_GETLWPLIST = 0xf + PT_GETNUMLWPS = 0xe + PT_GETREGS = 0x21 + PT_GETVFPREGS = 0x40 + PT_GET_EVENT_MASK = 0x19 + PT_GET_SC_ARGS = 0x1b + PT_GET_SC_RET = 0x1c + PT_IO = 0xc + PT_KILL = 0x8 + PT_LWPINFO = 0xd + PT_LWP_EVENTS = 0x18 + PT_READ_D = 0x2 + PT_READ_I = 0x1 + PT_RESUME = 0x13 + PT_SETDBREGS = 0x26 + PT_SETFPREGS = 0x24 + PT_SETREGS = 0x22 + PT_SETSTEP = 0x11 + PT_SETVFPREGS = 0x41 + PT_SET_EVENT_MASK = 0x1a + PT_STEP = 0x9 + PT_SUSPEND = 0x12 + PT_SYSCALL = 0x16 + PT_TO_SCE = 0x14 + PT_TO_SCX = 0x15 + PT_TRACE_ME = 0x0 + PT_VM_ENTRY = 0x29 + PT_VM_TIMESTAMP = 0x28 + PT_WRITE_D = 0x5 + PT_WRITE_I = 0x4 + P_ZONEID = 0xc RLIMIT_AS = 0xa RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 @@ -1257,7 +1336,6 @@ const ( RTV_WEIGHT = 0x100 RT_ALL_FIBS = -0x1 RT_BLACKHOLE = 0x40 - RT_CACHING_CONTEXT = 0x1 RT_DEFAULT_FIB = 0x0 RT_HAS_GW = 0x80 RT_HAS_HEADER = 0x10 @@ -1267,15 +1345,17 @@ const ( RT_LLE_CACHE = 0x100 RT_MAY_LOOP = 0x8 RT_MAY_LOOP_BIT = 0x3 - RT_NORTREF = 0x2 RT_REJECT = 0x20 RUSAGE_CHILDREN = -0x1 RUSAGE_SELF = 0x0 RUSAGE_THREAD = 0x1 SCM_BINTIME = 0x4 SCM_CREDS = 0x3 + SCM_MONOTONIC = 0x6 + SCM_REALTIME = 0x5 SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x2 + SCM_TIME_INFO = 0x7 SEEK_CUR = 0x1 SEEK_DATA = 0x3 SEEK_END = 0x2 @@ -1299,10 +1379,12 @@ const ( SIOCGHWADDR = 0xc020693e SIOCGI2C = 0xc020693d SIOCGIFADDR = 0xc0206921 + SIOCGIFALIAS = 0xc044692d SIOCGIFBRDADDR = 0xc0206923 SIOCGIFCAP = 0xc020691f SIOCGIFCONF = 0xc0086924 SIOCGIFDESCR = 0xc020692a + SIOCGIFDOWNREASON = 0xc058699a SIOCGIFDSTADDR = 0xc0206922 SIOCGIFFIB = 0xc020695c SIOCGIFFLAGS = 0xc0206911 @@ -1318,8 +1400,11 @@ const ( SIOCGIFPDSTADDR = 0xc0206948 SIOCGIFPHYS = 0xc0206935 SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFRSSHASH = 0xc0186997 + SIOCGIFRSSKEY = 0xc0946996 SIOCGIFSTATUS = 0xc331693b SIOCGIFXMEDIA = 0xc028698b + SIOCGLANPCP = 0xc0206998 SIOCGLOWAT = 0x40047303 SIOCGPGRP = 0x40047309 SIOCGPRIVATE_0 = 0xc0206950 @@ -1350,6 +1435,7 @@ const ( SIOCSIFPHYS = 0x80206936 SIOCSIFRVNET = 0xc020695b SIOCSIFVNET = 0xc020695a + SIOCSLANPCP = 0x80206999 SIOCSLOWAT = 0x80047302 SIOCSPGRP = 0x80047308 SIOCSTUNFIB = 0x8020695f @@ -1369,6 +1455,7 @@ const ( SO_BINTIME = 0x2000 SO_BROADCAST = 0x20 SO_DEBUG = 0x1 + SO_DOMAIN = 0x1019 SO_DONTROUTE = 0x10 SO_ERROR = 0x1007 SO_KEEPALIVE = 0x8 @@ -1377,6 +1464,7 @@ const ( SO_LISTENINCQLEN = 0x1013 SO_LISTENQLEN = 0x1012 SO_LISTENQLIMIT = 0x1011 + SO_MAX_PACING_RATE = 0x1018 SO_NOSIGPIPE = 0x800 SO_NO_DDP = 0x8000 SO_NO_OFFLOAD = 0x4000 @@ -1387,13 +1475,22 @@ const ( SO_RCVBUF = 0x1002 SO_RCVLOWAT = 0x1004 SO_RCVTIMEO = 0x1006 + SO_RERROR = 0x20000 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 + SO_REUSEPORT_LB = 0x10000 SO_SETFIB = 0x1014 SO_SNDBUF = 0x1001 SO_SNDLOWAT = 0x1003 SO_SNDTIMEO = 0x1005 SO_TIMESTAMP = 0x400 + SO_TS_BINTIME = 0x1 + SO_TS_CLOCK = 0x1017 + SO_TS_CLOCK_MAX = 0x3 + SO_TS_DEFAULT = 0x0 + SO_TS_MONOTONIC = 0x3 + SO_TS_REALTIME = 0x2 + SO_TS_REALTIME_MICRO = 0x0 SO_TYPE = 0x1008 SO_USELOOPBACK = 0x40 SO_USER_COOKIE = 0x1015 @@ -1437,10 +1534,69 @@ const ( TCOFLUSH = 0x2 TCOOFF = 0x1 TCOON = 0x2 + TCPOPT_EOL = 0x0 + TCPOPT_FAST_OPEN = 0x22 + TCPOPT_MAXSEG = 0x2 + TCPOPT_NOP = 0x1 + TCPOPT_PAD = 0x0 + TCPOPT_SACK = 0x5 + TCPOPT_SACK_PERMITTED = 0x4 + TCPOPT_SIGNATURE = 0x13 + TCPOPT_TIMESTAMP = 0x8 + TCPOPT_WINDOW = 0x3 + TCP_BBR_ACK_COMP_ALG = 0x448 + TCP_BBR_ALGORITHM = 0x43b + TCP_BBR_DRAIN_INC_EXTRA = 0x43c + TCP_BBR_DRAIN_PG = 0x42e + TCP_BBR_EXTRA_GAIN = 0x449 + TCP_BBR_EXTRA_STATE = 0x453 + TCP_BBR_FLOOR_MIN_TSO = 0x454 + TCP_BBR_HDWR_PACE = 0x451 + TCP_BBR_HOLD_TARGET = 0x436 + TCP_BBR_IWINTSO = 0x42b + TCP_BBR_LOWGAIN_FD = 0x436 + TCP_BBR_LOWGAIN_HALF = 0x435 + TCP_BBR_LOWGAIN_THRESH = 0x434 + TCP_BBR_MAX_RTO = 0x439 + TCP_BBR_MIN_RTO = 0x438 + TCP_BBR_MIN_TOPACEOUT = 0x455 + TCP_BBR_ONE_RETRAN = 0x431 + TCP_BBR_PACE_CROSS = 0x442 + TCP_BBR_PACE_DEL_TAR = 0x43f + TCP_BBR_PACE_OH = 0x435 + TCP_BBR_PACE_PER_SEC = 0x43e + TCP_BBR_PACE_SEG_MAX = 0x440 + TCP_BBR_PACE_SEG_MIN = 0x441 + TCP_BBR_POLICER_DETECT = 0x457 + TCP_BBR_PROBE_RTT_GAIN = 0x44d + TCP_BBR_PROBE_RTT_INT = 0x430 + TCP_BBR_PROBE_RTT_LEN = 0x44e + TCP_BBR_RACK_RTT_USE = 0x44a + TCP_BBR_RECFORCE = 0x42c + TCP_BBR_REC_OVER_HPTS = 0x43a + TCP_BBR_RETRAN_WTSO = 0x44b + TCP_BBR_RWND_IS_APP = 0x42f + TCP_BBR_SEND_IWND_IN_TSO = 0x44f + TCP_BBR_STARTUP_EXIT_EPOCH = 0x43d + TCP_BBR_STARTUP_LOSS_EXIT = 0x432 + TCP_BBR_STARTUP_PG = 0x42d + TCP_BBR_TMR_PACE_OH = 0x448 + TCP_BBR_TSLIMITS = 0x434 + TCP_BBR_TSTMP_RAISES = 0x456 + TCP_BBR_UNLIMITED = 0x43b + TCP_BBR_USEDEL_RATE = 0x437 + TCP_BBR_USE_LOWGAIN = 0x433 + TCP_BBR_USE_RACK_CHEAT = 0x450 + TCP_BBR_UTTER_MAX_TSO = 0x452 TCP_CA_NAME_MAX = 0x10 TCP_CCALGOOPT = 0x41 TCP_CONGESTION = 0x40 + TCP_DATA_AFTER_CLOSE = 0x44c + TCP_DELACK = 0x48 TCP_FASTOPEN = 0x401 + TCP_FASTOPEN_MAX_COOKIE_LEN = 0x10 + TCP_FASTOPEN_MIN_COOKIE_LEN = 0x4 + TCP_FASTOPEN_PSK_LEN = 0x10 TCP_FUNCTION_BLK = 0x2000 TCP_FUNCTION_NAME_LEN_MAX = 0x20 TCP_INFO = 0x20 @@ -1448,6 +1604,12 @@ const ( TCP_KEEPIDLE = 0x100 TCP_KEEPINIT = 0x80 TCP_KEEPINTVL = 0x200 + TCP_LOG = 0x22 + TCP_LOGBUF = 0x23 + TCP_LOGDUMP = 0x25 + TCP_LOGDUMPID = 0x26 + TCP_LOGID = 0x24 + TCP_LOG_ID_LEN = 0x40 TCP_MAXBURST = 0x4 TCP_MAXHLEN = 0x3c TCP_MAXOLEN = 0x28 @@ -1463,8 +1625,30 @@ const ( TCP_NOPUSH = 0x4 TCP_PCAP_IN = 0x1000 TCP_PCAP_OUT = 0x800 + TCP_RACK_EARLY_RECOV = 0x423 + TCP_RACK_EARLY_SEG = 0x424 + TCP_RACK_GP_INCREASE = 0x446 + TCP_RACK_IDLE_REDUCE_HIGH = 0x444 + TCP_RACK_MIN_PACE = 0x445 + TCP_RACK_MIN_PACE_SEG = 0x446 + TCP_RACK_MIN_TO = 0x422 + TCP_RACK_PACE_ALWAYS = 0x41f + TCP_RACK_PACE_MAX_SEG = 0x41e + TCP_RACK_PACE_REDUCE = 0x41d + TCP_RACK_PKT_DELAY = 0x428 + TCP_RACK_PROP = 0x41b + TCP_RACK_PROP_RATE = 0x420 + TCP_RACK_PRR_SENDALOT = 0x421 + TCP_RACK_REORD_FADE = 0x426 + TCP_RACK_REORD_THRESH = 0x425 + TCP_RACK_TLP_INC_VAR = 0x429 + TCP_RACK_TLP_REDUCE = 0x41c + TCP_RACK_TLP_THRESH = 0x427 + TCP_RACK_TLP_USE = 0x447 TCP_VENDOR = 0x80000000 TCSAFLUSH = 0x2 + TIMER_ABSTIME = 0x1 + TIMER_RELTIME = 0x0 TIOCCBRK = 0x2000747a TIOCCDTR = 0x20007478 TIOCCONS = 0x80047462 @@ -1528,6 +1712,8 @@ const ( TIOCTIMESTAMP = 0x40107459 TIOCUCNTL = 0x80047466 TOSTOP = 0x400000 + UTIME_NOW = -0x1 + UTIME_OMIT = -0x2 VDISCARD = 0xf VDSUSP = 0xb VEOF = 0x0 @@ -1592,12 +1778,13 @@ const ( EIDRM = syscall.Errno(0x52) EILSEQ = syscall.Errno(0x56) EINPROGRESS = syscall.Errno(0x24) + EINTEGRITY = syscall.Errno(0x61) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EISCONN = syscall.Errno(0x38) EISDIR = syscall.Errno(0x15) - ELAST = syscall.Errno(0x60) + ELAST = syscall.Errno(0x61) ELOOP = syscall.Errno(0x3e) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) @@ -1740,7 +1927,7 @@ var errorList = [...]struct { {32, "EPIPE", "broken pipe"}, {33, "EDOM", "numerical argument out of domain"}, {34, "ERANGE", "result too large"}, - {35, "EAGAIN", "resource temporarily unavailable"}, + {35, "EWOULDBLOCK", "resource temporarily unavailable"}, {36, "EINPROGRESS", "operation now in progress"}, {37, "EALREADY", "operation already in progress"}, {38, "ENOTSOCK", "socket operation on non-socket"}, @@ -1802,6 +1989,7 @@ var errorList = [...]struct { {94, "ECAPMODE", "not permitted in capability mode"}, {95, "ENOTRECOVERABLE", "state not recoverable"}, {96, "EOWNERDEAD", "previous owner died"}, + {97, "EINTEGRITY", "integrity check failed"}, } // Signal table diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go index 4c8377114..c557ac2db 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go @@ -151,6 +151,7 @@ const ( BIOCSETF = 0x80104267 BIOCSETFNR = 0x80104282 BIOCSETIF = 0x8020426c + BIOCSETVLANPCP = 0x80044285 BIOCSETWF = 0x8010427b BIOCSETZBUF = 0x80184281 BIOCSHDRCMPLT = 0x80044275 @@ -447,7 +448,7 @@ const ( DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 DLT_INFINIBAND = 0xf7 DLT_IPFILTER = 0x74 - DLT_IPMB = 0xc7 + DLT_IPMB_KONTRON = 0xc7 DLT_IPMB_LINUX = 0xd1 DLT_IPMI_HPM_2 = 0x104 DLT_IPNET = 0xe2 @@ -487,10 +488,11 @@ const ( DLT_LINUX_LAPD = 0xb1 DLT_LINUX_PPP_WITHDIRECTION = 0xa6 DLT_LINUX_SLL = 0x71 + DLT_LINUX_SLL2 = 0x114 DLT_LOOP = 0x6c DLT_LORATAP = 0x10e DLT_LTALK = 0x72 - DLT_MATCHING_MAX = 0x113 + DLT_MATCHING_MAX = 0x114 DLT_MATCHING_MIN = 0x68 DLT_MFR = 0xb6 DLT_MOST = 0xd3 @@ -734,6 +736,7 @@ const ( IPPROTO_CMTP = 0x26 IPPROTO_CPHB = 0x49 IPPROTO_CPNX = 0x48 + IPPROTO_DCCP = 0x21 IPPROTO_DDP = 0x25 IPPROTO_DGP = 0x56 IPPROTO_DIVERT = 0x102 @@ -814,7 +817,6 @@ const ( IPPROTO_SCTP = 0x84 IPPROTO_SDRP = 0x2a IPPROTO_SEND = 0x103 - IPPROTO_SEP = 0x21 IPPROTO_SHIM6 = 0x8c IPPROTO_SKIP = 0x39 IPPROTO_SPACER = 0x7fff @@ -911,6 +913,7 @@ const ( IPV6_V6ONLY = 0x1b IPV6_VERSION = 0x60 IPV6_VERSION_MASK = 0xf0 + IPV6_VLAN_PCP = 0x4b IP_ADD_MEMBERSHIP = 0xc IP_ADD_SOURCE_MEMBERSHIP = 0x46 IP_BINDANY = 0x18 @@ -989,8 +992,12 @@ const ( IP_TOS = 0x3 IP_TTL = 0x4 IP_UNBLOCK_SOURCE = 0x49 + IP_VLAN_PCP = 0x4b ISIG = 0x80 ISTRIP = 0x20 + ITIMER_PROF = 0x2 + ITIMER_REAL = 0x0 + ITIMER_VIRTUAL = 0x1 IXANY = 0x800 IXOFF = 0x400 IXON = 0x200 @@ -1000,7 +1007,6 @@ const ( KERN_VERSION = 0x4 LOCAL_CONNWAIT = 0x4 LOCAL_CREDS = 0x2 - LOCAL_CREDS_PERSISTENT = 0x3 LOCAL_PEERCRED = 0x1 LOCAL_VENDOR = 0x80000000 LOCK_EX = 0x2 @@ -1180,6 +1186,8 @@ const ( O_NONBLOCK = 0x4 O_RDONLY = 0x0 O_RDWR = 0x2 + O_RESOLVE_BENEATH = 0x800000 + O_SEARCH = 0x40000 O_SHLOCK = 0x10 O_SYNC = 0x80 O_TRUNC = 0x400 @@ -1190,6 +1198,10 @@ const ( PARMRK = 0x8 PARODD = 0x2000 PENDIN = 0x20000000 + PIOD_READ_D = 0x1 + PIOD_READ_I = 0x3 + PIOD_WRITE_D = 0x2 + PIOD_WRITE_I = 0x4 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 @@ -1197,6 +1209,51 @@ const ( PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 + PTRACE_DEFAULT = 0x1 + PTRACE_EXEC = 0x1 + PTRACE_FORK = 0x8 + PTRACE_LWP = 0x10 + PTRACE_SCE = 0x2 + PTRACE_SCX = 0x4 + PTRACE_SYSCALL = 0x6 + PTRACE_VFORK = 0x20 + PT_ATTACH = 0xa + PT_CLEARSTEP = 0x10 + PT_CONTINUE = 0x7 + PT_DETACH = 0xb + PT_FIRSTMACH = 0x40 + PT_FOLLOW_FORK = 0x17 + PT_GETDBREGS = 0x25 + PT_GETFPREGS = 0x23 + PT_GETLWPLIST = 0xf + PT_GETNUMLWPS = 0xe + PT_GETREGS = 0x21 + PT_GET_EVENT_MASK = 0x19 + PT_GET_SC_ARGS = 0x1b + PT_GET_SC_RET = 0x1c + PT_IO = 0xc + PT_KILL = 0x8 + PT_LWPINFO = 0xd + PT_LWP_EVENTS = 0x18 + PT_READ_D = 0x2 + PT_READ_I = 0x1 + PT_RESUME = 0x13 + PT_SETDBREGS = 0x26 + PT_SETFPREGS = 0x24 + PT_SETREGS = 0x22 + PT_SETSTEP = 0x11 + PT_SET_EVENT_MASK = 0x1a + PT_STEP = 0x9 + PT_SUSPEND = 0x12 + PT_SYSCALL = 0x16 + PT_TO_SCE = 0x14 + PT_TO_SCX = 0x15 + PT_TRACE_ME = 0x0 + PT_VM_ENTRY = 0x29 + PT_VM_TIMESTAMP = 0x28 + PT_WRITE_D = 0x5 + PT_WRITE_I = 0x4 + P_ZONEID = 0xc RLIMIT_AS = 0xa RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 @@ -1321,10 +1378,12 @@ const ( SIOCGHWADDR = 0xc020693e SIOCGI2C = 0xc020693d SIOCGIFADDR = 0xc0206921 + SIOCGIFALIAS = 0xc044692d SIOCGIFBRDADDR = 0xc0206923 SIOCGIFCAP = 0xc020691f SIOCGIFCONF = 0xc0106924 SIOCGIFDESCR = 0xc020692a + SIOCGIFDOWNREASON = 0xc058699a SIOCGIFDSTADDR = 0xc0206922 SIOCGIFFIB = 0xc020695c SIOCGIFFLAGS = 0xc0206911 @@ -1415,6 +1474,7 @@ const ( SO_RCVBUF = 0x1002 SO_RCVLOWAT = 0x1004 SO_RCVTIMEO = 0x1006 + SO_RERROR = 0x20000 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_REUSEPORT_LB = 0x10000 @@ -1473,22 +1533,40 @@ const ( TCOFLUSH = 0x2 TCOOFF = 0x1 TCOON = 0x2 + TCPOPT_EOL = 0x0 + TCPOPT_FAST_OPEN = 0x22 + TCPOPT_MAXSEG = 0x2 + TCPOPT_NOP = 0x1 + TCPOPT_PAD = 0x0 + TCPOPT_SACK = 0x5 + TCPOPT_SACK_PERMITTED = 0x4 + TCPOPT_SIGNATURE = 0x13 + TCPOPT_TIMESTAMP = 0x8 + TCPOPT_WINDOW = 0x3 TCP_BBR_ACK_COMP_ALG = 0x448 + TCP_BBR_ALGORITHM = 0x43b TCP_BBR_DRAIN_INC_EXTRA = 0x43c TCP_BBR_DRAIN_PG = 0x42e TCP_BBR_EXTRA_GAIN = 0x449 + TCP_BBR_EXTRA_STATE = 0x453 + TCP_BBR_FLOOR_MIN_TSO = 0x454 + TCP_BBR_HDWR_PACE = 0x451 + TCP_BBR_HOLD_TARGET = 0x436 TCP_BBR_IWINTSO = 0x42b TCP_BBR_LOWGAIN_FD = 0x436 TCP_BBR_LOWGAIN_HALF = 0x435 TCP_BBR_LOWGAIN_THRESH = 0x434 TCP_BBR_MAX_RTO = 0x439 TCP_BBR_MIN_RTO = 0x438 + TCP_BBR_MIN_TOPACEOUT = 0x455 TCP_BBR_ONE_RETRAN = 0x431 TCP_BBR_PACE_CROSS = 0x442 TCP_BBR_PACE_DEL_TAR = 0x43f + TCP_BBR_PACE_OH = 0x435 TCP_BBR_PACE_PER_SEC = 0x43e TCP_BBR_PACE_SEG_MAX = 0x440 TCP_BBR_PACE_SEG_MIN = 0x441 + TCP_BBR_POLICER_DETECT = 0x457 TCP_BBR_PROBE_RTT_GAIN = 0x44d TCP_BBR_PROBE_RTT_INT = 0x430 TCP_BBR_PROBE_RTT_LEN = 0x44e @@ -1497,12 +1575,18 @@ const ( TCP_BBR_REC_OVER_HPTS = 0x43a TCP_BBR_RETRAN_WTSO = 0x44b TCP_BBR_RWND_IS_APP = 0x42f + TCP_BBR_SEND_IWND_IN_TSO = 0x44f TCP_BBR_STARTUP_EXIT_EPOCH = 0x43d TCP_BBR_STARTUP_LOSS_EXIT = 0x432 TCP_BBR_STARTUP_PG = 0x42d + TCP_BBR_TMR_PACE_OH = 0x448 + TCP_BBR_TSLIMITS = 0x434 + TCP_BBR_TSTMP_RAISES = 0x456 TCP_BBR_UNLIMITED = 0x43b TCP_BBR_USEDEL_RATE = 0x437 TCP_BBR_USE_LOWGAIN = 0x433 + TCP_BBR_USE_RACK_CHEAT = 0x450 + TCP_BBR_UTTER_MAX_TSO = 0x452 TCP_CA_NAME_MAX = 0x10 TCP_CCALGOOPT = 0x41 TCP_CONGESTION = 0x40 @@ -1542,6 +1626,7 @@ const ( TCP_PCAP_OUT = 0x800 TCP_RACK_EARLY_RECOV = 0x423 TCP_RACK_EARLY_SEG = 0x424 + TCP_RACK_GP_INCREASE = 0x446 TCP_RACK_IDLE_REDUCE_HIGH = 0x444 TCP_RACK_MIN_PACE = 0x445 TCP_RACK_MIN_PACE_SEG = 0x446 @@ -1555,7 +1640,6 @@ const ( TCP_RACK_PRR_SENDALOT = 0x421 TCP_RACK_REORD_FADE = 0x426 TCP_RACK_REORD_THRESH = 0x425 - TCP_RACK_SESS_CWV = 0x42a TCP_RACK_TLP_INC_VAR = 0x429 TCP_RACK_TLP_REDUCE = 0x41c TCP_RACK_TLP_THRESH = 0x427 @@ -1694,12 +1778,13 @@ const ( EIDRM = syscall.Errno(0x52) EILSEQ = syscall.Errno(0x56) EINPROGRESS = syscall.Errno(0x24) + EINTEGRITY = syscall.Errno(0x61) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EISCONN = syscall.Errno(0x38) EISDIR = syscall.Errno(0x15) - ELAST = syscall.Errno(0x60) + ELAST = syscall.Errno(0x61) ELOOP = syscall.Errno(0x3e) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) @@ -1842,7 +1927,7 @@ var errorList = [...]struct { {32, "EPIPE", "broken pipe"}, {33, "EDOM", "numerical argument out of domain"}, {34, "ERANGE", "result too large"}, - {35, "EAGAIN", "resource temporarily unavailable"}, + {35, "EWOULDBLOCK", "resource temporarily unavailable"}, {36, "EINPROGRESS", "operation now in progress"}, {37, "EALREADY", "operation already in progress"}, {38, "ENOTSOCK", "socket operation on non-socket"}, @@ -1904,6 +1989,7 @@ var errorList = [...]struct { {94, "ECAPMODE", "not permitted in capability mode"}, {95, "ENOTRECOVERABLE", "state not recoverable"}, {96, "EOWNERDEAD", "previous owner died"}, + {97, "EINTEGRITY", "integrity check failed"}, } // Signal table diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_riscv64.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_riscv64.go new file mode 100644 index 000000000..341b4d962 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_riscv64.go @@ -0,0 +1,2148 @@ +// mkerrors.sh -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +//go:build riscv64 && freebsd +// +build riscv64,freebsd + +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x23 + AF_ATM = 0x1e + AF_BLUETOOTH = 0x24 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_HYPERV = 0x2b + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1c + AF_INET6_SDP = 0x2a + AF_INET_SDP = 0x28 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x2b + AF_NATM = 0x1d + AF_NETBIOS = 0x6 + AF_NETGRAPH = 0x20 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SCLUSTER = 0x22 + AF_SIP = 0x18 + AF_SLOW = 0x21 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VENDOR00 = 0x27 + AF_VENDOR01 = 0x29 + AF_VENDOR03 = 0x2d + AF_VENDOR04 = 0x2f + AF_VENDOR05 = 0x31 + AF_VENDOR06 = 0x33 + AF_VENDOR07 = 0x35 + AF_VENDOR08 = 0x37 + AF_VENDOR09 = 0x39 + AF_VENDOR10 = 0x3b + AF_VENDOR11 = 0x3d + AF_VENDOR12 = 0x3f + AF_VENDOR13 = 0x41 + AF_VENDOR14 = 0x43 + AF_VENDOR15 = 0x45 + AF_VENDOR16 = 0x47 + AF_VENDOR17 = 0x49 + AF_VENDOR18 = 0x4b + AF_VENDOR19 = 0x4d + AF_VENDOR20 = 0x4f + AF_VENDOR21 = 0x51 + AF_VENDOR22 = 0x53 + AF_VENDOR23 = 0x55 + AF_VENDOR24 = 0x57 + AF_VENDOR25 = 0x59 + AF_VENDOR26 = 0x5b + AF_VENDOR27 = 0x5d + AF_VENDOR28 = 0x5f + AF_VENDOR29 = 0x61 + AF_VENDOR30 = 0x63 + AF_VENDOR31 = 0x65 + AF_VENDOR32 = 0x67 + AF_VENDOR33 = 0x69 + AF_VENDOR34 = 0x6b + AF_VENDOR35 = 0x6d + AF_VENDOR36 = 0x6f + AF_VENDOR37 = 0x71 + AF_VENDOR38 = 0x73 + AF_VENDOR39 = 0x75 + AF_VENDOR40 = 0x77 + AF_VENDOR41 = 0x79 + AF_VENDOR42 = 0x7b + AF_VENDOR43 = 0x7d + AF_VENDOR44 = 0x7f + AF_VENDOR45 = 0x81 + AF_VENDOR46 = 0x83 + AF_VENDOR47 = 0x85 + ALTWERASE = 0x200 + B0 = 0x0 + B1000000 = 0xf4240 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1500000 = 0x16e360 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B2000000 = 0x1e8480 + B230400 = 0x38400 + B2400 = 0x960 + B2500000 = 0x2625a0 + B28800 = 0x7080 + B300 = 0x12c + B3000000 = 0x2dc6c0 + B3500000 = 0x3567e0 + B38400 = 0x9600 + B4000000 = 0x3d0900 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B500000 = 0x7a120 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427c + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRECTION = 0x40044276 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0104279 + BIOCGETBUFMODE = 0x4004427d + BIOCGETIF = 0x4020426b + BIOCGETZMAX = 0x4008427f + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCGTSTAMP = 0x40044283 + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x2000427a + BIOCPROMISC = 0x20004269 + BIOCROTZBUF = 0x40184280 + BIOCSBLEN = 0xc0044266 + BIOCSDIRECTION = 0x80044277 + BIOCSDLT = 0x80044278 + BIOCSETBUFMODE = 0x8004427e + BIOCSETF = 0x80104267 + BIOCSETFNR = 0x80104282 + BIOCSETIF = 0x8020426c + BIOCSETVLANPCP = 0x80044285 + BIOCSETWF = 0x8010427b + BIOCSETZBUF = 0x80184281 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCSTSTAMP = 0x80044284 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x8 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_BUFMODE_BUFFER = 0x1 + BPF_BUFMODE_ZBUF = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_T_BINTIME = 0x2 + BPF_T_BINTIME_FAST = 0x102 + BPF_T_BINTIME_MONOTONIC = 0x202 + BPF_T_BINTIME_MONOTONIC_FAST = 0x302 + BPF_T_FAST = 0x100 + BPF_T_FLAG_MASK = 0x300 + BPF_T_FORMAT_MASK = 0x3 + BPF_T_MICROTIME = 0x0 + BPF_T_MICROTIME_FAST = 0x100 + BPF_T_MICROTIME_MONOTONIC = 0x200 + BPF_T_MICROTIME_MONOTONIC_FAST = 0x300 + BPF_T_MONOTONIC = 0x200 + BPF_T_MONOTONIC_FAST = 0x300 + BPF_T_NANOTIME = 0x1 + BPF_T_NANOTIME_FAST = 0x101 + BPF_T_NANOTIME_MONOTONIC = 0x201 + BPF_T_NANOTIME_MONOTONIC_FAST = 0x301 + BPF_T_NONE = 0x3 + BPF_T_NORMAL = 0x0 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + CAP_ACCEPT = 0x200000020000000 + CAP_ACL_CHECK = 0x400000000010000 + CAP_ACL_DELETE = 0x400000000020000 + CAP_ACL_GET = 0x400000000040000 + CAP_ACL_SET = 0x400000000080000 + CAP_ALL0 = 0x20007ffffffffff + CAP_ALL1 = 0x4000000001fffff + CAP_BIND = 0x200000040000000 + CAP_BINDAT = 0x200008000000400 + CAP_CHFLAGSAT = 0x200000000001400 + CAP_CONNECT = 0x200000080000000 + CAP_CONNECTAT = 0x200010000000400 + CAP_CREATE = 0x200000000000040 + CAP_EVENT = 0x400000000000020 + CAP_EXTATTR_DELETE = 0x400000000001000 + CAP_EXTATTR_GET = 0x400000000002000 + CAP_EXTATTR_LIST = 0x400000000004000 + CAP_EXTATTR_SET = 0x400000000008000 + CAP_FCHDIR = 0x200000000000800 + CAP_FCHFLAGS = 0x200000000001000 + CAP_FCHMOD = 0x200000000002000 + CAP_FCHMODAT = 0x200000000002400 + CAP_FCHOWN = 0x200000000004000 + CAP_FCHOWNAT = 0x200000000004400 + CAP_FCNTL = 0x200000000008000 + CAP_FCNTL_ALL = 0x78 + CAP_FCNTL_GETFL = 0x8 + CAP_FCNTL_GETOWN = 0x20 + CAP_FCNTL_SETFL = 0x10 + CAP_FCNTL_SETOWN = 0x40 + CAP_FEXECVE = 0x200000000000080 + CAP_FLOCK = 0x200000000010000 + CAP_FPATHCONF = 0x200000000020000 + CAP_FSCK = 0x200000000040000 + CAP_FSTAT = 0x200000000080000 + CAP_FSTATAT = 0x200000000080400 + CAP_FSTATFS = 0x200000000100000 + CAP_FSYNC = 0x200000000000100 + CAP_FTRUNCATE = 0x200000000000200 + CAP_FUTIMES = 0x200000000200000 + CAP_FUTIMESAT = 0x200000000200400 + CAP_GETPEERNAME = 0x200000100000000 + CAP_GETSOCKNAME = 0x200000200000000 + CAP_GETSOCKOPT = 0x200000400000000 + CAP_IOCTL = 0x400000000000080 + CAP_IOCTLS_ALL = 0x7fffffffffffffff + CAP_KQUEUE = 0x400000000100040 + CAP_KQUEUE_CHANGE = 0x400000000100000 + CAP_KQUEUE_EVENT = 0x400000000000040 + CAP_LINKAT_SOURCE = 0x200020000000400 + CAP_LINKAT_TARGET = 0x200000000400400 + CAP_LISTEN = 0x200000800000000 + CAP_LOOKUP = 0x200000000000400 + CAP_MAC_GET = 0x400000000000001 + CAP_MAC_SET = 0x400000000000002 + CAP_MKDIRAT = 0x200000000800400 + CAP_MKFIFOAT = 0x200000001000400 + CAP_MKNODAT = 0x200000002000400 + CAP_MMAP = 0x200000000000010 + CAP_MMAP_R = 0x20000000000001d + CAP_MMAP_RW = 0x20000000000001f + CAP_MMAP_RWX = 0x20000000000003f + CAP_MMAP_RX = 0x20000000000003d + CAP_MMAP_W = 0x20000000000001e + CAP_MMAP_WX = 0x20000000000003e + CAP_MMAP_X = 0x20000000000003c + CAP_PDGETPID = 0x400000000000200 + CAP_PDKILL = 0x400000000000800 + CAP_PDWAIT = 0x400000000000400 + CAP_PEELOFF = 0x200001000000000 + CAP_POLL_EVENT = 0x400000000000020 + CAP_PREAD = 0x20000000000000d + CAP_PWRITE = 0x20000000000000e + CAP_READ = 0x200000000000001 + CAP_RECV = 0x200000000000001 + CAP_RENAMEAT_SOURCE = 0x200000004000400 + CAP_RENAMEAT_TARGET = 0x200040000000400 + CAP_RIGHTS_VERSION = 0x0 + CAP_RIGHTS_VERSION_00 = 0x0 + CAP_SEEK = 0x20000000000000c + CAP_SEEK_TELL = 0x200000000000004 + CAP_SEM_GETVALUE = 0x400000000000004 + CAP_SEM_POST = 0x400000000000008 + CAP_SEM_WAIT = 0x400000000000010 + CAP_SEND = 0x200000000000002 + CAP_SETSOCKOPT = 0x200002000000000 + CAP_SHUTDOWN = 0x200004000000000 + CAP_SOCK_CLIENT = 0x200007780000003 + CAP_SOCK_SERVER = 0x200007f60000003 + CAP_SYMLINKAT = 0x200000008000400 + CAP_TTYHOOK = 0x400000000000100 + CAP_UNLINKAT = 0x200000010000400 + CAP_UNUSED0_44 = 0x200080000000000 + CAP_UNUSED0_57 = 0x300000000000000 + CAP_UNUSED1_22 = 0x400000000200000 + CAP_UNUSED1_57 = 0x500000000000000 + CAP_WRITE = 0x200000000000002 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_BOOTTIME = 0x5 + CLOCK_MONOTONIC = 0x4 + CLOCK_MONOTONIC_COARSE = 0xc + CLOCK_MONOTONIC_FAST = 0xc + CLOCK_MONOTONIC_PRECISE = 0xb + CLOCK_PROCESS_CPUTIME_ID = 0xf + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_COARSE = 0xa + CLOCK_REALTIME_FAST = 0xa + CLOCK_REALTIME_PRECISE = 0x9 + CLOCK_SECOND = 0xd + CLOCK_THREAD_CPUTIME_ID = 0xe + CLOCK_UPTIME = 0x5 + CLOCK_UPTIME_FAST = 0x8 + CLOCK_UPTIME_PRECISE = 0x7 + CLOCK_VIRTUAL = 0x1 + CPUSTATES = 0x5 + CP_IDLE = 0x4 + CP_INTR = 0x3 + CP_NICE = 0x1 + CP_SYS = 0x2 + CP_USER = 0x0 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0x18 + CTL_NET = 0x4 + DIOCGATTR = 0xc148648e + DIOCGDELETE = 0x80106488 + DIOCGFLUSH = 0x20006487 + DIOCGFWHEADS = 0x40046483 + DIOCGFWSECTORS = 0x40046482 + DIOCGIDENT = 0x41006489 + DIOCGKERNELDUMP = 0xc0986492 + DIOCGMEDIASIZE = 0x40086481 + DIOCGPHYSPATH = 0x4400648d + DIOCGPROVIDERNAME = 0x4400648a + DIOCGSECTORSIZE = 0x40046480 + DIOCGSTRIPEOFFSET = 0x4008648c + DIOCGSTRIPESIZE = 0x4008648b + DIOCSKERNELDUMP = 0x80986491 + DIOCSKERNELDUMP_FREEBSD11 = 0x80046485 + DIOCSKERNELDUMP_FREEBSD12 = 0x80506490 + DIOCZONECMD = 0xc080648f + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_BREDR_BB = 0xff + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_BLUETOOTH_LE_LL = 0xfb + DLT_BLUETOOTH_LE_LL_WITH_PHDR = 0x100 + DLT_BLUETOOTH_LINUX_MONITOR = 0xfe + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_CLASS_NETBSD_RAWAF = 0x2240000 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DISPLAYPORT_AUX = 0x113 + DLT_DOCSIS = 0x8f + DLT_DOCSIS31_XRA31 = 0x111 + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_EPON = 0x103 + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_ETHERNET_MPACKET = 0x112 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_INFINIBAND = 0xf7 + DLT_IPFILTER = 0x74 + DLT_IPMB_KONTRON = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPMI_HPM_2 = 0x104 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_ISO_14443 = 0x108 + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LINUX_SLL2 = 0x114 + DLT_LOOP = 0x6c + DLT_LORATAP = 0x10e + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0x114 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NETLINK = 0xfd + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NORDIC_BLE = 0x110 + DLT_NULL = 0x0 + DLT_OPENFLOW = 0x10b + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x79 + DLT_PKTAP = 0x102 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0xe + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PROFIBUS_DL = 0x101 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RDS = 0x109 + DLT_REDBACK_SMARTEDGE = 0x20 + DLT_RIO = 0x7c + DLT_RTAC_SERIAL = 0xfa + DLT_SCCP = 0x8e + DLT_SCTP = 0xf8 + DLT_SDLC = 0x10c + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xd + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TI_LLN_SNIFFER = 0x10d + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USBPCAP = 0xf9 + DLT_USB_DARWIN = 0x10a + DLT_USB_FREEBSD = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_VSOCK = 0x10f + DLT_WATTSTOPPER_DLM = 0x107 + DLT_WIHART = 0xdf + DLT_WIRESHARK_UPPER_PDU = 0xfc + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DLT_ZWAVE_R1_R2 = 0x105 + DLT_ZWAVE_R3 = 0x106 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EHE_DEAD_PRIORITY = -0x1 + EVFILT_AIO = -0x3 + EVFILT_EMPTY = -0xd + EVFILT_FS = -0x9 + EVFILT_LIO = -0xa + EVFILT_PROC = -0x5 + EVFILT_PROCDESC = -0x8 + EVFILT_READ = -0x1 + EVFILT_SENDFILE = -0xc + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xd + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xb + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EVNAMEMAP_NAME_SIZE = 0x40 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DROP = 0x1000 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_FLAG2 = 0x4000 + EV_FORCEONESHOT = 0x100 + EV_ONESHOT = 0x10 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTATTR_MAXNAMELEN = 0xff + EXTATTR_NAMESPACE_EMPTY = 0x0 + EXTATTR_NAMESPACE_SYSTEM = 0x2 + EXTATTR_NAMESPACE_USER = 0x1 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_NONE = -0xc8 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_ADD_SEALS = 0x13 + F_CANCEL = 0x5 + F_DUP2FD = 0xa + F_DUP2FD_CLOEXEC = 0x12 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x11 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0xb + F_GETOWN = 0x5 + F_GET_SEALS = 0x14 + F_ISUNIONSTACK = 0x15 + F_KINFO = 0x16 + F_OGETLK = 0x7 + F_OK = 0x0 + F_OSETLK = 0x8 + F_OSETLKW = 0x9 + F_RDAHEAD = 0x10 + F_RDLCK = 0x1 + F_READAHEAD = 0xf + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0xc + F_SETLKW = 0xd + F_SETLK_REMOTE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_UNLCKSYS = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFCAP_WOL_MAGIC = 0x2000 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x218f72 + IFF_CANTCONFIG = 0x10000 + IFF_DEBUG = 0x4 + IFF_DRV_OACTIVE = 0x400 + IFF_DRV_RUNNING = 0x40 + IFF_DYING = 0x200000 + IFF_KNOWSEPOCH = 0x20 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MONITOR = 0x40000 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOGROUP = 0x800000 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PPROMISC = 0x20000 + IFF_PROMISC = 0x100 + IFF_RENAMING = 0x400000 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_STATICARP = 0x80000 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_IEEE1394 = 0x90 + IFT_INFINIBAND = 0xc7 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_PPP = 0x17 + IFT_PROPVIRTUAL = 0x35 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_NETMASK_DEFAULT = 0xffffff00 + IN_RFC3021_MASK = 0xfffffffe + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CARP = 0x70 + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DCCP = 0x21 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0x102 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HIP = 0x8b + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MEAS = 0x13 + IPPROTO_MH = 0x87 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OLD_DIVERT = 0xfe + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_RESERVED_253 = 0xfd + IPPROTO_RESERVED_254 = 0xfe + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEND = 0x103 + IPPROTO_SHIM6 = 0x8c + IPPROTO_SKIP = 0x39 + IPPROTO_SPACER = 0x7fff + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TLSP = 0x38 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_BINDANY = 0x40 + IPV6_BINDMULTI = 0x41 + IPV6_BINDV6ONLY = 0x1b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FLOWID = 0x43 + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_LEN = 0x14 + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOWTYPE = 0x44 + IPV6_FRAGTTL = 0x78 + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MMTU = 0x500 + IPV6_MSFILTER = 0x4a + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_ORIGDSTADDR = 0x48 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_PREFER_TEMPADDR = 0x3f + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVFLOWID = 0x46 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVORIGDSTADDR = 0x48 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRSSBUCKETID = 0x47 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RSSBUCKETID = 0x45 + IPV6_RSS_LISTEN_BUCKET = 0x42 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IPV6_VLAN_PCP = 0x4b + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BINDANY = 0x18 + IP_BINDMULTI = 0x19 + IP_BLOCK_SOURCE = 0x48 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DONTFRAG = 0x43 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET3 = 0x31 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FLOWID = 0x5a + IP_FLOWTYPE = 0x5b + IP_FW3 = 0x30 + IP_FW_ADD = 0x32 + IP_FW_DEL = 0x33 + IP_FW_FLUSH = 0x34 + IP_FW_GET = 0x36 + IP_FW_NAT_CFG = 0x38 + IP_FW_NAT_DEL = 0x39 + IP_FW_NAT_GET_CONFIG = 0x3a + IP_FW_NAT_GET_LOG = 0x3b + IP_FW_RESETLOG = 0x37 + IP_FW_TABLE_ADD = 0x28 + IP_FW_TABLE_DEL = 0x29 + IP_FW_TABLE_FLUSH = 0x2a + IP_FW_TABLE_GETSIZE = 0x2b + IP_FW_TABLE_LIST = 0x2c + IP_FW_ZERO = 0x35 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MF = 0x2000 + IP_MINTTL = 0x42 + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_OFFMASK = 0x1fff + IP_ONESBCAST = 0x17 + IP_OPTIONS = 0x1 + IP_ORIGDSTADDR = 0x1b + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVFLOWID = 0x5d + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVORIGDSTADDR = 0x1b + IP_RECVRETOPTS = 0x6 + IP_RECVRSSBUCKETID = 0x5e + IP_RECVTOS = 0x44 + IP_RECVTTL = 0x41 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSSBUCKETID = 0x5c + IP_RSS_LISTEN_BUCKET = 0x1a + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_SENDSRCADDR = 0x7 + IP_TOS = 0x3 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + IP_VLAN_PCP = 0x4b + ISIG = 0x80 + ISTRIP = 0x20 + ITIMER_PROF = 0x2 + ITIMER_REAL = 0x0 + ITIMER_VIRTUAL = 0x1 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCAL_CONNWAIT = 0x4 + LOCAL_CREDS = 0x2 + LOCAL_CREDS_PERSISTENT = 0x3 + LOCAL_PEERCRED = 0x1 + LOCAL_VENDOR = 0x80000000 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_AUTOSYNC = 0x7 + MADV_CORE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_NOCORE = 0x8 + MADV_NORMAL = 0x0 + MADV_NOSYNC = 0x6 + MADV_PROTECT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MAP_32BIT = 0x80000 + MAP_ALIGNED_SUPER = 0x1000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_EXCL = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GUARD = 0x2000 + MAP_HASSEMAPHORE = 0x200 + MAP_NOCORE = 0x20000 + MAP_NOSYNC = 0x800 + MAP_PREFAULT_READ = 0x40000 + MAP_PRIVATE = 0x2 + MAP_RESERVED0020 = 0x20 + MAP_RESERVED0040 = 0x40 + MAP_RESERVED0080 = 0x80 + MAP_RESERVED0100 = 0x100 + MAP_SHARED = 0x1 + MAP_STACK = 0x400 + MCAST_BLOCK_SOURCE = 0x54 + MCAST_EXCLUDE = 0x2 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x50 + MCAST_JOIN_SOURCE_GROUP = 0x52 + MCAST_LEAVE_GROUP = 0x51 + MCAST_LEAVE_SOURCE_GROUP = 0x53 + MCAST_UNBLOCK_SOURCE = 0x55 + MCAST_UNDEFINED = 0x0 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MFD_ALLOW_SEALING = 0x2 + MFD_CLOEXEC = 0x1 + MFD_HUGETLB = 0x4 + MFD_HUGE_16GB = -0x78000000 + MFD_HUGE_16MB = 0x60000000 + MFD_HUGE_1GB = 0x78000000 + MFD_HUGE_1MB = 0x50000000 + MFD_HUGE_256MB = 0x70000000 + MFD_HUGE_2GB = 0x7c000000 + MFD_HUGE_2MB = 0x54000000 + MFD_HUGE_32MB = 0x64000000 + MFD_HUGE_512KB = 0x4c000000 + MFD_HUGE_512MB = 0x74000000 + MFD_HUGE_64KB = 0x40000000 + MFD_HUGE_8MB = 0x5c000000 + MFD_HUGE_MASK = 0xfc000000 + MFD_HUGE_SHIFT = 0x1a + MNT_ACLS = 0x8000000 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x200000000 + MNT_BYFSID = 0x8000000 + MNT_CMDFLAGS = 0x300d0f0000 + MNT_DEFEXPORTED = 0x200 + MNT_DELEXPORT = 0x20000 + MNT_EMPTYDIR = 0x2000000000 + MNT_EXKERB = 0x800 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXPUBLIC = 0x20000000 + MNT_EXRDONLY = 0x80 + MNT_EXTLS = 0x4000000000 + MNT_EXTLSCERT = 0x8000000000 + MNT_EXTLSCERTUSER = 0x10000000000 + MNT_FORCE = 0x80000 + MNT_GJOURNAL = 0x2000000 + MNT_IGNORE = 0x800000 + MNT_LAZY = 0x3 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NFS4ACLS = 0x10 + MNT_NOATIME = 0x10000000 + MNT_NOCLUSTERR = 0x40000000 + MNT_NOCLUSTERW = 0x80000000 + MNT_NOCOVER = 0x1000000000 + MNT_NOEXEC = 0x4 + MNT_NONBUSY = 0x4000000 + MNT_NOSUID = 0x8 + MNT_NOSYMFOLLOW = 0x400000 + MNT_NOWAIT = 0x2 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SNAPSHOT = 0x1000000 + MNT_SOFTDEP = 0x200000 + MNT_SUIDDIR = 0x100000 + MNT_SUJ = 0x100000000 + MNT_SUSPEND = 0x4 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UNTRUSTED = 0x800000000 + MNT_UPDATE = 0x10000 + MNT_UPDATEMASK = 0xad8d0807e + MNT_USER = 0x8000 + MNT_VERIFIED = 0x400000000 + MNT_VISFLAGMASK = 0xffef0ffff + MNT_WAIT = 0x1 + MSG_CMSG_CLOEXEC = 0x40000 + MSG_COMPAT = 0x8000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_NBIO = 0x4000 + MSG_NOSIGNAL = 0x20000 + MSG_NOTIFICATION = 0x2000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITFORONE = 0x80000 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x0 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLISTL = 0x5 + NET_RT_IFMALIST = 0x4 + NET_RT_NHGRP = 0x7 + NET_RT_NHOP = 0x6 + NFDBITS = 0x40 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ABSTIME = 0x10 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_CLOSE = 0x100 + NOTE_CLOSE_WRITE = 0x200 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FILE_POLL = 0x2 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MSECONDS = 0x2 + NOTE_NSECONDS = 0x8 + NOTE_OPEN = 0x80 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_READ = 0x400 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x4 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x100000 + O_CREAT = 0x200 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x20000 + O_DSYNC = 0x1000000 + O_EMPTY_PATH = 0x2000000 + O_EXCL = 0x800 + O_EXEC = 0x40000 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_PATH = 0x400000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RESOLVE_BENEATH = 0x800000 + O_SEARCH = 0x40000 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_TTY_INIT = 0x80000 + O_VERIFY = 0x200000 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PIOD_READ_D = 0x1 + PIOD_READ_I = 0x3 + PIOD_WRITE_D = 0x2 + PIOD_WRITE_I = 0x4 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PTRACE_DEFAULT = 0x1 + PTRACE_EXEC = 0x1 + PTRACE_FORK = 0x8 + PTRACE_LWP = 0x10 + PTRACE_SCE = 0x2 + PTRACE_SCX = 0x4 + PTRACE_SYSCALL = 0x6 + PTRACE_VFORK = 0x20 + PT_ATTACH = 0xa + PT_CLEARSTEP = 0x10 + PT_CONTINUE = 0x7 + PT_COREDUMP = 0x1d + PT_DETACH = 0xb + PT_FIRSTMACH = 0x40 + PT_FOLLOW_FORK = 0x17 + PT_GETDBREGS = 0x25 + PT_GETFPREGS = 0x23 + PT_GETLWPLIST = 0xf + PT_GETNUMLWPS = 0xe + PT_GETREGS = 0x21 + PT_GET_EVENT_MASK = 0x19 + PT_GET_SC_ARGS = 0x1b + PT_GET_SC_RET = 0x1c + PT_IO = 0xc + PT_KILL = 0x8 + PT_LWPINFO = 0xd + PT_LWP_EVENTS = 0x18 + PT_READ_D = 0x2 + PT_READ_I = 0x1 + PT_RESUME = 0x13 + PT_SETDBREGS = 0x26 + PT_SETFPREGS = 0x24 + PT_SETREGS = 0x22 + PT_SETSTEP = 0x11 + PT_SET_EVENT_MASK = 0x1a + PT_STEP = 0x9 + PT_SUSPEND = 0x12 + PT_SYSCALL = 0x16 + PT_TO_SCE = 0x14 + PT_TO_SCX = 0x15 + PT_TRACE_ME = 0x0 + PT_VM_ENTRY = 0x29 + PT_VM_TIMESTAMP = 0x28 + PT_WRITE_D = 0x5 + PT_WRITE_I = 0x4 + P_ZONEID = 0xc + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FIXEDMTU = 0x80000 + RTF_FMASK = 0x1004d808 + RTF_GATEWAY = 0x2 + RTF_GWFLAG_COMPAT = 0x80000000 + RTF_HOST = 0x4 + RTF_LLDATA = 0x400 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_PINNED = 0x100000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_REJECT = 0x8 + RTF_STATIC = 0x800 + RTF_STICKY = 0x10000000 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x12 + RTM_IFANNOUNCE = 0x11 + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RTV_WEIGHT = 0x100 + RT_ALL_FIBS = -0x1 + RT_BLACKHOLE = 0x40 + RT_DEFAULT_FIB = 0x0 + RT_DEFAULT_WEIGHT = 0x1 + RT_HAS_GW = 0x80 + RT_HAS_HEADER = 0x10 + RT_HAS_HEADER_BIT = 0x4 + RT_L2_ME = 0x4 + RT_L2_ME_BIT = 0x2 + RT_LLE_CACHE = 0x100 + RT_MAX_WEIGHT = 0xffffff + RT_MAY_LOOP = 0x8 + RT_MAY_LOOP_BIT = 0x3 + RT_REJECT = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_BINTIME = 0x4 + SCM_CREDS = 0x3 + SCM_CREDS2 = 0x8 + SCM_MONOTONIC = 0x6 + SCM_REALTIME = 0x5 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SCM_TIME_INFO = 0x7 + SEEK_CUR = 0x1 + SEEK_DATA = 0x3 + SEEK_END = 0x2 + SEEK_HOLE = 0x4 + SEEK_SET = 0x0 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80286987 + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80286989 + SIOCDIFPHYADDR = 0x80206949 + SIOCGDRVSPEC = 0xc028697b + SIOCGETSGCNT = 0xc0207210 + SIOCGETVIFCNT = 0xc028720f + SIOCGHIWAT = 0x40047301 + SIOCGHWADDR = 0xc020693e + SIOCGI2C = 0xc020693d + SIOCGIFADDR = 0xc0206921 + SIOCGIFALIAS = 0xc044692d + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020691f + SIOCGIFCONF = 0xc0106924 + SIOCGIFDATA = 0x8020692c + SIOCGIFDESCR = 0xc020692a + SIOCGIFDOWNREASON = 0xc058699a + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFIB = 0xc020695c + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc028698a + SIOCGIFGROUP = 0xc0286988 + SIOCGIFINDEX = 0xc0206920 + SIOCGIFMAC = 0xc0206926 + SIOCGIFMEDIA = 0xc0306938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFRSSHASH = 0xc0186997 + SIOCGIFRSSKEY = 0xc0946996 + SIOCGIFSTATUS = 0xc331693b + SIOCGIFXMEDIA = 0xc030698b + SIOCGLANPCP = 0xc0206998 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGPRIVATE_0 = 0xc0206950 + SIOCGPRIVATE_1 = 0xc0206951 + SIOCGTUNFIB = 0xc020695e + SIOCIFCREATE = 0xc020697a + SIOCIFCREATE2 = 0xc020697c + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106978 + SIOCSDRVSPEC = 0x8028697b + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020691e + SIOCSIFDESCR = 0x80206929 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFIB = 0x8020695d + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206927 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNAME = 0x80206928 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPHYS = 0x80206936 + SIOCSIFRVNET = 0xc020695b + SIOCSIFVNET = 0xc020695a + SIOCSLANPCP = 0x80206999 + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSTUNFIB = 0x8020695f + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_NONBLOCK = 0x20000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_LOCAL = 0x0 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BINTIME = 0x2000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DOMAIN = 0x1019 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1009 + SO_LINGER = 0x80 + SO_LISTENINCQLEN = 0x1013 + SO_LISTENQLEN = 0x1012 + SO_LISTENQLIMIT = 0x1011 + SO_MAX_PACING_RATE = 0x1018 + SO_NOSIGPIPE = 0x800 + SO_NO_DDP = 0x8000 + SO_NO_OFFLOAD = 0x4000 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1010 + SO_PROTOCOL = 0x1016 + SO_PROTOTYPE = 0x1016 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_RERROR = 0x20000 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_REUSEPORT_LB = 0x10000 + SO_SETFIB = 0x1014 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TS_BINTIME = 0x1 + SO_TS_CLOCK = 0x1017 + SO_TS_CLOCK_MAX = 0x3 + SO_TS_DEFAULT = 0x0 + SO_TS_MONOTONIC = 0x3 + SO_TS_REALTIME = 0x2 + SO_TS_REALTIME_MICRO = 0x0 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SO_USER_COOKIE = 0x1015 + SO_VENDOR = 0x80000000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB3 = 0x4 + TABDLY = 0x4 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCPOPT_EOL = 0x0 + TCPOPT_FAST_OPEN = 0x22 + TCPOPT_MAXSEG = 0x2 + TCPOPT_NOP = 0x1 + TCPOPT_PAD = 0x0 + TCPOPT_SACK = 0x5 + TCPOPT_SACK_PERMITTED = 0x4 + TCPOPT_SIGNATURE = 0x13 + TCPOPT_TIMESTAMP = 0x8 + TCPOPT_WINDOW = 0x3 + TCP_BBR_ACK_COMP_ALG = 0x448 + TCP_BBR_ALGORITHM = 0x43b + TCP_BBR_DRAIN_INC_EXTRA = 0x43c + TCP_BBR_DRAIN_PG = 0x42e + TCP_BBR_EXTRA_GAIN = 0x449 + TCP_BBR_EXTRA_STATE = 0x453 + TCP_BBR_FLOOR_MIN_TSO = 0x454 + TCP_BBR_HDWR_PACE = 0x451 + TCP_BBR_HOLD_TARGET = 0x436 + TCP_BBR_IWINTSO = 0x42b + TCP_BBR_LOWGAIN_FD = 0x436 + TCP_BBR_LOWGAIN_HALF = 0x435 + TCP_BBR_LOWGAIN_THRESH = 0x434 + TCP_BBR_MAX_RTO = 0x439 + TCP_BBR_MIN_RTO = 0x438 + TCP_BBR_MIN_TOPACEOUT = 0x455 + TCP_BBR_ONE_RETRAN = 0x431 + TCP_BBR_PACE_CROSS = 0x442 + TCP_BBR_PACE_DEL_TAR = 0x43f + TCP_BBR_PACE_OH = 0x435 + TCP_BBR_PACE_PER_SEC = 0x43e + TCP_BBR_PACE_SEG_MAX = 0x440 + TCP_BBR_PACE_SEG_MIN = 0x441 + TCP_BBR_POLICER_DETECT = 0x457 + TCP_BBR_PROBE_RTT_GAIN = 0x44d + TCP_BBR_PROBE_RTT_INT = 0x430 + TCP_BBR_PROBE_RTT_LEN = 0x44e + TCP_BBR_RACK_INIT_RATE = 0x458 + TCP_BBR_RACK_RTT_USE = 0x44a + TCP_BBR_RECFORCE = 0x42c + TCP_BBR_REC_OVER_HPTS = 0x43a + TCP_BBR_RETRAN_WTSO = 0x44b + TCP_BBR_RWND_IS_APP = 0x42f + TCP_BBR_SEND_IWND_IN_TSO = 0x44f + TCP_BBR_STARTUP_EXIT_EPOCH = 0x43d + TCP_BBR_STARTUP_LOSS_EXIT = 0x432 + TCP_BBR_STARTUP_PG = 0x42d + TCP_BBR_TMR_PACE_OH = 0x448 + TCP_BBR_TSLIMITS = 0x434 + TCP_BBR_TSTMP_RAISES = 0x456 + TCP_BBR_UNLIMITED = 0x43b + TCP_BBR_USEDEL_RATE = 0x437 + TCP_BBR_USE_LOWGAIN = 0x433 + TCP_BBR_USE_RACK_CHEAT = 0x450 + TCP_BBR_USE_RACK_RR = 0x450 + TCP_BBR_UTTER_MAX_TSO = 0x452 + TCP_CA_NAME_MAX = 0x10 + TCP_CCALGOOPT = 0x41 + TCP_CONGESTION = 0x40 + TCP_DATA_AFTER_CLOSE = 0x44c + TCP_DEFER_OPTIONS = 0x470 + TCP_DELACK = 0x48 + TCP_FASTOPEN = 0x401 + TCP_FASTOPEN_MAX_COOKIE_LEN = 0x10 + TCP_FASTOPEN_MIN_COOKIE_LEN = 0x4 + TCP_FASTOPEN_PSK_LEN = 0x10 + TCP_FAST_RSM_HACK = 0x471 + TCP_FIN_IS_RST = 0x49 + TCP_FUNCTION_BLK = 0x2000 + TCP_FUNCTION_NAME_LEN_MAX = 0x20 + TCP_HDWR_RATE_CAP = 0x46a + TCP_HDWR_UP_ONLY = 0x46c + TCP_IDLE_REDUCE = 0x46 + TCP_INFO = 0x20 + TCP_IWND_NB = 0x2b + TCP_IWND_NSEG = 0x2c + TCP_KEEPCNT = 0x400 + TCP_KEEPIDLE = 0x100 + TCP_KEEPINIT = 0x80 + TCP_KEEPINTVL = 0x200 + TCP_LOG = 0x22 + TCP_LOGBUF = 0x23 + TCP_LOGDUMP = 0x25 + TCP_LOGDUMPID = 0x26 + TCP_LOGID = 0x24 + TCP_LOGID_CNT = 0x2e + TCP_LOG_ID_LEN = 0x40 + TCP_LOG_LIMIT = 0x4a + TCP_LOG_TAG = 0x2f + TCP_MAXBURST = 0x4 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXPEAKRATE = 0x45 + TCP_MAXSEG = 0x2 + TCP_MAXUNACKTIME = 0x44 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_NO_PRR = 0x462 + TCP_PACING_RATE_CAP = 0x46b + TCP_PCAP_IN = 0x1000 + TCP_PCAP_OUT = 0x800 + TCP_PERF_INFO = 0x4e + TCP_PROC_ACCOUNTING = 0x4c + TCP_RACK_ABC_VAL = 0x46d + TCP_RACK_CHEAT_NOT_CONF_RATE = 0x459 + TCP_RACK_DO_DETECTION = 0x449 + TCP_RACK_EARLY_RECOV = 0x423 + TCP_RACK_EARLY_SEG = 0x424 + TCP_RACK_FORCE_MSEG = 0x45d + TCP_RACK_GP_INCREASE = 0x446 + TCP_RACK_GP_INCREASE_CA = 0x45a + TCP_RACK_GP_INCREASE_REC = 0x45c + TCP_RACK_GP_INCREASE_SS = 0x45b + TCP_RACK_IDLE_REDUCE_HIGH = 0x444 + TCP_RACK_MBUF_QUEUE = 0x41a + TCP_RACK_MEASURE_CNT = 0x46f + TCP_RACK_MIN_PACE = 0x445 + TCP_RACK_MIN_PACE_SEG = 0x446 + TCP_RACK_MIN_TO = 0x422 + TCP_RACK_NONRXT_CFG_RATE = 0x463 + TCP_RACK_NO_PUSH_AT_MAX = 0x466 + TCP_RACK_PACE_ALWAYS = 0x41f + TCP_RACK_PACE_MAX_SEG = 0x41e + TCP_RACK_PACE_RATE_CA = 0x45e + TCP_RACK_PACE_RATE_REC = 0x460 + TCP_RACK_PACE_RATE_SS = 0x45f + TCP_RACK_PACE_REDUCE = 0x41d + TCP_RACK_PACE_TO_FILL = 0x467 + TCP_RACK_PACING_BETA = 0x472 + TCP_RACK_PACING_BETA_ECN = 0x473 + TCP_RACK_PKT_DELAY = 0x428 + TCP_RACK_PROFILE = 0x469 + TCP_RACK_PROP = 0x41b + TCP_RACK_PROP_RATE = 0x420 + TCP_RACK_PRR_SENDALOT = 0x421 + TCP_RACK_REORD_FADE = 0x426 + TCP_RACK_REORD_THRESH = 0x425 + TCP_RACK_RR_CONF = 0x459 + TCP_RACK_TIMER_SLOP = 0x474 + TCP_RACK_TLP_INC_VAR = 0x429 + TCP_RACK_TLP_REDUCE = 0x41c + TCP_RACK_TLP_THRESH = 0x427 + TCP_RACK_TLP_USE = 0x447 + TCP_REC_ABC_VAL = 0x46e + TCP_REMOTE_UDP_ENCAPS_PORT = 0x47 + TCP_REUSPORT_LB_NUMA = 0x402 + TCP_REUSPORT_LB_NUMA_CURDOM = -0x1 + TCP_REUSPORT_LB_NUMA_NODOM = -0x2 + TCP_RXTLS_ENABLE = 0x29 + TCP_RXTLS_MODE = 0x2a + TCP_SHARED_CWND_ALLOWED = 0x4b + TCP_SHARED_CWND_ENABLE = 0x464 + TCP_SHARED_CWND_TIME_LIMIT = 0x468 + TCP_STATS = 0x21 + TCP_TIMELY_DYN_ADJ = 0x465 + TCP_TLS_MODE_IFNET = 0x2 + TCP_TLS_MODE_NONE = 0x0 + TCP_TLS_MODE_SW = 0x1 + TCP_TLS_MODE_TOE = 0x3 + TCP_TXTLS_ENABLE = 0x27 + TCP_TXTLS_MODE = 0x28 + TCP_USER_LOG = 0x30 + TCP_USE_CMP_ACKS = 0x4d + TCP_VENDOR = 0x80000000 + TCSAFLUSH = 0x2 + TIMER_ABSTIME = 0x1 + TIMER_RELTIME = 0x0 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGPTN = 0x4004740f + TIOCGSID = 0x40047463 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DCD = 0x40 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMASTER = 0x2000741c + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + UTIME_NOW = -0x1 + UTIME_OMIT = -0x2 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VERASE2 = 0x7 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x4 + WCOREFLAG = 0x80 + WEXITED = 0x10 + WLINUXCLONE = 0x80000000 + WNOHANG = 0x1 + WNOWAIT = 0x8 + WSTOPPED = 0x2 + WTRAPPED = 0x20 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x59) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x55) + ECAPMODE = syscall.Errno(0x5e) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDOOFUS = syscall.Errno(0x58) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x52) + EILSEQ = syscall.Errno(0x56) + EINPROGRESS = syscall.Errno(0x24) + EINTEGRITY = syscall.Errno(0x61) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x61) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5a) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x57) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCAPABLE = syscall.Errno(0x5d) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x5f) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x60) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x5c) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGLIBRT = syscall.Signal(0x21) + SIGLWP = syscall.Signal(0x20) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large"}, + {35, "EWOULDBLOCK", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "EOPNOTSUPP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "operation timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disc quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC prog. not avail"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EIDRM", "identifier removed"}, + {83, "ENOMSG", "no message of desired type"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "ECANCELED", "operation canceled"}, + {86, "EILSEQ", "illegal byte sequence"}, + {87, "ENOATTR", "attribute not found"}, + {88, "EDOOFUS", "programming error"}, + {89, "EBADMSG", "bad message"}, + {90, "EMULTIHOP", "multihop attempted"}, + {91, "ENOLINK", "link has been severed"}, + {92, "EPROTO", "protocol error"}, + {93, "ENOTCAPABLE", "capabilities insufficient"}, + {94, "ECAPMODE", "not permitted in capability mode"}, + {95, "ENOTRECOVERABLE", "state not recoverable"}, + {96, "EOWNERDEAD", "previous owner died"}, + {97, "EINTEGRITY", "integrity check failed"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGIOT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "suspended (signal)"}, + {18, "SIGTSTP", "suspended"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, + {32, "SIGTHR", "unknown signal"}, + {33, "SIGLIBRT", "unknown signal"}, +} diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux.go b/vendor/golang.org/x/sys/unix/zerrors_linux.go index bcc45d108..785d693eb 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux.go @@ -38,7 +38,8 @@ const ( AF_KEY = 0xf AF_LLC = 0x1a AF_LOCAL = 0x1 - AF_MAX = 0x2d + AF_MAX = 0x2e + AF_MCTP = 0x2d AF_MPLS = 0x1c AF_NETBEUI = 0xd AF_NETLINK = 0x10 @@ -139,6 +140,306 @@ const ( ARPHRD_VOID = 0xffff ARPHRD_VSOCKMON = 0x33a ARPHRD_X25 = 0x10f + AUDIT_ADD = 0x3eb + AUDIT_ADD_RULE = 0x3f3 + AUDIT_ALWAYS = 0x2 + AUDIT_ANOM_ABEND = 0x6a5 + AUDIT_ANOM_CREAT = 0x6a7 + AUDIT_ANOM_LINK = 0x6a6 + AUDIT_ANOM_PROMISCUOUS = 0x6a4 + AUDIT_ARCH = 0xb + AUDIT_ARCH_AARCH64 = 0xc00000b7 + AUDIT_ARCH_ALPHA = 0xc0009026 + AUDIT_ARCH_ARCOMPACT = 0x4000005d + AUDIT_ARCH_ARCOMPACTBE = 0x5d + AUDIT_ARCH_ARCV2 = 0x400000c3 + AUDIT_ARCH_ARCV2BE = 0xc3 + AUDIT_ARCH_ARM = 0x40000028 + AUDIT_ARCH_ARMEB = 0x28 + AUDIT_ARCH_C6X = 0x4000008c + AUDIT_ARCH_C6XBE = 0x8c + AUDIT_ARCH_CRIS = 0x4000004c + AUDIT_ARCH_CSKY = 0x400000fc + AUDIT_ARCH_FRV = 0x5441 + AUDIT_ARCH_H8300 = 0x2e + AUDIT_ARCH_HEXAGON = 0xa4 + AUDIT_ARCH_I386 = 0x40000003 + AUDIT_ARCH_IA64 = 0xc0000032 + AUDIT_ARCH_LOONGARCH32 = 0x40000102 + AUDIT_ARCH_LOONGARCH64 = 0xc0000102 + AUDIT_ARCH_M32R = 0x58 + AUDIT_ARCH_M68K = 0x4 + AUDIT_ARCH_MICROBLAZE = 0xbd + AUDIT_ARCH_MIPS = 0x8 + AUDIT_ARCH_MIPS64 = 0x80000008 + AUDIT_ARCH_MIPS64N32 = 0xa0000008 + AUDIT_ARCH_MIPSEL = 0x40000008 + AUDIT_ARCH_MIPSEL64 = 0xc0000008 + AUDIT_ARCH_MIPSEL64N32 = 0xe0000008 + AUDIT_ARCH_NDS32 = 0x400000a7 + AUDIT_ARCH_NDS32BE = 0xa7 + AUDIT_ARCH_NIOS2 = 0x40000071 + AUDIT_ARCH_OPENRISC = 0x5c + AUDIT_ARCH_PARISC = 0xf + AUDIT_ARCH_PARISC64 = 0x8000000f + AUDIT_ARCH_PPC = 0x14 + AUDIT_ARCH_PPC64 = 0x80000015 + AUDIT_ARCH_PPC64LE = 0xc0000015 + AUDIT_ARCH_RISCV32 = 0x400000f3 + AUDIT_ARCH_RISCV64 = 0xc00000f3 + AUDIT_ARCH_S390 = 0x16 + AUDIT_ARCH_S390X = 0x80000016 + AUDIT_ARCH_SH = 0x2a + AUDIT_ARCH_SH64 = 0x8000002a + AUDIT_ARCH_SHEL = 0x4000002a + AUDIT_ARCH_SHEL64 = 0xc000002a + AUDIT_ARCH_SPARC = 0x2 + AUDIT_ARCH_SPARC64 = 0x8000002b + AUDIT_ARCH_TILEGX = 0xc00000bf + AUDIT_ARCH_TILEGX32 = 0x400000bf + AUDIT_ARCH_TILEPRO = 0x400000bc + AUDIT_ARCH_UNICORE = 0x4000006e + AUDIT_ARCH_X86_64 = 0xc000003e + AUDIT_ARCH_XTENSA = 0x5e + AUDIT_ARG0 = 0xc8 + AUDIT_ARG1 = 0xc9 + AUDIT_ARG2 = 0xca + AUDIT_ARG3 = 0xcb + AUDIT_AVC = 0x578 + AUDIT_AVC_PATH = 0x57a + AUDIT_BITMASK_SIZE = 0x40 + AUDIT_BIT_MASK = 0x8000000 + AUDIT_BIT_TEST = 0x48000000 + AUDIT_BPF = 0x536 + AUDIT_BPRM_FCAPS = 0x529 + AUDIT_CAPSET = 0x52a + AUDIT_CLASS_CHATTR = 0x2 + AUDIT_CLASS_CHATTR_32 = 0x3 + AUDIT_CLASS_DIR_WRITE = 0x0 + AUDIT_CLASS_DIR_WRITE_32 = 0x1 + AUDIT_CLASS_READ = 0x4 + AUDIT_CLASS_READ_32 = 0x5 + AUDIT_CLASS_SIGNAL = 0x8 + AUDIT_CLASS_SIGNAL_32 = 0x9 + AUDIT_CLASS_WRITE = 0x6 + AUDIT_CLASS_WRITE_32 = 0x7 + AUDIT_COMPARE_AUID_TO_EUID = 0x10 + AUDIT_COMPARE_AUID_TO_FSUID = 0xe + AUDIT_COMPARE_AUID_TO_OBJ_UID = 0x5 + AUDIT_COMPARE_AUID_TO_SUID = 0xf + AUDIT_COMPARE_EGID_TO_FSGID = 0x17 + AUDIT_COMPARE_EGID_TO_OBJ_GID = 0x4 + AUDIT_COMPARE_EGID_TO_SGID = 0x18 + AUDIT_COMPARE_EUID_TO_FSUID = 0x12 + AUDIT_COMPARE_EUID_TO_OBJ_UID = 0x3 + AUDIT_COMPARE_EUID_TO_SUID = 0x11 + AUDIT_COMPARE_FSGID_TO_OBJ_GID = 0x9 + AUDIT_COMPARE_FSUID_TO_OBJ_UID = 0x8 + AUDIT_COMPARE_GID_TO_EGID = 0x14 + AUDIT_COMPARE_GID_TO_FSGID = 0x15 + AUDIT_COMPARE_GID_TO_OBJ_GID = 0x2 + AUDIT_COMPARE_GID_TO_SGID = 0x16 + AUDIT_COMPARE_SGID_TO_FSGID = 0x19 + AUDIT_COMPARE_SGID_TO_OBJ_GID = 0x7 + AUDIT_COMPARE_SUID_TO_FSUID = 0x13 + AUDIT_COMPARE_SUID_TO_OBJ_UID = 0x6 + AUDIT_COMPARE_UID_TO_AUID = 0xa + AUDIT_COMPARE_UID_TO_EUID = 0xb + AUDIT_COMPARE_UID_TO_FSUID = 0xc + AUDIT_COMPARE_UID_TO_OBJ_UID = 0x1 + AUDIT_COMPARE_UID_TO_SUID = 0xd + AUDIT_CONFIG_CHANGE = 0x519 + AUDIT_CWD = 0x51b + AUDIT_DAEMON_ABORT = 0x4b2 + AUDIT_DAEMON_CONFIG = 0x4b3 + AUDIT_DAEMON_END = 0x4b1 + AUDIT_DAEMON_START = 0x4b0 + AUDIT_DEL = 0x3ec + AUDIT_DEL_RULE = 0x3f4 + AUDIT_DEVMAJOR = 0x64 + AUDIT_DEVMINOR = 0x65 + AUDIT_DIR = 0x6b + AUDIT_DM_CTRL = 0x53a + AUDIT_DM_EVENT = 0x53b + AUDIT_EGID = 0x6 + AUDIT_EOE = 0x528 + AUDIT_EQUAL = 0x40000000 + AUDIT_EUID = 0x2 + AUDIT_EVENT_LISTENER = 0x537 + AUDIT_EXE = 0x70 + AUDIT_EXECVE = 0x51d + AUDIT_EXIT = 0x67 + AUDIT_FAIL_PANIC = 0x2 + AUDIT_FAIL_PRINTK = 0x1 + AUDIT_FAIL_SILENT = 0x0 + AUDIT_FANOTIFY = 0x533 + AUDIT_FD_PAIR = 0x525 + AUDIT_FEATURE_BITMAP_ALL = 0x7f + AUDIT_FEATURE_BITMAP_BACKLOG_LIMIT = 0x1 + AUDIT_FEATURE_BITMAP_BACKLOG_WAIT_TIME = 0x2 + AUDIT_FEATURE_BITMAP_EXCLUDE_EXTEND = 0x8 + AUDIT_FEATURE_BITMAP_EXECUTABLE_PATH = 0x4 + AUDIT_FEATURE_BITMAP_FILTER_FS = 0x40 + AUDIT_FEATURE_BITMAP_LOST_RESET = 0x20 + AUDIT_FEATURE_BITMAP_SESSIONID_FILTER = 0x10 + AUDIT_FEATURE_CHANGE = 0x530 + AUDIT_FEATURE_LOGINUID_IMMUTABLE = 0x1 + AUDIT_FEATURE_ONLY_UNSET_LOGINUID = 0x0 + AUDIT_FEATURE_VERSION = 0x1 + AUDIT_FIELD_COMPARE = 0x6f + AUDIT_FILETYPE = 0x6c + AUDIT_FILTERKEY = 0xd2 + AUDIT_FILTER_ENTRY = 0x2 + AUDIT_FILTER_EXCLUDE = 0x5 + AUDIT_FILTER_EXIT = 0x4 + AUDIT_FILTER_FS = 0x6 + AUDIT_FILTER_PREPEND = 0x10 + AUDIT_FILTER_TASK = 0x1 + AUDIT_FILTER_TYPE = 0x5 + AUDIT_FILTER_URING_EXIT = 0x7 + AUDIT_FILTER_USER = 0x0 + AUDIT_FILTER_WATCH = 0x3 + AUDIT_FIRST_KERN_ANOM_MSG = 0x6a4 + AUDIT_FIRST_USER_MSG = 0x44c + AUDIT_FIRST_USER_MSG2 = 0x834 + AUDIT_FSGID = 0x8 + AUDIT_FSTYPE = 0x1a + AUDIT_FSUID = 0x4 + AUDIT_GET = 0x3e8 + AUDIT_GET_FEATURE = 0x3fb + AUDIT_GID = 0x5 + AUDIT_GREATER_THAN = 0x20000000 + AUDIT_GREATER_THAN_OR_EQUAL = 0x60000000 + AUDIT_INODE = 0x66 + AUDIT_INTEGRITY_DATA = 0x708 + AUDIT_INTEGRITY_EVM_XATTR = 0x70e + AUDIT_INTEGRITY_HASH = 0x70b + AUDIT_INTEGRITY_METADATA = 0x709 + AUDIT_INTEGRITY_PCR = 0x70c + AUDIT_INTEGRITY_POLICY_RULE = 0x70f + AUDIT_INTEGRITY_RULE = 0x70d + AUDIT_INTEGRITY_STATUS = 0x70a + AUDIT_IPC = 0x517 + AUDIT_IPC_SET_PERM = 0x51f + AUDIT_KERNEL = 0x7d0 + AUDIT_KERNEL_OTHER = 0x524 + AUDIT_KERN_MODULE = 0x532 + AUDIT_LAST_FEATURE = 0x1 + AUDIT_LAST_KERN_ANOM_MSG = 0x707 + AUDIT_LAST_USER_MSG = 0x4af + AUDIT_LAST_USER_MSG2 = 0xbb7 + AUDIT_LESS_THAN = 0x10000000 + AUDIT_LESS_THAN_OR_EQUAL = 0x50000000 + AUDIT_LIST = 0x3ea + AUDIT_LIST_RULES = 0x3f5 + AUDIT_LOGIN = 0x3ee + AUDIT_LOGINUID = 0x9 + AUDIT_LOGINUID_SET = 0x18 + AUDIT_MAC_CALIPSO_ADD = 0x58a + AUDIT_MAC_CALIPSO_DEL = 0x58b + AUDIT_MAC_CIPSOV4_ADD = 0x57f + AUDIT_MAC_CIPSOV4_DEL = 0x580 + AUDIT_MAC_CONFIG_CHANGE = 0x57d + AUDIT_MAC_IPSEC_ADDSA = 0x583 + AUDIT_MAC_IPSEC_ADDSPD = 0x585 + AUDIT_MAC_IPSEC_DELSA = 0x584 + AUDIT_MAC_IPSEC_DELSPD = 0x586 + AUDIT_MAC_IPSEC_EVENT = 0x587 + AUDIT_MAC_MAP_ADD = 0x581 + AUDIT_MAC_MAP_DEL = 0x582 + AUDIT_MAC_POLICY_LOAD = 0x57b + AUDIT_MAC_STATUS = 0x57c + AUDIT_MAC_UNLBL_ALLOW = 0x57e + AUDIT_MAC_UNLBL_STCADD = 0x588 + AUDIT_MAC_UNLBL_STCDEL = 0x589 + AUDIT_MAKE_EQUIV = 0x3f7 + AUDIT_MAX_FIELDS = 0x40 + AUDIT_MAX_FIELD_COMPARE = 0x19 + AUDIT_MAX_KEY_LEN = 0x100 + AUDIT_MESSAGE_TEXT_MAX = 0x2170 + AUDIT_MMAP = 0x52b + AUDIT_MQ_GETSETATTR = 0x523 + AUDIT_MQ_NOTIFY = 0x522 + AUDIT_MQ_OPEN = 0x520 + AUDIT_MQ_SENDRECV = 0x521 + AUDIT_MSGTYPE = 0xc + AUDIT_NEGATE = 0x80000000 + AUDIT_NETFILTER_CFG = 0x52d + AUDIT_NETFILTER_PKT = 0x52c + AUDIT_NEVER = 0x0 + AUDIT_NLGRP_MAX = 0x1 + AUDIT_NOT_EQUAL = 0x30000000 + AUDIT_NR_FILTERS = 0x8 + AUDIT_OBJ_GID = 0x6e + AUDIT_OBJ_LEV_HIGH = 0x17 + AUDIT_OBJ_LEV_LOW = 0x16 + AUDIT_OBJ_PID = 0x526 + AUDIT_OBJ_ROLE = 0x14 + AUDIT_OBJ_TYPE = 0x15 + AUDIT_OBJ_UID = 0x6d + AUDIT_OBJ_USER = 0x13 + AUDIT_OPENAT2 = 0x539 + AUDIT_OPERATORS = 0x78000000 + AUDIT_PATH = 0x516 + AUDIT_PERM = 0x6a + AUDIT_PERM_ATTR = 0x8 + AUDIT_PERM_EXEC = 0x1 + AUDIT_PERM_READ = 0x4 + AUDIT_PERM_WRITE = 0x2 + AUDIT_PERS = 0xa + AUDIT_PID = 0x0 + AUDIT_POSSIBLE = 0x1 + AUDIT_PPID = 0x12 + AUDIT_PROCTITLE = 0x52f + AUDIT_REPLACE = 0x531 + AUDIT_SADDR_FAM = 0x71 + AUDIT_SECCOMP = 0x52e + AUDIT_SELINUX_ERR = 0x579 + AUDIT_SESSIONID = 0x19 + AUDIT_SET = 0x3e9 + AUDIT_SET_FEATURE = 0x3fa + AUDIT_SGID = 0x7 + AUDIT_SID_UNSET = 0xffffffff + AUDIT_SIGNAL_INFO = 0x3f2 + AUDIT_SOCKADDR = 0x51a + AUDIT_SOCKETCALL = 0x518 + AUDIT_STATUS_BACKLOG_LIMIT = 0x10 + AUDIT_STATUS_BACKLOG_WAIT_TIME = 0x20 + AUDIT_STATUS_BACKLOG_WAIT_TIME_ACTUAL = 0x80 + AUDIT_STATUS_ENABLED = 0x1 + AUDIT_STATUS_FAILURE = 0x2 + AUDIT_STATUS_LOST = 0x40 + AUDIT_STATUS_PID = 0x4 + AUDIT_STATUS_RATE_LIMIT = 0x8 + AUDIT_SUBJ_CLR = 0x11 + AUDIT_SUBJ_ROLE = 0xe + AUDIT_SUBJ_SEN = 0x10 + AUDIT_SUBJ_TYPE = 0xf + AUDIT_SUBJ_USER = 0xd + AUDIT_SUCCESS = 0x68 + AUDIT_SUID = 0x3 + AUDIT_SYSCALL = 0x514 + AUDIT_SYSCALL_CLASSES = 0x10 + AUDIT_TIME_ADJNTPVAL = 0x535 + AUDIT_TIME_INJOFFSET = 0x534 + AUDIT_TRIM = 0x3f6 + AUDIT_TTY = 0x527 + AUDIT_TTY_GET = 0x3f8 + AUDIT_TTY_SET = 0x3f9 + AUDIT_UID = 0x1 + AUDIT_UID_UNSET = 0xffffffff + AUDIT_UNUSED_BITS = 0x7fffc00 + AUDIT_URINGOP = 0x538 + AUDIT_USER = 0x3ed + AUDIT_USER_AVC = 0x453 + AUDIT_USER_TTY = 0x464 + AUDIT_VERSION_BACKLOG_LIMIT = 0x1 + AUDIT_VERSION_BACKLOG_WAIT_TIME = 0x2 + AUDIT_VERSION_LATEST = 0x7f + AUDIT_WATCH = 0x69 + AUDIT_WATCH_INS = 0x3ef + AUDIT_WATCH_LIST = 0x3f1 + AUDIT_WATCH_REM = 0x3f0 AUTOFS_SUPER_MAGIC = 0x187 B0 = 0x0 B110 = 0x3 @@ -183,6 +484,7 @@ const ( BPF_F_ALLOW_MULTI = 0x2 BPF_F_ALLOW_OVERRIDE = 0x1 BPF_F_ANY_ALIGNMENT = 0x2 + BPF_F_KPROBE_MULTI_RETURN = 0x1 BPF_F_QUERY_EFFECTIVE = 0x1 BPF_F_REPLACE = 0x4 BPF_F_SLEEPABLE = 0x10 @@ -190,6 +492,8 @@ const ( BPF_F_TEST_RND_HI32 = 0x4 BPF_F_TEST_RUN_ON_CPU = 0x1 BPF_F_TEST_STATE_FREQ = 0x8 + BPF_F_TEST_XDP_LIVE_FRAMES = 0x2 + BPF_F_XDP_HAS_FRAGS = 0x20 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 @@ -259,6 +563,17 @@ const ( BUS_USB = 0x3 BUS_VIRTUAL = 0x6 CAN_BCM = 0x2 + CAN_CTRLMODE_3_SAMPLES = 0x4 + CAN_CTRLMODE_BERR_REPORTING = 0x10 + CAN_CTRLMODE_CC_LEN8_DLC = 0x100 + CAN_CTRLMODE_FD = 0x20 + CAN_CTRLMODE_FD_NON_ISO = 0x80 + CAN_CTRLMODE_LISTENONLY = 0x2 + CAN_CTRLMODE_LOOPBACK = 0x1 + CAN_CTRLMODE_ONE_SHOT = 0x8 + CAN_CTRLMODE_PRESUME_ACK = 0x40 + CAN_CTRLMODE_TDC_AUTO = 0x200 + CAN_CTRLMODE_TDC_MANUAL = 0x400 CAN_EFF_FLAG = 0x80000000 CAN_EFF_ID_BITS = 0x1d CAN_EFF_MASK = 0x1fffffff @@ -336,6 +651,7 @@ const ( CAN_RTR_FLAG = 0x40000000 CAN_SFF_ID_BITS = 0xb CAN_SFF_MASK = 0x7ff + CAN_TERMINATION_DISABLED = 0x0 CAN_TP16 = 0x3 CAN_TP20 = 0x4 CAP_AUDIT_CONTROL = 0x1e @@ -380,9 +696,11 @@ const ( CAP_SYS_TIME = 0x19 CAP_SYS_TTY_CONFIG = 0x1a CAP_WAKE_ALARM = 0x23 + CEPH_SUPER_MAGIC = 0xc36400 CFLUSH = 0xf CGROUP2_SUPER_MAGIC = 0x63677270 CGROUP_SUPER_MAGIC = 0x27e0eb + CIFS_SUPER_MAGIC = 0xff534d42 CLOCK_BOOTTIME = 0x7 CLOCK_BOOTTIME_ALARM = 0x9 CLOCK_DEFAULT = 0x0 @@ -502,9 +820,9 @@ const ( DM_UUID_FLAG = 0x4000 DM_UUID_LEN = 0x81 DM_VERSION = 0xc138fd00 - DM_VERSION_EXTRA = "-ioctl (2021-03-22)" + DM_VERSION_EXTRA = "-ioctl (2022-02-22)" DM_VERSION_MAJOR = 0x4 - DM_VERSION_MINOR = 0x2d + DM_VERSION_MINOR = 0x2e DM_VERSION_PATCHLEVEL = 0x0 DT_BLK = 0x6 DT_CHR = 0x2 @@ -520,6 +838,55 @@ const ( EFD_SEMAPHORE = 0x1 EFIVARFS_MAGIC = 0xde5e81e4 EFS_SUPER_MAGIC = 0x414a53 + EM_386 = 0x3 + EM_486 = 0x6 + EM_68K = 0x4 + EM_860 = 0x7 + EM_88K = 0x5 + EM_AARCH64 = 0xb7 + EM_ALPHA = 0x9026 + EM_ALTERA_NIOS2 = 0x71 + EM_ARCOMPACT = 0x5d + EM_ARCV2 = 0xc3 + EM_ARM = 0x28 + EM_BLACKFIN = 0x6a + EM_BPF = 0xf7 + EM_CRIS = 0x4c + EM_CSKY = 0xfc + EM_CYGNUS_M32R = 0x9041 + EM_CYGNUS_MN10300 = 0xbeef + EM_FRV = 0x5441 + EM_H8_300 = 0x2e + EM_HEXAGON = 0xa4 + EM_IA_64 = 0x32 + EM_LOONGARCH = 0x102 + EM_M32 = 0x1 + EM_M32R = 0x58 + EM_MICROBLAZE = 0xbd + EM_MIPS = 0x8 + EM_MIPS_RS3_LE = 0xa + EM_MIPS_RS4_BE = 0xa + EM_MN10300 = 0x59 + EM_NDS32 = 0xa7 + EM_NONE = 0x0 + EM_OPENRISC = 0x5c + EM_PARISC = 0xf + EM_PPC = 0x14 + EM_PPC64 = 0x15 + EM_RISCV = 0xf3 + EM_S390 = 0x16 + EM_S390_OLD = 0xa390 + EM_SH = 0x2a + EM_SPARC = 0x2 + EM_SPARC32PLUS = 0x12 + EM_SPARCV9 = 0x2b + EM_SPU = 0x17 + EM_TILEGX = 0xbf + EM_TILEPRO = 0xbc + EM_TI_C6000 = 0x8c + EM_UNICORE = 0x6e + EM_X86_64 = 0x3e + EM_XTENSA = 0x5e ENCODING_DEFAULT = 0x0 ENCODING_FM_MARK = 0x3 ENCODING_FM_SPACE = 0x4 @@ -697,6 +1064,7 @@ const ( ETH_P_EDSA = 0xdada ETH_P_ERSPAN = 0x88be ETH_P_ERSPAN2 = 0x22eb + ETH_P_ETHERCAT = 0x88a4 ETH_P_FCOE = 0x8906 ETH_P_FIP = 0x8914 ETH_P_HDLC = 0x19 @@ -734,6 +1102,7 @@ const ( ETH_P_PPP_MP = 0x8 ETH_P_PPP_SES = 0x8864 ETH_P_PREAUTH = 0x88c7 + ETH_P_PROFINET = 0x8892 ETH_P_PRP = 0x88fb ETH_P_PUP = 0x200 ETH_P_PUPAT = 0x201 @@ -741,6 +1110,7 @@ const ( ETH_P_QINQ2 = 0x9200 ETH_P_QINQ3 = 0x9300 ETH_P_RARP = 0x8035 + ETH_P_REALTEK = 0x8899 ETH_P_SCA = 0x6007 ETH_P_SLOW = 0x8809 ETH_P_SNAP = 0x5 @@ -770,6 +1140,7 @@ const ( EV_SYN = 0x0 EV_VERSION = 0x10001 EXABYTE_ENABLE_NEST = 0xf0 + EXFAT_SUPER_MAGIC = 0x2011bab0 EXT2_SUPER_MAGIC = 0xef53 EXT3_SUPER_MAGIC = 0xef53 EXT4_SUPER_MAGIC = 0xef53 @@ -810,12 +1181,17 @@ const ( FAN_EPIDFD = -0x2 FAN_EVENT_INFO_TYPE_DFID = 0x3 FAN_EVENT_INFO_TYPE_DFID_NAME = 0x2 + FAN_EVENT_INFO_TYPE_ERROR = 0x5 FAN_EVENT_INFO_TYPE_FID = 0x1 + FAN_EVENT_INFO_TYPE_NEW_DFID_NAME = 0xc + FAN_EVENT_INFO_TYPE_OLD_DFID_NAME = 0xa FAN_EVENT_INFO_TYPE_PIDFD = 0x4 FAN_EVENT_METADATA_LEN = 0x18 FAN_EVENT_ON_CHILD = 0x8000000 + FAN_FS_ERROR = 0x8000 FAN_MARK_ADD = 0x1 FAN_MARK_DONT_FOLLOW = 0x4 + FAN_MARK_EVICTABLE = 0x200 FAN_MARK_FILESYSTEM = 0x100 FAN_MARK_FLUSH = 0x80 FAN_MARK_IGNORED_MASK = 0x20 @@ -838,17 +1214,27 @@ const ( FAN_OPEN_EXEC_PERM = 0x40000 FAN_OPEN_PERM = 0x10000 FAN_Q_OVERFLOW = 0x4000 + FAN_RENAME = 0x10000000 FAN_REPORT_DFID_NAME = 0xc00 + FAN_REPORT_DFID_NAME_TARGET = 0x1e00 FAN_REPORT_DIR_FID = 0x400 FAN_REPORT_FID = 0x200 FAN_REPORT_NAME = 0x800 FAN_REPORT_PIDFD = 0x80 + FAN_REPORT_TARGET_FID = 0x1000 FAN_REPORT_TID = 0x100 FAN_UNLIMITED_MARKS = 0x20 FAN_UNLIMITED_QUEUE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 + FIB_RULE_DEV_DETACHED = 0x8 + FIB_RULE_FIND_SADDR = 0x10000 + FIB_RULE_IIF_DETACHED = 0x8 + FIB_RULE_INVERT = 0x2 + FIB_RULE_OIF_DETACHED = 0x10 + FIB_RULE_PERMANENT = 0x1 + FIB_RULE_UNRESOLVED = 0x4 FIDEDUPERANGE = 0xc0189436 FSCRYPT_KEY_DESCRIPTOR_SIZE = 0x8 FSCRYPT_KEY_DESC_PREFIX = "fscrypt:" @@ -911,6 +1297,7 @@ const ( FS_VERITY_METADATA_TYPE_DESCRIPTOR = 0x2 FS_VERITY_METADATA_TYPE_MERKLE_TREE = 0x1 FS_VERITY_METADATA_TYPE_SIGNATURE = 0x3 + FUSE_SUPER_MAGIC = 0x65735546 FUTEXFS_SUPER_MAGIC = 0xbad1dea F_ADD_SEALS = 0x409 F_DUPFD = 0x0 @@ -1023,7 +1410,7 @@ const ( IFA_F_STABLE_PRIVACY = 0x800 IFA_F_TEMPORARY = 0x1 IFA_F_TENTATIVE = 0x40 - IFA_MAX = 0xa + IFA_MAX = 0xb IFF_ALLMULTI = 0x200 IFF_ATTACH_QUEUE = 0x200 IFF_AUTOMEDIA = 0x4000 @@ -1264,15 +1651,21 @@ const ( IP_XFRM_POLICY = 0x11 ISOFS_SUPER_MAGIC = 0x9660 ISTRIP = 0x20 + ITIMER_PROF = 0x2 + ITIMER_REAL = 0x0 + ITIMER_VIRTUAL = 0x1 IUTF8 = 0x4000 IXANY = 0x800 JFFS2_SUPER_MAGIC = 0x72b6 + KCMPROTO_CONNECTED = 0x0 + KCM_RECV_DISABLE = 0x1 KEXEC_ARCH_386 = 0x30000 KEXEC_ARCH_68K = 0x40000 KEXEC_ARCH_AARCH64 = 0xb70000 KEXEC_ARCH_ARM = 0x280000 KEXEC_ARCH_DEFAULT = 0x0 KEXEC_ARCH_IA_64 = 0x320000 + KEXEC_ARCH_LOONGARCH = 0x1020000 KEXEC_ARCH_MASK = 0xffff0000 KEXEC_ARCH_MIPS = 0x80000 KEXEC_ARCH_MIPS_LE = 0xa0000 @@ -1365,6 +1758,7 @@ const ( LANDLOCK_ACCESS_FS_MAKE_SYM = 0x1000 LANDLOCK_ACCESS_FS_READ_DIR = 0x8 LANDLOCK_ACCESS_FS_READ_FILE = 0x4 + LANDLOCK_ACCESS_FS_REFER = 0x2000 LANDLOCK_ACCESS_FS_REMOVE_DIR = 0x10 LANDLOCK_ACCESS_FS_REMOVE_FILE = 0x20 LANDLOCK_ACCESS_FS_WRITE_FILE = 0x2 @@ -1474,6 +1868,7 @@ const ( MNT_DETACH = 0x2 MNT_EXPIRE = 0x4 MNT_FORCE = 0x1 + MODULE_INIT_COMPRESSED_FILE = 0x4 MODULE_INIT_IGNORE_MODVERSIONS = 0x1 MODULE_INIT_IGNORE_VERMAGIC = 0x2 MOUNT_ATTR_IDMAP = 0x100000 @@ -1719,6 +2114,7 @@ const ( NLM_F_ACK_TLVS = 0x200 NLM_F_APPEND = 0x800 NLM_F_ATOMIC = 0x400 + NLM_F_BULK = 0x200 NLM_F_CAPPED = 0x100 NLM_F_CREATE = 0x400 NLM_F_DUMP = 0x300 @@ -1827,6 +2223,11 @@ const ( PERF_MEM_BLK_DATA = 0x2 PERF_MEM_BLK_NA = 0x1 PERF_MEM_BLK_SHIFT = 0x28 + PERF_MEM_HOPS_0 = 0x1 + PERF_MEM_HOPS_1 = 0x2 + PERF_MEM_HOPS_2 = 0x3 + PERF_MEM_HOPS_3 = 0x4 + PERF_MEM_HOPS_SHIFT = 0x2b PERF_MEM_LOCK_LOCKED = 0x2 PERF_MEM_LOCK_NA = 0x1 PERF_MEM_LOCK_SHIFT = 0x18 @@ -1986,6 +2387,9 @@ const ( PR_SCHED_CORE_CREATE = 0x1 PR_SCHED_CORE_GET = 0x0 PR_SCHED_CORE_MAX = 0x4 + PR_SCHED_CORE_SCOPE_PROCESS_GROUP = 0x2 + PR_SCHED_CORE_SCOPE_THREAD = 0x0 + PR_SCHED_CORE_SCOPE_THREAD_GROUP = 0x1 PR_SCHED_CORE_SHARE_FROM = 0x3 PR_SCHED_CORE_SHARE_TO = 0x2 PR_SET_CHILD_SUBREAPER = 0x24 @@ -2026,6 +2430,13 @@ const ( PR_SET_TIMING = 0xe PR_SET_TSC = 0x1a PR_SET_UNALIGN = 0x6 + PR_SET_VMA = 0x53564d41 + PR_SET_VMA_ANON_NAME = 0x0 + PR_SME_GET_VL = 0x40 + PR_SME_SET_VL = 0x3f + PR_SME_SET_VL_ONEXEC = 0x40000 + PR_SME_VL_INHERIT = 0x20000 + PR_SME_VL_LEN_MASK = 0xffff PR_SPEC_DISABLE = 0x4 PR_SPEC_DISABLE_NOEXEC = 0x10 PR_SPEC_ENABLE = 0x2 @@ -2109,6 +2520,10 @@ const ( PTRACE_SYSCALL_INFO_NONE = 0x0 PTRACE_SYSCALL_INFO_SECCOMP = 0x3 PTRACE_TRACEME = 0x0 + P_ALL = 0x0 + P_PGID = 0x2 + P_PID = 0x1 + P_PIDFD = 0x3 QNX4_SUPER_MAGIC = 0x2f QNX6_SUPER_MAGIC = 0x68191122 RAMFS_MAGIC = 0x858458f6 @@ -2167,12 +2582,24 @@ const ( RTCF_NAT = 0x800000 RTCF_VALVE = 0x200000 RTC_AF = 0x20 + RTC_BSM_DIRECT = 0x1 + RTC_BSM_DISABLED = 0x0 + RTC_BSM_LEVEL = 0x2 + RTC_BSM_STANDBY = 0x3 RTC_FEATURE_ALARM = 0x0 + RTC_FEATURE_ALARM_RES_2S = 0x3 RTC_FEATURE_ALARM_RES_MINUTE = 0x1 - RTC_FEATURE_CNT = 0x3 + RTC_FEATURE_ALARM_WAKEUP_ONLY = 0x7 + RTC_FEATURE_BACKUP_SWITCH_MODE = 0x6 + RTC_FEATURE_CNT = 0x8 + RTC_FEATURE_CORRECTION = 0x5 RTC_FEATURE_NEED_WEEK_DAY = 0x2 + RTC_FEATURE_UPDATE_INTERRUPT = 0x4 RTC_IRQF = 0x80 RTC_MAX_FREQ = 0x2000 + RTC_PARAM_BACKUP_SWITCH_MODE = 0x2 + RTC_PARAM_CORRECTION = 0x1 + RTC_PARAM_FEATURES = 0x0 RTC_PF = 0x40 RTC_UF = 0x10 RTF_ADDRCLASSMASK = 0xf8000000 @@ -2238,6 +2665,7 @@ const ( RTM_DELRULE = 0x21 RTM_DELTCLASS = 0x29 RTM_DELTFILTER = 0x2d + RTM_DELTUNNEL = 0x79 RTM_DELVLAN = 0x71 RTM_F_CLONED = 0x200 RTM_F_EQUALIZE = 0x400 @@ -2270,8 +2698,9 @@ const ( RTM_GETSTATS = 0x5e RTM_GETTCLASS = 0x2a RTM_GETTFILTER = 0x2e + RTM_GETTUNNEL = 0x7a RTM_GETVLAN = 0x72 - RTM_MAX = 0x77 + RTM_MAX = 0x7b RTM_NEWACTION = 0x30 RTM_NEWADDR = 0x14 RTM_NEWADDRLABEL = 0x48 @@ -2295,11 +2724,13 @@ const ( RTM_NEWSTATS = 0x5c RTM_NEWTCLASS = 0x28 RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x1a - RTM_NR_MSGTYPES = 0x68 + RTM_NEWTUNNEL = 0x78 + RTM_NR_FAMILIES = 0x1b + RTM_NR_MSGTYPES = 0x6c RTM_SETDCB = 0x4f RTM_SETLINK = 0x13 RTM_SETNEIGHTBL = 0x43 + RTM_SETSTATS = 0x5f RTNH_ALIGNTO = 0x4 RTNH_COMPARE_MASK = 0x59 RTNH_F_DEAD = 0x1 @@ -2423,6 +2854,9 @@ const ( SIOCGSTAMPNS = 0x8907 SIOCGSTAMPNS_OLD = 0x8907 SIOCGSTAMP_OLD = 0x8906 + SIOCKCMATTACH = 0x89e0 + SIOCKCMCLONE = 0x89e2 + SIOCKCMUNATTACH = 0x89e1 SIOCOUTQNSD = 0x894b SIOCPROTOPRIVATE = 0x89e0 SIOCRTMSG = 0x890d @@ -2465,6 +2899,7 @@ const ( SMART_STATUS = 0xda SMART_WRITE_LOG_SECTOR = 0xd6 SMART_WRITE_THRESHOLDS = 0xd7 + SMB2_SUPER_MAGIC = 0xfe534d42 SMB_SUPER_MAGIC = 0x517b SOCKFS_MAGIC = 0x534f434b SOCK_BUF_LOCK_MASK = 0x3 @@ -2476,6 +2911,9 @@ const ( SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_SNDBUF_LOCK = 0x1 + SOCK_TXREHASH_DEFAULT = 0xff + SOCK_TXREHASH_DISABLED = 0x0 + SOCK_TXREHASH_ENABLED = 0x1 SOL_AAL = 0x109 SOL_ALG = 0x117 SOL_ATM = 0x108 @@ -2491,6 +2929,8 @@ const ( SOL_IUCV = 0x115 SOL_KCM = 0x119 SOL_LLC = 0x10c + SOL_MCTP = 0x11d + SOL_MPTCP = 0x11c SOL_NETBEUI = 0x10b SOL_NETLINK = 0x10e SOL_NFC = 0x118 @@ -2500,6 +2940,7 @@ const ( SOL_RAW = 0xff SOL_RDS = 0x114 SOL_RXRPC = 0x110 + SOL_SMC = 0x11e SOL_TCP = 0x6 SOL_TIPC = 0x10f SOL_TLS = 0x11a @@ -2532,6 +2973,8 @@ const ( SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 SO_VM_SOCKETS_BUFFER_SIZE = 0x0 SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_CONNECT_TIMEOUT_NEW = 0x8 + SO_VM_SOCKETS_CONNECT_TIMEOUT_OLD = 0x6 SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 SO_VM_SOCKETS_TRUSTED = 0x5 @@ -2604,7 +3047,7 @@ const ( TASKSTATS_GENL_NAME = "TASKSTATS" TASKSTATS_GENL_VERSION = 0x1 TASKSTATS_TYPE_MAX = 0x6 - TASKSTATS_VERSION = 0xa + TASKSTATS_VERSION = 0xd TCIFLUSH = 0x0 TCIOFF = 0x2 TCIOFLUSH = 0x2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go index 3ca40ca7f..36c0dfc7c 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go @@ -1,11 +1,11 @@ -// mkerrors.sh -Wall -Werror -static -I/tmp/include -m32 +// mkerrors.sh -Wall -Werror -static -I/tmp/386/include -m32 // Code generated by the command above; see README.md. DO NOT EDIT. //go:build 386 && linux // +build 386,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m32 /build/unix/_const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/386/include -m32 _const.go package unix @@ -250,6 +250,8 @@ const ( RTC_EPOCH_SET = 0x4004700e RTC_IRQP_READ = 0x8004700b RTC_IRQP_SET = 0x4004700c + RTC_PARAM_GET = 0x40187013 + RTC_PARAM_SET = 0x40187014 RTC_PIE_OFF = 0x7006 RTC_PIE_ON = 0x7005 RTC_PLL_GET = 0x801c7011 @@ -324,9 +326,11 @@ const ( SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x12 + SO_RCVMARK = 0x4b SO_RCVTIMEO = 0x14 SO_RCVTIMEO_NEW = 0x42 SO_RCVTIMEO_OLD = 0x14 + SO_RESERVE_MEM = 0x49 SO_REUSEADDR = 0x2 SO_REUSEPORT = 0xf SO_RXQ_OVFL = 0x28 @@ -347,6 +351,7 @@ const ( SO_TIMESTAMPNS_NEW = 0x40 SO_TIMESTAMPNS_OLD = 0x23 SO_TIMESTAMP_NEW = 0x3f + SO_TXREHASH = 0x4a SO_TXTIME = 0x3d SO_TYPE = 0x3 SO_WIFI_STATUS = 0x29 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go index ead332091..4ff942703 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go @@ -1,11 +1,11 @@ -// mkerrors.sh -Wall -Werror -static -I/tmp/include -m64 +// mkerrors.sh -Wall -Werror -static -I/tmp/amd64/include -m64 // Code generated by the command above; see README.md. DO NOT EDIT. //go:build amd64 && linux // +build amd64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m64 /build/unix/_const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/amd64/include -m64 _const.go package unix @@ -251,6 +251,8 @@ const ( RTC_EPOCH_SET = 0x4008700e RTC_IRQP_READ = 0x8008700b RTC_IRQP_SET = 0x4008700c + RTC_PARAM_GET = 0x40187013 + RTC_PARAM_SET = 0x40187014 RTC_PIE_OFF = 0x7006 RTC_PIE_ON = 0x7005 RTC_PLL_GET = 0x80207011 @@ -325,9 +327,11 @@ const ( SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x12 + SO_RCVMARK = 0x4b SO_RCVTIMEO = 0x14 SO_RCVTIMEO_NEW = 0x42 SO_RCVTIMEO_OLD = 0x14 + SO_RESERVE_MEM = 0x49 SO_REUSEADDR = 0x2 SO_REUSEPORT = 0xf SO_RXQ_OVFL = 0x28 @@ -348,6 +352,7 @@ const ( SO_TIMESTAMPNS_NEW = 0x40 SO_TIMESTAMPNS_OLD = 0x23 SO_TIMESTAMP_NEW = 0x3f + SO_TXREHASH = 0x4a SO_TXTIME = 0x3d SO_TYPE = 0x3 SO_WIFI_STATUS = 0x29 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go index 39bdc9455..3eaa0fb78 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go @@ -1,11 +1,11 @@ -// mkerrors.sh -Wall -Werror -static -I/tmp/include +// mkerrors.sh -Wall -Werror -static -I/tmp/arm/include // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm && linux // +build arm,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/_const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/arm/include _const.go package unix @@ -257,6 +257,8 @@ const ( RTC_EPOCH_SET = 0x4004700e RTC_IRQP_READ = 0x8004700b RTC_IRQP_SET = 0x4004700c + RTC_PARAM_GET = 0x40187013 + RTC_PARAM_SET = 0x40187014 RTC_PIE_OFF = 0x7006 RTC_PIE_ON = 0x7005 RTC_PLL_GET = 0x801c7011 @@ -331,9 +333,11 @@ const ( SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x12 + SO_RCVMARK = 0x4b SO_RCVTIMEO = 0x14 SO_RCVTIMEO_NEW = 0x42 SO_RCVTIMEO_OLD = 0x14 + SO_RESERVE_MEM = 0x49 SO_REUSEADDR = 0x2 SO_REUSEPORT = 0xf SO_RXQ_OVFL = 0x28 @@ -354,6 +358,7 @@ const ( SO_TIMESTAMPNS_NEW = 0x40 SO_TIMESTAMPNS_OLD = 0x23 SO_TIMESTAMP_NEW = 0x3f + SO_TXREHASH = 0x4a SO_TXTIME = 0x3d SO_TYPE = 0x3 SO_WIFI_STATUS = 0x29 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go index 9aec987db..d7995bdc3 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go @@ -1,11 +1,11 @@ -// mkerrors.sh -Wall -Werror -static -I/tmp/include -fsigned-char +// mkerrors.sh -Wall -Werror -static -I/tmp/arm64/include -fsigned-char // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm64 && linux // +build arm64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char /build/unix/_const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/arm64/include -fsigned-char _const.go package unix @@ -247,6 +247,8 @@ const ( RTC_EPOCH_SET = 0x4008700e RTC_IRQP_READ = 0x8008700b RTC_IRQP_SET = 0x4008700c + RTC_PARAM_GET = 0x40187013 + RTC_PARAM_SET = 0x40187014 RTC_PIE_OFF = 0x7006 RTC_PIE_ON = 0x7005 RTC_PLL_GET = 0x80207011 @@ -321,9 +323,11 @@ const ( SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x12 + SO_RCVMARK = 0x4b SO_RCVTIMEO = 0x14 SO_RCVTIMEO_NEW = 0x42 SO_RCVTIMEO_OLD = 0x14 + SO_RESERVE_MEM = 0x49 SO_REUSEADDR = 0x2 SO_REUSEPORT = 0xf SO_RXQ_OVFL = 0x28 @@ -344,6 +348,7 @@ const ( SO_TIMESTAMPNS_NEW = 0x40 SO_TIMESTAMPNS_OLD = 0x23 SO_TIMESTAMP_NEW = 0x3f + SO_TXREHASH = 0x4a SO_TXTIME = 0x3d SO_TYPE = 0x3 SO_WIFI_STATUS = 0x29 @@ -508,6 +513,7 @@ const ( WORDSIZE = 0x40 XCASE = 0x4 XTABS = 0x1800 + ZA_MAGIC = 0x54366345 _HIDIOCGRAWNAME = 0x80804804 _HIDIOCGRAWPHYS = 0x80404805 _HIDIOCGRAWUNIQ = 0x80404808 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go new file mode 100644 index 000000000..928e24c20 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go @@ -0,0 +1,818 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/loong64/include +// Code generated by the command above; see README.md. DO NOT EDIT. + +//go:build loong64 && linux +// +build loong64,linux + +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs -- -Wall -Werror -static -I/tmp/loong64/include _const.go + +package unix + +import "syscall" + +const ( + B1000000 = 0x1008 + B115200 = 0x1002 + B1152000 = 0x1009 + B1500000 = 0x100a + B2000000 = 0x100b + B230400 = 0x1003 + B2500000 = 0x100c + B3000000 = 0x100d + B3500000 = 0x100e + B4000000 = 0x100f + B460800 = 0x1004 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B921600 = 0x1007 + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BS1 = 0x2000 + BSDLY = 0x2000 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIZE = 0x30 + CSTOPB = 0x40 + ECCGETLAYOUT = 0x81484d11 + ECCGETSTATS = 0x80104d12 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EPOLL_CLOEXEC = 0x80000 + EXTPROC = 0x10000 + FF1 = 0x8000 + FFDLY = 0x8000 + FICLONE = 0x40049409 + FICLONERANGE = 0x4020940d + FLUSHO = 0x1000 + FPU_CTX_MAGIC = 0x46505501 + FS_IOC_ENABLE_VERITY = 0x40806685 + FS_IOC_GETFLAGS = 0x80086601 + FS_IOC_GET_ENCRYPTION_NONCE = 0x8010661b + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_SETFLAGS = 0x40086602 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + F_GETLK = 0x5 + F_GETLK64 = 0x5 + F_GETOWN = 0x9 + F_RDLCK = 0x0 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x8 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + HIDIOCGRAWINFO = 0x80084803 + HIDIOCGRDESC = 0x90044802 + HIDIOCGRDESCSIZE = 0x80044801 + HUPCL = 0x400 + ICANON = 0x2 + IEXTEN = 0x8000 + IN_CLOEXEC = 0x80000 + IN_NONBLOCK = 0x800 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 + ISIG = 0x1 + IUCLC = 0x200 + IXOFF = 0x1000 + IXON = 0x400 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_STACK = 0x20000 + MAP_SYNC = 0x80000 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MEMERASE = 0x40084d02 + MEMERASE64 = 0x40104d14 + MEMGETBADBLOCK = 0x40084d0b + MEMGETINFO = 0x80204d01 + MEMGETOOBSEL = 0x80c84d0a + MEMGETREGIONCOUNT = 0x80044d07 + MEMISLOCKED = 0x80084d17 + MEMLOCK = 0x40084d05 + MEMREADOOB = 0xc0104d04 + MEMSETBADBLOCK = 0x40084d0c + MEMUNLOCK = 0x40084d06 + MEMWRITEOOB = 0xc0104d03 + MTDFILEMODE = 0x4d13 + NFDBITS = 0x40 + NLDLY = 0x100 + NOFLSH = 0x80 + NS_GET_NSTYPE = 0xb703 + NS_GET_OWNER_UID = 0xb704 + NS_GET_PARENT = 0xb702 + NS_GET_USERNS = 0xb701 + OLCUC = 0x2 + ONLCR = 0x4 + OTPERASE = 0x400c4d19 + OTPGETREGIONCOUNT = 0x40044d0e + OTPGETREGIONINFO = 0x400c4d0f + OTPLOCK = 0x800c4d10 + OTPSELECT = 0x80044d0d + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x4000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + PARENB = 0x100 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80082407 + PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x4008240b + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc008240a + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PPPIOCATTACH = 0x4004743d + PPPIOCATTCHAN = 0x40047438 + PPPIOCBRIDGECHAN = 0x40047435 + PPPIOCCONNECT = 0x4004743a + PPPIOCDETACH = 0x4004743c + PPPIOCDISCONN = 0x7439 + PPPIOCGASYNCMAP = 0x80047458 + PPPIOCGCHAN = 0x80047437 + PPPIOCGDEBUG = 0x80047441 + PPPIOCGFLAGS = 0x8004745a + PPPIOCGIDLE = 0x8010743f + PPPIOCGIDLE32 = 0x8008743f + PPPIOCGIDLE64 = 0x8010743f + PPPIOCGL2TPSTATS = 0x80487436 + PPPIOCGMRU = 0x80047453 + PPPIOCGRASYNCMAP = 0x80047455 + PPPIOCGUNIT = 0x80047456 + PPPIOCGXASYNCMAP = 0x80207450 + PPPIOCSACTIVE = 0x40107446 + PPPIOCSASYNCMAP = 0x40047457 + PPPIOCSCOMPRESS = 0x4010744d + PPPIOCSDEBUG = 0x40047440 + PPPIOCSFLAGS = 0x40047459 + PPPIOCSMAXCID = 0x40047451 + PPPIOCSMRRU = 0x4004743b + PPPIOCSMRU = 0x40047452 + PPPIOCSNPMODE = 0x4008744b + PPPIOCSPASS = 0x40107447 + PPPIOCSRASYNCMAP = 0x40047454 + PPPIOCSXASYNCMAP = 0x4020744f + PPPIOCUNBRIDGECHAN = 0x7434 + PPPIOCXFERUNIT = 0x744e + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PTRACE_SYSEMU = 0x1f + PTRACE_SYSEMU_SINGLESTEP = 0x20 + RLIMIT_AS = 0x9 + RLIMIT_MEMLOCK = 0x8 + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RNDADDENTROPY = 0x40085203 + RNDADDTOENTCNT = 0x40045201 + RNDCLEARPOOL = 0x5206 + RNDGETENTCNT = 0x80045200 + RNDGETPOOL = 0x80085202 + RNDRESEEDCRNG = 0x5207 + RNDZAPENTCNT = 0x5204 + RTC_AIE_OFF = 0x7002 + RTC_AIE_ON = 0x7001 + RTC_ALM_READ = 0x80247008 + RTC_ALM_SET = 0x40247007 + RTC_EPOCH_READ = 0x8008700d + RTC_EPOCH_SET = 0x4008700e + RTC_IRQP_READ = 0x8008700b + RTC_IRQP_SET = 0x4008700c + RTC_PARAM_GET = 0x40187013 + RTC_PARAM_SET = 0x40187014 + RTC_PIE_OFF = 0x7006 + RTC_PIE_ON = 0x7005 + RTC_PLL_GET = 0x80207011 + RTC_PLL_SET = 0x40207012 + RTC_RD_TIME = 0x80247009 + RTC_SET_TIME = 0x4024700a + RTC_UIE_OFF = 0x7004 + RTC_UIE_ON = 0x7003 + RTC_VL_CLR = 0x7014 + RTC_VL_READ = 0x80047013 + RTC_WIE_OFF = 0x7010 + RTC_WIE_ON = 0x700f + RTC_WKALM_RD = 0x80287010 + RTC_WKALM_SET = 0x4028700f + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_TXTIME = 0x3d + SCM_WIFI_STATUS = 0x29 + SFD_CLOEXEC = 0x80000 + SFD_NONBLOCK = 0x800 + SIOCATMARK = 0x8905 + SIOCGPGRP = 0x8904 + SIOCGSTAMPNS_NEW = 0x80108907 + SIOCGSTAMP_NEW = 0x80108906 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCSPGRP = 0x8902 + SOCK_CLOEXEC = 0x80000 + SOCK_DGRAM = 0x2 + SOCK_NONBLOCK = 0x800 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0x1 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BINDTOIFINDEX = 0x3e + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUF_LOCK = 0x48 + SO_BUSY_POLL = 0x2e + SO_BUSY_POLL_BUDGET = 0x46 + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DETACH_REUSEPORT_BPF = 0x44 + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NETNS_COOKIE = 0x47 + SO_NOFCS = 0x2b + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERSEC = 0x1f + SO_PREFER_BUSY_POLL = 0x45 + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVMARK = 0x4b + SO_RCVTIMEO = 0x14 + SO_RCVTIMEO_NEW = 0x42 + SO_RCVTIMEO_OLD = 0x14 + SO_RESERVE_MEM = 0x49 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_SNDTIMEO_NEW = 0x43 + SO_SNDTIMEO_OLD = 0x15 + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPING_NEW = 0x41 + SO_TIMESTAMPING_OLD = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TIMESTAMPNS_NEW = 0x40 + SO_TIMESTAMPNS_OLD = 0x23 + SO_TIMESTAMP_NEW = 0x3f + SO_TXREHASH = 0x4a + SO_TXTIME = 0x3d + SO_TYPE = 0x3 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TFD_CLOEXEC = 0x80000 + TFD_NONBLOCK = 0x800 + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGISO7816 = 0x80285442 + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSISO7816 = 0xc0285443 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x100 + TUNATTACHFILTER = 0x401054d5 + TUNDETACHFILTER = 0x401054d6 + TUNGETDEVNETNS = 0x54e3 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x801054db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETCARRIER = 0x400454e2 + TUNSETDEBUG = 0x400454c9 + TUNSETFILTEREBPF = 0x800454e1 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETSTEERINGEBPF = 0x800454e0 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UBI_IOCATT = 0x40186f40 + UBI_IOCDET = 0x40046f41 + UBI_IOCEBCH = 0x40044f02 + UBI_IOCEBER = 0x40044f01 + UBI_IOCEBISMAP = 0x80044f05 + UBI_IOCEBMAP = 0x40084f03 + UBI_IOCEBUNMAP = 0x40044f04 + UBI_IOCMKVOL = 0x40986f00 + UBI_IOCRMVOL = 0x40046f01 + UBI_IOCRNVOL = 0x51106f03 + UBI_IOCRPEB = 0x40046f04 + UBI_IOCRSVOL = 0x400c6f02 + UBI_IOCSETVOLPROP = 0x40104f06 + UBI_IOCSPEB = 0x40046f05 + UBI_IOCVOLCRBLK = 0x40804f07 + UBI_IOCVOLRMBLK = 0x4f08 + UBI_IOCVOLUP = 0x40084f00 + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VMIN = 0x6 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WDIOC_GETBOOTSTATUS = 0x80045702 + WDIOC_GETPRETIMEOUT = 0x80045709 + WDIOC_GETSTATUS = 0x80045701 + WDIOC_GETSUPPORT = 0x80285700 + WDIOC_GETTEMP = 0x80045703 + WDIOC_GETTIMELEFT = 0x8004570a + WDIOC_GETTIMEOUT = 0x80045707 + WDIOC_KEEPALIVE = 0x80045705 + WDIOC_SETOPTIONS = 0x80045704 + WORDSIZE = 0x40 + XCASE = 0x4 + XTABS = 0x1800 + _HIDIOCGRAWNAME = 0x80804804 + _HIDIOCGRAWPHYS = 0x80404805 + _HIDIOCGRAWUNIQ = 0x80404808 +) + +// Errors +const ( + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + ECANCELED = syscall.Errno(0x7d) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x23) + EDESTADDRREQ = syscall.Errno(0x59) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EISCONN = syscall.Errno(0x6a) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTCONN = syscall.Errno(0x6b) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTUNIQ = syscall.Errno(0x4c) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPFNOSUPPORT = syscall.Errno(0x60) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGIO = syscall.Signal(0x1d) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "numerical result out of range"}, + {35, "EDEADLK", "resource deadlock avoided"}, + {36, "ENAMETOOLONG", "file name too long"}, + {37, "ENOLCK", "no locks available"}, + {38, "ENOSYS", "function not implemented"}, + {39, "ENOTEMPTY", "directory not empty"}, + {40, "ELOOP", "too many levels of symbolic links"}, + {42, "ENOMSG", "no message of desired type"}, + {43, "EIDRM", "identifier removed"}, + {44, "ECHRNG", "channel number out of range"}, + {45, "EL2NSYNC", "level 2 not synchronized"}, + {46, "EL3HLT", "level 3 halted"}, + {47, "EL3RST", "level 3 reset"}, + {48, "ELNRNG", "link number out of range"}, + {49, "EUNATCH", "protocol driver not attached"}, + {50, "ENOCSI", "no CSI structure available"}, + {51, "EL2HLT", "level 2 halted"}, + {52, "EBADE", "invalid exchange"}, + {53, "EBADR", "invalid request descriptor"}, + {54, "EXFULL", "exchange full"}, + {55, "ENOANO", "no anode"}, + {56, "EBADRQC", "invalid request code"}, + {57, "EBADSLT", "invalid slot"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {72, "EMULTIHOP", "multihop attempted"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EBADMSG", "bad message"}, + {75, "EOVERFLOW", "value too large for defined data type"}, + {76, "ENOTUNIQ", "name not unique on network"}, + {77, "EBADFD", "file descriptor in bad state"}, + {78, "EREMCHG", "remote address changed"}, + {79, "ELIBACC", "can not access a needed shared library"}, + {80, "ELIBBAD", "accessing a corrupted shared library"}, + {81, "ELIBSCN", ".lib section in a.out corrupted"}, + {82, "ELIBMAX", "attempting to link in too many shared libraries"}, + {83, "ELIBEXEC", "cannot exec a shared library directly"}, + {84, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {85, "ERESTART", "interrupted system call should be restarted"}, + {86, "ESTRPIPE", "streams pipe error"}, + {87, "EUSERS", "too many users"}, + {88, "ENOTSOCK", "socket operation on non-socket"}, + {89, "EDESTADDRREQ", "destination address required"}, + {90, "EMSGSIZE", "message too long"}, + {91, "EPROTOTYPE", "protocol wrong type for socket"}, + {92, "ENOPROTOOPT", "protocol not available"}, + {93, "EPROTONOSUPPORT", "protocol not supported"}, + {94, "ESOCKTNOSUPPORT", "socket type not supported"}, + {95, "ENOTSUP", "operation not supported"}, + {96, "EPFNOSUPPORT", "protocol family not supported"}, + {97, "EAFNOSUPPORT", "address family not supported by protocol"}, + {98, "EADDRINUSE", "address already in use"}, + {99, "EADDRNOTAVAIL", "cannot assign requested address"}, + {100, "ENETDOWN", "network is down"}, + {101, "ENETUNREACH", "network is unreachable"}, + {102, "ENETRESET", "network dropped connection on reset"}, + {103, "ECONNABORTED", "software caused connection abort"}, + {104, "ECONNRESET", "connection reset by peer"}, + {105, "ENOBUFS", "no buffer space available"}, + {106, "EISCONN", "transport endpoint is already connected"}, + {107, "ENOTCONN", "transport endpoint is not connected"}, + {108, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {109, "ETOOMANYREFS", "too many references: cannot splice"}, + {110, "ETIMEDOUT", "connection timed out"}, + {111, "ECONNREFUSED", "connection refused"}, + {112, "EHOSTDOWN", "host is down"}, + {113, "EHOSTUNREACH", "no route to host"}, + {114, "EALREADY", "operation already in progress"}, + {115, "EINPROGRESS", "operation now in progress"}, + {116, "ESTALE", "stale file handle"}, + {117, "EUCLEAN", "structure needs cleaning"}, + {118, "ENOTNAM", "not a XENIX named type file"}, + {119, "ENAVAIL", "no XENIX semaphores available"}, + {120, "EISNAM", "is a named type file"}, + {121, "EREMOTEIO", "remote I/O error"}, + {122, "EDQUOT", "disk quota exceeded"}, + {123, "ENOMEDIUM", "no medium found"}, + {124, "EMEDIUMTYPE", "wrong medium type"}, + {125, "ECANCELED", "operation canceled"}, + {126, "ENOKEY", "required key not available"}, + {127, "EKEYEXPIRED", "key has expired"}, + {128, "EKEYREVOKED", "key has been revoked"}, + {129, "EKEYREJECTED", "key was rejected by service"}, + {130, "EOWNERDEAD", "owner died"}, + {131, "ENOTRECOVERABLE", "state not recoverable"}, + {132, "ERFKILL", "operation not possible due to RF-kill"}, + {133, "EHWPOISON", "memory page has hardware error"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {7, "SIGBUS", "bus error"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGUSR1", "user defined signal 1"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGUSR2", "user defined signal 2"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGSTKFLT", "stack fault"}, + {17, "SIGCHLD", "child exited"}, + {18, "SIGCONT", "continued"}, + {19, "SIGSTOP", "stopped (signal)"}, + {20, "SIGTSTP", "stopped"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGURG", "urgent I/O condition"}, + {24, "SIGXCPU", "CPU time limit exceeded"}, + {25, "SIGXFSZ", "file size limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window changed"}, + {29, "SIGIO", "I/O possible"}, + {30, "SIGPWR", "power failure"}, + {31, "SIGSYS", "bad system call"}, +} diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go index a8bba9491..179bffb47 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go @@ -1,11 +1,11 @@ -// mkerrors.sh -Wall -Werror -static -I/tmp/include +// mkerrors.sh -Wall -Werror -static -I/tmp/mips/include // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips && linux // +build mips,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/_const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/mips/include _const.go package unix @@ -250,6 +250,8 @@ const ( RTC_EPOCH_SET = 0x8004700e RTC_IRQP_READ = 0x4004700b RTC_IRQP_SET = 0x8004700c + RTC_PARAM_GET = 0x80187013 + RTC_PARAM_SET = 0x80187014 RTC_PIE_OFF = 0x20007006 RTC_PIE_ON = 0x20007005 RTC_PLL_GET = 0x401c7011 @@ -324,9 +326,11 @@ const ( SO_RCVBUF = 0x1002 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x1004 + SO_RCVMARK = 0x4b SO_RCVTIMEO = 0x1006 SO_RCVTIMEO_NEW = 0x42 SO_RCVTIMEO_OLD = 0x1006 + SO_RESERVE_MEM = 0x49 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_RXQ_OVFL = 0x28 @@ -348,6 +352,7 @@ const ( SO_TIMESTAMPNS_NEW = 0x40 SO_TIMESTAMPNS_OLD = 0x23 SO_TIMESTAMP_NEW = 0x3f + SO_TXREHASH = 0x4a SO_TXTIME = 0x3d SO_TYPE = 0x1008 SO_WIFI_STATUS = 0x29 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go index ee9e7e202..1fba17bd7 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go @@ -1,11 +1,11 @@ -// mkerrors.sh -Wall -Werror -static -I/tmp/include +// mkerrors.sh -Wall -Werror -static -I/tmp/mips64/include // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips64 && linux // +build mips64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/_const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/mips64/include _const.go package unix @@ -250,6 +250,8 @@ const ( RTC_EPOCH_SET = 0x8008700e RTC_IRQP_READ = 0x4008700b RTC_IRQP_SET = 0x8008700c + RTC_PARAM_GET = 0x80187013 + RTC_PARAM_SET = 0x80187014 RTC_PIE_OFF = 0x20007006 RTC_PIE_ON = 0x20007005 RTC_PLL_GET = 0x40207011 @@ -324,9 +326,11 @@ const ( SO_RCVBUF = 0x1002 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x1004 + SO_RCVMARK = 0x4b SO_RCVTIMEO = 0x1006 SO_RCVTIMEO_NEW = 0x42 SO_RCVTIMEO_OLD = 0x1006 + SO_RESERVE_MEM = 0x49 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_RXQ_OVFL = 0x28 @@ -348,6 +352,7 @@ const ( SO_TIMESTAMPNS_NEW = 0x40 SO_TIMESTAMPNS_OLD = 0x23 SO_TIMESTAMP_NEW = 0x3f + SO_TXREHASH = 0x4a SO_TXTIME = 0x3d SO_TYPE = 0x1008 SO_WIFI_STATUS = 0x29 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go index ba4b288a3..b77dde315 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go @@ -1,11 +1,11 @@ -// mkerrors.sh -Wall -Werror -static -I/tmp/include +// mkerrors.sh -Wall -Werror -static -I/tmp/mips64le/include // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips64le && linux // +build mips64le,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/_const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/mips64le/include _const.go package unix @@ -250,6 +250,8 @@ const ( RTC_EPOCH_SET = 0x8008700e RTC_IRQP_READ = 0x4008700b RTC_IRQP_SET = 0x8008700c + RTC_PARAM_GET = 0x80187013 + RTC_PARAM_SET = 0x80187014 RTC_PIE_OFF = 0x20007006 RTC_PIE_ON = 0x20007005 RTC_PLL_GET = 0x40207011 @@ -324,9 +326,11 @@ const ( SO_RCVBUF = 0x1002 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x1004 + SO_RCVMARK = 0x4b SO_RCVTIMEO = 0x1006 SO_RCVTIMEO_NEW = 0x42 SO_RCVTIMEO_OLD = 0x1006 + SO_RESERVE_MEM = 0x49 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_RXQ_OVFL = 0x28 @@ -348,6 +352,7 @@ const ( SO_TIMESTAMPNS_NEW = 0x40 SO_TIMESTAMPNS_OLD = 0x23 SO_TIMESTAMP_NEW = 0x3f + SO_TXREHASH = 0x4a SO_TXTIME = 0x3d SO_TYPE = 0x1008 SO_WIFI_STATUS = 0x29 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go index bc93afc36..78c6c751b 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go @@ -1,11 +1,11 @@ -// mkerrors.sh -Wall -Werror -static -I/tmp/include +// mkerrors.sh -Wall -Werror -static -I/tmp/mipsle/include // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mipsle && linux // +build mipsle,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/_const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/mipsle/include _const.go package unix @@ -250,6 +250,8 @@ const ( RTC_EPOCH_SET = 0x8004700e RTC_IRQP_READ = 0x4004700b RTC_IRQP_SET = 0x8004700c + RTC_PARAM_GET = 0x80187013 + RTC_PARAM_SET = 0x80187014 RTC_PIE_OFF = 0x20007006 RTC_PIE_ON = 0x20007005 RTC_PLL_GET = 0x401c7011 @@ -324,9 +326,11 @@ const ( SO_RCVBUF = 0x1002 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x1004 + SO_RCVMARK = 0x4b SO_RCVTIMEO = 0x1006 SO_RCVTIMEO_NEW = 0x42 SO_RCVTIMEO_OLD = 0x1006 + SO_RESERVE_MEM = 0x49 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_RXQ_OVFL = 0x28 @@ -348,6 +352,7 @@ const ( SO_TIMESTAMPNS_NEW = 0x40 SO_TIMESTAMPNS_OLD = 0x23 SO_TIMESTAMP_NEW = 0x3f + SO_TXREHASH = 0x4a SO_TXTIME = 0x3d SO_TYPE = 0x1008 SO_WIFI_STATUS = 0x29 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go index 9295e6947..1c0d31f0b 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go @@ -1,11 +1,11 @@ -// mkerrors.sh -Wall -Werror -static -I/tmp/include +// mkerrors.sh -Wall -Werror -static -I/tmp/ppc/include // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc && linux // +build ppc,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/_const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/ppc/include _const.go package unix @@ -305,6 +305,8 @@ const ( RTC_EPOCH_SET = 0x8004700e RTC_IRQP_READ = 0x4004700b RTC_IRQP_SET = 0x8004700c + RTC_PARAM_GET = 0x80187013 + RTC_PARAM_SET = 0x80187014 RTC_PIE_OFF = 0x20007006 RTC_PIE_ON = 0x20007005 RTC_PLL_GET = 0x401c7011 @@ -379,9 +381,11 @@ const ( SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x10 + SO_RCVMARK = 0x4b SO_RCVTIMEO = 0x12 SO_RCVTIMEO_NEW = 0x42 SO_RCVTIMEO_OLD = 0x12 + SO_RESERVE_MEM = 0x49 SO_REUSEADDR = 0x2 SO_REUSEPORT = 0xf SO_RXQ_OVFL = 0x28 @@ -402,6 +406,7 @@ const ( SO_TIMESTAMPNS_NEW = 0x40 SO_TIMESTAMPNS_OLD = 0x23 SO_TIMESTAMP_NEW = 0x3f + SO_TXREHASH = 0x4a SO_TXTIME = 0x3d SO_TYPE = 0x3 SO_WIFI_STATUS = 0x29 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go index 1fa081c9a..959dd9bb8 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go @@ -1,11 +1,11 @@ -// mkerrors.sh -Wall -Werror -static -I/tmp/include +// mkerrors.sh -Wall -Werror -static -I/tmp/ppc64/include // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc64 && linux // +build ppc64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/_const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/ppc64/include _const.go package unix @@ -309,6 +309,8 @@ const ( RTC_EPOCH_SET = 0x8008700e RTC_IRQP_READ = 0x4008700b RTC_IRQP_SET = 0x8008700c + RTC_PARAM_GET = 0x80187013 + RTC_PARAM_SET = 0x80187014 RTC_PIE_OFF = 0x20007006 RTC_PIE_ON = 0x20007005 RTC_PLL_GET = 0x40207011 @@ -383,9 +385,11 @@ const ( SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x10 + SO_RCVMARK = 0x4b SO_RCVTIMEO = 0x12 SO_RCVTIMEO_NEW = 0x42 SO_RCVTIMEO_OLD = 0x12 + SO_RESERVE_MEM = 0x49 SO_REUSEADDR = 0x2 SO_REUSEPORT = 0xf SO_RXQ_OVFL = 0x28 @@ -406,6 +410,7 @@ const ( SO_TIMESTAMPNS_NEW = 0x40 SO_TIMESTAMPNS_OLD = 0x23 SO_TIMESTAMP_NEW = 0x3f + SO_TXREHASH = 0x4a SO_TXTIME = 0x3d SO_TYPE = 0x3 SO_WIFI_STATUS = 0x29 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go index 74b321149..5a873cdbc 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go @@ -1,11 +1,11 @@ -// mkerrors.sh -Wall -Werror -static -I/tmp/include +// mkerrors.sh -Wall -Werror -static -I/tmp/ppc64le/include // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc64le && linux // +build ppc64le,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/_const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/ppc64le/include _const.go package unix @@ -309,6 +309,8 @@ const ( RTC_EPOCH_SET = 0x8008700e RTC_IRQP_READ = 0x4008700b RTC_IRQP_SET = 0x8008700c + RTC_PARAM_GET = 0x80187013 + RTC_PARAM_SET = 0x80187014 RTC_PIE_OFF = 0x20007006 RTC_PIE_ON = 0x20007005 RTC_PLL_GET = 0x40207011 @@ -383,9 +385,11 @@ const ( SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x10 + SO_RCVMARK = 0x4b SO_RCVTIMEO = 0x12 SO_RCVTIMEO_NEW = 0x42 SO_RCVTIMEO_OLD = 0x12 + SO_RESERVE_MEM = 0x49 SO_REUSEADDR = 0x2 SO_REUSEPORT = 0xf SO_RXQ_OVFL = 0x28 @@ -406,6 +410,7 @@ const ( SO_TIMESTAMPNS_NEW = 0x40 SO_TIMESTAMPNS_OLD = 0x23 SO_TIMESTAMP_NEW = 0x3f + SO_TXREHASH = 0x4a SO_TXTIME = 0x3d SO_TYPE = 0x3 SO_WIFI_STATUS = 0x29 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go index c91c8ac5b..e336d141e 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go @@ -1,11 +1,11 @@ -// mkerrors.sh -Wall -Werror -static -I/tmp/include +// mkerrors.sh -Wall -Werror -static -I/tmp/riscv64/include // Code generated by the command above; see README.md. DO NOT EDIT. //go:build riscv64 && linux // +build riscv64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/_const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/riscv64/include _const.go package unix @@ -238,6 +238,8 @@ const ( RTC_EPOCH_SET = 0x4008700e RTC_IRQP_READ = 0x8008700b RTC_IRQP_SET = 0x4008700c + RTC_PARAM_GET = 0x40187013 + RTC_PARAM_SET = 0x40187014 RTC_PIE_OFF = 0x7006 RTC_PIE_ON = 0x7005 RTC_PLL_GET = 0x80207011 @@ -312,9 +314,11 @@ const ( SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x12 + SO_RCVMARK = 0x4b SO_RCVTIMEO = 0x14 SO_RCVTIMEO_NEW = 0x42 SO_RCVTIMEO_OLD = 0x14 + SO_RESERVE_MEM = 0x49 SO_REUSEADDR = 0x2 SO_REUSEPORT = 0xf SO_RXQ_OVFL = 0x28 @@ -335,6 +339,7 @@ const ( SO_TIMESTAMPNS_NEW = 0x40 SO_TIMESTAMPNS_OLD = 0x23 SO_TIMESTAMP_NEW = 0x3f + SO_TXREHASH = 0x4a SO_TXTIME = 0x3d SO_TYPE = 0x3 SO_WIFI_STATUS = 0x29 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go index b66bf2228..390c01d92 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go @@ -1,11 +1,11 @@ -// mkerrors.sh -Wall -Werror -static -I/tmp/include -fsigned-char +// mkerrors.sh -Wall -Werror -static -I/tmp/s390x/include -fsigned-char // Code generated by the command above; see README.md. DO NOT EDIT. //go:build s390x && linux // +build s390x,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char /build/unix/_const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/s390x/include -fsigned-char _const.go package unix @@ -313,6 +313,8 @@ const ( RTC_EPOCH_SET = 0x4008700e RTC_IRQP_READ = 0x8008700b RTC_IRQP_SET = 0x4008700c + RTC_PARAM_GET = 0x40187013 + RTC_PARAM_SET = 0x40187014 RTC_PIE_OFF = 0x7006 RTC_PIE_ON = 0x7005 RTC_PLL_GET = 0x80207011 @@ -387,9 +389,11 @@ const ( SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x12 + SO_RCVMARK = 0x4b SO_RCVTIMEO = 0x14 SO_RCVTIMEO_NEW = 0x42 SO_RCVTIMEO_OLD = 0x14 + SO_RESERVE_MEM = 0x49 SO_REUSEADDR = 0x2 SO_REUSEPORT = 0xf SO_RXQ_OVFL = 0x28 @@ -410,6 +414,7 @@ const ( SO_TIMESTAMPNS_NEW = 0x40 SO_TIMESTAMPNS_OLD = 0x23 SO_TIMESTAMP_NEW = 0x3f + SO_TXREHASH = 0x4a SO_TXTIME = 0x3d SO_TYPE = 0x3 SO_WIFI_STATUS = 0x29 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go index f7fb149b0..98a6e5f11 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go @@ -1,11 +1,11 @@ -// mkerrors.sh -Wall -Werror -static -I/tmp/include +// mkerrors.sh -Wall -Werror -static -I/tmp/sparc64/include // Code generated by the command above; see README.md. DO NOT EDIT. //go:build sparc64 && linux // +build sparc64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/_const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/sparc64/include _const.go package unix @@ -304,6 +304,8 @@ const ( RTC_EPOCH_SET = 0x8008700e RTC_IRQP_READ = 0x4008700b RTC_IRQP_SET = 0x8008700c + RTC_PARAM_GET = 0x80187013 + RTC_PARAM_SET = 0x80187014 RTC_PIE_OFF = 0x20007006 RTC_PIE_ON = 0x20007005 RTC_PLL_GET = 0x40207011 @@ -378,9 +380,11 @@ const ( SO_RCVBUF = 0x1002 SO_RCVBUFFORCE = 0x100b SO_RCVLOWAT = 0x800 + SO_RCVMARK = 0x54 SO_RCVTIMEO = 0x2000 SO_RCVTIMEO_NEW = 0x44 SO_RCVTIMEO_OLD = 0x2000 + SO_RESERVE_MEM = 0x52 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_RXQ_OVFL = 0x24 @@ -401,6 +405,7 @@ const ( SO_TIMESTAMPNS_NEW = 0x42 SO_TIMESTAMPNS_OLD = 0x21 SO_TIMESTAMP_NEW = 0x46 + SO_TXREHASH = 0x53 SO_TXTIME = 0x3f SO_TYPE = 0x1008 SO_WIFI_STATUS = 0x25 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go index 85e0cc386..870215d2c 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go @@ -975,7 +975,7 @@ func Pause() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 *byte if len(p) > 0 { _p0 = &p[0] @@ -992,7 +992,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 *byte if len(p) > 0 { _p0 = &p[0] diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go index f1d4a73b0..a89b0bfa5 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go @@ -931,7 +931,7 @@ func Pause() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 *byte if len(p) > 0 { _p0 = &p[0] @@ -946,7 +946,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 *byte if len(p) > 0 { _p0 = &p[0] diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.s index d6c3e25c0..f5bb40eda 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.s @@ -1,4 +1,4 @@ -// go run mkasm_darwin.go amd64 +// go run mkasm.go darwin amd64 // Code generated by the command above; DO NOT EDIT. //go:build go1.13 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go index 0ae0ed4cb..467deed76 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go @@ -643,17 +643,22 @@ var libc_flistxattr_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func setattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintptr, options int) (err error) { - _, _, e1 := syscall_syscall6(libc_setattrlist_trampoline_addr, uintptr(unsafe.Pointer(path)), uintptr(list), uintptr(buf), uintptr(size), uintptr(options), 0) +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := syscall_syscall6(libc_utimensat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } -var libc_setattrlist_trampoline_addr uintptr +var libc_utimensat_trampoline_addr uintptr -//go:cgo_import_dynamic libc_setattrlist setattrlist "/usr/lib/libSystem.B.dylib" +//go:cgo_import_dynamic libc_utimensat utimensat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1638,6 +1643,30 @@ var libc_mknod_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Mount(fsType string, dir string, flags int, data unsafe.Pointer) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(fsType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(dir) + if err != nil { + return + } + _, _, e1 := syscall_syscall6(libc_mount_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(flags), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_mount_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mount mount "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Open(path string, mode int, perm uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1698,7 +1727,7 @@ var libc_pathconf_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -1719,7 +1748,7 @@ var libc_pread_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s index eac6ca806..b41467a0e 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s @@ -1,4 +1,4 @@ -// go run mkasm_darwin.go amd64 +// go run mkasm.go darwin amd64 // Code generated by the command above; DO NOT EDIT. //go:build go1.12 @@ -228,11 +228,11 @@ TEXT libc_flistxattr_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_flistxattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_flistxattr_trampoline_addr(SB)/8, $libc_flistxattr_trampoline<>(SB) -TEXT libc_setattrlist_trampoline<>(SB),NOSPLIT,$0-0 - JMP libc_setattrlist(SB) +TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_utimensat(SB) -GLOBL ·libc_setattrlist_trampoline_addr(SB), RODATA, $8 -DATA ·libc_setattrlist_trampoline_addr(SB)/8, $libc_setattrlist_trampoline<>(SB) +GLOBL ·libc_utimensat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_utimensat_trampoline_addr(SB)/8, $libc_utimensat_trampoline<>(SB) TEXT libc_fcntl_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fcntl(SB) @@ -600,6 +600,12 @@ TEXT libc_mknod_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_mknod_trampoline_addr(SB), RODATA, $8 DATA ·libc_mknod_trampoline_addr(SB)/8, $libc_mknod_trampoline<>(SB) +TEXT libc_mount_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mount(SB) + +GLOBL ·libc_mount_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mount_trampoline_addr(SB)/8, $libc_mount_trampoline<>(SB) + TEXT libc_open_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_open(SB) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.s index 357989722..0c3f76bc2 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.s @@ -1,4 +1,4 @@ -// go run mkasm_darwin.go arm64 +// go run mkasm.go darwin arm64 // Code generated by the command above; DO NOT EDIT. //go:build go1.13 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go index cf71be3ed..35938d34f 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go @@ -643,17 +643,22 @@ var libc_flistxattr_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func setattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintptr, options int) (err error) { - _, _, e1 := syscall_syscall6(libc_setattrlist_trampoline_addr, uintptr(unsafe.Pointer(path)), uintptr(list), uintptr(buf), uintptr(size), uintptr(options), 0) +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := syscall_syscall6(libc_utimensat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } -var libc_setattrlist_trampoline_addr uintptr +var libc_utimensat_trampoline_addr uintptr -//go:cgo_import_dynamic libc_setattrlist setattrlist "/usr/lib/libSystem.B.dylib" +//go:cgo_import_dynamic libc_utimensat utimensat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1638,6 +1643,30 @@ var libc_mknod_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Mount(fsType string, dir string, flags int, data unsafe.Pointer) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(fsType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(dir) + if err != nil { + return + } + _, _, e1 := syscall_syscall6(libc_mount_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(flags), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_mount_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mount mount "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Open(path string, mode int, perm uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1698,7 +1727,7 @@ var libc_pathconf_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -1719,7 +1748,7 @@ var libc_pread_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s index 4ebcf2175..e1f9204a2 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s @@ -1,4 +1,4 @@ -// go run mkasm_darwin.go arm64 +// go run mkasm.go darwin arm64 // Code generated by the command above; DO NOT EDIT. //go:build go1.12 @@ -228,11 +228,11 @@ TEXT libc_flistxattr_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_flistxattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_flistxattr_trampoline_addr(SB)/8, $libc_flistxattr_trampoline<>(SB) -TEXT libc_setattrlist_trampoline<>(SB),NOSPLIT,$0-0 - JMP libc_setattrlist(SB) +TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_utimensat(SB) -GLOBL ·libc_setattrlist_trampoline_addr(SB), RODATA, $8 -DATA ·libc_setattrlist_trampoline_addr(SB)/8, $libc_setattrlist_trampoline<>(SB) +GLOBL ·libc_utimensat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_utimensat_trampoline_addr(SB)/8, $libc_utimensat_trampoline<>(SB) TEXT libc_fcntl_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fcntl(SB) @@ -600,6 +600,12 @@ TEXT libc_mknod_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_mknod_trampoline_addr(SB), RODATA, $8 DATA ·libc_mknod_trampoline_addr(SB)/8, $libc_mknod_trampoline<>(SB) +TEXT libc_mount_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mount(SB) + +GLOBL ·libc_mount_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mount_trampoline_addr(SB)/8, $libc_mount_trampoline<>(SB) + TEXT libc_open_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_open(SB) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go index 3e9bddb7b..039c4aa06 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go @@ -912,7 +912,7 @@ func Fpathconf(fd int, name int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fstat(fd int, stat *stat_freebsd11_t) (err error) { +func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) @@ -922,17 +922,7 @@ func fstat(fd int, stat *stat_freebsd11_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fstat_freebsd12(fd int, stat *Stat_t) (err error) { - _, _, e1 := Syscall(SYS_FSTAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func fstatat(fd int, path string, stat *stat_freebsd11_t, flags int) (err error) { +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { @@ -947,22 +937,7 @@ func fstatat(fd int, path string, stat *stat_freebsd11_t, flags int) (err error) // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fstatat_freebsd12(fd int, path string, stat *Stat_t, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_FSTATAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func fstatfs(fd int, stat *statfs_freebsd11_t) (err error) { +func Fstatfs(fd int, stat *Statfs_t) (err error) { _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) @@ -972,16 +947,6 @@ func fstatfs(fd int, stat *statfs_freebsd11_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fstatfs_freebsd12(fd int, stat *Statfs_t) (err error) { - _, _, e1 := Syscall(SYS_FSTATFS_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { @@ -1002,7 +967,7 @@ func Ftruncate(fd int, length int64) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { +func getdirentries(fd int, buf []byte, basep *uint64) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) @@ -1019,23 +984,6 @@ func getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdirentries_freebsd12(fd int, buf []byte, basep *uint64) (n int, err error) { - var _p0 unsafe.Pointer - if len(buf) > 0 { - _p0 = unsafe.Pointer(&buf[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - r0, _, e1 := Syscall6(SYS_GETDIRENTRIES_FREEBSD12, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Getdtablesize() (size int) { r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) size = int(r0) @@ -1257,21 +1205,6 @@ func Listen(s int, backlog int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func lstat(path string, stat *stat_freebsd11_t) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Mkdir(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1317,43 +1250,13 @@ func Mkfifo(path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func mknod(path string, mode uint32, dev int) (err error) { +func Mknodat(fd int, path string, mode uint32, dev uint64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } - _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func mknodat(fd int, path string, mode uint32, dev int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func mknodat_freebsd12(fd int, path string, mode uint32, dev uint64) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_MKNODAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), uintptr(dev>>32), 0) + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), uintptr(dev>>32), 0) if e1 != 0 { err = errnoErr(e1) } @@ -1420,7 +1323,7 @@ func Pathconf(path string, name int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -1437,7 +1340,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -1753,22 +1656,7 @@ func Setuid(uid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func stat(path string, stat *stat_freebsd11_t) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func statfs(path string, stat *statfs_freebsd11_t) (err error) { +func Statfs(path string, stat *Statfs_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { @@ -1783,21 +1671,6 @@ func statfs(path string, stat *statfs_freebsd11_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func statfs_freebsd12(path string, stat *Statfs_t) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall(SYS_STATFS_FREEBSD12, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Symlink(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go index c72a462b9..0535d3cfd 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go @@ -912,7 +912,7 @@ func Fpathconf(fd int, name int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fstat(fd int, stat *stat_freebsd11_t) (err error) { +func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) @@ -922,17 +922,7 @@ func fstat(fd int, stat *stat_freebsd11_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fstat_freebsd12(fd int, stat *Stat_t) (err error) { - _, _, e1 := Syscall(SYS_FSTAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func fstatat(fd int, path string, stat *stat_freebsd11_t, flags int) (err error) { +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { @@ -947,22 +937,7 @@ func fstatat(fd int, path string, stat *stat_freebsd11_t, flags int) (err error) // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fstatat_freebsd12(fd int, path string, stat *Stat_t, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_FSTATAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func fstatfs(fd int, stat *statfs_freebsd11_t) (err error) { +func Fstatfs(fd int, stat *Statfs_t) (err error) { _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) @@ -972,16 +947,6 @@ func fstatfs(fd int, stat *statfs_freebsd11_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fstatfs_freebsd12(fd int, stat *Statfs_t) (err error) { - _, _, e1 := Syscall(SYS_FSTATFS_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { @@ -1002,7 +967,7 @@ func Ftruncate(fd int, length int64) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { +func getdirentries(fd int, buf []byte, basep *uint64) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) @@ -1019,23 +984,6 @@ func getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdirentries_freebsd12(fd int, buf []byte, basep *uint64) (n int, err error) { - var _p0 unsafe.Pointer - if len(buf) > 0 { - _p0 = unsafe.Pointer(&buf[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - r0, _, e1 := Syscall6(SYS_GETDIRENTRIES_FREEBSD12, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Getdtablesize() (size int) { r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) size = int(r0) @@ -1257,21 +1205,6 @@ func Listen(s int, backlog int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func lstat(path string, stat *stat_freebsd11_t) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Mkdir(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1317,22 +1250,7 @@ func Mkfifo(path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func mknod(path string, mode uint32, dev int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func mknodat(fd int, path string, mode uint32, dev int) (err error) { +func Mknodat(fd int, path string, mode uint32, dev uint64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { @@ -1347,21 +1265,6 @@ func mknodat(fd int, path string, mode uint32, dev int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func mknodat_freebsd12(fd int, path string, mode uint32, dev uint64) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_MKNODAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { @@ -1420,7 +1323,7 @@ func Pathconf(path string, name int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -1437,7 +1340,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -1753,22 +1656,7 @@ func Setuid(uid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func stat(path string, stat *stat_freebsd11_t) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func statfs(path string, stat *statfs_freebsd11_t) (err error) { +func Statfs(path string, stat *Statfs_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { @@ -1783,21 +1671,6 @@ func statfs(path string, stat *statfs_freebsd11_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func statfs_freebsd12(path string, stat *Statfs_t) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall(SYS_STATFS_FREEBSD12, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Symlink(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go index 530d5df90..1018b5221 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go @@ -351,22 +351,6 @@ func Munlockall() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { - var _p0 unsafe.Pointer - if len(mib) > 0 { - _p0 = unsafe.Pointer(&mib[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func pipe2(p *[2]_C_int, flags int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { @@ -404,6 +388,22 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ptrace(request int, pid int, addr uintptr, data int) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { @@ -912,7 +912,7 @@ func Fpathconf(fd int, name int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fstat(fd int, stat *stat_freebsd11_t) (err error) { +func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) @@ -922,17 +922,7 @@ func fstat(fd int, stat *stat_freebsd11_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fstat_freebsd12(fd int, stat *Stat_t) (err error) { - _, _, e1 := Syscall(SYS_FSTAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func fstatat(fd int, path string, stat *stat_freebsd11_t, flags int) (err error) { +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { @@ -947,22 +937,7 @@ func fstatat(fd int, path string, stat *stat_freebsd11_t, flags int) (err error) // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fstatat_freebsd12(fd int, path string, stat *Stat_t, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_FSTATAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func fstatfs(fd int, stat *statfs_freebsd11_t) (err error) { +func Fstatfs(fd int, stat *Statfs_t) (err error) { _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) @@ -972,16 +947,6 @@ func fstatfs(fd int, stat *statfs_freebsd11_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fstatfs_freebsd12(fd int, stat *Statfs_t) (err error) { - _, _, e1 := Syscall(SYS_FSTATFS_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { @@ -1002,7 +967,7 @@ func Ftruncate(fd int, length int64) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { +func getdirentries(fd int, buf []byte, basep *uint64) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) @@ -1019,23 +984,6 @@ func getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdirentries_freebsd12(fd int, buf []byte, basep *uint64) (n int, err error) { - var _p0 unsafe.Pointer - if len(buf) > 0 { - _p0 = unsafe.Pointer(&buf[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - r0, _, e1 := Syscall6(SYS_GETDIRENTRIES_FREEBSD12, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Getdtablesize() (size int) { r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) size = int(r0) @@ -1257,21 +1205,6 @@ func Listen(s int, backlog int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func lstat(path string, stat *stat_freebsd11_t) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Mkdir(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1317,43 +1250,13 @@ func Mkfifo(path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func mknod(path string, mode uint32, dev int) (err error) { +func Mknodat(fd int, path string, mode uint32, dev uint64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } - _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func mknodat(fd int, path string, mode uint32, dev int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func mknodat_freebsd12(fd int, path string, mode uint32, dev uint64) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_MKNODAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, uintptr(dev), uintptr(dev>>32)) if e1 != 0 { err = errnoErr(e1) } @@ -1420,7 +1323,7 @@ func Pathconf(path string, name int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -1437,7 +1340,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -1753,22 +1656,7 @@ func Setuid(uid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func stat(path string, stat *stat_freebsd11_t) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func statfs(path string, stat *statfs_freebsd11_t) (err error) { +func Statfs(path string, stat *Statfs_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { @@ -1783,21 +1671,6 @@ func statfs(path string, stat *statfs_freebsd11_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func statfs_freebsd12(path string, stat *Statfs_t) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall(SYS_STATFS_FREEBSD12, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Symlink(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go index 71e7df9e8..3802f4b37 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go @@ -912,7 +912,7 @@ func Fpathconf(fd int, name int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fstat(fd int, stat *stat_freebsd11_t) (err error) { +func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) @@ -922,17 +922,7 @@ func fstat(fd int, stat *stat_freebsd11_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fstat_freebsd12(fd int, stat *Stat_t) (err error) { - _, _, e1 := Syscall(SYS_FSTAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func fstatat(fd int, path string, stat *stat_freebsd11_t, flags int) (err error) { +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { @@ -947,22 +937,7 @@ func fstatat(fd int, path string, stat *stat_freebsd11_t, flags int) (err error) // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fstatat_freebsd12(fd int, path string, stat *Stat_t, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_FSTATAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func fstatfs(fd int, stat *statfs_freebsd11_t) (err error) { +func Fstatfs(fd int, stat *Statfs_t) (err error) { _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) @@ -972,16 +947,6 @@ func fstatfs(fd int, stat *statfs_freebsd11_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fstatfs_freebsd12(fd int, stat *Statfs_t) (err error) { - _, _, e1 := Syscall(SYS_FSTATFS_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { @@ -1002,7 +967,7 @@ func Ftruncate(fd int, length int64) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { +func getdirentries(fd int, buf []byte, basep *uint64) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) @@ -1019,23 +984,6 @@ func getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdirentries_freebsd12(fd int, buf []byte, basep *uint64) (n int, err error) { - var _p0 unsafe.Pointer - if len(buf) > 0 { - _p0 = unsafe.Pointer(&buf[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - r0, _, e1 := Syscall6(SYS_GETDIRENTRIES_FREEBSD12, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Getdtablesize() (size int) { r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) size = int(r0) @@ -1257,21 +1205,6 @@ func Listen(s int, backlog int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func lstat(path string, stat *stat_freebsd11_t) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Mkdir(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1317,22 +1250,7 @@ func Mkfifo(path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func mknod(path string, mode uint32, dev int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func mknodat(fd int, path string, mode uint32, dev int) (err error) { +func Mknodat(fd int, path string, mode uint32, dev uint64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { @@ -1347,21 +1265,6 @@ func mknodat(fd int, path string, mode uint32, dev int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func mknodat_freebsd12(fd int, path string, mode uint32, dev uint64) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_MKNODAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { @@ -1420,7 +1323,7 @@ func Pathconf(path string, name int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -1437,7 +1340,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -1753,22 +1656,7 @@ func Setuid(uid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func stat(path string, stat *stat_freebsd11_t) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func statfs(path string, stat *statfs_freebsd11_t) (err error) { +func Statfs(path string, stat *Statfs_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { @@ -1783,21 +1671,6 @@ func statfs(path string, stat *statfs_freebsd11_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func statfs_freebsd12(path string, stat *Statfs_t) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall(SYS_STATFS_FREEBSD12, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Symlink(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go new file mode 100644 index 000000000..8a2db7da9 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go @@ -0,0 +1,1889 @@ +// go run mksyscall.go -tags freebsd,riscv64 syscall_bsd.go syscall_freebsd.go syscall_freebsd_riscv64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +//go:build freebsd && riscv64 +// +build freebsd,riscv64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data int) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CapEnter() (err error) { + _, _, e1 := Syscall(SYS_CAP_ENTER, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsGet(version int, fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS___CAP_RIGHTS_GET, uintptr(version), uintptr(fd), uintptr(unsafe.Pointer(rightsp))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsLimit(fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS_CAP_RIGHTS_LIMIT, uintptr(fd), uintptr(unsafe.Pointer(rightsp)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FD, uintptr(fd), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_POSIX_FADVISE, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdirentries(fd int, buf []byte, basep *uint64) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(fd int, path string, mode uint32, dev uint64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Openat(fdat int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(fdat), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + newoffset = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux.go b/vendor/golang.org/x/sys/unix/zsyscall_linux.go index 93edda4c4..bc4a27531 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux.go @@ -231,6 +231,16 @@ func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Waitid(idType int, id int, info *Siginfo, options int, rusage *Rusage) (err error) { + _, _, e1 := Syscall6(SYS_WAITID, uintptr(idType), uintptr(id), uintptr(unsafe.Pointer(info)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) ret = int(r0) @@ -818,6 +828,49 @@ func Fsync(fd int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Fsmount(fd int, flags int, mountAttrs int) (fsfd int, err error) { + r0, _, e1 := Syscall(SYS_FSMOUNT, uintptr(fd), uintptr(flags), uintptr(mountAttrs)) + fsfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsopen(fsName string, flags int) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(fsName) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_FSOPEN, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fspick(dirfd int, pathName string, flags int) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathName) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_FSPICK, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { @@ -1195,6 +1248,26 @@ func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func MoveMount(fromDirfd int, fromPathName string, toDirfd int, toPathName string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(fromPathName) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(toPathName) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOVE_MOUNT, uintptr(fromDirfd), uintptr(unsafe.Pointer(_p0)), uintptr(toDirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { @@ -1205,6 +1278,22 @@ func Nanosleep(time *Timespec, leftover *Timespec) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func OpenTree(dfd int, fileName string, flags uint) (r int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(fileName) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN_TREE, uintptr(dfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + r = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) fd = int(r0) @@ -1992,6 +2081,16 @@ func PidfdGetfd(pidfd int, targetfd int, flags int) (fd int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func PidfdSendSignal(pidfd int, sig Signal, info *Siginfo, flags int) (err error) { + _, _, e1 := Syscall6(SYS_PIDFD_SEND_SIGNAL, uintptr(pidfd), uintptr(sig), uintptr(unsafe.Pointer(info)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func shmat(id int, addr uintptr, flag int) (ret uintptr, err error) { r0, _, e1 := Syscall(SYS_SHMAT, uintptr(id), uintptr(addr), uintptr(flag)) ret = uintptr(r0) @@ -2032,3 +2131,23 @@ func shmget(key int, size int, flag int) (id int, err error) { } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getitimer(which int, currValue *Itimerval) (err error) { + _, _, e1 := Syscall(SYS_GETITIMER, uintptr(which), uintptr(unsafe.Pointer(currValue)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setitimer(which int, newValue *Itimerval, oldValue *Itimerval) (err error) { + _, _, e1 := Syscall(SYS_SETITIMER, uintptr(which), uintptr(unsafe.Pointer(newValue)), uintptr(unsafe.Pointer(oldValue))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go index ff90c81e7..88af526b7 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go @@ -1,4 +1,4 @@ -// go run mksyscall.go -l32 -tags linux,386 syscall_linux.go syscall_linux_386.go +// go run mksyscall.go -l32 -tags linux,386 syscall_linux.go syscall_linux_386.go syscall_linux_alarm.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build linux && 386 @@ -200,7 +200,7 @@ func Lstat(path string, stat *Stat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -217,7 +217,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -524,3 +524,14 @@ func utimes(path string, times *[2]Timeval) (err error) { } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Alarm(seconds uint) (remaining uint, err error) { + r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0) + remaining = uint(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go index fa7d3dbe4..2a0c4aa6a 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go @@ -1,4 +1,4 @@ -// go run mksyscall.go -tags linux,amd64 syscall_linux.go syscall_linux_amd64.go +// go run mksyscall.go -tags linux,amd64 syscall_linux.go syscall_linux_amd64.go syscall_linux_alarm.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build linux && amd64 @@ -215,6 +215,17 @@ func Listen(s int, n int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func MemfdSecret(flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_MEMFD_SECRET, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Pause() (err error) { _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) if e1 != 0 { @@ -225,7 +236,7 @@ func Pause() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -242,7 +253,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -444,17 +455,6 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) @@ -691,3 +691,14 @@ func kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, f } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Alarm(seconds uint) (remaining uint, err error) { + r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0) + remaining = uint(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go index 654f91530..4882bde3a 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go @@ -46,17 +46,6 @@ func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) @@ -549,7 +538,7 @@ func utimes(path string, times *[2]Timeval) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -566,7 +555,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go index e893f987f..9f8c24e43 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go @@ -180,7 +180,18 @@ func Listen(s int, n int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func MemfdSecret(flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_MEMFD_SECRET, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -197,7 +208,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -389,17 +400,6 @@ func Truncate(path string, length int64) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_loong64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_loong64.go new file mode 100644 index 000000000..523f2ba03 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_loong64.go @@ -0,0 +1,527 @@ +// go run mksyscall.go -tags linux,loong64 syscall_linux.go syscall_linux_loong64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +//go:build linux && loong64 +// +build linux,loong64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fanotifyMark(fd int, flags uint, mask uint64, dirFd int, pathname *byte) (err error) { + _, _, e1 := Syscall6(SYS_FANOTIFY_MARK, uintptr(fd), uintptr(flags), uintptr(mask), uintptr(dirFd), uintptr(unsafe.Pointer(pathname)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_PWAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setfsgid(gid int) (prev int, err error) { + r0, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + prev = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setfsuid(uid int) (prev int, err error) { + r0, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + prev = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(cmdline) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_KEXEC_FILE_LOAD, uintptr(kernelFd), uintptr(initrdFd), uintptr(cmdlineLen), uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go index 6d1552885..d7d6f4244 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go @@ -1,4 +1,4 @@ -// go run mksyscall.go -b32 -arm -tags linux,mips syscall_linux.go syscall_linux_mipsx.go +// go run mksyscall.go -b32 -arm -tags linux,mips syscall_linux.go syscall_linux_mipsx.go syscall_linux_alarm.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build linux && mips @@ -150,7 +150,7 @@ func Listen(s int, n int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -167,7 +167,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -344,17 +344,6 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) @@ -702,3 +691,14 @@ func setrlimit(resource int, rlim *rlimit32) (err error) { } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Alarm(seconds uint) (remaining uint, err error) { + r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0) + remaining = uint(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go index 1e20d72df..7f1f8e653 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go @@ -1,4 +1,4 @@ -// go run mksyscall.go -tags linux,mips64 syscall_linux.go syscall_linux_mips64x.go +// go run mksyscall.go -tags linux,mips64 syscall_linux.go syscall_linux_mips64x.go syscall_linux_alarm.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build linux && mips64 @@ -180,7 +180,7 @@ func Pause() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -197,7 +197,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -399,17 +399,6 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) @@ -696,3 +685,14 @@ func stat(path string, st *stat_t) (err error) { } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Alarm(seconds uint) (remaining uint, err error) { + r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0) + remaining = uint(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go index 82b5e2d9e..f933d0f51 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go @@ -180,7 +180,7 @@ func Pause() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -197,7 +197,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -399,17 +399,6 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go index a0440c1d4..297d0a998 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go @@ -1,4 +1,4 @@ -// go run mksyscall.go -l32 -arm -tags linux,mipsle syscall_linux.go syscall_linux_mipsx.go +// go run mksyscall.go -l32 -arm -tags linux,mipsle syscall_linux.go syscall_linux_mipsx.go syscall_linux_alarm.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build linux && mipsle @@ -150,7 +150,7 @@ func Listen(s int, n int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -167,7 +167,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -344,17 +344,6 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) @@ -702,3 +691,14 @@ func setrlimit(resource int, rlim *rlimit32) (err error) { } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Alarm(seconds uint) (remaining uint, err error) { + r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0) + remaining = uint(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go index 5864b9ca6..2e32e7a44 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go @@ -1,4 +1,4 @@ -// go run mksyscall.go -b32 -tags linux,ppc syscall_linux.go syscall_linux_ppc.go +// go run mksyscall.go -b32 -tags linux,ppc syscall_linux.go syscall_linux_ppc.go syscall_linux_alarm.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build linux && ppc @@ -210,7 +210,7 @@ func Pause() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -227,7 +227,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -409,17 +409,6 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) @@ -707,3 +696,14 @@ func kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, f } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Alarm(seconds uint) (remaining uint, err error) { + r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0) + remaining = uint(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go index beeb49e34..3c5317046 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go @@ -1,4 +1,4 @@ -// go run mksyscall.go -tags linux,ppc64 syscall_linux.go syscall_linux_ppc64x.go +// go run mksyscall.go -tags linux,ppc64 syscall_linux.go syscall_linux_ppc64x.go syscall_linux_alarm.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build linux && ppc64 @@ -240,7 +240,7 @@ func Pause() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -257,7 +257,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -475,17 +475,6 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) @@ -753,3 +742,14 @@ func kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, f } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Alarm(seconds uint) (remaining uint, err error) { + r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0) + remaining = uint(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go index 53139b82c..a00c6744e 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go @@ -1,4 +1,4 @@ -// go run mksyscall.go -tags linux,ppc64le syscall_linux.go syscall_linux_ppc64x.go +// go run mksyscall.go -tags linux,ppc64le syscall_linux.go syscall_linux_ppc64x.go syscall_linux_alarm.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build linux && ppc64le @@ -240,7 +240,7 @@ func Pause() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -257,7 +257,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -475,17 +475,6 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) @@ -753,3 +742,14 @@ func kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, f } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Alarm(seconds uint) (remaining uint, err error) { + r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0) + remaining = uint(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go index 63b393b80..1239cc2de 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go @@ -180,7 +180,18 @@ func Listen(s int, n int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func MemfdSecret(flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_MEMFD_SECRET, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -197,7 +208,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -369,17 +380,6 @@ func Truncate(path string, length int64) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go index 202add37d..e0dabc602 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go @@ -1,4 +1,4 @@ -// go run mksyscall.go -tags linux,s390x syscall_linux.go syscall_linux_s390x.go +// go run mksyscall.go -tags linux,s390x syscall_linux.go syscall_linux_s390x.go syscall_linux_alarm.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build linux && s390x @@ -210,7 +210,7 @@ func Pause() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -227,7 +227,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -533,3 +533,14 @@ func kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, f } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Alarm(seconds uint) (remaining uint, err error) { + r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0) + remaining = uint(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go index 2ab268c34..368623c0f 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go @@ -1,4 +1,4 @@ -// go run mksyscall.go -tags linux,sparc64 syscall_linux.go syscall_linux_sparc64.go +// go run mksyscall.go -tags linux,sparc64 syscall_linux.go syscall_linux_sparc64.go syscall_linux_alarm.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build linux && sparc64 @@ -220,7 +220,7 @@ func Pause() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -237,7 +237,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -455,17 +455,6 @@ func Truncate(path string, length int64) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) @@ -697,3 +686,14 @@ func utimes(path string, times *[2]Timeval) (err error) { } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Alarm(seconds uint) (remaining uint, err error) { + r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0) + remaining = uint(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go index 51d0c0742..4af561a48 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go @@ -1330,7 +1330,7 @@ func Pathconf(path string, name int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -1347,7 +1347,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go index df2efb6db..3b90e9448 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go @@ -1330,7 +1330,7 @@ func Pathconf(path string, name int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -1347,7 +1347,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go index c8536c2c9..890f4ccd1 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go @@ -1330,7 +1330,7 @@ func Pathconf(path string, name int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -1347,7 +1347,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go index 8b981bfc2..c79f071fc 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go @@ -1330,7 +1330,7 @@ func Pathconf(path string, name int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -1347,7 +1347,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go index 8f80f4ade..2925fe0a7 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go @@ -1,4 +1,4 @@ -// go run mksyscall.go -l32 -openbsd -tags openbsd,386 syscall_bsd.go syscall_openbsd.go syscall_openbsd_386.go +// go run mksyscall.go -l32 -openbsd -libc -tags openbsd,386 syscall_bsd.go syscall_openbsd.go syscall_openbsd_386.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build openbsd && 386 @@ -16,7 +16,7 @@ var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(ngid int, gid *_Gid_t) (n int, err error) { - r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + r0, _, e1 := syscall_rawSyscall(libc_getgroups_trampoline_addr, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -24,20 +24,28 @@ func getgroups(ngid int, gid *_Gid_t) (n int, err error) { return } +var libc_getgroups_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getgroups getgroups "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(ngid int, gid *_Gid_t) (err error) { - _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + _, _, e1 := syscall_rawSyscall(libc_setgroups_trampoline_addr, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setgroups_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setgroups setgroups "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { - r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + r0, _, e1 := syscall_syscall6(libc_wait4_trampoline_addr, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -45,10 +53,14 @@ func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err return } +var libc_wait4_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_wait4 wait4 "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + r0, _, e1 := syscall_syscall(libc_accept_trampoline_addr, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -56,30 +68,42 @@ func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { return } +var libc_accept_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_accept accept "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { - _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + _, _, e1 := syscall_syscall(libc_bind_trampoline_addr, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_bind_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_bind bind "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { - _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + _, _, e1 := syscall_syscall(libc_connect_trampoline_addr, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_connect_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_connect connect "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { - r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + r0, _, e1 := syscall_rawSyscall(libc_socket_trampoline_addr, uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -87,66 +111,94 @@ func socket(domain int, typ int, proto int) (fd int, err error) { return } +var libc_socket_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_socket socket "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { - _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + _, _, e1 := syscall_syscall6(libc_getsockopt_trampoline_addr, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getsockopt_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getsockopt getsockopt "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { - _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + _, _, e1 := syscall_syscall6(libc_setsockopt_trampoline_addr, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setsockopt_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setsockopt setsockopt "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { - _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + _, _, e1 := syscall_rawSyscall(libc_getpeername_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getpeername_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpeername getpeername "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { - _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + _, _, e1 := syscall_rawSyscall(libc_getsockname_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getsockname_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getsockname getsockname "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(s int, how int) (err error) { - _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + _, _, e1 := syscall_syscall(libc_shutdown_trampoline_addr, uintptr(s), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_shutdown_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_shutdown shutdown "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { - _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + _, _, e1 := syscall_rawSyscall6(libc_socketpair_trampoline_addr, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_socketpair_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_socketpair socketpair "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { @@ -156,7 +208,7 @@ func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Sockl } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + r0, _, e1 := syscall_syscall6(libc_recvfrom_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -164,6 +216,10 @@ func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Sockl return } +var libc_recvfrom_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_recvfrom recvfrom "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { @@ -173,17 +229,21 @@ func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) ( } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + _, _, e1 := syscall_syscall6(libc_sendto_trampoline_addr, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_sendto_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_sendto sendto "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { - r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + r0, _, e1 := syscall_syscall(libc_recvmsg_trampoline_addr, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -191,10 +251,14 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { return } +var libc_recvmsg_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_recvmsg recvmsg "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { - r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + r0, _, e1 := syscall_syscall(libc_sendmsg_trampoline_addr, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -202,10 +266,14 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { return } +var libc_sendmsg_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_sendmsg sendmsg "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { - r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + r0, _, e1 := syscall_syscall6(libc_kevent_trampoline_addr, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -213,6 +281,10 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne return } +var libc_kevent_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_kevent kevent "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, timeval *[2]Timeval) (err error) { @@ -221,27 +293,35 @@ func utimes(path string, timeval *[2]Timeval) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + _, _, e1 := syscall_syscall(libc_utimes_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_utimes_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_utimes utimes "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimes(fd int, timeval *[2]Timeval) (err error) { - _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + _, _, e1 := syscall_syscall(libc_futimes_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_futimes_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_futimes futimes "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { - r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + r0, _, e1 := syscall_syscall(libc_poll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -249,6 +329,10 @@ func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { return } +var libc_poll_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_poll poll "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, behav int) (err error) { @@ -258,13 +342,17 @@ func Madvise(b []byte, behav int) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + _, _, e1 := syscall_syscall(libc_madvise_trampoline_addr, uintptr(_p0), uintptr(len(b)), uintptr(behav)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_madvise_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_madvise madvise "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { @@ -274,23 +362,31 @@ func Mlock(b []byte) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + _, _, e1 := syscall_syscall(libc_mlock_trampoline_addr, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mlock_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mlock mlock "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { - _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall(libc_mlockall_trampoline_addr, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mlockall_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mlockall mlockall "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { @@ -300,13 +396,17 @@ func Mprotect(b []byte, prot int) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + _, _, e1 := syscall_syscall(libc_mprotect_trampoline_addr, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mprotect_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mprotect mprotect "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Msync(b []byte, flags int) (err error) { @@ -316,13 +416,17 @@ func Msync(b []byte, flags int) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + _, _, e1 := syscall_syscall(libc_msync_trampoline_addr, uintptr(_p0), uintptr(len(b)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_msync_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_msync msync "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { @@ -332,33 +436,45 @@ func Munlock(b []byte) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + _, _, e1 := syscall_syscall(libc_munlock_trampoline_addr, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_munlock_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_munlock munlock "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { - _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + _, _, e1 := syscall_syscall(libc_munlockall_trampoline_addr, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_munlockall_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_munlockall munlockall "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe2(p *[2]_C_int, flags int) (err error) { - _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + _, _, e1 := syscall_rawSyscall(libc_pipe2_trampoline_addr, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_pipe2_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pipe2 pipe2 "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdents(fd int, buf []byte) (n int, err error) { @@ -368,7 +484,7 @@ func Getdents(fd int, buf []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + r0, _, e1 := syscall_syscall(libc_getdents_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -376,6 +492,10 @@ func Getdents(fd int, buf []byte) (n int, err error) { return } +var libc_getdents_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getdents getdents "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getcwd(buf []byte) (n int, err error) { @@ -385,7 +505,7 @@ func Getcwd(buf []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + r0, _, e1 := syscall_syscall(libc_getcwd_trampoline_addr, uintptr(_p0), uintptr(len(buf)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -393,16 +513,24 @@ func Getcwd(buf []byte) (n int, err error) { return } +var libc_getcwd_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getcwd getcwd "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req uint, arg uintptr) (err error) { - _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + _, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_ioctl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { @@ -412,17 +540,21 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + _, _, e1 := syscall_syscall6(libc_sysctl_trampoline_addr, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_sysctl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_sysctl sysctl "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { - r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + r0, _, e1 := syscall_syscall6(libc_ppoll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -430,6 +562,10 @@ func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, return } +var libc_ppoll_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_ppoll ppoll "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Access(path string, mode uint32) (err error) { @@ -438,23 +574,31 @@ func Access(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_access_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_access_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_access access "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { - _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + _, _, e1 := syscall_syscall(libc_adjtime_trampoline_addr, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_adjtime_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_adjtime adjtime "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { @@ -463,13 +607,17 @@ func Chdir(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_chdir_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chdir_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chdir chdir "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chflags(path string, flags int) (err error) { @@ -478,13 +626,17 @@ func Chflags(path string, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + _, _, e1 := syscall_syscall(libc_chflags_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chflags_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chflags chflags "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chmod(path string, mode uint32) (err error) { @@ -493,13 +645,17 @@ func Chmod(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_chmod_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chmod_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chmod chmod "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chown(path string, uid int, gid int) (err error) { @@ -508,13 +664,17 @@ func Chown(path string, uid int, gid int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + _, _, e1 := syscall_syscall(libc_chown_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chown_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chown chown "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { @@ -523,27 +683,35 @@ func Chroot(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_chroot_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chroot_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chroot chroot "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { - _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + _, _, e1 := syscall_syscall(libc_close_trampoline_addr, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_close_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_close close "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(fd int) (nfd int, err error) { - r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + r0, _, e1 := syscall_syscall(libc_dup_trampoline_addr, uintptr(fd), 0, 0) nfd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -551,33 +719,49 @@ func Dup(fd int) (nfd int, err error) { return } +var libc_dup_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_dup dup "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(from int, to int) (err error) { - _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + _, _, e1 := syscall_syscall(libc_dup2_trampoline_addr, uintptr(from), uintptr(to), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_dup2_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_dup2 dup2 "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup3(from int, to int, flags int) (err error) { - _, _, e1 := Syscall(SYS_DUP3, uintptr(from), uintptr(to), uintptr(flags)) + _, _, e1 := syscall_syscall(libc_dup3_trampoline_addr, uintptr(from), uintptr(to), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_dup3_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_dup3 dup3 "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { - Syscall(SYS_EXIT, uintptr(code), 0, 0) + syscall_syscall(libc_exit_trampoline_addr, uintptr(code), 0, 0) return } +var libc_exit_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_exit exit "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { @@ -586,43 +770,59 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall6(libc_faccessat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_faccessat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_faccessat faccessat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { - _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + _, _, e1 := syscall_syscall(libc_fchdir_trampoline_addr, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchdir_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchdir fchdir "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchflags(fd int, flags int) (err error) { - _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + _, _, e1 := syscall_syscall(libc_fchflags_trampoline_addr, uintptr(fd), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchflags_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchflags fchflags "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { - _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_fchmod_trampoline_addr, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchmod_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchmod fchmod "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { @@ -631,23 +831,31 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall6(libc_fchmodat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchmodat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchmodat fchmodat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { - _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + _, _, e1 := syscall_syscall(libc_fchown_trampoline_addr, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchown_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchown fchown "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { @@ -656,27 +864,35 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + _, _, e1 := syscall_syscall6(libc_fchownat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchownat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchownat fchownat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { - _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + _, _, e1 := syscall_syscall(libc_flock_trampoline_addr, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_flock_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_flock flock "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fpathconf(fd int, name int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + r0, _, e1 := syscall_syscall(libc_fpathconf_trampoline_addr, uintptr(fd), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -684,16 +900,24 @@ func Fpathconf(fd int, name int) (val int, err error) { return } +var libc_fpathconf_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fpathconf fpathconf "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { - _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_fstat_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fstat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fstat fstat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { @@ -702,71 +926,99 @@ func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall6(libc_fstatat_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fstatat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fstatat fstatat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatfs(fd int, stat *Statfs_t) (err error) { - _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_fstatfs_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fstatfs_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fstatfs fstatfs "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { - _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + _, _, e1 := syscall_syscall(libc_fsync_trampoline_addr, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fsync_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fsync fsync "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { - _, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + _, _, e1 := syscall_syscall(libc_ftruncate_trampoline_addr, uintptr(fd), uintptr(length), uintptr(length>>32)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_ftruncate_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_ftruncate ftruncate "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { - r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getegid_trampoline_addr, 0, 0, 0) egid = int(r0) return } +var libc_getegid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getegid getegid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (uid int) { - r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_geteuid_trampoline_addr, 0, 0, 0) uid = int(r0) return } +var libc_geteuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_geteuid geteuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { - r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getgid_trampoline_addr, 0, 0, 0) gid = int(r0) return } +var libc_getgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getgid getgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { - r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + r0, _, e1 := syscall_rawSyscall(libc_getpgid_trampoline_addr, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -774,34 +1026,50 @@ func Getpgid(pid int) (pgid int, err error) { return } +var libc_getpgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpgid getpgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgrp() (pgrp int) { - r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getpgrp_trampoline_addr, 0, 0, 0) pgrp = int(r0) return } +var libc_getpgrp_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpgrp getpgrp "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { - r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getpid_trampoline_addr, 0, 0, 0) pid = int(r0) return } +var libc_getpid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpid getpid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { - r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getppid_trampoline_addr, 0, 0, 0) ppid = int(r0) return } +var libc_getppid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getppid getppid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { - r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + r0, _, e1 := syscall_syscall(libc_getpriority_trampoline_addr, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -809,20 +1077,28 @@ func Getpriority(which int, who int) (prio int, err error) { return } +var libc_getpriority_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpriority getpriority "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + _, _, e1 := syscall_rawSyscall(libc_getrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getrlimit_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getrlimit getrlimit "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrtable() (rtable int, err error) { - r0, _, e1 := RawSyscall(SYS_GETRTABLE, 0, 0, 0) + r0, _, e1 := syscall_rawSyscall(libc_getrtable_trampoline_addr, 0, 0, 0) rtable = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -830,20 +1106,28 @@ func Getrtable() (rtable int, err error) { return } +var libc_getrtable_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getrtable getrtable "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { - _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + _, _, e1 := syscall_rawSyscall(libc_getrusage_trampoline_addr, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getrusage_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getrusage getrusage "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { - r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + r0, _, e1 := syscall_rawSyscall(libc_getsid_trampoline_addr, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -851,46 +1135,66 @@ func Getsid(pid int) (sid int, err error) { return } +var libc_getsid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getsid getsid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettimeofday(tv *Timeval) (err error) { - _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_gettimeofday_trampoline_addr, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_gettimeofday_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_gettimeofday gettimeofday "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { - r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getuid_trampoline_addr, 0, 0, 0) uid = int(r0) return } +var libc_getuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getuid getuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Issetugid() (tainted bool) { - r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + r0, _, _ := syscall_syscall(libc_issetugid_trampoline_addr, 0, 0, 0) tainted = bool(r0 != 0) return } +var libc_issetugid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_issetugid issetugid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kill(pid int, signum syscall.Signal) (err error) { - _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + _, _, e1 := syscall_syscall(libc_kill_trampoline_addr, uintptr(pid), uintptr(signum), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_kill_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_kill kill "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kqueue() (fd int, err error) { - r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + r0, _, e1 := syscall_syscall(libc_kqueue_trampoline_addr, 0, 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -898,6 +1202,10 @@ func Kqueue() (fd int, err error) { return } +var libc_kqueue_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_kqueue kqueue "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { @@ -906,13 +1214,17 @@ func Lchown(path string, uid int, gid int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + _, _, e1 := syscall_syscall(libc_lchown_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_lchown_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_lchown lchown "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Link(path string, link string) (err error) { @@ -926,13 +1238,17 @@ func Link(path string, link string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + _, _, e1 := syscall_syscall(libc_link_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_link_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_link link "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { @@ -946,23 +1262,31 @@ func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err er if err != nil { return } - _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + _, _, e1 := syscall_syscall6(libc_linkat_trampoline_addr, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_linkat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_linkat linkat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, backlog int) (err error) { - _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + _, _, e1 := syscall_syscall(libc_listen_trampoline_addr, uintptr(s), uintptr(backlog), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_listen_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_listen listen "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { @@ -971,13 +1295,17 @@ func Lstat(path string, stat *Stat_t) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_lstat_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_lstat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_lstat lstat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdir(path string, mode uint32) (err error) { @@ -986,13 +1314,17 @@ func Mkdir(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_mkdir_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mkdir_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mkdir mkdir "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdirat(dirfd int, path string, mode uint32) (err error) { @@ -1001,13 +1333,17 @@ func Mkdirat(dirfd int, path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + _, _, e1 := syscall_syscall(libc_mkdirat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mkdirat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mkdirat mkdirat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifo(path string, mode uint32) (err error) { @@ -1016,13 +1352,17 @@ func Mkfifo(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_mkfifo_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mkfifo_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mkfifo mkfifo "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifoat(dirfd int, path string, mode uint32) (err error) { @@ -1031,13 +1371,17 @@ func Mkfifoat(dirfd int, path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKFIFOAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + _, _, e1 := syscall_syscall(libc_mkfifoat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mkfifoat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mkfifoat mkfifoat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknod(path string, mode uint32, dev int) (err error) { @@ -1046,13 +1390,17 @@ func Mknod(path string, mode uint32, dev int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + _, _, e1 := syscall_syscall(libc_mknod_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mknod_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mknod mknod "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { @@ -1061,23 +1409,31 @@ func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + _, _, e1 := syscall_syscall6(libc_mknodat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mknodat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mknodat mknodat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Nanosleep(time *Timespec, leftover *Timespec) (err error) { - _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + _, _, e1 := syscall_syscall(libc_nanosleep_trampoline_addr, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_nanosleep_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_nanosleep nanosleep "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Open(path string, mode int, perm uint32) (fd int, err error) { @@ -1086,7 +1442,7 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { if err != nil { return } - r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + r0, _, e1 := syscall_syscall(libc_open_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1094,6 +1450,10 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { return } +var libc_open_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_open open "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { @@ -1102,7 +1462,7 @@ func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { if err != nil { return } - r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + r0, _, e1 := syscall_syscall6(libc_openat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1110,6 +1470,10 @@ func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { return } +var libc_openat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_openat openat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pathconf(path string, name int) (val int, err error) { @@ -1118,7 +1482,7 @@ func Pathconf(path string, name int) (val int, err error) { if err != nil { return } - r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + r0, _, e1 := syscall_syscall(libc_pathconf_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1126,16 +1490,20 @@ func Pathconf(path string, name int) (val int, err error) { return } +var libc_pathconf_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pathconf pathconf "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + r0, _, e1 := syscall_syscall6(libc_pread_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1143,16 +1511,20 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { return } +var libc_pread_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pread pread "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + r0, _, e1 := syscall_syscall6(libc_pwrite_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1160,6 +1532,10 @@ func Pwrite(fd int, p []byte, offset int64) (n int, err error) { return } +var libc_pwrite_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pwrite pwrite "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { @@ -1169,7 +1545,7 @@ func read(fd int, p []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1177,6 +1553,10 @@ func read(fd int, p []byte) (n int, err error) { return } +var libc_read_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_read read "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlink(path string, buf []byte) (n int, err error) { @@ -1191,7 +1571,7 @@ func Readlink(path string, buf []byte) (n int, err error) { } else { _p1 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + r0, _, e1 := syscall_syscall(libc_readlink_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1199,6 +1579,10 @@ func Readlink(path string, buf []byte) (n int, err error) { return } +var libc_readlink_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_readlink readlink "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { @@ -1213,7 +1597,7 @@ func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { } else { _p1 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + r0, _, e1 := syscall_syscall6(libc_readlinkat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1221,6 +1605,10 @@ func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { return } +var libc_readlinkat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_readlinkat readlinkat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rename(from string, to string) (err error) { @@ -1234,13 +1622,17 @@ func Rename(from string, to string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + _, _, e1 := syscall_syscall(libc_rename_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_rename_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_rename rename "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Renameat(fromfd int, from string, tofd int, to string) (err error) { @@ -1254,13 +1646,17 @@ func Renameat(fromfd int, from string, tofd int, to string) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + _, _, e1 := syscall_syscall6(libc_renameat_trampoline_addr, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_renameat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_renameat renameat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Revoke(path string) (err error) { @@ -1269,13 +1665,17 @@ func Revoke(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_revoke_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_revoke_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_revoke revoke "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rmdir(path string) (err error) { @@ -1284,17 +1684,21 @@ func Rmdir(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_rmdir_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_rmdir_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_rmdir rmdir "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { - r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) + r0, r1, e1 := syscall_syscall6(libc_lseek_trampoline_addr, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(whence), 0, 0) newoffset = int64(int64(r1)<<32 | int64(r0)) if e1 != 0 { err = errnoErr(e1) @@ -1302,10 +1706,14 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { return } +var libc_lseek_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_lseek lseek "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { - r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + r0, _, e1 := syscall_syscall6(libc_select_trampoline_addr, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1313,36 +1721,52 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err return } +var libc_select_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_select select "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setegid(egid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_setegid_trampoline_addr, uintptr(egid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setegid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setegid setegid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seteuid(euid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_seteuid_trampoline_addr, uintptr(euid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_seteuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_seteuid seteuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setgid(gid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_setgid_trampoline_addr, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setgid setgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setlogin(name string) (err error) { @@ -1351,97 +1775,133 @@ func Setlogin(name string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_setlogin_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setlogin_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setlogin setlogin "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + _, _, e1 := syscall_rawSyscall(libc_setpgid_trampoline_addr, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setpgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setpgid setpgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { - _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + _, _, e1 := syscall_syscall(libc_setpriority_trampoline_addr, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setpriority_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setpriority setpriority "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + _, _, e1 := syscall_rawSyscall(libc_setregid_trampoline_addr, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setregid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setregid setregid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + _, _, e1 := syscall_rawSyscall(libc_setreuid_trampoline_addr, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setreuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setreuid setreuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresgid(rgid int, egid int, sgid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + _, _, e1 := syscall_rawSyscall(libc_setresgid_trampoline_addr, uintptr(rgid), uintptr(egid), uintptr(sgid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setresgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setresgid setresgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresuid(ruid int, euid int, suid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + _, _, e1 := syscall_rawSyscall(libc_setresuid_trampoline_addr, uintptr(ruid), uintptr(euid), uintptr(suid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setresuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setresuid setresuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + _, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setrlimit_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrtable(rtable int) (err error) { - _, _, e1 := RawSyscall(SYS_SETRTABLE, uintptr(rtable), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_setrtable_trampoline_addr, uintptr(rtable), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setrtable_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setrtable setrtable "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { - r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + r0, _, e1 := syscall_rawSyscall(libc_setsid_trampoline_addr, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1449,26 +1909,38 @@ func Setsid() (pid int, err error) { return } +var libc_setsid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setsid setsid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tp *Timeval) (err error) { - _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_settimeofday_trampoline_addr, uintptr(unsafe.Pointer(tp)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_settimeofday_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_settimeofday settimeofday "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setuid(uid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_setuid_trampoline_addr, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setuid setuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { @@ -1477,13 +1949,17 @@ func Stat(path string, stat *Stat_t) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_stat_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_stat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_stat stat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Statfs(path string, stat *Statfs_t) (err error) { @@ -1492,13 +1968,17 @@ func Statfs(path string, stat *Statfs_t) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_statfs_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_statfs_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_statfs statfs "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlink(path string, link string) (err error) { @@ -1512,13 +1992,17 @@ func Symlink(path string, link string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + _, _, e1 := syscall_syscall(libc_symlink_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_symlink_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_symlink symlink "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { @@ -1532,23 +2016,31 @@ func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + _, _, e1 := syscall_syscall(libc_symlinkat_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) if e1 != 0 { err = errnoErr(e1) } return } +var libc_symlinkat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_symlinkat symlinkat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() (err error) { - _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + _, _, e1 := syscall_syscall(libc_sync_trampoline_addr, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_sync_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_sync sync "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { @@ -1557,21 +2049,29 @@ func Truncate(path string, length int64) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + _, _, e1 := syscall_syscall(libc_truncate_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(length), uintptr(length>>32)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_truncate_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_truncate truncate "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(newmask int) (oldmask int) { - r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + r0, _, _ := syscall_syscall(libc_umask_trampoline_addr, uintptr(newmask), 0, 0) oldmask = int(r0) return } +var libc_umask_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_umask umask "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlink(path string) (err error) { @@ -1580,13 +2080,17 @@ func Unlink(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_unlink_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_unlink_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_unlink unlink "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlinkat(dirfd int, path string, flags int) (err error) { @@ -1595,13 +2099,17 @@ func Unlinkat(dirfd int, path string, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + _, _, e1 := syscall_syscall(libc_unlinkat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_unlinkat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_unlinkat unlinkat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(path string, flags int) (err error) { @@ -1610,13 +2118,17 @@ func Unmount(path string, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + _, _, e1 := syscall_syscall(libc_unmount_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_unmount_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_unmount unmount "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { @@ -1626,7 +2138,7 @@ func write(fd int, p []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1634,10 +2146,14 @@ func write(fd int, p []byte) (n int, err error) { return } +var libc_write_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_write write "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { - r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) + r0, _, e1 := syscall_syscall9(libc_mmap_trampoline_addr, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos), uintptr(pos>>32), 0, 0) ret = uintptr(r0) if e1 != 0 { err = errnoErr(e1) @@ -1645,20 +2161,28 @@ func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) ( return } +var libc_mmap_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mmap mmap "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { - _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + _, _, e1 := syscall_syscall(libc_munmap_trampoline_addr, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_munmap_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_munmap munmap "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1669,7 +2193,7 @@ func readlen(fd int, buf *byte, nbuf int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1685,9 +2209,13 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error if err != nil { return } - _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall6(libc_utimensat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } + +var libc_utimensat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_utimensat utimensat "libc.so" diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s new file mode 100644 index 000000000..75eb2f5f3 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s @@ -0,0 +1,796 @@ +// go run mkasm.go openbsd 386 +// Code generated by the command above; DO NOT EDIT. + +#include "textflag.h" + +TEXT libc_getgroups_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getgroups(SB) + +GLOBL ·libc_getgroups_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getgroups_trampoline_addr(SB)/4, $libc_getgroups_trampoline<>(SB) + +TEXT libc_setgroups_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setgroups(SB) + +GLOBL ·libc_setgroups_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setgroups_trampoline_addr(SB)/4, $libc_setgroups_trampoline<>(SB) + +TEXT libc_wait4_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_wait4(SB) + +GLOBL ·libc_wait4_trampoline_addr(SB), RODATA, $4 +DATA ·libc_wait4_trampoline_addr(SB)/4, $libc_wait4_trampoline<>(SB) + +TEXT libc_accept_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_accept(SB) + +GLOBL ·libc_accept_trampoline_addr(SB), RODATA, $4 +DATA ·libc_accept_trampoline_addr(SB)/4, $libc_accept_trampoline<>(SB) + +TEXT libc_bind_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_bind(SB) + +GLOBL ·libc_bind_trampoline_addr(SB), RODATA, $4 +DATA ·libc_bind_trampoline_addr(SB)/4, $libc_bind_trampoline<>(SB) + +TEXT libc_connect_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_connect(SB) + +GLOBL ·libc_connect_trampoline_addr(SB), RODATA, $4 +DATA ·libc_connect_trampoline_addr(SB)/4, $libc_connect_trampoline<>(SB) + +TEXT libc_socket_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_socket(SB) + +GLOBL ·libc_socket_trampoline_addr(SB), RODATA, $4 +DATA ·libc_socket_trampoline_addr(SB)/4, $libc_socket_trampoline<>(SB) + +TEXT libc_getsockopt_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getsockopt(SB) + +GLOBL ·libc_getsockopt_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getsockopt_trampoline_addr(SB)/4, $libc_getsockopt_trampoline<>(SB) + +TEXT libc_setsockopt_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setsockopt(SB) + +GLOBL ·libc_setsockopt_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setsockopt_trampoline_addr(SB)/4, $libc_setsockopt_trampoline<>(SB) + +TEXT libc_getpeername_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpeername(SB) + +GLOBL ·libc_getpeername_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getpeername_trampoline_addr(SB)/4, $libc_getpeername_trampoline<>(SB) + +TEXT libc_getsockname_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getsockname(SB) + +GLOBL ·libc_getsockname_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getsockname_trampoline_addr(SB)/4, $libc_getsockname_trampoline<>(SB) + +TEXT libc_shutdown_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_shutdown(SB) + +GLOBL ·libc_shutdown_trampoline_addr(SB), RODATA, $4 +DATA ·libc_shutdown_trampoline_addr(SB)/4, $libc_shutdown_trampoline<>(SB) + +TEXT libc_socketpair_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_socketpair(SB) + +GLOBL ·libc_socketpair_trampoline_addr(SB), RODATA, $4 +DATA ·libc_socketpair_trampoline_addr(SB)/4, $libc_socketpair_trampoline<>(SB) + +TEXT libc_recvfrom_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_recvfrom(SB) + +GLOBL ·libc_recvfrom_trampoline_addr(SB), RODATA, $4 +DATA ·libc_recvfrom_trampoline_addr(SB)/4, $libc_recvfrom_trampoline<>(SB) + +TEXT libc_sendto_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_sendto(SB) + +GLOBL ·libc_sendto_trampoline_addr(SB), RODATA, $4 +DATA ·libc_sendto_trampoline_addr(SB)/4, $libc_sendto_trampoline<>(SB) + +TEXT libc_recvmsg_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_recvmsg(SB) + +GLOBL ·libc_recvmsg_trampoline_addr(SB), RODATA, $4 +DATA ·libc_recvmsg_trampoline_addr(SB)/4, $libc_recvmsg_trampoline<>(SB) + +TEXT libc_sendmsg_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_sendmsg(SB) + +GLOBL ·libc_sendmsg_trampoline_addr(SB), RODATA, $4 +DATA ·libc_sendmsg_trampoline_addr(SB)/4, $libc_sendmsg_trampoline<>(SB) + +TEXT libc_kevent_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_kevent(SB) + +GLOBL ·libc_kevent_trampoline_addr(SB), RODATA, $4 +DATA ·libc_kevent_trampoline_addr(SB)/4, $libc_kevent_trampoline<>(SB) + +TEXT libc_utimes_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_utimes(SB) + +GLOBL ·libc_utimes_trampoline_addr(SB), RODATA, $4 +DATA ·libc_utimes_trampoline_addr(SB)/4, $libc_utimes_trampoline<>(SB) + +TEXT libc_futimes_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_futimes(SB) + +GLOBL ·libc_futimes_trampoline_addr(SB), RODATA, $4 +DATA ·libc_futimes_trampoline_addr(SB)/4, $libc_futimes_trampoline<>(SB) + +TEXT libc_poll_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_poll(SB) + +GLOBL ·libc_poll_trampoline_addr(SB), RODATA, $4 +DATA ·libc_poll_trampoline_addr(SB)/4, $libc_poll_trampoline<>(SB) + +TEXT libc_madvise_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_madvise(SB) + +GLOBL ·libc_madvise_trampoline_addr(SB), RODATA, $4 +DATA ·libc_madvise_trampoline_addr(SB)/4, $libc_madvise_trampoline<>(SB) + +TEXT libc_mlock_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mlock(SB) + +GLOBL ·libc_mlock_trampoline_addr(SB), RODATA, $4 +DATA ·libc_mlock_trampoline_addr(SB)/4, $libc_mlock_trampoline<>(SB) + +TEXT libc_mlockall_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mlockall(SB) + +GLOBL ·libc_mlockall_trampoline_addr(SB), RODATA, $4 +DATA ·libc_mlockall_trampoline_addr(SB)/4, $libc_mlockall_trampoline<>(SB) + +TEXT libc_mprotect_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mprotect(SB) + +GLOBL ·libc_mprotect_trampoline_addr(SB), RODATA, $4 +DATA ·libc_mprotect_trampoline_addr(SB)/4, $libc_mprotect_trampoline<>(SB) + +TEXT libc_msync_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_msync(SB) + +GLOBL ·libc_msync_trampoline_addr(SB), RODATA, $4 +DATA ·libc_msync_trampoline_addr(SB)/4, $libc_msync_trampoline<>(SB) + +TEXT libc_munlock_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_munlock(SB) + +GLOBL ·libc_munlock_trampoline_addr(SB), RODATA, $4 +DATA ·libc_munlock_trampoline_addr(SB)/4, $libc_munlock_trampoline<>(SB) + +TEXT libc_munlockall_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_munlockall(SB) + +GLOBL ·libc_munlockall_trampoline_addr(SB), RODATA, $4 +DATA ·libc_munlockall_trampoline_addr(SB)/4, $libc_munlockall_trampoline<>(SB) + +TEXT libc_pipe2_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pipe2(SB) + +GLOBL ·libc_pipe2_trampoline_addr(SB), RODATA, $4 +DATA ·libc_pipe2_trampoline_addr(SB)/4, $libc_pipe2_trampoline<>(SB) + +TEXT libc_getdents_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getdents(SB) + +GLOBL ·libc_getdents_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getdents_trampoline_addr(SB)/4, $libc_getdents_trampoline<>(SB) + +TEXT libc_getcwd_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getcwd(SB) + +GLOBL ·libc_getcwd_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getcwd_trampoline_addr(SB)/4, $libc_getcwd_trampoline<>(SB) + +TEXT libc_ioctl_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_ioctl(SB) + +GLOBL ·libc_ioctl_trampoline_addr(SB), RODATA, $4 +DATA ·libc_ioctl_trampoline_addr(SB)/4, $libc_ioctl_trampoline<>(SB) + +TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_sysctl(SB) + +GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $4 +DATA ·libc_sysctl_trampoline_addr(SB)/4, $libc_sysctl_trampoline<>(SB) + +TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_ppoll(SB) + +GLOBL ·libc_ppoll_trampoline_addr(SB), RODATA, $4 +DATA ·libc_ppoll_trampoline_addr(SB)/4, $libc_ppoll_trampoline<>(SB) + +TEXT libc_access_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_access(SB) + +GLOBL ·libc_access_trampoline_addr(SB), RODATA, $4 +DATA ·libc_access_trampoline_addr(SB)/4, $libc_access_trampoline<>(SB) + +TEXT libc_adjtime_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_adjtime(SB) + +GLOBL ·libc_adjtime_trampoline_addr(SB), RODATA, $4 +DATA ·libc_adjtime_trampoline_addr(SB)/4, $libc_adjtime_trampoline<>(SB) + +TEXT libc_chdir_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chdir(SB) + +GLOBL ·libc_chdir_trampoline_addr(SB), RODATA, $4 +DATA ·libc_chdir_trampoline_addr(SB)/4, $libc_chdir_trampoline<>(SB) + +TEXT libc_chflags_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chflags(SB) + +GLOBL ·libc_chflags_trampoline_addr(SB), RODATA, $4 +DATA ·libc_chflags_trampoline_addr(SB)/4, $libc_chflags_trampoline<>(SB) + +TEXT libc_chmod_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chmod(SB) + +GLOBL ·libc_chmod_trampoline_addr(SB), RODATA, $4 +DATA ·libc_chmod_trampoline_addr(SB)/4, $libc_chmod_trampoline<>(SB) + +TEXT libc_chown_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chown(SB) + +GLOBL ·libc_chown_trampoline_addr(SB), RODATA, $4 +DATA ·libc_chown_trampoline_addr(SB)/4, $libc_chown_trampoline<>(SB) + +TEXT libc_chroot_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chroot(SB) + +GLOBL ·libc_chroot_trampoline_addr(SB), RODATA, $4 +DATA ·libc_chroot_trampoline_addr(SB)/4, $libc_chroot_trampoline<>(SB) + +TEXT libc_close_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_close(SB) + +GLOBL ·libc_close_trampoline_addr(SB), RODATA, $4 +DATA ·libc_close_trampoline_addr(SB)/4, $libc_close_trampoline<>(SB) + +TEXT libc_dup_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_dup(SB) + +GLOBL ·libc_dup_trampoline_addr(SB), RODATA, $4 +DATA ·libc_dup_trampoline_addr(SB)/4, $libc_dup_trampoline<>(SB) + +TEXT libc_dup2_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_dup2(SB) + +GLOBL ·libc_dup2_trampoline_addr(SB), RODATA, $4 +DATA ·libc_dup2_trampoline_addr(SB)/4, $libc_dup2_trampoline<>(SB) + +TEXT libc_dup3_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_dup3(SB) + +GLOBL ·libc_dup3_trampoline_addr(SB), RODATA, $4 +DATA ·libc_dup3_trampoline_addr(SB)/4, $libc_dup3_trampoline<>(SB) + +TEXT libc_exit_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_exit(SB) + +GLOBL ·libc_exit_trampoline_addr(SB), RODATA, $4 +DATA ·libc_exit_trampoline_addr(SB)/4, $libc_exit_trampoline<>(SB) + +TEXT libc_faccessat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_faccessat(SB) + +GLOBL ·libc_faccessat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_faccessat_trampoline_addr(SB)/4, $libc_faccessat_trampoline<>(SB) + +TEXT libc_fchdir_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchdir(SB) + +GLOBL ·libc_fchdir_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fchdir_trampoline_addr(SB)/4, $libc_fchdir_trampoline<>(SB) + +TEXT libc_fchflags_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchflags(SB) + +GLOBL ·libc_fchflags_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fchflags_trampoline_addr(SB)/4, $libc_fchflags_trampoline<>(SB) + +TEXT libc_fchmod_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchmod(SB) + +GLOBL ·libc_fchmod_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fchmod_trampoline_addr(SB)/4, $libc_fchmod_trampoline<>(SB) + +TEXT libc_fchmodat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchmodat(SB) + +GLOBL ·libc_fchmodat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fchmodat_trampoline_addr(SB)/4, $libc_fchmodat_trampoline<>(SB) + +TEXT libc_fchown_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchown(SB) + +GLOBL ·libc_fchown_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fchown_trampoline_addr(SB)/4, $libc_fchown_trampoline<>(SB) + +TEXT libc_fchownat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchownat(SB) + +GLOBL ·libc_fchownat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fchownat_trampoline_addr(SB)/4, $libc_fchownat_trampoline<>(SB) + +TEXT libc_flock_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_flock(SB) + +GLOBL ·libc_flock_trampoline_addr(SB), RODATA, $4 +DATA ·libc_flock_trampoline_addr(SB)/4, $libc_flock_trampoline<>(SB) + +TEXT libc_fpathconf_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fpathconf(SB) + +GLOBL ·libc_fpathconf_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fpathconf_trampoline_addr(SB)/4, $libc_fpathconf_trampoline<>(SB) + +TEXT libc_fstat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fstat(SB) + +GLOBL ·libc_fstat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fstat_trampoline_addr(SB)/4, $libc_fstat_trampoline<>(SB) + +TEXT libc_fstatat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fstatat(SB) + +GLOBL ·libc_fstatat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fstatat_trampoline_addr(SB)/4, $libc_fstatat_trampoline<>(SB) + +TEXT libc_fstatfs_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fstatfs(SB) + +GLOBL ·libc_fstatfs_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fstatfs_trampoline_addr(SB)/4, $libc_fstatfs_trampoline<>(SB) + +TEXT libc_fsync_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fsync(SB) + +GLOBL ·libc_fsync_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fsync_trampoline_addr(SB)/4, $libc_fsync_trampoline<>(SB) + +TEXT libc_ftruncate_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_ftruncate(SB) + +GLOBL ·libc_ftruncate_trampoline_addr(SB), RODATA, $4 +DATA ·libc_ftruncate_trampoline_addr(SB)/4, $libc_ftruncate_trampoline<>(SB) + +TEXT libc_getegid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getegid(SB) + +GLOBL ·libc_getegid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getegid_trampoline_addr(SB)/4, $libc_getegid_trampoline<>(SB) + +TEXT libc_geteuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_geteuid(SB) + +GLOBL ·libc_geteuid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_geteuid_trampoline_addr(SB)/4, $libc_geteuid_trampoline<>(SB) + +TEXT libc_getgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getgid(SB) + +GLOBL ·libc_getgid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getgid_trampoline_addr(SB)/4, $libc_getgid_trampoline<>(SB) + +TEXT libc_getpgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpgid(SB) + +GLOBL ·libc_getpgid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getpgid_trampoline_addr(SB)/4, $libc_getpgid_trampoline<>(SB) + +TEXT libc_getpgrp_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpgrp(SB) + +GLOBL ·libc_getpgrp_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getpgrp_trampoline_addr(SB)/4, $libc_getpgrp_trampoline<>(SB) + +TEXT libc_getpid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpid(SB) + +GLOBL ·libc_getpid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getpid_trampoline_addr(SB)/4, $libc_getpid_trampoline<>(SB) + +TEXT libc_getppid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getppid(SB) + +GLOBL ·libc_getppid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getppid_trampoline_addr(SB)/4, $libc_getppid_trampoline<>(SB) + +TEXT libc_getpriority_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpriority(SB) + +GLOBL ·libc_getpriority_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getpriority_trampoline_addr(SB)/4, $libc_getpriority_trampoline<>(SB) + +TEXT libc_getrlimit_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getrlimit(SB) + +GLOBL ·libc_getrlimit_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getrlimit_trampoline_addr(SB)/4, $libc_getrlimit_trampoline<>(SB) + +TEXT libc_getrtable_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getrtable(SB) + +GLOBL ·libc_getrtable_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getrtable_trampoline_addr(SB)/4, $libc_getrtable_trampoline<>(SB) + +TEXT libc_getrusage_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getrusage(SB) + +GLOBL ·libc_getrusage_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getrusage_trampoline_addr(SB)/4, $libc_getrusage_trampoline<>(SB) + +TEXT libc_getsid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getsid(SB) + +GLOBL ·libc_getsid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getsid_trampoline_addr(SB)/4, $libc_getsid_trampoline<>(SB) + +TEXT libc_gettimeofday_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_gettimeofday(SB) + +GLOBL ·libc_gettimeofday_trampoline_addr(SB), RODATA, $4 +DATA ·libc_gettimeofday_trampoline_addr(SB)/4, $libc_gettimeofday_trampoline<>(SB) + +TEXT libc_getuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getuid(SB) + +GLOBL ·libc_getuid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getuid_trampoline_addr(SB)/4, $libc_getuid_trampoline<>(SB) + +TEXT libc_issetugid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_issetugid(SB) + +GLOBL ·libc_issetugid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_issetugid_trampoline_addr(SB)/4, $libc_issetugid_trampoline<>(SB) + +TEXT libc_kill_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_kill(SB) + +GLOBL ·libc_kill_trampoline_addr(SB), RODATA, $4 +DATA ·libc_kill_trampoline_addr(SB)/4, $libc_kill_trampoline<>(SB) + +TEXT libc_kqueue_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_kqueue(SB) + +GLOBL ·libc_kqueue_trampoline_addr(SB), RODATA, $4 +DATA ·libc_kqueue_trampoline_addr(SB)/4, $libc_kqueue_trampoline<>(SB) + +TEXT libc_lchown_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_lchown(SB) + +GLOBL ·libc_lchown_trampoline_addr(SB), RODATA, $4 +DATA ·libc_lchown_trampoline_addr(SB)/4, $libc_lchown_trampoline<>(SB) + +TEXT libc_link_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_link(SB) + +GLOBL ·libc_link_trampoline_addr(SB), RODATA, $4 +DATA ·libc_link_trampoline_addr(SB)/4, $libc_link_trampoline<>(SB) + +TEXT libc_linkat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_linkat(SB) + +GLOBL ·libc_linkat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_linkat_trampoline_addr(SB)/4, $libc_linkat_trampoline<>(SB) + +TEXT libc_listen_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_listen(SB) + +GLOBL ·libc_listen_trampoline_addr(SB), RODATA, $4 +DATA ·libc_listen_trampoline_addr(SB)/4, $libc_listen_trampoline<>(SB) + +TEXT libc_lstat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_lstat(SB) + +GLOBL ·libc_lstat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_lstat_trampoline_addr(SB)/4, $libc_lstat_trampoline<>(SB) + +TEXT libc_mkdir_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mkdir(SB) + +GLOBL ·libc_mkdir_trampoline_addr(SB), RODATA, $4 +DATA ·libc_mkdir_trampoline_addr(SB)/4, $libc_mkdir_trampoline<>(SB) + +TEXT libc_mkdirat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mkdirat(SB) + +GLOBL ·libc_mkdirat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_mkdirat_trampoline_addr(SB)/4, $libc_mkdirat_trampoline<>(SB) + +TEXT libc_mkfifo_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mkfifo(SB) + +GLOBL ·libc_mkfifo_trampoline_addr(SB), RODATA, $4 +DATA ·libc_mkfifo_trampoline_addr(SB)/4, $libc_mkfifo_trampoline<>(SB) + +TEXT libc_mkfifoat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mkfifoat(SB) + +GLOBL ·libc_mkfifoat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_mkfifoat_trampoline_addr(SB)/4, $libc_mkfifoat_trampoline<>(SB) + +TEXT libc_mknod_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mknod(SB) + +GLOBL ·libc_mknod_trampoline_addr(SB), RODATA, $4 +DATA ·libc_mknod_trampoline_addr(SB)/4, $libc_mknod_trampoline<>(SB) + +TEXT libc_mknodat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mknodat(SB) + +GLOBL ·libc_mknodat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_mknodat_trampoline_addr(SB)/4, $libc_mknodat_trampoline<>(SB) + +TEXT libc_nanosleep_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_nanosleep(SB) + +GLOBL ·libc_nanosleep_trampoline_addr(SB), RODATA, $4 +DATA ·libc_nanosleep_trampoline_addr(SB)/4, $libc_nanosleep_trampoline<>(SB) + +TEXT libc_open_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_open(SB) + +GLOBL ·libc_open_trampoline_addr(SB), RODATA, $4 +DATA ·libc_open_trampoline_addr(SB)/4, $libc_open_trampoline<>(SB) + +TEXT libc_openat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_openat(SB) + +GLOBL ·libc_openat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_openat_trampoline_addr(SB)/4, $libc_openat_trampoline<>(SB) + +TEXT libc_pathconf_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pathconf(SB) + +GLOBL ·libc_pathconf_trampoline_addr(SB), RODATA, $4 +DATA ·libc_pathconf_trampoline_addr(SB)/4, $libc_pathconf_trampoline<>(SB) + +TEXT libc_pread_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pread(SB) + +GLOBL ·libc_pread_trampoline_addr(SB), RODATA, $4 +DATA ·libc_pread_trampoline_addr(SB)/4, $libc_pread_trampoline<>(SB) + +TEXT libc_pwrite_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pwrite(SB) + +GLOBL ·libc_pwrite_trampoline_addr(SB), RODATA, $4 +DATA ·libc_pwrite_trampoline_addr(SB)/4, $libc_pwrite_trampoline<>(SB) + +TEXT libc_read_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_read(SB) + +GLOBL ·libc_read_trampoline_addr(SB), RODATA, $4 +DATA ·libc_read_trampoline_addr(SB)/4, $libc_read_trampoline<>(SB) + +TEXT libc_readlink_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_readlink(SB) + +GLOBL ·libc_readlink_trampoline_addr(SB), RODATA, $4 +DATA ·libc_readlink_trampoline_addr(SB)/4, $libc_readlink_trampoline<>(SB) + +TEXT libc_readlinkat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_readlinkat(SB) + +GLOBL ·libc_readlinkat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_readlinkat_trampoline_addr(SB)/4, $libc_readlinkat_trampoline<>(SB) + +TEXT libc_rename_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_rename(SB) + +GLOBL ·libc_rename_trampoline_addr(SB), RODATA, $4 +DATA ·libc_rename_trampoline_addr(SB)/4, $libc_rename_trampoline<>(SB) + +TEXT libc_renameat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_renameat(SB) + +GLOBL ·libc_renameat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_renameat_trampoline_addr(SB)/4, $libc_renameat_trampoline<>(SB) + +TEXT libc_revoke_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_revoke(SB) + +GLOBL ·libc_revoke_trampoline_addr(SB), RODATA, $4 +DATA ·libc_revoke_trampoline_addr(SB)/4, $libc_revoke_trampoline<>(SB) + +TEXT libc_rmdir_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_rmdir(SB) + +GLOBL ·libc_rmdir_trampoline_addr(SB), RODATA, $4 +DATA ·libc_rmdir_trampoline_addr(SB)/4, $libc_rmdir_trampoline<>(SB) + +TEXT libc_lseek_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_lseek(SB) + +GLOBL ·libc_lseek_trampoline_addr(SB), RODATA, $4 +DATA ·libc_lseek_trampoline_addr(SB)/4, $libc_lseek_trampoline<>(SB) + +TEXT libc_select_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_select(SB) + +GLOBL ·libc_select_trampoline_addr(SB), RODATA, $4 +DATA ·libc_select_trampoline_addr(SB)/4, $libc_select_trampoline<>(SB) + +TEXT libc_setegid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setegid(SB) + +GLOBL ·libc_setegid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setegid_trampoline_addr(SB)/4, $libc_setegid_trampoline<>(SB) + +TEXT libc_seteuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_seteuid(SB) + +GLOBL ·libc_seteuid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_seteuid_trampoline_addr(SB)/4, $libc_seteuid_trampoline<>(SB) + +TEXT libc_setgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setgid(SB) + +GLOBL ·libc_setgid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setgid_trampoline_addr(SB)/4, $libc_setgid_trampoline<>(SB) + +TEXT libc_setlogin_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setlogin(SB) + +GLOBL ·libc_setlogin_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setlogin_trampoline_addr(SB)/4, $libc_setlogin_trampoline<>(SB) + +TEXT libc_setpgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setpgid(SB) + +GLOBL ·libc_setpgid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setpgid_trampoline_addr(SB)/4, $libc_setpgid_trampoline<>(SB) + +TEXT libc_setpriority_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setpriority(SB) + +GLOBL ·libc_setpriority_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setpriority_trampoline_addr(SB)/4, $libc_setpriority_trampoline<>(SB) + +TEXT libc_setregid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setregid(SB) + +GLOBL ·libc_setregid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setregid_trampoline_addr(SB)/4, $libc_setregid_trampoline<>(SB) + +TEXT libc_setreuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setreuid(SB) + +GLOBL ·libc_setreuid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setreuid_trampoline_addr(SB)/4, $libc_setreuid_trampoline<>(SB) + +TEXT libc_setresgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setresgid(SB) + +GLOBL ·libc_setresgid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setresgid_trampoline_addr(SB)/4, $libc_setresgid_trampoline<>(SB) + +TEXT libc_setresuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setresuid(SB) + +GLOBL ·libc_setresuid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setresuid_trampoline_addr(SB)/4, $libc_setresuid_trampoline<>(SB) + +TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setrlimit(SB) + +GLOBL ·libc_setrlimit_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setrlimit_trampoline_addr(SB)/4, $libc_setrlimit_trampoline<>(SB) + +TEXT libc_setrtable_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setrtable(SB) + +GLOBL ·libc_setrtable_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setrtable_trampoline_addr(SB)/4, $libc_setrtable_trampoline<>(SB) + +TEXT libc_setsid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setsid(SB) + +GLOBL ·libc_setsid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setsid_trampoline_addr(SB)/4, $libc_setsid_trampoline<>(SB) + +TEXT libc_settimeofday_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_settimeofday(SB) + +GLOBL ·libc_settimeofday_trampoline_addr(SB), RODATA, $4 +DATA ·libc_settimeofday_trampoline_addr(SB)/4, $libc_settimeofday_trampoline<>(SB) + +TEXT libc_setuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setuid(SB) + +GLOBL ·libc_setuid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setuid_trampoline_addr(SB)/4, $libc_setuid_trampoline<>(SB) + +TEXT libc_stat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_stat(SB) + +GLOBL ·libc_stat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_stat_trampoline_addr(SB)/4, $libc_stat_trampoline<>(SB) + +TEXT libc_statfs_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_statfs(SB) + +GLOBL ·libc_statfs_trampoline_addr(SB), RODATA, $4 +DATA ·libc_statfs_trampoline_addr(SB)/4, $libc_statfs_trampoline<>(SB) + +TEXT libc_symlink_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_symlink(SB) + +GLOBL ·libc_symlink_trampoline_addr(SB), RODATA, $4 +DATA ·libc_symlink_trampoline_addr(SB)/4, $libc_symlink_trampoline<>(SB) + +TEXT libc_symlinkat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_symlinkat(SB) + +GLOBL ·libc_symlinkat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_symlinkat_trampoline_addr(SB)/4, $libc_symlinkat_trampoline<>(SB) + +TEXT libc_sync_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_sync(SB) + +GLOBL ·libc_sync_trampoline_addr(SB), RODATA, $4 +DATA ·libc_sync_trampoline_addr(SB)/4, $libc_sync_trampoline<>(SB) + +TEXT libc_truncate_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_truncate(SB) + +GLOBL ·libc_truncate_trampoline_addr(SB), RODATA, $4 +DATA ·libc_truncate_trampoline_addr(SB)/4, $libc_truncate_trampoline<>(SB) + +TEXT libc_umask_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_umask(SB) + +GLOBL ·libc_umask_trampoline_addr(SB), RODATA, $4 +DATA ·libc_umask_trampoline_addr(SB)/4, $libc_umask_trampoline<>(SB) + +TEXT libc_unlink_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_unlink(SB) + +GLOBL ·libc_unlink_trampoline_addr(SB), RODATA, $4 +DATA ·libc_unlink_trampoline_addr(SB)/4, $libc_unlink_trampoline<>(SB) + +TEXT libc_unlinkat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_unlinkat(SB) + +GLOBL ·libc_unlinkat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_unlinkat_trampoline_addr(SB)/4, $libc_unlinkat_trampoline<>(SB) + +TEXT libc_unmount_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_unmount(SB) + +GLOBL ·libc_unmount_trampoline_addr(SB), RODATA, $4 +DATA ·libc_unmount_trampoline_addr(SB)/4, $libc_unmount_trampoline<>(SB) + +TEXT libc_write_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_write(SB) + +GLOBL ·libc_write_trampoline_addr(SB), RODATA, $4 +DATA ·libc_write_trampoline_addr(SB)/4, $libc_write_trampoline<>(SB) + +TEXT libc_mmap_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mmap(SB) + +GLOBL ·libc_mmap_trampoline_addr(SB), RODATA, $4 +DATA ·libc_mmap_trampoline_addr(SB)/4, $libc_mmap_trampoline<>(SB) + +TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_munmap(SB) + +GLOBL ·libc_munmap_trampoline_addr(SB), RODATA, $4 +DATA ·libc_munmap_trampoline_addr(SB)/4, $libc_munmap_trampoline<>(SB) + +TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_utimensat(SB) + +GLOBL ·libc_utimensat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_utimensat_trampoline_addr(SB)/4, $libc_utimensat_trampoline<>(SB) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go index 3a47aca7b..98446d2b9 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go @@ -1,4 +1,4 @@ -// go run mksyscall.go -openbsd -tags openbsd,amd64 syscall_bsd.go syscall_openbsd.go syscall_openbsd_amd64.go +// go run mksyscall.go -openbsd -libc -tags openbsd,amd64 syscall_bsd.go syscall_openbsd.go syscall_openbsd_amd64.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build openbsd && amd64 @@ -16,7 +16,7 @@ var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(ngid int, gid *_Gid_t) (n int, err error) { - r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + r0, _, e1 := syscall_rawSyscall(libc_getgroups_trampoline_addr, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -24,20 +24,28 @@ func getgroups(ngid int, gid *_Gid_t) (n int, err error) { return } +var libc_getgroups_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getgroups getgroups "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(ngid int, gid *_Gid_t) (err error) { - _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + _, _, e1 := syscall_rawSyscall(libc_setgroups_trampoline_addr, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setgroups_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setgroups setgroups "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { - r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + r0, _, e1 := syscall_syscall6(libc_wait4_trampoline_addr, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -45,10 +53,14 @@ func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err return } +var libc_wait4_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_wait4 wait4 "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + r0, _, e1 := syscall_syscall(libc_accept_trampoline_addr, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -56,30 +68,42 @@ func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { return } +var libc_accept_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_accept accept "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { - _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + _, _, e1 := syscall_syscall(libc_bind_trampoline_addr, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_bind_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_bind bind "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { - _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + _, _, e1 := syscall_syscall(libc_connect_trampoline_addr, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_connect_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_connect connect "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { - r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + r0, _, e1 := syscall_rawSyscall(libc_socket_trampoline_addr, uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -87,66 +111,94 @@ func socket(domain int, typ int, proto int) (fd int, err error) { return } +var libc_socket_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_socket socket "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { - _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + _, _, e1 := syscall_syscall6(libc_getsockopt_trampoline_addr, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getsockopt_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getsockopt getsockopt "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { - _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + _, _, e1 := syscall_syscall6(libc_setsockopt_trampoline_addr, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setsockopt_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setsockopt setsockopt "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { - _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + _, _, e1 := syscall_rawSyscall(libc_getpeername_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getpeername_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpeername getpeername "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { - _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + _, _, e1 := syscall_rawSyscall(libc_getsockname_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getsockname_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getsockname getsockname "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(s int, how int) (err error) { - _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + _, _, e1 := syscall_syscall(libc_shutdown_trampoline_addr, uintptr(s), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_shutdown_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_shutdown shutdown "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { - _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + _, _, e1 := syscall_rawSyscall6(libc_socketpair_trampoline_addr, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_socketpair_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_socketpair socketpair "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { @@ -156,7 +208,7 @@ func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Sockl } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + r0, _, e1 := syscall_syscall6(libc_recvfrom_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -164,6 +216,10 @@ func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Sockl return } +var libc_recvfrom_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_recvfrom recvfrom "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { @@ -173,17 +229,21 @@ func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) ( } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + _, _, e1 := syscall_syscall6(libc_sendto_trampoline_addr, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_sendto_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_sendto sendto "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { - r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + r0, _, e1 := syscall_syscall(libc_recvmsg_trampoline_addr, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -191,10 +251,14 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { return } +var libc_recvmsg_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_recvmsg recvmsg "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { - r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + r0, _, e1 := syscall_syscall(libc_sendmsg_trampoline_addr, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -202,10 +266,14 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { return } +var libc_sendmsg_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_sendmsg sendmsg "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { - r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + r0, _, e1 := syscall_syscall6(libc_kevent_trampoline_addr, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -213,6 +281,10 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne return } +var libc_kevent_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_kevent kevent "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, timeval *[2]Timeval) (err error) { @@ -221,27 +293,35 @@ func utimes(path string, timeval *[2]Timeval) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + _, _, e1 := syscall_syscall(libc_utimes_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_utimes_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_utimes utimes "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimes(fd int, timeval *[2]Timeval) (err error) { - _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + _, _, e1 := syscall_syscall(libc_futimes_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_futimes_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_futimes futimes "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { - r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + r0, _, e1 := syscall_syscall(libc_poll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -249,6 +329,10 @@ func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { return } +var libc_poll_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_poll poll "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, behav int) (err error) { @@ -258,13 +342,17 @@ func Madvise(b []byte, behav int) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + _, _, e1 := syscall_syscall(libc_madvise_trampoline_addr, uintptr(_p0), uintptr(len(b)), uintptr(behav)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_madvise_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_madvise madvise "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { @@ -274,23 +362,31 @@ func Mlock(b []byte) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + _, _, e1 := syscall_syscall(libc_mlock_trampoline_addr, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mlock_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mlock mlock "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { - _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall(libc_mlockall_trampoline_addr, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mlockall_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mlockall mlockall "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { @@ -300,13 +396,17 @@ func Mprotect(b []byte, prot int) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + _, _, e1 := syscall_syscall(libc_mprotect_trampoline_addr, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mprotect_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mprotect mprotect "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Msync(b []byte, flags int) (err error) { @@ -316,13 +416,17 @@ func Msync(b []byte, flags int) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + _, _, e1 := syscall_syscall(libc_msync_trampoline_addr, uintptr(_p0), uintptr(len(b)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_msync_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_msync msync "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { @@ -332,33 +436,45 @@ func Munlock(b []byte) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + _, _, e1 := syscall_syscall(libc_munlock_trampoline_addr, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_munlock_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_munlock munlock "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { - _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + _, _, e1 := syscall_syscall(libc_munlockall_trampoline_addr, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_munlockall_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_munlockall munlockall "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe2(p *[2]_C_int, flags int) (err error) { - _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + _, _, e1 := syscall_rawSyscall(libc_pipe2_trampoline_addr, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_pipe2_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pipe2 pipe2 "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdents(fd int, buf []byte) (n int, err error) { @@ -368,7 +484,7 @@ func Getdents(fd int, buf []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + r0, _, e1 := syscall_syscall(libc_getdents_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -376,6 +492,10 @@ func Getdents(fd int, buf []byte) (n int, err error) { return } +var libc_getdents_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getdents getdents "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getcwd(buf []byte) (n int, err error) { @@ -385,7 +505,7 @@ func Getcwd(buf []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + r0, _, e1 := syscall_syscall(libc_getcwd_trampoline_addr, uintptr(_p0), uintptr(len(buf)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -393,16 +513,24 @@ func Getcwd(buf []byte) (n int, err error) { return } +var libc_getcwd_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getcwd getcwd "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req uint, arg uintptr) (err error) { - _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + _, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_ioctl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { @@ -412,17 +540,21 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + _, _, e1 := syscall_syscall6(libc_sysctl_trampoline_addr, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_sysctl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_sysctl sysctl "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { - r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + r0, _, e1 := syscall_syscall6(libc_ppoll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -430,6 +562,10 @@ func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, return } +var libc_ppoll_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_ppoll ppoll "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Access(path string, mode uint32) (err error) { @@ -438,23 +574,31 @@ func Access(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_access_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_access_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_access access "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { - _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + _, _, e1 := syscall_syscall(libc_adjtime_trampoline_addr, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_adjtime_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_adjtime adjtime "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { @@ -463,13 +607,17 @@ func Chdir(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_chdir_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chdir_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chdir chdir "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chflags(path string, flags int) (err error) { @@ -478,13 +626,17 @@ func Chflags(path string, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + _, _, e1 := syscall_syscall(libc_chflags_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chflags_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chflags chflags "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chmod(path string, mode uint32) (err error) { @@ -493,13 +645,17 @@ func Chmod(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_chmod_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chmod_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chmod chmod "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chown(path string, uid int, gid int) (err error) { @@ -508,13 +664,17 @@ func Chown(path string, uid int, gid int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + _, _, e1 := syscall_syscall(libc_chown_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chown_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chown chown "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { @@ -523,27 +683,35 @@ func Chroot(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_chroot_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chroot_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chroot chroot "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { - _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + _, _, e1 := syscall_syscall(libc_close_trampoline_addr, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_close_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_close close "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(fd int) (nfd int, err error) { - r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + r0, _, e1 := syscall_syscall(libc_dup_trampoline_addr, uintptr(fd), 0, 0) nfd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -551,33 +719,49 @@ func Dup(fd int) (nfd int, err error) { return } +var libc_dup_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_dup dup "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(from int, to int) (err error) { - _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + _, _, e1 := syscall_syscall(libc_dup2_trampoline_addr, uintptr(from), uintptr(to), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_dup2_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_dup2 dup2 "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup3(from int, to int, flags int) (err error) { - _, _, e1 := Syscall(SYS_DUP3, uintptr(from), uintptr(to), uintptr(flags)) + _, _, e1 := syscall_syscall(libc_dup3_trampoline_addr, uintptr(from), uintptr(to), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_dup3_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_dup3 dup3 "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { - Syscall(SYS_EXIT, uintptr(code), 0, 0) + syscall_syscall(libc_exit_trampoline_addr, uintptr(code), 0, 0) return } +var libc_exit_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_exit exit "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { @@ -586,43 +770,59 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall6(libc_faccessat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_faccessat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_faccessat faccessat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { - _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + _, _, e1 := syscall_syscall(libc_fchdir_trampoline_addr, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchdir_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchdir fchdir "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchflags(fd int, flags int) (err error) { - _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + _, _, e1 := syscall_syscall(libc_fchflags_trampoline_addr, uintptr(fd), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchflags_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchflags fchflags "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { - _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_fchmod_trampoline_addr, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchmod_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchmod fchmod "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { @@ -631,23 +831,31 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall6(libc_fchmodat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchmodat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchmodat fchmodat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { - _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + _, _, e1 := syscall_syscall(libc_fchown_trampoline_addr, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchown_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchown fchown "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { @@ -656,27 +864,35 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + _, _, e1 := syscall_syscall6(libc_fchownat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchownat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchownat fchownat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { - _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + _, _, e1 := syscall_syscall(libc_flock_trampoline_addr, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_flock_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_flock flock "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fpathconf(fd int, name int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + r0, _, e1 := syscall_syscall(libc_fpathconf_trampoline_addr, uintptr(fd), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -684,16 +900,24 @@ func Fpathconf(fd int, name int) (val int, err error) { return } +var libc_fpathconf_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fpathconf fpathconf "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { - _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_fstat_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fstat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fstat fstat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { @@ -702,71 +926,99 @@ func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall6(libc_fstatat_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fstatat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fstatat fstatat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatfs(fd int, stat *Statfs_t) (err error) { - _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_fstatfs_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fstatfs_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fstatfs fstatfs "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { - _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + _, _, e1 := syscall_syscall(libc_fsync_trampoline_addr, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fsync_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fsync fsync "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { - _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length)) + _, _, e1 := syscall_syscall(libc_ftruncate_trampoline_addr, uintptr(fd), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_ftruncate_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_ftruncate ftruncate "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { - r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getegid_trampoline_addr, 0, 0, 0) egid = int(r0) return } +var libc_getegid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getegid getegid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (uid int) { - r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_geteuid_trampoline_addr, 0, 0, 0) uid = int(r0) return } +var libc_geteuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_geteuid geteuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { - r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getgid_trampoline_addr, 0, 0, 0) gid = int(r0) return } +var libc_getgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getgid getgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { - r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + r0, _, e1 := syscall_rawSyscall(libc_getpgid_trampoline_addr, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -774,34 +1026,50 @@ func Getpgid(pid int) (pgid int, err error) { return } +var libc_getpgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpgid getpgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgrp() (pgrp int) { - r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getpgrp_trampoline_addr, 0, 0, 0) pgrp = int(r0) return } +var libc_getpgrp_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpgrp getpgrp "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { - r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getpid_trampoline_addr, 0, 0, 0) pid = int(r0) return } +var libc_getpid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpid getpid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { - r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getppid_trampoline_addr, 0, 0, 0) ppid = int(r0) return } +var libc_getppid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getppid getppid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { - r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + r0, _, e1 := syscall_syscall(libc_getpriority_trampoline_addr, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -809,20 +1077,28 @@ func Getpriority(which int, who int) (prio int, err error) { return } +var libc_getpriority_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpriority getpriority "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + _, _, e1 := syscall_rawSyscall(libc_getrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getrlimit_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getrlimit getrlimit "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrtable() (rtable int, err error) { - r0, _, e1 := RawSyscall(SYS_GETRTABLE, 0, 0, 0) + r0, _, e1 := syscall_rawSyscall(libc_getrtable_trampoline_addr, 0, 0, 0) rtable = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -830,20 +1106,28 @@ func Getrtable() (rtable int, err error) { return } +var libc_getrtable_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getrtable getrtable "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { - _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + _, _, e1 := syscall_rawSyscall(libc_getrusage_trampoline_addr, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getrusage_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getrusage getrusage "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { - r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + r0, _, e1 := syscall_rawSyscall(libc_getsid_trampoline_addr, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -851,46 +1135,66 @@ func Getsid(pid int) (sid int, err error) { return } +var libc_getsid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getsid getsid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettimeofday(tv *Timeval) (err error) { - _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_gettimeofday_trampoline_addr, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_gettimeofday_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_gettimeofday gettimeofday "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { - r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getuid_trampoline_addr, 0, 0, 0) uid = int(r0) return } +var libc_getuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getuid getuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Issetugid() (tainted bool) { - r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + r0, _, _ := syscall_syscall(libc_issetugid_trampoline_addr, 0, 0, 0) tainted = bool(r0 != 0) return } +var libc_issetugid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_issetugid issetugid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kill(pid int, signum syscall.Signal) (err error) { - _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + _, _, e1 := syscall_syscall(libc_kill_trampoline_addr, uintptr(pid), uintptr(signum), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_kill_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_kill kill "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kqueue() (fd int, err error) { - r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + r0, _, e1 := syscall_syscall(libc_kqueue_trampoline_addr, 0, 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -898,6 +1202,10 @@ func Kqueue() (fd int, err error) { return } +var libc_kqueue_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_kqueue kqueue "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { @@ -906,13 +1214,17 @@ func Lchown(path string, uid int, gid int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + _, _, e1 := syscall_syscall(libc_lchown_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_lchown_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_lchown lchown "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Link(path string, link string) (err error) { @@ -926,13 +1238,17 @@ func Link(path string, link string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + _, _, e1 := syscall_syscall(libc_link_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_link_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_link link "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { @@ -946,23 +1262,31 @@ func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err er if err != nil { return } - _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + _, _, e1 := syscall_syscall6(libc_linkat_trampoline_addr, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_linkat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_linkat linkat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, backlog int) (err error) { - _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + _, _, e1 := syscall_syscall(libc_listen_trampoline_addr, uintptr(s), uintptr(backlog), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_listen_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_listen listen "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { @@ -971,13 +1295,17 @@ func Lstat(path string, stat *Stat_t) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_lstat_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_lstat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_lstat lstat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdir(path string, mode uint32) (err error) { @@ -986,13 +1314,17 @@ func Mkdir(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_mkdir_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mkdir_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mkdir mkdir "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdirat(dirfd int, path string, mode uint32) (err error) { @@ -1001,13 +1333,17 @@ func Mkdirat(dirfd int, path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + _, _, e1 := syscall_syscall(libc_mkdirat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mkdirat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mkdirat mkdirat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifo(path string, mode uint32) (err error) { @@ -1016,13 +1352,17 @@ func Mkfifo(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_mkfifo_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mkfifo_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mkfifo mkfifo "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifoat(dirfd int, path string, mode uint32) (err error) { @@ -1031,13 +1371,17 @@ func Mkfifoat(dirfd int, path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKFIFOAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + _, _, e1 := syscall_syscall(libc_mkfifoat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mkfifoat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mkfifoat mkfifoat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknod(path string, mode uint32, dev int) (err error) { @@ -1046,13 +1390,17 @@ func Mknod(path string, mode uint32, dev int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + _, _, e1 := syscall_syscall(libc_mknod_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mknod_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mknod mknod "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { @@ -1061,23 +1409,31 @@ func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + _, _, e1 := syscall_syscall6(libc_mknodat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mknodat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mknodat mknodat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Nanosleep(time *Timespec, leftover *Timespec) (err error) { - _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + _, _, e1 := syscall_syscall(libc_nanosleep_trampoline_addr, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_nanosleep_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_nanosleep nanosleep "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Open(path string, mode int, perm uint32) (fd int, err error) { @@ -1086,7 +1442,7 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { if err != nil { return } - r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + r0, _, e1 := syscall_syscall(libc_open_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1094,6 +1450,10 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { return } +var libc_open_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_open open "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { @@ -1102,7 +1462,7 @@ func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { if err != nil { return } - r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + r0, _, e1 := syscall_syscall6(libc_openat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1110,6 +1470,10 @@ func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { return } +var libc_openat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_openat openat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pathconf(path string, name int) (val int, err error) { @@ -1118,7 +1482,7 @@ func Pathconf(path string, name int) (val int, err error) { if err != nil { return } - r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + r0, _, e1 := syscall_syscall(libc_pathconf_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1126,16 +1490,20 @@ func Pathconf(path string, name int) (val int, err error) { return } +var libc_pathconf_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pathconf pathconf "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + r0, _, e1 := syscall_syscall6(libc_pread_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1143,16 +1511,20 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { return } +var libc_pread_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pread pread "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + r0, _, e1 := syscall_syscall6(libc_pwrite_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1160,6 +1532,10 @@ func Pwrite(fd int, p []byte, offset int64) (n int, err error) { return } +var libc_pwrite_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pwrite pwrite "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { @@ -1169,7 +1545,7 @@ func read(fd int, p []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1177,6 +1553,10 @@ func read(fd int, p []byte) (n int, err error) { return } +var libc_read_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_read read "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlink(path string, buf []byte) (n int, err error) { @@ -1191,7 +1571,7 @@ func Readlink(path string, buf []byte) (n int, err error) { } else { _p1 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + r0, _, e1 := syscall_syscall(libc_readlink_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1199,6 +1579,10 @@ func Readlink(path string, buf []byte) (n int, err error) { return } +var libc_readlink_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_readlink readlink "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { @@ -1213,7 +1597,7 @@ func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { } else { _p1 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + r0, _, e1 := syscall_syscall6(libc_readlinkat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1221,6 +1605,10 @@ func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { return } +var libc_readlinkat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_readlinkat readlinkat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rename(from string, to string) (err error) { @@ -1234,13 +1622,17 @@ func Rename(from string, to string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + _, _, e1 := syscall_syscall(libc_rename_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_rename_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_rename rename "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Renameat(fromfd int, from string, tofd int, to string) (err error) { @@ -1254,13 +1646,17 @@ func Renameat(fromfd int, from string, tofd int, to string) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + _, _, e1 := syscall_syscall6(libc_renameat_trampoline_addr, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_renameat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_renameat renameat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Revoke(path string) (err error) { @@ -1269,13 +1665,17 @@ func Revoke(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_revoke_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_revoke_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_revoke revoke "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rmdir(path string) (err error) { @@ -1284,17 +1684,21 @@ func Rmdir(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_rmdir_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_rmdir_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_rmdir rmdir "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { - r0, _, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(whence), 0, 0) + r0, _, e1 := syscall_syscall(libc_lseek_trampoline_addr, uintptr(fd), uintptr(offset), uintptr(whence)) newoffset = int64(r0) if e1 != 0 { err = errnoErr(e1) @@ -1302,10 +1706,14 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { return } +var libc_lseek_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_lseek lseek "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { - r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + r0, _, e1 := syscall_syscall6(libc_select_trampoline_addr, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1313,36 +1721,52 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err return } +var libc_select_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_select select "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setegid(egid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_setegid_trampoline_addr, uintptr(egid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setegid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setegid setegid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seteuid(euid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_seteuid_trampoline_addr, uintptr(euid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_seteuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_seteuid seteuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setgid(gid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_setgid_trampoline_addr, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setgid setgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setlogin(name string) (err error) { @@ -1351,97 +1775,133 @@ func Setlogin(name string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_setlogin_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setlogin_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setlogin setlogin "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + _, _, e1 := syscall_rawSyscall(libc_setpgid_trampoline_addr, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setpgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setpgid setpgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { - _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + _, _, e1 := syscall_syscall(libc_setpriority_trampoline_addr, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setpriority_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setpriority setpriority "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + _, _, e1 := syscall_rawSyscall(libc_setregid_trampoline_addr, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setregid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setregid setregid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + _, _, e1 := syscall_rawSyscall(libc_setreuid_trampoline_addr, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setreuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setreuid setreuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresgid(rgid int, egid int, sgid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + _, _, e1 := syscall_rawSyscall(libc_setresgid_trampoline_addr, uintptr(rgid), uintptr(egid), uintptr(sgid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setresgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setresgid setresgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresuid(ruid int, euid int, suid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + _, _, e1 := syscall_rawSyscall(libc_setresuid_trampoline_addr, uintptr(ruid), uintptr(euid), uintptr(suid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setresuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setresuid setresuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + _, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setrlimit_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrtable(rtable int) (err error) { - _, _, e1 := RawSyscall(SYS_SETRTABLE, uintptr(rtable), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_setrtable_trampoline_addr, uintptr(rtable), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setrtable_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setrtable setrtable "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { - r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + r0, _, e1 := syscall_rawSyscall(libc_setsid_trampoline_addr, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1449,26 +1909,38 @@ func Setsid() (pid int, err error) { return } +var libc_setsid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setsid setsid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tp *Timeval) (err error) { - _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_settimeofday_trampoline_addr, uintptr(unsafe.Pointer(tp)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_settimeofday_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_settimeofday settimeofday "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setuid(uid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_setuid_trampoline_addr, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setuid setuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { @@ -1477,13 +1949,17 @@ func Stat(path string, stat *Stat_t) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_stat_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_stat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_stat stat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Statfs(path string, stat *Statfs_t) (err error) { @@ -1492,13 +1968,17 @@ func Statfs(path string, stat *Statfs_t) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_statfs_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_statfs_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_statfs statfs "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlink(path string, link string) (err error) { @@ -1512,13 +1992,17 @@ func Symlink(path string, link string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + _, _, e1 := syscall_syscall(libc_symlink_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_symlink_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_symlink symlink "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { @@ -1532,23 +2016,31 @@ func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + _, _, e1 := syscall_syscall(libc_symlinkat_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) if e1 != 0 { err = errnoErr(e1) } return } +var libc_symlinkat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_symlinkat symlinkat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() (err error) { - _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + _, _, e1 := syscall_syscall(libc_sync_trampoline_addr, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_sync_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_sync sync "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { @@ -1557,21 +2049,29 @@ func Truncate(path string, length int64) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length)) + _, _, e1 := syscall_syscall(libc_truncate_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_truncate_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_truncate truncate "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(newmask int) (oldmask int) { - r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + r0, _, _ := syscall_syscall(libc_umask_trampoline_addr, uintptr(newmask), 0, 0) oldmask = int(r0) return } +var libc_umask_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_umask umask "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlink(path string) (err error) { @@ -1580,13 +2080,17 @@ func Unlink(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_unlink_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_unlink_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_unlink unlink "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlinkat(dirfd int, path string, flags int) (err error) { @@ -1595,13 +2099,17 @@ func Unlinkat(dirfd int, path string, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + _, _, e1 := syscall_syscall(libc_unlinkat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_unlinkat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_unlinkat unlinkat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(path string, flags int) (err error) { @@ -1610,13 +2118,17 @@ func Unmount(path string, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + _, _, e1 := syscall_syscall(libc_unmount_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_unmount_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_unmount unmount "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { @@ -1626,7 +2138,7 @@ func write(fd int, p []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1634,10 +2146,14 @@ func write(fd int, p []byte) (n int, err error) { return } +var libc_write_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_write write "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { - r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), 0, 0) + r0, _, e1 := syscall_syscall6(libc_mmap_trampoline_addr, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) ret = uintptr(r0) if e1 != 0 { err = errnoErr(e1) @@ -1645,20 +2161,28 @@ func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) ( return } +var libc_mmap_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mmap mmap "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { - _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + _, _, e1 := syscall_syscall(libc_munmap_trampoline_addr, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_munmap_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_munmap munmap "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1669,7 +2193,7 @@ func readlen(fd int, buf *byte, nbuf int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1685,9 +2209,13 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error if err != nil { return } - _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall6(libc_utimensat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } + +var libc_utimensat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_utimensat utimensat "libc.so" diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s new file mode 100644 index 000000000..243a6663c --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s @@ -0,0 +1,796 @@ +// go run mkasm.go openbsd amd64 +// Code generated by the command above; DO NOT EDIT. + +#include "textflag.h" + +TEXT libc_getgroups_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getgroups(SB) + +GLOBL ·libc_getgroups_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getgroups_trampoline_addr(SB)/8, $libc_getgroups_trampoline<>(SB) + +TEXT libc_setgroups_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setgroups(SB) + +GLOBL ·libc_setgroups_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setgroups_trampoline_addr(SB)/8, $libc_setgroups_trampoline<>(SB) + +TEXT libc_wait4_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_wait4(SB) + +GLOBL ·libc_wait4_trampoline_addr(SB), RODATA, $8 +DATA ·libc_wait4_trampoline_addr(SB)/8, $libc_wait4_trampoline<>(SB) + +TEXT libc_accept_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_accept(SB) + +GLOBL ·libc_accept_trampoline_addr(SB), RODATA, $8 +DATA ·libc_accept_trampoline_addr(SB)/8, $libc_accept_trampoline<>(SB) + +TEXT libc_bind_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_bind(SB) + +GLOBL ·libc_bind_trampoline_addr(SB), RODATA, $8 +DATA ·libc_bind_trampoline_addr(SB)/8, $libc_bind_trampoline<>(SB) + +TEXT libc_connect_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_connect(SB) + +GLOBL ·libc_connect_trampoline_addr(SB), RODATA, $8 +DATA ·libc_connect_trampoline_addr(SB)/8, $libc_connect_trampoline<>(SB) + +TEXT libc_socket_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_socket(SB) + +GLOBL ·libc_socket_trampoline_addr(SB), RODATA, $8 +DATA ·libc_socket_trampoline_addr(SB)/8, $libc_socket_trampoline<>(SB) + +TEXT libc_getsockopt_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getsockopt(SB) + +GLOBL ·libc_getsockopt_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getsockopt_trampoline_addr(SB)/8, $libc_getsockopt_trampoline<>(SB) + +TEXT libc_setsockopt_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setsockopt(SB) + +GLOBL ·libc_setsockopt_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setsockopt_trampoline_addr(SB)/8, $libc_setsockopt_trampoline<>(SB) + +TEXT libc_getpeername_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpeername(SB) + +GLOBL ·libc_getpeername_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getpeername_trampoline_addr(SB)/8, $libc_getpeername_trampoline<>(SB) + +TEXT libc_getsockname_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getsockname(SB) + +GLOBL ·libc_getsockname_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getsockname_trampoline_addr(SB)/8, $libc_getsockname_trampoline<>(SB) + +TEXT libc_shutdown_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_shutdown(SB) + +GLOBL ·libc_shutdown_trampoline_addr(SB), RODATA, $8 +DATA ·libc_shutdown_trampoline_addr(SB)/8, $libc_shutdown_trampoline<>(SB) + +TEXT libc_socketpair_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_socketpair(SB) + +GLOBL ·libc_socketpair_trampoline_addr(SB), RODATA, $8 +DATA ·libc_socketpair_trampoline_addr(SB)/8, $libc_socketpair_trampoline<>(SB) + +TEXT libc_recvfrom_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_recvfrom(SB) + +GLOBL ·libc_recvfrom_trampoline_addr(SB), RODATA, $8 +DATA ·libc_recvfrom_trampoline_addr(SB)/8, $libc_recvfrom_trampoline<>(SB) + +TEXT libc_sendto_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_sendto(SB) + +GLOBL ·libc_sendto_trampoline_addr(SB), RODATA, $8 +DATA ·libc_sendto_trampoline_addr(SB)/8, $libc_sendto_trampoline<>(SB) + +TEXT libc_recvmsg_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_recvmsg(SB) + +GLOBL ·libc_recvmsg_trampoline_addr(SB), RODATA, $8 +DATA ·libc_recvmsg_trampoline_addr(SB)/8, $libc_recvmsg_trampoline<>(SB) + +TEXT libc_sendmsg_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_sendmsg(SB) + +GLOBL ·libc_sendmsg_trampoline_addr(SB), RODATA, $8 +DATA ·libc_sendmsg_trampoline_addr(SB)/8, $libc_sendmsg_trampoline<>(SB) + +TEXT libc_kevent_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_kevent(SB) + +GLOBL ·libc_kevent_trampoline_addr(SB), RODATA, $8 +DATA ·libc_kevent_trampoline_addr(SB)/8, $libc_kevent_trampoline<>(SB) + +TEXT libc_utimes_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_utimes(SB) + +GLOBL ·libc_utimes_trampoline_addr(SB), RODATA, $8 +DATA ·libc_utimes_trampoline_addr(SB)/8, $libc_utimes_trampoline<>(SB) + +TEXT libc_futimes_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_futimes(SB) + +GLOBL ·libc_futimes_trampoline_addr(SB), RODATA, $8 +DATA ·libc_futimes_trampoline_addr(SB)/8, $libc_futimes_trampoline<>(SB) + +TEXT libc_poll_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_poll(SB) + +GLOBL ·libc_poll_trampoline_addr(SB), RODATA, $8 +DATA ·libc_poll_trampoline_addr(SB)/8, $libc_poll_trampoline<>(SB) + +TEXT libc_madvise_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_madvise(SB) + +GLOBL ·libc_madvise_trampoline_addr(SB), RODATA, $8 +DATA ·libc_madvise_trampoline_addr(SB)/8, $libc_madvise_trampoline<>(SB) + +TEXT libc_mlock_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mlock(SB) + +GLOBL ·libc_mlock_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mlock_trampoline_addr(SB)/8, $libc_mlock_trampoline<>(SB) + +TEXT libc_mlockall_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mlockall(SB) + +GLOBL ·libc_mlockall_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mlockall_trampoline_addr(SB)/8, $libc_mlockall_trampoline<>(SB) + +TEXT libc_mprotect_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mprotect(SB) + +GLOBL ·libc_mprotect_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mprotect_trampoline_addr(SB)/8, $libc_mprotect_trampoline<>(SB) + +TEXT libc_msync_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_msync(SB) + +GLOBL ·libc_msync_trampoline_addr(SB), RODATA, $8 +DATA ·libc_msync_trampoline_addr(SB)/8, $libc_msync_trampoline<>(SB) + +TEXT libc_munlock_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_munlock(SB) + +GLOBL ·libc_munlock_trampoline_addr(SB), RODATA, $8 +DATA ·libc_munlock_trampoline_addr(SB)/8, $libc_munlock_trampoline<>(SB) + +TEXT libc_munlockall_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_munlockall(SB) + +GLOBL ·libc_munlockall_trampoline_addr(SB), RODATA, $8 +DATA ·libc_munlockall_trampoline_addr(SB)/8, $libc_munlockall_trampoline<>(SB) + +TEXT libc_pipe2_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pipe2(SB) + +GLOBL ·libc_pipe2_trampoline_addr(SB), RODATA, $8 +DATA ·libc_pipe2_trampoline_addr(SB)/8, $libc_pipe2_trampoline<>(SB) + +TEXT libc_getdents_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getdents(SB) + +GLOBL ·libc_getdents_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getdents_trampoline_addr(SB)/8, $libc_getdents_trampoline<>(SB) + +TEXT libc_getcwd_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getcwd(SB) + +GLOBL ·libc_getcwd_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getcwd_trampoline_addr(SB)/8, $libc_getcwd_trampoline<>(SB) + +TEXT libc_ioctl_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_ioctl(SB) + +GLOBL ·libc_ioctl_trampoline_addr(SB), RODATA, $8 +DATA ·libc_ioctl_trampoline_addr(SB)/8, $libc_ioctl_trampoline<>(SB) + +TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_sysctl(SB) + +GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $8 +DATA ·libc_sysctl_trampoline_addr(SB)/8, $libc_sysctl_trampoline<>(SB) + +TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_ppoll(SB) + +GLOBL ·libc_ppoll_trampoline_addr(SB), RODATA, $8 +DATA ·libc_ppoll_trampoline_addr(SB)/8, $libc_ppoll_trampoline<>(SB) + +TEXT libc_access_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_access(SB) + +GLOBL ·libc_access_trampoline_addr(SB), RODATA, $8 +DATA ·libc_access_trampoline_addr(SB)/8, $libc_access_trampoline<>(SB) + +TEXT libc_adjtime_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_adjtime(SB) + +GLOBL ·libc_adjtime_trampoline_addr(SB), RODATA, $8 +DATA ·libc_adjtime_trampoline_addr(SB)/8, $libc_adjtime_trampoline<>(SB) + +TEXT libc_chdir_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chdir(SB) + +GLOBL ·libc_chdir_trampoline_addr(SB), RODATA, $8 +DATA ·libc_chdir_trampoline_addr(SB)/8, $libc_chdir_trampoline<>(SB) + +TEXT libc_chflags_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chflags(SB) + +GLOBL ·libc_chflags_trampoline_addr(SB), RODATA, $8 +DATA ·libc_chflags_trampoline_addr(SB)/8, $libc_chflags_trampoline<>(SB) + +TEXT libc_chmod_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chmod(SB) + +GLOBL ·libc_chmod_trampoline_addr(SB), RODATA, $8 +DATA ·libc_chmod_trampoline_addr(SB)/8, $libc_chmod_trampoline<>(SB) + +TEXT libc_chown_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chown(SB) + +GLOBL ·libc_chown_trampoline_addr(SB), RODATA, $8 +DATA ·libc_chown_trampoline_addr(SB)/8, $libc_chown_trampoline<>(SB) + +TEXT libc_chroot_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chroot(SB) + +GLOBL ·libc_chroot_trampoline_addr(SB), RODATA, $8 +DATA ·libc_chroot_trampoline_addr(SB)/8, $libc_chroot_trampoline<>(SB) + +TEXT libc_close_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_close(SB) + +GLOBL ·libc_close_trampoline_addr(SB), RODATA, $8 +DATA ·libc_close_trampoline_addr(SB)/8, $libc_close_trampoline<>(SB) + +TEXT libc_dup_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_dup(SB) + +GLOBL ·libc_dup_trampoline_addr(SB), RODATA, $8 +DATA ·libc_dup_trampoline_addr(SB)/8, $libc_dup_trampoline<>(SB) + +TEXT libc_dup2_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_dup2(SB) + +GLOBL ·libc_dup2_trampoline_addr(SB), RODATA, $8 +DATA ·libc_dup2_trampoline_addr(SB)/8, $libc_dup2_trampoline<>(SB) + +TEXT libc_dup3_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_dup3(SB) + +GLOBL ·libc_dup3_trampoline_addr(SB), RODATA, $8 +DATA ·libc_dup3_trampoline_addr(SB)/8, $libc_dup3_trampoline<>(SB) + +TEXT libc_exit_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_exit(SB) + +GLOBL ·libc_exit_trampoline_addr(SB), RODATA, $8 +DATA ·libc_exit_trampoline_addr(SB)/8, $libc_exit_trampoline<>(SB) + +TEXT libc_faccessat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_faccessat(SB) + +GLOBL ·libc_faccessat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_faccessat_trampoline_addr(SB)/8, $libc_faccessat_trampoline<>(SB) + +TEXT libc_fchdir_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchdir(SB) + +GLOBL ·libc_fchdir_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fchdir_trampoline_addr(SB)/8, $libc_fchdir_trampoline<>(SB) + +TEXT libc_fchflags_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchflags(SB) + +GLOBL ·libc_fchflags_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fchflags_trampoline_addr(SB)/8, $libc_fchflags_trampoline<>(SB) + +TEXT libc_fchmod_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchmod(SB) + +GLOBL ·libc_fchmod_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fchmod_trampoline_addr(SB)/8, $libc_fchmod_trampoline<>(SB) + +TEXT libc_fchmodat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchmodat(SB) + +GLOBL ·libc_fchmodat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fchmodat_trampoline_addr(SB)/8, $libc_fchmodat_trampoline<>(SB) + +TEXT libc_fchown_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchown(SB) + +GLOBL ·libc_fchown_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fchown_trampoline_addr(SB)/8, $libc_fchown_trampoline<>(SB) + +TEXT libc_fchownat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchownat(SB) + +GLOBL ·libc_fchownat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fchownat_trampoline_addr(SB)/8, $libc_fchownat_trampoline<>(SB) + +TEXT libc_flock_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_flock(SB) + +GLOBL ·libc_flock_trampoline_addr(SB), RODATA, $8 +DATA ·libc_flock_trampoline_addr(SB)/8, $libc_flock_trampoline<>(SB) + +TEXT libc_fpathconf_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fpathconf(SB) + +GLOBL ·libc_fpathconf_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fpathconf_trampoline_addr(SB)/8, $libc_fpathconf_trampoline<>(SB) + +TEXT libc_fstat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fstat(SB) + +GLOBL ·libc_fstat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fstat_trampoline_addr(SB)/8, $libc_fstat_trampoline<>(SB) + +TEXT libc_fstatat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fstatat(SB) + +GLOBL ·libc_fstatat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fstatat_trampoline_addr(SB)/8, $libc_fstatat_trampoline<>(SB) + +TEXT libc_fstatfs_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fstatfs(SB) + +GLOBL ·libc_fstatfs_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fstatfs_trampoline_addr(SB)/8, $libc_fstatfs_trampoline<>(SB) + +TEXT libc_fsync_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fsync(SB) + +GLOBL ·libc_fsync_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fsync_trampoline_addr(SB)/8, $libc_fsync_trampoline<>(SB) + +TEXT libc_ftruncate_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_ftruncate(SB) + +GLOBL ·libc_ftruncate_trampoline_addr(SB), RODATA, $8 +DATA ·libc_ftruncate_trampoline_addr(SB)/8, $libc_ftruncate_trampoline<>(SB) + +TEXT libc_getegid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getegid(SB) + +GLOBL ·libc_getegid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getegid_trampoline_addr(SB)/8, $libc_getegid_trampoline<>(SB) + +TEXT libc_geteuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_geteuid(SB) + +GLOBL ·libc_geteuid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_geteuid_trampoline_addr(SB)/8, $libc_geteuid_trampoline<>(SB) + +TEXT libc_getgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getgid(SB) + +GLOBL ·libc_getgid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getgid_trampoline_addr(SB)/8, $libc_getgid_trampoline<>(SB) + +TEXT libc_getpgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpgid(SB) + +GLOBL ·libc_getpgid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getpgid_trampoline_addr(SB)/8, $libc_getpgid_trampoline<>(SB) + +TEXT libc_getpgrp_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpgrp(SB) + +GLOBL ·libc_getpgrp_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getpgrp_trampoline_addr(SB)/8, $libc_getpgrp_trampoline<>(SB) + +TEXT libc_getpid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpid(SB) + +GLOBL ·libc_getpid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getpid_trampoline_addr(SB)/8, $libc_getpid_trampoline<>(SB) + +TEXT libc_getppid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getppid(SB) + +GLOBL ·libc_getppid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getppid_trampoline_addr(SB)/8, $libc_getppid_trampoline<>(SB) + +TEXT libc_getpriority_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpriority(SB) + +GLOBL ·libc_getpriority_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getpriority_trampoline_addr(SB)/8, $libc_getpriority_trampoline<>(SB) + +TEXT libc_getrlimit_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getrlimit(SB) + +GLOBL ·libc_getrlimit_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getrlimit_trampoline_addr(SB)/8, $libc_getrlimit_trampoline<>(SB) + +TEXT libc_getrtable_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getrtable(SB) + +GLOBL ·libc_getrtable_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getrtable_trampoline_addr(SB)/8, $libc_getrtable_trampoline<>(SB) + +TEXT libc_getrusage_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getrusage(SB) + +GLOBL ·libc_getrusage_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getrusage_trampoline_addr(SB)/8, $libc_getrusage_trampoline<>(SB) + +TEXT libc_getsid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getsid(SB) + +GLOBL ·libc_getsid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getsid_trampoline_addr(SB)/8, $libc_getsid_trampoline<>(SB) + +TEXT libc_gettimeofday_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_gettimeofday(SB) + +GLOBL ·libc_gettimeofday_trampoline_addr(SB), RODATA, $8 +DATA ·libc_gettimeofday_trampoline_addr(SB)/8, $libc_gettimeofday_trampoline<>(SB) + +TEXT libc_getuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getuid(SB) + +GLOBL ·libc_getuid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getuid_trampoline_addr(SB)/8, $libc_getuid_trampoline<>(SB) + +TEXT libc_issetugid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_issetugid(SB) + +GLOBL ·libc_issetugid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_issetugid_trampoline_addr(SB)/8, $libc_issetugid_trampoline<>(SB) + +TEXT libc_kill_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_kill(SB) + +GLOBL ·libc_kill_trampoline_addr(SB), RODATA, $8 +DATA ·libc_kill_trampoline_addr(SB)/8, $libc_kill_trampoline<>(SB) + +TEXT libc_kqueue_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_kqueue(SB) + +GLOBL ·libc_kqueue_trampoline_addr(SB), RODATA, $8 +DATA ·libc_kqueue_trampoline_addr(SB)/8, $libc_kqueue_trampoline<>(SB) + +TEXT libc_lchown_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_lchown(SB) + +GLOBL ·libc_lchown_trampoline_addr(SB), RODATA, $8 +DATA ·libc_lchown_trampoline_addr(SB)/8, $libc_lchown_trampoline<>(SB) + +TEXT libc_link_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_link(SB) + +GLOBL ·libc_link_trampoline_addr(SB), RODATA, $8 +DATA ·libc_link_trampoline_addr(SB)/8, $libc_link_trampoline<>(SB) + +TEXT libc_linkat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_linkat(SB) + +GLOBL ·libc_linkat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_linkat_trampoline_addr(SB)/8, $libc_linkat_trampoline<>(SB) + +TEXT libc_listen_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_listen(SB) + +GLOBL ·libc_listen_trampoline_addr(SB), RODATA, $8 +DATA ·libc_listen_trampoline_addr(SB)/8, $libc_listen_trampoline<>(SB) + +TEXT libc_lstat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_lstat(SB) + +GLOBL ·libc_lstat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_lstat_trampoline_addr(SB)/8, $libc_lstat_trampoline<>(SB) + +TEXT libc_mkdir_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mkdir(SB) + +GLOBL ·libc_mkdir_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mkdir_trampoline_addr(SB)/8, $libc_mkdir_trampoline<>(SB) + +TEXT libc_mkdirat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mkdirat(SB) + +GLOBL ·libc_mkdirat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mkdirat_trampoline_addr(SB)/8, $libc_mkdirat_trampoline<>(SB) + +TEXT libc_mkfifo_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mkfifo(SB) + +GLOBL ·libc_mkfifo_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mkfifo_trampoline_addr(SB)/8, $libc_mkfifo_trampoline<>(SB) + +TEXT libc_mkfifoat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mkfifoat(SB) + +GLOBL ·libc_mkfifoat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mkfifoat_trampoline_addr(SB)/8, $libc_mkfifoat_trampoline<>(SB) + +TEXT libc_mknod_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mknod(SB) + +GLOBL ·libc_mknod_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mknod_trampoline_addr(SB)/8, $libc_mknod_trampoline<>(SB) + +TEXT libc_mknodat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mknodat(SB) + +GLOBL ·libc_mknodat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mknodat_trampoline_addr(SB)/8, $libc_mknodat_trampoline<>(SB) + +TEXT libc_nanosleep_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_nanosleep(SB) + +GLOBL ·libc_nanosleep_trampoline_addr(SB), RODATA, $8 +DATA ·libc_nanosleep_trampoline_addr(SB)/8, $libc_nanosleep_trampoline<>(SB) + +TEXT libc_open_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_open(SB) + +GLOBL ·libc_open_trampoline_addr(SB), RODATA, $8 +DATA ·libc_open_trampoline_addr(SB)/8, $libc_open_trampoline<>(SB) + +TEXT libc_openat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_openat(SB) + +GLOBL ·libc_openat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_openat_trampoline_addr(SB)/8, $libc_openat_trampoline<>(SB) + +TEXT libc_pathconf_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pathconf(SB) + +GLOBL ·libc_pathconf_trampoline_addr(SB), RODATA, $8 +DATA ·libc_pathconf_trampoline_addr(SB)/8, $libc_pathconf_trampoline<>(SB) + +TEXT libc_pread_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pread(SB) + +GLOBL ·libc_pread_trampoline_addr(SB), RODATA, $8 +DATA ·libc_pread_trampoline_addr(SB)/8, $libc_pread_trampoline<>(SB) + +TEXT libc_pwrite_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pwrite(SB) + +GLOBL ·libc_pwrite_trampoline_addr(SB), RODATA, $8 +DATA ·libc_pwrite_trampoline_addr(SB)/8, $libc_pwrite_trampoline<>(SB) + +TEXT libc_read_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_read(SB) + +GLOBL ·libc_read_trampoline_addr(SB), RODATA, $8 +DATA ·libc_read_trampoline_addr(SB)/8, $libc_read_trampoline<>(SB) + +TEXT libc_readlink_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_readlink(SB) + +GLOBL ·libc_readlink_trampoline_addr(SB), RODATA, $8 +DATA ·libc_readlink_trampoline_addr(SB)/8, $libc_readlink_trampoline<>(SB) + +TEXT libc_readlinkat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_readlinkat(SB) + +GLOBL ·libc_readlinkat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_readlinkat_trampoline_addr(SB)/8, $libc_readlinkat_trampoline<>(SB) + +TEXT libc_rename_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_rename(SB) + +GLOBL ·libc_rename_trampoline_addr(SB), RODATA, $8 +DATA ·libc_rename_trampoline_addr(SB)/8, $libc_rename_trampoline<>(SB) + +TEXT libc_renameat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_renameat(SB) + +GLOBL ·libc_renameat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_renameat_trampoline_addr(SB)/8, $libc_renameat_trampoline<>(SB) + +TEXT libc_revoke_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_revoke(SB) + +GLOBL ·libc_revoke_trampoline_addr(SB), RODATA, $8 +DATA ·libc_revoke_trampoline_addr(SB)/8, $libc_revoke_trampoline<>(SB) + +TEXT libc_rmdir_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_rmdir(SB) + +GLOBL ·libc_rmdir_trampoline_addr(SB), RODATA, $8 +DATA ·libc_rmdir_trampoline_addr(SB)/8, $libc_rmdir_trampoline<>(SB) + +TEXT libc_lseek_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_lseek(SB) + +GLOBL ·libc_lseek_trampoline_addr(SB), RODATA, $8 +DATA ·libc_lseek_trampoline_addr(SB)/8, $libc_lseek_trampoline<>(SB) + +TEXT libc_select_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_select(SB) + +GLOBL ·libc_select_trampoline_addr(SB), RODATA, $8 +DATA ·libc_select_trampoline_addr(SB)/8, $libc_select_trampoline<>(SB) + +TEXT libc_setegid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setegid(SB) + +GLOBL ·libc_setegid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setegid_trampoline_addr(SB)/8, $libc_setegid_trampoline<>(SB) + +TEXT libc_seteuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_seteuid(SB) + +GLOBL ·libc_seteuid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_seteuid_trampoline_addr(SB)/8, $libc_seteuid_trampoline<>(SB) + +TEXT libc_setgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setgid(SB) + +GLOBL ·libc_setgid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setgid_trampoline_addr(SB)/8, $libc_setgid_trampoline<>(SB) + +TEXT libc_setlogin_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setlogin(SB) + +GLOBL ·libc_setlogin_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setlogin_trampoline_addr(SB)/8, $libc_setlogin_trampoline<>(SB) + +TEXT libc_setpgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setpgid(SB) + +GLOBL ·libc_setpgid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setpgid_trampoline_addr(SB)/8, $libc_setpgid_trampoline<>(SB) + +TEXT libc_setpriority_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setpriority(SB) + +GLOBL ·libc_setpriority_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setpriority_trampoline_addr(SB)/8, $libc_setpriority_trampoline<>(SB) + +TEXT libc_setregid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setregid(SB) + +GLOBL ·libc_setregid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setregid_trampoline_addr(SB)/8, $libc_setregid_trampoline<>(SB) + +TEXT libc_setreuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setreuid(SB) + +GLOBL ·libc_setreuid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setreuid_trampoline_addr(SB)/8, $libc_setreuid_trampoline<>(SB) + +TEXT libc_setresgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setresgid(SB) + +GLOBL ·libc_setresgid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setresgid_trampoline_addr(SB)/8, $libc_setresgid_trampoline<>(SB) + +TEXT libc_setresuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setresuid(SB) + +GLOBL ·libc_setresuid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setresuid_trampoline_addr(SB)/8, $libc_setresuid_trampoline<>(SB) + +TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setrlimit(SB) + +GLOBL ·libc_setrlimit_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setrlimit_trampoline_addr(SB)/8, $libc_setrlimit_trampoline<>(SB) + +TEXT libc_setrtable_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setrtable(SB) + +GLOBL ·libc_setrtable_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setrtable_trampoline_addr(SB)/8, $libc_setrtable_trampoline<>(SB) + +TEXT libc_setsid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setsid(SB) + +GLOBL ·libc_setsid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setsid_trampoline_addr(SB)/8, $libc_setsid_trampoline<>(SB) + +TEXT libc_settimeofday_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_settimeofday(SB) + +GLOBL ·libc_settimeofday_trampoline_addr(SB), RODATA, $8 +DATA ·libc_settimeofday_trampoline_addr(SB)/8, $libc_settimeofday_trampoline<>(SB) + +TEXT libc_setuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setuid(SB) + +GLOBL ·libc_setuid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setuid_trampoline_addr(SB)/8, $libc_setuid_trampoline<>(SB) + +TEXT libc_stat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_stat(SB) + +GLOBL ·libc_stat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_stat_trampoline_addr(SB)/8, $libc_stat_trampoline<>(SB) + +TEXT libc_statfs_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_statfs(SB) + +GLOBL ·libc_statfs_trampoline_addr(SB), RODATA, $8 +DATA ·libc_statfs_trampoline_addr(SB)/8, $libc_statfs_trampoline<>(SB) + +TEXT libc_symlink_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_symlink(SB) + +GLOBL ·libc_symlink_trampoline_addr(SB), RODATA, $8 +DATA ·libc_symlink_trampoline_addr(SB)/8, $libc_symlink_trampoline<>(SB) + +TEXT libc_symlinkat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_symlinkat(SB) + +GLOBL ·libc_symlinkat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_symlinkat_trampoline_addr(SB)/8, $libc_symlinkat_trampoline<>(SB) + +TEXT libc_sync_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_sync(SB) + +GLOBL ·libc_sync_trampoline_addr(SB), RODATA, $8 +DATA ·libc_sync_trampoline_addr(SB)/8, $libc_sync_trampoline<>(SB) + +TEXT libc_truncate_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_truncate(SB) + +GLOBL ·libc_truncate_trampoline_addr(SB), RODATA, $8 +DATA ·libc_truncate_trampoline_addr(SB)/8, $libc_truncate_trampoline<>(SB) + +TEXT libc_umask_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_umask(SB) + +GLOBL ·libc_umask_trampoline_addr(SB), RODATA, $8 +DATA ·libc_umask_trampoline_addr(SB)/8, $libc_umask_trampoline<>(SB) + +TEXT libc_unlink_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_unlink(SB) + +GLOBL ·libc_unlink_trampoline_addr(SB), RODATA, $8 +DATA ·libc_unlink_trampoline_addr(SB)/8, $libc_unlink_trampoline<>(SB) + +TEXT libc_unlinkat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_unlinkat(SB) + +GLOBL ·libc_unlinkat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_unlinkat_trampoline_addr(SB)/8, $libc_unlinkat_trampoline<>(SB) + +TEXT libc_unmount_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_unmount(SB) + +GLOBL ·libc_unmount_trampoline_addr(SB), RODATA, $8 +DATA ·libc_unmount_trampoline_addr(SB)/8, $libc_unmount_trampoline<>(SB) + +TEXT libc_write_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_write(SB) + +GLOBL ·libc_write_trampoline_addr(SB), RODATA, $8 +DATA ·libc_write_trampoline_addr(SB)/8, $libc_write_trampoline<>(SB) + +TEXT libc_mmap_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mmap(SB) + +GLOBL ·libc_mmap_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mmap_trampoline_addr(SB)/8, $libc_mmap_trampoline<>(SB) + +TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_munmap(SB) + +GLOBL ·libc_munmap_trampoline_addr(SB), RODATA, $8 +DATA ·libc_munmap_trampoline_addr(SB)/8, $libc_munmap_trampoline<>(SB) + +TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_utimensat(SB) + +GLOBL ·libc_utimensat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_utimensat_trampoline_addr(SB)/8, $libc_utimensat_trampoline<>(SB) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go index 883a9b45e..69f803006 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go @@ -1128,7 +1128,7 @@ func Pathconf(path string, name int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -1145,7 +1145,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go index aac7fdc95..800aab6e3 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go @@ -1,4 +1,4 @@ -// go run mksyscall.go -openbsd -tags openbsd,arm64 syscall_bsd.go syscall_openbsd.go syscall_openbsd_arm64.go +// go run mksyscall.go -openbsd -libc -tags openbsd,arm64 syscall_bsd.go syscall_openbsd.go syscall_openbsd_arm64.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build openbsd && arm64 @@ -16,7 +16,7 @@ var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(ngid int, gid *_Gid_t) (n int, err error) { - r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + r0, _, e1 := syscall_rawSyscall(libc_getgroups_trampoline_addr, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -24,20 +24,28 @@ func getgroups(ngid int, gid *_Gid_t) (n int, err error) { return } +var libc_getgroups_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getgroups getgroups "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(ngid int, gid *_Gid_t) (err error) { - _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + _, _, e1 := syscall_rawSyscall(libc_setgroups_trampoline_addr, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setgroups_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setgroups setgroups "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { - r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + r0, _, e1 := syscall_syscall6(libc_wait4_trampoline_addr, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -45,10 +53,14 @@ func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err return } +var libc_wait4_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_wait4 wait4 "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + r0, _, e1 := syscall_syscall(libc_accept_trampoline_addr, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -56,30 +68,42 @@ func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { return } +var libc_accept_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_accept accept "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { - _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + _, _, e1 := syscall_syscall(libc_bind_trampoline_addr, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_bind_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_bind bind "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { - _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + _, _, e1 := syscall_syscall(libc_connect_trampoline_addr, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_connect_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_connect connect "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { - r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + r0, _, e1 := syscall_rawSyscall(libc_socket_trampoline_addr, uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -87,66 +111,94 @@ func socket(domain int, typ int, proto int) (fd int, err error) { return } +var libc_socket_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_socket socket "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { - _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + _, _, e1 := syscall_syscall6(libc_getsockopt_trampoline_addr, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getsockopt_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getsockopt getsockopt "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { - _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + _, _, e1 := syscall_syscall6(libc_setsockopt_trampoline_addr, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setsockopt_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setsockopt setsockopt "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { - _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + _, _, e1 := syscall_rawSyscall(libc_getpeername_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getpeername_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpeername getpeername "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { - _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + _, _, e1 := syscall_rawSyscall(libc_getsockname_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getsockname_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getsockname getsockname "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(s int, how int) (err error) { - _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + _, _, e1 := syscall_syscall(libc_shutdown_trampoline_addr, uintptr(s), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_shutdown_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_shutdown shutdown "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { - _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + _, _, e1 := syscall_rawSyscall6(libc_socketpair_trampoline_addr, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_socketpair_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_socketpair socketpair "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { @@ -156,7 +208,7 @@ func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Sockl } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + r0, _, e1 := syscall_syscall6(libc_recvfrom_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -164,6 +216,10 @@ func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Sockl return } +var libc_recvfrom_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_recvfrom recvfrom "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { @@ -173,17 +229,21 @@ func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) ( } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + _, _, e1 := syscall_syscall6(libc_sendto_trampoline_addr, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_sendto_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_sendto sendto "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { - r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + r0, _, e1 := syscall_syscall(libc_recvmsg_trampoline_addr, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -191,10 +251,14 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { return } +var libc_recvmsg_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_recvmsg recvmsg "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { - r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + r0, _, e1 := syscall_syscall(libc_sendmsg_trampoline_addr, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -202,10 +266,14 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { return } +var libc_sendmsg_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_sendmsg sendmsg "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { - r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + r0, _, e1 := syscall_syscall6(libc_kevent_trampoline_addr, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -213,6 +281,10 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne return } +var libc_kevent_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_kevent kevent "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, timeval *[2]Timeval) (err error) { @@ -221,27 +293,35 @@ func utimes(path string, timeval *[2]Timeval) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + _, _, e1 := syscall_syscall(libc_utimes_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_utimes_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_utimes utimes "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimes(fd int, timeval *[2]Timeval) (err error) { - _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + _, _, e1 := syscall_syscall(libc_futimes_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_futimes_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_futimes futimes "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { - r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + r0, _, e1 := syscall_syscall(libc_poll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -249,6 +329,10 @@ func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { return } +var libc_poll_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_poll poll "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, behav int) (err error) { @@ -258,13 +342,17 @@ func Madvise(b []byte, behav int) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + _, _, e1 := syscall_syscall(libc_madvise_trampoline_addr, uintptr(_p0), uintptr(len(b)), uintptr(behav)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_madvise_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_madvise madvise "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { @@ -274,23 +362,31 @@ func Mlock(b []byte) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + _, _, e1 := syscall_syscall(libc_mlock_trampoline_addr, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mlock_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mlock mlock "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { - _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall(libc_mlockall_trampoline_addr, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mlockall_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mlockall mlockall "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { @@ -300,13 +396,17 @@ func Mprotect(b []byte, prot int) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + _, _, e1 := syscall_syscall(libc_mprotect_trampoline_addr, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mprotect_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mprotect mprotect "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Msync(b []byte, flags int) (err error) { @@ -316,13 +416,17 @@ func Msync(b []byte, flags int) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + _, _, e1 := syscall_syscall(libc_msync_trampoline_addr, uintptr(_p0), uintptr(len(b)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_msync_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_msync msync "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { @@ -332,33 +436,45 @@ func Munlock(b []byte) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + _, _, e1 := syscall_syscall(libc_munlock_trampoline_addr, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_munlock_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_munlock munlock "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { - _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + _, _, e1 := syscall_syscall(libc_munlockall_trampoline_addr, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_munlockall_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_munlockall munlockall "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe2(p *[2]_C_int, flags int) (err error) { - _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + _, _, e1 := syscall_rawSyscall(libc_pipe2_trampoline_addr, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_pipe2_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pipe2 pipe2 "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdents(fd int, buf []byte) (n int, err error) { @@ -368,7 +484,7 @@ func Getdents(fd int, buf []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + r0, _, e1 := syscall_syscall(libc_getdents_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -376,6 +492,10 @@ func Getdents(fd int, buf []byte) (n int, err error) { return } +var libc_getdents_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getdents getdents "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getcwd(buf []byte) (n int, err error) { @@ -385,7 +505,7 @@ func Getcwd(buf []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + r0, _, e1 := syscall_syscall(libc_getcwd_trampoline_addr, uintptr(_p0), uintptr(len(buf)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -393,16 +513,24 @@ func Getcwd(buf []byte) (n int, err error) { return } +var libc_getcwd_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getcwd getcwd "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req uint, arg uintptr) (err error) { - _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + _, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_ioctl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { @@ -412,17 +540,21 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + _, _, e1 := syscall_syscall6(libc_sysctl_trampoline_addr, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_sysctl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_sysctl sysctl "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { - r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + r0, _, e1 := syscall_syscall6(libc_ppoll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -430,6 +562,10 @@ func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, return } +var libc_ppoll_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_ppoll ppoll "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Access(path string, mode uint32) (err error) { @@ -438,23 +574,31 @@ func Access(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_access_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_access_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_access access "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { - _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + _, _, e1 := syscall_syscall(libc_adjtime_trampoline_addr, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_adjtime_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_adjtime adjtime "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { @@ -463,13 +607,17 @@ func Chdir(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_chdir_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chdir_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chdir chdir "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chflags(path string, flags int) (err error) { @@ -478,13 +626,17 @@ func Chflags(path string, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + _, _, e1 := syscall_syscall(libc_chflags_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chflags_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chflags chflags "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chmod(path string, mode uint32) (err error) { @@ -493,13 +645,17 @@ func Chmod(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_chmod_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chmod_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chmod chmod "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chown(path string, uid int, gid int) (err error) { @@ -508,13 +664,17 @@ func Chown(path string, uid int, gid int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + _, _, e1 := syscall_syscall(libc_chown_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chown_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chown chown "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { @@ -523,27 +683,35 @@ func Chroot(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_chroot_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chroot_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chroot chroot "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { - _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + _, _, e1 := syscall_syscall(libc_close_trampoline_addr, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_close_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_close close "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(fd int) (nfd int, err error) { - r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + r0, _, e1 := syscall_syscall(libc_dup_trampoline_addr, uintptr(fd), 0, 0) nfd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -551,33 +719,49 @@ func Dup(fd int) (nfd int, err error) { return } +var libc_dup_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_dup dup "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(from int, to int) (err error) { - _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + _, _, e1 := syscall_syscall(libc_dup2_trampoline_addr, uintptr(from), uintptr(to), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_dup2_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_dup2 dup2 "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup3(from int, to int, flags int) (err error) { - _, _, e1 := Syscall(SYS_DUP3, uintptr(from), uintptr(to), uintptr(flags)) + _, _, e1 := syscall_syscall(libc_dup3_trampoline_addr, uintptr(from), uintptr(to), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_dup3_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_dup3 dup3 "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { - Syscall(SYS_EXIT, uintptr(code), 0, 0) + syscall_syscall(libc_exit_trampoline_addr, uintptr(code), 0, 0) return } +var libc_exit_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_exit exit "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { @@ -586,43 +770,59 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall6(libc_faccessat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_faccessat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_faccessat faccessat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { - _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + _, _, e1 := syscall_syscall(libc_fchdir_trampoline_addr, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchdir_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchdir fchdir "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchflags(fd int, flags int) (err error) { - _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + _, _, e1 := syscall_syscall(libc_fchflags_trampoline_addr, uintptr(fd), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchflags_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchflags fchflags "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { - _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_fchmod_trampoline_addr, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchmod_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchmod fchmod "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { @@ -631,23 +831,31 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall6(libc_fchmodat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchmodat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchmodat fchmodat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { - _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + _, _, e1 := syscall_syscall(libc_fchown_trampoline_addr, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchown_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchown fchown "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { @@ -656,27 +864,35 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + _, _, e1 := syscall_syscall6(libc_fchownat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchownat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchownat fchownat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { - _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + _, _, e1 := syscall_syscall(libc_flock_trampoline_addr, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_flock_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_flock flock "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fpathconf(fd int, name int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + r0, _, e1 := syscall_syscall(libc_fpathconf_trampoline_addr, uintptr(fd), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -684,16 +900,24 @@ func Fpathconf(fd int, name int) (val int, err error) { return } +var libc_fpathconf_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fpathconf fpathconf "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { - _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_fstat_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fstat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fstat fstat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { @@ -702,71 +926,99 @@ func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall6(libc_fstatat_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fstatat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fstatat fstatat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatfs(fd int, stat *Statfs_t) (err error) { - _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_fstatfs_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fstatfs_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fstatfs fstatfs "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { - _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + _, _, e1 := syscall_syscall(libc_fsync_trampoline_addr, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fsync_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fsync fsync "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { - _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length)) + _, _, e1 := syscall_syscall(libc_ftruncate_trampoline_addr, uintptr(fd), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_ftruncate_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_ftruncate ftruncate "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { - r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getegid_trampoline_addr, 0, 0, 0) egid = int(r0) return } +var libc_getegid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getegid getegid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (uid int) { - r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_geteuid_trampoline_addr, 0, 0, 0) uid = int(r0) return } +var libc_geteuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_geteuid geteuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { - r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getgid_trampoline_addr, 0, 0, 0) gid = int(r0) return } +var libc_getgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getgid getgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { - r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + r0, _, e1 := syscall_rawSyscall(libc_getpgid_trampoline_addr, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -774,34 +1026,50 @@ func Getpgid(pid int) (pgid int, err error) { return } +var libc_getpgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpgid getpgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgrp() (pgrp int) { - r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getpgrp_trampoline_addr, 0, 0, 0) pgrp = int(r0) return } +var libc_getpgrp_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpgrp getpgrp "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { - r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getpid_trampoline_addr, 0, 0, 0) pid = int(r0) return } +var libc_getpid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpid getpid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { - r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getppid_trampoline_addr, 0, 0, 0) ppid = int(r0) return } +var libc_getppid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getppid getppid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { - r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + r0, _, e1 := syscall_syscall(libc_getpriority_trampoline_addr, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -809,20 +1077,28 @@ func Getpriority(which int, who int) (prio int, err error) { return } +var libc_getpriority_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpriority getpriority "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + _, _, e1 := syscall_rawSyscall(libc_getrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getrlimit_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getrlimit getrlimit "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrtable() (rtable int, err error) { - r0, _, e1 := RawSyscall(SYS_GETRTABLE, 0, 0, 0) + r0, _, e1 := syscall_rawSyscall(libc_getrtable_trampoline_addr, 0, 0, 0) rtable = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -830,20 +1106,28 @@ func Getrtable() (rtable int, err error) { return } +var libc_getrtable_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getrtable getrtable "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { - _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + _, _, e1 := syscall_rawSyscall(libc_getrusage_trampoline_addr, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getrusage_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getrusage getrusage "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { - r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + r0, _, e1 := syscall_rawSyscall(libc_getsid_trampoline_addr, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -851,46 +1135,66 @@ func Getsid(pid int) (sid int, err error) { return } +var libc_getsid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getsid getsid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettimeofday(tv *Timeval) (err error) { - _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_gettimeofday_trampoline_addr, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_gettimeofday_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_gettimeofday gettimeofday "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { - r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getuid_trampoline_addr, 0, 0, 0) uid = int(r0) return } +var libc_getuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getuid getuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Issetugid() (tainted bool) { - r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + r0, _, _ := syscall_syscall(libc_issetugid_trampoline_addr, 0, 0, 0) tainted = bool(r0 != 0) return } +var libc_issetugid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_issetugid issetugid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kill(pid int, signum syscall.Signal) (err error) { - _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + _, _, e1 := syscall_syscall(libc_kill_trampoline_addr, uintptr(pid), uintptr(signum), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_kill_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_kill kill "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kqueue() (fd int, err error) { - r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + r0, _, e1 := syscall_syscall(libc_kqueue_trampoline_addr, 0, 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -898,6 +1202,10 @@ func Kqueue() (fd int, err error) { return } +var libc_kqueue_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_kqueue kqueue "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { @@ -906,13 +1214,17 @@ func Lchown(path string, uid int, gid int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + _, _, e1 := syscall_syscall(libc_lchown_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_lchown_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_lchown lchown "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Link(path string, link string) (err error) { @@ -926,13 +1238,17 @@ func Link(path string, link string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + _, _, e1 := syscall_syscall(libc_link_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_link_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_link link "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { @@ -946,23 +1262,31 @@ func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err er if err != nil { return } - _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + _, _, e1 := syscall_syscall6(libc_linkat_trampoline_addr, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_linkat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_linkat linkat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, backlog int) (err error) { - _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + _, _, e1 := syscall_syscall(libc_listen_trampoline_addr, uintptr(s), uintptr(backlog), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_listen_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_listen listen "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { @@ -971,13 +1295,17 @@ func Lstat(path string, stat *Stat_t) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_lstat_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_lstat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_lstat lstat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdir(path string, mode uint32) (err error) { @@ -986,13 +1314,17 @@ func Mkdir(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_mkdir_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mkdir_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mkdir mkdir "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdirat(dirfd int, path string, mode uint32) (err error) { @@ -1001,13 +1333,17 @@ func Mkdirat(dirfd int, path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + _, _, e1 := syscall_syscall(libc_mkdirat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mkdirat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mkdirat mkdirat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifo(path string, mode uint32) (err error) { @@ -1016,13 +1352,17 @@ func Mkfifo(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_mkfifo_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mkfifo_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mkfifo mkfifo "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifoat(dirfd int, path string, mode uint32) (err error) { @@ -1031,13 +1371,17 @@ func Mkfifoat(dirfd int, path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKFIFOAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + _, _, e1 := syscall_syscall(libc_mkfifoat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mkfifoat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mkfifoat mkfifoat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknod(path string, mode uint32, dev int) (err error) { @@ -1046,13 +1390,17 @@ func Mknod(path string, mode uint32, dev int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + _, _, e1 := syscall_syscall(libc_mknod_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mknod_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mknod mknod "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { @@ -1061,23 +1409,31 @@ func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + _, _, e1 := syscall_syscall6(libc_mknodat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mknodat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mknodat mknodat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Nanosleep(time *Timespec, leftover *Timespec) (err error) { - _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + _, _, e1 := syscall_syscall(libc_nanosleep_trampoline_addr, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_nanosleep_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_nanosleep nanosleep "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Open(path string, mode int, perm uint32) (fd int, err error) { @@ -1086,7 +1442,7 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { if err != nil { return } - r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + r0, _, e1 := syscall_syscall(libc_open_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1094,6 +1450,10 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { return } +var libc_open_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_open open "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { @@ -1102,7 +1462,7 @@ func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { if err != nil { return } - r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + r0, _, e1 := syscall_syscall6(libc_openat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1110,6 +1470,10 @@ func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { return } +var libc_openat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_openat openat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pathconf(path string, name int) (val int, err error) { @@ -1118,7 +1482,7 @@ func Pathconf(path string, name int) (val int, err error) { if err != nil { return } - r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + r0, _, e1 := syscall_syscall(libc_pathconf_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1126,16 +1490,20 @@ func Pathconf(path string, name int) (val int, err error) { return } +var libc_pathconf_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pathconf pathconf "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + r0, _, e1 := syscall_syscall6(libc_pread_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1143,16 +1511,20 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { return } +var libc_pread_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pread pread "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + r0, _, e1 := syscall_syscall6(libc_pwrite_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1160,6 +1532,10 @@ func Pwrite(fd int, p []byte, offset int64) (n int, err error) { return } +var libc_pwrite_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pwrite pwrite "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { @@ -1169,7 +1545,7 @@ func read(fd int, p []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1177,6 +1553,10 @@ func read(fd int, p []byte) (n int, err error) { return } +var libc_read_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_read read "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlink(path string, buf []byte) (n int, err error) { @@ -1191,7 +1571,7 @@ func Readlink(path string, buf []byte) (n int, err error) { } else { _p1 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + r0, _, e1 := syscall_syscall(libc_readlink_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1199,6 +1579,10 @@ func Readlink(path string, buf []byte) (n int, err error) { return } +var libc_readlink_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_readlink readlink "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { @@ -1213,7 +1597,7 @@ func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { } else { _p1 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + r0, _, e1 := syscall_syscall6(libc_readlinkat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1221,6 +1605,10 @@ func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { return } +var libc_readlinkat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_readlinkat readlinkat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rename(from string, to string) (err error) { @@ -1234,13 +1622,17 @@ func Rename(from string, to string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + _, _, e1 := syscall_syscall(libc_rename_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_rename_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_rename rename "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Renameat(fromfd int, from string, tofd int, to string) (err error) { @@ -1254,13 +1646,17 @@ func Renameat(fromfd int, from string, tofd int, to string) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + _, _, e1 := syscall_syscall6(libc_renameat_trampoline_addr, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_renameat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_renameat renameat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Revoke(path string) (err error) { @@ -1269,13 +1665,17 @@ func Revoke(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_revoke_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_revoke_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_revoke revoke "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rmdir(path string) (err error) { @@ -1284,17 +1684,21 @@ func Rmdir(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_rmdir_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_rmdir_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_rmdir rmdir "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { - r0, _, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(whence), 0, 0) + r0, _, e1 := syscall_syscall(libc_lseek_trampoline_addr, uintptr(fd), uintptr(offset), uintptr(whence)) newoffset = int64(r0) if e1 != 0 { err = errnoErr(e1) @@ -1302,10 +1706,14 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { return } +var libc_lseek_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_lseek lseek "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { - r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + r0, _, e1 := syscall_syscall6(libc_select_trampoline_addr, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1313,36 +1721,52 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err return } +var libc_select_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_select select "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setegid(egid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_setegid_trampoline_addr, uintptr(egid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setegid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setegid setegid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seteuid(euid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_seteuid_trampoline_addr, uintptr(euid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_seteuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_seteuid seteuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setgid(gid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_setgid_trampoline_addr, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setgid setgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setlogin(name string) (err error) { @@ -1351,97 +1775,133 @@ func Setlogin(name string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_setlogin_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setlogin_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setlogin setlogin "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + _, _, e1 := syscall_rawSyscall(libc_setpgid_trampoline_addr, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setpgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setpgid setpgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { - _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + _, _, e1 := syscall_syscall(libc_setpriority_trampoline_addr, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setpriority_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setpriority setpriority "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + _, _, e1 := syscall_rawSyscall(libc_setregid_trampoline_addr, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setregid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setregid setregid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + _, _, e1 := syscall_rawSyscall(libc_setreuid_trampoline_addr, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setreuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setreuid setreuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresgid(rgid int, egid int, sgid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + _, _, e1 := syscall_rawSyscall(libc_setresgid_trampoline_addr, uintptr(rgid), uintptr(egid), uintptr(sgid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setresgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setresgid setresgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresuid(ruid int, euid int, suid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + _, _, e1 := syscall_rawSyscall(libc_setresuid_trampoline_addr, uintptr(ruid), uintptr(euid), uintptr(suid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setresuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setresuid setresuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + _, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setrlimit_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrtable(rtable int) (err error) { - _, _, e1 := RawSyscall(SYS_SETRTABLE, uintptr(rtable), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_setrtable_trampoline_addr, uintptr(rtable), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setrtable_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setrtable setrtable "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { - r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + r0, _, e1 := syscall_rawSyscall(libc_setsid_trampoline_addr, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1449,26 +1909,38 @@ func Setsid() (pid int, err error) { return } +var libc_setsid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setsid setsid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tp *Timeval) (err error) { - _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_settimeofday_trampoline_addr, uintptr(unsafe.Pointer(tp)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_settimeofday_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_settimeofday settimeofday "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setuid(uid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_setuid_trampoline_addr, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setuid setuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { @@ -1477,13 +1949,17 @@ func Stat(path string, stat *Stat_t) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_stat_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_stat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_stat stat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Statfs(path string, stat *Statfs_t) (err error) { @@ -1492,13 +1968,17 @@ func Statfs(path string, stat *Statfs_t) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_statfs_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_statfs_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_statfs statfs "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlink(path string, link string) (err error) { @@ -1512,13 +1992,17 @@ func Symlink(path string, link string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + _, _, e1 := syscall_syscall(libc_symlink_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_symlink_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_symlink symlink "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { @@ -1532,23 +2016,31 @@ func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + _, _, e1 := syscall_syscall(libc_symlinkat_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) if e1 != 0 { err = errnoErr(e1) } return } +var libc_symlinkat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_symlinkat symlinkat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() (err error) { - _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + _, _, e1 := syscall_syscall(libc_sync_trampoline_addr, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_sync_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_sync sync "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { @@ -1557,21 +2049,29 @@ func Truncate(path string, length int64) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length)) + _, _, e1 := syscall_syscall(libc_truncate_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_truncate_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_truncate truncate "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(newmask int) (oldmask int) { - r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + r0, _, _ := syscall_syscall(libc_umask_trampoline_addr, uintptr(newmask), 0, 0) oldmask = int(r0) return } +var libc_umask_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_umask umask "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlink(path string) (err error) { @@ -1580,13 +2080,17 @@ func Unlink(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_unlink_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_unlink_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_unlink unlink "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlinkat(dirfd int, path string, flags int) (err error) { @@ -1595,13 +2099,17 @@ func Unlinkat(dirfd int, path string, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + _, _, e1 := syscall_syscall(libc_unlinkat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_unlinkat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_unlinkat unlinkat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(path string, flags int) (err error) { @@ -1610,13 +2118,17 @@ func Unmount(path string, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + _, _, e1 := syscall_syscall(libc_unmount_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_unmount_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_unmount unmount "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { @@ -1626,7 +2138,7 @@ func write(fd int, p []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1634,10 +2146,14 @@ func write(fd int, p []byte) (n int, err error) { return } +var libc_write_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_write write "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { - r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), 0, 0) + r0, _, e1 := syscall_syscall6(libc_mmap_trampoline_addr, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) ret = uintptr(r0) if e1 != 0 { err = errnoErr(e1) @@ -1645,20 +2161,28 @@ func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) ( return } +var libc_mmap_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mmap mmap "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { - _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + _, _, e1 := syscall_syscall(libc_munmap_trampoline_addr, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_munmap_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_munmap munmap "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1669,7 +2193,7 @@ func readlen(fd int, buf *byte, nbuf int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1685,9 +2209,13 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error if err != nil { return } - _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall6(libc_utimensat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } + +var libc_utimensat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_utimensat utimensat "libc.so" diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s new file mode 100644 index 000000000..4efeff9ab --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s @@ -0,0 +1,796 @@ +// go run mkasm.go openbsd arm64 +// Code generated by the command above; DO NOT EDIT. + +#include "textflag.h" + +TEXT libc_getgroups_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getgroups(SB) + +GLOBL ·libc_getgroups_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getgroups_trampoline_addr(SB)/8, $libc_getgroups_trampoline<>(SB) + +TEXT libc_setgroups_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setgroups(SB) + +GLOBL ·libc_setgroups_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setgroups_trampoline_addr(SB)/8, $libc_setgroups_trampoline<>(SB) + +TEXT libc_wait4_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_wait4(SB) + +GLOBL ·libc_wait4_trampoline_addr(SB), RODATA, $8 +DATA ·libc_wait4_trampoline_addr(SB)/8, $libc_wait4_trampoline<>(SB) + +TEXT libc_accept_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_accept(SB) + +GLOBL ·libc_accept_trampoline_addr(SB), RODATA, $8 +DATA ·libc_accept_trampoline_addr(SB)/8, $libc_accept_trampoline<>(SB) + +TEXT libc_bind_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_bind(SB) + +GLOBL ·libc_bind_trampoline_addr(SB), RODATA, $8 +DATA ·libc_bind_trampoline_addr(SB)/8, $libc_bind_trampoline<>(SB) + +TEXT libc_connect_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_connect(SB) + +GLOBL ·libc_connect_trampoline_addr(SB), RODATA, $8 +DATA ·libc_connect_trampoline_addr(SB)/8, $libc_connect_trampoline<>(SB) + +TEXT libc_socket_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_socket(SB) + +GLOBL ·libc_socket_trampoline_addr(SB), RODATA, $8 +DATA ·libc_socket_trampoline_addr(SB)/8, $libc_socket_trampoline<>(SB) + +TEXT libc_getsockopt_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getsockopt(SB) + +GLOBL ·libc_getsockopt_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getsockopt_trampoline_addr(SB)/8, $libc_getsockopt_trampoline<>(SB) + +TEXT libc_setsockopt_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setsockopt(SB) + +GLOBL ·libc_setsockopt_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setsockopt_trampoline_addr(SB)/8, $libc_setsockopt_trampoline<>(SB) + +TEXT libc_getpeername_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpeername(SB) + +GLOBL ·libc_getpeername_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getpeername_trampoline_addr(SB)/8, $libc_getpeername_trampoline<>(SB) + +TEXT libc_getsockname_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getsockname(SB) + +GLOBL ·libc_getsockname_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getsockname_trampoline_addr(SB)/8, $libc_getsockname_trampoline<>(SB) + +TEXT libc_shutdown_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_shutdown(SB) + +GLOBL ·libc_shutdown_trampoline_addr(SB), RODATA, $8 +DATA ·libc_shutdown_trampoline_addr(SB)/8, $libc_shutdown_trampoline<>(SB) + +TEXT libc_socketpair_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_socketpair(SB) + +GLOBL ·libc_socketpair_trampoline_addr(SB), RODATA, $8 +DATA ·libc_socketpair_trampoline_addr(SB)/8, $libc_socketpair_trampoline<>(SB) + +TEXT libc_recvfrom_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_recvfrom(SB) + +GLOBL ·libc_recvfrom_trampoline_addr(SB), RODATA, $8 +DATA ·libc_recvfrom_trampoline_addr(SB)/8, $libc_recvfrom_trampoline<>(SB) + +TEXT libc_sendto_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_sendto(SB) + +GLOBL ·libc_sendto_trampoline_addr(SB), RODATA, $8 +DATA ·libc_sendto_trampoline_addr(SB)/8, $libc_sendto_trampoline<>(SB) + +TEXT libc_recvmsg_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_recvmsg(SB) + +GLOBL ·libc_recvmsg_trampoline_addr(SB), RODATA, $8 +DATA ·libc_recvmsg_trampoline_addr(SB)/8, $libc_recvmsg_trampoline<>(SB) + +TEXT libc_sendmsg_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_sendmsg(SB) + +GLOBL ·libc_sendmsg_trampoline_addr(SB), RODATA, $8 +DATA ·libc_sendmsg_trampoline_addr(SB)/8, $libc_sendmsg_trampoline<>(SB) + +TEXT libc_kevent_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_kevent(SB) + +GLOBL ·libc_kevent_trampoline_addr(SB), RODATA, $8 +DATA ·libc_kevent_trampoline_addr(SB)/8, $libc_kevent_trampoline<>(SB) + +TEXT libc_utimes_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_utimes(SB) + +GLOBL ·libc_utimes_trampoline_addr(SB), RODATA, $8 +DATA ·libc_utimes_trampoline_addr(SB)/8, $libc_utimes_trampoline<>(SB) + +TEXT libc_futimes_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_futimes(SB) + +GLOBL ·libc_futimes_trampoline_addr(SB), RODATA, $8 +DATA ·libc_futimes_trampoline_addr(SB)/8, $libc_futimes_trampoline<>(SB) + +TEXT libc_poll_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_poll(SB) + +GLOBL ·libc_poll_trampoline_addr(SB), RODATA, $8 +DATA ·libc_poll_trampoline_addr(SB)/8, $libc_poll_trampoline<>(SB) + +TEXT libc_madvise_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_madvise(SB) + +GLOBL ·libc_madvise_trampoline_addr(SB), RODATA, $8 +DATA ·libc_madvise_trampoline_addr(SB)/8, $libc_madvise_trampoline<>(SB) + +TEXT libc_mlock_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mlock(SB) + +GLOBL ·libc_mlock_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mlock_trampoline_addr(SB)/8, $libc_mlock_trampoline<>(SB) + +TEXT libc_mlockall_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mlockall(SB) + +GLOBL ·libc_mlockall_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mlockall_trampoline_addr(SB)/8, $libc_mlockall_trampoline<>(SB) + +TEXT libc_mprotect_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mprotect(SB) + +GLOBL ·libc_mprotect_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mprotect_trampoline_addr(SB)/8, $libc_mprotect_trampoline<>(SB) + +TEXT libc_msync_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_msync(SB) + +GLOBL ·libc_msync_trampoline_addr(SB), RODATA, $8 +DATA ·libc_msync_trampoline_addr(SB)/8, $libc_msync_trampoline<>(SB) + +TEXT libc_munlock_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_munlock(SB) + +GLOBL ·libc_munlock_trampoline_addr(SB), RODATA, $8 +DATA ·libc_munlock_trampoline_addr(SB)/8, $libc_munlock_trampoline<>(SB) + +TEXT libc_munlockall_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_munlockall(SB) + +GLOBL ·libc_munlockall_trampoline_addr(SB), RODATA, $8 +DATA ·libc_munlockall_trampoline_addr(SB)/8, $libc_munlockall_trampoline<>(SB) + +TEXT libc_pipe2_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pipe2(SB) + +GLOBL ·libc_pipe2_trampoline_addr(SB), RODATA, $8 +DATA ·libc_pipe2_trampoline_addr(SB)/8, $libc_pipe2_trampoline<>(SB) + +TEXT libc_getdents_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getdents(SB) + +GLOBL ·libc_getdents_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getdents_trampoline_addr(SB)/8, $libc_getdents_trampoline<>(SB) + +TEXT libc_getcwd_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getcwd(SB) + +GLOBL ·libc_getcwd_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getcwd_trampoline_addr(SB)/8, $libc_getcwd_trampoline<>(SB) + +TEXT libc_ioctl_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_ioctl(SB) + +GLOBL ·libc_ioctl_trampoline_addr(SB), RODATA, $8 +DATA ·libc_ioctl_trampoline_addr(SB)/8, $libc_ioctl_trampoline<>(SB) + +TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_sysctl(SB) + +GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $8 +DATA ·libc_sysctl_trampoline_addr(SB)/8, $libc_sysctl_trampoline<>(SB) + +TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_ppoll(SB) + +GLOBL ·libc_ppoll_trampoline_addr(SB), RODATA, $8 +DATA ·libc_ppoll_trampoline_addr(SB)/8, $libc_ppoll_trampoline<>(SB) + +TEXT libc_access_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_access(SB) + +GLOBL ·libc_access_trampoline_addr(SB), RODATA, $8 +DATA ·libc_access_trampoline_addr(SB)/8, $libc_access_trampoline<>(SB) + +TEXT libc_adjtime_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_adjtime(SB) + +GLOBL ·libc_adjtime_trampoline_addr(SB), RODATA, $8 +DATA ·libc_adjtime_trampoline_addr(SB)/8, $libc_adjtime_trampoline<>(SB) + +TEXT libc_chdir_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chdir(SB) + +GLOBL ·libc_chdir_trampoline_addr(SB), RODATA, $8 +DATA ·libc_chdir_trampoline_addr(SB)/8, $libc_chdir_trampoline<>(SB) + +TEXT libc_chflags_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chflags(SB) + +GLOBL ·libc_chflags_trampoline_addr(SB), RODATA, $8 +DATA ·libc_chflags_trampoline_addr(SB)/8, $libc_chflags_trampoline<>(SB) + +TEXT libc_chmod_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chmod(SB) + +GLOBL ·libc_chmod_trampoline_addr(SB), RODATA, $8 +DATA ·libc_chmod_trampoline_addr(SB)/8, $libc_chmod_trampoline<>(SB) + +TEXT libc_chown_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chown(SB) + +GLOBL ·libc_chown_trampoline_addr(SB), RODATA, $8 +DATA ·libc_chown_trampoline_addr(SB)/8, $libc_chown_trampoline<>(SB) + +TEXT libc_chroot_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chroot(SB) + +GLOBL ·libc_chroot_trampoline_addr(SB), RODATA, $8 +DATA ·libc_chroot_trampoline_addr(SB)/8, $libc_chroot_trampoline<>(SB) + +TEXT libc_close_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_close(SB) + +GLOBL ·libc_close_trampoline_addr(SB), RODATA, $8 +DATA ·libc_close_trampoline_addr(SB)/8, $libc_close_trampoline<>(SB) + +TEXT libc_dup_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_dup(SB) + +GLOBL ·libc_dup_trampoline_addr(SB), RODATA, $8 +DATA ·libc_dup_trampoline_addr(SB)/8, $libc_dup_trampoline<>(SB) + +TEXT libc_dup2_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_dup2(SB) + +GLOBL ·libc_dup2_trampoline_addr(SB), RODATA, $8 +DATA ·libc_dup2_trampoline_addr(SB)/8, $libc_dup2_trampoline<>(SB) + +TEXT libc_dup3_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_dup3(SB) + +GLOBL ·libc_dup3_trampoline_addr(SB), RODATA, $8 +DATA ·libc_dup3_trampoline_addr(SB)/8, $libc_dup3_trampoline<>(SB) + +TEXT libc_exit_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_exit(SB) + +GLOBL ·libc_exit_trampoline_addr(SB), RODATA, $8 +DATA ·libc_exit_trampoline_addr(SB)/8, $libc_exit_trampoline<>(SB) + +TEXT libc_faccessat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_faccessat(SB) + +GLOBL ·libc_faccessat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_faccessat_trampoline_addr(SB)/8, $libc_faccessat_trampoline<>(SB) + +TEXT libc_fchdir_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchdir(SB) + +GLOBL ·libc_fchdir_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fchdir_trampoline_addr(SB)/8, $libc_fchdir_trampoline<>(SB) + +TEXT libc_fchflags_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchflags(SB) + +GLOBL ·libc_fchflags_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fchflags_trampoline_addr(SB)/8, $libc_fchflags_trampoline<>(SB) + +TEXT libc_fchmod_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchmod(SB) + +GLOBL ·libc_fchmod_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fchmod_trampoline_addr(SB)/8, $libc_fchmod_trampoline<>(SB) + +TEXT libc_fchmodat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchmodat(SB) + +GLOBL ·libc_fchmodat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fchmodat_trampoline_addr(SB)/8, $libc_fchmodat_trampoline<>(SB) + +TEXT libc_fchown_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchown(SB) + +GLOBL ·libc_fchown_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fchown_trampoline_addr(SB)/8, $libc_fchown_trampoline<>(SB) + +TEXT libc_fchownat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchownat(SB) + +GLOBL ·libc_fchownat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fchownat_trampoline_addr(SB)/8, $libc_fchownat_trampoline<>(SB) + +TEXT libc_flock_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_flock(SB) + +GLOBL ·libc_flock_trampoline_addr(SB), RODATA, $8 +DATA ·libc_flock_trampoline_addr(SB)/8, $libc_flock_trampoline<>(SB) + +TEXT libc_fpathconf_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fpathconf(SB) + +GLOBL ·libc_fpathconf_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fpathconf_trampoline_addr(SB)/8, $libc_fpathconf_trampoline<>(SB) + +TEXT libc_fstat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fstat(SB) + +GLOBL ·libc_fstat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fstat_trampoline_addr(SB)/8, $libc_fstat_trampoline<>(SB) + +TEXT libc_fstatat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fstatat(SB) + +GLOBL ·libc_fstatat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fstatat_trampoline_addr(SB)/8, $libc_fstatat_trampoline<>(SB) + +TEXT libc_fstatfs_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fstatfs(SB) + +GLOBL ·libc_fstatfs_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fstatfs_trampoline_addr(SB)/8, $libc_fstatfs_trampoline<>(SB) + +TEXT libc_fsync_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fsync(SB) + +GLOBL ·libc_fsync_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fsync_trampoline_addr(SB)/8, $libc_fsync_trampoline<>(SB) + +TEXT libc_ftruncate_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_ftruncate(SB) + +GLOBL ·libc_ftruncate_trampoline_addr(SB), RODATA, $8 +DATA ·libc_ftruncate_trampoline_addr(SB)/8, $libc_ftruncate_trampoline<>(SB) + +TEXT libc_getegid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getegid(SB) + +GLOBL ·libc_getegid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getegid_trampoline_addr(SB)/8, $libc_getegid_trampoline<>(SB) + +TEXT libc_geteuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_geteuid(SB) + +GLOBL ·libc_geteuid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_geteuid_trampoline_addr(SB)/8, $libc_geteuid_trampoline<>(SB) + +TEXT libc_getgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getgid(SB) + +GLOBL ·libc_getgid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getgid_trampoline_addr(SB)/8, $libc_getgid_trampoline<>(SB) + +TEXT libc_getpgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpgid(SB) + +GLOBL ·libc_getpgid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getpgid_trampoline_addr(SB)/8, $libc_getpgid_trampoline<>(SB) + +TEXT libc_getpgrp_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpgrp(SB) + +GLOBL ·libc_getpgrp_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getpgrp_trampoline_addr(SB)/8, $libc_getpgrp_trampoline<>(SB) + +TEXT libc_getpid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpid(SB) + +GLOBL ·libc_getpid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getpid_trampoline_addr(SB)/8, $libc_getpid_trampoline<>(SB) + +TEXT libc_getppid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getppid(SB) + +GLOBL ·libc_getppid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getppid_trampoline_addr(SB)/8, $libc_getppid_trampoline<>(SB) + +TEXT libc_getpriority_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpriority(SB) + +GLOBL ·libc_getpriority_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getpriority_trampoline_addr(SB)/8, $libc_getpriority_trampoline<>(SB) + +TEXT libc_getrlimit_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getrlimit(SB) + +GLOBL ·libc_getrlimit_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getrlimit_trampoline_addr(SB)/8, $libc_getrlimit_trampoline<>(SB) + +TEXT libc_getrtable_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getrtable(SB) + +GLOBL ·libc_getrtable_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getrtable_trampoline_addr(SB)/8, $libc_getrtable_trampoline<>(SB) + +TEXT libc_getrusage_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getrusage(SB) + +GLOBL ·libc_getrusage_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getrusage_trampoline_addr(SB)/8, $libc_getrusage_trampoline<>(SB) + +TEXT libc_getsid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getsid(SB) + +GLOBL ·libc_getsid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getsid_trampoline_addr(SB)/8, $libc_getsid_trampoline<>(SB) + +TEXT libc_gettimeofday_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_gettimeofday(SB) + +GLOBL ·libc_gettimeofday_trampoline_addr(SB), RODATA, $8 +DATA ·libc_gettimeofday_trampoline_addr(SB)/8, $libc_gettimeofday_trampoline<>(SB) + +TEXT libc_getuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getuid(SB) + +GLOBL ·libc_getuid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getuid_trampoline_addr(SB)/8, $libc_getuid_trampoline<>(SB) + +TEXT libc_issetugid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_issetugid(SB) + +GLOBL ·libc_issetugid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_issetugid_trampoline_addr(SB)/8, $libc_issetugid_trampoline<>(SB) + +TEXT libc_kill_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_kill(SB) + +GLOBL ·libc_kill_trampoline_addr(SB), RODATA, $8 +DATA ·libc_kill_trampoline_addr(SB)/8, $libc_kill_trampoline<>(SB) + +TEXT libc_kqueue_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_kqueue(SB) + +GLOBL ·libc_kqueue_trampoline_addr(SB), RODATA, $8 +DATA ·libc_kqueue_trampoline_addr(SB)/8, $libc_kqueue_trampoline<>(SB) + +TEXT libc_lchown_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_lchown(SB) + +GLOBL ·libc_lchown_trampoline_addr(SB), RODATA, $8 +DATA ·libc_lchown_trampoline_addr(SB)/8, $libc_lchown_trampoline<>(SB) + +TEXT libc_link_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_link(SB) + +GLOBL ·libc_link_trampoline_addr(SB), RODATA, $8 +DATA ·libc_link_trampoline_addr(SB)/8, $libc_link_trampoline<>(SB) + +TEXT libc_linkat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_linkat(SB) + +GLOBL ·libc_linkat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_linkat_trampoline_addr(SB)/8, $libc_linkat_trampoline<>(SB) + +TEXT libc_listen_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_listen(SB) + +GLOBL ·libc_listen_trampoline_addr(SB), RODATA, $8 +DATA ·libc_listen_trampoline_addr(SB)/8, $libc_listen_trampoline<>(SB) + +TEXT libc_lstat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_lstat(SB) + +GLOBL ·libc_lstat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_lstat_trampoline_addr(SB)/8, $libc_lstat_trampoline<>(SB) + +TEXT libc_mkdir_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mkdir(SB) + +GLOBL ·libc_mkdir_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mkdir_trampoline_addr(SB)/8, $libc_mkdir_trampoline<>(SB) + +TEXT libc_mkdirat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mkdirat(SB) + +GLOBL ·libc_mkdirat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mkdirat_trampoline_addr(SB)/8, $libc_mkdirat_trampoline<>(SB) + +TEXT libc_mkfifo_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mkfifo(SB) + +GLOBL ·libc_mkfifo_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mkfifo_trampoline_addr(SB)/8, $libc_mkfifo_trampoline<>(SB) + +TEXT libc_mkfifoat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mkfifoat(SB) + +GLOBL ·libc_mkfifoat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mkfifoat_trampoline_addr(SB)/8, $libc_mkfifoat_trampoline<>(SB) + +TEXT libc_mknod_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mknod(SB) + +GLOBL ·libc_mknod_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mknod_trampoline_addr(SB)/8, $libc_mknod_trampoline<>(SB) + +TEXT libc_mknodat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mknodat(SB) + +GLOBL ·libc_mknodat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mknodat_trampoline_addr(SB)/8, $libc_mknodat_trampoline<>(SB) + +TEXT libc_nanosleep_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_nanosleep(SB) + +GLOBL ·libc_nanosleep_trampoline_addr(SB), RODATA, $8 +DATA ·libc_nanosleep_trampoline_addr(SB)/8, $libc_nanosleep_trampoline<>(SB) + +TEXT libc_open_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_open(SB) + +GLOBL ·libc_open_trampoline_addr(SB), RODATA, $8 +DATA ·libc_open_trampoline_addr(SB)/8, $libc_open_trampoline<>(SB) + +TEXT libc_openat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_openat(SB) + +GLOBL ·libc_openat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_openat_trampoline_addr(SB)/8, $libc_openat_trampoline<>(SB) + +TEXT libc_pathconf_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pathconf(SB) + +GLOBL ·libc_pathconf_trampoline_addr(SB), RODATA, $8 +DATA ·libc_pathconf_trampoline_addr(SB)/8, $libc_pathconf_trampoline<>(SB) + +TEXT libc_pread_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pread(SB) + +GLOBL ·libc_pread_trampoline_addr(SB), RODATA, $8 +DATA ·libc_pread_trampoline_addr(SB)/8, $libc_pread_trampoline<>(SB) + +TEXT libc_pwrite_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pwrite(SB) + +GLOBL ·libc_pwrite_trampoline_addr(SB), RODATA, $8 +DATA ·libc_pwrite_trampoline_addr(SB)/8, $libc_pwrite_trampoline<>(SB) + +TEXT libc_read_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_read(SB) + +GLOBL ·libc_read_trampoline_addr(SB), RODATA, $8 +DATA ·libc_read_trampoline_addr(SB)/8, $libc_read_trampoline<>(SB) + +TEXT libc_readlink_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_readlink(SB) + +GLOBL ·libc_readlink_trampoline_addr(SB), RODATA, $8 +DATA ·libc_readlink_trampoline_addr(SB)/8, $libc_readlink_trampoline<>(SB) + +TEXT libc_readlinkat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_readlinkat(SB) + +GLOBL ·libc_readlinkat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_readlinkat_trampoline_addr(SB)/8, $libc_readlinkat_trampoline<>(SB) + +TEXT libc_rename_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_rename(SB) + +GLOBL ·libc_rename_trampoline_addr(SB), RODATA, $8 +DATA ·libc_rename_trampoline_addr(SB)/8, $libc_rename_trampoline<>(SB) + +TEXT libc_renameat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_renameat(SB) + +GLOBL ·libc_renameat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_renameat_trampoline_addr(SB)/8, $libc_renameat_trampoline<>(SB) + +TEXT libc_revoke_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_revoke(SB) + +GLOBL ·libc_revoke_trampoline_addr(SB), RODATA, $8 +DATA ·libc_revoke_trampoline_addr(SB)/8, $libc_revoke_trampoline<>(SB) + +TEXT libc_rmdir_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_rmdir(SB) + +GLOBL ·libc_rmdir_trampoline_addr(SB), RODATA, $8 +DATA ·libc_rmdir_trampoline_addr(SB)/8, $libc_rmdir_trampoline<>(SB) + +TEXT libc_lseek_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_lseek(SB) + +GLOBL ·libc_lseek_trampoline_addr(SB), RODATA, $8 +DATA ·libc_lseek_trampoline_addr(SB)/8, $libc_lseek_trampoline<>(SB) + +TEXT libc_select_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_select(SB) + +GLOBL ·libc_select_trampoline_addr(SB), RODATA, $8 +DATA ·libc_select_trampoline_addr(SB)/8, $libc_select_trampoline<>(SB) + +TEXT libc_setegid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setegid(SB) + +GLOBL ·libc_setegid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setegid_trampoline_addr(SB)/8, $libc_setegid_trampoline<>(SB) + +TEXT libc_seteuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_seteuid(SB) + +GLOBL ·libc_seteuid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_seteuid_trampoline_addr(SB)/8, $libc_seteuid_trampoline<>(SB) + +TEXT libc_setgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setgid(SB) + +GLOBL ·libc_setgid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setgid_trampoline_addr(SB)/8, $libc_setgid_trampoline<>(SB) + +TEXT libc_setlogin_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setlogin(SB) + +GLOBL ·libc_setlogin_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setlogin_trampoline_addr(SB)/8, $libc_setlogin_trampoline<>(SB) + +TEXT libc_setpgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setpgid(SB) + +GLOBL ·libc_setpgid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setpgid_trampoline_addr(SB)/8, $libc_setpgid_trampoline<>(SB) + +TEXT libc_setpriority_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setpriority(SB) + +GLOBL ·libc_setpriority_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setpriority_trampoline_addr(SB)/8, $libc_setpriority_trampoline<>(SB) + +TEXT libc_setregid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setregid(SB) + +GLOBL ·libc_setregid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setregid_trampoline_addr(SB)/8, $libc_setregid_trampoline<>(SB) + +TEXT libc_setreuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setreuid(SB) + +GLOBL ·libc_setreuid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setreuid_trampoline_addr(SB)/8, $libc_setreuid_trampoline<>(SB) + +TEXT libc_setresgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setresgid(SB) + +GLOBL ·libc_setresgid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setresgid_trampoline_addr(SB)/8, $libc_setresgid_trampoline<>(SB) + +TEXT libc_setresuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setresuid(SB) + +GLOBL ·libc_setresuid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setresuid_trampoline_addr(SB)/8, $libc_setresuid_trampoline<>(SB) + +TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setrlimit(SB) + +GLOBL ·libc_setrlimit_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setrlimit_trampoline_addr(SB)/8, $libc_setrlimit_trampoline<>(SB) + +TEXT libc_setrtable_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setrtable(SB) + +GLOBL ·libc_setrtable_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setrtable_trampoline_addr(SB)/8, $libc_setrtable_trampoline<>(SB) + +TEXT libc_setsid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setsid(SB) + +GLOBL ·libc_setsid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setsid_trampoline_addr(SB)/8, $libc_setsid_trampoline<>(SB) + +TEXT libc_settimeofday_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_settimeofday(SB) + +GLOBL ·libc_settimeofday_trampoline_addr(SB), RODATA, $8 +DATA ·libc_settimeofday_trampoline_addr(SB)/8, $libc_settimeofday_trampoline<>(SB) + +TEXT libc_setuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setuid(SB) + +GLOBL ·libc_setuid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setuid_trampoline_addr(SB)/8, $libc_setuid_trampoline<>(SB) + +TEXT libc_stat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_stat(SB) + +GLOBL ·libc_stat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_stat_trampoline_addr(SB)/8, $libc_stat_trampoline<>(SB) + +TEXT libc_statfs_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_statfs(SB) + +GLOBL ·libc_statfs_trampoline_addr(SB), RODATA, $8 +DATA ·libc_statfs_trampoline_addr(SB)/8, $libc_statfs_trampoline<>(SB) + +TEXT libc_symlink_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_symlink(SB) + +GLOBL ·libc_symlink_trampoline_addr(SB), RODATA, $8 +DATA ·libc_symlink_trampoline_addr(SB)/8, $libc_symlink_trampoline<>(SB) + +TEXT libc_symlinkat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_symlinkat(SB) + +GLOBL ·libc_symlinkat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_symlinkat_trampoline_addr(SB)/8, $libc_symlinkat_trampoline<>(SB) + +TEXT libc_sync_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_sync(SB) + +GLOBL ·libc_sync_trampoline_addr(SB), RODATA, $8 +DATA ·libc_sync_trampoline_addr(SB)/8, $libc_sync_trampoline<>(SB) + +TEXT libc_truncate_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_truncate(SB) + +GLOBL ·libc_truncate_trampoline_addr(SB), RODATA, $8 +DATA ·libc_truncate_trampoline_addr(SB)/8, $libc_truncate_trampoline<>(SB) + +TEXT libc_umask_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_umask(SB) + +GLOBL ·libc_umask_trampoline_addr(SB), RODATA, $8 +DATA ·libc_umask_trampoline_addr(SB)/8, $libc_umask_trampoline<>(SB) + +TEXT libc_unlink_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_unlink(SB) + +GLOBL ·libc_unlink_trampoline_addr(SB), RODATA, $8 +DATA ·libc_unlink_trampoline_addr(SB)/8, $libc_unlink_trampoline<>(SB) + +TEXT libc_unlinkat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_unlinkat(SB) + +GLOBL ·libc_unlinkat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_unlinkat_trampoline_addr(SB)/8, $libc_unlinkat_trampoline<>(SB) + +TEXT libc_unmount_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_unmount(SB) + +GLOBL ·libc_unmount_trampoline_addr(SB), RODATA, $8 +DATA ·libc_unmount_trampoline_addr(SB)/8, $libc_unmount_trampoline<>(SB) + +TEXT libc_write_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_write(SB) + +GLOBL ·libc_write_trampoline_addr(SB), RODATA, $8 +DATA ·libc_write_trampoline_addr(SB)/8, $libc_write_trampoline<>(SB) + +TEXT libc_mmap_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mmap(SB) + +GLOBL ·libc_mmap_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mmap_trampoline_addr(SB)/8, $libc_mmap_trampoline<>(SB) + +TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_munmap(SB) + +GLOBL ·libc_munmap_trampoline_addr(SB), RODATA, $8 +DATA ·libc_munmap_trampoline_addr(SB)/8, $libc_munmap_trampoline<>(SB) + +TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_utimensat(SB) + +GLOBL ·libc_utimensat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_utimensat_trampoline_addr(SB)/8, $libc_utimensat_trampoline<>(SB) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go index 877618746..016d959bc 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go @@ -1128,7 +1128,7 @@ func Pathconf(path string, name int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -1145,7 +1145,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go index b5f926cee..fdf53f8da 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go @@ -66,6 +66,7 @@ import ( //go:cgo_import_dynamic libc_getpriority getpriority "libc.so" //go:cgo_import_dynamic libc_getrlimit getrlimit "libc.so" //go:cgo_import_dynamic libc_getrusage getrusage "libc.so" +//go:cgo_import_dynamic libc_getsid getsid "libc.so" //go:cgo_import_dynamic libc_gettimeofday gettimeofday "libc.so" //go:cgo_import_dynamic libc_getuid getuid "libc.so" //go:cgo_import_dynamic libc_kill kill "libc.so" @@ -202,6 +203,7 @@ import ( //go:linkname procGetpriority libc_getpriority //go:linkname procGetrlimit libc_getrlimit //go:linkname procGetrusage libc_getrusage +//go:linkname procGetsid libc_getsid //go:linkname procGettimeofday libc_gettimeofday //go:linkname procGetuid libc_getuid //go:linkname procKill libc_kill @@ -227,8 +229,8 @@ import ( //go:linkname procOpenat libc_openat //go:linkname procPathconf libc_pathconf //go:linkname procPause libc_pause -//go:linkname procPread libc_pread -//go:linkname procPwrite libc_pwrite +//go:linkname procpread libc_pread +//go:linkname procpwrite libc_pwrite //go:linkname procread libc_read //go:linkname procReadlink libc_readlink //go:linkname procRename libc_rename @@ -339,6 +341,7 @@ var ( procGetpriority, procGetrlimit, procGetrusage, + procGetsid, procGettimeofday, procGetuid, procKill, @@ -364,8 +367,8 @@ var ( procOpenat, procPathconf, procPause, - procPread, - procPwrite, + procpread, + procpwrite, procread, procReadlink, procRename, @@ -1044,6 +1047,17 @@ func Getrusage(who int, rusage *Rusage) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetsid)), 1, uintptr(pid), 0, 0, 0, 0, 0) + sid = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Gettimeofday(tv *Timeval) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGettimeofday)), 1, uintptr(unsafe.Pointer(tv)), 0, 0, 0, 0, 0) if e1 != 0 { @@ -1380,12 +1394,12 @@ func Pause() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 *byte if len(p) > 0 { _p0 = &p[0] } - r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPread)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(offset), 0, 0) + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procpread)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = e1 @@ -1395,12 +1409,12 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 *byte if len(p) > 0 { _p0 = &p[0] } - r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPwrite)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(offset), 0, 0) + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procpwrite)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = e1 diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go index 59d5dfc20..4e0d96107 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go @@ -1,4 +1,4 @@ -// go run mksysnum.go https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master +// go run mksysnum.go https://cgit.freebsd.org/src/plain/sys/kern/syscalls.master?h=stable/12 // Code generated by the command above; see README.md. DO NOT EDIT. //go:build 386 && freebsd @@ -19,10 +19,9 @@ const ( SYS_UNLINK = 10 // { int unlink(char *path); } SYS_CHDIR = 12 // { int chdir(char *path); } SYS_FCHDIR = 13 // { int fchdir(int fd); } - SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } SYS_CHMOD = 15 // { int chmod(char *path, int mode); } SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } - SYS_OBREAK = 17 // { int obreak(char *nsize); } break obreak_args int + SYS_BREAK = 17 // { caddr_t break(char *nsize); } SYS_GETPID = 20 // { pid_t getpid(void); } SYS_MOUNT = 21 // { int mount(char *type, char *path, int flags, caddr_t data); } SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } @@ -43,7 +42,6 @@ const ( SYS_KILL = 37 // { int kill(int pid, int signum); } SYS_GETPPID = 39 // { pid_t getppid(void); } SYS_DUP = 41 // { int dup(u_int fd); } - SYS_PIPE = 42 // { int pipe(void); } SYS_GETEGID = 43 // { gid_t getegid(void); } SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, size_t offset, u_int scale); } SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, int facs, int pid); } @@ -58,15 +56,14 @@ const ( SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, size_t count); } SYS_EXECVE = 59 // { int execve(char *fname, char **argv, char **envv); } - SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args int + SYS_UMASK = 60 // { int umask(int newmask); } SYS_CHROOT = 61 // { int chroot(char *path); } SYS_MSYNC = 65 // { int msync(void *addr, size_t len, int flags); } SYS_VFORK = 66 // { int vfork(void); } SYS_SBRK = 69 // { int sbrk(int incr); } SYS_SSTK = 70 // { int sstk(int incr); } - SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise ovadvise_args int SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } - SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, int prot); } + SYS_MPROTECT = 74 // { int mprotect(void *addr, size_t len, int prot); } SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, int behav); } SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, char *vec); } SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, gid_t *gidset); } @@ -124,14 +121,10 @@ const ( SYS_SETGID = 181 // { int setgid(gid_t gid); } SYS_SETEGID = 182 // { int setegid(gid_t egid); } SYS_SETEUID = 183 // { int seteuid(uid_t euid); } - SYS_STAT = 188 // { int stat(char *path, struct stat *ub); } - SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); } - SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, struct rlimit *rlp); } getrlimit __getrlimit_args int SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, struct rlimit *rlp); } setrlimit __setrlimit_args int - SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, u_int count, long *basep); } SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } __sysctl sysctl_args int SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } @@ -143,12 +136,12 @@ const ( SYS_SEMOP = 222 // { int semop(int semid, struct sembuf *sops, size_t nsops); } SYS_MSGGET = 225 // { int msgget(key_t key, int msgflg); } SYS_MSGSND = 226 // { int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); } - SYS_MSGRCV = 227 // { int msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } + SYS_MSGRCV = 227 // { ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } SYS_SHMAT = 228 // { int shmat(int shmid, const void *shmaddr, int shmflg); } SYS_SHMDT = 230 // { int shmdt(const void *shmaddr); } SYS_SHMGET = 231 // { int shmget(key_t key, size_t size, int shmflg); } SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, struct timespec *tp); } - SYS_CLOCK_SETTIME = 233 // { int clock_settime( clockid_t clock_id, const struct timespec *tp); } + SYS_CLOCK_SETTIME = 233 // { int clock_settime(clockid_t clock_id, const struct timespec *tp); } SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, struct timespec *tp); } SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, struct sigevent *evp, int *timerid); } SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } @@ -157,50 +150,44 @@ const ( SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } - SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( struct ffclock_estimate *cest); } - SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( struct ffclock_estimate *cest); } + SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate(struct ffclock_estimate *cest); } + SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate(struct ffclock_estimate *cest); } SYS_CLOCK_NANOSLEEP = 244 // { int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp, struct timespec *rmtp); } - SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,int which, clockid_t *clock_id); } + SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id, int which, clockid_t *clock_id); } SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, int inherit); } SYS_RFORK = 251 // { int rfork(int flags); } - SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, u_int nfds, int timeout); } SYS_ISSETUGID = 253 // { int issetugid(void); } SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } SYS_AIO_READ = 255 // { int aio_read(struct aiocb *aiocbp); } SYS_AIO_WRITE = 256 // { int aio_write(struct aiocb *aiocbp); } - SYS_LIO_LISTIO = 257 // { int lio_listio(int mode, struct aiocb * const *acb_list, int nent, struct sigevent *sig); } - SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, size_t count); } + SYS_LIO_LISTIO = 257 // { int lio_listio(int mode, struct aiocb* const *acb_list, int nent, struct sigevent *sig); } SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } SYS_LUTIMES = 276 // { int lutimes(char *path, struct timeval *tptr); } - SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } - SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } - SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); } SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); } SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, int flags); } - SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, struct stat *sb); } SYS_MODNEXT = 300 // { int modnext(int modid); } - SYS_MODSTAT = 301 // { int modstat(int modid, struct module_stat *stat); } + SYS_MODSTAT = 301 // { int modstat(int modid, struct module_stat* stat); } SYS_MODFNEXT = 302 // { int modfnext(int modid); } SYS_MODFIND = 303 // { int modfind(const char *name); } SYS_KLDLOAD = 304 // { int kldload(const char *file); } SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } SYS_KLDFIND = 306 // { int kldfind(const char *file); } SYS_KLDNEXT = 307 // { int kldnext(int fileid); } - SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct kld_file_stat* stat); } + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct kld_file_stat *stat); } SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } SYS_GETSID = 310 // { int getsid(pid_t pid); } SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, uid_t suid); } SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); } SYS_AIO_RETURN = 314 // { ssize_t aio_return(struct aiocb *aiocbp); } - SYS_AIO_SUSPEND = 315 // { int aio_suspend( struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); } + SYS_AIO_SUSPEND = 315 // { int aio_suspend(struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); } SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, struct aiocb *aiocbp); } SYS_AIO_ERROR = 317 // { int aio_error(struct aiocb *aiocbp); } SYS_YIELD = 321 // { int yield(void); } SYS_MLOCKALL = 324 // { int mlockall(int how); } SYS_MUNLOCKALL = 325 // { int munlockall(void); } - SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } + SYS___GETCWD = 326 // { int __getcwd(char *buf, size_t buflen); } SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, const struct sched_param *param); } SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct sched_param *param); } SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param); } @@ -226,14 +213,13 @@ const ( SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, acl_type_t type, struct acl *aclp); } SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, acl_type_t type, struct acl *aclp); } SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } - SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } - SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } - SYS_AIO_WAITCOMPLETE = 359 // { ssize_t aio_waitcomplete( struct aiocb **aiocbp, struct timespec *timeout); } + SYS_AIO_WAITCOMPLETE = 359 // { ssize_t aio_waitcomplete(struct aiocb **aiocbp, struct timespec *timeout); } SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); } SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); } SYS_KQUEUE = 362 // { int kqueue(void); } - SYS_KEVENT = 363 // { int kevent(int fd, struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout); } SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } @@ -251,10 +237,6 @@ const ( SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, int count); } SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, size_t nbytes, struct sf_hdtr *hdtr, off_t *sbytes, int flags); } SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, int call, void *arg); } - SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, long bufsize, int mode); } - SYS_STATFS = 396 // { int statfs(char *path, struct statfs *buf); } - SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } - SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); } SYS_KSEM_CLOSE = 400 // { int ksem_close(semid_t id); } SYS_KSEM_POST = 401 // { int ksem_post(semid_t id); } SYS_KSEM_WAIT = 402 // { int ksem_wait(semid_t id); } @@ -267,14 +249,14 @@ const ( SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, struct mac *mac_p); } SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, struct mac *mac_p); } SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, struct mac *mac_p); } - SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } - SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } - SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link(const char *path, int attrnamespace, const char *attrname); } SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, char **envv, struct mac *mac_p); } SYS_SIGACTION = 416 // { int sigaction(int sig, const struct sigaction *act, struct sigaction *oact); } - SYS_SIGRETURN = 417 // { int sigreturn( const struct __ucontext *sigcntxp); } + SYS_SIGRETURN = 417 // { int sigreturn(const struct __ucontext *sigcntxp); } SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } - SYS_SETCONTEXT = 422 // { int setcontext( const struct __ucontext *ucp); } + SYS_SETCONTEXT = 422 // { int setcontext(const struct __ucontext *ucp); } SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, const struct __ucontext *ucp); } SYS_SWAPOFF = 424 // { int swapoff(const char *name); } SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, acl_type_t type, struct acl *aclp); } @@ -288,10 +270,10 @@ const ( SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } - SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( const char *path, int attrnamespace, void *data, size_t nbytes); } - SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); } SYS_KSEM_TIMEDWAIT = 441 // { int ksem_timedwait(semid_t id, const struct timespec *abstime); } - SYS_THR_SUSPEND = 442 // { int thr_suspend( const struct timespec *timeout); } + SYS_THR_SUSPEND = 442 // { int thr_suspend(const struct timespec *timeout); } SYS_THR_WAKE = 443 // { int thr_wake(long id); } SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } SYS_AUDIT = 445 // { int audit(const void *record, u_int length); } @@ -300,17 +282,17 @@ const ( SYS_SETAUID = 448 // { int setauid(uid_t *auid); } SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } - SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( struct auditinfo_addr *auditinfo_addr, u_int length); } - SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( struct auditinfo_addr *auditinfo_addr, u_int length); } + SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr(struct auditinfo_addr *auditinfo_addr, u_int length); } + SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr(struct auditinfo_addr *auditinfo_addr, u_int length); } SYS_AUDITCTL = 453 // { int auditctl(char *path); } SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, u_long val, void *uaddr1, void *uaddr2); } SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, int param_size); } SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } SYS_KMQ_OPEN = 457 // { int kmq_open(const char *path, int flags, mode_t mode, const struct mq_attr *attr); } - SYS_KMQ_SETATTR = 458 // { int kmq_setattr(int mqd, const struct mq_attr *attr, struct mq_attr *oattr); } - SYS_KMQ_TIMEDRECEIVE = 459 // { int kmq_timedreceive(int mqd, char *msg_ptr, size_t msg_len, unsigned *msg_prio, const struct timespec *abs_timeout); } - SYS_KMQ_TIMEDSEND = 460 // { int kmq_timedsend(int mqd, const char *msg_ptr, size_t msg_len,unsigned msg_prio, const struct timespec *abs_timeout);} - SYS_KMQ_NOTIFY = 461 // { int kmq_notify(int mqd, const struct sigevent *sigev); } + SYS_KMQ_SETATTR = 458 // { int kmq_setattr(int mqd, const struct mq_attr *attr, struct mq_attr *oattr); } + SYS_KMQ_TIMEDRECEIVE = 459 // { int kmq_timedreceive(int mqd, char *msg_ptr, size_t msg_len, unsigned *msg_prio, const struct timespec *abs_timeout); } + SYS_KMQ_TIMEDSEND = 460 // { int kmq_timedsend(int mqd, const char *msg_ptr, size_t msg_len, unsigned msg_prio, const struct timespec *abs_timeout); } + SYS_KMQ_NOTIFY = 461 // { int kmq_notify(int mqd, const struct sigevent *sigev); } SYS_KMQ_UNLINK = 462 // { int kmq_unlink(const char *path); } SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } @@ -319,7 +301,7 @@ const ( SYS_SCTP_PEELOFF = 471 // { int sctp_peeloff(int sd, uint32_t name); } SYS_SCTP_GENERIC_SENDMSG = 472 // { int sctp_generic_sendmsg(int sd, caddr_t msg, int mlen, caddr_t to, __socklen_t tolen, struct sctp_sndrcvinfo *sinfo, int flags); } SYS_SCTP_GENERIC_SENDMSG_IOV = 473 // { int sctp_generic_sendmsg_iov(int sd, struct iovec *iov, int iovlen, caddr_t to, __socklen_t tolen, struct sctp_sndrcvinfo *sinfo, int flags); } - SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, struct sockaddr * from, __socklen_t *fromlenaddr, struct sctp_sndrcvinfo *sinfo, int *msg_flags); } + SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, struct sockaddr *from, __socklen_t *fromlenaddr, struct sctp_sndrcvinfo *sinfo, int *msg_flags); } SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, size_t nbyte, off_t offset); } SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, size_t nbyte, off_t offset); } SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, int prot, int flags, int fd, off_t pos); } @@ -338,14 +320,12 @@ const ( SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, int flag); } SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, gid_t gid, int flag); } SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, char **envv); } - SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, struct stat *buf, int flag); } SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, struct timeval *times); } SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, char *path2, int flag); } SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } - SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, dev_t dev); } SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, mode_t mode); } - SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, size_t bufsize); } + SYS_READLINKAT = 500 // { ssize_t readlinkat(int fd, char *path, char *buf, size_t bufsize); } SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, char *new); } SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, char *path2); } SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } @@ -391,7 +371,24 @@ const ( SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *set); } SYS_FUTIMENS = 546 // { int futimens(int fd, struct timespec *times); } SYS_UTIMENSAT = 547 // { int utimensat(int fd, char *path, struct timespec *times, int flag); } - SYS_NUMA_GETAFFINITY = 548 // { int numa_getaffinity(cpuwhich_t which, id_t id, struct vm_domain_policy_entry *policy); } - SYS_NUMA_SETAFFINITY = 549 // { int numa_setaffinity(cpuwhich_t which, id_t id, const struct vm_domain_policy_entry *policy); } SYS_FDATASYNC = 550 // { int fdatasync(int fd); } + SYS_FSTAT = 551 // { int fstat(int fd, struct stat *sb); } + SYS_FSTATAT = 552 // { int fstatat(int fd, char *path, struct stat *buf, int flag); } + SYS_FHSTAT = 553 // { int fhstat(const struct fhandle *u_fhp, struct stat *sb); } + SYS_GETDIRENTRIES = 554 // { ssize_t getdirentries(int fd, char *buf, size_t count, off_t *basep); } + SYS_STATFS = 555 // { int statfs(char *path, struct statfs *buf); } + SYS_FSTATFS = 556 // { int fstatfs(int fd, struct statfs *buf); } + SYS_GETFSSTAT = 557 // { int getfsstat(struct statfs *buf, long bufsize, int mode); } + SYS_FHSTATFS = 558 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); } + SYS_MKNODAT = 559 // { int mknodat(int fd, char *path, mode_t mode, dev_t dev); } + SYS_KEVENT = 560 // { int kevent(int fd, struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout); } + SYS_CPUSET_GETDOMAIN = 561 // { int cpuset_getdomain(cpulevel_t level, cpuwhich_t which, id_t id, size_t domainsetsize, domainset_t *mask, int *policy); } + SYS_CPUSET_SETDOMAIN = 562 // { int cpuset_setdomain(cpulevel_t level, cpuwhich_t which, id_t id, size_t domainsetsize, domainset_t *mask, int policy); } + SYS_GETRANDOM = 563 // { int getrandom(void *buf, size_t buflen, unsigned int flags); } + SYS_GETFHAT = 564 // { int getfhat(int fd, char *path, struct fhandle *fhp, int flags); } + SYS_FHLINK = 565 // { int fhlink(struct fhandle *fhp, const char *to); } + SYS_FHLINKAT = 566 // { int fhlinkat(struct fhandle *fhp, int tofd, const char *to,); } + SYS_FHREADLINK = 567 // { int fhreadlink(struct fhandle *fhp, char *buf, size_t bufsize); } + SYS___SYSCTLBYNAME = 570 // { int __sysctlbyname(const char *name, size_t namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } + SYS_CLOSE_RANGE = 575 // { int close_range(u_int lowfd, u_int highfd, int flags); } ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go index 342d471d2..01636b838 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go @@ -1,4 +1,4 @@ -// go run mksysnum.go https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master +// go run mksysnum.go https://cgit.freebsd.org/src/plain/sys/kern/syscalls.master?h=stable/12 // Code generated by the command above; see README.md. DO NOT EDIT. //go:build amd64 && freebsd @@ -19,10 +19,9 @@ const ( SYS_UNLINK = 10 // { int unlink(char *path); } SYS_CHDIR = 12 // { int chdir(char *path); } SYS_FCHDIR = 13 // { int fchdir(int fd); } - SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } SYS_CHMOD = 15 // { int chmod(char *path, int mode); } SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } - SYS_OBREAK = 17 // { int obreak(char *nsize); } break obreak_args int + SYS_BREAK = 17 // { caddr_t break(char *nsize); } SYS_GETPID = 20 // { pid_t getpid(void); } SYS_MOUNT = 21 // { int mount(char *type, char *path, int flags, caddr_t data); } SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } @@ -43,7 +42,6 @@ const ( SYS_KILL = 37 // { int kill(int pid, int signum); } SYS_GETPPID = 39 // { pid_t getppid(void); } SYS_DUP = 41 // { int dup(u_int fd); } - SYS_PIPE = 42 // { int pipe(void); } SYS_GETEGID = 43 // { gid_t getegid(void); } SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, size_t offset, u_int scale); } SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, int facs, int pid); } @@ -58,15 +56,14 @@ const ( SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, size_t count); } SYS_EXECVE = 59 // { int execve(char *fname, char **argv, char **envv); } - SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args int + SYS_UMASK = 60 // { int umask(int newmask); } SYS_CHROOT = 61 // { int chroot(char *path); } SYS_MSYNC = 65 // { int msync(void *addr, size_t len, int flags); } SYS_VFORK = 66 // { int vfork(void); } SYS_SBRK = 69 // { int sbrk(int incr); } SYS_SSTK = 70 // { int sstk(int incr); } - SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise ovadvise_args int SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } - SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, int prot); } + SYS_MPROTECT = 74 // { int mprotect(void *addr, size_t len, int prot); } SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, int behav); } SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, char *vec); } SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, gid_t *gidset); } @@ -124,14 +121,10 @@ const ( SYS_SETGID = 181 // { int setgid(gid_t gid); } SYS_SETEGID = 182 // { int setegid(gid_t egid); } SYS_SETEUID = 183 // { int seteuid(uid_t euid); } - SYS_STAT = 188 // { int stat(char *path, struct stat *ub); } - SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); } - SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, struct rlimit *rlp); } getrlimit __getrlimit_args int SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, struct rlimit *rlp); } setrlimit __setrlimit_args int - SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, u_int count, long *basep); } SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } __sysctl sysctl_args int SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } @@ -143,12 +136,12 @@ const ( SYS_SEMOP = 222 // { int semop(int semid, struct sembuf *sops, size_t nsops); } SYS_MSGGET = 225 // { int msgget(key_t key, int msgflg); } SYS_MSGSND = 226 // { int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); } - SYS_MSGRCV = 227 // { int msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } + SYS_MSGRCV = 227 // { ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } SYS_SHMAT = 228 // { int shmat(int shmid, const void *shmaddr, int shmflg); } SYS_SHMDT = 230 // { int shmdt(const void *shmaddr); } SYS_SHMGET = 231 // { int shmget(key_t key, size_t size, int shmflg); } SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, struct timespec *tp); } - SYS_CLOCK_SETTIME = 233 // { int clock_settime( clockid_t clock_id, const struct timespec *tp); } + SYS_CLOCK_SETTIME = 233 // { int clock_settime(clockid_t clock_id, const struct timespec *tp); } SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, struct timespec *tp); } SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, struct sigevent *evp, int *timerid); } SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } @@ -157,50 +150,44 @@ const ( SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } - SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( struct ffclock_estimate *cest); } - SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( struct ffclock_estimate *cest); } + SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate(struct ffclock_estimate *cest); } + SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate(struct ffclock_estimate *cest); } SYS_CLOCK_NANOSLEEP = 244 // { int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp, struct timespec *rmtp); } - SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,int which, clockid_t *clock_id); } + SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id, int which, clockid_t *clock_id); } SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, int inherit); } SYS_RFORK = 251 // { int rfork(int flags); } - SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, u_int nfds, int timeout); } SYS_ISSETUGID = 253 // { int issetugid(void); } SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } SYS_AIO_READ = 255 // { int aio_read(struct aiocb *aiocbp); } SYS_AIO_WRITE = 256 // { int aio_write(struct aiocb *aiocbp); } - SYS_LIO_LISTIO = 257 // { int lio_listio(int mode, struct aiocb * const *acb_list, int nent, struct sigevent *sig); } - SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, size_t count); } + SYS_LIO_LISTIO = 257 // { int lio_listio(int mode, struct aiocb* const *acb_list, int nent, struct sigevent *sig); } SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } SYS_LUTIMES = 276 // { int lutimes(char *path, struct timeval *tptr); } - SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } - SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } - SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); } SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); } SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, int flags); } - SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, struct stat *sb); } SYS_MODNEXT = 300 // { int modnext(int modid); } - SYS_MODSTAT = 301 // { int modstat(int modid, struct module_stat *stat); } + SYS_MODSTAT = 301 // { int modstat(int modid, struct module_stat* stat); } SYS_MODFNEXT = 302 // { int modfnext(int modid); } SYS_MODFIND = 303 // { int modfind(const char *name); } SYS_KLDLOAD = 304 // { int kldload(const char *file); } SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } SYS_KLDFIND = 306 // { int kldfind(const char *file); } SYS_KLDNEXT = 307 // { int kldnext(int fileid); } - SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct kld_file_stat* stat); } + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct kld_file_stat *stat); } SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } SYS_GETSID = 310 // { int getsid(pid_t pid); } SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, uid_t suid); } SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); } SYS_AIO_RETURN = 314 // { ssize_t aio_return(struct aiocb *aiocbp); } - SYS_AIO_SUSPEND = 315 // { int aio_suspend( struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); } + SYS_AIO_SUSPEND = 315 // { int aio_suspend(struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); } SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, struct aiocb *aiocbp); } SYS_AIO_ERROR = 317 // { int aio_error(struct aiocb *aiocbp); } SYS_YIELD = 321 // { int yield(void); } SYS_MLOCKALL = 324 // { int mlockall(int how); } SYS_MUNLOCKALL = 325 // { int munlockall(void); } - SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } + SYS___GETCWD = 326 // { int __getcwd(char *buf, size_t buflen); } SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, const struct sched_param *param); } SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct sched_param *param); } SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param); } @@ -226,14 +213,13 @@ const ( SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, acl_type_t type, struct acl *aclp); } SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, acl_type_t type, struct acl *aclp); } SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } - SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } - SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } - SYS_AIO_WAITCOMPLETE = 359 // { ssize_t aio_waitcomplete( struct aiocb **aiocbp, struct timespec *timeout); } + SYS_AIO_WAITCOMPLETE = 359 // { ssize_t aio_waitcomplete(struct aiocb **aiocbp, struct timespec *timeout); } SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); } SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); } SYS_KQUEUE = 362 // { int kqueue(void); } - SYS_KEVENT = 363 // { int kevent(int fd, struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout); } SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } @@ -251,10 +237,6 @@ const ( SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, int count); } SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, size_t nbytes, struct sf_hdtr *hdtr, off_t *sbytes, int flags); } SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, int call, void *arg); } - SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, long bufsize, int mode); } - SYS_STATFS = 396 // { int statfs(char *path, struct statfs *buf); } - SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } - SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); } SYS_KSEM_CLOSE = 400 // { int ksem_close(semid_t id); } SYS_KSEM_POST = 401 // { int ksem_post(semid_t id); } SYS_KSEM_WAIT = 402 // { int ksem_wait(semid_t id); } @@ -267,14 +249,14 @@ const ( SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, struct mac *mac_p); } SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, struct mac *mac_p); } SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, struct mac *mac_p); } - SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } - SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } - SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link(const char *path, int attrnamespace, const char *attrname); } SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, char **envv, struct mac *mac_p); } SYS_SIGACTION = 416 // { int sigaction(int sig, const struct sigaction *act, struct sigaction *oact); } - SYS_SIGRETURN = 417 // { int sigreturn( const struct __ucontext *sigcntxp); } + SYS_SIGRETURN = 417 // { int sigreturn(const struct __ucontext *sigcntxp); } SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } - SYS_SETCONTEXT = 422 // { int setcontext( const struct __ucontext *ucp); } + SYS_SETCONTEXT = 422 // { int setcontext(const struct __ucontext *ucp); } SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, const struct __ucontext *ucp); } SYS_SWAPOFF = 424 // { int swapoff(const char *name); } SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, acl_type_t type, struct acl *aclp); } @@ -288,10 +270,10 @@ const ( SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } - SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( const char *path, int attrnamespace, void *data, size_t nbytes); } - SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); } SYS_KSEM_TIMEDWAIT = 441 // { int ksem_timedwait(semid_t id, const struct timespec *abstime); } - SYS_THR_SUSPEND = 442 // { int thr_suspend( const struct timespec *timeout); } + SYS_THR_SUSPEND = 442 // { int thr_suspend(const struct timespec *timeout); } SYS_THR_WAKE = 443 // { int thr_wake(long id); } SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } SYS_AUDIT = 445 // { int audit(const void *record, u_int length); } @@ -300,17 +282,17 @@ const ( SYS_SETAUID = 448 // { int setauid(uid_t *auid); } SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } - SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( struct auditinfo_addr *auditinfo_addr, u_int length); } - SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( struct auditinfo_addr *auditinfo_addr, u_int length); } + SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr(struct auditinfo_addr *auditinfo_addr, u_int length); } + SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr(struct auditinfo_addr *auditinfo_addr, u_int length); } SYS_AUDITCTL = 453 // { int auditctl(char *path); } SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, u_long val, void *uaddr1, void *uaddr2); } SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, int param_size); } SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } SYS_KMQ_OPEN = 457 // { int kmq_open(const char *path, int flags, mode_t mode, const struct mq_attr *attr); } - SYS_KMQ_SETATTR = 458 // { int kmq_setattr(int mqd, const struct mq_attr *attr, struct mq_attr *oattr); } - SYS_KMQ_TIMEDRECEIVE = 459 // { int kmq_timedreceive(int mqd, char *msg_ptr, size_t msg_len, unsigned *msg_prio, const struct timespec *abs_timeout); } - SYS_KMQ_TIMEDSEND = 460 // { int kmq_timedsend(int mqd, const char *msg_ptr, size_t msg_len,unsigned msg_prio, const struct timespec *abs_timeout);} - SYS_KMQ_NOTIFY = 461 // { int kmq_notify(int mqd, const struct sigevent *sigev); } + SYS_KMQ_SETATTR = 458 // { int kmq_setattr(int mqd, const struct mq_attr *attr, struct mq_attr *oattr); } + SYS_KMQ_TIMEDRECEIVE = 459 // { int kmq_timedreceive(int mqd, char *msg_ptr, size_t msg_len, unsigned *msg_prio, const struct timespec *abs_timeout); } + SYS_KMQ_TIMEDSEND = 460 // { int kmq_timedsend(int mqd, const char *msg_ptr, size_t msg_len, unsigned msg_prio, const struct timespec *abs_timeout); } + SYS_KMQ_NOTIFY = 461 // { int kmq_notify(int mqd, const struct sigevent *sigev); } SYS_KMQ_UNLINK = 462 // { int kmq_unlink(const char *path); } SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } @@ -319,7 +301,7 @@ const ( SYS_SCTP_PEELOFF = 471 // { int sctp_peeloff(int sd, uint32_t name); } SYS_SCTP_GENERIC_SENDMSG = 472 // { int sctp_generic_sendmsg(int sd, caddr_t msg, int mlen, caddr_t to, __socklen_t tolen, struct sctp_sndrcvinfo *sinfo, int flags); } SYS_SCTP_GENERIC_SENDMSG_IOV = 473 // { int sctp_generic_sendmsg_iov(int sd, struct iovec *iov, int iovlen, caddr_t to, __socklen_t tolen, struct sctp_sndrcvinfo *sinfo, int flags); } - SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, struct sockaddr * from, __socklen_t *fromlenaddr, struct sctp_sndrcvinfo *sinfo, int *msg_flags); } + SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, struct sockaddr *from, __socklen_t *fromlenaddr, struct sctp_sndrcvinfo *sinfo, int *msg_flags); } SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, size_t nbyte, off_t offset); } SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, size_t nbyte, off_t offset); } SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, int prot, int flags, int fd, off_t pos); } @@ -338,14 +320,12 @@ const ( SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, int flag); } SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, gid_t gid, int flag); } SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, char **envv); } - SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, struct stat *buf, int flag); } SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, struct timeval *times); } SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, char *path2, int flag); } SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } - SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, dev_t dev); } SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, mode_t mode); } - SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, size_t bufsize); } + SYS_READLINKAT = 500 // { ssize_t readlinkat(int fd, char *path, char *buf, size_t bufsize); } SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, char *new); } SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, char *path2); } SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } @@ -391,7 +371,24 @@ const ( SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *set); } SYS_FUTIMENS = 546 // { int futimens(int fd, struct timespec *times); } SYS_UTIMENSAT = 547 // { int utimensat(int fd, char *path, struct timespec *times, int flag); } - SYS_NUMA_GETAFFINITY = 548 // { int numa_getaffinity(cpuwhich_t which, id_t id, struct vm_domain_policy_entry *policy); } - SYS_NUMA_SETAFFINITY = 549 // { int numa_setaffinity(cpuwhich_t which, id_t id, const struct vm_domain_policy_entry *policy); } SYS_FDATASYNC = 550 // { int fdatasync(int fd); } + SYS_FSTAT = 551 // { int fstat(int fd, struct stat *sb); } + SYS_FSTATAT = 552 // { int fstatat(int fd, char *path, struct stat *buf, int flag); } + SYS_FHSTAT = 553 // { int fhstat(const struct fhandle *u_fhp, struct stat *sb); } + SYS_GETDIRENTRIES = 554 // { ssize_t getdirentries(int fd, char *buf, size_t count, off_t *basep); } + SYS_STATFS = 555 // { int statfs(char *path, struct statfs *buf); } + SYS_FSTATFS = 556 // { int fstatfs(int fd, struct statfs *buf); } + SYS_GETFSSTAT = 557 // { int getfsstat(struct statfs *buf, long bufsize, int mode); } + SYS_FHSTATFS = 558 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); } + SYS_MKNODAT = 559 // { int mknodat(int fd, char *path, mode_t mode, dev_t dev); } + SYS_KEVENT = 560 // { int kevent(int fd, struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout); } + SYS_CPUSET_GETDOMAIN = 561 // { int cpuset_getdomain(cpulevel_t level, cpuwhich_t which, id_t id, size_t domainsetsize, domainset_t *mask, int *policy); } + SYS_CPUSET_SETDOMAIN = 562 // { int cpuset_setdomain(cpulevel_t level, cpuwhich_t which, id_t id, size_t domainsetsize, domainset_t *mask, int policy); } + SYS_GETRANDOM = 563 // { int getrandom(void *buf, size_t buflen, unsigned int flags); } + SYS_GETFHAT = 564 // { int getfhat(int fd, char *path, struct fhandle *fhp, int flags); } + SYS_FHLINK = 565 // { int fhlink(struct fhandle *fhp, const char *to); } + SYS_FHLINKAT = 566 // { int fhlinkat(struct fhandle *fhp, int tofd, const char *to,); } + SYS_FHREADLINK = 567 // { int fhreadlink(struct fhandle *fhp, char *buf, size_t bufsize); } + SYS___SYSCTLBYNAME = 570 // { int __sysctlbyname(const char *name, size_t namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } + SYS_CLOSE_RANGE = 575 // { int close_range(u_int lowfd, u_int highfd, int flags); } ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go index e2e3d72c5..ad99bc106 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go @@ -1,4 +1,4 @@ -// go run mksysnum.go https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master +// go run mksysnum.go https://cgit.freebsd.org/src/plain/sys/kern/syscalls.master?h=stable/12 // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm && freebsd @@ -19,10 +19,9 @@ const ( SYS_UNLINK = 10 // { int unlink(char *path); } SYS_CHDIR = 12 // { int chdir(char *path); } SYS_FCHDIR = 13 // { int fchdir(int fd); } - SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } SYS_CHMOD = 15 // { int chmod(char *path, int mode); } SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } - SYS_OBREAK = 17 // { int obreak(char *nsize); } break obreak_args int + SYS_BREAK = 17 // { caddr_t break(char *nsize); } SYS_GETPID = 20 // { pid_t getpid(void); } SYS_MOUNT = 21 // { int mount(char *type, char *path, int flags, caddr_t data); } SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } @@ -43,7 +42,6 @@ const ( SYS_KILL = 37 // { int kill(int pid, int signum); } SYS_GETPPID = 39 // { pid_t getppid(void); } SYS_DUP = 41 // { int dup(u_int fd); } - SYS_PIPE = 42 // { int pipe(void); } SYS_GETEGID = 43 // { gid_t getegid(void); } SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, size_t offset, u_int scale); } SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, int facs, int pid); } @@ -58,15 +56,14 @@ const ( SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, size_t count); } SYS_EXECVE = 59 // { int execve(char *fname, char **argv, char **envv); } - SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args int + SYS_UMASK = 60 // { int umask(int newmask); } SYS_CHROOT = 61 // { int chroot(char *path); } SYS_MSYNC = 65 // { int msync(void *addr, size_t len, int flags); } SYS_VFORK = 66 // { int vfork(void); } SYS_SBRK = 69 // { int sbrk(int incr); } SYS_SSTK = 70 // { int sstk(int incr); } - SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise ovadvise_args int SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } - SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, int prot); } + SYS_MPROTECT = 74 // { int mprotect(void *addr, size_t len, int prot); } SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, int behav); } SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, char *vec); } SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, gid_t *gidset); } @@ -124,14 +121,10 @@ const ( SYS_SETGID = 181 // { int setgid(gid_t gid); } SYS_SETEGID = 182 // { int setegid(gid_t egid); } SYS_SETEUID = 183 // { int seteuid(uid_t euid); } - SYS_STAT = 188 // { int stat(char *path, struct stat *ub); } - SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); } - SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, struct rlimit *rlp); } getrlimit __getrlimit_args int SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, struct rlimit *rlp); } setrlimit __setrlimit_args int - SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, u_int count, long *basep); } SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } __sysctl sysctl_args int SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } @@ -143,12 +136,12 @@ const ( SYS_SEMOP = 222 // { int semop(int semid, struct sembuf *sops, size_t nsops); } SYS_MSGGET = 225 // { int msgget(key_t key, int msgflg); } SYS_MSGSND = 226 // { int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); } - SYS_MSGRCV = 227 // { int msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } + SYS_MSGRCV = 227 // { ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } SYS_SHMAT = 228 // { int shmat(int shmid, const void *shmaddr, int shmflg); } SYS_SHMDT = 230 // { int shmdt(const void *shmaddr); } SYS_SHMGET = 231 // { int shmget(key_t key, size_t size, int shmflg); } SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, struct timespec *tp); } - SYS_CLOCK_SETTIME = 233 // { int clock_settime( clockid_t clock_id, const struct timespec *tp); } + SYS_CLOCK_SETTIME = 233 // { int clock_settime(clockid_t clock_id, const struct timespec *tp); } SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, struct timespec *tp); } SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, struct sigevent *evp, int *timerid); } SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } @@ -157,50 +150,44 @@ const ( SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } - SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( struct ffclock_estimate *cest); } - SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( struct ffclock_estimate *cest); } + SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate(struct ffclock_estimate *cest); } + SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate(struct ffclock_estimate *cest); } SYS_CLOCK_NANOSLEEP = 244 // { int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp, struct timespec *rmtp); } - SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,int which, clockid_t *clock_id); } + SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id, int which, clockid_t *clock_id); } SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, int inherit); } SYS_RFORK = 251 // { int rfork(int flags); } - SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, u_int nfds, int timeout); } SYS_ISSETUGID = 253 // { int issetugid(void); } SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } SYS_AIO_READ = 255 // { int aio_read(struct aiocb *aiocbp); } SYS_AIO_WRITE = 256 // { int aio_write(struct aiocb *aiocbp); } - SYS_LIO_LISTIO = 257 // { int lio_listio(int mode, struct aiocb * const *acb_list, int nent, struct sigevent *sig); } - SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, size_t count); } + SYS_LIO_LISTIO = 257 // { int lio_listio(int mode, struct aiocb* const *acb_list, int nent, struct sigevent *sig); } SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } SYS_LUTIMES = 276 // { int lutimes(char *path, struct timeval *tptr); } - SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } - SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } - SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); } SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); } SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, int flags); } - SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, struct stat *sb); } SYS_MODNEXT = 300 // { int modnext(int modid); } - SYS_MODSTAT = 301 // { int modstat(int modid, struct module_stat *stat); } + SYS_MODSTAT = 301 // { int modstat(int modid, struct module_stat* stat); } SYS_MODFNEXT = 302 // { int modfnext(int modid); } SYS_MODFIND = 303 // { int modfind(const char *name); } SYS_KLDLOAD = 304 // { int kldload(const char *file); } SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } SYS_KLDFIND = 306 // { int kldfind(const char *file); } SYS_KLDNEXT = 307 // { int kldnext(int fileid); } - SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct kld_file_stat* stat); } + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct kld_file_stat *stat); } SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } SYS_GETSID = 310 // { int getsid(pid_t pid); } SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, uid_t suid); } SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); } SYS_AIO_RETURN = 314 // { ssize_t aio_return(struct aiocb *aiocbp); } - SYS_AIO_SUSPEND = 315 // { int aio_suspend( struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); } + SYS_AIO_SUSPEND = 315 // { int aio_suspend(struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); } SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, struct aiocb *aiocbp); } SYS_AIO_ERROR = 317 // { int aio_error(struct aiocb *aiocbp); } SYS_YIELD = 321 // { int yield(void); } SYS_MLOCKALL = 324 // { int mlockall(int how); } SYS_MUNLOCKALL = 325 // { int munlockall(void); } - SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } + SYS___GETCWD = 326 // { int __getcwd(char *buf, size_t buflen); } SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, const struct sched_param *param); } SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct sched_param *param); } SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param); } @@ -226,14 +213,13 @@ const ( SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, acl_type_t type, struct acl *aclp); } SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, acl_type_t type, struct acl *aclp); } SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } - SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } - SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } - SYS_AIO_WAITCOMPLETE = 359 // { ssize_t aio_waitcomplete( struct aiocb **aiocbp, struct timespec *timeout); } + SYS_AIO_WAITCOMPLETE = 359 // { ssize_t aio_waitcomplete(struct aiocb **aiocbp, struct timespec *timeout); } SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); } SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); } SYS_KQUEUE = 362 // { int kqueue(void); } - SYS_KEVENT = 363 // { int kevent(int fd, struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout); } SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } @@ -251,10 +237,6 @@ const ( SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, int count); } SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, size_t nbytes, struct sf_hdtr *hdtr, off_t *sbytes, int flags); } SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, int call, void *arg); } - SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, long bufsize, int mode); } - SYS_STATFS = 396 // { int statfs(char *path, struct statfs *buf); } - SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } - SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); } SYS_KSEM_CLOSE = 400 // { int ksem_close(semid_t id); } SYS_KSEM_POST = 401 // { int ksem_post(semid_t id); } SYS_KSEM_WAIT = 402 // { int ksem_wait(semid_t id); } @@ -267,14 +249,14 @@ const ( SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, struct mac *mac_p); } SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, struct mac *mac_p); } SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, struct mac *mac_p); } - SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } - SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } - SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link(const char *path, int attrnamespace, const char *attrname); } SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, char **envv, struct mac *mac_p); } SYS_SIGACTION = 416 // { int sigaction(int sig, const struct sigaction *act, struct sigaction *oact); } - SYS_SIGRETURN = 417 // { int sigreturn( const struct __ucontext *sigcntxp); } + SYS_SIGRETURN = 417 // { int sigreturn(const struct __ucontext *sigcntxp); } SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } - SYS_SETCONTEXT = 422 // { int setcontext( const struct __ucontext *ucp); } + SYS_SETCONTEXT = 422 // { int setcontext(const struct __ucontext *ucp); } SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, const struct __ucontext *ucp); } SYS_SWAPOFF = 424 // { int swapoff(const char *name); } SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, acl_type_t type, struct acl *aclp); } @@ -288,10 +270,10 @@ const ( SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } - SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( const char *path, int attrnamespace, void *data, size_t nbytes); } - SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); } SYS_KSEM_TIMEDWAIT = 441 // { int ksem_timedwait(semid_t id, const struct timespec *abstime); } - SYS_THR_SUSPEND = 442 // { int thr_suspend( const struct timespec *timeout); } + SYS_THR_SUSPEND = 442 // { int thr_suspend(const struct timespec *timeout); } SYS_THR_WAKE = 443 // { int thr_wake(long id); } SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } SYS_AUDIT = 445 // { int audit(const void *record, u_int length); } @@ -300,17 +282,17 @@ const ( SYS_SETAUID = 448 // { int setauid(uid_t *auid); } SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } - SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( struct auditinfo_addr *auditinfo_addr, u_int length); } - SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( struct auditinfo_addr *auditinfo_addr, u_int length); } + SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr(struct auditinfo_addr *auditinfo_addr, u_int length); } + SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr(struct auditinfo_addr *auditinfo_addr, u_int length); } SYS_AUDITCTL = 453 // { int auditctl(char *path); } SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, u_long val, void *uaddr1, void *uaddr2); } SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, int param_size); } SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } SYS_KMQ_OPEN = 457 // { int kmq_open(const char *path, int flags, mode_t mode, const struct mq_attr *attr); } - SYS_KMQ_SETATTR = 458 // { int kmq_setattr(int mqd, const struct mq_attr *attr, struct mq_attr *oattr); } - SYS_KMQ_TIMEDRECEIVE = 459 // { int kmq_timedreceive(int mqd, char *msg_ptr, size_t msg_len, unsigned *msg_prio, const struct timespec *abs_timeout); } - SYS_KMQ_TIMEDSEND = 460 // { int kmq_timedsend(int mqd, const char *msg_ptr, size_t msg_len,unsigned msg_prio, const struct timespec *abs_timeout);} - SYS_KMQ_NOTIFY = 461 // { int kmq_notify(int mqd, const struct sigevent *sigev); } + SYS_KMQ_SETATTR = 458 // { int kmq_setattr(int mqd, const struct mq_attr *attr, struct mq_attr *oattr); } + SYS_KMQ_TIMEDRECEIVE = 459 // { int kmq_timedreceive(int mqd, char *msg_ptr, size_t msg_len, unsigned *msg_prio, const struct timespec *abs_timeout); } + SYS_KMQ_TIMEDSEND = 460 // { int kmq_timedsend(int mqd, const char *msg_ptr, size_t msg_len, unsigned msg_prio, const struct timespec *abs_timeout); } + SYS_KMQ_NOTIFY = 461 // { int kmq_notify(int mqd, const struct sigevent *sigev); } SYS_KMQ_UNLINK = 462 // { int kmq_unlink(const char *path); } SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } @@ -319,7 +301,7 @@ const ( SYS_SCTP_PEELOFF = 471 // { int sctp_peeloff(int sd, uint32_t name); } SYS_SCTP_GENERIC_SENDMSG = 472 // { int sctp_generic_sendmsg(int sd, caddr_t msg, int mlen, caddr_t to, __socklen_t tolen, struct sctp_sndrcvinfo *sinfo, int flags); } SYS_SCTP_GENERIC_SENDMSG_IOV = 473 // { int sctp_generic_sendmsg_iov(int sd, struct iovec *iov, int iovlen, caddr_t to, __socklen_t tolen, struct sctp_sndrcvinfo *sinfo, int flags); } - SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, struct sockaddr * from, __socklen_t *fromlenaddr, struct sctp_sndrcvinfo *sinfo, int *msg_flags); } + SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, struct sockaddr *from, __socklen_t *fromlenaddr, struct sctp_sndrcvinfo *sinfo, int *msg_flags); } SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, size_t nbyte, off_t offset); } SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, size_t nbyte, off_t offset); } SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, int prot, int flags, int fd, off_t pos); } @@ -338,14 +320,12 @@ const ( SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, int flag); } SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, gid_t gid, int flag); } SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, char **envv); } - SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, struct stat *buf, int flag); } SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, struct timeval *times); } SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, char *path2, int flag); } SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } - SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, dev_t dev); } SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, mode_t mode); } - SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, size_t bufsize); } + SYS_READLINKAT = 500 // { ssize_t readlinkat(int fd, char *path, char *buf, size_t bufsize); } SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, char *new); } SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, char *path2); } SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } @@ -391,7 +371,24 @@ const ( SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *set); } SYS_FUTIMENS = 546 // { int futimens(int fd, struct timespec *times); } SYS_UTIMENSAT = 547 // { int utimensat(int fd, char *path, struct timespec *times, int flag); } - SYS_NUMA_GETAFFINITY = 548 // { int numa_getaffinity(cpuwhich_t which, id_t id, struct vm_domain_policy_entry *policy); } - SYS_NUMA_SETAFFINITY = 549 // { int numa_setaffinity(cpuwhich_t which, id_t id, const struct vm_domain_policy_entry *policy); } SYS_FDATASYNC = 550 // { int fdatasync(int fd); } + SYS_FSTAT = 551 // { int fstat(int fd, struct stat *sb); } + SYS_FSTATAT = 552 // { int fstatat(int fd, char *path, struct stat *buf, int flag); } + SYS_FHSTAT = 553 // { int fhstat(const struct fhandle *u_fhp, struct stat *sb); } + SYS_GETDIRENTRIES = 554 // { ssize_t getdirentries(int fd, char *buf, size_t count, off_t *basep); } + SYS_STATFS = 555 // { int statfs(char *path, struct statfs *buf); } + SYS_FSTATFS = 556 // { int fstatfs(int fd, struct statfs *buf); } + SYS_GETFSSTAT = 557 // { int getfsstat(struct statfs *buf, long bufsize, int mode); } + SYS_FHSTATFS = 558 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); } + SYS_MKNODAT = 559 // { int mknodat(int fd, char *path, mode_t mode, dev_t dev); } + SYS_KEVENT = 560 // { int kevent(int fd, struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout); } + SYS_CPUSET_GETDOMAIN = 561 // { int cpuset_getdomain(cpulevel_t level, cpuwhich_t which, id_t id, size_t domainsetsize, domainset_t *mask, int *policy); } + SYS_CPUSET_SETDOMAIN = 562 // { int cpuset_setdomain(cpulevel_t level, cpuwhich_t which, id_t id, size_t domainsetsize, domainset_t *mask, int policy); } + SYS_GETRANDOM = 563 // { int getrandom(void *buf, size_t buflen, unsigned int flags); } + SYS_GETFHAT = 564 // { int getfhat(int fd, char *path, struct fhandle *fhp, int flags); } + SYS_FHLINK = 565 // { int fhlink(struct fhandle *fhp, const char *to); } + SYS_FHLINKAT = 566 // { int fhlinkat(struct fhandle *fhp, int tofd, const char *to,); } + SYS_FHREADLINK = 567 // { int fhreadlink(struct fhandle *fhp, char *buf, size_t bufsize); } + SYS___SYSCTLBYNAME = 570 // { int __sysctlbyname(const char *name, size_t namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } + SYS_CLOSE_RANGE = 575 // { int close_range(u_int lowfd, u_int highfd, int flags); } ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go index 61ad5ca3c..89dcc4274 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go @@ -1,4 +1,4 @@ -// go run mksysnum.go https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master +// go run mksysnum.go https://cgit.freebsd.org/src/plain/sys/kern/syscalls.master?h=stable/12 // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm64 && freebsd @@ -19,10 +19,9 @@ const ( SYS_UNLINK = 10 // { int unlink(char *path); } SYS_CHDIR = 12 // { int chdir(char *path); } SYS_FCHDIR = 13 // { int fchdir(int fd); } - SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } SYS_CHMOD = 15 // { int chmod(char *path, int mode); } SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } - SYS_OBREAK = 17 // { int obreak(char *nsize); } break obreak_args int + SYS_BREAK = 17 // { caddr_t break(char *nsize); } SYS_GETPID = 20 // { pid_t getpid(void); } SYS_MOUNT = 21 // { int mount(char *type, char *path, int flags, caddr_t data); } SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } @@ -43,7 +42,6 @@ const ( SYS_KILL = 37 // { int kill(int pid, int signum); } SYS_GETPPID = 39 // { pid_t getppid(void); } SYS_DUP = 41 // { int dup(u_int fd); } - SYS_PIPE = 42 // { int pipe(void); } SYS_GETEGID = 43 // { gid_t getegid(void); } SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, size_t offset, u_int scale); } SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, int facs, int pid); } @@ -58,15 +56,14 @@ const ( SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, size_t count); } SYS_EXECVE = 59 // { int execve(char *fname, char **argv, char **envv); } - SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args int + SYS_UMASK = 60 // { int umask(int newmask); } SYS_CHROOT = 61 // { int chroot(char *path); } SYS_MSYNC = 65 // { int msync(void *addr, size_t len, int flags); } SYS_VFORK = 66 // { int vfork(void); } SYS_SBRK = 69 // { int sbrk(int incr); } SYS_SSTK = 70 // { int sstk(int incr); } - SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise ovadvise_args int SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } - SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, int prot); } + SYS_MPROTECT = 74 // { int mprotect(void *addr, size_t len, int prot); } SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, int behav); } SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, char *vec); } SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, gid_t *gidset); } @@ -124,14 +121,10 @@ const ( SYS_SETGID = 181 // { int setgid(gid_t gid); } SYS_SETEGID = 182 // { int setegid(gid_t egid); } SYS_SETEUID = 183 // { int seteuid(uid_t euid); } - SYS_STAT = 188 // { int stat(char *path, struct stat *ub); } - SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); } - SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, struct rlimit *rlp); } getrlimit __getrlimit_args int SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, struct rlimit *rlp); } setrlimit __setrlimit_args int - SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, u_int count, long *basep); } SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } __sysctl sysctl_args int SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } @@ -143,12 +136,12 @@ const ( SYS_SEMOP = 222 // { int semop(int semid, struct sembuf *sops, size_t nsops); } SYS_MSGGET = 225 // { int msgget(key_t key, int msgflg); } SYS_MSGSND = 226 // { int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); } - SYS_MSGRCV = 227 // { int msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } + SYS_MSGRCV = 227 // { ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } SYS_SHMAT = 228 // { int shmat(int shmid, const void *shmaddr, int shmflg); } SYS_SHMDT = 230 // { int shmdt(const void *shmaddr); } SYS_SHMGET = 231 // { int shmget(key_t key, size_t size, int shmflg); } SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, struct timespec *tp); } - SYS_CLOCK_SETTIME = 233 // { int clock_settime( clockid_t clock_id, const struct timespec *tp); } + SYS_CLOCK_SETTIME = 233 // { int clock_settime(clockid_t clock_id, const struct timespec *tp); } SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, struct timespec *tp); } SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, struct sigevent *evp, int *timerid); } SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } @@ -157,50 +150,44 @@ const ( SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } - SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( struct ffclock_estimate *cest); } - SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( struct ffclock_estimate *cest); } + SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate(struct ffclock_estimate *cest); } + SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate(struct ffclock_estimate *cest); } SYS_CLOCK_NANOSLEEP = 244 // { int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp, struct timespec *rmtp); } - SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,int which, clockid_t *clock_id); } + SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id, int which, clockid_t *clock_id); } SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, int inherit); } SYS_RFORK = 251 // { int rfork(int flags); } - SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, u_int nfds, int timeout); } SYS_ISSETUGID = 253 // { int issetugid(void); } SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } SYS_AIO_READ = 255 // { int aio_read(struct aiocb *aiocbp); } SYS_AIO_WRITE = 256 // { int aio_write(struct aiocb *aiocbp); } - SYS_LIO_LISTIO = 257 // { int lio_listio(int mode, struct aiocb * const *acb_list, int nent, struct sigevent *sig); } - SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, size_t count); } + SYS_LIO_LISTIO = 257 // { int lio_listio(int mode, struct aiocb* const *acb_list, int nent, struct sigevent *sig); } SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } SYS_LUTIMES = 276 // { int lutimes(char *path, struct timeval *tptr); } - SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } - SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } - SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); } SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); } SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, int flags); } - SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, struct stat *sb); } SYS_MODNEXT = 300 // { int modnext(int modid); } - SYS_MODSTAT = 301 // { int modstat(int modid, struct module_stat *stat); } + SYS_MODSTAT = 301 // { int modstat(int modid, struct module_stat* stat); } SYS_MODFNEXT = 302 // { int modfnext(int modid); } SYS_MODFIND = 303 // { int modfind(const char *name); } SYS_KLDLOAD = 304 // { int kldload(const char *file); } SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } SYS_KLDFIND = 306 // { int kldfind(const char *file); } SYS_KLDNEXT = 307 // { int kldnext(int fileid); } - SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct kld_file_stat* stat); } + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct kld_file_stat *stat); } SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } SYS_GETSID = 310 // { int getsid(pid_t pid); } SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, uid_t suid); } SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); } SYS_AIO_RETURN = 314 // { ssize_t aio_return(struct aiocb *aiocbp); } - SYS_AIO_SUSPEND = 315 // { int aio_suspend( struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); } + SYS_AIO_SUSPEND = 315 // { int aio_suspend(struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); } SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, struct aiocb *aiocbp); } SYS_AIO_ERROR = 317 // { int aio_error(struct aiocb *aiocbp); } SYS_YIELD = 321 // { int yield(void); } SYS_MLOCKALL = 324 // { int mlockall(int how); } SYS_MUNLOCKALL = 325 // { int munlockall(void); } - SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } + SYS___GETCWD = 326 // { int __getcwd(char *buf, size_t buflen); } SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, const struct sched_param *param); } SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct sched_param *param); } SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param); } @@ -226,14 +213,13 @@ const ( SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, acl_type_t type, struct acl *aclp); } SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, acl_type_t type, struct acl *aclp); } SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } - SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } - SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } - SYS_AIO_WAITCOMPLETE = 359 // { ssize_t aio_waitcomplete( struct aiocb **aiocbp, struct timespec *timeout); } + SYS_AIO_WAITCOMPLETE = 359 // { ssize_t aio_waitcomplete(struct aiocb **aiocbp, struct timespec *timeout); } SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); } SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); } SYS_KQUEUE = 362 // { int kqueue(void); } - SYS_KEVENT = 363 // { int kevent(int fd, struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout); } SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } @@ -251,10 +237,6 @@ const ( SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, int count); } SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, size_t nbytes, struct sf_hdtr *hdtr, off_t *sbytes, int flags); } SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, int call, void *arg); } - SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, long bufsize, int mode); } - SYS_STATFS = 396 // { int statfs(char *path, struct statfs *buf); } - SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } - SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); } SYS_KSEM_CLOSE = 400 // { int ksem_close(semid_t id); } SYS_KSEM_POST = 401 // { int ksem_post(semid_t id); } SYS_KSEM_WAIT = 402 // { int ksem_wait(semid_t id); } @@ -267,14 +249,14 @@ const ( SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, struct mac *mac_p); } SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, struct mac *mac_p); } SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, struct mac *mac_p); } - SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } - SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } - SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link(const char *path, int attrnamespace, const char *attrname); } SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, char **envv, struct mac *mac_p); } SYS_SIGACTION = 416 // { int sigaction(int sig, const struct sigaction *act, struct sigaction *oact); } - SYS_SIGRETURN = 417 // { int sigreturn( const struct __ucontext *sigcntxp); } + SYS_SIGRETURN = 417 // { int sigreturn(const struct __ucontext *sigcntxp); } SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } - SYS_SETCONTEXT = 422 // { int setcontext( const struct __ucontext *ucp); } + SYS_SETCONTEXT = 422 // { int setcontext(const struct __ucontext *ucp); } SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, const struct __ucontext *ucp); } SYS_SWAPOFF = 424 // { int swapoff(const char *name); } SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, acl_type_t type, struct acl *aclp); } @@ -288,10 +270,10 @@ const ( SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } - SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( const char *path, int attrnamespace, void *data, size_t nbytes); } - SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); } SYS_KSEM_TIMEDWAIT = 441 // { int ksem_timedwait(semid_t id, const struct timespec *abstime); } - SYS_THR_SUSPEND = 442 // { int thr_suspend( const struct timespec *timeout); } + SYS_THR_SUSPEND = 442 // { int thr_suspend(const struct timespec *timeout); } SYS_THR_WAKE = 443 // { int thr_wake(long id); } SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } SYS_AUDIT = 445 // { int audit(const void *record, u_int length); } @@ -300,17 +282,17 @@ const ( SYS_SETAUID = 448 // { int setauid(uid_t *auid); } SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } - SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( struct auditinfo_addr *auditinfo_addr, u_int length); } - SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( struct auditinfo_addr *auditinfo_addr, u_int length); } + SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr(struct auditinfo_addr *auditinfo_addr, u_int length); } + SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr(struct auditinfo_addr *auditinfo_addr, u_int length); } SYS_AUDITCTL = 453 // { int auditctl(char *path); } SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, u_long val, void *uaddr1, void *uaddr2); } SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, int param_size); } SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } SYS_KMQ_OPEN = 457 // { int kmq_open(const char *path, int flags, mode_t mode, const struct mq_attr *attr); } - SYS_KMQ_SETATTR = 458 // { int kmq_setattr(int mqd, const struct mq_attr *attr, struct mq_attr *oattr); } - SYS_KMQ_TIMEDRECEIVE = 459 // { int kmq_timedreceive(int mqd, char *msg_ptr, size_t msg_len, unsigned *msg_prio, const struct timespec *abs_timeout); } - SYS_KMQ_TIMEDSEND = 460 // { int kmq_timedsend(int mqd, const char *msg_ptr, size_t msg_len,unsigned msg_prio, const struct timespec *abs_timeout);} - SYS_KMQ_NOTIFY = 461 // { int kmq_notify(int mqd, const struct sigevent *sigev); } + SYS_KMQ_SETATTR = 458 // { int kmq_setattr(int mqd, const struct mq_attr *attr, struct mq_attr *oattr); } + SYS_KMQ_TIMEDRECEIVE = 459 // { int kmq_timedreceive(int mqd, char *msg_ptr, size_t msg_len, unsigned *msg_prio, const struct timespec *abs_timeout); } + SYS_KMQ_TIMEDSEND = 460 // { int kmq_timedsend(int mqd, const char *msg_ptr, size_t msg_len, unsigned msg_prio, const struct timespec *abs_timeout); } + SYS_KMQ_NOTIFY = 461 // { int kmq_notify(int mqd, const struct sigevent *sigev); } SYS_KMQ_UNLINK = 462 // { int kmq_unlink(const char *path); } SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } @@ -319,7 +301,7 @@ const ( SYS_SCTP_PEELOFF = 471 // { int sctp_peeloff(int sd, uint32_t name); } SYS_SCTP_GENERIC_SENDMSG = 472 // { int sctp_generic_sendmsg(int sd, caddr_t msg, int mlen, caddr_t to, __socklen_t tolen, struct sctp_sndrcvinfo *sinfo, int flags); } SYS_SCTP_GENERIC_SENDMSG_IOV = 473 // { int sctp_generic_sendmsg_iov(int sd, struct iovec *iov, int iovlen, caddr_t to, __socklen_t tolen, struct sctp_sndrcvinfo *sinfo, int flags); } - SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, struct sockaddr * from, __socklen_t *fromlenaddr, struct sctp_sndrcvinfo *sinfo, int *msg_flags); } + SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, struct sockaddr *from, __socklen_t *fromlenaddr, struct sctp_sndrcvinfo *sinfo, int *msg_flags); } SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, size_t nbyte, off_t offset); } SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, size_t nbyte, off_t offset); } SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, int prot, int flags, int fd, off_t pos); } @@ -338,14 +320,12 @@ const ( SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, int flag); } SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, gid_t gid, int flag); } SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, char **envv); } - SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, struct stat *buf, int flag); } SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, struct timeval *times); } SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, char *path2, int flag); } SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } - SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, dev_t dev); } SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, mode_t mode); } - SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, size_t bufsize); } + SYS_READLINKAT = 500 // { ssize_t readlinkat(int fd, char *path, char *buf, size_t bufsize); } SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, char *new); } SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, char *path2); } SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } @@ -391,7 +371,24 @@ const ( SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *set); } SYS_FUTIMENS = 546 // { int futimens(int fd, struct timespec *times); } SYS_UTIMENSAT = 547 // { int utimensat(int fd, char *path, struct timespec *times, int flag); } - SYS_NUMA_GETAFFINITY = 548 // { int numa_getaffinity(cpuwhich_t which, id_t id, struct vm_domain_policy_entry *policy); } - SYS_NUMA_SETAFFINITY = 549 // { int numa_setaffinity(cpuwhich_t which, id_t id, const struct vm_domain_policy_entry *policy); } SYS_FDATASYNC = 550 // { int fdatasync(int fd); } + SYS_FSTAT = 551 // { int fstat(int fd, struct stat *sb); } + SYS_FSTATAT = 552 // { int fstatat(int fd, char *path, struct stat *buf, int flag); } + SYS_FHSTAT = 553 // { int fhstat(const struct fhandle *u_fhp, struct stat *sb); } + SYS_GETDIRENTRIES = 554 // { ssize_t getdirentries(int fd, char *buf, size_t count, off_t *basep); } + SYS_STATFS = 555 // { int statfs(char *path, struct statfs *buf); } + SYS_FSTATFS = 556 // { int fstatfs(int fd, struct statfs *buf); } + SYS_GETFSSTAT = 557 // { int getfsstat(struct statfs *buf, long bufsize, int mode); } + SYS_FHSTATFS = 558 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); } + SYS_MKNODAT = 559 // { int mknodat(int fd, char *path, mode_t mode, dev_t dev); } + SYS_KEVENT = 560 // { int kevent(int fd, struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout); } + SYS_CPUSET_GETDOMAIN = 561 // { int cpuset_getdomain(cpulevel_t level, cpuwhich_t which, id_t id, size_t domainsetsize, domainset_t *mask, int *policy); } + SYS_CPUSET_SETDOMAIN = 562 // { int cpuset_setdomain(cpulevel_t level, cpuwhich_t which, id_t id, size_t domainsetsize, domainset_t *mask, int policy); } + SYS_GETRANDOM = 563 // { int getrandom(void *buf, size_t buflen, unsigned int flags); } + SYS_GETFHAT = 564 // { int getfhat(int fd, char *path, struct fhandle *fhp, int flags); } + SYS_FHLINK = 565 // { int fhlink(struct fhandle *fhp, const char *to); } + SYS_FHLINKAT = 566 // { int fhlinkat(struct fhandle *fhp, int tofd, const char *to,); } + SYS_FHREADLINK = 567 // { int fhreadlink(struct fhandle *fhp, char *buf, size_t bufsize); } + SYS___SYSCTLBYNAME = 570 // { int __sysctlbyname(const char *name, size_t namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } + SYS_CLOSE_RANGE = 575 // { int close_range(u_int lowfd, u_int highfd, int flags); } ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_riscv64.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_riscv64.go new file mode 100644 index 000000000..ee37aaa0c --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_riscv64.go @@ -0,0 +1,394 @@ +// go run mksysnum.go https://cgit.freebsd.org/src/plain/sys/kern/syscalls.master?h=stable/12 +// Code generated by the command above; see README.md. DO NOT EDIT. + +//go:build riscv64 && freebsd +// +build riscv64,freebsd + +package unix + +const ( + // SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int + SYS_EXIT = 1 // { void sys_exit(int rval); } exit sys_exit_args void + SYS_FORK = 2 // { int fork(void); } + SYS_READ = 3 // { ssize_t read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, size_t nbyte); } + SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } + SYS_CLOSE = 6 // { int close(int fd); } + SYS_WAIT4 = 7 // { int wait4(int pid, int *status, int options, struct rusage *rusage); } + SYS_LINK = 9 // { int link(char *path, char *link); } + SYS_UNLINK = 10 // { int unlink(char *path); } + SYS_CHDIR = 12 // { int chdir(char *path); } + SYS_FCHDIR = 13 // { int fchdir(int fd); } + SYS_CHMOD = 15 // { int chmod(char *path, int mode); } + SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } + SYS_BREAK = 17 // { caddr_t break(char *nsize); } + SYS_GETPID = 20 // { pid_t getpid(void); } + SYS_MOUNT = 21 // { int mount(char *type, char *path, int flags, caddr_t data); } + SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } + SYS_SETUID = 23 // { int setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t getuid(void); } + SYS_GETEUID = 25 // { uid_t geteuid(void); } + SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, caddr_t addr, int data); } + SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, int flags); } + SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, int flags); } + SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, size_t len, int flags, struct sockaddr * __restrict from, __socklen_t * __restrict fromlenaddr); } + SYS_ACCEPT = 30 // { int accept(int s, struct sockaddr * __restrict name, __socklen_t * __restrict anamelen); } + SYS_GETPEERNAME = 31 // { int getpeername(int fdes, struct sockaddr * __restrict asa, __socklen_t * __restrict alen); } + SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, struct sockaddr * __restrict asa, __socklen_t * __restrict alen); } + SYS_ACCESS = 33 // { int access(char *path, int amode); } + SYS_CHFLAGS = 34 // { int chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { int sync(void); } + SYS_KILL = 37 // { int kill(int pid, int signum); } + SYS_GETPPID = 39 // { pid_t getppid(void); } + SYS_DUP = 41 // { int dup(u_int fd); } + SYS_GETEGID = 43 // { gid_t getegid(void); } + SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, size_t offset, u_int scale); } + SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, int facs, int pid); } + SYS_GETGID = 47 // { gid_t getgid(void); } + SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int namelen); } + SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } + SYS_ACCT = 51 // { int acct(char *path); } + SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, stack_t *oss); } + SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, caddr_t data); } + SYS_REBOOT = 55 // { int reboot(int opt); } + SYS_REVOKE = 56 // { int revoke(char *path); } + SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } + SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, size_t count); } + SYS_EXECVE = 59 // { int execve(char *fname, char **argv, char **envv); } + SYS_UMASK = 60 // { int umask(int newmask); } + SYS_CHROOT = 61 // { int chroot(char *path); } + SYS_MSYNC = 65 // { int msync(void *addr, size_t len, int flags); } + SYS_VFORK = 66 // { int vfork(void); } + SYS_SBRK = 69 // { int sbrk(int incr); } + SYS_SSTK = 70 // { int sstk(int incr); } + SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int mprotect(void *addr, size_t len, int prot); } + SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, int behav); } + SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, char *vec); } + SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, gid_t *gidset); } + SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, gid_t *gidset); } + SYS_GETPGRP = 81 // { int getpgrp(void); } + SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } + SYS_SETITIMER = 83 // { int setitimer(u_int which, struct itimerval *itv, struct itimerval *oitv); } + SYS_SWAPON = 85 // { int swapon(char *name); } + SYS_GETITIMER = 86 // { int getitimer(u_int which, struct itimerval *itv); } + SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } + SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); } + SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } + SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); } + SYS_FSYNC = 95 // { int fsync(int fd); } + SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, int prio); } + SYS_SOCKET = 97 // { int socket(int domain, int type, int protocol); } + SYS_CONNECT = 98 // { int connect(int s, caddr_t name, int namelen); } + SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } + SYS_BIND = 104 // { int bind(int s, caddr_t name, int namelen); } + SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, caddr_t val, int valsize); } + SYS_LISTEN = 106 // { int listen(int s, int backlog); } + SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, struct timezone *tzp); } + SYS_GETRUSAGE = 117 // { int getrusage(int who, struct rusage *rusage); } + SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, caddr_t val, int *avalsize); } + SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, u_int iovcnt); } + SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, u_int iovcnt); } + SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, struct timezone *tzp); } + SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } + SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } + SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } + SYS_SETREGID = 127 // { int setregid(int rgid, int egid); } + SYS_RENAME = 128 // { int rename(char *from, char *to); } + SYS_FLOCK = 131 // { int flock(int fd, int how); } + SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } + SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, int flags, caddr_t to, int tolen); } + SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, int protocol, int *rsv); } + SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } + SYS_RMDIR = 137 // { int rmdir(char *path); } + SYS_UTIMES = 138 // { int utimes(char *path, struct timeval *tptr); } + SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, struct timeval *olddelta); } + SYS_SETSID = 147 // { int setsid(void); } + SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, caddr_t arg); } + SYS_NLM_SYSCALL = 154 // { int nlm_syscall(int debug_level, int grace_period, int addr_count, char **addrs); } + SYS_NFSSVC = 155 // { int nfssvc(int flag, caddr_t argp); } + SYS_LGETFH = 160 // { int lgetfh(char *fname, struct fhandle *fhp); } + SYS_GETFH = 161 // { int getfh(char *fname, struct fhandle *fhp); } + SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } + SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, struct rtprio *rtp); } + SYS_SEMSYS = 169 // { int semsys(int which, int a2, int a3, int a4, int a5); } + SYS_MSGSYS = 170 // { int msgsys(int which, int a2, int a3, int a4, int a5, int a6); } + SYS_SHMSYS = 171 // { int shmsys(int which, int a2, int a3, int a4); } + SYS_SETFIB = 175 // { int setfib(int fibnum); } + SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int setgid(gid_t gid); } + SYS_SETEGID = 182 // { int setegid(gid_t egid); } + SYS_SETEUID = 183 // { int seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } + SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, struct rlimit *rlp); } getrlimit __getrlimit_args int + SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, struct rlimit *rlp); } setrlimit __setrlimit_args int + SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } __sysctl sysctl_args int + SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int undelete(char *path); } + SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } + SYS_GETPGID = 207 // { int getpgid(pid_t pid); } + SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, int timeout); } + SYS_SEMGET = 221 // { int semget(key_t key, int nsems, int semflg); } + SYS_SEMOP = 222 // { int semop(int semid, struct sembuf *sops, size_t nsops); } + SYS_MSGGET = 225 // { int msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); } + SYS_MSGRCV = 227 // { ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } + SYS_SHMAT = 228 // { int shmat(int shmid, const void *shmaddr, int shmflg); } + SYS_SHMDT = 230 // { int shmdt(const void *shmaddr); } + SYS_SHMGET = 231 // { int shmget(key_t key, size_t size, int shmflg); } + SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, struct timespec *tp); } + SYS_CLOCK_SETTIME = 233 // { int clock_settime(clockid_t clock_id, const struct timespec *tp); } + SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, struct timespec *tp); } + SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, struct sigevent *evp, int *timerid); } + SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } + SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); } + SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct itimerspec *value); } + SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } + SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } + SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } + SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate(struct ffclock_estimate *cest); } + SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate(struct ffclock_estimate *cest); } + SYS_CLOCK_NANOSLEEP = 244 // { int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp, struct timespec *rmtp); } + SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id, int which, clockid_t *clock_id); } + SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } + SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, int inherit); } + SYS_RFORK = 251 // { int rfork(int flags); } + SYS_ISSETUGID = 253 // { int issetugid(void); } + SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } + SYS_AIO_READ = 255 // { int aio_read(struct aiocb *aiocbp); } + SYS_AIO_WRITE = 256 // { int aio_write(struct aiocb *aiocbp); } + SYS_LIO_LISTIO = 257 // { int lio_listio(int mode, struct aiocb* const *acb_list, int nent, struct sigevent *sig); } + SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } + SYS_LUTIMES = 276 // { int lutimes(char *path, struct timeval *tptr); } + SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); } + SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); } + SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, int flags); } + SYS_MODNEXT = 300 // { int modnext(int modid); } + SYS_MODSTAT = 301 // { int modstat(int modid, struct module_stat* stat); } + SYS_MODFNEXT = 302 // { int modfnext(int modid); } + SYS_MODFIND = 303 // { int modfind(const char *name); } + SYS_KLDLOAD = 304 // { int kldload(const char *file); } + SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } + SYS_KLDFIND = 306 // { int kldfind(const char *file); } + SYS_KLDNEXT = 307 // { int kldnext(int fileid); } + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct kld_file_stat *stat); } + SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } + SYS_GETSID = 310 // { int getsid(pid_t pid); } + SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, uid_t suid); } + SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); } + SYS_AIO_RETURN = 314 // { ssize_t aio_return(struct aiocb *aiocbp); } + SYS_AIO_SUSPEND = 315 // { int aio_suspend(struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); } + SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, struct aiocb *aiocbp); } + SYS_AIO_ERROR = 317 // { int aio_error(struct aiocb *aiocbp); } + SYS_YIELD = 321 // { int yield(void); } + SYS_MLOCKALL = 324 // { int mlockall(int how); } + SYS_MUNLOCKALL = 325 // { int munlockall(void); } + SYS___GETCWD = 326 // { int __getcwd(char *buf, size_t buflen); } + SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, const struct sched_param *param); } + SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct sched_param *param); } + SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param); } + SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } + SYS_SCHED_YIELD = 331 // { int sched_yield (void); } + SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } + SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } + SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, struct timespec *interval); } + SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } + SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, void *data); } + SYS_JAIL = 338 // { int jail(struct jail *jail); } + SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, const sigset_t *set, sigset_t *oset); } + SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } + SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } + SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, siginfo_t *info, const struct timespec *timeout); } + SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, siginfo_t *info); } + SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, acl_type_t type, struct acl *aclp); } + SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, acl_type_t type, struct acl *aclp); } + SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, acl_type_t type, struct acl *aclp); } + SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, acl_type_t type, struct acl *aclp); } + SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, acl_type_t type); } + SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, acl_type_t type); } + SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, acl_type_t type, struct acl *aclp); } + SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, acl_type_t type, struct acl *aclp); } + SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } + SYS_AIO_WAITCOMPLETE = 359 // { ssize_t aio_waitcomplete(struct aiocb **aiocbp, struct timespec *timeout); } + SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); } + SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); } + SYS_KQUEUE = 362 // { int kqueue(void); } + SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } + SYS___SETUGID = 374 // { int __setugid(int flag); } + SYS_EACCESS = 376 // { int eaccess(char *path, int amode); } + SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, unsigned int iovcnt, int flags); } + SYS___MAC_GET_PROC = 384 // { int __mac_get_proc(struct mac *mac_p); } + SYS___MAC_SET_PROC = 385 // { int __mac_set_proc(struct mac *mac_p); } + SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, struct mac *mac_p); } + SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, struct mac *mac_p); } + SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, struct mac *mac_p); } + SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, struct mac *mac_p); } + SYS_KENV = 390 // { int kenv(int what, const char *name, char *value, int len); } + SYS_LCHFLAGS = 391 // { int lchflags(const char *path, u_long flags); } + SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, int count); } + SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, size_t nbytes, struct sf_hdtr *hdtr, off_t *sbytes, int flags); } + SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, int call, void *arg); } + SYS_KSEM_CLOSE = 400 // { int ksem_close(semid_t id); } + SYS_KSEM_POST = 401 // { int ksem_post(semid_t id); } + SYS_KSEM_WAIT = 402 // { int ksem_wait(semid_t id); } + SYS_KSEM_TRYWAIT = 403 // { int ksem_trywait(semid_t id); } + SYS_KSEM_INIT = 404 // { int ksem_init(semid_t *idp, unsigned int value); } + SYS_KSEM_OPEN = 405 // { int ksem_open(semid_t *idp, const char *name, int oflag, mode_t mode, unsigned int value); } + SYS_KSEM_UNLINK = 406 // { int ksem_unlink(const char *name); } + SYS_KSEM_GETVALUE = 407 // { int ksem_getvalue(semid_t id, int *val); } + SYS_KSEM_DESTROY = 408 // { int ksem_destroy(semid_t id); } + SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, struct mac *mac_p); } + SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, struct mac *mac_p); } + SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, struct mac *mac_p); } + SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link(const char *path, int attrnamespace, const char *attrname); } + SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, char **envv, struct mac *mac_p); } + SYS_SIGACTION = 416 // { int sigaction(int sig, const struct sigaction *act, struct sigaction *oact); } + SYS_SIGRETURN = 417 // { int sigreturn(const struct __ucontext *sigcntxp); } + SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 422 // { int setcontext(const struct __ucontext *ucp); } + SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, const struct __ucontext *ucp); } + SYS_SWAPOFF = 424 // { int swapoff(const char *name); } + SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, acl_type_t type, struct acl *aclp); } + SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, acl_type_t type, struct acl *aclp); } + SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, acl_type_t type); } + SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, acl_type_t type, struct acl *aclp); } + SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, int *sig); } + SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, int flags); } + SYS_THR_EXIT = 431 // { void thr_exit(long *state); } + SYS_THR_SELF = 432 // { int thr_self(long *id); } + SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } + SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } + SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_KSEM_TIMEDWAIT = 441 // { int ksem_timedwait(semid_t id, const struct timespec *abstime); } + SYS_THR_SUSPEND = 442 // { int thr_suspend(const struct timespec *timeout); } + SYS_THR_WAKE = 443 // { int thr_wake(long id); } + SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } + SYS_AUDIT = 445 // { int audit(const void *record, u_int length); } + SYS_AUDITON = 446 // { int auditon(int cmd, void *data, u_int length); } + SYS_GETAUID = 447 // { int getauid(uid_t *auid); } + SYS_SETAUID = 448 // { int setauid(uid_t *auid); } + SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } + SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } + SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr(struct auditinfo_addr *auditinfo_addr, u_int length); } + SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr(struct auditinfo_addr *auditinfo_addr, u_int length); } + SYS_AUDITCTL = 453 // { int auditctl(char *path); } + SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, u_long val, void *uaddr1, void *uaddr2); } + SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, int param_size); } + SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } + SYS_KMQ_OPEN = 457 // { int kmq_open(const char *path, int flags, mode_t mode, const struct mq_attr *attr); } + SYS_KMQ_SETATTR = 458 // { int kmq_setattr(int mqd, const struct mq_attr *attr, struct mq_attr *oattr); } + SYS_KMQ_TIMEDRECEIVE = 459 // { int kmq_timedreceive(int mqd, char *msg_ptr, size_t msg_len, unsigned *msg_prio, const struct timespec *abs_timeout); } + SYS_KMQ_TIMEDSEND = 460 // { int kmq_timedsend(int mqd, const char *msg_ptr, size_t msg_len, unsigned msg_prio, const struct timespec *abs_timeout); } + SYS_KMQ_NOTIFY = 461 // { int kmq_notify(int mqd, const struct sigevent *sigev); } + SYS_KMQ_UNLINK = 462 // { int kmq_unlink(const char *path); } + SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } + SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } + SYS_AIO_FSYNC = 465 // { int aio_fsync(int op, struct aiocb *aiocbp); } + SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, lwpid_t lwpid, struct rtprio *rtp); } + SYS_SCTP_PEELOFF = 471 // { int sctp_peeloff(int sd, uint32_t name); } + SYS_SCTP_GENERIC_SENDMSG = 472 // { int sctp_generic_sendmsg(int sd, caddr_t msg, int mlen, caddr_t to, __socklen_t tolen, struct sctp_sndrcvinfo *sinfo, int flags); } + SYS_SCTP_GENERIC_SENDMSG_IOV = 473 // { int sctp_generic_sendmsg_iov(int sd, struct iovec *iov, int iovlen, caddr_t to, __socklen_t tolen, struct sctp_sndrcvinfo *sinfo, int flags); } + SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, struct sockaddr *from, __socklen_t *fromlenaddr, struct sctp_sndrcvinfo *sinfo, int *msg_flags); } + SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, size_t nbyte, off_t offset); } + SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, size_t nbyte, off_t offset); } + SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, int prot, int flags, int fd, off_t pos); } + SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, int whence); } + SYS_TRUNCATE = 479 // { int truncate(char *path, off_t length); } + SYS_FTRUNCATE = 480 // { int ftruncate(int fd, off_t length); } + SYS_THR_KILL2 = 481 // { int thr_kill2(pid_t pid, long id, int sig); } + SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, mode_t mode); } + SYS_SHM_UNLINK = 483 // { int shm_unlink(const char *path); } + SYS_CPUSET = 484 // { int cpuset(cpusetid_t *setid); } + SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, cpusetid_t setid); } + SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, cpuwhich_t which, id_t id, cpusetid_t *setid); } + SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, cpuwhich_t which, id_t id, size_t cpusetsize, cpuset_t *mask); } + SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, cpuwhich_t which, id_t id, size_t cpusetsize, const cpuset_t *mask); } + SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, int flag); } + SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, int flag); } + SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, gid_t gid, int flag); } + SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, char **envv); } + SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, struct timeval *times); } + SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, char *path2, int flag); } + SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } + SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } + SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, mode_t mode); } + SYS_READLINKAT = 500 // { ssize_t readlinkat(int fd, char *path, char *buf, size_t bufsize); } + SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, char *new); } + SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, char *path2); } + SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } + SYS_POSIX_OPENPT = 504 // { int posix_openpt(int flags); } + SYS_GSSD_SYSCALL = 505 // { int gssd_syscall(char *path); } + SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, unsigned int iovcnt, int flags); } + SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, unsigned int iovcnt, int flags); } + SYS_JAIL_REMOVE = 508 // { int jail_remove(int jid); } + SYS_CLOSEFROM = 509 // { int closefrom(int lowfd); } + SYS___SEMCTL = 510 // { int __semctl(int semid, int semnum, int cmd, union semun *arg); } + SYS_MSGCTL = 511 // { int msgctl(int msqid, int cmd, struct msqid_ds *buf); } + SYS_SHMCTL = 512 // { int shmctl(int shmid, int cmd, struct shmid_ds *buf); } + SYS_LPATHCONF = 513 // { int lpathconf(char *path, int name); } + SYS___CAP_RIGHTS_GET = 515 // { int __cap_rights_get(int version, int fd, cap_rights_t *rightsp); } + SYS_CAP_ENTER = 516 // { int cap_enter(void); } + SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); } + SYS_PDFORK = 518 // { int pdfork(int *fdp, int flags); } + SYS_PDKILL = 519 // { int pdkill(int fd, int signum); } + SYS_PDGETPID = 520 // { int pdgetpid(int fd, pid_t *pidp); } + SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *sm); } + SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, size_t namelen); } + SYS_SETLOGINCLASS = 524 // { int setloginclass(const char *namebuf); } + SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); } + SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); } + SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); } + SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); } + SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); } + SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, off_t offset, off_t len); } + SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, off_t len, int advice); } + SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, int *status, int options, struct __wrusage *wrusage, siginfo_t *info); } + SYS_CAP_RIGHTS_LIMIT = 533 // { int cap_rights_limit(int fd, cap_rights_t *rightsp); } + SYS_CAP_IOCTLS_LIMIT = 534 // { int cap_ioctls_limit(int fd, const u_long *cmds, size_t ncmds); } + SYS_CAP_IOCTLS_GET = 535 // { ssize_t cap_ioctls_get(int fd, u_long *cmds, size_t maxcmds); } + SYS_CAP_FCNTLS_LIMIT = 536 // { int cap_fcntls_limit(int fd, uint32_t fcntlrights); } + SYS_CAP_FCNTLS_GET = 537 // { int cap_fcntls_get(int fd, uint32_t *fcntlrightsp); } + SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, int namelen); } + SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, int namelen); } + SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, u_long flags, int atflag); } + SYS_ACCEPT4 = 541 // { int accept4(int s, struct sockaddr * __restrict name, __socklen_t * __restrict anamelen, int flags); } + SYS_PIPE2 = 542 // { int pipe2(int *fildes, int flags); } + SYS_AIO_MLOCK = 543 // { int aio_mlock(struct aiocb *aiocbp); } + SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, int com, void *data); } + SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *set); } + SYS_FUTIMENS = 546 // { int futimens(int fd, struct timespec *times); } + SYS_UTIMENSAT = 547 // { int utimensat(int fd, char *path, struct timespec *times, int flag); } + SYS_FDATASYNC = 550 // { int fdatasync(int fd); } + SYS_FSTAT = 551 // { int fstat(int fd, struct stat *sb); } + SYS_FSTATAT = 552 // { int fstatat(int fd, char *path, struct stat *buf, int flag); } + SYS_FHSTAT = 553 // { int fhstat(const struct fhandle *u_fhp, struct stat *sb); } + SYS_GETDIRENTRIES = 554 // { ssize_t getdirentries(int fd, char *buf, size_t count, off_t *basep); } + SYS_STATFS = 555 // { int statfs(char *path, struct statfs *buf); } + SYS_FSTATFS = 556 // { int fstatfs(int fd, struct statfs *buf); } + SYS_GETFSSTAT = 557 // { int getfsstat(struct statfs *buf, long bufsize, int mode); } + SYS_FHSTATFS = 558 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); } + SYS_MKNODAT = 559 // { int mknodat(int fd, char *path, mode_t mode, dev_t dev); } + SYS_KEVENT = 560 // { int kevent(int fd, struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout); } + SYS_CPUSET_GETDOMAIN = 561 // { int cpuset_getdomain(cpulevel_t level, cpuwhich_t which, id_t id, size_t domainsetsize, domainset_t *mask, int *policy); } + SYS_CPUSET_SETDOMAIN = 562 // { int cpuset_setdomain(cpulevel_t level, cpuwhich_t which, id_t id, size_t domainsetsize, domainset_t *mask, int policy); } + SYS_GETRANDOM = 563 // { int getrandom(void *buf, size_t buflen, unsigned int flags); } + SYS_GETFHAT = 564 // { int getfhat(int fd, char *path, struct fhandle *fhp, int flags); } + SYS_FHLINK = 565 // { int fhlink(struct fhandle *fhp, const char *to); } + SYS_FHLINKAT = 566 // { int fhlinkat(struct fhandle *fhp, int tofd, const char *to,); } + SYS_FHREADLINK = 567 // { int fhreadlink(struct fhandle *fhp, char *buf, size_t bufsize); } + SYS___SYSCTLBYNAME = 570 // { int __sysctlbyname(const char *name, size_t namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } + SYS_CLOSE_RANGE = 575 // { int close_range(u_int lowfd, u_int highfd, int flags); } +) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go index 31847d230..c9c4ad031 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go @@ -1,4 +1,4 @@ -// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include -m32 /tmp/include/asm/unistd.h +// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/386/include -m32 /tmp/386/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. //go:build 386 && linux @@ -445,4 +445,6 @@ const ( SYS_LANDLOCK_RESTRICT_SELF = 446 SYS_MEMFD_SECRET = 447 SYS_PROCESS_MRELEASE = 448 + SYS_FUTEX_WAITV = 449 + SYS_SET_MEMPOLICY_HOME_NODE = 450 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go index 3503cbbde..12ff3417c 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go @@ -1,4 +1,4 @@ -// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include -m64 /tmp/include/asm/unistd.h +// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/amd64/include -m64 /tmp/amd64/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. //go:build amd64 && linux @@ -367,4 +367,6 @@ const ( SYS_LANDLOCK_RESTRICT_SELF = 446 SYS_MEMFD_SECRET = 447 SYS_PROCESS_MRELEASE = 448 + SYS_FUTEX_WAITV = 449 + SYS_SET_MEMPOLICY_HOME_NODE = 450 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go index 5ecd24bf6..c3fb5e77a 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go @@ -1,4 +1,4 @@ -// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/arm/include /tmp/arm/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm && linux @@ -409,4 +409,6 @@ const ( SYS_LANDLOCK_ADD_RULE = 445 SYS_LANDLOCK_RESTRICT_SELF = 446 SYS_PROCESS_MRELEASE = 448 + SYS_FUTEX_WAITV = 449 + SYS_SET_MEMPOLICY_HOME_NODE = 450 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go index 7e5c94cc7..358c847a4 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go @@ -1,4 +1,4 @@ -// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include -fsigned-char /tmp/include/asm/unistd.h +// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/arm64/include -fsigned-char /tmp/arm64/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm64 && linux @@ -312,4 +312,6 @@ const ( SYS_LANDLOCK_RESTRICT_SELF = 446 SYS_MEMFD_SECRET = 447 SYS_PROCESS_MRELEASE = 448 + SYS_FUTEX_WAITV = 449 + SYS_SET_MEMPOLICY_HOME_NODE = 450 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go new file mode 100644 index 000000000..81c4849b1 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go @@ -0,0 +1,311 @@ +// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/loong64/include /tmp/loong64/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +//go:build loong64 && linux +// +build loong64,linux + +package unix + +const ( + SYS_IO_SETUP = 0 + SYS_IO_DESTROY = 1 + SYS_IO_SUBMIT = 2 + SYS_IO_CANCEL = 3 + SYS_IO_GETEVENTS = 4 + SYS_SETXATTR = 5 + SYS_LSETXATTR = 6 + SYS_FSETXATTR = 7 + SYS_GETXATTR = 8 + SYS_LGETXATTR = 9 + SYS_FGETXATTR = 10 + SYS_LISTXATTR = 11 + SYS_LLISTXATTR = 12 + SYS_FLISTXATTR = 13 + SYS_REMOVEXATTR = 14 + SYS_LREMOVEXATTR = 15 + SYS_FREMOVEXATTR = 16 + SYS_GETCWD = 17 + SYS_LOOKUP_DCOOKIE = 18 + SYS_EVENTFD2 = 19 + SYS_EPOLL_CREATE1 = 20 + SYS_EPOLL_CTL = 21 + SYS_EPOLL_PWAIT = 22 + SYS_DUP = 23 + SYS_DUP3 = 24 + SYS_FCNTL = 25 + SYS_INOTIFY_INIT1 = 26 + SYS_INOTIFY_ADD_WATCH = 27 + SYS_INOTIFY_RM_WATCH = 28 + SYS_IOCTL = 29 + SYS_IOPRIO_SET = 30 + SYS_IOPRIO_GET = 31 + SYS_FLOCK = 32 + SYS_MKNODAT = 33 + SYS_MKDIRAT = 34 + SYS_UNLINKAT = 35 + SYS_SYMLINKAT = 36 + SYS_LINKAT = 37 + SYS_UMOUNT2 = 39 + SYS_MOUNT = 40 + SYS_PIVOT_ROOT = 41 + SYS_NFSSERVCTL = 42 + SYS_STATFS = 43 + SYS_FSTATFS = 44 + SYS_TRUNCATE = 45 + SYS_FTRUNCATE = 46 + SYS_FALLOCATE = 47 + SYS_FACCESSAT = 48 + SYS_CHDIR = 49 + SYS_FCHDIR = 50 + SYS_CHROOT = 51 + SYS_FCHMOD = 52 + SYS_FCHMODAT = 53 + SYS_FCHOWNAT = 54 + SYS_FCHOWN = 55 + SYS_OPENAT = 56 + SYS_CLOSE = 57 + SYS_VHANGUP = 58 + SYS_PIPE2 = 59 + SYS_QUOTACTL = 60 + SYS_GETDENTS64 = 61 + SYS_LSEEK = 62 + SYS_READ = 63 + SYS_WRITE = 64 + SYS_READV = 65 + SYS_WRITEV = 66 + SYS_PREAD64 = 67 + SYS_PWRITE64 = 68 + SYS_PREADV = 69 + SYS_PWRITEV = 70 + SYS_SENDFILE = 71 + SYS_PSELECT6 = 72 + SYS_PPOLL = 73 + SYS_SIGNALFD4 = 74 + SYS_VMSPLICE = 75 + SYS_SPLICE = 76 + SYS_TEE = 77 + SYS_READLINKAT = 78 + SYS_SYNC = 81 + SYS_FSYNC = 82 + SYS_FDATASYNC = 83 + SYS_SYNC_FILE_RANGE = 84 + SYS_TIMERFD_CREATE = 85 + SYS_TIMERFD_SETTIME = 86 + SYS_TIMERFD_GETTIME = 87 + SYS_UTIMENSAT = 88 + SYS_ACCT = 89 + SYS_CAPGET = 90 + SYS_CAPSET = 91 + SYS_PERSONALITY = 92 + SYS_EXIT = 93 + SYS_EXIT_GROUP = 94 + SYS_WAITID = 95 + SYS_SET_TID_ADDRESS = 96 + SYS_UNSHARE = 97 + SYS_FUTEX = 98 + SYS_SET_ROBUST_LIST = 99 + SYS_GET_ROBUST_LIST = 100 + SYS_NANOSLEEP = 101 + SYS_GETITIMER = 102 + SYS_SETITIMER = 103 + SYS_KEXEC_LOAD = 104 + SYS_INIT_MODULE = 105 + SYS_DELETE_MODULE = 106 + SYS_TIMER_CREATE = 107 + SYS_TIMER_GETTIME = 108 + SYS_TIMER_GETOVERRUN = 109 + SYS_TIMER_SETTIME = 110 + SYS_TIMER_DELETE = 111 + SYS_CLOCK_SETTIME = 112 + SYS_CLOCK_GETTIME = 113 + SYS_CLOCK_GETRES = 114 + SYS_CLOCK_NANOSLEEP = 115 + SYS_SYSLOG = 116 + SYS_PTRACE = 117 + SYS_SCHED_SETPARAM = 118 + SYS_SCHED_SETSCHEDULER = 119 + SYS_SCHED_GETSCHEDULER = 120 + SYS_SCHED_GETPARAM = 121 + SYS_SCHED_SETAFFINITY = 122 + SYS_SCHED_GETAFFINITY = 123 + SYS_SCHED_YIELD = 124 + SYS_SCHED_GET_PRIORITY_MAX = 125 + SYS_SCHED_GET_PRIORITY_MIN = 126 + SYS_SCHED_RR_GET_INTERVAL = 127 + SYS_RESTART_SYSCALL = 128 + SYS_KILL = 129 + SYS_TKILL = 130 + SYS_TGKILL = 131 + SYS_SIGALTSTACK = 132 + SYS_RT_SIGSUSPEND = 133 + SYS_RT_SIGACTION = 134 + SYS_RT_SIGPROCMASK = 135 + SYS_RT_SIGPENDING = 136 + SYS_RT_SIGTIMEDWAIT = 137 + SYS_RT_SIGQUEUEINFO = 138 + SYS_RT_SIGRETURN = 139 + SYS_SETPRIORITY = 140 + SYS_GETPRIORITY = 141 + SYS_REBOOT = 142 + SYS_SETREGID = 143 + SYS_SETGID = 144 + SYS_SETREUID = 145 + SYS_SETUID = 146 + SYS_SETRESUID = 147 + SYS_GETRESUID = 148 + SYS_SETRESGID = 149 + SYS_GETRESGID = 150 + SYS_SETFSUID = 151 + SYS_SETFSGID = 152 + SYS_TIMES = 153 + SYS_SETPGID = 154 + SYS_GETPGID = 155 + SYS_GETSID = 156 + SYS_SETSID = 157 + SYS_GETGROUPS = 158 + SYS_SETGROUPS = 159 + SYS_UNAME = 160 + SYS_SETHOSTNAME = 161 + SYS_SETDOMAINNAME = 162 + SYS_GETRUSAGE = 165 + SYS_UMASK = 166 + SYS_PRCTL = 167 + SYS_GETCPU = 168 + SYS_GETTIMEOFDAY = 169 + SYS_SETTIMEOFDAY = 170 + SYS_ADJTIMEX = 171 + SYS_GETPID = 172 + SYS_GETPPID = 173 + SYS_GETUID = 174 + SYS_GETEUID = 175 + SYS_GETGID = 176 + SYS_GETEGID = 177 + SYS_GETTID = 178 + SYS_SYSINFO = 179 + SYS_MQ_OPEN = 180 + SYS_MQ_UNLINK = 181 + SYS_MQ_TIMEDSEND = 182 + SYS_MQ_TIMEDRECEIVE = 183 + SYS_MQ_NOTIFY = 184 + SYS_MQ_GETSETATTR = 185 + SYS_MSGGET = 186 + SYS_MSGCTL = 187 + SYS_MSGRCV = 188 + SYS_MSGSND = 189 + SYS_SEMGET = 190 + SYS_SEMCTL = 191 + SYS_SEMTIMEDOP = 192 + SYS_SEMOP = 193 + SYS_SHMGET = 194 + SYS_SHMCTL = 195 + SYS_SHMAT = 196 + SYS_SHMDT = 197 + SYS_SOCKET = 198 + SYS_SOCKETPAIR = 199 + SYS_BIND = 200 + SYS_LISTEN = 201 + SYS_ACCEPT = 202 + SYS_CONNECT = 203 + SYS_GETSOCKNAME = 204 + SYS_GETPEERNAME = 205 + SYS_SENDTO = 206 + SYS_RECVFROM = 207 + SYS_SETSOCKOPT = 208 + SYS_GETSOCKOPT = 209 + SYS_SHUTDOWN = 210 + SYS_SENDMSG = 211 + SYS_RECVMSG = 212 + SYS_READAHEAD = 213 + SYS_BRK = 214 + SYS_MUNMAP = 215 + SYS_MREMAP = 216 + SYS_ADD_KEY = 217 + SYS_REQUEST_KEY = 218 + SYS_KEYCTL = 219 + SYS_CLONE = 220 + SYS_EXECVE = 221 + SYS_MMAP = 222 + SYS_FADVISE64 = 223 + SYS_SWAPON = 224 + SYS_SWAPOFF = 225 + SYS_MPROTECT = 226 + SYS_MSYNC = 227 + SYS_MLOCK = 228 + SYS_MUNLOCK = 229 + SYS_MLOCKALL = 230 + SYS_MUNLOCKALL = 231 + SYS_MINCORE = 232 + SYS_MADVISE = 233 + SYS_REMAP_FILE_PAGES = 234 + SYS_MBIND = 235 + SYS_GET_MEMPOLICY = 236 + SYS_SET_MEMPOLICY = 237 + SYS_MIGRATE_PAGES = 238 + SYS_MOVE_PAGES = 239 + SYS_RT_TGSIGQUEUEINFO = 240 + SYS_PERF_EVENT_OPEN = 241 + SYS_ACCEPT4 = 242 + SYS_RECVMMSG = 243 + SYS_ARCH_SPECIFIC_SYSCALL = 244 + SYS_WAIT4 = 260 + SYS_PRLIMIT64 = 261 + SYS_FANOTIFY_INIT = 262 + SYS_FANOTIFY_MARK = 263 + SYS_NAME_TO_HANDLE_AT = 264 + SYS_OPEN_BY_HANDLE_AT = 265 + SYS_CLOCK_ADJTIME = 266 + SYS_SYNCFS = 267 + SYS_SETNS = 268 + SYS_SENDMMSG = 269 + SYS_PROCESS_VM_READV = 270 + SYS_PROCESS_VM_WRITEV = 271 + SYS_KCMP = 272 + SYS_FINIT_MODULE = 273 + SYS_SCHED_SETATTR = 274 + SYS_SCHED_GETATTR = 275 + SYS_RENAMEAT2 = 276 + SYS_SECCOMP = 277 + SYS_GETRANDOM = 278 + SYS_MEMFD_CREATE = 279 + SYS_BPF = 280 + SYS_EXECVEAT = 281 + SYS_USERFAULTFD = 282 + SYS_MEMBARRIER = 283 + SYS_MLOCK2 = 284 + SYS_COPY_FILE_RANGE = 285 + SYS_PREADV2 = 286 + SYS_PWRITEV2 = 287 + SYS_PKEY_MPROTECT = 288 + SYS_PKEY_ALLOC = 289 + SYS_PKEY_FREE = 290 + SYS_STATX = 291 + SYS_IO_PGETEVENTS = 292 + SYS_RSEQ = 293 + SYS_KEXEC_FILE_LOAD = 294 + SYS_PIDFD_SEND_SIGNAL = 424 + SYS_IO_URING_SETUP = 425 + SYS_IO_URING_ENTER = 426 + SYS_IO_URING_REGISTER = 427 + SYS_OPEN_TREE = 428 + SYS_MOVE_MOUNT = 429 + SYS_FSOPEN = 430 + SYS_FSCONFIG = 431 + SYS_FSMOUNT = 432 + SYS_FSPICK = 433 + SYS_PIDFD_OPEN = 434 + SYS_CLONE3 = 435 + SYS_CLOSE_RANGE = 436 + SYS_OPENAT2 = 437 + SYS_PIDFD_GETFD = 438 + SYS_FACCESSAT2 = 439 + SYS_PROCESS_MADVISE = 440 + SYS_EPOLL_PWAIT2 = 441 + SYS_MOUNT_SETATTR = 442 + SYS_QUOTACTL_FD = 443 + SYS_LANDLOCK_CREATE_RULESET = 444 + SYS_LANDLOCK_ADD_RULE = 445 + SYS_LANDLOCK_RESTRICT_SELF = 446 + SYS_PROCESS_MRELEASE = 448 + SYS_FUTEX_WAITV = 449 + SYS_SET_MEMPOLICY_HOME_NODE = 450 +) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go index e1e2a2bf5..202a57e90 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go @@ -1,4 +1,4 @@ -// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/mips/include /tmp/mips/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips && linux @@ -429,4 +429,6 @@ const ( SYS_LANDLOCK_ADD_RULE = 4445 SYS_LANDLOCK_RESTRICT_SELF = 4446 SYS_PROCESS_MRELEASE = 4448 + SYS_FUTEX_WAITV = 4449 + SYS_SET_MEMPOLICY_HOME_NODE = 4450 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go index 7651915a3..1fbceb52d 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go @@ -1,4 +1,4 @@ -// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/mips64/include /tmp/mips64/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips64 && linux @@ -359,4 +359,6 @@ const ( SYS_LANDLOCK_ADD_RULE = 5445 SYS_LANDLOCK_RESTRICT_SELF = 5446 SYS_PROCESS_MRELEASE = 5448 + SYS_FUTEX_WAITV = 5449 + SYS_SET_MEMPOLICY_HOME_NODE = 5450 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go index a26a2c050..b4ffb7a20 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go @@ -1,4 +1,4 @@ -// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/mips64le/include /tmp/mips64le/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips64le && linux @@ -359,4 +359,6 @@ const ( SYS_LANDLOCK_ADD_RULE = 5445 SYS_LANDLOCK_RESTRICT_SELF = 5446 SYS_PROCESS_MRELEASE = 5448 + SYS_FUTEX_WAITV = 5449 + SYS_SET_MEMPOLICY_HOME_NODE = 5450 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go index fda9a6a99..867985f9b 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go @@ -1,4 +1,4 @@ -// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/mipsle/include /tmp/mipsle/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mipsle && linux @@ -429,4 +429,6 @@ const ( SYS_LANDLOCK_ADD_RULE = 4445 SYS_LANDLOCK_RESTRICT_SELF = 4446 SYS_PROCESS_MRELEASE = 4448 + SYS_FUTEX_WAITV = 4449 + SYS_SET_MEMPOLICY_HOME_NODE = 4450 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go index e8496150d..a8cce69ed 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go @@ -1,4 +1,4 @@ -// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/ppc/include /tmp/ppc/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc && linux @@ -436,4 +436,6 @@ const ( SYS_LANDLOCK_ADD_RULE = 445 SYS_LANDLOCK_RESTRICT_SELF = 446 SYS_PROCESS_MRELEASE = 448 + SYS_FUTEX_WAITV = 449 + SYS_SET_MEMPOLICY_HOME_NODE = 450 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go index 5ee0678a3..d44c5b39d 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go @@ -1,4 +1,4 @@ -// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/ppc64/include /tmp/ppc64/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc64 && linux @@ -408,4 +408,6 @@ const ( SYS_LANDLOCK_ADD_RULE = 445 SYS_LANDLOCK_RESTRICT_SELF = 446 SYS_PROCESS_MRELEASE = 448 + SYS_FUTEX_WAITV = 449 + SYS_SET_MEMPOLICY_HOME_NODE = 450 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go index 29c0f9a39..4214dd9c0 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go @@ -1,4 +1,4 @@ -// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/ppc64le/include /tmp/ppc64le/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc64le && linux @@ -408,4 +408,6 @@ const ( SYS_LANDLOCK_ADD_RULE = 445 SYS_LANDLOCK_RESTRICT_SELF = 446 SYS_PROCESS_MRELEASE = 448 + SYS_FUTEX_WAITV = 449 + SYS_SET_MEMPOLICY_HOME_NODE = 450 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go index 5c9a9a3b6..3e594a8c0 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go @@ -1,4 +1,4 @@ -// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/riscv64/include /tmp/riscv64/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. //go:build riscv64 && linux @@ -309,5 +309,8 @@ const ( SYS_LANDLOCK_CREATE_RULESET = 444 SYS_LANDLOCK_ADD_RULE = 445 SYS_LANDLOCK_RESTRICT_SELF = 446 + SYS_MEMFD_SECRET = 447 SYS_PROCESS_MRELEASE = 448 + SYS_FUTEX_WAITV = 449 + SYS_SET_MEMPOLICY_HOME_NODE = 450 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go index 913f50f98..7ea465204 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go @@ -1,4 +1,4 @@ -// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include -fsigned-char /tmp/include/asm/unistd.h +// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/s390x/include -fsigned-char /tmp/s390x/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. //go:build s390x && linux @@ -373,4 +373,6 @@ const ( SYS_LANDLOCK_ADD_RULE = 445 SYS_LANDLOCK_RESTRICT_SELF = 446 SYS_PROCESS_MRELEASE = 448 + SYS_FUTEX_WAITV = 449 + SYS_SET_MEMPOLICY_HOME_NODE = 450 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go index 0de03a722..92f628ef4 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go @@ -1,4 +1,4 @@ -// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/sparc64/include /tmp/sparc64/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. //go:build sparc64 && linux @@ -387,4 +387,6 @@ const ( SYS_LANDLOCK_ADD_RULE = 445 SYS_LANDLOCK_RESTRICT_SELF = 446 SYS_PROCESS_MRELEASE = 448 + SYS_FUTEX_WAITV = 449 + SYS_SET_MEMPOLICY_HOME_NODE = 450 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go index 817edbf95..597733813 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go @@ -6,6 +6,7 @@ package unix +// Deprecated: Use libc wrappers instead of direct syscalls. const ( SYS_EXIT = 1 // { void sys_exit(int rval); } SYS_FORK = 2 // { int sys_fork(void); } diff --git a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go index ea453614e..16af29189 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go @@ -6,6 +6,7 @@ package unix +// Deprecated: Use libc wrappers instead of direct syscalls. const ( SYS_EXIT = 1 // { void sys_exit(int rval); } SYS_FORK = 2 // { int sys_fork(void); } diff --git a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go index 32eec5ed5..721ef5910 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go @@ -6,6 +6,7 @@ package unix +// Deprecated: Use libc wrappers instead of direct syscalls. const ( SYS_EXIT = 1 // { void sys_exit(int rval); } SYS_FORK = 2 // { int sys_fork(void); } diff --git a/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go index 885842c0e..e2a64f099 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go @@ -366,30 +366,57 @@ type ICMPv6Filter struct { Filt [8]uint32 } +type TCPConnectionInfo struct { + State uint8 + Snd_wscale uint8 + Rcv_wscale uint8 + _ uint8 + Options uint32 + Flags uint32 + Rto uint32 + Maxseg uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Snd_wnd uint32 + Snd_sbbytes uint32 + Rcv_wnd uint32 + Rttcur uint32 + Srtt uint32 + Rttvar uint32 + Txpackets uint64 + Txbytes uint64 + Txretransmitbytes uint64 + Rxpackets uint64 + Rxbytes uint64 + Rxoutoforderbytes uint64 + Txretransmitpackets uint64 +} + const ( - SizeofSockaddrInet4 = 0x10 - SizeofSockaddrInet6 = 0x1c - SizeofSockaddrAny = 0x6c - SizeofSockaddrUnix = 0x6a - SizeofSockaddrDatalink = 0x14 - SizeofSockaddrCtl = 0x20 - SizeofSockaddrVM = 0xc - SizeofXvsockpcb = 0xa8 - SizeofXSocket = 0x64 - SizeofXSockbuf = 0x18 - SizeofXVSockPgen = 0x20 - SizeofXucred = 0x4c - SizeofLinger = 0x8 - SizeofIovec = 0x10 - SizeofIPMreq = 0x8 - SizeofIPMreqn = 0xc - SizeofIPv6Mreq = 0x14 - SizeofMsghdr = 0x30 - SizeofCmsghdr = 0xc - SizeofInet4Pktinfo = 0xc - SizeofInet6Pktinfo = 0x14 - SizeofIPv6MTUInfo = 0x20 - SizeofICMPv6Filter = 0x20 + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofSockaddrCtl = 0x20 + SizeofSockaddrVM = 0xc + SizeofXvsockpcb = 0xa8 + SizeofXSocket = 0x64 + SizeofXSockbuf = 0x18 + SizeofXVSockPgen = 0x20 + SizeofXucred = 0x4c + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofTCPConnectionInfo = 0x70 ) const ( diff --git a/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go index b23c02337..34aa77521 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go @@ -366,30 +366,57 @@ type ICMPv6Filter struct { Filt [8]uint32 } +type TCPConnectionInfo struct { + State uint8 + Snd_wscale uint8 + Rcv_wscale uint8 + _ uint8 + Options uint32 + Flags uint32 + Rto uint32 + Maxseg uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Snd_wnd uint32 + Snd_sbbytes uint32 + Rcv_wnd uint32 + Rttcur uint32 + Srtt uint32 + Rttvar uint32 + Txpackets uint64 + Txbytes uint64 + Txretransmitbytes uint64 + Rxpackets uint64 + Rxbytes uint64 + Rxoutoforderbytes uint64 + Txretransmitpackets uint64 +} + const ( - SizeofSockaddrInet4 = 0x10 - SizeofSockaddrInet6 = 0x1c - SizeofSockaddrAny = 0x6c - SizeofSockaddrUnix = 0x6a - SizeofSockaddrDatalink = 0x14 - SizeofSockaddrCtl = 0x20 - SizeofSockaddrVM = 0xc - SizeofXvsockpcb = 0xa8 - SizeofXSocket = 0x64 - SizeofXSockbuf = 0x18 - SizeofXVSockPgen = 0x20 - SizeofXucred = 0x4c - SizeofLinger = 0x8 - SizeofIovec = 0x10 - SizeofIPMreq = 0x8 - SizeofIPMreqn = 0xc - SizeofIPv6Mreq = 0x14 - SizeofMsghdr = 0x30 - SizeofCmsghdr = 0xc - SizeofInet4Pktinfo = 0xc - SizeofInet6Pktinfo = 0x14 - SizeofIPv6MTUInfo = 0x20 - SizeofICMPv6Filter = 0x20 + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofSockaddrCtl = 0x20 + SizeofSockaddrVM = 0xc + SizeofXvsockpcb = 0xa8 + SizeofXSocket = 0x64 + SizeofXSockbuf = 0x18 + SizeofXVSockPgen = 0x20 + SizeofXucred = 0x4c + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofTCPConnectionInfo = 0x70 ) const ( diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go index 4eec078e5..dea0c9a60 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go @@ -90,27 +90,6 @@ type Stat_t struct { Spare [10]uint64 } -type stat_freebsd11_t struct { - Dev uint32 - Ino uint32 - Mode uint16 - Nlink uint16 - Uid uint32 - Gid uint32 - Rdev uint32 - Atim Timespec - Mtim Timespec - Ctim Timespec - Size int64 - Blocks int64 - Blksize int32 - Flags uint32 - Gen uint32 - Lspare int32 - Btim Timespec - _ [8]byte -} - type Statfs_t struct { Version uint32 Type uint32 @@ -136,31 +115,6 @@ type Statfs_t struct { Mntonname [1024]byte } -type statfs_freebsd11_t struct { - Version uint32 - Type uint32 - Flags uint64 - Bsize uint64 - Iosize uint64 - Blocks uint64 - Bfree uint64 - Bavail int64 - Files uint64 - Ffree int64 - Syncwrites uint64 - Asyncwrites uint64 - Syncreads uint64 - Asyncreads uint64 - Spare [10]uint64 - Namemax uint32 - Owner uint32 - Fsid Fsid - Charspare [80]int8 - Fstypename [16]byte - Mntfromname [88]byte - Mntonname [88]byte -} - type Flock_t struct { Start int64 Len int64 @@ -181,14 +135,6 @@ type Dirent struct { Name [256]int8 } -type dirent_freebsd11 struct { - Fileno uint32 - Reclen uint16 - Type uint8 - Namlen uint8 - Name [256]int8 -} - type Fsid struct { Val [2]int32 } @@ -337,41 +283,9 @@ const ( ) const ( - PTRACE_ATTACH = 0xa - PTRACE_CONT = 0x7 - PTRACE_DETACH = 0xb - PTRACE_GETFPREGS = 0x23 - PTRACE_GETFSBASE = 0x47 - PTRACE_GETLWPLIST = 0xf - PTRACE_GETNUMLWPS = 0xe - PTRACE_GETREGS = 0x21 - PTRACE_GETXSTATE = 0x45 - PTRACE_IO = 0xc - PTRACE_KILL = 0x8 - PTRACE_LWPEVENTS = 0x18 - PTRACE_LWPINFO = 0xd - PTRACE_SETFPREGS = 0x24 - PTRACE_SETREGS = 0x22 - PTRACE_SINGLESTEP = 0x9 - PTRACE_TRACEME = 0x0 -) - -const ( - PIOD_READ_D = 0x1 - PIOD_WRITE_D = 0x2 - PIOD_READ_I = 0x3 - PIOD_WRITE_I = 0x4 -) - -const ( - PL_FLAG_BORN = 0x100 - PL_FLAG_EXITED = 0x200 - PL_FLAG_SI = 0x20 -) - -const ( - TRAP_BRKPT = 0x1 - TRAP_TRACE = 0x2 + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 ) type PtraceLwpInfoStruct struct { @@ -432,6 +346,8 @@ type FpReg struct { Pad [64]uint8 } +type FpExtendedPrecision struct{} + type PtraceIoDesc struct { Op int32 Offs *byte @@ -444,8 +360,9 @@ type Kevent_t struct { Filter int16 Flags uint16 Fflags uint32 - Data int32 + Data int64 Udata *byte + Ext [4]uint64 } type FdSet struct { diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go index 7622904a5..da0ea0d60 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go @@ -86,26 +86,6 @@ type Stat_t struct { Spare [10]uint64 } -type stat_freebsd11_t struct { - Dev uint32 - Ino uint32 - Mode uint16 - Nlink uint16 - Uid uint32 - Gid uint32 - Rdev uint32 - Atim Timespec - Mtim Timespec - Ctim Timespec - Size int64 - Blocks int64 - Blksize int32 - Flags uint32 - Gen uint32 - Lspare int32 - Btim Timespec -} - type Statfs_t struct { Version uint32 Type uint32 @@ -131,31 +111,6 @@ type Statfs_t struct { Mntonname [1024]byte } -type statfs_freebsd11_t struct { - Version uint32 - Type uint32 - Flags uint64 - Bsize uint64 - Iosize uint64 - Blocks uint64 - Bfree uint64 - Bavail int64 - Files uint64 - Ffree int64 - Syncwrites uint64 - Asyncwrites uint64 - Syncreads uint64 - Asyncreads uint64 - Spare [10]uint64 - Namemax uint32 - Owner uint32 - Fsid Fsid - Charspare [80]int8 - Fstypename [16]byte - Mntfromname [88]byte - Mntonname [88]byte -} - type Flock_t struct { Start int64 Len int64 @@ -177,14 +132,6 @@ type Dirent struct { Name [256]int8 } -type dirent_freebsd11 struct { - Fileno uint32 - Reclen uint16 - Type uint8 - Namlen uint8 - Name [256]int8 -} - type Fsid struct { Val [2]int32 } @@ -333,41 +280,9 @@ const ( ) const ( - PTRACE_ATTACH = 0xa - PTRACE_CONT = 0x7 - PTRACE_DETACH = 0xb - PTRACE_GETFPREGS = 0x23 - PTRACE_GETFSBASE = 0x47 - PTRACE_GETLWPLIST = 0xf - PTRACE_GETNUMLWPS = 0xe - PTRACE_GETREGS = 0x21 - PTRACE_GETXSTATE = 0x45 - PTRACE_IO = 0xc - PTRACE_KILL = 0x8 - PTRACE_LWPEVENTS = 0x18 - PTRACE_LWPINFO = 0xd - PTRACE_SETFPREGS = 0x24 - PTRACE_SETREGS = 0x22 - PTRACE_SINGLESTEP = 0x9 - PTRACE_TRACEME = 0x0 -) - -const ( - PIOD_READ_D = 0x1 - PIOD_WRITE_D = 0x2 - PIOD_READ_I = 0x3 - PIOD_WRITE_I = 0x4 -) - -const ( - PL_FLAG_BORN = 0x100 - PL_FLAG_EXITED = 0x200 - PL_FLAG_SI = 0x20 -) - -const ( - TRAP_BRKPT = 0x1 - TRAP_TRACE = 0x2 + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 ) type PtraceLwpInfoStruct struct { @@ -435,6 +350,8 @@ type FpReg struct { Spare [12]uint64 } +type FpExtendedPrecision struct{} + type PtraceIoDesc struct { Op int32 Offs *byte @@ -449,6 +366,7 @@ type Kevent_t struct { Fflags uint32 Data int64 Udata *byte + Ext [4]uint64 } type FdSet struct { diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go index 19223ce8e..da8f74045 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go @@ -33,7 +33,7 @@ type Timeval struct { _ [4]byte } -type Time_t int32 +type Time_t int64 type Rusage struct { Utime Timeval @@ -88,26 +88,6 @@ type Stat_t struct { Spare [10]uint64 } -type stat_freebsd11_t struct { - Dev uint32 - Ino uint32 - Mode uint16 - Nlink uint16 - Uid uint32 - Gid uint32 - Rdev uint32 - Atim Timespec - Mtim Timespec - Ctim Timespec - Size int64 - Blocks int64 - Blksize int32 - Flags uint32 - Gen uint32 - Lspare int32 - Btim Timespec -} - type Statfs_t struct { Version uint32 Type uint32 @@ -133,31 +113,6 @@ type Statfs_t struct { Mntonname [1024]byte } -type statfs_freebsd11_t struct { - Version uint32 - Type uint32 - Flags uint64 - Bsize uint64 - Iosize uint64 - Blocks uint64 - Bfree uint64 - Bavail int64 - Files uint64 - Ffree int64 - Syncwrites uint64 - Asyncwrites uint64 - Syncreads uint64 - Asyncreads uint64 - Spare [10]uint64 - Namemax uint32 - Owner uint32 - Fsid Fsid - Charspare [80]int8 - Fstypename [16]byte - Mntfromname [88]byte - Mntonname [88]byte -} - type Flock_t struct { Start int64 Len int64 @@ -179,14 +134,6 @@ type Dirent struct { Name [256]int8 } -type dirent_freebsd11 struct { - Fileno uint32 - Reclen uint16 - Type uint8 - Namlen uint8 - Name [256]int8 -} - type Fsid struct { Val [2]int32 } @@ -335,41 +282,9 @@ const ( ) const ( - PTRACE_ATTACH = 0xa - PTRACE_CONT = 0x7 - PTRACE_DETACH = 0xb - PTRACE_GETFPREGS = 0x23 - PTRACE_GETFSBASE = 0x47 - PTRACE_GETLWPLIST = 0xf - PTRACE_GETNUMLWPS = 0xe - PTRACE_GETREGS = 0x21 - PTRACE_GETXSTATE = 0x45 - PTRACE_IO = 0xc - PTRACE_KILL = 0x8 - PTRACE_LWPEVENTS = 0x18 - PTRACE_LWPINFO = 0xd - PTRACE_SETFPREGS = 0x24 - PTRACE_SETREGS = 0x22 - PTRACE_SINGLESTEP = 0x9 - PTRACE_TRACEME = 0x0 -) - -const ( - PIOD_READ_D = 0x1 - PIOD_WRITE_D = 0x2 - PIOD_READ_I = 0x3 - PIOD_WRITE_I = 0x4 -) - -const ( - PL_FLAG_BORN = 0x100 - PL_FLAG_EXITED = 0x200 - PL_FLAG_SI = 0x20 -) - -const ( - TRAP_BRKPT = 0x1 - TRAP_TRACE = 0x2 + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 ) type PtraceLwpInfoStruct struct { @@ -386,15 +301,15 @@ type PtraceLwpInfoStruct struct { } type __Siginfo struct { - Signo int32 - Errno int32 - Code int32 - Pid int32 - Uid uint32 - Status int32 - Addr *byte - Value [4]byte - X_reason [32]byte + Signo int32 + Errno int32 + Code int32 + Pid int32 + Uid uint32 + Status int32 + Addr *byte + Value [4]byte + _ [32]byte } type Sigset_t struct { @@ -402,16 +317,22 @@ type Sigset_t struct { } type Reg struct { - R [13]uint32 - R_sp uint32 - R_lr uint32 - R_pc uint32 - R_cpsr uint32 + R [13]uint32 + Sp uint32 + Lr uint32 + Pc uint32 + Cpsr uint32 } type FpReg struct { - Fpr_fpsr uint32 - Fpr [8][3]uint32 + Fpsr uint32 + Fpr [8]FpExtendedPrecision +} + +type FpExtendedPrecision struct { + Exponent uint32 + Mantissa_hi uint32 + Mantissa_lo uint32 } type PtraceIoDesc struct { @@ -426,8 +347,11 @@ type Kevent_t struct { Filter int16 Flags uint16 Fflags uint32 - Data int32 + _ [4]byte + Data int64 Udata *byte + _ [4]byte + Ext [4]uint64 } type FdSet struct { @@ -453,7 +377,7 @@ type ifMsghdr struct { Addrs int32 Flags int32 Index uint16 - _ [2]byte + _ uint16 Data ifData } @@ -464,7 +388,6 @@ type IfMsghdr struct { Addrs int32 Flags int32 Index uint16 - _ [2]byte Data IfData } @@ -532,7 +455,7 @@ type IfaMsghdr struct { Addrs int32 Flags int32 Index uint16 - _ [2]byte + _ uint16 Metric int32 } @@ -543,7 +466,7 @@ type IfmaMsghdr struct { Addrs int32 Flags int32 Index uint16 - _ [2]byte + _ uint16 } type IfAnnounceMsghdr struct { @@ -560,7 +483,7 @@ type RtMsghdr struct { Version uint8 Type uint8 Index uint16 - _ [2]byte + _ uint16 Flags int32 Addrs int32 Pid int32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go index 8e3e33f67..d69988e5e 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go @@ -86,26 +86,6 @@ type Stat_t struct { Spare [10]uint64 } -type stat_freebsd11_t struct { - Dev uint32 - Ino uint32 - Mode uint16 - Nlink uint16 - Uid uint32 - Gid uint32 - Rdev uint32 - Atim Timespec - Mtim Timespec - Ctim Timespec - Size int64 - Blocks int64 - Blksize int32 - Flags uint32 - Gen uint32 - Lspare int32 - Btim Timespec -} - type Statfs_t struct { Version uint32 Type uint32 @@ -131,31 +111,6 @@ type Statfs_t struct { Mntonname [1024]byte } -type statfs_freebsd11_t struct { - Version uint32 - Type uint32 - Flags uint64 - Bsize uint64 - Iosize uint64 - Blocks uint64 - Bfree uint64 - Bavail int64 - Files uint64 - Ffree int64 - Syncwrites uint64 - Asyncwrites uint64 - Syncreads uint64 - Asyncreads uint64 - Spare [10]uint64 - Namemax uint32 - Owner uint32 - Fsid Fsid - Charspare [80]int8 - Fstypename [16]byte - Mntfromname [88]byte - Mntonname [88]byte -} - type Flock_t struct { Start int64 Len int64 @@ -177,14 +132,6 @@ type Dirent struct { Name [256]int8 } -type dirent_freebsd11 struct { - Fileno uint32 - Reclen uint16 - Type uint8 - Namlen uint8 - Name [256]int8 -} - type Fsid struct { Val [2]int32 } @@ -333,39 +280,9 @@ const ( ) const ( - PTRACE_ATTACH = 0xa - PTRACE_CONT = 0x7 - PTRACE_DETACH = 0xb - PTRACE_GETFPREGS = 0x23 - PTRACE_GETLWPLIST = 0xf - PTRACE_GETNUMLWPS = 0xe - PTRACE_GETREGS = 0x21 - PTRACE_IO = 0xc - PTRACE_KILL = 0x8 - PTRACE_LWPEVENTS = 0x18 - PTRACE_LWPINFO = 0xd - PTRACE_SETFPREGS = 0x24 - PTRACE_SETREGS = 0x22 - PTRACE_SINGLESTEP = 0x9 - PTRACE_TRACEME = 0x0 -) - -const ( - PIOD_READ_D = 0x1 - PIOD_WRITE_D = 0x2 - PIOD_READ_I = 0x3 - PIOD_WRITE_I = 0x4 -) - -const ( - PL_FLAG_BORN = 0x100 - PL_FLAG_EXITED = 0x200 - PL_FLAG_SI = 0x20 -) - -const ( - TRAP_BRKPT = 0x1 - TRAP_TRACE = 0x2 + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 ) type PtraceLwpInfoStruct struct { @@ -413,6 +330,8 @@ type FpReg struct { _ [8]byte } +type FpExtendedPrecision struct{} + type PtraceIoDesc struct { Op int32 Offs *byte @@ -427,6 +346,7 @@ type Kevent_t struct { Fflags uint32 Data int64 Udata *byte + Ext [4]uint64 } type FdSet struct { diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_riscv64.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_riscv64.go new file mode 100644 index 000000000..d6fd9e883 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_riscv64.go @@ -0,0 +1,626 @@ +// cgo -godefs -- -fsigned-char types_freebsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +//go:build riscv64 && freebsd +// +build riscv64,freebsd + +package unix + +const ( + SizeofPtr = 0x8 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x8 + SizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Time_t int64 + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur int64 + Max int64 +} + +type _Gid_t uint32 + +const ( + _statfsVersion = 0x20140518 + _dirblksiz = 0x400 +) + +type Stat_t struct { + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint16 + _0 int16 + Uid uint32 + Gid uint32 + _1 int32 + Rdev uint64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Btim Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint64 + Spare [10]uint64 +} + +type Statfs_t struct { + Version uint32 + Type uint32 + Flags uint64 + Bsize uint64 + Iosize uint64 + Blocks uint64 + Bfree uint64 + Bavail int64 + Files uint64 + Ffree int64 + Syncwrites uint64 + Asyncwrites uint64 + Syncreads uint64 + Asyncreads uint64 + Spare [10]uint64 + Namemax uint32 + Owner uint32 + Fsid Fsid + Charspare [80]int8 + Fstypename [16]byte + Mntfromname [1024]byte + Mntonname [1024]byte +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 + Sysid int32 + _ [4]byte +} + +type Dirent struct { + Fileno uint64 + Off int64 + Reclen uint16 + Type uint8 + Pad0 uint8 + Namlen uint16 + Pad1 uint16 + Name [256]int8 +} + +type Fsid struct { + Val [2]int32 +} + +const ( + PathMax = 0x400 +) + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [46]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Xucred struct { + Version uint32 + Uid uint32 + Ngroups int16 + Groups [16]uint32 + _ *byte +} + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x36 + SizeofXucred = 0x58 + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type PtraceLwpInfoStruct struct { + Lwpid int32 + Event int32 + Flags int32 + Sigmask Sigset_t + Siglist Sigset_t + Siginfo __Siginfo + Tdname [20]int8 + Child_pid int32 + Syscall_code uint32 + Syscall_narg uint32 +} + +type __Siginfo struct { + Signo int32 + Errno int32 + Code int32 + Pid int32 + Uid uint32 + Status int32 + Addr *byte + Value [8]byte + _ [40]byte +} + +type Sigset_t struct { + Val [4]uint32 +} + +type Reg struct { + Ra uint64 + Sp uint64 + Gp uint64 + Tp uint64 + T [7]uint64 + S [12]uint64 + A [8]uint64 + Sepc uint64 + Sstatus uint64 +} + +type FpReg struct { + X [32][2]uint64 + Fcsr uint64 +} + +type FpExtendedPrecision struct{} + +type PtraceIoDesc struct { + Op int32 + Offs *byte + Addr *byte + Len uint64 +} + +type Kevent_t struct { + Ident uint64 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte + Ext [4]uint64 +} + +type FdSet struct { + Bits [16]uint64 +} + +const ( + sizeofIfMsghdr = 0xa8 + SizeofIfMsghdr = 0xa8 + sizeofIfData = 0x98 + SizeofIfData = 0x98 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x98 + SizeofRtMetrics = 0x70 +) + +type ifMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ uint16 + Data ifData +} + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Data IfData +} + +type ifData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Vhid uint8 + Datalen uint16 + Mtu uint32 + Metric uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Oqdrops uint64 + Noproto uint64 + Hwassist uint64 + _ [8]byte + _ [16]byte +} + +type IfData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Spare_char1 uint8 + Spare_char2 uint8 + Datalen uint8 + Mtu uint64 + Metric uint64 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Hwassist uint64 + Epoch int64 + Lastchange Timeval +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ uint16 + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ uint16 +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + _ uint16 + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Fmask int32 + Inits uint64 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint64 + Mtu uint64 + Hopcount uint64 + Expire uint64 + Recvpipe uint64 + Sendpipe uint64 + Ssthresh uint64 + Rtt uint64 + Rttvar uint64 + Pksent uint64 + Weight uint64 + Nhidx uint64 + Filler [2]uint64 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfZbuf = 0x18 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x20 + SizeofBpfZbufHeader = 0x20 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfZbuf struct { + Bufa *byte + Bufb *byte + Buflen uint64 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + _ [6]byte +} + +type BpfZbufHeader struct { + Kernel_gen uint32 + Kernel_len uint32 + User_gen uint32 + _ [5]uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_EACCESS = 0x100 + AT_SYMLINK_NOFOLLOW = 0x200 + AT_SYMLINK_FOLLOW = 0x400 + AT_REMOVEDIR = 0x800 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLINIGNEOF = 0x2000 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type CapRights struct { + Rights [2]uint64 +} + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} + +const SizeofClockinfo = 0x14 + +type Clockinfo struct { + Hz int32 + Tick int32 + Spare int32 + Stathz int32 + Profhz int32 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux.go b/vendor/golang.org/x/sys/unix/ztypes_linux.go index f6f0d79c4..ff6881167 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux.go @@ -24,6 +24,11 @@ type ItimerSpec struct { Value Timespec } +type Itimerval struct { + Interval Timeval + Value Timeval +} + const ( TIME_OK = 0x0 TIME_INS = 0x1 @@ -749,6 +754,25 @@ const ( AT_SYMLINK_NOFOLLOW = 0x100 AT_EACCESS = 0x200 + + OPEN_TREE_CLONE = 0x1 + + MOVE_MOUNT_F_SYMLINKS = 0x1 + MOVE_MOUNT_F_AUTOMOUNTS = 0x2 + MOVE_MOUNT_F_EMPTY_PATH = 0x4 + MOVE_MOUNT_T_SYMLINKS = 0x10 + MOVE_MOUNT_T_AUTOMOUNTS = 0x20 + MOVE_MOUNT_T_EMPTY_PATH = 0x40 + MOVE_MOUNT_SET_GROUP = 0x100 + + FSOPEN_CLOEXEC = 0x1 + + FSPICK_CLOEXEC = 0x1 + FSPICK_SYMLINK_NOFOLLOW = 0x2 + FSPICK_NO_AUTOMOUNT = 0x4 + FSPICK_EMPTY_PATH = 0x8 + + FSMOUNT_CLOEXEC = 0x1 ) type OpenHow struct { @@ -921,6 +945,9 @@ type PerfEventAttr struct { Aux_watermark uint32 Sample_max_stack uint16 _ uint16 + Aux_sample_size uint32 + _ uint32 + Sig_data uint64 } type PerfEventMmapPage struct { @@ -1103,7 +1130,9 @@ const ( PERF_BR_SYSRET = 0x8 PERF_BR_COND_CALL = 0x9 PERF_BR_COND_RET = 0xa - PERF_BR_MAX = 0xb + PERF_BR_ERET = 0xb + PERF_BR_IRQ = 0xc + PERF_BR_MAX = 0xd PERF_SAMPLE_REGS_ABI_NONE = 0x0 PERF_SAMPLE_REGS_ABI_32 = 0x1 PERF_SAMPLE_REGS_ABI_64 = 0x2 @@ -1144,7 +1173,8 @@ const ( PERF_RECORD_BPF_EVENT = 0x12 PERF_RECORD_CGROUP = 0x13 PERF_RECORD_TEXT_POKE = 0x14 - PERF_RECORD_MAX = 0x15 + PERF_RECORD_AUX_OUTPUT_HW_ID = 0x15 + PERF_RECORD_MAX = 0x16 PERF_RECORD_KSYMBOL_TYPE_UNKNOWN = 0x0 PERF_RECORD_KSYMBOL_TYPE_BPF = 0x1 PERF_RECORD_KSYMBOL_TYPE_OOL = 0x2 @@ -1436,6 +1466,11 @@ const ( IFLA_ALT_IFNAME = 0x35 IFLA_PERM_ADDRESS = 0x36 IFLA_PROTO_DOWN_REASON = 0x37 + IFLA_PARENT_DEV_NAME = 0x38 + IFLA_PARENT_DEV_BUS_NAME = 0x39 + IFLA_GRO_MAX_SIZE = 0x3a + IFLA_TSO_MAX_SIZE = 0x3b + IFLA_TSO_MAX_SEGS = 0x3c IFLA_PROTO_DOWN_REASON_UNSPEC = 0x0 IFLA_PROTO_DOWN_REASON_MASK = 0x1 IFLA_PROTO_DOWN_REASON_VALUE = 0x2 @@ -1784,7 +1819,8 @@ const ( const ( NF_NETDEV_INGRESS = 0x0 - NF_NETDEV_NUMHOOKS = 0x1 + NF_NETDEV_EGRESS = 0x1 + NF_NETDEV_NUMHOOKS = 0x2 ) const ( @@ -2943,7 +2979,7 @@ const ( DEVLINK_CMD_TRAP_POLICER_NEW = 0x47 DEVLINK_CMD_TRAP_POLICER_DEL = 0x48 DEVLINK_CMD_HEALTH_REPORTER_TEST = 0x49 - DEVLINK_CMD_MAX = 0x4d + DEVLINK_CMD_MAX = 0x51 DEVLINK_PORT_TYPE_NOTSET = 0x0 DEVLINK_PORT_TYPE_AUTO = 0x1 DEVLINK_PORT_TYPE_ETH = 0x2 @@ -3166,7 +3202,13 @@ const ( DEVLINK_ATTR_RELOAD_ACTION_INFO = 0xa2 DEVLINK_ATTR_RELOAD_ACTION_STATS = 0xa3 DEVLINK_ATTR_PORT_PCI_SF_NUMBER = 0xa4 - DEVLINK_ATTR_MAX = 0xa9 + DEVLINK_ATTR_RATE_TYPE = 0xa5 + DEVLINK_ATTR_RATE_TX_SHARE = 0xa6 + DEVLINK_ATTR_RATE_TX_MAX = 0xa7 + DEVLINK_ATTR_RATE_NODE_NAME = 0xa8 + DEVLINK_ATTR_RATE_PARENT_NODE_NAME = 0xa9 + DEVLINK_ATTR_REGION_MAX_SNAPSHOTS = 0xaa + DEVLINK_ATTR_MAX = 0xae DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0 DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1 DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0 @@ -3463,7 +3505,14 @@ const ( ETHTOOL_MSG_CABLE_TEST_ACT = 0x1a ETHTOOL_MSG_CABLE_TEST_TDR_ACT = 0x1b ETHTOOL_MSG_TUNNEL_INFO_GET = 0x1c - ETHTOOL_MSG_USER_MAX = 0x21 + ETHTOOL_MSG_FEC_GET = 0x1d + ETHTOOL_MSG_FEC_SET = 0x1e + ETHTOOL_MSG_MODULE_EEPROM_GET = 0x1f + ETHTOOL_MSG_STATS_GET = 0x20 + ETHTOOL_MSG_PHC_VCLOCKS_GET = 0x21 + ETHTOOL_MSG_MODULE_GET = 0x22 + ETHTOOL_MSG_MODULE_SET = 0x23 + ETHTOOL_MSG_USER_MAX = 0x23 ETHTOOL_MSG_KERNEL_NONE = 0x0 ETHTOOL_MSG_STRSET_GET_REPLY = 0x1 ETHTOOL_MSG_LINKINFO_GET_REPLY = 0x2 @@ -3494,7 +3543,14 @@ const ( ETHTOOL_MSG_CABLE_TEST_NTF = 0x1b ETHTOOL_MSG_CABLE_TEST_TDR_NTF = 0x1c ETHTOOL_MSG_TUNNEL_INFO_GET_REPLY = 0x1d - ETHTOOL_MSG_KERNEL_MAX = 0x22 + ETHTOOL_MSG_FEC_GET_REPLY = 0x1e + ETHTOOL_MSG_FEC_NTF = 0x1f + ETHTOOL_MSG_MODULE_EEPROM_GET_REPLY = 0x20 + ETHTOOL_MSG_STATS_GET_REPLY = 0x21 + ETHTOOL_MSG_PHC_VCLOCKS_GET_REPLY = 0x22 + ETHTOOL_MSG_MODULE_GET_REPLY = 0x23 + ETHTOOL_MSG_MODULE_NTF = 0x24 + ETHTOOL_MSG_KERNEL_MAX = 0x24 ETHTOOL_A_HEADER_UNSPEC = 0x0 ETHTOOL_A_HEADER_DEV_INDEX = 0x1 ETHTOOL_A_HEADER_DEV_NAME = 0x2 @@ -3592,7 +3648,11 @@ const ( ETHTOOL_A_RINGS_RX_MINI = 0x7 ETHTOOL_A_RINGS_RX_JUMBO = 0x8 ETHTOOL_A_RINGS_TX = 0x9 - ETHTOOL_A_RINGS_MAX = 0x9 + ETHTOOL_A_RINGS_RX_BUF_LEN = 0xa + ETHTOOL_A_RINGS_TCP_DATA_SPLIT = 0xb + ETHTOOL_A_RINGS_CQE_SIZE = 0xc + ETHTOOL_A_RINGS_TX_PUSH = 0xd + ETHTOOL_A_RINGS_MAX = 0xd ETHTOOL_A_CHANNELS_UNSPEC = 0x0 ETHTOOL_A_CHANNELS_HEADER = 0x1 ETHTOOL_A_CHANNELS_RX_MAX = 0x2 @@ -3744,6 +3804,8 @@ const ( ETHTOOL_A_TUNNEL_INFO_MAX = 0x2 ) +const SPEED_UNKNOWN = -0x1 + type EthtoolDrvinfo struct { Cmd uint32 Driver [32]byte @@ -4043,3 +4105,1505 @@ const ( NL_POLICY_TYPE_ATTR_MASK = 0xc NL_POLICY_TYPE_ATTR_MAX = 0xc ) + +type CANBitTiming struct { + Bitrate uint32 + Sample_point uint32 + Tq uint32 + Prop_seg uint32 + Phase_seg1 uint32 + Phase_seg2 uint32 + Sjw uint32 + Brp uint32 +} + +type CANBitTimingConst struct { + Name [16]uint8 + Tseg1_min uint32 + Tseg1_max uint32 + Tseg2_min uint32 + Tseg2_max uint32 + Sjw_max uint32 + Brp_min uint32 + Brp_max uint32 + Brp_inc uint32 +} + +type CANClock struct { + Freq uint32 +} + +type CANBusErrorCounters struct { + Txerr uint16 + Rxerr uint16 +} + +type CANCtrlMode struct { + Mask uint32 + Flags uint32 +} + +type CANDeviceStats struct { + Bus_error uint32 + Error_warning uint32 + Error_passive uint32 + Bus_off uint32 + Arbitration_lost uint32 + Restarts uint32 +} + +const ( + CAN_STATE_ERROR_ACTIVE = 0x0 + CAN_STATE_ERROR_WARNING = 0x1 + CAN_STATE_ERROR_PASSIVE = 0x2 + CAN_STATE_BUS_OFF = 0x3 + CAN_STATE_STOPPED = 0x4 + CAN_STATE_SLEEPING = 0x5 + CAN_STATE_MAX = 0x6 +) + +const ( + IFLA_CAN_UNSPEC = 0x0 + IFLA_CAN_BITTIMING = 0x1 + IFLA_CAN_BITTIMING_CONST = 0x2 + IFLA_CAN_CLOCK = 0x3 + IFLA_CAN_STATE = 0x4 + IFLA_CAN_CTRLMODE = 0x5 + IFLA_CAN_RESTART_MS = 0x6 + IFLA_CAN_RESTART = 0x7 + IFLA_CAN_BERR_COUNTER = 0x8 + IFLA_CAN_DATA_BITTIMING = 0x9 + IFLA_CAN_DATA_BITTIMING_CONST = 0xa + IFLA_CAN_TERMINATION = 0xb + IFLA_CAN_TERMINATION_CONST = 0xc + IFLA_CAN_BITRATE_CONST = 0xd + IFLA_CAN_DATA_BITRATE_CONST = 0xe + IFLA_CAN_BITRATE_MAX = 0xf +) + +type KCMAttach struct { + Fd int32 + Bpf_fd int32 +} + +type KCMUnattach struct { + Fd int32 +} + +type KCMClone struct { + Fd int32 +} + +const ( + NL80211_AC_BE = 0x2 + NL80211_AC_BK = 0x3 + NL80211_ACL_POLICY_ACCEPT_UNLESS_LISTED = 0x0 + NL80211_ACL_POLICY_DENY_UNLESS_LISTED = 0x1 + NL80211_AC_VI = 0x1 + NL80211_AC_VO = 0x0 + NL80211_ATTR_4ADDR = 0x53 + NL80211_ATTR_ACK = 0x5c + NL80211_ATTR_ACK_SIGNAL = 0x107 + NL80211_ATTR_ACL_POLICY = 0xa5 + NL80211_ATTR_ADMITTED_TIME = 0xd4 + NL80211_ATTR_AIRTIME_WEIGHT = 0x112 + NL80211_ATTR_AKM_SUITES = 0x4c + NL80211_ATTR_AP_ISOLATE = 0x60 + NL80211_ATTR_AUTH_DATA = 0x9c + NL80211_ATTR_AUTH_TYPE = 0x35 + NL80211_ATTR_BANDS = 0xef + NL80211_ATTR_BEACON_HEAD = 0xe + NL80211_ATTR_BEACON_INTERVAL = 0xc + NL80211_ATTR_BEACON_TAIL = 0xf + NL80211_ATTR_BG_SCAN_PERIOD = 0x98 + NL80211_ATTR_BSS_BASIC_RATES = 0x24 + NL80211_ATTR_BSS = 0x2f + NL80211_ATTR_BSS_CTS_PROT = 0x1c + NL80211_ATTR_BSS_HT_OPMODE = 0x6d + NL80211_ATTR_BSSID = 0xf5 + NL80211_ATTR_BSS_SELECT = 0xe3 + NL80211_ATTR_BSS_SHORT_PREAMBLE = 0x1d + NL80211_ATTR_BSS_SHORT_SLOT_TIME = 0x1e + NL80211_ATTR_CENTER_FREQ1 = 0xa0 + NL80211_ATTR_CENTER_FREQ1_OFFSET = 0x123 + NL80211_ATTR_CENTER_FREQ2 = 0xa1 + NL80211_ATTR_CHANNEL_WIDTH = 0x9f + NL80211_ATTR_CH_SWITCH_BLOCK_TX = 0xb8 + NL80211_ATTR_CH_SWITCH_COUNT = 0xb7 + NL80211_ATTR_CIPHER_SUITE_GROUP = 0x4a + NL80211_ATTR_CIPHER_SUITES = 0x39 + NL80211_ATTR_CIPHER_SUITES_PAIRWISE = 0x49 + NL80211_ATTR_CNTDWN_OFFS_BEACON = 0xba + NL80211_ATTR_CNTDWN_OFFS_PRESP = 0xbb + NL80211_ATTR_COALESCE_RULE = 0xb6 + NL80211_ATTR_COALESCE_RULE_CONDITION = 0x2 + NL80211_ATTR_COALESCE_RULE_DELAY = 0x1 + NL80211_ATTR_COALESCE_RULE_MAX = 0x3 + NL80211_ATTR_COALESCE_RULE_PKT_PATTERN = 0x3 + NL80211_ATTR_CONN_FAILED_REASON = 0x9b + NL80211_ATTR_CONTROL_PORT = 0x44 + NL80211_ATTR_CONTROL_PORT_ETHERTYPE = 0x66 + NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT = 0x67 + NL80211_ATTR_CONTROL_PORT_NO_PREAUTH = 0x11e + NL80211_ATTR_CONTROL_PORT_OVER_NL80211 = 0x108 + NL80211_ATTR_COOKIE = 0x58 + NL80211_ATTR_CQM_BEACON_LOSS_EVENT = 0x8 + NL80211_ATTR_CQM = 0x5e + NL80211_ATTR_CQM_MAX = 0x9 + NL80211_ATTR_CQM_PKT_LOSS_EVENT = 0x4 + NL80211_ATTR_CQM_RSSI_HYST = 0x2 + NL80211_ATTR_CQM_RSSI_LEVEL = 0x9 + NL80211_ATTR_CQM_RSSI_THOLD = 0x1 + NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT = 0x3 + NL80211_ATTR_CQM_TXE_INTVL = 0x7 + NL80211_ATTR_CQM_TXE_PKTS = 0x6 + NL80211_ATTR_CQM_TXE_RATE = 0x5 + NL80211_ATTR_CRIT_PROT_ID = 0xb3 + NL80211_ATTR_CSA_C_OFF_BEACON = 0xba + NL80211_ATTR_CSA_C_OFF_PRESP = 0xbb + NL80211_ATTR_CSA_C_OFFSETS_TX = 0xcd + NL80211_ATTR_CSA_IES = 0xb9 + NL80211_ATTR_DEVICE_AP_SME = 0x8d + NL80211_ATTR_DFS_CAC_TIME = 0x7 + NL80211_ATTR_DFS_REGION = 0x92 + NL80211_ATTR_DISABLE_HE = 0x12d + NL80211_ATTR_DISABLE_HT = 0x93 + NL80211_ATTR_DISABLE_VHT = 0xaf + NL80211_ATTR_DISCONNECTED_BY_AP = 0x47 + NL80211_ATTR_DONT_WAIT_FOR_ACK = 0x8e + NL80211_ATTR_DTIM_PERIOD = 0xd + NL80211_ATTR_DURATION = 0x57 + NL80211_ATTR_EXT_CAPA = 0xa9 + NL80211_ATTR_EXT_CAPA_MASK = 0xaa + NL80211_ATTR_EXTERNAL_AUTH_ACTION = 0x104 + NL80211_ATTR_EXTERNAL_AUTH_SUPPORT = 0x105 + NL80211_ATTR_EXT_FEATURES = 0xd9 + NL80211_ATTR_FEATURE_FLAGS = 0x8f + NL80211_ATTR_FILS_CACHE_ID = 0xfd + NL80211_ATTR_FILS_DISCOVERY = 0x126 + NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM = 0xfb + NL80211_ATTR_FILS_ERP_REALM = 0xfa + NL80211_ATTR_FILS_ERP_RRK = 0xfc + NL80211_ATTR_FILS_ERP_USERNAME = 0xf9 + NL80211_ATTR_FILS_KEK = 0xf2 + NL80211_ATTR_FILS_NONCES = 0xf3 + NL80211_ATTR_FRAME = 0x33 + NL80211_ATTR_FRAME_MATCH = 0x5b + NL80211_ATTR_FRAME_TYPE = 0x65 + NL80211_ATTR_FREQ_AFTER = 0x3b + NL80211_ATTR_FREQ_BEFORE = 0x3a + NL80211_ATTR_FREQ_FIXED = 0x3c + NL80211_ATTR_FREQ_RANGE_END = 0x3 + NL80211_ATTR_FREQ_RANGE_MAX_BW = 0x4 + NL80211_ATTR_FREQ_RANGE_START = 0x2 + NL80211_ATTR_FTM_RESPONDER = 0x10e + NL80211_ATTR_FTM_RESPONDER_STATS = 0x10f + NL80211_ATTR_GENERATION = 0x2e + NL80211_ATTR_HANDLE_DFS = 0xbf + NL80211_ATTR_HE_6GHZ_CAPABILITY = 0x125 + NL80211_ATTR_HE_BSS_COLOR = 0x11b + NL80211_ATTR_HE_CAPABILITY = 0x10d + NL80211_ATTR_HE_OBSS_PD = 0x117 + NL80211_ATTR_HIDDEN_SSID = 0x7e + NL80211_ATTR_HT_CAPABILITY = 0x1f + NL80211_ATTR_HT_CAPABILITY_MASK = 0x94 + NL80211_ATTR_IE_ASSOC_RESP = 0x80 + NL80211_ATTR_IE = 0x2a + NL80211_ATTR_IE_PROBE_RESP = 0x7f + NL80211_ATTR_IE_RIC = 0xb2 + NL80211_ATTR_IFACE_SOCKET_OWNER = 0xcc + NL80211_ATTR_IFINDEX = 0x3 + NL80211_ATTR_IFNAME = 0x4 + NL80211_ATTR_IFTYPE_AKM_SUITES = 0x11c + NL80211_ATTR_IFTYPE = 0x5 + NL80211_ATTR_IFTYPE_EXT_CAPA = 0xe6 + NL80211_ATTR_INACTIVITY_TIMEOUT = 0x96 + NL80211_ATTR_INTERFACE_COMBINATIONS = 0x78 + NL80211_ATTR_KEY_CIPHER = 0x9 + NL80211_ATTR_KEY = 0x50 + NL80211_ATTR_KEY_DATA = 0x7 + NL80211_ATTR_KEY_DEFAULT = 0xb + NL80211_ATTR_KEY_DEFAULT_MGMT = 0x28 + NL80211_ATTR_KEY_DEFAULT_TYPES = 0x6e + NL80211_ATTR_KEY_IDX = 0x8 + NL80211_ATTR_KEYS = 0x51 + NL80211_ATTR_KEY_SEQ = 0xa + NL80211_ATTR_KEY_TYPE = 0x37 + NL80211_ATTR_LOCAL_MESH_POWER_MODE = 0xa4 + NL80211_ATTR_LOCAL_STATE_CHANGE = 0x5f + NL80211_ATTR_MAC_ACL_MAX = 0xa7 + NL80211_ATTR_MAC_ADDRS = 0xa6 + NL80211_ATTR_MAC = 0x6 + NL80211_ATTR_MAC_HINT = 0xc8 + NL80211_ATTR_MAC_MASK = 0xd7 + NL80211_ATTR_MAX_AP_ASSOC_STA = 0xca + NL80211_ATTR_MAX = 0x137 + NL80211_ATTR_MAX_CRIT_PROT_DURATION = 0xb4 + NL80211_ATTR_MAX_CSA_COUNTERS = 0xce + NL80211_ATTR_MAX_MATCH_SETS = 0x85 + NL80211_ATTR_MAX_NUM_PMKIDS = 0x56 + NL80211_ATTR_MAX_NUM_SCAN_SSIDS = 0x2b + NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS = 0xde + NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS = 0x7b + NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION = 0x6f + NL80211_ATTR_MAX_SCAN_IE_LEN = 0x38 + NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL = 0xdf + NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS = 0xe0 + NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN = 0x7c + NL80211_ATTR_MCAST_RATE = 0x6b + NL80211_ATTR_MDID = 0xb1 + NL80211_ATTR_MEASUREMENT_DURATION = 0xeb + NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY = 0xec + NL80211_ATTR_MESH_CONFIG = 0x23 + NL80211_ATTR_MESH_ID = 0x18 + NL80211_ATTR_MESH_PEER_AID = 0xed + NL80211_ATTR_MESH_SETUP = 0x70 + NL80211_ATTR_MGMT_SUBTYPE = 0x29 + NL80211_ATTR_MNTR_FLAGS = 0x17 + NL80211_ATTR_MPATH_INFO = 0x1b + NL80211_ATTR_MPATH_NEXT_HOP = 0x1a + NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED = 0xf4 + NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR = 0xe8 + NL80211_ATTR_MU_MIMO_GROUP_DATA = 0xe7 + NL80211_ATTR_NAN_FUNC = 0xf0 + NL80211_ATTR_NAN_MASTER_PREF = 0xee + NL80211_ATTR_NAN_MATCH = 0xf1 + NL80211_ATTR_NETNS_FD = 0xdb + NL80211_ATTR_NOACK_MAP = 0x95 + NL80211_ATTR_NSS = 0x106 + NL80211_ATTR_OFFCHANNEL_TX_OK = 0x6c + NL80211_ATTR_OPER_CLASS = 0xd6 + NL80211_ATTR_OPMODE_NOTIF = 0xc2 + NL80211_ATTR_P2P_CTWINDOW = 0xa2 + NL80211_ATTR_P2P_OPPPS = 0xa3 + NL80211_ATTR_PAD = 0xe5 + NL80211_ATTR_PBSS = 0xe2 + NL80211_ATTR_PEER_AID = 0xb5 + NL80211_ATTR_PEER_MEASUREMENTS = 0x111 + NL80211_ATTR_PID = 0x52 + NL80211_ATTR_PMK = 0xfe + NL80211_ATTR_PMKID = 0x55 + NL80211_ATTR_PMK_LIFETIME = 0x11f + NL80211_ATTR_PMKR0_NAME = 0x102 + NL80211_ATTR_PMK_REAUTH_THRESHOLD = 0x120 + NL80211_ATTR_PMKSA_CANDIDATE = 0x86 + NL80211_ATTR_PORT_AUTHORIZED = 0x103 + NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN = 0x5 + NL80211_ATTR_POWER_RULE_MAX_EIRP = 0x6 + NL80211_ATTR_PREV_BSSID = 0x4f + NL80211_ATTR_PRIVACY = 0x46 + NL80211_ATTR_PROBE_RESP = 0x91 + NL80211_ATTR_PROBE_RESP_OFFLOAD = 0x90 + NL80211_ATTR_PROTOCOL_FEATURES = 0xad + NL80211_ATTR_PS_STATE = 0x5d + NL80211_ATTR_QOS_MAP = 0xc7 + NL80211_ATTR_RADAR_EVENT = 0xa8 + NL80211_ATTR_REASON_CODE = 0x36 + NL80211_ATTR_RECEIVE_MULTICAST = 0x121 + NL80211_ATTR_RECONNECT_REQUESTED = 0x12b + NL80211_ATTR_REG_ALPHA2 = 0x21 + NL80211_ATTR_REG_INDOOR = 0xdd + NL80211_ATTR_REG_INITIATOR = 0x30 + NL80211_ATTR_REG_RULE_FLAGS = 0x1 + NL80211_ATTR_REG_RULES = 0x22 + NL80211_ATTR_REG_TYPE = 0x31 + NL80211_ATTR_REKEY_DATA = 0x7a + NL80211_ATTR_REQ_IE = 0x4d + NL80211_ATTR_RESP_IE = 0x4e + NL80211_ATTR_ROAM_SUPPORT = 0x83 + NL80211_ATTR_RX_FRAME_TYPES = 0x64 + NL80211_ATTR_RXMGMT_FLAGS = 0xbc + NL80211_ATTR_RX_SIGNAL_DBM = 0x97 + NL80211_ATTR_S1G_CAPABILITY = 0x128 + NL80211_ATTR_S1G_CAPABILITY_MASK = 0x129 + NL80211_ATTR_SAE_DATA = 0x9c + NL80211_ATTR_SAE_PASSWORD = 0x115 + NL80211_ATTR_SAE_PWE = 0x12a + NL80211_ATTR_SAR_SPEC = 0x12c + NL80211_ATTR_SCAN_FLAGS = 0x9e + NL80211_ATTR_SCAN_FREQ_KHZ = 0x124 + NL80211_ATTR_SCAN_FREQUENCIES = 0x2c + NL80211_ATTR_SCAN_GENERATION = 0x2e + NL80211_ATTR_SCAN_SSIDS = 0x2d + NL80211_ATTR_SCAN_START_TIME_TSF_BSSID = 0xea + NL80211_ATTR_SCAN_START_TIME_TSF = 0xe9 + NL80211_ATTR_SCAN_SUPP_RATES = 0x7d + NL80211_ATTR_SCHED_SCAN_DELAY = 0xdc + NL80211_ATTR_SCHED_SCAN_INTERVAL = 0x77 + NL80211_ATTR_SCHED_SCAN_MATCH = 0x84 + NL80211_ATTR_SCHED_SCAN_MATCH_SSID = 0x1 + NL80211_ATTR_SCHED_SCAN_MAX_REQS = 0x100 + NL80211_ATTR_SCHED_SCAN_MULTI = 0xff + NL80211_ATTR_SCHED_SCAN_PLANS = 0xe1 + NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI = 0xf6 + NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST = 0xf7 + NL80211_ATTR_SMPS_MODE = 0xd5 + NL80211_ATTR_SOCKET_OWNER = 0xcc + NL80211_ATTR_SOFTWARE_IFTYPES = 0x79 + NL80211_ATTR_SPLIT_WIPHY_DUMP = 0xae + NL80211_ATTR_SSID = 0x34 + NL80211_ATTR_STA_AID = 0x10 + NL80211_ATTR_STA_CAPABILITY = 0xab + NL80211_ATTR_STA_EXT_CAPABILITY = 0xac + NL80211_ATTR_STA_FLAGS2 = 0x43 + NL80211_ATTR_STA_FLAGS = 0x11 + NL80211_ATTR_STA_INFO = 0x15 + NL80211_ATTR_STA_LISTEN_INTERVAL = 0x12 + NL80211_ATTR_STA_PLINK_ACTION = 0x19 + NL80211_ATTR_STA_PLINK_STATE = 0x74 + NL80211_ATTR_STA_SUPPORTED_CHANNELS = 0xbd + NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES = 0xbe + NL80211_ATTR_STA_SUPPORTED_RATES = 0x13 + NL80211_ATTR_STA_SUPPORT_P2P_PS = 0xe4 + NL80211_ATTR_STATUS_CODE = 0x48 + NL80211_ATTR_STA_TX_POWER = 0x114 + NL80211_ATTR_STA_TX_POWER_SETTING = 0x113 + NL80211_ATTR_STA_VLAN = 0x14 + NL80211_ATTR_STA_WME = 0x81 + NL80211_ATTR_SUPPORT_10_MHZ = 0xc1 + NL80211_ATTR_SUPPORT_5_MHZ = 0xc0 + NL80211_ATTR_SUPPORT_AP_UAPSD = 0x82 + NL80211_ATTR_SUPPORTED_COMMANDS = 0x32 + NL80211_ATTR_SUPPORTED_IFTYPES = 0x20 + NL80211_ATTR_SUPPORT_IBSS_RSN = 0x68 + NL80211_ATTR_SUPPORT_MESH_AUTH = 0x73 + NL80211_ATTR_SURVEY_INFO = 0x54 + NL80211_ATTR_SURVEY_RADIO_STATS = 0xda + NL80211_ATTR_TDLS_ACTION = 0x88 + NL80211_ATTR_TDLS_DIALOG_TOKEN = 0x89 + NL80211_ATTR_TDLS_EXTERNAL_SETUP = 0x8c + NL80211_ATTR_TDLS_INITIATOR = 0xcf + NL80211_ATTR_TDLS_OPERATION = 0x8a + NL80211_ATTR_TDLS_PEER_CAPABILITY = 0xcb + NL80211_ATTR_TDLS_SUPPORT = 0x8b + NL80211_ATTR_TESTDATA = 0x45 + NL80211_ATTR_TID_CONFIG = 0x11d + NL80211_ATTR_TIMED_OUT = 0x41 + NL80211_ATTR_TIMEOUT = 0x110 + NL80211_ATTR_TIMEOUT_REASON = 0xf8 + NL80211_ATTR_TSID = 0xd2 + NL80211_ATTR_TWT_RESPONDER = 0x116 + NL80211_ATTR_TX_FRAME_TYPES = 0x63 + NL80211_ATTR_TX_NO_CCK_RATE = 0x87 + NL80211_ATTR_TXQ_LIMIT = 0x10a + NL80211_ATTR_TXQ_MEMORY_LIMIT = 0x10b + NL80211_ATTR_TXQ_QUANTUM = 0x10c + NL80211_ATTR_TXQ_STATS = 0x109 + NL80211_ATTR_TX_RATES = 0x5a + NL80211_ATTR_UNSOL_BCAST_PROBE_RESP = 0x127 + NL80211_ATTR_UNSPEC = 0x0 + NL80211_ATTR_USE_MFP = 0x42 + NL80211_ATTR_USER_PRIO = 0xd3 + NL80211_ATTR_USER_REG_HINT_TYPE = 0x9a + NL80211_ATTR_USE_RRM = 0xd0 + NL80211_ATTR_VENDOR_DATA = 0xc5 + NL80211_ATTR_VENDOR_EVENTS = 0xc6 + NL80211_ATTR_VENDOR_ID = 0xc3 + NL80211_ATTR_VENDOR_SUBCMD = 0xc4 + NL80211_ATTR_VHT_CAPABILITY = 0x9d + NL80211_ATTR_VHT_CAPABILITY_MASK = 0xb0 + NL80211_ATTR_VLAN_ID = 0x11a + NL80211_ATTR_WANT_1X_4WAY_HS = 0x101 + NL80211_ATTR_WDEV = 0x99 + NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX = 0x72 + NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX = 0x71 + NL80211_ATTR_WIPHY_ANTENNA_RX = 0x6a + NL80211_ATTR_WIPHY_ANTENNA_TX = 0x69 + NL80211_ATTR_WIPHY_BANDS = 0x16 + NL80211_ATTR_WIPHY_CHANNEL_TYPE = 0x27 + NL80211_ATTR_WIPHY = 0x1 + NL80211_ATTR_WIPHY_COVERAGE_CLASS = 0x59 + NL80211_ATTR_WIPHY_DYN_ACK = 0xd1 + NL80211_ATTR_WIPHY_EDMG_BW_CONFIG = 0x119 + NL80211_ATTR_WIPHY_EDMG_CHANNELS = 0x118 + NL80211_ATTR_WIPHY_FRAG_THRESHOLD = 0x3f + NL80211_ATTR_WIPHY_FREQ = 0x26 + NL80211_ATTR_WIPHY_FREQ_HINT = 0xc9 + NL80211_ATTR_WIPHY_FREQ_OFFSET = 0x122 + NL80211_ATTR_WIPHY_NAME = 0x2 + NL80211_ATTR_WIPHY_RETRY_LONG = 0x3e + NL80211_ATTR_WIPHY_RETRY_SHORT = 0x3d + NL80211_ATTR_WIPHY_RTS_THRESHOLD = 0x40 + NL80211_ATTR_WIPHY_SELF_MANAGED_REG = 0xd8 + NL80211_ATTR_WIPHY_TX_POWER_LEVEL = 0x62 + NL80211_ATTR_WIPHY_TX_POWER_SETTING = 0x61 + NL80211_ATTR_WIPHY_TXQ_PARAMS = 0x25 + NL80211_ATTR_WOWLAN_TRIGGERS = 0x75 + NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED = 0x76 + NL80211_ATTR_WPA_VERSIONS = 0x4b + NL80211_AUTHTYPE_AUTOMATIC = 0x8 + NL80211_AUTHTYPE_FILS_PK = 0x7 + NL80211_AUTHTYPE_FILS_SK = 0x5 + NL80211_AUTHTYPE_FILS_SK_PFS = 0x6 + NL80211_AUTHTYPE_FT = 0x2 + NL80211_AUTHTYPE_MAX = 0x7 + NL80211_AUTHTYPE_NETWORK_EAP = 0x3 + NL80211_AUTHTYPE_OPEN_SYSTEM = 0x0 + NL80211_AUTHTYPE_SAE = 0x4 + NL80211_AUTHTYPE_SHARED_KEY = 0x1 + NL80211_BAND_2GHZ = 0x0 + NL80211_BAND_5GHZ = 0x1 + NL80211_BAND_60GHZ = 0x2 + NL80211_BAND_6GHZ = 0x3 + NL80211_BAND_ATTR_EDMG_BW_CONFIG = 0xb + NL80211_BAND_ATTR_EDMG_CHANNELS = 0xa + NL80211_BAND_ATTR_FREQS = 0x1 + NL80211_BAND_ATTR_HT_AMPDU_DENSITY = 0x6 + NL80211_BAND_ATTR_HT_AMPDU_FACTOR = 0x5 + NL80211_BAND_ATTR_HT_CAPA = 0x4 + NL80211_BAND_ATTR_HT_MCS_SET = 0x3 + NL80211_BAND_ATTR_IFTYPE_DATA = 0x9 + NL80211_BAND_ATTR_MAX = 0xb + NL80211_BAND_ATTR_RATES = 0x2 + NL80211_BAND_ATTR_VHT_CAPA = 0x8 + NL80211_BAND_ATTR_VHT_MCS_SET = 0x7 + NL80211_BAND_IFTYPE_ATTR_HE_6GHZ_CAPA = 0x6 + NL80211_BAND_IFTYPE_ATTR_HE_CAP_MAC = 0x2 + NL80211_BAND_IFTYPE_ATTR_HE_CAP_MCS_SET = 0x4 + NL80211_BAND_IFTYPE_ATTR_HE_CAP_PHY = 0x3 + NL80211_BAND_IFTYPE_ATTR_HE_CAP_PPE = 0x5 + NL80211_BAND_IFTYPE_ATTR_IFTYPES = 0x1 + NL80211_BAND_IFTYPE_ATTR_MAX = 0xb + NL80211_BAND_S1GHZ = 0x4 + NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE = 0x2 + NL80211_BITRATE_ATTR_MAX = 0x2 + NL80211_BITRATE_ATTR_RATE = 0x1 + NL80211_BSS_BEACON_IES = 0xb + NL80211_BSS_BEACON_INTERVAL = 0x4 + NL80211_BSS_BEACON_TSF = 0xd + NL80211_BSS_BSSID = 0x1 + NL80211_BSS_CAPABILITY = 0x5 + NL80211_BSS_CHAIN_SIGNAL = 0x13 + NL80211_BSS_CHAN_WIDTH_10 = 0x1 + NL80211_BSS_CHAN_WIDTH_1 = 0x3 + NL80211_BSS_CHAN_WIDTH_20 = 0x0 + NL80211_BSS_CHAN_WIDTH_2 = 0x4 + NL80211_BSS_CHAN_WIDTH_5 = 0x2 + NL80211_BSS_CHAN_WIDTH = 0xc + NL80211_BSS_FREQUENCY = 0x2 + NL80211_BSS_FREQUENCY_OFFSET = 0x14 + NL80211_BSS_INFORMATION_ELEMENTS = 0x6 + NL80211_BSS_LAST_SEEN_BOOTTIME = 0xf + NL80211_BSS_MAX = 0x14 + NL80211_BSS_PAD = 0x10 + NL80211_BSS_PARENT_BSSID = 0x12 + NL80211_BSS_PARENT_TSF = 0x11 + NL80211_BSS_PRESP_DATA = 0xe + NL80211_BSS_SEEN_MS_AGO = 0xa + NL80211_BSS_SELECT_ATTR_BAND_PREF = 0x2 + NL80211_BSS_SELECT_ATTR_MAX = 0x3 + NL80211_BSS_SELECT_ATTR_RSSI_ADJUST = 0x3 + NL80211_BSS_SELECT_ATTR_RSSI = 0x1 + NL80211_BSS_SIGNAL_MBM = 0x7 + NL80211_BSS_SIGNAL_UNSPEC = 0x8 + NL80211_BSS_STATUS_ASSOCIATED = 0x1 + NL80211_BSS_STATUS_AUTHENTICATED = 0x0 + NL80211_BSS_STATUS = 0x9 + NL80211_BSS_STATUS_IBSS_JOINED = 0x2 + NL80211_BSS_TSF = 0x3 + NL80211_CHAN_HT20 = 0x1 + NL80211_CHAN_HT40MINUS = 0x2 + NL80211_CHAN_HT40PLUS = 0x3 + NL80211_CHAN_NO_HT = 0x0 + NL80211_CHAN_WIDTH_10 = 0x7 + NL80211_CHAN_WIDTH_160 = 0x5 + NL80211_CHAN_WIDTH_16 = 0xc + NL80211_CHAN_WIDTH_1 = 0x8 + NL80211_CHAN_WIDTH_20 = 0x1 + NL80211_CHAN_WIDTH_20_NOHT = 0x0 + NL80211_CHAN_WIDTH_2 = 0x9 + NL80211_CHAN_WIDTH_40 = 0x2 + NL80211_CHAN_WIDTH_4 = 0xa + NL80211_CHAN_WIDTH_5 = 0x6 + NL80211_CHAN_WIDTH_80 = 0x3 + NL80211_CHAN_WIDTH_80P80 = 0x4 + NL80211_CHAN_WIDTH_8 = 0xb + NL80211_CMD_ABORT_SCAN = 0x72 + NL80211_CMD_ACTION = 0x3b + NL80211_CMD_ACTION_TX_STATUS = 0x3c + NL80211_CMD_ADD_NAN_FUNCTION = 0x75 + NL80211_CMD_ADD_TX_TS = 0x69 + NL80211_CMD_ASSOCIATE = 0x26 + NL80211_CMD_AUTHENTICATE = 0x25 + NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL = 0x38 + NL80211_CMD_CHANGE_NAN_CONFIG = 0x77 + NL80211_CMD_CHANNEL_SWITCH = 0x66 + NL80211_CMD_CH_SWITCH_NOTIFY = 0x58 + NL80211_CMD_CH_SWITCH_STARTED_NOTIFY = 0x6e + NL80211_CMD_CONNECT = 0x2e + NL80211_CMD_CONN_FAILED = 0x5b + NL80211_CMD_CONTROL_PORT_FRAME = 0x81 + NL80211_CMD_CONTROL_PORT_FRAME_TX_STATUS = 0x8b + NL80211_CMD_CRIT_PROTOCOL_START = 0x62 + NL80211_CMD_CRIT_PROTOCOL_STOP = 0x63 + NL80211_CMD_DEAUTHENTICATE = 0x27 + NL80211_CMD_DEL_BEACON = 0x10 + NL80211_CMD_DEL_INTERFACE = 0x8 + NL80211_CMD_DEL_KEY = 0xc + NL80211_CMD_DEL_MPATH = 0x18 + NL80211_CMD_DEL_NAN_FUNCTION = 0x76 + NL80211_CMD_DEL_PMK = 0x7c + NL80211_CMD_DEL_PMKSA = 0x35 + NL80211_CMD_DEL_STATION = 0x14 + NL80211_CMD_DEL_TX_TS = 0x6a + NL80211_CMD_DEL_WIPHY = 0x4 + NL80211_CMD_DISASSOCIATE = 0x28 + NL80211_CMD_DISCONNECT = 0x30 + NL80211_CMD_EXTERNAL_AUTH = 0x7f + NL80211_CMD_FLUSH_PMKSA = 0x36 + NL80211_CMD_FRAME = 0x3b + NL80211_CMD_FRAME_TX_STATUS = 0x3c + NL80211_CMD_FRAME_WAIT_CANCEL = 0x43 + NL80211_CMD_FT_EVENT = 0x61 + NL80211_CMD_GET_BEACON = 0xd + NL80211_CMD_GET_COALESCE = 0x64 + NL80211_CMD_GET_FTM_RESPONDER_STATS = 0x82 + NL80211_CMD_GET_INTERFACE = 0x5 + NL80211_CMD_GET_KEY = 0x9 + NL80211_CMD_GET_MESH_CONFIG = 0x1c + NL80211_CMD_GET_MESH_PARAMS = 0x1c + NL80211_CMD_GET_MPATH = 0x15 + NL80211_CMD_GET_MPP = 0x6b + NL80211_CMD_GET_POWER_SAVE = 0x3e + NL80211_CMD_GET_PROTOCOL_FEATURES = 0x5f + NL80211_CMD_GET_REG = 0x1f + NL80211_CMD_GET_SCAN = 0x20 + NL80211_CMD_GET_STATION = 0x11 + NL80211_CMD_GET_SURVEY = 0x32 + NL80211_CMD_GET_WIPHY = 0x1 + NL80211_CMD_GET_WOWLAN = 0x49 + NL80211_CMD_JOIN_IBSS = 0x2b + NL80211_CMD_JOIN_MESH = 0x44 + NL80211_CMD_JOIN_OCB = 0x6c + NL80211_CMD_LEAVE_IBSS = 0x2c + NL80211_CMD_LEAVE_MESH = 0x45 + NL80211_CMD_LEAVE_OCB = 0x6d + NL80211_CMD_MAX = 0x93 + NL80211_CMD_MICHAEL_MIC_FAILURE = 0x29 + NL80211_CMD_NAN_MATCH = 0x78 + NL80211_CMD_NEW_BEACON = 0xf + NL80211_CMD_NEW_INTERFACE = 0x7 + NL80211_CMD_NEW_KEY = 0xb + NL80211_CMD_NEW_MPATH = 0x17 + NL80211_CMD_NEW_PEER_CANDIDATE = 0x48 + NL80211_CMD_NEW_SCAN_RESULTS = 0x22 + NL80211_CMD_NEW_STATION = 0x13 + NL80211_CMD_NEW_SURVEY_RESULTS = 0x33 + NL80211_CMD_NEW_WIPHY = 0x3 + NL80211_CMD_NOTIFY_CQM = 0x40 + NL80211_CMD_NOTIFY_RADAR = 0x86 + NL80211_CMD_PEER_MEASUREMENT_COMPLETE = 0x85 + NL80211_CMD_PEER_MEASUREMENT_RESULT = 0x84 + NL80211_CMD_PEER_MEASUREMENT_START = 0x83 + NL80211_CMD_PMKSA_CANDIDATE = 0x50 + NL80211_CMD_PORT_AUTHORIZED = 0x7d + NL80211_CMD_PROBE_CLIENT = 0x54 + NL80211_CMD_PROBE_MESH_LINK = 0x88 + NL80211_CMD_RADAR_DETECT = 0x5e + NL80211_CMD_REG_BEACON_HINT = 0x2a + NL80211_CMD_REG_CHANGE = 0x24 + NL80211_CMD_REGISTER_ACTION = 0x3a + NL80211_CMD_REGISTER_BEACONS = 0x55 + NL80211_CMD_REGISTER_FRAME = 0x3a + NL80211_CMD_RELOAD_REGDB = 0x7e + NL80211_CMD_REMAIN_ON_CHANNEL = 0x37 + NL80211_CMD_REQ_SET_REG = 0x1b + NL80211_CMD_ROAM = 0x2f + NL80211_CMD_SCAN_ABORTED = 0x23 + NL80211_CMD_SCHED_SCAN_RESULTS = 0x4d + NL80211_CMD_SCHED_SCAN_STOPPED = 0x4e + NL80211_CMD_SET_BEACON = 0xe + NL80211_CMD_SET_BSS = 0x19 + NL80211_CMD_SET_CHANNEL = 0x41 + NL80211_CMD_SET_COALESCE = 0x65 + NL80211_CMD_SET_CQM = 0x3f + NL80211_CMD_SET_INTERFACE = 0x6 + NL80211_CMD_SET_KEY = 0xa + NL80211_CMD_SET_MAC_ACL = 0x5d + NL80211_CMD_SET_MCAST_RATE = 0x5c + NL80211_CMD_SET_MESH_CONFIG = 0x1d + NL80211_CMD_SET_MESH_PARAMS = 0x1d + NL80211_CMD_SET_MGMT_EXTRA_IE = 0x1e + NL80211_CMD_SET_MPATH = 0x16 + NL80211_CMD_SET_MULTICAST_TO_UNICAST = 0x79 + NL80211_CMD_SET_NOACK_MAP = 0x57 + NL80211_CMD_SET_PMK = 0x7b + NL80211_CMD_SET_PMKSA = 0x34 + NL80211_CMD_SET_POWER_SAVE = 0x3d + NL80211_CMD_SET_QOS_MAP = 0x68 + NL80211_CMD_SET_REG = 0x1a + NL80211_CMD_SET_REKEY_OFFLOAD = 0x4f + NL80211_CMD_SET_SAR_SPECS = 0x8c + NL80211_CMD_SET_STATION = 0x12 + NL80211_CMD_SET_TID_CONFIG = 0x89 + NL80211_CMD_SET_TX_BITRATE_MASK = 0x39 + NL80211_CMD_SET_WDS_PEER = 0x42 + NL80211_CMD_SET_WIPHY = 0x2 + NL80211_CMD_SET_WIPHY_NETNS = 0x31 + NL80211_CMD_SET_WOWLAN = 0x4a + NL80211_CMD_STA_OPMODE_CHANGED = 0x80 + NL80211_CMD_START_AP = 0xf + NL80211_CMD_START_NAN = 0x73 + NL80211_CMD_START_P2P_DEVICE = 0x59 + NL80211_CMD_START_SCHED_SCAN = 0x4b + NL80211_CMD_STOP_AP = 0x10 + NL80211_CMD_STOP_NAN = 0x74 + NL80211_CMD_STOP_P2P_DEVICE = 0x5a + NL80211_CMD_STOP_SCHED_SCAN = 0x4c + NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH = 0x70 + NL80211_CMD_TDLS_CHANNEL_SWITCH = 0x6f + NL80211_CMD_TDLS_MGMT = 0x52 + NL80211_CMD_TDLS_OPER = 0x51 + NL80211_CMD_TESTMODE = 0x2d + NL80211_CMD_TRIGGER_SCAN = 0x21 + NL80211_CMD_UNEXPECTED_4ADDR_FRAME = 0x56 + NL80211_CMD_UNEXPECTED_FRAME = 0x53 + NL80211_CMD_UNPROT_BEACON = 0x8a + NL80211_CMD_UNPROT_DEAUTHENTICATE = 0x46 + NL80211_CMD_UNPROT_DISASSOCIATE = 0x47 + NL80211_CMD_UNSPEC = 0x0 + NL80211_CMD_UPDATE_CONNECT_PARAMS = 0x7a + NL80211_CMD_UPDATE_FT_IES = 0x60 + NL80211_CMD_UPDATE_OWE_INFO = 0x87 + NL80211_CMD_VENDOR = 0x67 + NL80211_CMD_WIPHY_REG_CHANGE = 0x71 + NL80211_COALESCE_CONDITION_MATCH = 0x0 + NL80211_COALESCE_CONDITION_NO_MATCH = 0x1 + NL80211_CONN_FAIL_BLOCKED_CLIENT = 0x1 + NL80211_CONN_FAIL_MAX_CLIENTS = 0x0 + NL80211_CQM_RSSI_BEACON_LOSS_EVENT = 0x2 + NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH = 0x1 + NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW = 0x0 + NL80211_CQM_TXE_MAX_INTVL = 0x708 + NL80211_CRIT_PROTO_APIPA = 0x3 + NL80211_CRIT_PROTO_DHCP = 0x1 + NL80211_CRIT_PROTO_EAPOL = 0x2 + NL80211_CRIT_PROTO_MAX_DURATION = 0x1388 + NL80211_CRIT_PROTO_UNSPEC = 0x0 + NL80211_DFS_AVAILABLE = 0x2 + NL80211_DFS_ETSI = 0x2 + NL80211_DFS_FCC = 0x1 + NL80211_DFS_JP = 0x3 + NL80211_DFS_UNAVAILABLE = 0x1 + NL80211_DFS_UNSET = 0x0 + NL80211_DFS_USABLE = 0x0 + NL80211_EDMG_BW_CONFIG_MAX = 0xf + NL80211_EDMG_BW_CONFIG_MIN = 0x4 + NL80211_EDMG_CHANNELS_MAX = 0x3c + NL80211_EDMG_CHANNELS_MIN = 0x1 + NL80211_EXTERNAL_AUTH_ABORT = 0x1 + NL80211_EXTERNAL_AUTH_START = 0x0 + NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK = 0x32 + NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X = 0x10 + NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK = 0xf + NL80211_EXT_FEATURE_ACCEPT_BCAST_PROBE_RESP = 0x12 + NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT = 0x1b + NL80211_EXT_FEATURE_AIRTIME_FAIRNESS = 0x21 + NL80211_EXT_FEATURE_AP_PMKSA_CACHING = 0x22 + NL80211_EXT_FEATURE_AQL = 0x28 + NL80211_EXT_FEATURE_BEACON_PROTECTION_CLIENT = 0x2e + NL80211_EXT_FEATURE_BEACON_PROTECTION = 0x29 + NL80211_EXT_FEATURE_BEACON_RATE_HE = 0x36 + NL80211_EXT_FEATURE_BEACON_RATE_HT = 0x7 + NL80211_EXT_FEATURE_BEACON_RATE_LEGACY = 0x6 + NL80211_EXT_FEATURE_BEACON_RATE_VHT = 0x8 + NL80211_EXT_FEATURE_BSS_PARENT_TSF = 0x4 + NL80211_EXT_FEATURE_CAN_REPLACE_PTK0 = 0x1f + NL80211_EXT_FEATURE_CONTROL_PORT_NO_PREAUTH = 0x2a + NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211 = 0x1a + NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211_TX_STATUS = 0x30 + NL80211_EXT_FEATURE_CQM_RSSI_LIST = 0xd + NL80211_EXT_FEATURE_DATA_ACK_SIGNAL_SUPPORT = 0x1b + NL80211_EXT_FEATURE_DEL_IBSS_STA = 0x2c + NL80211_EXT_FEATURE_DFS_OFFLOAD = 0x19 + NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER = 0x20 + NL80211_EXT_FEATURE_EXT_KEY_ID = 0x24 + NL80211_EXT_FEATURE_FILS_DISCOVERY = 0x34 + NL80211_EXT_FEATURE_FILS_MAX_CHANNEL_TIME = 0x11 + NL80211_EXT_FEATURE_FILS_SK_OFFLOAD = 0xe + NL80211_EXT_FEATURE_FILS_STA = 0x9 + NL80211_EXT_FEATURE_HIGH_ACCURACY_SCAN = 0x18 + NL80211_EXT_FEATURE_LOW_POWER_SCAN = 0x17 + NL80211_EXT_FEATURE_LOW_SPAN_SCAN = 0x16 + NL80211_EXT_FEATURE_MFP_OPTIONAL = 0x15 + NL80211_EXT_FEATURE_MGMT_TX_RANDOM_TA = 0xa + NL80211_EXT_FEATURE_MGMT_TX_RANDOM_TA_CONNECTED = 0xb + NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS = 0x2d + NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER = 0x2 + NL80211_EXT_FEATURE_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION = 0x14 + NL80211_EXT_FEATURE_OCE_PROBE_REQ_HIGH_TX_RATE = 0x13 + NL80211_EXT_FEATURE_OPERATING_CHANNEL_VALIDATION = 0x31 + NL80211_EXT_FEATURE_PROTECTED_TWT = 0x2b + NL80211_EXT_FEATURE_PROT_RANGE_NEGO_AND_MEASURE = 0x39 + NL80211_EXT_FEATURE_RRM = 0x1 + NL80211_EXT_FEATURE_SAE_OFFLOAD_AP = 0x33 + NL80211_EXT_FEATURE_SAE_OFFLOAD = 0x26 + NL80211_EXT_FEATURE_SCAN_FREQ_KHZ = 0x2f + NL80211_EXT_FEATURE_SCAN_MIN_PREQ_CONTENT = 0x1e + NL80211_EXT_FEATURE_SCAN_RANDOM_SN = 0x1d + NL80211_EXT_FEATURE_SCAN_START_TIME = 0x3 + NL80211_EXT_FEATURE_SCHED_SCAN_BAND_SPECIFIC_RSSI_THOLD = 0x23 + NL80211_EXT_FEATURE_SCHED_SCAN_RELATIVE_RSSI = 0xc + NL80211_EXT_FEATURE_SECURE_LTF = 0x37 + NL80211_EXT_FEATURE_SECURE_RTT = 0x38 + NL80211_EXT_FEATURE_SET_SCAN_DWELL = 0x5 + NL80211_EXT_FEATURE_STA_TX_PWR = 0x25 + NL80211_EXT_FEATURE_TXQS = 0x1c + NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP = 0x35 + NL80211_EXT_FEATURE_VHT_IBSS = 0x0 + NL80211_EXT_FEATURE_VLAN_OFFLOAD = 0x27 + NL80211_FEATURE_ACKTO_ESTIMATION = 0x800000 + NL80211_FEATURE_ACTIVE_MONITOR = 0x20000 + NL80211_FEATURE_ADVERTISE_CHAN_LIMITS = 0x4000 + NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE = 0x40000 + NL80211_FEATURE_AP_SCAN = 0x100 + NL80211_FEATURE_CELL_BASE_REG_HINTS = 0x8 + NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES = 0x80000 + NL80211_FEATURE_DYNAMIC_SMPS = 0x2000000 + NL80211_FEATURE_FULL_AP_CLIENT_STATE = 0x8000 + NL80211_FEATURE_HT_IBSS = 0x2 + NL80211_FEATURE_INACTIVITY_TIMER = 0x4 + NL80211_FEATURE_LOW_PRIORITY_SCAN = 0x40 + NL80211_FEATURE_MAC_ON_CREATE = 0x8000000 + NL80211_FEATURE_ND_RANDOM_MAC_ADDR = 0x80000000 + NL80211_FEATURE_NEED_OBSS_SCAN = 0x400 + NL80211_FEATURE_P2P_DEVICE_NEEDS_CHANNEL = 0x10 + NL80211_FEATURE_P2P_GO_CTWIN = 0x800 + NL80211_FEATURE_P2P_GO_OPPPS = 0x1000 + NL80211_FEATURE_QUIET = 0x200000 + NL80211_FEATURE_SAE = 0x20 + NL80211_FEATURE_SCAN_FLUSH = 0x80 + NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR = 0x20000000 + NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR = 0x40000000 + NL80211_FEATURE_SK_TX_STATUS = 0x1 + NL80211_FEATURE_STATIC_SMPS = 0x1000000 + NL80211_FEATURE_SUPPORTS_WMM_ADMISSION = 0x4000000 + NL80211_FEATURE_TDLS_CHANNEL_SWITCH = 0x10000000 + NL80211_FEATURE_TX_POWER_INSERTION = 0x400000 + NL80211_FEATURE_USERSPACE_MPM = 0x10000 + NL80211_FEATURE_VIF_TXPOWER = 0x200 + NL80211_FEATURE_WFA_TPC_IE_IN_PROBES = 0x100000 + NL80211_FILS_DISCOVERY_ATTR_INT_MAX = 0x2 + NL80211_FILS_DISCOVERY_ATTR_INT_MIN = 0x1 + NL80211_FILS_DISCOVERY_ATTR_MAX = 0x3 + NL80211_FILS_DISCOVERY_ATTR_TMPL = 0x3 + NL80211_FILS_DISCOVERY_TMPL_MIN_LEN = 0x2a + NL80211_FREQUENCY_ATTR_16MHZ = 0x19 + NL80211_FREQUENCY_ATTR_1MHZ = 0x15 + NL80211_FREQUENCY_ATTR_2MHZ = 0x16 + NL80211_FREQUENCY_ATTR_4MHZ = 0x17 + NL80211_FREQUENCY_ATTR_8MHZ = 0x18 + NL80211_FREQUENCY_ATTR_DFS_CAC_TIME = 0xd + NL80211_FREQUENCY_ATTR_DFS_STATE = 0x7 + NL80211_FREQUENCY_ATTR_DFS_TIME = 0x8 + NL80211_FREQUENCY_ATTR_DISABLED = 0x2 + NL80211_FREQUENCY_ATTR_FREQ = 0x1 + NL80211_FREQUENCY_ATTR_GO_CONCURRENT = 0xf + NL80211_FREQUENCY_ATTR_INDOOR_ONLY = 0xe + NL80211_FREQUENCY_ATTR_IR_CONCURRENT = 0xf + NL80211_FREQUENCY_ATTR_MAX = 0x1b + NL80211_FREQUENCY_ATTR_MAX_TX_POWER = 0x6 + NL80211_FREQUENCY_ATTR_NO_10MHZ = 0x11 + NL80211_FREQUENCY_ATTR_NO_160MHZ = 0xc + NL80211_FREQUENCY_ATTR_NO_20MHZ = 0x10 + NL80211_FREQUENCY_ATTR_NO_80MHZ = 0xb + NL80211_FREQUENCY_ATTR_NO_HE = 0x13 + NL80211_FREQUENCY_ATTR_NO_HT40_MINUS = 0x9 + NL80211_FREQUENCY_ATTR_NO_HT40_PLUS = 0xa + NL80211_FREQUENCY_ATTR_NO_IBSS = 0x3 + NL80211_FREQUENCY_ATTR_NO_IR = 0x3 + NL80211_FREQUENCY_ATTR_OFFSET = 0x14 + NL80211_FREQUENCY_ATTR_PASSIVE_SCAN = 0x3 + NL80211_FREQUENCY_ATTR_RADAR = 0x5 + NL80211_FREQUENCY_ATTR_WMM = 0x12 + NL80211_FTM_RESP_ATTR_CIVICLOC = 0x3 + NL80211_FTM_RESP_ATTR_ENABLED = 0x1 + NL80211_FTM_RESP_ATTR_LCI = 0x2 + NL80211_FTM_RESP_ATTR_MAX = 0x3 + NL80211_FTM_STATS_ASAP_NUM = 0x4 + NL80211_FTM_STATS_FAILED_NUM = 0x3 + NL80211_FTM_STATS_MAX = 0xa + NL80211_FTM_STATS_NON_ASAP_NUM = 0x5 + NL80211_FTM_STATS_OUT_OF_WINDOW_TRIGGERS_NUM = 0x9 + NL80211_FTM_STATS_PAD = 0xa + NL80211_FTM_STATS_PARTIAL_NUM = 0x2 + NL80211_FTM_STATS_RESCHEDULE_REQUESTS_NUM = 0x8 + NL80211_FTM_STATS_SUCCESS_NUM = 0x1 + NL80211_FTM_STATS_TOTAL_DURATION_MSEC = 0x6 + NL80211_FTM_STATS_UNKNOWN_TRIGGERS_NUM = 0x7 + NL80211_GENL_NAME = "nl80211" + NL80211_HE_BSS_COLOR_ATTR_COLOR = 0x1 + NL80211_HE_BSS_COLOR_ATTR_DISABLED = 0x2 + NL80211_HE_BSS_COLOR_ATTR_MAX = 0x3 + NL80211_HE_BSS_COLOR_ATTR_PARTIAL = 0x3 + NL80211_HE_MAX_CAPABILITY_LEN = 0x36 + NL80211_HE_MIN_CAPABILITY_LEN = 0x10 + NL80211_HE_NSS_MAX = 0x8 + NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP = 0x4 + NL80211_HE_OBSS_PD_ATTR_MAX = 0x6 + NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET = 0x2 + NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET = 0x1 + NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET = 0x3 + NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP = 0x5 + NL80211_HE_OBSS_PD_ATTR_SR_CTRL = 0x6 + NL80211_HIDDEN_SSID_NOT_IN_USE = 0x0 + NL80211_HIDDEN_SSID_ZERO_CONTENTS = 0x2 + NL80211_HIDDEN_SSID_ZERO_LEN = 0x1 + NL80211_HT_CAPABILITY_LEN = 0x1a + NL80211_IFACE_COMB_BI_MIN_GCD = 0x7 + NL80211_IFACE_COMB_LIMITS = 0x1 + NL80211_IFACE_COMB_MAXNUM = 0x2 + NL80211_IFACE_COMB_NUM_CHANNELS = 0x4 + NL80211_IFACE_COMB_RADAR_DETECT_REGIONS = 0x6 + NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS = 0x5 + NL80211_IFACE_COMB_STA_AP_BI_MATCH = 0x3 + NL80211_IFACE_COMB_UNSPEC = 0x0 + NL80211_IFACE_LIMIT_MAX = 0x1 + NL80211_IFACE_LIMIT_TYPES = 0x2 + NL80211_IFACE_LIMIT_UNSPEC = 0x0 + NL80211_IFTYPE_ADHOC = 0x1 + NL80211_IFTYPE_AKM_ATTR_IFTYPES = 0x1 + NL80211_IFTYPE_AKM_ATTR_MAX = 0x2 + NL80211_IFTYPE_AKM_ATTR_SUITES = 0x2 + NL80211_IFTYPE_AP = 0x3 + NL80211_IFTYPE_AP_VLAN = 0x4 + NL80211_IFTYPE_MAX = 0xc + NL80211_IFTYPE_MESH_POINT = 0x7 + NL80211_IFTYPE_MONITOR = 0x6 + NL80211_IFTYPE_NAN = 0xc + NL80211_IFTYPE_OCB = 0xb + NL80211_IFTYPE_P2P_CLIENT = 0x8 + NL80211_IFTYPE_P2P_DEVICE = 0xa + NL80211_IFTYPE_P2P_GO = 0x9 + NL80211_IFTYPE_STATION = 0x2 + NL80211_IFTYPE_UNSPECIFIED = 0x0 + NL80211_IFTYPE_WDS = 0x5 + NL80211_KCK_EXT_LEN = 0x18 + NL80211_KCK_LEN = 0x10 + NL80211_KEK_EXT_LEN = 0x20 + NL80211_KEK_LEN = 0x10 + NL80211_KEY_CIPHER = 0x3 + NL80211_KEY_DATA = 0x1 + NL80211_KEY_DEFAULT_BEACON = 0xa + NL80211_KEY_DEFAULT = 0x5 + NL80211_KEY_DEFAULT_MGMT = 0x6 + NL80211_KEY_DEFAULT_TYPE_MULTICAST = 0x2 + NL80211_KEY_DEFAULT_TYPES = 0x8 + NL80211_KEY_DEFAULT_TYPE_UNICAST = 0x1 + NL80211_KEY_IDX = 0x2 + NL80211_KEY_MAX = 0xa + NL80211_KEY_MODE = 0x9 + NL80211_KEY_NO_TX = 0x1 + NL80211_KEY_RX_TX = 0x0 + NL80211_KEY_SEQ = 0x4 + NL80211_KEY_SET_TX = 0x2 + NL80211_KEY_TYPE = 0x7 + NL80211_KEYTYPE_GROUP = 0x0 + NL80211_KEYTYPE_PAIRWISE = 0x1 + NL80211_KEYTYPE_PEERKEY = 0x2 + NL80211_MAX_NR_AKM_SUITES = 0x2 + NL80211_MAX_NR_CIPHER_SUITES = 0x5 + NL80211_MAX_SUPP_HT_RATES = 0x4d + NL80211_MAX_SUPP_RATES = 0x20 + NL80211_MAX_SUPP_REG_RULES = 0x80 + NL80211_MESHCONF_ATTR_MAX = 0x1f + NL80211_MESHCONF_AUTO_OPEN_PLINKS = 0x7 + NL80211_MESHCONF_AWAKE_WINDOW = 0x1b + NL80211_MESHCONF_CONFIRM_TIMEOUT = 0x2 + NL80211_MESHCONF_CONNECTED_TO_AS = 0x1f + NL80211_MESHCONF_CONNECTED_TO_GATE = 0x1d + NL80211_MESHCONF_ELEMENT_TTL = 0xf + NL80211_MESHCONF_FORWARDING = 0x13 + NL80211_MESHCONF_GATE_ANNOUNCEMENTS = 0x11 + NL80211_MESHCONF_HOLDING_TIMEOUT = 0x3 + NL80211_MESHCONF_HT_OPMODE = 0x16 + NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT = 0xb + NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL = 0x19 + NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES = 0x8 + NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME = 0xd + NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT = 0x17 + NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL = 0x12 + NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL = 0xc + NL80211_MESHCONF_HWMP_RANN_INTERVAL = 0x10 + NL80211_MESHCONF_HWMP_ROOT_INTERVAL = 0x18 + NL80211_MESHCONF_HWMP_ROOTMODE = 0xe + NL80211_MESHCONF_MAX_PEER_LINKS = 0x4 + NL80211_MESHCONF_MAX_RETRIES = 0x5 + NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT = 0xa + NL80211_MESHCONF_NOLEARN = 0x1e + NL80211_MESHCONF_PATH_REFRESH_TIME = 0x9 + NL80211_MESHCONF_PLINK_TIMEOUT = 0x1c + NL80211_MESHCONF_POWER_MODE = 0x1a + NL80211_MESHCONF_RETRY_TIMEOUT = 0x1 + NL80211_MESHCONF_RSSI_THRESHOLD = 0x14 + NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR = 0x15 + NL80211_MESHCONF_TTL = 0x6 + NL80211_MESH_POWER_ACTIVE = 0x1 + NL80211_MESH_POWER_DEEP_SLEEP = 0x3 + NL80211_MESH_POWER_LIGHT_SLEEP = 0x2 + NL80211_MESH_POWER_MAX = 0x3 + NL80211_MESH_POWER_UNKNOWN = 0x0 + NL80211_MESH_SETUP_ATTR_MAX = 0x8 + NL80211_MESH_SETUP_AUTH_PROTOCOL = 0x8 + NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC = 0x2 + NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL = 0x1 + NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC = 0x6 + NL80211_MESH_SETUP_IE = 0x3 + NL80211_MESH_SETUP_USERSPACE_AMPE = 0x5 + NL80211_MESH_SETUP_USERSPACE_AUTH = 0x4 + NL80211_MESH_SETUP_USERSPACE_MPM = 0x7 + NL80211_MESH_SETUP_VENDOR_PATH_SEL_IE = 0x3 + NL80211_MFP_NO = 0x0 + NL80211_MFP_OPTIONAL = 0x2 + NL80211_MFP_REQUIRED = 0x1 + NL80211_MIN_REMAIN_ON_CHANNEL_TIME = 0xa + NL80211_MNTR_FLAG_ACTIVE = 0x6 + NL80211_MNTR_FLAG_CONTROL = 0x3 + NL80211_MNTR_FLAG_COOK_FRAMES = 0x5 + NL80211_MNTR_FLAG_FCSFAIL = 0x1 + NL80211_MNTR_FLAG_MAX = 0x6 + NL80211_MNTR_FLAG_OTHER_BSS = 0x4 + NL80211_MNTR_FLAG_PLCPFAIL = 0x2 + NL80211_MPATH_FLAG_ACTIVE = 0x1 + NL80211_MPATH_FLAG_FIXED = 0x8 + NL80211_MPATH_FLAG_RESOLVED = 0x10 + NL80211_MPATH_FLAG_RESOLVING = 0x2 + NL80211_MPATH_FLAG_SN_VALID = 0x4 + NL80211_MPATH_INFO_DISCOVERY_RETRIES = 0x7 + NL80211_MPATH_INFO_DISCOVERY_TIMEOUT = 0x6 + NL80211_MPATH_INFO_EXPTIME = 0x4 + NL80211_MPATH_INFO_FLAGS = 0x5 + NL80211_MPATH_INFO_FRAME_QLEN = 0x1 + NL80211_MPATH_INFO_HOP_COUNT = 0x8 + NL80211_MPATH_INFO_MAX = 0x9 + NL80211_MPATH_INFO_METRIC = 0x3 + NL80211_MPATH_INFO_PATH_CHANGE = 0x9 + NL80211_MPATH_INFO_SN = 0x2 + NL80211_MULTICAST_GROUP_CONFIG = "config" + NL80211_MULTICAST_GROUP_MLME = "mlme" + NL80211_MULTICAST_GROUP_NAN = "nan" + NL80211_MULTICAST_GROUP_REG = "regulatory" + NL80211_MULTICAST_GROUP_SCAN = "scan" + NL80211_MULTICAST_GROUP_TESTMODE = "testmode" + NL80211_MULTICAST_GROUP_VENDOR = "vendor" + NL80211_NAN_FUNC_ATTR_MAX = 0x10 + NL80211_NAN_FUNC_CLOSE_RANGE = 0x9 + NL80211_NAN_FUNC_FOLLOW_UP = 0x2 + NL80211_NAN_FUNC_FOLLOW_UP_DEST = 0x8 + NL80211_NAN_FUNC_FOLLOW_UP_ID = 0x6 + NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID = 0x7 + NL80211_NAN_FUNC_INSTANCE_ID = 0xf + NL80211_NAN_FUNC_MAX_TYPE = 0x2 + NL80211_NAN_FUNC_PUBLISH_BCAST = 0x4 + NL80211_NAN_FUNC_PUBLISH = 0x0 + NL80211_NAN_FUNC_PUBLISH_TYPE = 0x3 + NL80211_NAN_FUNC_RX_MATCH_FILTER = 0xd + NL80211_NAN_FUNC_SERVICE_ID = 0x2 + NL80211_NAN_FUNC_SERVICE_ID_LEN = 0x6 + NL80211_NAN_FUNC_SERVICE_INFO = 0xb + NL80211_NAN_FUNC_SERVICE_SPEC_INFO_MAX_LEN = 0xff + NL80211_NAN_FUNC_SRF = 0xc + NL80211_NAN_FUNC_SRF_MAX_LEN = 0xff + NL80211_NAN_FUNC_SUBSCRIBE_ACTIVE = 0x5 + NL80211_NAN_FUNC_SUBSCRIBE = 0x1 + NL80211_NAN_FUNC_TERM_REASON = 0x10 + NL80211_NAN_FUNC_TERM_REASON_ERROR = 0x2 + NL80211_NAN_FUNC_TERM_REASON_TTL_EXPIRED = 0x1 + NL80211_NAN_FUNC_TERM_REASON_USER_REQUEST = 0x0 + NL80211_NAN_FUNC_TTL = 0xa + NL80211_NAN_FUNC_TX_MATCH_FILTER = 0xe + NL80211_NAN_FUNC_TYPE = 0x1 + NL80211_NAN_MATCH_ATTR_MAX = 0x2 + NL80211_NAN_MATCH_FUNC_LOCAL = 0x1 + NL80211_NAN_MATCH_FUNC_PEER = 0x2 + NL80211_NAN_SOLICITED_PUBLISH = 0x1 + NL80211_NAN_SRF_ATTR_MAX = 0x4 + NL80211_NAN_SRF_BF = 0x2 + NL80211_NAN_SRF_BF_IDX = 0x3 + NL80211_NAN_SRF_INCLUDE = 0x1 + NL80211_NAN_SRF_MAC_ADDRS = 0x4 + NL80211_NAN_UNSOLICITED_PUBLISH = 0x2 + NL80211_NUM_ACS = 0x4 + NL80211_P2P_PS_SUPPORTED = 0x1 + NL80211_P2P_PS_UNSUPPORTED = 0x0 + NL80211_PKTPAT_MASK = 0x1 + NL80211_PKTPAT_OFFSET = 0x3 + NL80211_PKTPAT_PATTERN = 0x2 + NL80211_PLINK_ACTION_BLOCK = 0x2 + NL80211_PLINK_ACTION_NO_ACTION = 0x0 + NL80211_PLINK_ACTION_OPEN = 0x1 + NL80211_PLINK_BLOCKED = 0x6 + NL80211_PLINK_CNF_RCVD = 0x3 + NL80211_PLINK_ESTAB = 0x4 + NL80211_PLINK_HOLDING = 0x5 + NL80211_PLINK_LISTEN = 0x0 + NL80211_PLINK_OPN_RCVD = 0x2 + NL80211_PLINK_OPN_SNT = 0x1 + NL80211_PMKSA_CANDIDATE_BSSID = 0x2 + NL80211_PMKSA_CANDIDATE_INDEX = 0x1 + NL80211_PMKSA_CANDIDATE_PREAUTH = 0x3 + NL80211_PMSR_ATTR_MAX = 0x5 + NL80211_PMSR_ATTR_MAX_PEERS = 0x1 + NL80211_PMSR_ATTR_PEERS = 0x5 + NL80211_PMSR_ATTR_RANDOMIZE_MAC_ADDR = 0x3 + NL80211_PMSR_ATTR_REPORT_AP_TSF = 0x2 + NL80211_PMSR_ATTR_TYPE_CAPA = 0x4 + NL80211_PMSR_FTM_CAPA_ATTR_ASAP = 0x1 + NL80211_PMSR_FTM_CAPA_ATTR_BANDWIDTHS = 0x6 + NL80211_PMSR_FTM_CAPA_ATTR_MAX_BURSTS_EXPONENT = 0x7 + NL80211_PMSR_FTM_CAPA_ATTR_MAX = 0xa + NL80211_PMSR_FTM_CAPA_ATTR_MAX_FTMS_PER_BURST = 0x8 + NL80211_PMSR_FTM_CAPA_ATTR_NON_ASAP = 0x2 + NL80211_PMSR_FTM_CAPA_ATTR_NON_TRIGGER_BASED = 0xa + NL80211_PMSR_FTM_CAPA_ATTR_PREAMBLES = 0x5 + NL80211_PMSR_FTM_CAPA_ATTR_REQ_CIVICLOC = 0x4 + NL80211_PMSR_FTM_CAPA_ATTR_REQ_LCI = 0x3 + NL80211_PMSR_FTM_CAPA_ATTR_TRIGGER_BASED = 0x9 + NL80211_PMSR_FTM_FAILURE_BAD_CHANGED_PARAMS = 0x7 + NL80211_PMSR_FTM_FAILURE_INVALID_TIMESTAMP = 0x5 + NL80211_PMSR_FTM_FAILURE_NO_RESPONSE = 0x1 + NL80211_PMSR_FTM_FAILURE_PEER_BUSY = 0x6 + NL80211_PMSR_FTM_FAILURE_PEER_NOT_CAPABLE = 0x4 + NL80211_PMSR_FTM_FAILURE_REJECTED = 0x2 + NL80211_PMSR_FTM_FAILURE_UNSPECIFIED = 0x0 + NL80211_PMSR_FTM_FAILURE_WRONG_CHANNEL = 0x3 + NL80211_PMSR_FTM_REQ_ATTR_ASAP = 0x1 + NL80211_PMSR_FTM_REQ_ATTR_BURST_DURATION = 0x5 + NL80211_PMSR_FTM_REQ_ATTR_BURST_PERIOD = 0x4 + NL80211_PMSR_FTM_REQ_ATTR_FTMS_PER_BURST = 0x6 + NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK = 0xc + NL80211_PMSR_FTM_REQ_ATTR_MAX = 0xd + NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED = 0xb + NL80211_PMSR_FTM_REQ_ATTR_NUM_BURSTS_EXP = 0x3 + NL80211_PMSR_FTM_REQ_ATTR_NUM_FTMR_RETRIES = 0x7 + NL80211_PMSR_FTM_REQ_ATTR_PREAMBLE = 0x2 + NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC = 0x9 + NL80211_PMSR_FTM_REQ_ATTR_REQUEST_LCI = 0x8 + NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED = 0xa + NL80211_PMSR_FTM_RESP_ATTR_BURST_DURATION = 0x7 + NL80211_PMSR_FTM_RESP_ATTR_BURST_INDEX = 0x2 + NL80211_PMSR_FTM_RESP_ATTR_BUSY_RETRY_TIME = 0x5 + NL80211_PMSR_FTM_RESP_ATTR_CIVICLOC = 0x14 + NL80211_PMSR_FTM_RESP_ATTR_DIST_AVG = 0x10 + NL80211_PMSR_FTM_RESP_ATTR_DIST_SPREAD = 0x12 + NL80211_PMSR_FTM_RESP_ATTR_DIST_VARIANCE = 0x11 + NL80211_PMSR_FTM_RESP_ATTR_FAIL_REASON = 0x1 + NL80211_PMSR_FTM_RESP_ATTR_FTMS_PER_BURST = 0x8 + NL80211_PMSR_FTM_RESP_ATTR_LCI = 0x13 + NL80211_PMSR_FTM_RESP_ATTR_MAX = 0x15 + NL80211_PMSR_FTM_RESP_ATTR_NUM_BURSTS_EXP = 0x6 + NL80211_PMSR_FTM_RESP_ATTR_NUM_FTMR_ATTEMPTS = 0x3 + NL80211_PMSR_FTM_RESP_ATTR_NUM_FTMR_SUCCESSES = 0x4 + NL80211_PMSR_FTM_RESP_ATTR_PAD = 0x15 + NL80211_PMSR_FTM_RESP_ATTR_RSSI_AVG = 0x9 + NL80211_PMSR_FTM_RESP_ATTR_RSSI_SPREAD = 0xa + NL80211_PMSR_FTM_RESP_ATTR_RTT_AVG = 0xd + NL80211_PMSR_FTM_RESP_ATTR_RTT_SPREAD = 0xf + NL80211_PMSR_FTM_RESP_ATTR_RTT_VARIANCE = 0xe + NL80211_PMSR_FTM_RESP_ATTR_RX_RATE = 0xc + NL80211_PMSR_FTM_RESP_ATTR_TX_RATE = 0xb + NL80211_PMSR_PEER_ATTR_ADDR = 0x1 + NL80211_PMSR_PEER_ATTR_CHAN = 0x2 + NL80211_PMSR_PEER_ATTR_MAX = 0x4 + NL80211_PMSR_PEER_ATTR_REQ = 0x3 + NL80211_PMSR_PEER_ATTR_RESP = 0x4 + NL80211_PMSR_REQ_ATTR_DATA = 0x1 + NL80211_PMSR_REQ_ATTR_GET_AP_TSF = 0x2 + NL80211_PMSR_REQ_ATTR_MAX = 0x2 + NL80211_PMSR_RESP_ATTR_AP_TSF = 0x4 + NL80211_PMSR_RESP_ATTR_DATA = 0x1 + NL80211_PMSR_RESP_ATTR_FINAL = 0x5 + NL80211_PMSR_RESP_ATTR_HOST_TIME = 0x3 + NL80211_PMSR_RESP_ATTR_MAX = 0x6 + NL80211_PMSR_RESP_ATTR_PAD = 0x6 + NL80211_PMSR_RESP_ATTR_STATUS = 0x2 + NL80211_PMSR_STATUS_FAILURE = 0x3 + NL80211_PMSR_STATUS_REFUSED = 0x1 + NL80211_PMSR_STATUS_SUCCESS = 0x0 + NL80211_PMSR_STATUS_TIMEOUT = 0x2 + NL80211_PMSR_TYPE_FTM = 0x1 + NL80211_PMSR_TYPE_INVALID = 0x0 + NL80211_PMSR_TYPE_MAX = 0x1 + NL80211_PREAMBLE_DMG = 0x3 + NL80211_PREAMBLE_HE = 0x4 + NL80211_PREAMBLE_HT = 0x1 + NL80211_PREAMBLE_LEGACY = 0x0 + NL80211_PREAMBLE_VHT = 0x2 + NL80211_PROBE_RESP_OFFLOAD_SUPPORT_80211U = 0x8 + NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P = 0x4 + NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2 = 0x2 + NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS = 0x1 + NL80211_PROTOCOL_FEATURE_SPLIT_WIPHY_DUMP = 0x1 + NL80211_PS_DISABLED = 0x0 + NL80211_PS_ENABLED = 0x1 + NL80211_RADAR_CAC_ABORTED = 0x2 + NL80211_RADAR_CAC_FINISHED = 0x1 + NL80211_RADAR_CAC_STARTED = 0x5 + NL80211_RADAR_DETECTED = 0x0 + NL80211_RADAR_NOP_FINISHED = 0x3 + NL80211_RADAR_PRE_CAC_EXPIRED = 0x4 + NL80211_RATE_INFO_10_MHZ_WIDTH = 0xb + NL80211_RATE_INFO_160_MHZ_WIDTH = 0xa + NL80211_RATE_INFO_40_MHZ_WIDTH = 0x3 + NL80211_RATE_INFO_5_MHZ_WIDTH = 0xc + NL80211_RATE_INFO_80_MHZ_WIDTH = 0x8 + NL80211_RATE_INFO_80P80_MHZ_WIDTH = 0x9 + NL80211_RATE_INFO_BITRATE32 = 0x5 + NL80211_RATE_INFO_BITRATE = 0x1 + NL80211_RATE_INFO_HE_1XLTF = 0x0 + NL80211_RATE_INFO_HE_2XLTF = 0x1 + NL80211_RATE_INFO_HE_4XLTF = 0x2 + NL80211_RATE_INFO_HE_DCM = 0x10 + NL80211_RATE_INFO_HE_GI_0_8 = 0x0 + NL80211_RATE_INFO_HE_GI_1_6 = 0x1 + NL80211_RATE_INFO_HE_GI_3_2 = 0x2 + NL80211_RATE_INFO_HE_GI = 0xf + NL80211_RATE_INFO_HE_MCS = 0xd + NL80211_RATE_INFO_HE_NSS = 0xe + NL80211_RATE_INFO_HE_RU_ALLOC_106 = 0x2 + NL80211_RATE_INFO_HE_RU_ALLOC_242 = 0x3 + NL80211_RATE_INFO_HE_RU_ALLOC_26 = 0x0 + NL80211_RATE_INFO_HE_RU_ALLOC_2x996 = 0x6 + NL80211_RATE_INFO_HE_RU_ALLOC_484 = 0x4 + NL80211_RATE_INFO_HE_RU_ALLOC_52 = 0x1 + NL80211_RATE_INFO_HE_RU_ALLOC_996 = 0x5 + NL80211_RATE_INFO_HE_RU_ALLOC = 0x11 + NL80211_RATE_INFO_MAX = 0x16 + NL80211_RATE_INFO_MCS = 0x2 + NL80211_RATE_INFO_SHORT_GI = 0x4 + NL80211_RATE_INFO_VHT_MCS = 0x6 + NL80211_RATE_INFO_VHT_NSS = 0x7 + NL80211_REGDOM_SET_BY_CORE = 0x0 + NL80211_REGDOM_SET_BY_COUNTRY_IE = 0x3 + NL80211_REGDOM_SET_BY_DRIVER = 0x2 + NL80211_REGDOM_SET_BY_USER = 0x1 + NL80211_REGDOM_TYPE_COUNTRY = 0x0 + NL80211_REGDOM_TYPE_CUSTOM_WORLD = 0x2 + NL80211_REGDOM_TYPE_INTERSECTION = 0x3 + NL80211_REGDOM_TYPE_WORLD = 0x1 + NL80211_REG_RULE_ATTR_MAX = 0x7 + NL80211_REKEY_DATA_AKM = 0x4 + NL80211_REKEY_DATA_KCK = 0x2 + NL80211_REKEY_DATA_KEK = 0x1 + NL80211_REKEY_DATA_REPLAY_CTR = 0x3 + NL80211_REPLAY_CTR_LEN = 0x8 + NL80211_RRF_AUTO_BW = 0x800 + NL80211_RRF_DFS = 0x10 + NL80211_RRF_GO_CONCURRENT = 0x1000 + NL80211_RRF_IR_CONCURRENT = 0x1000 + NL80211_RRF_NO_160MHZ = 0x10000 + NL80211_RRF_NO_80MHZ = 0x8000 + NL80211_RRF_NO_CCK = 0x2 + NL80211_RRF_NO_HE = 0x20000 + NL80211_RRF_NO_HT40 = 0x6000 + NL80211_RRF_NO_HT40MINUS = 0x2000 + NL80211_RRF_NO_HT40PLUS = 0x4000 + NL80211_RRF_NO_IBSS = 0x80 + NL80211_RRF_NO_INDOOR = 0x4 + NL80211_RRF_NO_IR_ALL = 0x180 + NL80211_RRF_NO_IR = 0x80 + NL80211_RRF_NO_OFDM = 0x1 + NL80211_RRF_NO_OUTDOOR = 0x8 + NL80211_RRF_PASSIVE_SCAN = 0x80 + NL80211_RRF_PTMP_ONLY = 0x40 + NL80211_RRF_PTP_ONLY = 0x20 + NL80211_RXMGMT_FLAG_ANSWERED = 0x1 + NL80211_RXMGMT_FLAG_EXTERNAL_AUTH = 0x2 + NL80211_SAE_PWE_BOTH = 0x3 + NL80211_SAE_PWE_HASH_TO_ELEMENT = 0x2 + NL80211_SAE_PWE_HUNT_AND_PECK = 0x1 + NL80211_SAE_PWE_UNSPECIFIED = 0x0 + NL80211_SAR_ATTR_MAX = 0x2 + NL80211_SAR_ATTR_SPECS = 0x2 + NL80211_SAR_ATTR_SPECS_END_FREQ = 0x4 + NL80211_SAR_ATTR_SPECS_MAX = 0x4 + NL80211_SAR_ATTR_SPECS_POWER = 0x1 + NL80211_SAR_ATTR_SPECS_RANGE_INDEX = 0x2 + NL80211_SAR_ATTR_SPECS_START_FREQ = 0x3 + NL80211_SAR_ATTR_TYPE = 0x1 + NL80211_SAR_TYPE_POWER = 0x0 + NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP = 0x20 + NL80211_SCAN_FLAG_AP = 0x4 + NL80211_SCAN_FLAG_COLOCATED_6GHZ = 0x4000 + NL80211_SCAN_FLAG_FILS_MAX_CHANNEL_TIME = 0x10 + NL80211_SCAN_FLAG_FLUSH = 0x2 + NL80211_SCAN_FLAG_FREQ_KHZ = 0x2000 + NL80211_SCAN_FLAG_HIGH_ACCURACY = 0x400 + NL80211_SCAN_FLAG_LOW_POWER = 0x200 + NL80211_SCAN_FLAG_LOW_PRIORITY = 0x1 + NL80211_SCAN_FLAG_LOW_SPAN = 0x100 + NL80211_SCAN_FLAG_MIN_PREQ_CONTENT = 0x1000 + NL80211_SCAN_FLAG_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION = 0x80 + NL80211_SCAN_FLAG_OCE_PROBE_REQ_HIGH_TX_RATE = 0x40 + NL80211_SCAN_FLAG_RANDOM_ADDR = 0x8 + NL80211_SCAN_FLAG_RANDOM_SN = 0x800 + NL80211_SCAN_RSSI_THOLD_OFF = -0x12c + NL80211_SCHED_SCAN_MATCH_ATTR_BSSID = 0x5 + NL80211_SCHED_SCAN_MATCH_ATTR_MAX = 0x6 + NL80211_SCHED_SCAN_MATCH_ATTR_RELATIVE_RSSI = 0x3 + NL80211_SCHED_SCAN_MATCH_ATTR_RSSI_ADJUST = 0x4 + NL80211_SCHED_SCAN_MATCH_ATTR_RSSI = 0x2 + NL80211_SCHED_SCAN_MATCH_ATTR_SSID = 0x1 + NL80211_SCHED_SCAN_MATCH_PER_BAND_RSSI = 0x6 + NL80211_SCHED_SCAN_PLAN_INTERVAL = 0x1 + NL80211_SCHED_SCAN_PLAN_ITERATIONS = 0x2 + NL80211_SCHED_SCAN_PLAN_MAX = 0x2 + NL80211_SMPS_DYNAMIC = 0x2 + NL80211_SMPS_MAX = 0x2 + NL80211_SMPS_OFF = 0x0 + NL80211_SMPS_STATIC = 0x1 + NL80211_STA_BSS_PARAM_BEACON_INTERVAL = 0x5 + NL80211_STA_BSS_PARAM_CTS_PROT = 0x1 + NL80211_STA_BSS_PARAM_DTIM_PERIOD = 0x4 + NL80211_STA_BSS_PARAM_MAX = 0x5 + NL80211_STA_BSS_PARAM_SHORT_PREAMBLE = 0x2 + NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME = 0x3 + NL80211_STA_FLAG_ASSOCIATED = 0x7 + NL80211_STA_FLAG_AUTHENTICATED = 0x5 + NL80211_STA_FLAG_AUTHORIZED = 0x1 + NL80211_STA_FLAG_MAX = 0x7 + NL80211_STA_FLAG_MAX_OLD_API = 0x6 + NL80211_STA_FLAG_MFP = 0x4 + NL80211_STA_FLAG_SHORT_PREAMBLE = 0x2 + NL80211_STA_FLAG_TDLS_PEER = 0x6 + NL80211_STA_FLAG_WME = 0x3 + NL80211_STA_INFO_ACK_SIGNAL_AVG = 0x23 + NL80211_STA_INFO_ACK_SIGNAL = 0x22 + NL80211_STA_INFO_AIRTIME_LINK_METRIC = 0x29 + NL80211_STA_INFO_AIRTIME_WEIGHT = 0x28 + NL80211_STA_INFO_ASSOC_AT_BOOTTIME = 0x2a + NL80211_STA_INFO_BEACON_LOSS = 0x12 + NL80211_STA_INFO_BEACON_RX = 0x1d + NL80211_STA_INFO_BEACON_SIGNAL_AVG = 0x1e + NL80211_STA_INFO_BSS_PARAM = 0xf + NL80211_STA_INFO_CHAIN_SIGNAL_AVG = 0x1a + NL80211_STA_INFO_CHAIN_SIGNAL = 0x19 + NL80211_STA_INFO_CONNECTED_TIME = 0x10 + NL80211_STA_INFO_CONNECTED_TO_AS = 0x2b + NL80211_STA_INFO_CONNECTED_TO_GATE = 0x26 + NL80211_STA_INFO_DATA_ACK_SIGNAL_AVG = 0x23 + NL80211_STA_INFO_EXPECTED_THROUGHPUT = 0x1b + NL80211_STA_INFO_FCS_ERROR_COUNT = 0x25 + NL80211_STA_INFO_INACTIVE_TIME = 0x1 + NL80211_STA_INFO_LLID = 0x4 + NL80211_STA_INFO_LOCAL_PM = 0x14 + NL80211_STA_INFO_MAX = 0x2b + NL80211_STA_INFO_NONPEER_PM = 0x16 + NL80211_STA_INFO_PAD = 0x21 + NL80211_STA_INFO_PEER_PM = 0x15 + NL80211_STA_INFO_PLID = 0x5 + NL80211_STA_INFO_PLINK_STATE = 0x6 + NL80211_STA_INFO_RX_BITRATE = 0xe + NL80211_STA_INFO_RX_BYTES64 = 0x17 + NL80211_STA_INFO_RX_BYTES = 0x2 + NL80211_STA_INFO_RX_DROP_MISC = 0x1c + NL80211_STA_INFO_RX_DURATION = 0x20 + NL80211_STA_INFO_RX_MPDUS = 0x24 + NL80211_STA_INFO_RX_PACKETS = 0x9 + NL80211_STA_INFO_SIGNAL_AVG = 0xd + NL80211_STA_INFO_SIGNAL = 0x7 + NL80211_STA_INFO_STA_FLAGS = 0x11 + NL80211_STA_INFO_TID_STATS = 0x1f + NL80211_STA_INFO_T_OFFSET = 0x13 + NL80211_STA_INFO_TX_BITRATE = 0x8 + NL80211_STA_INFO_TX_BYTES64 = 0x18 + NL80211_STA_INFO_TX_BYTES = 0x3 + NL80211_STA_INFO_TX_DURATION = 0x27 + NL80211_STA_INFO_TX_FAILED = 0xc + NL80211_STA_INFO_TX_PACKETS = 0xa + NL80211_STA_INFO_TX_RETRIES = 0xb + NL80211_STA_WME_MAX = 0x2 + NL80211_STA_WME_MAX_SP = 0x2 + NL80211_STA_WME_UAPSD_QUEUES = 0x1 + NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY = 0x5 + NL80211_SURVEY_INFO_CHANNEL_TIME = 0x4 + NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY = 0x6 + NL80211_SURVEY_INFO_CHANNEL_TIME_RX = 0x7 + NL80211_SURVEY_INFO_CHANNEL_TIME_TX = 0x8 + NL80211_SURVEY_INFO_FREQUENCY = 0x1 + NL80211_SURVEY_INFO_FREQUENCY_OFFSET = 0xc + NL80211_SURVEY_INFO_IN_USE = 0x3 + NL80211_SURVEY_INFO_MAX = 0xc + NL80211_SURVEY_INFO_NOISE = 0x2 + NL80211_SURVEY_INFO_PAD = 0xa + NL80211_SURVEY_INFO_TIME_BSS_RX = 0xb + NL80211_SURVEY_INFO_TIME_BUSY = 0x5 + NL80211_SURVEY_INFO_TIME = 0x4 + NL80211_SURVEY_INFO_TIME_EXT_BUSY = 0x6 + NL80211_SURVEY_INFO_TIME_RX = 0x7 + NL80211_SURVEY_INFO_TIME_SCAN = 0x9 + NL80211_SURVEY_INFO_TIME_TX = 0x8 + NL80211_TDLS_DISABLE_LINK = 0x4 + NL80211_TDLS_DISCOVERY_REQ = 0x0 + NL80211_TDLS_ENABLE_LINK = 0x3 + NL80211_TDLS_PEER_HE = 0x8 + NL80211_TDLS_PEER_HT = 0x1 + NL80211_TDLS_PEER_VHT = 0x2 + NL80211_TDLS_PEER_WMM = 0x4 + NL80211_TDLS_SETUP = 0x1 + NL80211_TDLS_TEARDOWN = 0x2 + NL80211_TID_CONFIG_ATTR_AMPDU_CTRL = 0x9 + NL80211_TID_CONFIG_ATTR_AMSDU_CTRL = 0xb + NL80211_TID_CONFIG_ATTR_MAX = 0xd + NL80211_TID_CONFIG_ATTR_NOACK = 0x6 + NL80211_TID_CONFIG_ATTR_OVERRIDE = 0x4 + NL80211_TID_CONFIG_ATTR_PAD = 0x1 + NL80211_TID_CONFIG_ATTR_PEER_SUPP = 0x3 + NL80211_TID_CONFIG_ATTR_RETRY_LONG = 0x8 + NL80211_TID_CONFIG_ATTR_RETRY_SHORT = 0x7 + NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL = 0xa + NL80211_TID_CONFIG_ATTR_TIDS = 0x5 + NL80211_TID_CONFIG_ATTR_TX_RATE = 0xd + NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE = 0xc + NL80211_TID_CONFIG_ATTR_VIF_SUPP = 0x2 + NL80211_TID_CONFIG_DISABLE = 0x1 + NL80211_TID_CONFIG_ENABLE = 0x0 + NL80211_TID_STATS_MAX = 0x6 + NL80211_TID_STATS_PAD = 0x5 + NL80211_TID_STATS_RX_MSDU = 0x1 + NL80211_TID_STATS_TX_MSDU = 0x2 + NL80211_TID_STATS_TX_MSDU_FAILED = 0x4 + NL80211_TID_STATS_TX_MSDU_RETRIES = 0x3 + NL80211_TID_STATS_TXQ_STATS = 0x6 + NL80211_TIMEOUT_ASSOC = 0x3 + NL80211_TIMEOUT_AUTH = 0x2 + NL80211_TIMEOUT_SCAN = 0x1 + NL80211_TIMEOUT_UNSPECIFIED = 0x0 + NL80211_TKIP_DATA_OFFSET_ENCR_KEY = 0x0 + NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY = 0x18 + NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY = 0x10 + NL80211_TX_POWER_AUTOMATIC = 0x0 + NL80211_TX_POWER_FIXED = 0x2 + NL80211_TX_POWER_LIMITED = 0x1 + NL80211_TXQ_ATTR_AC = 0x1 + NL80211_TXQ_ATTR_AIFS = 0x5 + NL80211_TXQ_ATTR_CWMAX = 0x4 + NL80211_TXQ_ATTR_CWMIN = 0x3 + NL80211_TXQ_ATTR_MAX = 0x5 + NL80211_TXQ_ATTR_QUEUE = 0x1 + NL80211_TXQ_ATTR_TXOP = 0x2 + NL80211_TXQ_Q_BE = 0x2 + NL80211_TXQ_Q_BK = 0x3 + NL80211_TXQ_Q_VI = 0x1 + NL80211_TXQ_Q_VO = 0x0 + NL80211_TXQ_STATS_BACKLOG_BYTES = 0x1 + NL80211_TXQ_STATS_BACKLOG_PACKETS = 0x2 + NL80211_TXQ_STATS_COLLISIONS = 0x8 + NL80211_TXQ_STATS_DROPS = 0x4 + NL80211_TXQ_STATS_ECN_MARKS = 0x5 + NL80211_TXQ_STATS_FLOWS = 0x3 + NL80211_TXQ_STATS_MAX = 0xb + NL80211_TXQ_STATS_MAX_FLOWS = 0xb + NL80211_TXQ_STATS_OVERLIMIT = 0x6 + NL80211_TXQ_STATS_OVERMEMORY = 0x7 + NL80211_TXQ_STATS_TX_BYTES = 0x9 + NL80211_TXQ_STATS_TX_PACKETS = 0xa + NL80211_TX_RATE_AUTOMATIC = 0x0 + NL80211_TXRATE_DEFAULT_GI = 0x0 + NL80211_TX_RATE_FIXED = 0x2 + NL80211_TXRATE_FORCE_LGI = 0x2 + NL80211_TXRATE_FORCE_SGI = 0x1 + NL80211_TXRATE_GI = 0x4 + NL80211_TXRATE_HE = 0x5 + NL80211_TXRATE_HE_GI = 0x6 + NL80211_TXRATE_HE_LTF = 0x7 + NL80211_TXRATE_HT = 0x2 + NL80211_TXRATE_LEGACY = 0x1 + NL80211_TX_RATE_LIMITED = 0x1 + NL80211_TXRATE_MAX = 0x7 + NL80211_TXRATE_MCS = 0x2 + NL80211_TXRATE_VHT = 0x3 + NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT = 0x1 + NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX = 0x2 + NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL = 0x2 + NL80211_USER_REG_HINT_CELL_BASE = 0x1 + NL80211_USER_REG_HINT_INDOOR = 0x2 + NL80211_USER_REG_HINT_USER = 0x0 + NL80211_VENDOR_ID_IS_LINUX = 0x80000000 + NL80211_VHT_CAPABILITY_LEN = 0xc + NL80211_VHT_NSS_MAX = 0x8 + NL80211_WIPHY_NAME_MAXLEN = 0x40 + NL80211_WMMR_AIFSN = 0x3 + NL80211_WMMR_CW_MAX = 0x2 + NL80211_WMMR_CW_MIN = 0x1 + NL80211_WMMR_MAX = 0x4 + NL80211_WMMR_TXOP = 0x4 + NL80211_WOWLAN_PKTPAT_MASK = 0x1 + NL80211_WOWLAN_PKTPAT_OFFSET = 0x3 + NL80211_WOWLAN_PKTPAT_PATTERN = 0x2 + NL80211_WOWLAN_TCP_DATA_INTERVAL = 0x9 + NL80211_WOWLAN_TCP_DATA_PAYLOAD = 0x6 + NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ = 0x7 + NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN = 0x8 + NL80211_WOWLAN_TCP_DST_IPV4 = 0x2 + NL80211_WOWLAN_TCP_DST_MAC = 0x3 + NL80211_WOWLAN_TCP_DST_PORT = 0x5 + NL80211_WOWLAN_TCP_SRC_IPV4 = 0x1 + NL80211_WOWLAN_TCP_SRC_PORT = 0x4 + NL80211_WOWLAN_TCP_WAKE_MASK = 0xb + NL80211_WOWLAN_TCP_WAKE_PAYLOAD = 0xa + NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE = 0x8 + NL80211_WOWLAN_TRIG_ANY = 0x1 + NL80211_WOWLAN_TRIG_DISCONNECT = 0x2 + NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST = 0x7 + NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE = 0x6 + NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED = 0x5 + NL80211_WOWLAN_TRIG_MAGIC_PKT = 0x3 + NL80211_WOWLAN_TRIG_NET_DETECT = 0x12 + NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS = 0x13 + NL80211_WOWLAN_TRIG_PKT_PATTERN = 0x4 + NL80211_WOWLAN_TRIG_RFKILL_RELEASE = 0x9 + NL80211_WOWLAN_TRIG_TCP_CONNECTION = 0xe + NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211 = 0xa + NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211_LEN = 0xb + NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023 = 0xc + NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023_LEN = 0xd + NL80211_WOWLAN_TRIG_WAKEUP_TCP_CONNLOST = 0x10 + NL80211_WOWLAN_TRIG_WAKEUP_TCP_MATCH = 0xf + NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS = 0x11 + NL80211_WPA_VERSION_1 = 0x1 + NL80211_WPA_VERSION_2 = 0x2 + NL80211_WPA_VERSION_3 = 0x4 +) + +const ( + FRA_UNSPEC = 0x0 + FRA_DST = 0x1 + FRA_SRC = 0x2 + FRA_IIFNAME = 0x3 + FRA_GOTO = 0x4 + FRA_UNUSED2 = 0x5 + FRA_PRIORITY = 0x6 + FRA_UNUSED3 = 0x7 + FRA_UNUSED4 = 0x8 + FRA_UNUSED5 = 0x9 + FRA_FWMARK = 0xa + FRA_FLOW = 0xb + FRA_TUN_ID = 0xc + FRA_SUPPRESS_IFGROUP = 0xd + FRA_SUPPRESS_PREFIXLEN = 0xe + FRA_TABLE = 0xf + FRA_FWMASK = 0x10 + FRA_OIFNAME = 0x11 + FRA_PAD = 0x12 + FRA_L3MDEV = 0x13 + FRA_UID_RANGE = 0x14 + FRA_PROTOCOL = 0x15 + FRA_IP_PROTO = 0x16 + FRA_SPORT_RANGE = 0x17 + FRA_DPORT_RANGE = 0x18 + FR_ACT_UNSPEC = 0x0 + FR_ACT_TO_TBL = 0x1 + FR_ACT_GOTO = 0x2 + FR_ACT_NOP = 0x3 + FR_ACT_RES3 = 0x4 + FR_ACT_RES4 = 0x5 + FR_ACT_BLACKHOLE = 0x6 + FR_ACT_UNREACHABLE = 0x7 + FR_ACT_PROHIBIT = 0x8 +) + +const ( + AUDIT_NLGRP_NONE = 0x0 + AUDIT_NLGRP_READLOG = 0x1 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go index bea254945..263604401 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m32 /build/unix/linux/types.go | go run mkpost.go +// cgo -godefs -objdir=/tmp/386/cgo -- -Wall -Werror -static -I/tmp/386/include -m32 linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build 386 && linux @@ -240,6 +240,10 @@ type EpollEvent struct { Pad int32 } +const ( + OPEN_TREE_CLOEXEC = 0x80000 +) + const ( POLLRDHUP = 0x2000 ) @@ -250,6 +254,13 @@ type Sigset_t struct { const _C__NSIG = 0x41 +type Siginfo struct { + Signo int32 + Errno int32 + Code int32 + _ [116]byte +} + type Termios struct { Iflag uint32 Oflag uint32 @@ -311,6 +322,15 @@ type Taskstats struct { Thrashing_count uint64 Thrashing_delay_total uint64 Ac_btime64 uint64 + Compact_count uint64 + Compact_delay_total uint64 + Ac_tgid uint32 + _ [4]byte + Ac_tgetime uint64 + Ac_exe_dev uint64 + Ac_exe_inode uint64 + Wpcopy_count uint64 + Wpcopy_delay_total uint64 } type cpuMask uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go index b8c8f2894..8187489d1 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m64 /build/unix/linux/types.go | go run mkpost.go +// cgo -godefs -objdir=/tmp/amd64/cgo -- -Wall -Werror -static -I/tmp/amd64/include -m64 linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build amd64 && linux @@ -255,6 +255,10 @@ type EpollEvent struct { Pad int32 } +const ( + OPEN_TREE_CLOEXEC = 0x80000 +) + const ( POLLRDHUP = 0x2000 ) @@ -265,6 +269,14 @@ type Sigset_t struct { const _C__NSIG = 0x41 +type Siginfo struct { + Signo int32 + Errno int32 + Code int32 + _ int32 + _ [112]byte +} + type Termios struct { Iflag uint32 Oflag uint32 @@ -324,6 +336,14 @@ type Taskstats struct { Thrashing_count uint64 Thrashing_delay_total uint64 Ac_btime64 uint64 + Compact_count uint64 + Compact_delay_total uint64 + Ac_tgid uint32 + Ac_tgetime uint64 + Ac_exe_dev uint64 + Ac_exe_inode uint64 + Wpcopy_count uint64 + Wpcopy_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go index 4db443016..d1612335f 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/linux/types.go | go run mkpost.go +// cgo -godefs -objdir=/tmp/arm/cgo -- -Wall -Werror -static -I/tmp/arm/include linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm && linux @@ -231,6 +231,10 @@ type EpollEvent struct { Pad int32 } +const ( + OPEN_TREE_CLOEXEC = 0x80000 +) + const ( POLLRDHUP = 0x2000 ) @@ -241,6 +245,13 @@ type Sigset_t struct { const _C__NSIG = 0x41 +type Siginfo struct { + Signo int32 + Errno int32 + Code int32 + _ [116]byte +} + type Termios struct { Iflag uint32 Oflag uint32 @@ -302,6 +313,15 @@ type Taskstats struct { Thrashing_count uint64 Thrashing_delay_total uint64 Ac_btime64 uint64 + Compact_count uint64 + Compact_delay_total uint64 + Ac_tgid uint32 + _ [4]byte + Ac_tgetime uint64 + Ac_exe_dev uint64 + Ac_exe_inode uint64 + Wpcopy_count uint64 + Wpcopy_delay_total uint64 } type cpuMask uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go index 3ebcad8a8..c28e5556b 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char /build/unix/linux/types.go | go run mkpost.go +// cgo -godefs -objdir=/tmp/arm64/cgo -- -Wall -Werror -static -I/tmp/arm64/include -fsigned-char linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm64 && linux @@ -234,6 +234,10 @@ type EpollEvent struct { Pad int32 } +const ( + OPEN_TREE_CLOEXEC = 0x80000 +) + const ( POLLRDHUP = 0x2000 ) @@ -244,6 +248,14 @@ type Sigset_t struct { const _C__NSIG = 0x41 +type Siginfo struct { + Signo int32 + Errno int32 + Code int32 + _ int32 + _ [112]byte +} + type Termios struct { Iflag uint32 Oflag uint32 @@ -303,6 +315,14 @@ type Taskstats struct { Thrashing_count uint64 Thrashing_delay_total uint64 Ac_btime64 uint64 + Compact_count uint64 + Compact_delay_total uint64 + Ac_tgid uint32 + Ac_tgetime uint64 + Ac_exe_dev uint64 + Ac_exe_inode uint64 + Wpcopy_count uint64 + Wpcopy_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go new file mode 100644 index 000000000..187061f9f --- /dev/null +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go @@ -0,0 +1,685 @@ +// cgo -godefs -objdir=/tmp/loong64/cgo -- -Wall -Werror -static -I/tmp/loong64/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +//go:build loong64 && linux +// +build loong64,linux + +package unix + +const ( + SizeofPtr = 0x8 + SizeofLong = 0x8 +) + +type ( + _C_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timex struct { + Modes uint32 + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + _ [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Stat_t struct { + Dev uint64 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint64 + _ uint64 + Size int64 + Blksize int32 + _ int32 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + _ [2]int32 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + _ [5]byte +} + +type Flock_t struct { + Type int16 + Whence int16 + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type DmNameList struct { + Dev uint64 + Next uint32 + Name [0]byte + _ [4]byte +} + +const ( + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrNFCLLCP struct { + Sa_family uint16 + Dev_idx uint32 + Target_idx uint32 + Nfc_protocol uint32 + Dsap uint8 + Ssap uint8 + Service_name [63]uint8 + Service_name_len uint64 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + _ [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type ifreq struct { + Ifrn [16]byte + Ifru [24]byte +} + +const ( + SizeofSockaddrNFCLLCP = 0x60 + SizeofIovec = 0x10 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 +) + +const ( + SizeofSockFprog = 0x10 +) + +type PtraceRegs struct { + Regs [32]uint64 + Orig_a0 uint64 + Era uint64 + Badv uint64 + Reserved [10]uint64 +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + _ [0]int8 + _ [4]byte +} + +type Ustat_t struct { + Tfree int32 + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + _ [4]byte +} + +type EpollEvent struct { + Events uint32 + _ int32 + Fd int32 + Pad int32 +} + +const ( + OPEN_TREE_CLOEXEC = 0x80000 +) + +const ( + POLLRDHUP = 0x2000 +) + +type Sigset_t struct { + Val [16]uint64 +} + +const _C__NSIG = 0x41 + +type Siginfo struct { + Signo int32 + Errno int32 + Code int32 + _ int32 + _ [112]byte +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [19]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Taskstats struct { + Version uint16 + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 + Thrashing_count uint64 + Thrashing_delay_total uint64 + Ac_btime64 uint64 + Compact_count uint64 + Compact_delay_total uint64 + Ac_tgid uint32 + Ac_tgetime uint64 + Ac_exe_dev uint64 + Ac_exe_inode uint64 + Wpcopy_count uint64 + Wpcopy_delay_total uint64 +} + +type cpuMask uint64 + +const ( + _NCPUBITS = 0x40 +) + +const ( + CBitFieldMaskBit0 = 0x1 + CBitFieldMaskBit1 = 0x2 + CBitFieldMaskBit2 = 0x4 + CBitFieldMaskBit3 = 0x8 + CBitFieldMaskBit4 = 0x10 + CBitFieldMaskBit5 = 0x20 + CBitFieldMaskBit6 = 0x40 + CBitFieldMaskBit7 = 0x80 + CBitFieldMaskBit8 = 0x100 + CBitFieldMaskBit9 = 0x200 + CBitFieldMaskBit10 = 0x400 + CBitFieldMaskBit11 = 0x800 + CBitFieldMaskBit12 = 0x1000 + CBitFieldMaskBit13 = 0x2000 + CBitFieldMaskBit14 = 0x4000 + CBitFieldMaskBit15 = 0x8000 + CBitFieldMaskBit16 = 0x10000 + CBitFieldMaskBit17 = 0x20000 + CBitFieldMaskBit18 = 0x40000 + CBitFieldMaskBit19 = 0x80000 + CBitFieldMaskBit20 = 0x100000 + CBitFieldMaskBit21 = 0x200000 + CBitFieldMaskBit22 = 0x400000 + CBitFieldMaskBit23 = 0x800000 + CBitFieldMaskBit24 = 0x1000000 + CBitFieldMaskBit25 = 0x2000000 + CBitFieldMaskBit26 = 0x4000000 + CBitFieldMaskBit27 = 0x8000000 + CBitFieldMaskBit28 = 0x10000000 + CBitFieldMaskBit29 = 0x20000000 + CBitFieldMaskBit30 = 0x40000000 + CBitFieldMaskBit31 = 0x80000000 + CBitFieldMaskBit32 = 0x100000000 + CBitFieldMaskBit33 = 0x200000000 + CBitFieldMaskBit34 = 0x400000000 + CBitFieldMaskBit35 = 0x800000000 + CBitFieldMaskBit36 = 0x1000000000 + CBitFieldMaskBit37 = 0x2000000000 + CBitFieldMaskBit38 = 0x4000000000 + CBitFieldMaskBit39 = 0x8000000000 + CBitFieldMaskBit40 = 0x10000000000 + CBitFieldMaskBit41 = 0x20000000000 + CBitFieldMaskBit42 = 0x40000000000 + CBitFieldMaskBit43 = 0x80000000000 + CBitFieldMaskBit44 = 0x100000000000 + CBitFieldMaskBit45 = 0x200000000000 + CBitFieldMaskBit46 = 0x400000000000 + CBitFieldMaskBit47 = 0x800000000000 + CBitFieldMaskBit48 = 0x1000000000000 + CBitFieldMaskBit49 = 0x2000000000000 + CBitFieldMaskBit50 = 0x4000000000000 + CBitFieldMaskBit51 = 0x8000000000000 + CBitFieldMaskBit52 = 0x10000000000000 + CBitFieldMaskBit53 = 0x20000000000000 + CBitFieldMaskBit54 = 0x40000000000000 + CBitFieldMaskBit55 = 0x80000000000000 + CBitFieldMaskBit56 = 0x100000000000000 + CBitFieldMaskBit57 = 0x200000000000000 + CBitFieldMaskBit58 = 0x400000000000000 + CBitFieldMaskBit59 = 0x800000000000000 + CBitFieldMaskBit60 = 0x1000000000000000 + CBitFieldMaskBit61 = 0x2000000000000000 + CBitFieldMaskBit62 = 0x4000000000000000 + CBitFieldMaskBit63 = 0x8000000000000000 +) + +type SockaddrStorage struct { + Family uint16 + _ [118]int8 + _ uint64 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + Start uint64 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int64 + Frsize int64 + Flags int64 + Spare [4]int64 +} + +type TpacketHdr struct { + Status uint64 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Usec uint32 + _ [4]byte +} + +const ( + SizeofTpacketHdr = 0x20 +) + +type RTCPLLInfo struct { + Ctrl int32 + Value int32 + Max int32 + Min int32 + Posmult int32 + Negmult int32 + Clock int64 +} + +type BlkpgPartition struct { + Start int64 + Length int64 + Pno int32 + Devname [64]uint8 + Volname [64]uint8 + _ [4]byte +} + +const ( + BLKPG = 0x1269 +) + +type XDPUmemReg struct { + Addr uint64 + Len uint64 + Size uint32 + Headroom uint32 + Flags uint32 + _ [4]byte +} + +type CryptoUserAlg struct { + Name [64]int8 + Driver_name [64]int8 + Module_name [64]int8 + Type uint32 + Mask uint32 + Refcnt uint32 + Flags uint32 +} + +type CryptoStatAEAD struct { + Type [64]int8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatAKCipher struct { + Type [64]int8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Verify_cnt uint64 + Sign_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatCipher struct { + Type [64]int8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatCompress struct { + Type [64]int8 + Compress_cnt uint64 + Compress_tlen uint64 + Decompress_cnt uint64 + Decompress_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatHash struct { + Type [64]int8 + Hash_cnt uint64 + Hash_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatKPP struct { + Type [64]int8 + Setsecret_cnt uint64 + Generate_public_key_cnt uint64 + Compute_shared_secret_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatRNG struct { + Type [64]int8 + Generate_cnt uint64 + Generate_tlen uint64 + Seed_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatLarval struct { + Type [64]int8 +} + +type CryptoReportLarval struct { + Type [64]int8 +} + +type CryptoReportHash struct { + Type [64]int8 + Blocksize uint32 + Digestsize uint32 +} + +type CryptoReportCipher struct { + Type [64]int8 + Blocksize uint32 + Min_keysize uint32 + Max_keysize uint32 +} + +type CryptoReportBlkCipher struct { + Type [64]int8 + Geniv [64]int8 + Blocksize uint32 + Min_keysize uint32 + Max_keysize uint32 + Ivsize uint32 +} + +type CryptoReportAEAD struct { + Type [64]int8 + Geniv [64]int8 + Blocksize uint32 + Maxauthsize uint32 + Ivsize uint32 +} + +type CryptoReportComp struct { + Type [64]int8 +} + +type CryptoReportRNG struct { + Type [64]int8 + Seedsize uint32 +} + +type CryptoReportAKCipher struct { + Type [64]int8 +} + +type CryptoReportKPP struct { + Type [64]int8 +} + +type CryptoReportAcomp struct { + Type [64]int8 +} + +type LoopInfo struct { + Number int32 + Device uint32 + Inode uint64 + Rdevice uint32 + Offset int32 + Encrypt_type int32 + Encrypt_key_size int32 + Flags int32 + Name [64]int8 + Encrypt_key [32]uint8 + Init [2]uint64 + Reserved [4]int8 + _ [4]byte +} + +type TIPCSubscr struct { + Seq TIPCServiceRange + Timeout uint32 + Filter uint32 + Handle [8]int8 +} + +type TIPCSIOCLNReq struct { + Peer uint32 + Id uint32 + Linkname [68]int8 +} + +type TIPCSIOCNodeIDReq struct { + Peer uint32 + Id [16]int8 +} + +type PPSKInfo struct { + Assert_sequence uint32 + Clear_sequence uint32 + Assert_tu PPSKTime + Clear_tu PPSKTime + Current_mode int32 + _ [4]byte +} + +const ( + PPS_GETPARAMS = 0x800870a1 + PPS_SETPARAMS = 0x400870a2 + PPS_GETCAP = 0x800870a3 + PPS_FETCH = 0xc00870a4 +) + +const ( + PIDFD_NONBLOCK = 0x800 +) + +type SysvIpcPerm struct { + Key int32 + Uid uint32 + Gid uint32 + Cuid uint32 + Cgid uint32 + Mode uint32 + _ [0]uint8 + Seq uint16 + _ uint16 + _ uint64 + _ uint64 +} +type SysvShmDesc struct { + Perm SysvIpcPerm + Segsz uint64 + Atime int64 + Dtime int64 + Ctime int64 + Cpid int32 + Lpid int32 + Nattch uint64 + _ uint64 + _ uint64 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go index 3eb33e48a..369129917 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/linux/types.go | go run mkpost.go +// cgo -godefs -objdir=/tmp/mips/cgo -- -Wall -Werror -static -I/tmp/mips/include linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips && linux @@ -236,6 +236,10 @@ type EpollEvent struct { Pad int32 } +const ( + OPEN_TREE_CLOEXEC = 0x80000 +) + const ( POLLRDHUP = 0x2000 ) @@ -246,6 +250,13 @@ type Sigset_t struct { const _C__NSIG = 0x80 +type Siginfo struct { + Signo int32 + Code int32 + Errno int32 + _ [116]byte +} + type Termios struct { Iflag uint32 Oflag uint32 @@ -307,6 +318,15 @@ type Taskstats struct { Thrashing_count uint64 Thrashing_delay_total uint64 Ac_btime64 uint64 + Compact_count uint64 + Compact_delay_total uint64 + Ac_tgid uint32 + _ [4]byte + Ac_tgetime uint64 + Ac_exe_dev uint64 + Ac_exe_inode uint64 + Wpcopy_count uint64 + Wpcopy_delay_total uint64 } type cpuMask uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go index 79a944672..7473468d7 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/linux/types.go | go run mkpost.go +// cgo -godefs -objdir=/tmp/mips64/cgo -- -Wall -Werror -static -I/tmp/mips64/include linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips64 && linux @@ -237,6 +237,10 @@ type EpollEvent struct { Pad int32 } +const ( + OPEN_TREE_CLOEXEC = 0x80000 +) + const ( POLLRDHUP = 0x2000 ) @@ -247,6 +251,14 @@ type Sigset_t struct { const _C__NSIG = 0x80 +type Siginfo struct { + Signo int32 + Code int32 + Errno int32 + _ int32 + _ [112]byte +} + type Termios struct { Iflag uint32 Oflag uint32 @@ -306,6 +318,14 @@ type Taskstats struct { Thrashing_count uint64 Thrashing_delay_total uint64 Ac_btime64 uint64 + Compact_count uint64 + Compact_delay_total uint64 + Ac_tgid uint32 + Ac_tgetime uint64 + Ac_exe_dev uint64 + Ac_exe_inode uint64 + Wpcopy_count uint64 + Wpcopy_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go index 8f4b107ca..ed9448524 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/linux/types.go | go run mkpost.go +// cgo -godefs -objdir=/tmp/mips64le/cgo -- -Wall -Werror -static -I/tmp/mips64le/include linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips64le && linux @@ -237,6 +237,10 @@ type EpollEvent struct { Pad int32 } +const ( + OPEN_TREE_CLOEXEC = 0x80000 +) + const ( POLLRDHUP = 0x2000 ) @@ -247,6 +251,14 @@ type Sigset_t struct { const _C__NSIG = 0x80 +type Siginfo struct { + Signo int32 + Code int32 + Errno int32 + _ int32 + _ [112]byte +} + type Termios struct { Iflag uint32 Oflag uint32 @@ -306,6 +318,14 @@ type Taskstats struct { Thrashing_count uint64 Thrashing_delay_total uint64 Ac_btime64 uint64 + Compact_count uint64 + Compact_delay_total uint64 + Ac_tgid uint32 + Ac_tgetime uint64 + Ac_exe_dev uint64 + Ac_exe_inode uint64 + Wpcopy_count uint64 + Wpcopy_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go index e4eb21798..0892a73a4 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/linux/types.go | go run mkpost.go +// cgo -godefs -objdir=/tmp/mipsle/cgo -- -Wall -Werror -static -I/tmp/mipsle/include linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mipsle && linux @@ -236,6 +236,10 @@ type EpollEvent struct { Pad int32 } +const ( + OPEN_TREE_CLOEXEC = 0x80000 +) + const ( POLLRDHUP = 0x2000 ) @@ -246,6 +250,13 @@ type Sigset_t struct { const _C__NSIG = 0x80 +type Siginfo struct { + Signo int32 + Code int32 + Errno int32 + _ [116]byte +} + type Termios struct { Iflag uint32 Oflag uint32 @@ -307,6 +318,15 @@ type Taskstats struct { Thrashing_count uint64 Thrashing_delay_total uint64 Ac_btime64 uint64 + Compact_count uint64 + Compact_delay_total uint64 + Ac_tgid uint32 + _ [4]byte + Ac_tgetime uint64 + Ac_exe_dev uint64 + Ac_exe_inode uint64 + Wpcopy_count uint64 + Wpcopy_delay_total uint64 } type cpuMask uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go index d5b21f0f7..e1dd48333 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/linux/types.go | go run mkpost.go +// cgo -godefs -objdir=/tmp/ppc/cgo -- -Wall -Werror -static -I/tmp/ppc/include linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc && linux @@ -243,6 +243,10 @@ type EpollEvent struct { Pad int32 } +const ( + OPEN_TREE_CLOEXEC = 0x80000 +) + const ( POLLRDHUP = 0x2000 ) @@ -253,6 +257,13 @@ type Sigset_t struct { const _C__NSIG = 0x41 +type Siginfo struct { + Signo int32 + Errno int32 + Code int32 + _ [116]byte +} + type Termios struct { Iflag uint32 Oflag uint32 @@ -314,6 +325,15 @@ type Taskstats struct { Thrashing_count uint64 Thrashing_delay_total uint64 Ac_btime64 uint64 + Compact_count uint64 + Compact_delay_total uint64 + Ac_tgid uint32 + _ [4]byte + Ac_tgetime uint64 + Ac_exe_dev uint64 + Ac_exe_inode uint64 + Wpcopy_count uint64 + Wpcopy_delay_total uint64 } type cpuMask uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go index 5188d142b..d9f654c7b 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/linux/types.go | go run mkpost.go +// cgo -godefs -objdir=/tmp/ppc64/cgo -- -Wall -Werror -static -I/tmp/ppc64/include linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc64 && linux @@ -244,6 +244,10 @@ type EpollEvent struct { Pad int32 } +const ( + OPEN_TREE_CLOEXEC = 0x80000 +) + const ( POLLRDHUP = 0x2000 ) @@ -254,6 +258,14 @@ type Sigset_t struct { const _C__NSIG = 0x41 +type Siginfo struct { + Signo int32 + Errno int32 + Code int32 + _ int32 + _ [112]byte +} + type Termios struct { Iflag uint32 Oflag uint32 @@ -313,6 +325,14 @@ type Taskstats struct { Thrashing_count uint64 Thrashing_delay_total uint64 Ac_btime64 uint64 + Compact_count uint64 + Compact_delay_total uint64 + Ac_tgid uint32 + Ac_tgetime uint64 + Ac_exe_dev uint64 + Ac_exe_inode uint64 + Wpcopy_count uint64 + Wpcopy_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go index de4dd4c73..74acda9fe 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/linux/types.go | go run mkpost.go +// cgo -godefs -objdir=/tmp/ppc64le/cgo -- -Wall -Werror -static -I/tmp/ppc64le/include linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc64le && linux @@ -244,6 +244,10 @@ type EpollEvent struct { Pad int32 } +const ( + OPEN_TREE_CLOEXEC = 0x80000 +) + const ( POLLRDHUP = 0x2000 ) @@ -254,6 +258,14 @@ type Sigset_t struct { const _C__NSIG = 0x41 +type Siginfo struct { + Signo int32 + Errno int32 + Code int32 + _ int32 + _ [112]byte +} + type Termios struct { Iflag uint32 Oflag uint32 @@ -313,6 +325,14 @@ type Taskstats struct { Thrashing_count uint64 Thrashing_delay_total uint64 Ac_btime64 uint64 + Compact_count uint64 + Compact_delay_total uint64 + Ac_tgid uint32 + Ac_tgetime uint64 + Ac_exe_dev uint64 + Ac_exe_inode uint64 + Wpcopy_count uint64 + Wpcopy_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go index dccbf9b06..50ebe69eb 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/linux/types.go | go run mkpost.go +// cgo -godefs -objdir=/tmp/riscv64/cgo -- -Wall -Werror -static -I/tmp/riscv64/include linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build riscv64 && linux @@ -262,6 +262,10 @@ type EpollEvent struct { Pad int32 } +const ( + OPEN_TREE_CLOEXEC = 0x80000 +) + const ( POLLRDHUP = 0x2000 ) @@ -272,6 +276,14 @@ type Sigset_t struct { const _C__NSIG = 0x41 +type Siginfo struct { + Signo int32 + Errno int32 + Code int32 + _ int32 + _ [112]byte +} + type Termios struct { Iflag uint32 Oflag uint32 @@ -331,6 +343,14 @@ type Taskstats struct { Thrashing_count uint64 Thrashing_delay_total uint64 Ac_btime64 uint64 + Compact_count uint64 + Compact_delay_total uint64 + Ac_tgid uint32 + Ac_tgetime uint64 + Ac_exe_dev uint64 + Ac_exe_inode uint64 + Wpcopy_count uint64 + Wpcopy_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go index 635880610..75b34c259 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char /build/unix/linux/types.go | go run mkpost.go +// cgo -godefs -objdir=/tmp/s390x/cgo -- -Wall -Werror -static -I/tmp/s390x/include -fsigned-char linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build s390x && linux @@ -210,8 +210,8 @@ type PtraceFpregs struct { } type PtracePer struct { - _ [0]uint64 - _ [32]byte + Control_regs [3]uint64 + _ [8]byte Starting_addr uint64 Ending_addr uint64 Perc_atmid uint16 @@ -257,6 +257,10 @@ type EpollEvent struct { Pad int32 } +const ( + OPEN_TREE_CLOEXEC = 0x80000 +) + const ( POLLRDHUP = 0x2000 ) @@ -267,6 +271,14 @@ type Sigset_t struct { const _C__NSIG = 0x41 +type Siginfo struct { + Signo int32 + Errno int32 + Code int32 + _ int32 + _ [112]byte +} + type Termios struct { Iflag uint32 Oflag uint32 @@ -326,6 +338,14 @@ type Taskstats struct { Thrashing_count uint64 Thrashing_delay_total uint64 Ac_btime64 uint64 + Compact_count uint64 + Compact_delay_total uint64 + Ac_tgid uint32 + Ac_tgetime uint64 + Ac_exe_dev uint64 + Ac_exe_inode uint64 + Wpcopy_count uint64 + Wpcopy_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go index 765edc13f..429c3bf7d 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/linux/types.go | go run mkpost.go +// cgo -godefs -objdir=/tmp/sparc64/cgo -- -Wall -Werror -static -I/tmp/sparc64/include linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build sparc64 && linux @@ -239,6 +239,10 @@ type EpollEvent struct { Pad int32 } +const ( + OPEN_TREE_CLOEXEC = 0x400000 +) + const ( POLLRDHUP = 0x800 ) @@ -249,6 +253,14 @@ type Sigset_t struct { const _C__NSIG = 0x41 +type Siginfo struct { + Signo int32 + Errno int32 + Code int32 + _ int32 + _ [112]byte +} + type Termios struct { Iflag uint32 Oflag uint32 @@ -308,6 +320,14 @@ type Taskstats struct { Thrashing_count uint64 Thrashing_delay_total uint64 Ac_btime64 uint64 + Compact_count uint64 + Compact_delay_total uint64 + Ac_tgid uint32 + Ac_tgetime uint64 + Ac_exe_dev uint64 + Ac_exe_inode uint64 + Wpcopy_count uint64 + Wpcopy_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go index baf5fe650..2ed718ca0 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go @@ -94,10 +94,10 @@ type Statfs_t struct { F_namemax uint32 F_owner uint32 F_ctime uint64 - F_fstypename [16]int8 - F_mntonname [90]int8 - F_mntfromname [90]int8 - F_mntfromspec [90]int8 + F_fstypename [16]byte + F_mntonname [90]byte + F_mntfromname [90]byte + F_mntfromspec [90]byte Pad_cgo_0 [2]byte Mount_info [160]byte } diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go index e21ae8ecf..b4fb97ebe 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go @@ -96,10 +96,10 @@ type Statfs_t struct { F_namemax uint32 F_owner uint32 F_ctime uint64 - F_fstypename [16]int8 - F_mntonname [90]int8 - F_mntfromname [90]int8 - F_mntfromspec [90]int8 + F_fstypename [16]byte + F_mntonname [90]byte + F_mntfromname [90]byte + F_mntfromspec [90]byte _ [2]byte Mount_info [160]byte } diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go index f190651cd..2c4675040 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go @@ -98,10 +98,10 @@ type Statfs_t struct { F_namemax uint32 F_owner uint32 F_ctime uint64 - F_fstypename [16]int8 - F_mntonname [90]int8 - F_mntfromname [90]int8 - F_mntfromspec [90]int8 + F_fstypename [16]byte + F_mntonname [90]byte + F_mntfromname [90]byte + F_mntfromspec [90]byte _ [2]byte Mount_info [160]byte } diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go index 84747c582..ddee04514 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go @@ -94,10 +94,10 @@ type Statfs_t struct { F_namemax uint32 F_owner uint32 F_ctime uint64 - F_fstypename [16]int8 - F_mntonname [90]int8 - F_mntfromname [90]int8 - F_mntfromspec [90]int8 + F_fstypename [16]byte + F_mntonname [90]byte + F_mntfromname [90]byte + F_mntfromspec [90]byte _ [2]byte Mount_info [160]byte } diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go index ac5c8b637..eb13d4e8b 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go @@ -94,10 +94,10 @@ type Statfs_t struct { F_namemax uint32 F_owner uint32 F_ctime uint64 - F_fstypename [16]int8 - F_mntonname [90]int8 - F_mntfromname [90]int8 - F_mntfromspec [90]int8 + F_fstypename [16]byte + F_mntonname [90]byte + F_mntfromname [90]byte + F_mntfromspec [90]byte _ [2]byte Mount_info [160]byte } diff --git a/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go index ad4aad279..c1a9b83ad 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go @@ -178,7 +178,7 @@ type Linger struct { } type Iovec struct { - Base *int8 + Base *byte Len uint64 } diff --git a/vendor/golang.org/x/sys/windows/exec_windows.go b/vendor/golang.org/x/sys/windows/exec_windows.go index 855698bb2..75980fd44 100644 --- a/vendor/golang.org/x/sys/windows/exec_windows.go +++ b/vendor/golang.org/x/sys/windows/exec_windows.go @@ -15,11 +15,11 @@ import ( // in http://msdn.microsoft.com/en-us/library/ms880421. // This function returns "" (2 double quotes) if s is empty. // Alternatively, these transformations are done: -// - every back slash (\) is doubled, but only if immediately -// followed by double quote ("); -// - every double quote (") is escaped by back slash (\); -// - finally, s is wrapped with double quotes (arg -> "arg"), -// but only if there is space or tab inside s. +// - every back slash (\) is doubled, but only if immediately +// followed by double quote ("); +// - every double quote (") is escaped by back slash (\); +// - finally, s is wrapped with double quotes (arg -> "arg"), +// but only if there is space or tab inside s. func EscapeArg(s string) string { if len(s) == 0 { return "\"\"" diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go index 200b62a00..e27913817 100644 --- a/vendor/golang.org/x/sys/windows/syscall_windows.go +++ b/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -10,6 +10,7 @@ import ( errorspkg "errors" "fmt" "runtime" + "strings" "sync" "syscall" "time" @@ -86,10 +87,8 @@ func StringToUTF16(s string) []uint16 { // s, with a terminating NUL added. If s contains a NUL byte at any // location, it returns (nil, syscall.EINVAL). func UTF16FromString(s string) ([]uint16, error) { - for i := 0; i < len(s); i++ { - if s[i] == 0 { - return nil, syscall.EINVAL - } + if strings.IndexByte(s, 0) != -1 { + return nil, syscall.EINVAL } return utf16.Encode([]rune(s + "\x00")), nil } @@ -186,8 +185,8 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys GetNamedPipeInfo(pipe Handle, flags *uint32, outSize *uint32, inSize *uint32, maxInstances *uint32) (err error) //sys GetNamedPipeHandleState(pipe Handle, state *uint32, curInstances *uint32, maxCollectionCount *uint32, collectDataTimeout *uint32, userName *uint16, maxUserNameSize uint32) (err error) = GetNamedPipeHandleStateW //sys SetNamedPipeHandleState(pipe Handle, state *uint32, maxCollectionCount *uint32, collectDataTimeout *uint32) (err error) = SetNamedPipeHandleState -//sys ReadFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) -//sys WriteFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) +//sys readFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) = ReadFile +//sys writeFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) = WriteFile //sys GetOverlappedResult(handle Handle, overlapped *Overlapped, done *uint32, wait bool) (err error) //sys SetFilePointer(handle Handle, lowoffset int32, highoffsetptr *int32, whence uint32) (newlowoffset uint32, err error) [failretval==0xffffffff] //sys CloseHandle(handle Handle) (err error) @@ -363,6 +362,8 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys SetProcessWorkingSetSizeEx(hProcess Handle, dwMinimumWorkingSetSize uintptr, dwMaximumWorkingSetSize uintptr, flags uint32) (err error) //sys GetCommTimeouts(handle Handle, timeouts *CommTimeouts) (err error) //sys SetCommTimeouts(handle Handle, timeouts *CommTimeouts) (err error) +//sys GetActiveProcessorCount(groupNumber uint16) (ret uint32) +//sys GetMaximumProcessorCount(groupNumber uint16) (ret uint32) // Volume Management Functions //sys DefineDosDevice(flags uint32, deviceName *uint16, targetPath *uint16) (err error) = DefineDosDeviceW @@ -416,6 +417,7 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys GetModuleInformation(process Handle, module Handle, modinfo *ModuleInfo, cb uint32) (err error) = psapi.GetModuleInformation //sys GetModuleFileNameEx(process Handle, module Handle, filename *uint16, size uint32) (err error) = psapi.GetModuleFileNameExW //sys GetModuleBaseName(process Handle, module Handle, baseName *uint16, size uint32) (err error) = psapi.GetModuleBaseNameW +//sys QueryWorkingSetEx(process Handle, pv uintptr, cb uint32) (err error) = psapi.QueryWorkingSetEx // NT Native APIs //sys rtlNtStatusToDosErrorNoTeb(ntstatus NTStatus) (ret syscall.Errno) = ntdll.RtlNtStatusToDosErrorNoTeb @@ -547,12 +549,6 @@ func Read(fd Handle, p []byte) (n int, err error) { } return 0, e } - if raceenabled { - if done > 0 { - raceWriteRange(unsafe.Pointer(&p[0]), int(done)) - } - raceAcquire(unsafe.Pointer(&ioSync)) - } return int(done), nil } @@ -565,12 +561,31 @@ func Write(fd Handle, p []byte) (n int, err error) { if e != nil { return 0, e } - if raceenabled && done > 0 { - raceReadRange(unsafe.Pointer(&p[0]), int(done)) - } return int(done), nil } +func ReadFile(fd Handle, p []byte, done *uint32, overlapped *Overlapped) error { + err := readFile(fd, p, done, overlapped) + if raceenabled { + if *done > 0 { + raceWriteRange(unsafe.Pointer(&p[0]), int(*done)) + } + raceAcquire(unsafe.Pointer(&ioSync)) + } + return err +} + +func WriteFile(fd Handle, p []byte, done *uint32, overlapped *Overlapped) error { + if raceenabled { + raceReleaseMerge(unsafe.Pointer(&ioSync)) + } + err := writeFile(fd, p, done, overlapped) + if raceenabled && *done > 0 { + raceReadRange(unsafe.Pointer(&p[0]), int(*done)) + } + return err +} + var ioSync int64 func Seek(fd Handle, offset int64, whence int) (newoffset int64, err error) { @@ -609,7 +624,6 @@ var ( func getStdHandle(stdhandle uint32) (fd Handle) { r, _ := GetStdHandle(stdhandle) - CloseOnExec(r) return r } @@ -848,6 +862,7 @@ const socket_error = uintptr(^uint32(0)) //sys GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizePointer *uint32) (errcode error) = iphlpapi.GetAdaptersAddresses //sys GetACP() (acp uint32) = kernel32.GetACP //sys MultiByteToWideChar(codePage uint32, dwFlags uint32, str *byte, nstr int32, wchar *uint16, nwchar int32) (nwrite int32, err error) = kernel32.MultiByteToWideChar +//sys getBestInterfaceEx(sockaddr unsafe.Pointer, pdwBestIfIndex *uint32) (errcode error) = iphlpapi.GetBestInterfaceEx // For testing: clients can set this flag to force // creation of IPv6 sockets to return EAFNOSUPPORT. @@ -957,6 +972,32 @@ func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, int32, error) { return unsafe.Pointer(&sa.raw), sl, nil } +type RawSockaddrBth struct { + AddressFamily [2]byte + BtAddr [8]byte + ServiceClassId [16]byte + Port [4]byte +} + +type SockaddrBth struct { + BtAddr uint64 + ServiceClassId GUID + Port uint32 + + raw RawSockaddrBth +} + +func (sa *SockaddrBth) sockaddr() (unsafe.Pointer, int32, error) { + family := AF_BTH + sa.raw = RawSockaddrBth{ + AddressFamily: *(*[2]byte)(unsafe.Pointer(&family)), + BtAddr: *(*[8]byte)(unsafe.Pointer(&sa.BtAddr)), + Port: *(*[4]byte)(unsafe.Pointer(&sa.Port)), + ServiceClassId: *(*[16]byte)(unsafe.Pointer(&sa.ServiceClassId)), + } + return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil +} + func (rsa *RawSockaddrAny) Sockaddr() (Sockaddr, error) { switch rsa.Addr.Family { case AF_UNIX: @@ -1032,6 +1073,14 @@ func Connect(fd Handle, sa Sockaddr) (err error) { return connect(fd, ptr, n) } +func GetBestInterfaceEx(sa Sockaddr, pdwBestIfIndex *uint32) (err error) { + ptr, _, err := sa.sockaddr() + if err != nil { + return err + } + return getBestInterfaceEx(ptr, pdwBestIfIndex) +} + func Getsockname(fd Handle) (sa Sockaddr, err error) { var rsa RawSockaddrAny l := int32(unsafe.Sizeof(rsa)) @@ -1685,3 +1734,71 @@ func LoadResourceData(module, resInfo Handle) (data []byte, err error) { h.Cap = int(size) return } + +// PSAPI_WORKING_SET_EX_BLOCK contains extended working set information for a page. +type PSAPI_WORKING_SET_EX_BLOCK uint64 + +// Valid returns the validity of this page. +// If this bit is 1, the subsequent members are valid; otherwise they should be ignored. +func (b PSAPI_WORKING_SET_EX_BLOCK) Valid() bool { + return (b & 1) == 1 +} + +// ShareCount is the number of processes that share this page. The maximum value of this member is 7. +func (b PSAPI_WORKING_SET_EX_BLOCK) ShareCount() uint64 { + return b.intField(1, 3) +} + +// Win32Protection is the memory protection attributes of the page. For a list of values, see +// https://docs.microsoft.com/en-us/windows/win32/memory/memory-protection-constants +func (b PSAPI_WORKING_SET_EX_BLOCK) Win32Protection() uint64 { + return b.intField(4, 11) +} + +// Shared returns the shared status of this page. +// If this bit is 1, the page can be shared. +func (b PSAPI_WORKING_SET_EX_BLOCK) Shared() bool { + return (b & (1 << 15)) == 1 +} + +// Node is the NUMA node. The maximum value of this member is 63. +func (b PSAPI_WORKING_SET_EX_BLOCK) Node() uint64 { + return b.intField(16, 6) +} + +// Locked returns the locked status of this page. +// If this bit is 1, the virtual page is locked in physical memory. +func (b PSAPI_WORKING_SET_EX_BLOCK) Locked() bool { + return (b & (1 << 22)) == 1 +} + +// LargePage returns the large page status of this page. +// If this bit is 1, the page is a large page. +func (b PSAPI_WORKING_SET_EX_BLOCK) LargePage() bool { + return (b & (1 << 23)) == 1 +} + +// Bad returns the bad status of this page. +// If this bit is 1, the page is has been reported as bad. +func (b PSAPI_WORKING_SET_EX_BLOCK) Bad() bool { + return (b & (1 << 31)) == 1 +} + +// intField extracts an integer field in the PSAPI_WORKING_SET_EX_BLOCK union. +func (b PSAPI_WORKING_SET_EX_BLOCK) intField(start, length int) uint64 { + var mask PSAPI_WORKING_SET_EX_BLOCK + for pos := start; pos < start+length; pos++ { + mask |= (1 << pos) + } + + masked := b & mask + return uint64(masked >> start) +} + +// PSAPI_WORKING_SET_EX_INFORMATION contains extended working set information for a process. +type PSAPI_WORKING_SET_EX_INFORMATION struct { + // The virtual address. + VirtualAddress Pointer + // A PSAPI_WORKING_SET_EX_BLOCK union that indicates the attributes of the page at VirtualAddress. + VirtualAttributes PSAPI_WORKING_SET_EX_BLOCK +} diff --git a/vendor/golang.org/x/sys/windows/types_windows.go b/vendor/golang.org/x/sys/windows/types_windows.go index bb31abda4..f9eaca528 100644 --- a/vendor/golang.org/x/sys/windows/types_windows.go +++ b/vendor/golang.org/x/sys/windows/types_windows.go @@ -160,6 +160,10 @@ const ( MAX_COMPUTERNAME_LENGTH = 15 + MAX_DHCPV6_DUID_LENGTH = 130 + + MAX_DNS_SUFFIX_STRING_LENGTH = 256 + TIME_ZONE_ID_UNKNOWN = 0 TIME_ZONE_ID_STANDARD = 1 @@ -2000,27 +2004,62 @@ type IpAdapterPrefix struct { } type IpAdapterAddresses struct { - Length uint32 - IfIndex uint32 - Next *IpAdapterAddresses - AdapterName *byte - FirstUnicastAddress *IpAdapterUnicastAddress - FirstAnycastAddress *IpAdapterAnycastAddress - FirstMulticastAddress *IpAdapterMulticastAddress - FirstDnsServerAddress *IpAdapterDnsServerAdapter - DnsSuffix *uint16 - Description *uint16 - FriendlyName *uint16 - PhysicalAddress [syscall.MAX_ADAPTER_ADDRESS_LENGTH]byte - PhysicalAddressLength uint32 - Flags uint32 - Mtu uint32 - IfType uint32 - OperStatus uint32 - Ipv6IfIndex uint32 - ZoneIndices [16]uint32 - FirstPrefix *IpAdapterPrefix - /* more fields might be present here. */ + Length uint32 + IfIndex uint32 + Next *IpAdapterAddresses + AdapterName *byte + FirstUnicastAddress *IpAdapterUnicastAddress + FirstAnycastAddress *IpAdapterAnycastAddress + FirstMulticastAddress *IpAdapterMulticastAddress + FirstDnsServerAddress *IpAdapterDnsServerAdapter + DnsSuffix *uint16 + Description *uint16 + FriendlyName *uint16 + PhysicalAddress [syscall.MAX_ADAPTER_ADDRESS_LENGTH]byte + PhysicalAddressLength uint32 + Flags uint32 + Mtu uint32 + IfType uint32 + OperStatus uint32 + Ipv6IfIndex uint32 + ZoneIndices [16]uint32 + FirstPrefix *IpAdapterPrefix + TransmitLinkSpeed uint64 + ReceiveLinkSpeed uint64 + FirstWinsServerAddress *IpAdapterWinsServerAddress + FirstGatewayAddress *IpAdapterGatewayAddress + Ipv4Metric uint32 + Ipv6Metric uint32 + Luid uint64 + Dhcpv4Server SocketAddress + CompartmentId uint32 + NetworkGuid GUID + ConnectionType uint32 + TunnelType uint32 + Dhcpv6Server SocketAddress + Dhcpv6ClientDuid [MAX_DHCPV6_DUID_LENGTH]byte + Dhcpv6ClientDuidLength uint32 + Dhcpv6Iaid uint32 + FirstDnsSuffix *IpAdapterDNSSuffix +} + +type IpAdapterWinsServerAddress struct { + Length uint32 + Reserved uint32 + Next *IpAdapterWinsServerAddress + Address SocketAddress +} + +type IpAdapterGatewayAddress struct { + Length uint32 + Reserved uint32 + Next *IpAdapterGatewayAddress + Address SocketAddress +} + +type IpAdapterDNSSuffix struct { + Next *IpAdapterDNSSuffix + String [MAX_DNS_SUFFIX_STRING_LENGTH]uint16 } const ( @@ -3172,3 +3211,5 @@ type ModuleInfo struct { SizeOfImage uint32 EntryPoint uintptr } + +const ALL_PROCESSOR_GROUPS = 0xFFFF diff --git a/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/vendor/golang.org/x/sys/windows/zsyscall_windows.go index 1055d47ed..52d4742cb 100644 --- a/vendor/golang.org/x/sys/windows/zsyscall_windows.go +++ b/vendor/golang.org/x/sys/windows/zsyscall_windows.go @@ -177,6 +177,7 @@ var ( procDnsRecordListFree = moddnsapi.NewProc("DnsRecordListFree") procGetAdaptersAddresses = modiphlpapi.NewProc("GetAdaptersAddresses") procGetAdaptersInfo = modiphlpapi.NewProc("GetAdaptersInfo") + procGetBestInterfaceEx = modiphlpapi.NewProc("GetBestInterfaceEx") procGetIfEntry = modiphlpapi.NewProc("GetIfEntry") procAssignProcessToJobObject = modkernel32.NewProc("AssignProcessToJobObject") procCancelIo = modkernel32.NewProc("CancelIo") @@ -226,6 +227,7 @@ var ( procFreeLibrary = modkernel32.NewProc("FreeLibrary") procGenerateConsoleCtrlEvent = modkernel32.NewProc("GenerateConsoleCtrlEvent") procGetACP = modkernel32.NewProc("GetACP") + procGetActiveProcessorCount = modkernel32.NewProc("GetActiveProcessorCount") procGetCommTimeouts = modkernel32.NewProc("GetCommTimeouts") procGetCommandLineW = modkernel32.NewProc("GetCommandLineW") procGetComputerNameExW = modkernel32.NewProc("GetComputerNameExW") @@ -251,6 +253,7 @@ var ( procGetLogicalDriveStringsW = modkernel32.NewProc("GetLogicalDriveStringsW") procGetLogicalDrives = modkernel32.NewProc("GetLogicalDrives") procGetLongPathNameW = modkernel32.NewProc("GetLongPathNameW") + procGetMaximumProcessorCount = modkernel32.NewProc("GetMaximumProcessorCount") procGetModuleFileNameW = modkernel32.NewProc("GetModuleFileNameW") procGetModuleHandleExW = modkernel32.NewProc("GetModuleHandleExW") procGetNamedPipeHandleStateW = modkernel32.NewProc("GetNamedPipeHandleStateW") @@ -405,6 +408,7 @@ var ( procGetModuleBaseNameW = modpsapi.NewProc("GetModuleBaseNameW") procGetModuleFileNameExW = modpsapi.NewProc("GetModuleFileNameExW") procGetModuleInformation = modpsapi.NewProc("GetModuleInformation") + procQueryWorkingSetEx = modpsapi.NewProc("QueryWorkingSetEx") procSubscribeServiceChangeNotifications = modsechost.NewProc("SubscribeServiceChangeNotifications") procUnsubscribeServiceChangeNotifications = modsechost.NewProc("UnsubscribeServiceChangeNotifications") procGetUserNameExW = modsecur32.NewProc("GetUserNameExW") @@ -1537,6 +1541,14 @@ func GetAdaptersInfo(ai *IpAdapterInfo, ol *uint32) (errcode error) { return } +func getBestInterfaceEx(sockaddr unsafe.Pointer, pdwBestIfIndex *uint32) (errcode error) { + r0, _, _ := syscall.Syscall(procGetBestInterfaceEx.Addr(), 2, uintptr(sockaddr), uintptr(unsafe.Pointer(pdwBestIfIndex)), 0) + if r0 != 0 { + errcode = syscall.Errno(r0) + } + return +} + func GetIfEntry(pIfRow *MibIfRow) (errcode error) { r0, _, _ := syscall.Syscall(procGetIfEntry.Addr(), 1, uintptr(unsafe.Pointer(pIfRow)), 0, 0) if r0 != 0 { @@ -1967,6 +1979,12 @@ func GetACP() (acp uint32) { return } +func GetActiveProcessorCount(groupNumber uint16) (ret uint32) { + r0, _, _ := syscall.Syscall(procGetActiveProcessorCount.Addr(), 1, uintptr(groupNumber), 0, 0) + ret = uint32(r0) + return +} + func GetCommTimeouts(handle Handle, timeouts *CommTimeouts) (err error) { r1, _, e1 := syscall.Syscall(procGetCommTimeouts.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(timeouts)), 0) if r1 == 0 { @@ -2169,6 +2187,12 @@ func GetLongPathName(path *uint16, buf *uint16, buflen uint32) (n uint32, err er return } +func GetMaximumProcessorCount(groupNumber uint16) (ret uint32) { + r0, _, _ := syscall.Syscall(procGetMaximumProcessorCount.Addr(), 1, uintptr(groupNumber), 0, 0) + ret = uint32(r0) + return +} + func GetModuleFileName(module Handle, filename *uint16, size uint32) (n uint32, err error) { r0, _, e1 := syscall.Syscall(procGetModuleFileNameW.Addr(), 3, uintptr(module), uintptr(unsafe.Pointer(filename)), uintptr(size)) n = uint32(r0) @@ -2747,7 +2771,7 @@ func ReadDirectoryChanges(handle Handle, buf *byte, buflen uint32, watchSubTree return } -func ReadFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) { +func readFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) { var _p0 *byte if len(buf) > 0 { _p0 = &buf[0] @@ -3189,7 +3213,7 @@ func WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, return } -func WriteFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) { +func writeFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) { var _p0 *byte if len(buf) > 0 { _p0 = &buf[0] @@ -3481,6 +3505,14 @@ func GetModuleInformation(process Handle, module Handle, modinfo *ModuleInfo, cb return } +func QueryWorkingSetEx(process Handle, pv uintptr, cb uint32) (err error) { + r1, _, e1 := syscall.Syscall(procQueryWorkingSetEx.Addr(), 3, uintptr(process), uintptr(pv), uintptr(cb)) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func SubscribeServiceChangeNotifications(service Handle, eventType uint32, callback uintptr, callbackCtx uintptr, subscription *uintptr) (ret error) { ret = procSubscribeServiceChangeNotifications.Find() if ret != nil { diff --git a/vendor/golang.org/x/term/AUTHORS b/vendor/golang.org/x/term/AUTHORS deleted file mode 100644 index 15167cd74..000000000 --- a/vendor/golang.org/x/term/AUTHORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code refers to The Go Authors for copyright purposes. -# The master list of authors is in the main Go distribution, -# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/golang.org/x/term/CONTRIBUTORS b/vendor/golang.org/x/term/CONTRIBUTORS deleted file mode 100644 index 1c4577e96..000000000 --- a/vendor/golang.org/x/term/CONTRIBUTORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code was written by the Go contributors. -# The master list of contributors is in the main Go distribution, -# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/golang.org/x/term/go.mod b/vendor/golang.org/x/term/go.mod deleted file mode 100644 index edf0e5b1d..000000000 --- a/vendor/golang.org/x/term/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module golang.org/x/term - -go 1.17 - -require golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 diff --git a/vendor/golang.org/x/term/go.sum b/vendor/golang.org/x/term/go.sum deleted file mode 100644 index ff132135e..000000000 --- a/vendor/golang.org/x/term/go.sum +++ /dev/null @@ -1,2 +0,0 @@ -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 h1:SrN+KX8Art/Sf4HNj6Zcz06G7VEz+7w9tdXTPOZ7+l4= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/vendor/golang.org/x/term/term.go b/vendor/golang.org/x/term/term.go index d59270880..1a40d1012 100644 --- a/vendor/golang.org/x/term/term.go +++ b/vendor/golang.org/x/term/term.go @@ -7,11 +7,11 @@ // // Putting a terminal into raw mode is the most common requirement: // -// oldState, err := term.MakeRaw(int(os.Stdin.Fd())) -// if err != nil { -// panic(err) -// } -// defer term.Restore(int(os.Stdin.Fd()), oldState) +// oldState, err := term.MakeRaw(int(os.Stdin.Fd())) +// if err != nil { +// panic(err) +// } +// defer term.Restore(int(os.Stdin.Fd()), oldState) // // Note that on non-Unix systems os.Stdin.Fd() may not be 0. package term diff --git a/vendor/golang.org/x/term/terminal.go b/vendor/golang.org/x/term/terminal.go index 535ab8257..4b48a5899 100644 --- a/vendor/golang.org/x/term/terminal.go +++ b/vendor/golang.org/x/term/terminal.go @@ -935,7 +935,7 @@ func (s *stRingBuffer) Add(a string) { // next most recent, and so on. If such an element doesn't exist then ok is // false. func (s *stRingBuffer) NthPreviousEntry(n int) (value string, ok bool) { - if n >= s.size { + if n < 0 || n >= s.size { return "", false } index := s.head - n diff --git a/vendor/gopkg.in/yaml.v3/apic.go b/vendor/gopkg.in/yaml.v3/apic.go index 65846e674..ae7d049f1 100644 --- a/vendor/gopkg.in/yaml.v3/apic.go +++ b/vendor/gopkg.in/yaml.v3/apic.go @@ -108,6 +108,7 @@ func yaml_emitter_initialize(emitter *yaml_emitter_t) { raw_buffer: make([]byte, 0, output_raw_buffer_size), states: make([]yaml_emitter_state_t, 0, initial_stack_size), events: make([]yaml_event_t, 0, initial_queue_size), + best_width: -1, } } diff --git a/vendor/gopkg.in/yaml.v3/decode.go b/vendor/gopkg.in/yaml.v3/decode.go index be63169b7..df36e3a30 100644 --- a/vendor/gopkg.in/yaml.v3/decode.go +++ b/vendor/gopkg.in/yaml.v3/decode.go @@ -35,6 +35,7 @@ type parser struct { doc *Node anchors map[string]*Node doneInit bool + textless bool } func newParser(b []byte) *parser { @@ -108,14 +109,18 @@ func (p *parser) peek() yaml_event_type_t { func (p *parser) fail() { var where string var line int - if p.parser.problem_mark.line != 0 { + if p.parser.context_mark.line != 0 { + line = p.parser.context_mark.line + // Scanner errors don't iterate line before returning error + if p.parser.error == yaml_SCANNER_ERROR { + line++ + } + } else if p.parser.problem_mark.line != 0 { line = p.parser.problem_mark.line // Scanner errors don't iterate line before returning error if p.parser.error == yaml_SCANNER_ERROR { line++ } - } else if p.parser.context_mark.line != 0 { - line = p.parser.context_mark.line } if line != 0 { where = "line " + strconv.Itoa(line) + ": " @@ -169,17 +174,20 @@ func (p *parser) node(kind Kind, defaultTag, tag, value string) *Node { } else if kind == ScalarNode { tag, _ = resolve("", value) } - return &Node{ - Kind: kind, - Tag: tag, - Value: value, - Style: style, - Line: p.event.start_mark.line + 1, - Column: p.event.start_mark.column + 1, - HeadComment: string(p.event.head_comment), - LineComment: string(p.event.line_comment), - FootComment: string(p.event.foot_comment), + n := &Node{ + Kind: kind, + Tag: tag, + Value: value, + Style: style, } + if !p.textless { + n.Line = p.event.start_mark.line + 1 + n.Column = p.event.start_mark.column + 1 + n.HeadComment = string(p.event.head_comment) + n.LineComment = string(p.event.line_comment) + n.FootComment = string(p.event.foot_comment) + } + return n } func (p *parser) parseChild(parent *Node) *Node { @@ -497,8 +505,13 @@ func (d *decoder) unmarshal(n *Node, out reflect.Value) (good bool) { good = d.mapping(n, out) case SequenceNode: good = d.sequence(n, out) + case 0: + if n.IsZero() { + return d.null(out) + } + fallthrough default: - panic("internal error: unknown node kind: " + strconv.Itoa(int(n.Kind))) + failf("cannot decode node with unknown kind %d", n.Kind) } return good } @@ -533,6 +546,17 @@ func resetMap(out reflect.Value) { } } +func (d *decoder) null(out reflect.Value) bool { + if out.CanAddr() { + switch out.Kind() { + case reflect.Interface, reflect.Ptr, reflect.Map, reflect.Slice: + out.Set(reflect.Zero(out.Type())) + return true + } + } + return false +} + func (d *decoder) scalar(n *Node, out reflect.Value) bool { var tag string var resolved interface{} @@ -550,14 +574,7 @@ func (d *decoder) scalar(n *Node, out reflect.Value) bool { } } if resolved == nil { - if out.CanAddr() { - switch out.Kind() { - case reflect.Interface, reflect.Ptr, reflect.Map, reflect.Slice: - out.Set(reflect.Zero(out.Type())) - return true - } - } - return false + return d.null(out) } if resolvedv := reflect.ValueOf(resolved); out.Type() == resolvedv.Type() { // We've resolved to exactly the type we want, so use that. @@ -791,8 +808,10 @@ func (d *decoder) mapping(n *Node, out reflect.Value) (good bool) { } } + mapIsNew := false if out.IsNil() { out.Set(reflect.MakeMap(outt)) + mapIsNew = true } for i := 0; i < l; i += 2 { if isMerge(n.Content[i]) { @@ -809,7 +828,7 @@ func (d *decoder) mapping(n *Node, out reflect.Value) (good bool) { failf("invalid map key: %#v", k.Interface()) } e := reflect.New(et).Elem() - if d.unmarshal(n.Content[i+1], e) { + if d.unmarshal(n.Content[i+1], e) || n.Content[i+1].ShortTag() == nullTag && (mapIsNew || !out.MapIndex(k).IsValid()) { out.SetMapIndex(k, e) } } diff --git a/vendor/gopkg.in/yaml.v3/emitterc.go b/vendor/gopkg.in/yaml.v3/emitterc.go index ab2a06619..0f47c9ca8 100644 --- a/vendor/gopkg.in/yaml.v3/emitterc.go +++ b/vendor/gopkg.in/yaml.v3/emitterc.go @@ -235,10 +235,13 @@ func yaml_emitter_increase_indent(emitter *yaml_emitter_t, flow, indentless bool emitter.indent = 0 } } else if !indentless { - emitter.indent += emitter.best_indent - // [Go] If inside a block sequence item, discount the space taken by the indicator. - if emitter.best_indent > 2 && emitter.states[len(emitter.states)-1] == yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE { - emitter.indent -= 2 + // [Go] This was changed so that indentations are more regular. + if emitter.states[len(emitter.states)-1] == yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE { + // The first indent inside a sequence will just skip the "- " indicator. + emitter.indent += 2 + } else { + // Everything else aligns to the chosen indentation. + emitter.indent = emitter.best_indent*((emitter.indent+emitter.best_indent)/emitter.best_indent) } } return true @@ -725,16 +728,9 @@ func yaml_emitter_emit_flow_mapping_value(emitter *yaml_emitter_t, event *yaml_e // Expect a block item node. func yaml_emitter_emit_block_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { if first { - // [Go] The original logic here would not indent the sequence when inside a mapping. - // In Go we always indent it, but take the sequence indicator out of the indentation. - indentless := emitter.best_indent == 2 && emitter.mapping_context && (emitter.column == 0 || !emitter.indention) - original := emitter.indent - if !yaml_emitter_increase_indent(emitter, false, indentless) { + if !yaml_emitter_increase_indent(emitter, false, false) { return false } - if emitter.indent > original+2 { - emitter.indent -= 2 - } } if event.typ == yaml_SEQUENCE_END_EVENT { emitter.indent = emitter.indents[len(emitter.indents)-1] @@ -785,6 +781,13 @@ func yaml_emitter_emit_block_mapping_key(emitter *yaml_emitter_t, event *yaml_ev if !yaml_emitter_write_indent(emitter) { return false } + if len(emitter.line_comment) > 0 { + // [Go] A line comment was provided for the key. That's unusual as the + // scanner associates line comments with the value. Either way, + // save the line comment and render it appropriately later. + emitter.key_line_comment = emitter.line_comment + emitter.line_comment = nil + } if yaml_emitter_check_simple_key(emitter) { emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE) return yaml_emitter_emit_node(emitter, event, false, false, true, true) @@ -810,6 +813,27 @@ func yaml_emitter_emit_block_mapping_value(emitter *yaml_emitter_t, event *yaml_ return false } } + if len(emitter.key_line_comment) > 0 { + // [Go] Line comments are generally associated with the value, but when there's + // no value on the same line as a mapping key they end up attached to the + // key itself. + if event.typ == yaml_SCALAR_EVENT { + if len(emitter.line_comment) == 0 { + // A scalar is coming and it has no line comments by itself yet, + // so just let it handle the line comment as usual. If it has a + // line comment, we can't have both so the one from the key is lost. + emitter.line_comment = emitter.key_line_comment + emitter.key_line_comment = nil + } + } else if event.sequence_style() != yaml_FLOW_SEQUENCE_STYLE && (event.typ == yaml_MAPPING_START_EVENT || event.typ == yaml_SEQUENCE_START_EVENT) { + // An indented block follows, so write the comment right now. + emitter.line_comment, emitter.key_line_comment = emitter.key_line_comment, emitter.line_comment + if !yaml_emitter_process_line_comment(emitter) { + return false + } + emitter.line_comment, emitter.key_line_comment = emitter.key_line_comment, emitter.line_comment + } + } emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_KEY_STATE) if !yaml_emitter_emit_node(emitter, event, false, false, true, false) { return false @@ -823,6 +847,10 @@ func yaml_emitter_emit_block_mapping_value(emitter *yaml_emitter_t, event *yaml_ return true } +func yaml_emitter_silent_nil_event(emitter *yaml_emitter_t, event *yaml_event_t) bool { + return event.typ == yaml_SCALAR_EVENT && event.implicit && !emitter.canonical && len(emitter.scalar_data.value) == 0 +} + // Expect a node. func yaml_emitter_emit_node(emitter *yaml_emitter_t, event *yaml_event_t, root bool, sequence bool, mapping bool, simple_key bool) bool { @@ -1866,7 +1894,7 @@ func yaml_emitter_write_literal_scalar(emitter *yaml_emitter_t, value []byte) bo if !yaml_emitter_write_block_scalar_hints(emitter, value) { return false } - if !put_break(emitter) { + if !yaml_emitter_process_line_comment(emitter) { return false } //emitter.indention = true @@ -1903,10 +1931,10 @@ func yaml_emitter_write_folded_scalar(emitter *yaml_emitter_t, value []byte) boo if !yaml_emitter_write_block_scalar_hints(emitter, value) { return false } - - if !put_break(emitter) { + if !yaml_emitter_process_line_comment(emitter) { return false } + //emitter.indention = true emitter.whitespace = true diff --git a/vendor/gopkg.in/yaml.v3/encode.go b/vendor/gopkg.in/yaml.v3/encode.go index 1f37271ce..de9e72a3e 100644 --- a/vendor/gopkg.in/yaml.v3/encode.go +++ b/vendor/gopkg.in/yaml.v3/encode.go @@ -119,6 +119,14 @@ func (e *encoder) marshal(tag string, in reflect.Value) { case *Node: e.nodev(in) return + case Node: + if !in.CanAddr() { + var n = reflect.New(in.Type()).Elem() + n.Set(in) + in = n + } + e.nodev(in.Addr()) + return case time.Time: e.timev(tag, in) return @@ -422,18 +430,23 @@ func (e *encoder) nodev(in reflect.Value) { } func (e *encoder) node(node *Node, tail string) { + // Zero nodes behave as nil. + if node.Kind == 0 && node.IsZero() { + e.nilv() + return + } + // If the tag was not explicitly requested, and dropping it won't change the // implicit tag of the value, don't include it in the presentation. var tag = node.Tag var stag = shortTag(tag) - var rtag string var forceQuoting bool if tag != "" && node.Style&TaggedStyle == 0 { if node.Kind == ScalarNode { if stag == strTag && node.Style&(SingleQuotedStyle|DoubleQuotedStyle|LiteralStyle|FoldedStyle) != 0 { tag = "" } else { - rtag, _ = resolve("", node.Value) + rtag, _ := resolve("", node.Value) if rtag == stag { tag = "" } else if stag == strTag { @@ -442,6 +455,7 @@ func (e *encoder) node(node *Node, tail string) { } } } else { + var rtag string switch node.Kind { case MappingNode: rtag = mapTag @@ -471,7 +485,7 @@ func (e *encoder) node(node *Node, tail string) { if node.Style&FlowStyle != 0 { style = yaml_FLOW_SEQUENCE_STYLE } - e.must(yaml_sequence_start_event_initialize(&e.event, []byte(node.Anchor), []byte(tag), tag == "", style)) + e.must(yaml_sequence_start_event_initialize(&e.event, []byte(node.Anchor), []byte(longTag(tag)), tag == "", style)) e.event.head_comment = []byte(node.HeadComment) e.emit() for _, node := range node.Content { @@ -487,7 +501,7 @@ func (e *encoder) node(node *Node, tail string) { if node.Style&FlowStyle != 0 { style = yaml_FLOW_MAPPING_STYLE } - yaml_mapping_start_event_initialize(&e.event, []byte(node.Anchor), []byte(tag), tag == "", style) + yaml_mapping_start_event_initialize(&e.event, []byte(node.Anchor), []byte(longTag(tag)), tag == "", style) e.event.tail_comment = []byte(tail) e.event.head_comment = []byte(node.HeadComment) e.emit() @@ -528,11 +542,11 @@ func (e *encoder) node(node *Node, tail string) { case ScalarNode: value := node.Value if !utf8.ValidString(value) { - if tag == binaryTag { + if stag == binaryTag { failf("explicitly tagged !!binary data must be base64-encoded") } - if tag != "" { - failf("cannot marshal invalid UTF-8 data as %s", shortTag(tag)) + if stag != "" { + failf("cannot marshal invalid UTF-8 data as %s", stag) } // It can't be encoded directly as YAML so use a binary tag // and encode it as base64. @@ -557,5 +571,7 @@ func (e *encoder) node(node *Node, tail string) { } e.emitScalar(value, node.Anchor, tag, style, []byte(node.HeadComment), []byte(node.LineComment), []byte(node.FootComment), []byte(tail)) + default: + failf("cannot encode node with unknown kind %d", node.Kind) } } diff --git a/vendor/gopkg.in/yaml.v3/go.mod b/vendor/gopkg.in/yaml.v3/go.mod deleted file mode 100644 index f407ea321..000000000 --- a/vendor/gopkg.in/yaml.v3/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module "gopkg.in/yaml.v3" - -require ( - "gopkg.in/check.v1" v0.0.0-20161208181325-20d25e280405 -) diff --git a/vendor/gopkg.in/yaml.v3/parserc.go b/vendor/gopkg.in/yaml.v3/parserc.go index aea9050b8..ac66fccc0 100644 --- a/vendor/gopkg.in/yaml.v3/parserc.go +++ b/vendor/gopkg.in/yaml.v3/parserc.go @@ -648,6 +648,10 @@ func yaml_parser_parse_node(parser *yaml_parser_t, event *yaml_event_t, block, i implicit: implicit, style: yaml_style_t(yaml_BLOCK_MAPPING_STYLE), } + if parser.stem_comment != nil { + event.head_comment = parser.stem_comment + parser.stem_comment = nil + } return true } if len(anchor) > 0 || len(tag) > 0 { @@ -694,25 +698,13 @@ func yaml_parser_parse_block_sequence_entry(parser *yaml_parser_t, event *yaml_e if token.typ == yaml_BLOCK_ENTRY_TOKEN { mark := token.end_mark - prior_head := len(parser.head_comment) + prior_head_len := len(parser.head_comment) skip_token(parser) + yaml_parser_split_stem_comment(parser, prior_head_len) token = peek_token(parser) if token == nil { return false } - if prior_head > 0 && token.typ == yaml_BLOCK_SEQUENCE_START_TOKEN { - // [Go] It's a sequence under a sequence entry, so the former head comment - // is for the list itself, not the first list item under it. - parser.stem_comment = parser.head_comment[:prior_head] - if len(parser.head_comment) == prior_head { - parser.head_comment = nil - } else { - // Copy suffix to prevent very strange bugs if someone ever appends - // further bytes to the prefix in the stem_comment slice above. - parser.head_comment = append([]byte(nil), parser.head_comment[prior_head+1:]...) - } - - } if token.typ != yaml_BLOCK_ENTRY_TOKEN && token.typ != yaml_BLOCK_END_TOKEN { parser.states = append(parser.states, yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE) return yaml_parser_parse_node(parser, event, true, false) @@ -754,7 +746,9 @@ func yaml_parser_parse_indentless_sequence_entry(parser *yaml_parser_t, event *y if token.typ == yaml_BLOCK_ENTRY_TOKEN { mark := token.end_mark + prior_head_len := len(parser.head_comment) skip_token(parser) + yaml_parser_split_stem_comment(parser, prior_head_len) token = peek_token(parser) if token == nil { return false @@ -780,6 +774,32 @@ func yaml_parser_parse_indentless_sequence_entry(parser *yaml_parser_t, event *y return true } +// Split stem comment from head comment. +// +// When a sequence or map is found under a sequence entry, the former head comment +// is assigned to the underlying sequence or map as a whole, not the individual +// sequence or map entry as would be expected otherwise. To handle this case the +// previous head comment is moved aside as the stem comment. +func yaml_parser_split_stem_comment(parser *yaml_parser_t, stem_len int) { + if stem_len == 0 { + return + } + + token := peek_token(parser) + if token.typ != yaml_BLOCK_SEQUENCE_START_TOKEN && token.typ != yaml_BLOCK_MAPPING_START_TOKEN { + return + } + + parser.stem_comment = parser.head_comment[:stem_len] + if len(parser.head_comment) == stem_len { + parser.head_comment = nil + } else { + // Copy suffix to prevent very strange bugs if someone ever appends + // further bytes to the prefix in the stem_comment slice above. + parser.head_comment = append([]byte(nil), parser.head_comment[stem_len+1:]...) + } +} + // Parse the productions: // block_mapping ::= BLOCK-MAPPING_START // ******************* diff --git a/vendor/gopkg.in/yaml.v3/scannerc.go b/vendor/gopkg.in/yaml.v3/scannerc.go index 57e954ca5..ca0070108 100644 --- a/vendor/gopkg.in/yaml.v3/scannerc.go +++ b/vendor/gopkg.in/yaml.v3/scannerc.go @@ -749,6 +749,11 @@ func yaml_parser_fetch_next_token(parser *yaml_parser_t) (ok bool) { if !ok { return } + if len(parser.tokens) > 0 && parser.tokens[len(parser.tokens)-1].typ == yaml_BLOCK_ENTRY_TOKEN { + // Sequence indicators alone have no line comments. It becomes + // a head comment for whatever follows. + return + } if !yaml_parser_scan_line_comment(parser, comment_mark) { ok = false return @@ -2255,10 +2260,9 @@ func yaml_parser_scan_block_scalar(parser *yaml_parser_t, token *yaml_token_t, l } } if parser.buffer[parser.buffer_pos] == '#' { - // TODO Test this and then re-enable it. - //if !yaml_parser_scan_line_comment(parser, start_mark) { - // return false - //} + if !yaml_parser_scan_line_comment(parser, start_mark) { + return false + } for !is_breakz(parser.buffer, parser.buffer_pos) { skip(parser) if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { @@ -2856,13 +2860,12 @@ func yaml_parser_scan_line_comment(parser *yaml_parser_t, token_mark yaml_mark_t return false } skip_line(parser) - } else { - if parser.mark.index >= seen { - if len(text) == 0 { - start_mark = parser.mark - } - text = append(text, parser.buffer[parser.buffer_pos]) + } else if parser.mark.index >= seen { + if len(text) == 0 { + start_mark = parser.mark } + text = read(parser, text) + } else { skip(parser) } } @@ -2888,6 +2891,10 @@ func yaml_parser_scan_comments(parser *yaml_parser_t, scan_mark yaml_mark_t) boo var token_mark = token.start_mark var start_mark yaml_mark_t + var next_indent = parser.indent + if next_indent < 0 { + next_indent = 0 + } var recent_empty = false var first_empty = parser.newlines <= 1 @@ -2919,15 +2926,18 @@ func yaml_parser_scan_comments(parser *yaml_parser_t, scan_mark yaml_mark_t) boo continue } c := parser.buffer[parser.buffer_pos+peek] - if is_breakz(parser.buffer, parser.buffer_pos+peek) || parser.flow_level > 0 && (c == ']' || c == '}') { + var close_flow = parser.flow_level > 0 && (c == ']' || c == '}') + if close_flow || is_breakz(parser.buffer, parser.buffer_pos+peek) { // Got line break or terminator. - if !recent_empty { - if first_empty && (start_mark.line == foot_line || start_mark.column-1 < parser.indent) { + if close_flow || !recent_empty { + if close_flow || first_empty && (start_mark.line == foot_line && token.typ != yaml_VALUE_TOKEN || start_mark.column-1 < next_indent) { // This is the first empty line and there were no empty lines before, // so this initial part of the comment is a foot of the prior token // instead of being a head for the following one. Split it up. + // Alternatively, this might also be the last comment inside a flow + // scope, so it must be a footer. if len(text) > 0 { - if start_mark.column-1 < parser.indent { + if start_mark.column-1 < next_indent { // If dedented it's unrelated to the prior token. token_mark = start_mark } @@ -2958,7 +2968,7 @@ func yaml_parser_scan_comments(parser *yaml_parser_t, scan_mark yaml_mark_t) boo continue } - if len(text) > 0 && column < parser.indent+1 && column != start_mark.column { + if len(text) > 0 && (close_flow || column-1 < next_indent && column != start_mark.column) { // The comment at the different indentation is a foot of the // preceding data rather than a head of the upcoming one. parser.comments = append(parser.comments, yaml_comment_t{ @@ -2999,10 +3009,9 @@ func yaml_parser_scan_comments(parser *yaml_parser_t, scan_mark yaml_mark_t) boo return false } skip_line(parser) + } else if parser.mark.index >= seen { + text = read(parser, text) } else { - if parser.mark.index >= seen { - text = append(text, parser.buffer[parser.buffer_pos]) - } skip(parser) } } @@ -3010,6 +3019,10 @@ func yaml_parser_scan_comments(parser *yaml_parser_t, scan_mark yaml_mark_t) boo peek = 0 column = 0 line = parser.mark.line + next_indent = parser.indent + if next_indent < 0 { + next_indent = 0 + } } if len(text) > 0 { diff --git a/vendor/gopkg.in/yaml.v3/yaml.go b/vendor/gopkg.in/yaml.v3/yaml.go index b5d35a50d..8cec6da48 100644 --- a/vendor/gopkg.in/yaml.v3/yaml.go +++ b/vendor/gopkg.in/yaml.v3/yaml.go @@ -89,7 +89,7 @@ func Unmarshal(in []byte, out interface{}) (err error) { return unmarshal(in, out, false) } -// A Decorder reads and decodes YAML values from an input stream. +// A Decoder reads and decodes YAML values from an input stream. type Decoder struct { parser *parser knownFields bool @@ -194,7 +194,7 @@ func unmarshal(in []byte, out interface{}, strict bool) (err error) { // Zero valued structs will be omitted if all their public // fields are zero, unless they implement an IsZero // method (see the IsZeroer interface type), in which -// case the field will be included if that method returns true. +// case the field will be excluded if IsZero returns true. // // flow Marshal using a flow style (useful for structs, // sequences and maps). @@ -252,6 +252,24 @@ func (e *Encoder) Encode(v interface{}) (err error) { return nil } +// Encode encodes value v and stores its representation in n. +// +// See the documentation for Marshal for details about the +// conversion of Go values into YAML. +func (n *Node) Encode(v interface{}) (err error) { + defer handleErr(&err) + e := newEncoder() + defer e.destroy() + e.marshalDoc("", reflect.ValueOf(v)) + e.finish() + p := newParser(e.out) + p.textless = true + defer p.destroy() + doc := p.parse() + *n = *doc.Content[0] + return nil +} + // SetIndent changes the used indentation used when encoding. func (e *Encoder) SetIndent(spaces int) { if spaces < 0 { @@ -328,6 +346,12 @@ const ( // and maps, Node is an intermediate representation that allows detailed // control over the content being decoded or encoded. // +// It's worth noting that although Node offers access into details such as +// line numbers, colums, and comments, the content when re-encoded will not +// have its original textual representation preserved. An effort is made to +// render the data plesantly, and to preserve comments near the data they +// describe, though. +// // Values that make use of the Node type interact with the yaml package in the // same way any other type would do, by encoding and decoding yaml data // directly or indirectly into them. @@ -391,6 +415,13 @@ type Node struct { Column int } +// IsZero returns whether the node has all of its fields unset. +func (n *Node) IsZero() bool { + return n.Kind == 0 && n.Style == 0 && n.Tag == "" && n.Value == "" && n.Anchor == "" && n.Alias == nil && n.Content == nil && + n.HeadComment == "" && n.LineComment == "" && n.FootComment == "" && n.Line == 0 && n.Column == 0 +} + + // LongTag returns the long form of the tag that indicates the data type for // the node. If the Tag field isn't explicitly defined, one will be computed // based on the node properties. @@ -418,6 +449,11 @@ func (n *Node) ShortTag() string { case ScalarNode: tag, _ := resolve("", n.Value) return tag + case 0: + // Special case to make the zero value convenient. + if n.IsZero() { + return nullTag + } } return "" } diff --git a/vendor/gopkg.in/yaml.v3/yamlh.go b/vendor/gopkg.in/yaml.v3/yamlh.go index 2719cfbb0..7c6d00770 100644 --- a/vendor/gopkg.in/yaml.v3/yamlh.go +++ b/vendor/gopkg.in/yaml.v3/yamlh.go @@ -787,6 +787,8 @@ type yaml_emitter_t struct { foot_comment []byte tail_comment []byte + key_line_comment []byte + // Dumper stuff opened bool // If the stream was already opened? diff --git a/vendor/modules.txt b/vendor/modules.txt index 020eb54b1..923b40da1 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -5,20 +5,22 @@ github.com/OpenPeeDeeP/xdg ## explicit github.com/atotto/clipboard # github.com/aybabtme/humanlog v0.4.1 -## explicit +## explicit; go 1.13 github.com/aybabtme/humanlog # github.com/cli/safeexec v1.0.0 -## explicit +## explicit; go 1.15 github.com/cli/safeexec # github.com/cloudfoundry/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21 ## explicit github.com/cloudfoundry/jibber_jabber # github.com/creack/pty v1.1.11 -## explicit +## explicit; go 1.13 github.com/creack/pty # github.com/davecgh/go-spew v1.1.1 +## explicit github.com/davecgh/go-spew/spew # github.com/emirpasic/gods v1.12.0 +## explicit github.com/emirpasic/gods/containers github.com/emirpasic/gods/lists github.com/emirpasic/gods/lists/arraylist @@ -26,15 +28,19 @@ github.com/emirpasic/gods/trees github.com/emirpasic/gods/trees/binaryheap github.com/emirpasic/gods/utils # github.com/fatih/color v1.9.0 -## explicit +## explicit; go 1.13 github.com/fatih/color +# github.com/fsmiamoto/git-todo-parser v0.0.2 +## explicit; go 1.13 +github.com/fsmiamoto/git-todo-parser/todo # github.com/fsnotify/fsnotify v1.4.7 ## explicit github.com/fsnotify/fsnotify # github.com/gdamore/encoding v1.0.0 +## explicit; go 1.9 github.com/gdamore/encoding -# github.com/gdamore/tcell/v2 v2.4.1-0.20210926162909-66f061b1fc9b -## explicit +# github.com/gdamore/tcell/v2 v2.5.2 +## explicit; go 1.12 github.com/gdamore/tcell/v2 github.com/gdamore/tcell/v2/terminfo github.com/gdamore/tcell/v2/terminfo/a/aixterm @@ -74,24 +80,27 @@ github.com/gdamore/tcell/v2/terminfo/x/xfce github.com/gdamore/tcell/v2/terminfo/x/xterm github.com/gdamore/tcell/v2/terminfo/x/xterm_kitty github.com/gdamore/tcell/v2/terminfo/x/xterm_termite -# github.com/go-errors/errors v1.4.1 -## explicit +# github.com/go-errors/errors v1.4.2 +## explicit; go 1.14 github.com/go-errors/errors # github.com/go-git/gcfg v1.5.0 +## explicit github.com/go-git/gcfg github.com/go-git/gcfg/scanner github.com/go-git/gcfg/token github.com/go-git/gcfg/types # github.com/go-git/go-billy/v5 v5.0.0 +## explicit; go 1.13 github.com/go-git/go-billy/v5 github.com/go-git/go-billy/v5/helper/chroot github.com/go-git/go-billy/v5/helper/polyfill github.com/go-git/go-billy/v5/osfs github.com/go-git/go-billy/v5/util # github.com/go-logfmt/logfmt v0.5.0 -## explicit +## explicit; go 1.13 github.com/go-logfmt/logfmt # github.com/gobwas/glob v0.2.3 +## explicit github.com/gobwas/glob github.com/gobwas/glob/compiler github.com/gobwas/glob/match @@ -100,26 +109,27 @@ github.com/gobwas/glob/syntax/ast github.com/gobwas/glob/syntax/lexer github.com/gobwas/glob/util/runes github.com/gobwas/glob/util/strings -# github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 -## explicit -github.com/golang-collections/collections/stack -# github.com/golang/protobuf v1.3.2 -## explicit # github.com/google/go-cmp v0.5.6 -## explicit +## explicit; go 1.8 # github.com/gookit/color v1.4.2 -## explicit +## explicit; go 1.12 github.com/gookit/color # github.com/imdario/mergo v0.3.11 -## explicit +## explicit; go 1.13 github.com/imdario/mergo # github.com/integrii/flaggy v1.4.0 -## explicit +## explicit; go 1.12 github.com/integrii/flaggy # github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 -github.com/jbenet/go-context/io -# github.com/jesseduffield/go-git/v5 v5.1.2-0.20201006095850-341962be15a4 ## explicit +github.com/jbenet/go-context/io +# github.com/jesseduffield/generics v0.0.0-20220320043834-727e535cbe68 +## explicit; go 1.18 +github.com/jesseduffield/generics/maps +github.com/jesseduffield/generics/set +github.com/jesseduffield/generics/slices +# github.com/jesseduffield/go-git/v5 v5.1.2-0.20201006095850-341962be15a4 +## explicit; go 1.13 github.com/jesseduffield/go-git/v5 github.com/jesseduffield/go-git/v5/config github.com/jesseduffield/go-git/v5/internal/revision @@ -162,11 +172,14 @@ github.com/jesseduffield/go-git/v5/utils/merkletrie/filesystem github.com/jesseduffield/go-git/v5/utils/merkletrie/index github.com/jesseduffield/go-git/v5/utils/merkletrie/internal/frame github.com/jesseduffield/go-git/v5/utils/merkletrie/noder -# github.com/jesseduffield/gocui v0.3.1-0.20220108045521-1945d7b9ed8b -## explicit +# github.com/jesseduffield/gocui v0.3.1-0.20220813101052-3a3ab26faa15 +## explicit; go 1.12 github.com/jesseduffield/gocui +# github.com/jesseduffield/kill v0.0.0-20220618033138-bfbe04675d10 +## explicit; go 1.18 +github.com/jesseduffield/kill # github.com/jesseduffield/minimal/gitignore v0.3.3-0.20211018110810-9cde264e6b1e -## explicit +## explicit; go 1.15 github.com/jesseduffield/minimal/gitignore # github.com/jesseduffield/yaml v2.1.0+incompatible ## explicit @@ -175,49 +188,64 @@ github.com/jesseduffield/yaml ## explicit github.com/kardianos/osext # github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd +## explicit github.com/kevinburke/ssh_config # github.com/konsorten/go-windows-terminal-sequences v1.0.2 ## explicit github.com/konsorten/go-windows-terminal-sequences # github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 +## explicit github.com/kr/logfmt # github.com/kylelemons/godebug v1.1.0 -## explicit +## explicit; go 1.11 # github.com/kyokomi/emoji/v2 v2.2.8 -## explicit +## explicit; go 1.14 github.com/kyokomi/emoji/v2 # github.com/lucasb-eyer/go-colorful v1.2.0 -## explicit +## explicit; go 1.12 github.com/lucasb-eyer/go-colorful # github.com/mattn/go-colorable v0.1.11 -## explicit +## explicit; go 1.13 github.com/mattn/go-colorable # github.com/mattn/go-isatty v0.0.14 +## explicit; go 1.12 github.com/mattn/go-isatty # github.com/mattn/go-runewidth v0.0.13 -## explicit +## explicit; go 1.9 github.com/mattn/go-runewidth # github.com/mgutz/str v1.2.0 ## explicit github.com/mgutz/str # github.com/mitchellh/go-homedir v1.1.0 +## explicit github.com/mitchellh/go-homedir # github.com/onsi/ginkgo v1.10.3 ## explicit # github.com/onsi/gomega v1.7.1 ## explicit +# github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 +## explicit +github.com/petermattis/goid # github.com/pmezard/go-difflib v1.0.0 ## explicit github.com/pmezard/go-difflib/difflib -# github.com/rivo/uniseg v0.2.0 +# github.com/rivo/uniseg v0.3.4 +## explicit; go 1.18 github.com/rivo/uniseg # github.com/sahilm/fuzzy v0.1.0 ## explicit github.com/sahilm/fuzzy +# github.com/samber/lo v1.10.1 +## explicit; go 1.18 +github.com/samber/lo # github.com/sanity-io/litter v1.5.2 -## explicit +## explicit; go 1.14 github.com/sanity-io/litter +# github.com/sasha-s/go-deadlock v0.3.1 +## explicit +github.com/sasha-s/go-deadlock # github.com/sergi/go-diff v1.1.0 +## explicit; go 1.12 github.com/sergi/go-diff/diffmatchpatch # github.com/sirupsen/logrus v1.4.2 ## explicit @@ -226,15 +254,16 @@ github.com/sirupsen/logrus ## explicit github.com/spkg/bom # github.com/stretchr/testify v1.7.0 -## explicit +## explicit; go 1.13 github.com/stretchr/testify/assert # github.com/xanzy/ssh-agent v0.2.1 +## explicit github.com/xanzy/ssh-agent # github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 -## explicit +## explicit; go 1.15 github.com/xo/terminfo # golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 -## explicit +## explicit; go 1.11 golang.org/x/crypto/blowfish golang.org/x/crypto/cast5 golang.org/x/crypto/chacha20 @@ -253,23 +282,27 @@ golang.org/x/crypto/ssh golang.org/x/crypto/ssh/agent golang.org/x/crypto/ssh/internal/bcrypt_pbkdf golang.org/x/crypto/ssh/knownhosts +# golang.org/x/exp v0.0.0-20220318154914-8dddf5d87bd8 +## explicit; go 1.18 +golang.org/x/exp/constraints +golang.org/x/exp/slices # golang.org/x/net v0.0.0-20201002202402-0a1ea396d57c -## explicit +## explicit; go 1.11 golang.org/x/net/context golang.org/x/net/internal/socks golang.org/x/net/proxy -# golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e -## explicit +# golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab +## explicit; go 1.17 golang.org/x/sys/cpu golang.org/x/sys/internal/unsafeheader golang.org/x/sys/plan9 golang.org/x/sys/unix golang.org/x/sys/windows -# golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 -## explicit +# golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 +## explicit; go 1.17 golang.org/x/term # golang.org/x/text v0.3.7 -## explicit +## explicit; go 1.17 golang.org/x/text/encoding golang.org/x/text/encoding/internal/identifier golang.org/x/text/transform @@ -277,6 +310,8 @@ golang.org/x/text/transform ## explicit gopkg.in/ozeidan/fuzzy-patricia.v3/patricia # gopkg.in/warnings.v0 v0.1.2 +## explicit gopkg.in/warnings.v0 -# gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c +# gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b +## explicit gopkg.in/yaml.v3